summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Machniak <machniak@kolabsys.com>2015-02-04 14:06:59 (GMT)
committerAleksander Machniak <machniak@kolabsys.com>2015-02-04 14:06:59 (GMT)
commite74dd441e5c64ea4dcd2db83f39b56f9ec1d1bfa (patch)
tree463093144f7885540e1205cacd320083b5accd57
parentbddefafb25a88d036183bfe789dbfc3c424e2079 (diff)
downloadkolab-syncroton-e74dd441e5c64ea4dcd2db83f39b56f9ec1d1bfa.tar.gz
Update kolab plugins and managesieve plugin
-rw-r--r--lib/plugins/kolab_auth/composer.json30
-rw-r--r--lib/plugins/kolab_auth/config.inc.php.dist55
-rw-r--r--lib/plugins/kolab_auth/kolab_auth.php166
-rw-r--r--lib/plugins/kolab_auth/kolab_auth_ldap.php12
-rw-r--r--lib/plugins/kolab_auth/localization/de_CH.inc7
-rw-r--r--lib/plugins/kolab_auth/localization/de_DE.inc8
-rw-r--r--lib/plugins/kolab_auth/localization/en_US.inc1
-rw-r--r--lib/plugins/kolab_auth/localization/fr_FR.inc8
-rw-r--r--lib/plugins/kolab_auth/localization/ja_JP.inc7
-rw-r--r--lib/plugins/kolab_auth/localization/nl_NL.inc7
-rw-r--r--lib/plugins/kolab_auth/localization/pl_PL.inc7
-rw-r--r--lib/plugins/kolab_auth/localization/ru_RU.inc8
-rw-r--r--lib/plugins/kolab_auth/package.xml63
-rw-r--r--lib/plugins/kolab_folders/composer.json26
-rw-r--r--lib/plugins/kolab_folders/config.inc.php.dist30
-rw-r--r--lib/plugins/kolab_folders/kolab_folders.js40
-rw-r--r--lib/plugins/kolab_folders/kolab_folders.php41
-rw-r--r--lib/plugins/kolab_folders/localization/de_CH.inc8
-rw-r--r--lib/plugins/kolab_folders/localization/de_DE.inc8
-rw-r--r--lib/plugins/kolab_folders/localization/en_US.inc1
-rw-r--r--lib/plugins/kolab_folders/localization/es_ES.inc21
-rw-r--r--lib/plugins/kolab_folders/localization/et_EE.inc25
-rw-r--r--lib/plugins/kolab_folders/localization/fr_FR.inc8
-rw-r--r--lib/plugins/kolab_folders/localization/ja_JP.inc8
-rw-r--r--lib/plugins/kolab_folders/localization/nl_NL.inc8
-rw-r--r--lib/plugins/kolab_folders/localization/pl_PL.inc8
-rw-r--r--lib/plugins/kolab_folders/localization/ru_RU.inc8
-rw-r--r--lib/plugins/kolab_folders/package.xml63
-rw-r--r--lib/plugins/libkolab/SQL/mysql.initial.sql18
-rw-r--r--lib/plugins/libkolab/SQL/mysql/2014112700.sql2
-rw-r--r--lib/plugins/libkolab/SQL/mysql/2015011600.sql8
-rw-r--r--lib/plugins/libkolab/SQL/oracle.initial.sql184
-rw-r--r--lib/plugins/libkolab/SQL/oracle/2015011600.sql40
-rwxr-xr-xlib/plugins/libkolab/bin/readcache.sh150
-rw-r--r--lib/plugins/libkolab/composer.json2
-rw-r--r--lib/plugins/libkolab/config.inc.php.dist27
-rw-r--r--lib/plugins/libkolab/js/folderlist.js104
-rw-r--r--lib/plugins/libkolab/lib/kolab_bonnie_api.php2
-rw-r--r--lib/plugins/libkolab/lib/kolab_format.php126
-rw-r--r--lib/plugins/libkolab/lib/kolab_format_configuration.php56
-rw-r--r--lib/plugins/libkolab/lib/kolab_format_event.php12
-rw-r--r--lib/plugins/libkolab/lib/kolab_format_xcal.php11
-rw-r--r--lib/plugins/libkolab/lib/kolab_storage.php85
-rw-r--r--lib/plugins/libkolab/lib/kolab_storage_cache.php233
-rw-r--r--lib/plugins/libkolab/lib/kolab_storage_cache_configuration.php22
-rw-r--r--lib/plugins/libkolab/lib/kolab_storage_config.php185
-rw-r--r--lib/plugins/libkolab/lib/kolab_storage_folder.php138
-rw-r--r--lib/plugins/libkolab/lib/kolab_storage_folder_api.php37
-rw-r--r--lib/plugins/libkolab/lib/kolab_storage_folder_user.php34
-rw-r--r--lib/plugins/libkolab/package.xml101
-rw-r--r--lib/plugins/managesieve/Changelog11
-rw-r--r--lib/plugins/managesieve/composer.json4
-rw-r--r--lib/plugins/managesieve/config.inc.php.dist2
-rw-r--r--lib/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php103
-rw-r--r--lib/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php18
-rw-r--r--lib/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php222
-rw-r--r--lib/plugins/managesieve/localization/ar_SA.inc155
-rw-r--r--lib/plugins/managesieve/localization/az_AZ.inc8
-rw-r--r--lib/plugins/managesieve/localization/be_BE.inc8
-rw-r--r--lib/plugins/managesieve/localization/bg_BG.inc29
-rw-r--r--lib/plugins/managesieve/localization/bs_BA.inc5
-rw-r--r--lib/plugins/managesieve/localization/ca_ES.inc46
-rw-r--r--lib/plugins/managesieve/localization/cs_CZ.inc40
-rw-r--r--lib/plugins/managesieve/localization/cy_GB.inc44
-rw-r--r--lib/plugins/managesieve/localization/da_DK.inc25
-rw-r--r--lib/plugins/managesieve/localization/de_CH.inc44
-rw-r--r--lib/plugins/managesieve/localization/de_DE.inc44
-rw-r--r--lib/plugins/managesieve/localization/el_GR.inc55
-rw-r--r--lib/plugins/managesieve/localization/en_CA.inc29
-rw-r--r--lib/plugins/managesieve/localization/en_GB.inc44
-rw-r--r--lib/plugins/managesieve/localization/en_US.inc5
-rw-r--r--lib/plugins/managesieve/localization/es_419.inc5
-rw-r--r--lib/plugins/managesieve/localization/es_AR.inc5
-rw-r--r--lib/plugins/managesieve/localization/es_ES.inc44
-rw-r--r--lib/plugins/managesieve/localization/et_EE.inc8
-rw-r--r--lib/plugins/managesieve/localization/eu_ES.inc54
-rw-r--r--lib/plugins/managesieve/localization/fa_IR.inc124
-rw-r--r--lib/plugins/managesieve/localization/fi_FI.inc79
-rw-r--r--lib/plugins/managesieve/localization/fr_FR.inc184
-rw-r--r--lib/plugins/managesieve/localization/gl_ES.inc26
-rw-r--r--lib/plugins/managesieve/localization/he_IL.inc44
-rw-r--r--lib/plugins/managesieve/localization/hr_HR.inc14
-rw-r--r--lib/plugins/managesieve/localization/hu_HU.inc44
-rw-r--r--lib/plugins/managesieve/localization/id_ID.inc3
-rw-r--r--lib/plugins/managesieve/localization/it_IT.inc44
-rw-r--r--lib/plugins/managesieve/localization/ja_JP.inc34
-rw-r--r--lib/plugins/managesieve/localization/km_KH.inc9
-rw-r--r--lib/plugins/managesieve/localization/ko_KR.inc108
-rw-r--r--lib/plugins/managesieve/localization/lt_LT.inc52
-rw-r--r--lib/plugins/managesieve/localization/lv_LV.inc8
-rw-r--r--lib/plugins/managesieve/localization/nb_NO.inc19
-rw-r--r--lib/plugins/managesieve/localization/nl_NL.inc44
-rw-r--r--lib/plugins/managesieve/localization/pl_PL.inc44
-rw-r--r--lib/plugins/managesieve/localization/pt_BR.inc44
-rw-r--r--lib/plugins/managesieve/localization/pt_PT.inc44
-rw-r--r--lib/plugins/managesieve/localization/ro_RO.inc33
-rw-r--r--lib/plugins/managesieve/localization/ru_RU.inc5
-rw-r--r--lib/plugins/managesieve/localization/sk_SK.inc44
-rw-r--r--lib/plugins/managesieve/localization/sl_SI.inc8
-rw-r--r--lib/plugins/managesieve/localization/sv_SE.inc48
-rw-r--r--lib/plugins/managesieve/localization/tr_TR.inc50
-rw-r--r--lib/plugins/managesieve/localization/uk_UA.inc8
-rw-r--r--lib/plugins/managesieve/localization/vi_VN.inc29
-rw-r--r--lib/plugins/managesieve/localization/zh_CN.inc8
-rw-r--r--lib/plugins/managesieve/managesieve.js5
-rw-r--r--lib/plugins/managesieve/managesieve.php19
-rw-r--r--lib/plugins/managesieve/package.xml128
-rw-r--r--lib/plugins/managesieve/skins/larry/managesieve.css11
-rw-r--r--lib/plugins/managesieve/tests/Managesieve.php2
-rw-r--r--lib/plugins/managesieve/tests/Parser.php4
-rw-r--r--lib/plugins/managesieve/tests/Tokenizer.php2
-rw-r--r--lib/plugins/managesieve/tests/Vacation.php4
112 files changed, 3483 insertions, 1209 deletions
diff --git a/lib/plugins/kolab_auth/composer.json b/lib/plugins/kolab_auth/composer.json
new file mode 100644
index 0000000..3e7012f
--- /dev/null
+++ b/lib/plugins/kolab_auth/composer.json
@@ -0,0 +1,30 @@
+{
+ "name": "kolab/kolab_auth",
+ "type": "roundcube-plugin",
+ "description": "Kolab authentication",
+ "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/",
+ "license": "AGPLv3",
+ "version": "3.2.2",
+ "authors": [
+ {
+ "name": "Thomas Bruederli",
+ "email": "bruederli@kolabsys.com",
+ "role": "Lead"
+ },
+ {
+ "name": "Aleksander Machniak",
+ "email": "machniak@kolabsys.com",
+ "role": "Lead"
+ }
+ ],
+ "repositories": [
+ {
+ "type": "composer",
+ "url": "http://plugins.roundcube.net"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.0",
+ "roundcube/plugin-installer": ">=0.1.3"
+ }
+}
diff --git a/lib/plugins/kolab_auth/config.inc.php.dist b/lib/plugins/kolab_auth/config.inc.php.dist
index 785fb78..8c01d56 100644
--- a/lib/plugins/kolab_auth/config.inc.php.dist
+++ b/lib/plugins/kolab_auth/config.inc.php.dist
@@ -13,48 +13,55 @@
// With this %dc variable in base_dn and groups/base_dn will be
// replaced with DN string of resolved domain
//---------------------------------------------------------------------
-$rcmail_config['kolab_auth_addressbook'] = '';
+$config['kolab_auth_addressbook'] = '';
// This will overwrite defined filter
-$rcmail_config['kolab_auth_filter'] = '(&(objectClass=kolabInetOrgPerson)(|(uid=%u)(mail=%fu)(alias=%fu)))';
+$config['kolab_auth_filter'] = '(&(objectClass=kolabInetOrgPerson)(|(uid=%u)(mail=%fu)(alias=%fu)))';
-// Use this fields (from fieldmap configuration) to get authentication ID
-$rcmail_config['kolab_auth_login'] = 'email';
+// Use this field (from fieldmap configuration) to get authentication ID. Don't use an array here!
+$config['kolab_auth_login'] = 'email';
-// Use this fields (from fieldmap configuration) for default identity.
+// Use these fields (from fieldmap configuration) for default identity.
// If the value array contains more than one field, first non-empty will be used
// Note: These aren't LDAP attributes, but field names in config
// Note: If there's more than one email address, as many identities will be created
-$rcmail_config['kolab_auth_name'] = array('name', 'cn');
-$rcmail_config['kolab_auth_email'] = array('email');
-$rcmail_config['kolab_auth_organization'] = array('organization');
+$config['kolab_auth_name'] = array('name', 'cn');
+$config['kolab_auth_email'] = array('email');
+$config['kolab_auth_organization'] = array('organization');
+
+// Role field (from fieldmap configuration)
+$config['kolab_auth_role'] = 'role';
// Template for user names displayed in the UI.
// You can use all attributes from the 'fieldmap' property of the 'kolab_auth_addressbook' configuration
-$rcmail_config['kolab_auth_user_displayname'] = '{name} ({ou})';
+$config['kolab_auth_user_displayname'] = '{name} ({ou})';
// Login and password of the admin user. Enables "Login As" feature.
-$rcmail_config['kolab_auth_admin_login'] = '';
-$rcmail_config['kolab_auth_admin_password'] = '';
+$config['kolab_auth_admin_login'] = '';
+$config['kolab_auth_admin_password'] = '';
// Enable audit logging for abuse of administrative privileges.
-$rcmail_config['kolab_auth_auditlog'] = false;
-
-// Role field (from fieldmap configuration)
-$rcmail_config['kolab_auth_role'] = 'role';
-// The required value for the role attribute to contain should the user be allowed
-// to login as another user.
-$rcmail_config['kolab_auth_role_value'] = '';
+$config['kolab_auth_auditlog'] = false;
-// Administrative group name to which user must be assigned to
-// which adds privilege to login as another user.
-$rcmail_config['kolab_auth_group'] = '';
+// As set of rules to define the required rights on the target entry
+// which allow an admin user to login as another user (the target).
+// The effective rights value refers to either entry level attribute level rights:
+// * entry:[read|add|delete]
+// * attrib:<attribute-name>:[read|write|delete]
+$config['kolab_auth_admin_rights'] = array(
+ // Roundcube task => required effective right
+ 'settings' => 'entry:read',
+ 'mail' => 'entry:delete',
+ 'addressbook' => 'entry:delete',
+ // or use a wildcard entry like this:
+ '*' => 'entry:read',
+);
// Enable plugins on a role-by-role basis. In this example, the 'acl' plugin
// is enabled for people with a 'cn=professional-user,dc=mykolab,dc=ch' role.
//
// Note that this does NOT mean the 'acl' plugin is disabled for other people.
-$rcmail_config['kolab_auth_role_plugins'] = Array(
+$config['kolab_auth_role_plugins'] = Array(
'cn=professional-user,dc=mykolab,dc=ch' => Array(
'acl',
),
@@ -66,7 +73,7 @@ $rcmail_config['kolab_auth_role_plugins'] = Array(
// do not allow the setting to be controlled through the preferences, enable the
// html editor for professional users and allow them to override the setting in
// the preferences.
-$rcmail_config['kolab_auth_role_settings'] = Array(
+$config['kolab_auth_role_settings'] = Array(
'cn=professional-user,dc=mykolab,dc=ch' => Array(
'htmleditor' => Array(
'mode' => 'override',
@@ -79,6 +86,6 @@ $rcmail_config['kolab_auth_role_settings'] = Array(
// List of LDAP addressbooks (keys of ldap_public configuration array)
// for which base_dn variables (%dc, etc.) will be replaced according to authenticated user DN
// Note: special name '*' for all LDAP addressbooks
-$rcmail_config['kolab_auth_ldap_addressbooks'] = array('*');
+$config['kolab_auth_ldap_addressbooks'] = array('*');
?>
diff --git a/lib/plugins/kolab_auth/kolab_auth.php b/lib/plugins/kolab_auth/kolab_auth.php
index 2b685a7..033d5b1 100644
--- a/lib/plugins/kolab_auth/kolab_auth.php
+++ b/lib/plugins/kolab_auth/kolab_auth.php
@@ -83,8 +83,30 @@ class kolab_auth extends rcube_plugin
}
}
+ /**
+ * Startup hook handler
+ */
public function startup($args)
{
+ // Check access rights when logged in as another user
+ if (!empty($_SESSION['kolab_auth_admin']) && $args['task'] != 'login' && $args['task'] != 'logout') {
+ // access to specified task is forbidden,
+ // redirect to the first task on the list
+ if (!empty($_SESSION['kolab_auth_allowed_tasks'])) {
+ $tasks = (array)$_SESSION['kolab_auth_allowed_tasks'];
+ if (!in_array($args['task'], $tasks) && !in_array('*', $tasks)) {
+ header('Location: ?_task=' . array_shift($tasks));
+ die;
+ }
+
+ // add script that will remove disabled taskbar buttons
+ if (!in_array('*', $tasks)) {
+ $this->add_hook('render_page', array($this, 'render_page'));
+ }
+ }
+ }
+
+ // load per-user settings
$this->load_user_role_plugins_and_settings();
return $args;
@@ -103,21 +125,36 @@ class kolab_auth extends rcube_plugin
foreach ($args['result'] as $name => $config) {
if (in_array($name, $kolab_books) || in_array('*', $kolab_books)) {
- $args['result'][$name]['base_dn'] = self::parse_ldap_vars($config['base_dn']);
- $args['result'][$name]['search_base_dn'] = self::parse_ldap_vars($config['search_base_dn']);
- $args['result'][$name]['bind_dn'] = str_replace('%dn', $_SESSION['kolab_dn'], $config['bind_dn']);
-
- if (!empty($config['groups'])) {
- $args['result'][$name]['groups']['base_dn'] = self::parse_ldap_vars($config['groups']['base_dn']);
- }
+ $args['result'][$name] = $this->patch_ldap_config($config);
}
}
}
+ else if ($args['name'] == 'kolab_users_directory' && !empty($args['result'])) {
+ $args['result'] = $this->patch_ldap_config($args['result']);
+ }
return $args;
}
/**
+ * Helper method to patch the given LDAP directory config with user-specific values
+ */
+ protected function patch_ldap_config($config)
+ {
+ if (is_array($config)) {
+ $config['base_dn'] = self::parse_ldap_vars($config['base_dn']);
+ $config['search_base_dn'] = self::parse_ldap_vars($config['search_base_dn']);
+ $config['bind_dn'] = str_replace('%dn', $_SESSION['kolab_dn'], $config['bind_dn']);
+
+ if (!empty($config['groups'])) {
+ $config['groups']['base_dn'] = self::parse_ldap_vars($config['groups']['base_dn']);
+ }
+ }
+
+ return $config;
+ }
+
+ /**
* Modifies list of plugins and settings according to
* specified LDAP roles
*/
@@ -429,24 +466,69 @@ class kolab_auth extends rcube_plugin
return $args;
}
- // check if the original user has/belongs to administrative role/group
$isadmin = false;
- $group = $rcmail->config->get('kolab_auth_group');
- $role_dn = $rcmail->config->get('kolab_auth_role_value');
-
- // check role attribute
- if (!empty($role_attr) && !empty($role_dn) && !empty($record[$role_attr])) {
- $role_dn = $ldap->parse_vars($role_dn, $user, $host);
- if (in_array($role_dn, (array)$record[$role_attr])) {
- $isadmin = true;
+ $admin_rights = $rcmail->config->get('kolab_auth_admin_rights', array());
+
+ // @deprecated: fall-back to the old check if the original user has/belongs to administrative role/group
+ if (empty($admin_rights)) {
+ $group = $rcmail->config->get('kolab_auth_group');
+ $role_dn = $rcmail->config->get('kolab_auth_role_value');
+
+ // check role attribute
+ if (!empty($role_attr) && !empty($role_dn) && !empty($record[$role_attr])) {
+ $role_dn = $ldap->parse_vars($role_dn, $user, $host);
+ if (in_array($role_dn, (array)$record[$role_attr])) {
+ $isadmin = true;
+ }
+ }
+
+ // check group
+ if (!$isadmin && !empty($group)) {
+ $groups = $ldap->get_user_groups($record['dn'], $user, $host);
+ if (in_array($group, $groups)) {
+ $isadmin = true;
+ }
+ }
+
+ if ($isadmin) {
+ // user has admin privileges privilage, get "login as" user credentials
+ $target_entry = $ldap->get_user_record($loginas, $host);
+ $allowed_tasks = $rcmail->config->get('kolab_auth_allowed_tasks');
}
}
+ else {
+ // get "login as" user credentials
+ $target_entry = $ldap->get_user_record($loginas, $host);
+
+ if (!empty($target_entry)) {
+ // get effective rights to determine login-as permissions
+ $effective_rights = (array)$ldap->effective_rights($target_entry['dn']);
+
+ if (!empty($effective_rights)) {
+ $effective_rights['attrib'] = $effective_rights['attributeLevelRights'];
+ $effective_rights['entry'] = $effective_rights['entryLevelRights'];
+
+ // compare the rights with the permissions mapping
+ $allowed_tasks = array();
+ foreach ($admin_rights as $task => $perms) {
+ $perms_ = explode(':', $perms);
+ $type = array_shift($perms_);
+ $req = array_pop($perms_);
+ $attrib = array_pop($perms_);
+
+ if (array_key_exists($type, $effective_rights)) {
+ if ($type == 'entry' && in_array($req, $effective_rights[$type])) {
+ $allowed_tasks[] = $task;
+ }
+ else if ($type == 'attrib' && array_key_exists($attrib, $effective_rights[$type]) &&
+ in_array($req, $effective_rights[$type][$attrib])) {
+ $allowed_tasks[] = $task;
+ }
+ }
+ }
- // check group
- if (!$isadmin && !empty($group)) {
- $groups = $ldap->get_user_groups($record['dn'], $user, $host);
- if (in_array($group, $groups)) {
- $isadmin = true;
+ $isadmin = !empty($allowed_tasks);
+ }
}
}
@@ -458,22 +540,22 @@ class kolab_auth extends rcube_plugin
$origname = $user;
}
- $record = null;
-
- // user has the privilage, get "login as" user credentials
- if ($isadmin) {
- $record = $ldap->get_user_record($loginas, $host);
- }
+ if (!$isadmin || empty($target_entry)) {
+ $this->add_texts('localization/');
- if (empty($record)) {
$args['abort'] = true;
+ $args['error'] = $this->gettext(array(
+ 'name' => 'loginasnotallowed',
+ 'vars' => array('user' => Q($loginas)),
+ ));
+
$message = sprintf(
'Login failure for user %s (as user %s) from %s in session %s (error %s)',
$user,
$loginas,
rcube_utils::remote_ip(),
session_id(),
- "No user record found for '" . $loginas . "'"
+ "No privileges to login as '" . $loginas . "'"
);
rcube::write_log('userlogins', $message);
@@ -481,12 +563,16 @@ class kolab_auth extends rcube_plugin
return $args;
}
+ // replace $record with target entry
+ $record = $target_entry;
+
$args['user'] = $this->username = $loginas;
// Mark session to use SASL proxy for IMAP authentication
$_SESSION['kolab_auth_admin'] = strtolower($origname);
$_SESSION['kolab_auth_login'] = $rcmail->encrypt($admin_login);
$_SESSION['kolab_auth_password'] = $rcmail->encrypt($admin_pass);
+ $_SESSION['kolab_auth_allowed_tasks'] = $allowed_tasks;
}
// Store UID and DN of logged user in session for use by other plugins
@@ -634,6 +720,28 @@ class kolab_auth extends rcube_plugin
}
/**
+ * Action executed before the page is rendered to add an onload script
+ * that will remove all taskbar buttons for disabled tasks
+ */
+ public function render_page($args)
+ {
+ $rcmail = rcube::get_instance();
+ $tasks = (array)$_SESSION['kolab_auth_allowed_tasks'];
+ $tasks[] = 'logout';
+
+ // disable buttons in taskbar
+ $script = "
+ \$('a').filter(function() {
+ var ev = \$(this).attr('onclick');
+ return ev && ev.match(/'switch-task','([a-z]+)'/)
+ && \$.inArray(RegExp.\$1, " . json_encode($tasks) . ") < 0;
+ }).remove();
+ ";
+
+ $rcmail->output->add_script($script, 'docready');
+ }
+
+ /**
* Initializes LDAP object and connects to LDAP server
*/
public static function ldap()
diff --git a/lib/plugins/kolab_auth/kolab_auth_ldap.php b/lib/plugins/kolab_auth/kolab_auth_ldap.php
index 303bbf3..431133b 100644
--- a/lib/plugins/kolab_auth/kolab_auth_ldap.php
+++ b/lib/plugins/kolab_auth/kolab_auth_ldap.php
@@ -57,8 +57,6 @@ class kolab_auth_ldap extends rcube_ldap_generic
*/
private function _connect()
{
- $rcube = rcube::get_instance();
-
// try to connect + bind for every host configured
// with OpenLDAP 2.x ldap_connect() always succeeds but ldap_bind will fail if host isn't reachable
// see http://www.php.net/manual/en/function.ldap-connect.php
@@ -157,11 +155,10 @@ class kolab_auth_ldap extends rcube_ldap_generic
$groups = array();
foreach ($result as $entry) {
+ $dn = $entry['dn'];
$entry = rcube_ldap_generic::normalize_entry($entry);
- if (!$entry['dn']) {
- $entry['dn'] = key($result->entries(true));
- }
- $groups[$entry['dn']] = $entry[$name_attr];
+
+ $groups[$dn] = $entry[$name_attr];
}
return $groups;
@@ -310,7 +307,8 @@ class kolab_auth_ldap extends rcube_ldap_generic
if ($limit && $limit <= $i) {
break;
}
- $dn = key($result->entries(true));
+
+ $dn = $entry['dn'];
$entry = rcube_ldap_generic::normalize_entry($entry);
$list[$dn] = $this->field_mapping($dn, $entry);
$i++;
diff --git a/lib/plugins/kolab_auth/localization/de_CH.inc b/lib/plugins/kolab_auth/localization/de_CH.inc
index 5e85a01..0332070 100644
--- a/lib/plugins/kolab_auth/localization/de_CH.inc
+++ b/lib/plugins/kolab_auth/localization/de_CH.inc
@@ -1,3 +1,10 @@
<?php
+/**
+ * Localizations for the Kolab Auth plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_auth/
+ */
$labels['loginas'] = 'Anmelden als';
?>
diff --git a/lib/plugins/kolab_auth/localization/de_DE.inc b/lib/plugins/kolab_auth/localization/de_DE.inc
index 5e85a01..3918e6e 100644
--- a/lib/plugins/kolab_auth/localization/de_DE.inc
+++ b/lib/plugins/kolab_auth/localization/de_DE.inc
@@ -1,3 +1,11 @@
<?php
+/**
+ * Localizations for the Kolab Auth plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_auth/
+ */
$labels['loginas'] = 'Anmelden als';
+$labels['loginasnotallowed'] = 'Keine Privilegien zum Anmelden als $user';
?>
diff --git a/lib/plugins/kolab_auth/localization/en_US.inc b/lib/plugins/kolab_auth/localization/en_US.inc
index 2a7b246..4882bdc 100644
--- a/lib/plugins/kolab_auth/localization/en_US.inc
+++ b/lib/plugins/kolab_auth/localization/en_US.inc
@@ -9,5 +9,6 @@
*/
$labels['loginas'] = 'Login As';
+$labels['loginasnotallowed'] = 'No privileges to login as $user';
?>
diff --git a/lib/plugins/kolab_auth/localization/fr_FR.inc b/lib/plugins/kolab_auth/localization/fr_FR.inc
index 6f72695..6538f5b 100644
--- a/lib/plugins/kolab_auth/localization/fr_FR.inc
+++ b/lib/plugins/kolab_auth/localization/fr_FR.inc
@@ -1,3 +1,11 @@
<?php
+/**
+ * Localizations for the Kolab Auth plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_auth/
+ */
$labels['loginas'] = 'Se connecter en tant que';
+$labels['loginasnotallowed'] = 'Pas de privilège de se connecter comme $utilisateur';
?>
diff --git a/lib/plugins/kolab_auth/localization/ja_JP.inc b/lib/plugins/kolab_auth/localization/ja_JP.inc
index ed0358a..e360737 100644
--- a/lib/plugins/kolab_auth/localization/ja_JP.inc
+++ b/lib/plugins/kolab_auth/localization/ja_JP.inc
@@ -1,3 +1,10 @@
<?php
+/**
+ * Localizations for the Kolab Auth plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_auth/
+ */
$labels['loginas'] = 'ログイン';
?>
diff --git a/lib/plugins/kolab_auth/localization/nl_NL.inc b/lib/plugins/kolab_auth/localization/nl_NL.inc
index a98283f..ea3a1c0 100644
--- a/lib/plugins/kolab_auth/localization/nl_NL.inc
+++ b/lib/plugins/kolab_auth/localization/nl_NL.inc
@@ -1,3 +1,10 @@
<?php
+/**
+ * Localizations for the Kolab Auth plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_auth/
+ */
$labels['loginas'] = 'Log in als';
?>
diff --git a/lib/plugins/kolab_auth/localization/pl_PL.inc b/lib/plugins/kolab_auth/localization/pl_PL.inc
index 124c373..ca67859 100644
--- a/lib/plugins/kolab_auth/localization/pl_PL.inc
+++ b/lib/plugins/kolab_auth/localization/pl_PL.inc
@@ -1,3 +1,10 @@
<?php
+/**
+ * Localizations for the Kolab Auth plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_auth/
+ */
$labels['loginas'] = 'Zaloguj jako';
?>
diff --git a/lib/plugins/kolab_auth/localization/ru_RU.inc b/lib/plugins/kolab_auth/localization/ru_RU.inc
index 9e28c12..ac9e5a7 100644
--- a/lib/plugins/kolab_auth/localization/ru_RU.inc
+++ b/lib/plugins/kolab_auth/localization/ru_RU.inc
@@ -1,3 +1,11 @@
<?php
+/**
+ * Localizations for the Kolab Auth plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_auth/
+ */
$labels['loginas'] = 'Войти как';
+$labels['loginasnotallowed'] = 'Нет привилегий войти как $user';
?>
diff --git a/lib/plugins/kolab_auth/package.xml b/lib/plugins/kolab_auth/package.xml
deleted file mode 100644
index 5a2093b..0000000
--- a/lib/plugins/kolab_auth/package.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
- http://pear.php.net/dtd/tasks-1.0.xsd
- http://pear.php.net/dtd/package-2.0
- http://pear.php.net/dtd/package-2.0.xsd">
- <name>kolab_auth</name>
- <uri>http://git.kolab.org/roundcubemail-plugins-kolab/</uri>
- <summary>Kolab Authentication</summary>
- <description>
- Authenticates on LDAP server, finds canonized authentication ID for IMAP
- and for new users creates identity based on LDAP information.
- Supports impersonate feature (login as another user). To use this feature
- imap_auth_type/smtp_auth_type must be set to DIGEST-MD5 or PLAIN.
- </description>
- <lead>
- <name>Aleksander Machniak</name>
- <user>machniak</user>
- <email>machniak@kolabsys.com</email>
- <active>yes</active>
- </lead>
- <date>2013-10-04</date>
- <version>
- <release>1.0</release>
- <api>1.0</api>
- </version>
- <stability>
- <release>stable</release>
- <api>stable</api>
- </stability>
- <license uri="http://www.gnu.org/licenses/agpl.html">GNU AGPLv3</license>
- <notes>-</notes>
- <contents>
- <dir baseinstalldir="/" name="/">
- <file name="kolab_auth.php" role="php">
- <tasks:replace from="@name@" to="name" type="package-info"/>
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="kolab_auth_ldap.php" role="php">
- <tasks:replace from="@name@" to="name" type="package-info"/>
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="config.inc.php.dist" role="data"></file>
- <file name="LICENSE" role="data"></file>
-
- <file name="localization/de_CH.inc" role="data"></file>
- <file name="localization/de_DE.inc" role="data"></file>
- <file name="localization/en_US.inc" role="data"></file>
- <file name="localization/pl_PL.inc" role="data"></file>
- </dir>
- <!-- / -->
- </contents>
- <dependencies>
- <required>
- <php>
- <min>5.2.1</min>
- </php>
- <pearinstaller>
- <min>1.7.0</min>
- </pearinstaller>
- </required>
- </dependencies>
- <phprelease/>
-</package>
diff --git a/lib/plugins/kolab_folders/composer.json b/lib/plugins/kolab_folders/composer.json
new file mode 100644
index 0000000..a4a9877
--- /dev/null
+++ b/lib/plugins/kolab_folders/composer.json
@@ -0,0 +1,26 @@
+{
+ "name": "kolab/kolab_folders",
+ "type": "roundcube-plugin",
+ "description": "Type-aware folder management/listing for Kolab",
+ "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/",
+ "license": "AGPLv3",
+ "version": "3.2.3",
+ "authors": [
+ {
+ "name": "Aleksander Machniak",
+ "email": "machniak@kolabsys.com",
+ "role": "Lead"
+ }
+ ],
+ "repositories": [
+ {
+ "type": "composer",
+ "url": "http://plugins.roundcube.net"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.0",
+ "roundcube/plugin-installer": ">=0.1.3",
+ "kolab/libkolab": ">=3.2.3"
+ }
+}
diff --git a/lib/plugins/kolab_folders/config.inc.php.dist b/lib/plugins/kolab_folders/config.inc.php.dist
index ffa1e15..0c9bd12 100644
--- a/lib/plugins/kolab_folders/config.inc.php.dist
+++ b/lib/plugins/kolab_folders/config.inc.php.dist
@@ -7,32 +7,30 @@
// Note: Mail folders will be also subscribed.
// Default Configuration folder
-$rcmail_config['kolab_folders_configuration_default'] = '';
+$config['kolab_folders_configuration_default'] = '';
// Default Calendar folder
-$rcmail_config['kolab_folders_event_default'] = '';
+$config['kolab_folders_event_default'] = '';
// Default Contacts (Addressbook) folder
-$rcmail_config['kolab_folders_contact_default'] = '';
+$config['kolab_folders_contact_default'] = '';
// Default Tasks folder
-$rcmail_config['kolab_folders_task_default'] = '';
+$config['kolab_folders_task_default'] = '';
// Default Notes folder
-$rcmail_config['kolab_folders_note_default'] = '';
+$config['kolab_folders_note_default'] = '';
// Default Journal folder
-$rcmail_config['kolab_folders_journal_default'] = '';
+$config['kolab_folders_journal_default'] = '';
// Default Files folder
-$rcmail_config['kolab_folders_file_default'] = '';
+$config['kolab_folders_file_default'] = '';
// Default FreeBusy folder
-$rcmail_config['kolab_folders_freebusy_default'] = '';
+$config['kolab_folders_freebusy_default'] = '';
// INBOX folder
-$rcmail_config['kolab_folders_mail_inbox'] = '';
+$config['kolab_folders_mail_inbox'] = '';
// Drafts folder
-$rcmail_config['kolab_folders_mail_drafts'] = '';
+$config['kolab_folders_mail_drafts'] = '';
// Sent folder
-$rcmail_config['kolab_folders_mail_sentitems'] = '';
+$config['kolab_folders_mail_sentitems'] = '';
// Trash folder
-$rcmail_config['kolab_folders_mail_wastebasket'] = '';
+$config['kolab_folders_mail_wastebasket'] = '';
// Others folders
-$rcmail_config['kolab_folders_mail_outbox'] = '';
-$rcmail_config['kolab_folders_mail_junkemail'] = '';
-
-?>
+$config['kolab_folders_mail_outbox'] = '';
+$config['kolab_folders_mail_junkemail'] = '';
diff --git a/lib/plugins/kolab_folders/kolab_folders.js b/lib/plugins/kolab_folders/kolab_folders.js
index ac50543..b9d9225 100644
--- a/lib/plugins/kolab_folders/kolab_folders.js
+++ b/lib/plugins/kolab_folders/kolab_folders.js
@@ -50,47 +50,23 @@ window.rcmail && rcmail.env.action == 'folders' && rcmail.addEventListener('init
});
window.rcmail && rcmail.env.action != 'folders' && $(document).ready(function() {
- // IE doesn't allow setting OPTION's display/visibility
- // We'll need to remove SELECT's options, see below
- if (bw.ie) {
- rcmail.env.subtype_html = $('#_subtype').html();
- }
-
// Add onchange handler for folder type SELECT, and call it on form init
$('#_ctype').change(function() {
var type = $(this).val(),
sub = $('#_subtype'),
- subtype = sub.val();
+ subtypes = rcmail.env.kolab_folder_subtypes[type] || {};
- // For IE we need to revert the whole SELECT to the original state
- if (bw.ie) {
- sub.html(rcmail.env.subtype_html).val(subtype);
- }
+ // reset subtype selector
+ sub.html('<option value=""></option>');
- // For non-mail folders we must hide mail-specific subtypes
- $('option', sub).each(function() {
- var opt = $(this), val = opt.val();
- if (val == '')
- return;
- // there's no mail.default
- if (val == 'default' && type != 'mail') {
- opt.show();
- return;
- };
-
- if (type == 'mail' && val != 'default')
- opt.show();
- else if (bw.ie)
- opt.remove();
- else
- opt.hide();
+ // append available subtypes for the given folder type
+ $.each(subtypes, function(val, label) {
+ $('<option>').attr('value', val).text(label).appendTo(sub);
});
// And re-set subtype
- if (type != 'mail' && subtype != '' && subtype != 'default') {
- sub.val('');
- }
- }).change();
+ sub.val(rcmail.env.kolab_folder_subtype);
+ });
});
function kolab_folders_filter(filter)
diff --git a/lib/plugins/kolab_folders/kolab_folders.php b/lib/plugins/kolab_folders/kolab_folders.php
index 510388c..b3c2e8e 100644
--- a/lib/plugins/kolab_folders/kolab_folders.php
+++ b/lib/plugins/kolab_folders/kolab_folders.php
@@ -27,7 +27,17 @@ class kolab_folders extends rcube_plugin
public $task = '?(?!login).*';
public $types = array('mail', 'event', 'journal', 'task', 'note', 'contact', 'configuration', 'file', 'freebusy');
- public $mail_types = array('inbox', 'drafts', 'sentitems', 'outbox', 'wastebasket', 'junkemail');
+ public $subtypes = array(
+ 'mail' => array('inbox', 'drafts', 'sentitems', 'outbox', 'wastebasket', 'junkemail'),
+ 'event' => array('default', 'confidential'),
+ 'task' => array('default', 'confidential'),
+ 'journal' => array('default'),
+ 'note' => array('default'),
+ 'contact' => array('default'),
+ 'configuration' => array('default'),
+ 'file' => array('default'),
+ 'freebusy' => array('default'),
+ );
public $act_types = array('event', 'task');
private $rc;
@@ -202,8 +212,8 @@ class kolab_folders extends rcube_plugin
$mbox = strlen($args['name']) ? $args['name'] : $args['parent_name'];
if (isset($_POST['_ctype'])) {
- $new_ctype = trim(get_input_value('_ctype', RCUBE_INPUT_POST));
- $new_subtype = trim(get_input_value('_subtype', RCUBE_INPUT_POST));
+ $new_ctype = trim(rcube_utils::get_input_value('_ctype', rcube_utils::INPUT_POST));
+ $new_subtype = trim(rcube_utils::get_input_value('_subtype', rcube_utils::INPUT_POST));
}
// Get type of the folder or the parent
@@ -248,6 +258,7 @@ class kolab_folders extends rcube_plugin
// build type SELECT fields
$type_select = new html_select(array('name' => '_ctype', 'id' => '_ctype'));
$sub_select = new html_select(array('name' => '_subtype', 'id' => '_subtype'));
+ $sub_select->add('', '');
foreach ($this->types as $type) {
$type_select->add($this->gettext('foldertype'.$type), $type);
@@ -257,10 +268,14 @@ class kolab_folders extends rcube_plugin
$type_select->add($ctype, $ctype);
}
- $sub_select->add('', '');
- $sub_select->add($this->gettext('default'), 'default');
- foreach ($this->mail_types as $type) {
- $sub_select->add($this->gettext($type), $type);
+ $sub_types = array();
+ foreach ($this->subtypes as $ftype => $subtypes) {
+ $sub_types[$ftype] = array_combine($subtypes, array_map(array($this, 'gettext'), $subtypes));
+
+ // fill options for the current folder type
+ if ($ftype == $ctype || $ftype == $new_ctype) {
+ $sub_select->add(array_values($sub_types[$ftype]), $subtypes);
+ }
}
$args['form']['props']['fieldsets']['settings']['content']['foldertype'] = array(
@@ -269,6 +284,9 @@ class kolab_folders extends rcube_plugin
. $sub_select->show(isset($new_subtype) ? $new_subtype : $subtype),
);
+ $this->rc->output->set_env('kolab_folder_subtypes', $sub_types);
+ $this->rc->output->set_env('kolab_folder_subtype', isset($new_subtype) ? $new_subtype : $subtype);
+
return $args;
}
@@ -283,8 +301,8 @@ class kolab_folders extends rcube_plugin
}
// Folder create/update with form
- $ctype = trim(get_input_value('_ctype', RCUBE_INPUT_POST));
- $subtype = trim(get_input_value('_subtype', RCUBE_INPUT_POST));
+ $ctype = trim(rcube_utils::get_input_value('_ctype', rcube_utils::INPUT_POST));
+ $subtype = trim(rcube_utils::get_input_value('_subtype', rcube_utils::INPUT_POST));
$mbox = $args['record']['name'];
$old_mbox = $args['record']['oldname'];
$subscribe = $args['record']['subscribe'];
@@ -312,7 +330,7 @@ class kolab_folders extends rcube_plugin
}
}
// Subtype sanity-checks
- else if ($subtype && ($ctype != 'mail' || !in_array($subtype, $this->mail_types))) {
+ else if ($subtype && (!($subtypes = $this->subtypes[$ctype]) || !in_array($subtype, $subtypes))) {
$subtype = '';
}
@@ -522,8 +540,7 @@ class kolab_folders extends rcube_plugin
// get configured defaults
foreach ($this->types as $type) {
- $subtypes = $type == 'mail' ? $this->mail_types : array('default');
- foreach ($subtypes as $subtype) {
+ foreach ((array)$this->subtypes[$type] as $subtype) {
$opt_name = 'kolab_folders_' . $type . '_' . $subtype;
if ($folder = $this->rc->config->get($opt_name)) {
// convert configuration value to UTF7-IMAP charset
diff --git a/lib/plugins/kolab_folders/localization/de_CH.inc b/lib/plugins/kolab_folders/localization/de_CH.inc
index ebac855..91c24d3 100644
--- a/lib/plugins/kolab_folders/localization/de_CH.inc
+++ b/lib/plugins/kolab_folders/localization/de_CH.inc
@@ -1,4 +1,11 @@
<?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
$labels['folderctype'] = 'Ordnerinhalt';
$labels['foldertypemail'] = 'E-Mail';
$labels['foldertypeevent'] = 'Kalender';
@@ -16,5 +23,6 @@ $labels['sentitems'] = 'Gesendet';
$labels['outbox'] = 'Postausgang';
$labels['wastebasket'] = 'Gelöscht';
$labels['junkemail'] = 'Spam';
+$labels['confidential'] = 'Confidential';
$messages['defaultfolderexists'] = 'Es existiert bereits ein Standardordner für den angegebenen Typ';
?>
diff --git a/lib/plugins/kolab_folders/localization/de_DE.inc b/lib/plugins/kolab_folders/localization/de_DE.inc
index 9921e25..24749ad 100644
--- a/lib/plugins/kolab_folders/localization/de_DE.inc
+++ b/lib/plugins/kolab_folders/localization/de_DE.inc
@@ -1,4 +1,11 @@
<?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
$labels['folderctype'] = 'Ordnerinhalt';
$labels['foldertypemail'] = 'E-Mail';
$labels['foldertypeevent'] = 'Kalender';
@@ -16,5 +23,6 @@ $labels['sentitems'] = 'Gesendet';
$labels['outbox'] = 'Postausgang';
$labels['wastebasket'] = 'Mülleimer';
$labels['junkemail'] = 'Spam';
+$labels['confidential'] = 'Vertraulich';
$messages['defaultfolderexists'] = 'Es gibt bereits einen Standardordner dieses Typs';
?>
diff --git a/lib/plugins/kolab_folders/localization/en_US.inc b/lib/plugins/kolab_folders/localization/en_US.inc
index 0d8d86c..0910d9d 100644
--- a/lib/plugins/kolab_folders/localization/en_US.inc
+++ b/lib/plugins/kolab_folders/localization/en_US.inc
@@ -28,6 +28,7 @@ $labels['sentitems'] = 'Sent';
$labels['outbox'] = 'Outbox';
$labels['wastebasket'] = 'Trash';
$labels['junkemail'] = 'Junk';
+$labels['confidential'] = 'Confidential';
$messages['defaultfolderexists'] = 'There is already default folder of specified type';
diff --git a/lib/plugins/kolab_folders/localization/es_ES.inc b/lib/plugins/kolab_folders/localization/es_ES.inc
index cdbc62c..b53712b 100644
--- a/lib/plugins/kolab_folders/localization/es_ES.inc
+++ b/lib/plugins/kolab_folders/localization/es_ES.inc
@@ -1,7 +1,28 @@
<?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
+$labels['folderctype'] = 'Content type';
+$labels['foldertypemail'] = 'Mail';
$labels['foldertypeevent'] = 'Calendar';
+$labels['foldertypejournal'] = 'Journal';
$labels['foldertypetask'] = 'Tareas';
$labels['foldertypenote'] = 'Notas';
$labels['foldertypecontact'] = 'Contactos';
$labels['foldertypeconfiguration'] = 'Configuración';
+$labels['foldertypefile'] = 'Files';
+$labels['foldertypefreebusy'] = 'Free-Busy';
+$labels['default'] = 'Default';
+$labels['inbox'] = 'Inbox';
+$labels['drafts'] = 'Drafts';
+$labels['sentitems'] = 'Sent';
+$labels['outbox'] = 'Outbox';
+$labels['wastebasket'] = 'Trash';
+$labels['junkemail'] = 'Junk';
+$labels['confidential'] = 'Confidential';
+$messages['defaultfolderexists'] = 'There is already default folder of specified type';
?>
diff --git a/lib/plugins/kolab_folders/localization/et_EE.inc b/lib/plugins/kolab_folders/localization/et_EE.inc
index efb51b6..5a12004 100644
--- a/lib/plugins/kolab_folders/localization/et_EE.inc
+++ b/lib/plugins/kolab_folders/localization/et_EE.inc
@@ -1,3 +1,28 @@
<?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
+$labels['folderctype'] = 'Content type';
+$labels['foldertypemail'] = 'Mail';
$labels['foldertypeevent'] = 'Calendar';
+$labels['foldertypejournal'] = 'Journal';
+$labels['foldertypetask'] = 'Tasks';
+$labels['foldertypenote'] = 'Notes';
+$labels['foldertypecontact'] = 'Contacts';
+$labels['foldertypeconfiguration'] = 'Configuration';
+$labels['foldertypefile'] = 'Files';
+$labels['foldertypefreebusy'] = 'Free-Busy';
+$labels['default'] = 'Default';
+$labels['inbox'] = 'Inbox';
+$labels['drafts'] = 'Drafts';
+$labels['sentitems'] = 'Sent';
+$labels['outbox'] = 'Outbox';
+$labels['wastebasket'] = 'Trash';
+$labels['junkemail'] = 'Junk';
+$labels['confidential'] = 'Confidential';
+$messages['defaultfolderexists'] = 'There is already default folder of specified type';
?>
diff --git a/lib/plugins/kolab_folders/localization/fr_FR.inc b/lib/plugins/kolab_folders/localization/fr_FR.inc
index ac3d2dd..41e506e 100644
--- a/lib/plugins/kolab_folders/localization/fr_FR.inc
+++ b/lib/plugins/kolab_folders/localization/fr_FR.inc
@@ -1,4 +1,11 @@
<?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
$labels['folderctype'] = 'Type de contenu';
$labels['foldertypemail'] = 'Courriel';
$labels['foldertypeevent'] = 'Calendrier';
@@ -16,5 +23,6 @@ $labels['sentitems'] = 'Envoyés';
$labels['outbox'] = 'Courrier sortant';
$labels['wastebasket'] = 'Corbeille';
$labels['junkemail'] = 'Indésirables';
+$labels['confidential'] = 'Confidentiel';
$messages['defaultfolderexists'] = 'Il existe déjà un répertoire par défaut pour le type spécifié';
?>
diff --git a/lib/plugins/kolab_folders/localization/ja_JP.inc b/lib/plugins/kolab_folders/localization/ja_JP.inc
index 2ac10c2..6dfd611 100644
--- a/lib/plugins/kolab_folders/localization/ja_JP.inc
+++ b/lib/plugins/kolab_folders/localization/ja_JP.inc
@@ -1,4 +1,11 @@
<?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
$labels['folderctype'] = 'コンテンツタイプ';
$labels['foldertypemail'] = 'メール';
$labels['foldertypeevent'] = 'カレンダー';
@@ -16,5 +23,6 @@ $labels['sentitems'] = '送信済';
$labels['outbox'] = '送信箱';
$labels['wastebasket'] = 'ごみ箱';
$labels['junkemail'] = '迷惑メール';
+$labels['confidential'] = 'Confidential';
$messages['defaultfolderexists'] = '指定したタイプの初期フォルダは既にあります。';
?>
diff --git a/lib/plugins/kolab_folders/localization/nl_NL.inc b/lib/plugins/kolab_folders/localization/nl_NL.inc
index 4946a24..a80aca5 100644
--- a/lib/plugins/kolab_folders/localization/nl_NL.inc
+++ b/lib/plugins/kolab_folders/localization/nl_NL.inc
@@ -1,4 +1,11 @@
<?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
$labels['folderctype'] = 'Inhoudstype';
$labels['foldertypemail'] = 'Mail';
$labels['foldertypeevent'] = 'Agenda';
@@ -16,5 +23,6 @@ $labels['sentitems'] = 'Verzonden';
$labels['outbox'] = 'Te versturen';
$labels['wastebasket'] = 'Prullenbak';
$labels['junkemail'] = 'Ongewenst';
+$labels['confidential'] = 'Vertrouwelijk';
$messages['defaultfolderexists'] = 'Er is reeds een standaard map voor dit type inhoud';
?>
diff --git a/lib/plugins/kolab_folders/localization/pl_PL.inc b/lib/plugins/kolab_folders/localization/pl_PL.inc
index 0b13bdd..8d9f61a 100644
--- a/lib/plugins/kolab_folders/localization/pl_PL.inc
+++ b/lib/plugins/kolab_folders/localization/pl_PL.inc
@@ -1,4 +1,11 @@
<?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
$labels['folderctype'] = 'Typ treści';
$labels['foldertypemail'] = 'Poczta';
$labels['foldertypeevent'] = 'Kalendarz';
@@ -16,5 +23,6 @@ $labels['sentitems'] = 'Wysłane';
$labels['outbox'] = 'Poczta wychodząca';
$labels['wastebasket'] = 'Kosz';
$labels['junkemail'] = 'Spam';
+$labels['confidential'] = 'Confidential';
$messages['defaultfolderexists'] = 'Folder domyślny wybranego typu już istnieje';
?>
diff --git a/lib/plugins/kolab_folders/localization/ru_RU.inc b/lib/plugins/kolab_folders/localization/ru_RU.inc
index 83df476..4e50bff 100644
--- a/lib/plugins/kolab_folders/localization/ru_RU.inc
+++ b/lib/plugins/kolab_folders/localization/ru_RU.inc
@@ -1,4 +1,11 @@
<?php
+/**
+ * Localizations for the Kolab Folders plugin
+ *
+ * Copyright (C) 2014, Kolab Systems AG
+ *
+ * For translation see https://www.transifex.com/projects/p/kolab/resource/kolab_folders/
+ */
$labels['folderctype'] = 'Тип ящика';
$labels['foldertypemail'] = 'Почта';
$labels['foldertypeevent'] = 'Календарь';
@@ -16,5 +23,6 @@ $labels['sentitems'] = 'Отправленные';
$labels['outbox'] = 'Исходящие';
$labels['wastebasket'] = 'Корзина';
$labels['junkemail'] = 'Спам';
+$labels['confidential'] = 'Конфиденциально';
$messages['defaultfolderexists'] = 'Уже назначен ящик по умолчанию для указанного типа';
?>
diff --git a/lib/plugins/kolab_folders/package.xml b/lib/plugins/kolab_folders/package.xml
deleted file mode 100644
index b40acab..0000000
--- a/lib/plugins/kolab_folders/package.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
- http://pear.php.net/dtd/tasks-1.0.xsd
- http://pear.php.net/dtd/package-2.0
- http://pear.php.net/dtd/package-2.0.xsd">
- <name>kolab_folders</name>
- <uri>http://git.kolab.org/roundcubemail-plugins-kolab/</uri>
- <summary>Type-aware folder management/listing for Kolab</summary>
- <description>
- The plugin extends folders handling with features of the Kolab Suite
- according to specified format (http://www.kolab.org/doc/kolabformat-2.0-html).
- With this plugin enabled it is possible to:
- - set/get/change folder's type,
- - filter folders list by folder type,
- - style folders list rows (in folder manager),
- - create default folders with specified type.
- </description>
- <lead>
- <name>Aleksander Machniak</name>
- <user>machniak</user>
- <email>machniak@kolabsys.com</email>
- <active>yes</active>
- </lead>
- <date>2012-10.25</date>
- <version>
- <release>2.1</release>
- <api>2.0</api>
- </version>
- <stability>
- <release>stable</release>
- <api>stable</api>
- </stability>
- <license uri="http://www.gnu.org/licenses/agpl.html">GNU AGPLv3</license>
- <notes>-</notes>
- <contents>
- <dir baseinstalldir="/" name="/">
- <file name="kolab_folders.php" role="php">
- <tasks:replace from="@name@" to="name" type="package-info"/>
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="kolab_folders.js" role="data">
- <tasks:replace from="@name@" to="name" type="package-info"/>
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="config.inc.php.dist" role="data"></file>
- <file name="localization/en_US.inc" role="data"></file>
- <file name="localization/pl_PL.inc" role="data"></file>
- <file name="LICENSE" role="data"></file>
- </dir>
- <!-- / -->
- </contents>
- <dependencies>
- <required>
- <php>
- <min>5.2.1</min>
- </php>
- <pearinstaller>
- <min>1.7.0</min>
- </pearinstaller>
- </required>
- </dependencies>
- <phprelease />
-</package>
diff --git a/lib/plugins/libkolab/SQL/mysql.initial.sql b/lib/plugins/libkolab/SQL/mysql.initial.sql
index 2aa046d..98e7e78 100644
--- a/lib/plugins/libkolab/SQL/mysql.initial.sql
+++ b/lib/plugins/libkolab/SQL/mysql.initial.sql
@@ -31,7 +31,7 @@ CREATE TABLE `kolab_cache_contact` (
`changed` DATETIME DEFAULT NULL,
`data` LONGTEXT NOT NULL,
`xml` LONGBLOB NOT NULL,
- `tags` VARCHAR(255) NOT NULL,
+ `tags` TEXT NOT NULL,
`words` TEXT NOT NULL,
`type` VARCHAR(32) CHARACTER SET ascii NOT NULL,
`name` VARCHAR(255) NOT NULL,
@@ -55,7 +55,7 @@ CREATE TABLE `kolab_cache_event` (
`changed` DATETIME DEFAULT NULL,
`data` LONGTEXT NOT NULL,
`xml` LONGBLOB NOT NULL,
- `tags` VARCHAR(255) NOT NULL,
+ `tags` TEXT NOT NULL,
`words` TEXT NOT NULL,
`dtstart` DATETIME,
`dtend` DATETIME,
@@ -75,7 +75,7 @@ CREATE TABLE `kolab_cache_task` (
`changed` DATETIME DEFAULT NULL,
`data` LONGTEXT NOT NULL,
`xml` LONGBLOB NOT NULL,
- `tags` VARCHAR(255) NOT NULL,
+ `tags` TEXT NOT NULL,
`words` TEXT NOT NULL,
`dtstart` DATETIME,
`dtend` DATETIME,
@@ -95,7 +95,7 @@ CREATE TABLE `kolab_cache_journal` (
`changed` DATETIME DEFAULT NULL,
`data` LONGTEXT NOT NULL,
`xml` LONGBLOB NOT NULL,
- `tags` VARCHAR(255) NOT NULL,
+ `tags` TEXT NOT NULL,
`words` TEXT NOT NULL,
`dtstart` DATETIME,
`dtend` DATETIME,
@@ -115,7 +115,7 @@ CREATE TABLE `kolab_cache_note` (
`changed` DATETIME DEFAULT NULL,
`data` LONGTEXT NOT NULL,
`xml` LONGBLOB NOT NULL,
- `tags` VARCHAR(255) NOT NULL,
+ `tags` TEXT NOT NULL,
`words` TEXT NOT NULL,
CONSTRAINT `fk_kolab_cache_note_folder` FOREIGN KEY (`folder_id`)
REFERENCES `kolab_folders`(`folder_id`) ON DELETE CASCADE ON UPDATE CASCADE,
@@ -133,7 +133,7 @@ CREATE TABLE `kolab_cache_file` (
`changed` DATETIME DEFAULT NULL,
`data` LONGTEXT NOT NULL,
`xml` LONGBLOB NOT NULL,
- `tags` VARCHAR(255) NOT NULL,
+ `tags` TEXT NOT NULL,
`words` TEXT NOT NULL,
`filename` varchar(255) DEFAULT NULL,
CONSTRAINT `fk_kolab_cache_file_folder` FOREIGN KEY (`folder_id`)
@@ -153,7 +153,7 @@ CREATE TABLE `kolab_cache_configuration` (
`changed` DATETIME DEFAULT NULL,
`data` LONGTEXT NOT NULL,
`xml` LONGBLOB NOT NULL,
- `tags` VARCHAR(255) NOT NULL,
+ `tags` TEXT NOT NULL,
`words` TEXT NOT NULL,
`type` VARCHAR(32) CHARACTER SET ascii NOT NULL,
CONSTRAINT `fk_kolab_cache_configuration_folder` FOREIGN KEY (`folder_id`)
@@ -173,7 +173,7 @@ CREATE TABLE `kolab_cache_freebusy` (
`changed` DATETIME DEFAULT NULL,
`data` LONGTEXT NOT NULL,
`xml` LONGBLOB NOT NULL,
- `tags` VARCHAR(255) NOT NULL,
+ `tags` TEXT NOT NULL,
`words` TEXT NOT NULL,
`dtstart` DATETIME,
`dtend` DATETIME,
@@ -184,4 +184,4 @@ CREATE TABLE `kolab_cache_freebusy` (
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
-INSERT INTO `system` (`name`, `value`) VALUES ('libkolab-version', '2014021000');
+INSERT INTO `system` (`name`, `value`) VALUES ('libkolab-version', '2015011600');
diff --git a/lib/plugins/libkolab/SQL/mysql/2014112700.sql b/lib/plugins/libkolab/SQL/mysql/2014112700.sql
new file mode 100644
index 0000000..90c77b8
--- /dev/null
+++ b/lib/plugins/libkolab/SQL/mysql/2014112700.sql
@@ -0,0 +1,2 @@
+-- delete cache entries for old folder identifiers
+DELETE FROM `kolab_folders` WHERE `resource` LIKE 'imap://anonymous@%';
diff --git a/lib/plugins/libkolab/SQL/mysql/2015011600.sql b/lib/plugins/libkolab/SQL/mysql/2015011600.sql
new file mode 100644
index 0000000..be523ae
--- /dev/null
+++ b/lib/plugins/libkolab/SQL/mysql/2015011600.sql
@@ -0,0 +1,8 @@
+ALTER TABLE `kolab_cache_contact` MODIFY `tags` text NOT NULL;
+ALTER TABLE `kolab_cache_event` MODIFY `tags` text NOT NULL;
+ALTER TABLE `kolab_cache_task` MODIFY `tags` text NOT NULL;
+ALTER TABLE `kolab_cache_journal` MODIFY `tags` text NOT NULL;
+ALTER TABLE `kolab_cache_note` MODIFY `tags` text NOT NULL;
+ALTER TABLE `kolab_cache_file` MODIFY `tags` text NOT NULL;
+ALTER TABLE `kolab_cache_configuration` MODIFY `tags` text NOT NULL;
+ALTER TABLE `kolab_cache_freebusy` MODIFY `tags` text NOT NULL;
diff --git a/lib/plugins/libkolab/SQL/oracle.initial.sql b/lib/plugins/libkolab/SQL/oracle.initial.sql
new file mode 100644
index 0000000..8f1ed64
--- /dev/null
+++ b/lib/plugins/libkolab/SQL/oracle.initial.sql
@@ -0,0 +1,184 @@
+/**
+ * libkolab database schema
+ *
+ * @version 1.1
+ * @author Aleksander Machniak
+ * @licence GNU AGPL
+ **/
+
+
+CREATE TABLE "kolab_folders" (
+ "folder_id" number NOT NULL PRIMARY KEY,
+ "resource" VARCHAR(255) NOT NULL,
+ "type" VARCHAR(32) NOT NULL,
+ "synclock" integer DEFAULT 0 NOT NULL,
+ "ctag" VARCHAR(40) DEFAULT NULL
+);
+
+CREATE INDEX "kolab_folders_resource_idx" ON "kolab_folders" ("resource", "type");
+
+CREATE SEQUENCE "kolab_folders_seq"
+ START WITH 1 INCREMENT BY 1 NOMAXVALUE;
+
+CREATE TRIGGER "kolab_folders_seq_trig"
+BEFORE INSERT ON "kolab_folders" FOR EACH ROW
+BEGIN
+ :NEW."folder_id" := "kolab_folders_seq".nextval;
+END;
+/
+
+CREATE TABLE "kolab_cache_contact" (
+ "folder_id" number NOT NULL
+ REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+ "msguid" number NOT NULL,
+ "uid" varchar(128) NOT NULL,
+ "created" timestamp DEFAULT NULL,
+ "changed" timestamp DEFAULT NULL,
+ "data" clob NOT NULL,
+ "xml" clob NOT NULL,
+ "tags" clob DEFAULT NULL,
+ "words" clob DEFAULT NULL,
+ "type" varchar(32) NOT NULL,
+ "name" varchar(255) DEFAULT NULL,
+ "firstname" varchar(255) DEFAULT NULL,
+ "surname" varchar(255) DEFAULT NULL,
+ "email" varchar(255) DEFAULT NULL,
+ PRIMARY KEY ("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_contact_type_idx" ON "kolab_cache_contact" ("folder_id", "type");
+CREATE INDEX "kolab_cache_contact_uid2msguid" ON "kolab_cache_contact" ("folder_id", "uid", "msguid");
+
+
+CREATE TABLE "kolab_cache_event" (
+ "folder_id" number NOT NULL
+ REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+ "msguid" number NOT NULL,
+ "uid" varchar(128) NOT NULL,
+ "created" timestamp DEFAULT NULL,
+ "changed" timestamp DEFAULT NULL,
+ "data" clob NOT NULL,
+ "xml" clob NOT NULL,
+ "tags" clob DEFAULT NULL,
+ "words" clob DEFAULT NULL,
+ "dtstart" timestamp DEFAULT NULL,
+ "dtend" timestamp DEFAULT NULL,
+ PRIMARY KEY ("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_event_uid2msguid" ON "kolab_cache_event" ("folder_id", "uid", "msguid");
+
+
+CREATE TABLE "kolab_cache_task" (
+ "folder_id" number NOT NULL
+ REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+ "msguid" number NOT NULL,
+ "uid" varchar(128) NOT NULL,
+ "created" timestamp DEFAULT NULL,
+ "changed" timestamp DEFAULT NULL,
+ "data" clob NOT NULL,
+ "xml" clob NOT NULL,
+ "tags" clob DEFAULT NULL,
+ "words" clob DEFAULT NULL,
+ "dtstart" timestamp DEFAULT NULL,
+ "dtend" timestamp DEFAULT NULL,
+ PRIMARY KEY ("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_task_uid2msguid" ON "kolab_cache_task" ("folder_id", "uid", "msguid");
+
+
+CREATE TABLE "kolab_cache_journal" (
+ "folder_id" number NOT NULL
+ REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+ "msguid" number NOT NULL,
+ "uid" varchar(128) NOT NULL,
+ "created" timestamp DEFAULT NULL,
+ "changed" timestamp DEFAULT NULL,
+ "data" clob NOT NULL,
+ "xml" clob NOT NULL,
+ "tags" clob DEFAULT NULL,
+ "words" clob DEFAULT NULL,
+ "dtstart" timestamp DEFAULT NULL,
+ "dtend" timestamp DEFAULT NULL,
+ PRIMARY KEY ("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_journal_uid2msguid" ON "kolab_cache_journal" ("folder_id", "uid", "msguid");
+
+
+CREATE TABLE "kolab_cache_note" (
+ "folder_id" number NOT NULL
+ REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+ "msguid" number NOT NULL,
+ "uid" varchar(128) NOT NULL,
+ "created" timestamp DEFAULT NULL,
+ "changed" timestamp DEFAULT NULL,
+ "data" clob NOT NULL,
+ "xml" clob NOT NULL,
+ "tags" clob DEFAULT NULL,
+ "words" clob DEFAULT NULL,
+ PRIMARY KEY ("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_note_uid2msguid" ON "kolab_cache_note" ("folder_id", "uid", "msguid");
+
+
+CREATE TABLE "kolab_cache_file" (
+ "folder_id" number NOT NULL
+ REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+ "msguid" number NOT NULL,
+ "uid" varchar(128) NOT NULL,
+ "created" timestamp DEFAULT NULL,
+ "changed" timestamp DEFAULT NULL,
+ "data" clob NOT NULL,
+ "xml" clob NOT NULL,
+ "tags" clob DEFAULT NULL,
+ "words" clob DEFAULT NULL,
+ "filename" varchar(255) DEFAULT NULL,
+ PRIMARY KEY ("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_file_filename" ON "kolab_cache_file" ("folder_id", "filename");
+CREATE INDEX "kolab_cache_file_uid2msguid" ON "kolab_cache_file" ("folder_id", "uid", "msguid");
+
+
+CREATE TABLE "kolab_cache_configuration" (
+ "folder_id" number NOT NULL
+ REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+ "msguid" number NOT NULL,
+ "uid" varchar(128) NOT NULL,
+ "created" timestamp DEFAULT NULL,
+ "changed" timestamp DEFAULT NULL,
+ "data" clob NOT NULL,
+ "xml" clob NOT NULL,
+ "tags" clob DEFAULT NULL,
+ "words" clob DEFAULT NULL,
+ "type" varchar(32) NOT NULL,
+ PRIMARY KEY ("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_config_type" ON "kolab_cache_configuration" ("folder_id", "type");
+CREATE INDEX "kolab_cache_config_uid2msguid" ON "kolab_cache_configuration" ("folder_id", "uid", "msguid");
+
+
+CREATE TABLE "kolab_cache_freebusy" (
+ "folder_id" number NOT NULL
+ REFERENCES "kolab_folders" ("folder_id") ON DELETE CASCADE,
+ "msguid" number NOT NULL,
+ "uid" varchar(128) NOT NULL,
+ "created" timestamp DEFAULT NULL,
+ "changed" timestamp DEFAULT NULL,
+ "data" clob NOT NULL,
+ "xml" clob NOT NULL,
+ "tags" clob DEFAULT NULL,
+ "words" clob DEFAULT NULL,
+ "dtstart" timestamp DEFAULT NULL,
+ "dtend" timestamp DEFAULT NULL,
+ PRIMARY KEY("folder_id", "msguid")
+);
+
+CREATE INDEX "kolab_cache_fb_uid2msguid" ON "kolab_cache_freebusy" ("folder_id", "uid", "msguid");
+
+
+INSERT INTO "system" ("name", "value") VALUES ('libkolab-version', '2015011600');
diff --git a/lib/plugins/libkolab/SQL/oracle/2015011600.sql b/lib/plugins/libkolab/SQL/oracle/2015011600.sql
new file mode 100644
index 0000000..69f7953
--- /dev/null
+++ b/lib/plugins/libkolab/SQL/oracle/2015011600.sql
@@ -0,0 +1,40 @@
+-- direct change from varchar to clob does not work, need temp column (#4257)
+ALTER TABLE "kolab_cache_contact" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_contact" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_contact" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_contact" RENAME COLUMN "tags1" TO "tags";
+
+ALTER TABLE "kolab_cache_event" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_event" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_event" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_event" RENAME COLUMN "tags1" TO "tags";
+
+ALTER TABLE "kolab_cache_task" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_task" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_task" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_task" RENAME COLUMN "tags1" TO "tags";
+
+ALTER TABLE "kolab_cache_journal" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_journal" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_journal" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_journal" RENAME COLUMN "tags1" TO "tags";
+
+ALTER TABLE "kolab_cache_note" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_note" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_note" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_note" RENAME COLUMN "tags1" TO "tags";
+
+ALTER TABLE "kolab_cache_file" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_file" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_file" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_file" RENAME COLUMN "tags1" TO "tags";
+
+ALTER TABLE "kolab_cache_configuration" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_configuration" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_configuration" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_configuration" RENAME COLUMN "tags1" TO "tags";
+
+ALTER TABLE "kolab_cache_freebusy" ADD "tags1" clob DEFAULT NULL;
+UPDATE "kolab_cache_freebusy" SET "tags1" = "tags";
+ALTER TABLE "kolab_cache_freebusy" DROP COLUMN "tags";
+ALTER TABLE "kolab_cache_freebusy" RENAME COLUMN "tags1" TO "tags";
diff --git a/lib/plugins/libkolab/bin/readcache.sh b/lib/plugins/libkolab/bin/readcache.sh
new file mode 100755
index 0000000..7e6a3a3
--- /dev/null
+++ b/lib/plugins/libkolab/bin/readcache.sh
@@ -0,0 +1,150 @@
+#!/usr/bin/env php
+<?php
+
+/**
+ * Kolab storage cache testing script
+ *
+ * @author Thomas Bruederli <bruederli@kolabsys.com>
+ *
+ * Copyright (C) 2014, Kolab Systems AG <contact@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/>.
+ */
+
+define('INSTALL_PATH', realpath('.') . '/' );
+ini_set('display_errors', 1);
+libxml_use_internal_errors(true);
+
+if (!file_exists(INSTALL_PATH . 'program/include/clisetup.php'))
+ die("Execute this from the Roundcube installation dir!\n\n");
+
+require_once INSTALL_PATH . 'program/include/clisetup.php';
+
+function print_usage()
+{
+ print "Usage: readcache.sh [OPTIONS] FOLDER\n";
+ print "-h, --host IMAP host name\n";
+ print "-l, --limit Limit the number of records to be listed\n";
+}
+
+// read arguments
+$opts = get_opt(array(
+ 'h' => 'host',
+ 'l' => 'limit',
+ 'v' => 'verbose',
+));
+
+$folder = $opts[0];
+$imap_host = $opts['host'];
+
+$rcmail = rcube::get_instance(rcube::INIT_WITH_DB | rcube::INIT_WITH_PLUGINS);
+
+if (empty($imap_host)) {
+ $default_host = $rcmail->config->get('default_host');
+ if (is_array($default_host)) {
+ list($k,$v) = each($default_host);
+ $imap_host = is_numeric($k) ? $v : $k;
+ }
+ else {
+ $imap_host = $default_host;
+ }
+
+ // strip protocol prefix
+ $imap_host = preg_replace('!^[a-z]+://!', '', $imap_host);
+}
+
+if (empty($folder) || empty($imap_host)) {
+ print_usage();
+ exit;
+}
+
+// connect to database
+$db = $rcmail->get_dbh();
+$db->db_connect('r');
+if (!$db->is_connected() || $db->is_error())
+ die("No DB connection\n");
+
+
+// resolve folder_id
+if (!is_numeric($folder)) {
+ if (strpos($folder, '@')) {
+ list($mailbox, $domain) = explode('@', $folder);
+ list($username, $subpath) = explode('/', preg_replace('!^user/!', '', $mailbox), 2);
+ $folder_uri = 'imap://' . urlencode($username.'@'.$domain) . '@' . $imap_host . '/' . $subpath;
+ }
+ else {
+ die("Invalid mailbox identifier! Example: user/john.doe/Calendar@example.org\n");
+ }
+
+ print "Resolving folder $folder_uri...";
+ $sql_result = $db->query('SELECT * FROM `kolab_folders` WHERE `resource`=?', $folder_uri);
+ if ($sql_result && ($folder_data = $db->fetch_assoc($sql_result))) {
+ $folder_id = $folder_data['folder_id'];
+ print $folder_id;
+ }
+ print "\n";
+}
+else {
+ $folder_id = intval($folder);
+ $sql_result = $db->query('SELECT * FROM `kolab_folders` WHERE `folder_id`=?', $folder_id);
+ if ($sql_result) {
+ $folder_data = $db->fetch_assoc($sql_result);
+ }
+}
+
+if (empty($folder_data)) {
+ die("Can't find cache mailbox for '$folder'\n");
+}
+
+print "Querying cache for folder $folder_id ($folder_data[type])...\n";
+
+$extra_cols = array(
+ 'event' => array('dtstart','dtend'),
+ 'contact' => array('type'),
+);
+
+$cache_table = $db->table_name('kolab_cache_' . $folder_data['type']);
+$extra_cols_ = $extra_cols[$folder_data['type']] ?: array();
+$sql_arr = $db->fetch_assoc($db->query("SELECT COUNT(*) as cnt FROM `$cache_table` WHERE `folder_id`=?", intval($folder_id)));
+
+print "CTag = " . $folder_data['ctag'] . "\n";
+print "Lock = " . $folder_data['synclock'] . "\n";
+print "Count = " . $sql_arr['cnt'] . "\n";
+print "----------------------------------------------------------------------------------\n";
+print "<MSG>\t<UUID>\t<CHANGED>\t<DATA>\t<XML>\t";
+print join("\t", array_map(function($c) { return '<' . strtoupper($c) . '>'; }, $extra_cols_));
+print "\n----------------------------------------------------------------------------------\n";
+
+$result = $db->limitquery("SELECT * FROM `$cache_table` WHERE `folder_id`=?", 0, $opts['limit'], intval($folder_id));
+while ($result && ($sql_arr = $db->fetch_assoc($result))) {
+ print $sql_arr['msguid'] . "\t" . $sql_arr['uid'] . "\t" . $sql_arr['changed'];
+
+ // try to unserialize data block
+ $object = @unserialize(@base64_decode($sql_arr['data']));
+ print "\t" . ($object === false ? 'FAIL!' : ($object['uid'] == $sql_arr['uid'] ? 'OK' : '!!!'));
+
+ // check XML validity
+ $xml = simplexml_load_string($sql_arr['xml']);
+ print "\t" . ($xml === false ? 'FAIL!' : 'OK');
+
+ // print extra cols
+ array_walk($extra_cols_, function($c) use ($sql_arr) {
+ print "\t" . $sql_arr[$c];
+ });
+
+ print "\n";
+}
+
+print "----------------------------------------------------------------------------------\n";
+echo "Done.\n";
diff --git a/lib/plugins/libkolab/composer.json b/lib/plugins/libkolab/composer.json
index 8926037..b458df6 100644
--- a/lib/plugins/libkolab/composer.json
+++ b/lib/plugins/libkolab/composer.json
@@ -4,7 +4,7 @@
"description": "Plugin to setup a basic environment for the interaction with a Kolab server.",
"homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/",
"license": "AGPLv3",
- "version": "1.1.0",
+ "version": "3.2.3",
"authors": [
{
"name": "Thomas Bruederli",
diff --git a/lib/plugins/libkolab/config.inc.php.dist b/lib/plugins/libkolab/config.inc.php.dist
index b043bb7..7efa8d1 100644
--- a/lib/plugins/libkolab/config.inc.php.dist
+++ b/lib/plugins/libkolab/config.inc.php.dist
@@ -3,56 +3,57 @@
/* Configuration for libkolab */
// Enable caching of Kolab objects in local database
-$rcmail_config['kolab_cache'] = true;
+$config['kolab_cache'] = true;
// Specify format version to write Kolab objects (must be a string value!)
-$rcmail_config['kolab_format_version'] = '3.0';
+$config['kolab_format_version'] = '3.0';
// Optional override of the URL to read and trigger Free/Busy information of Kolab users
// Defaults to https://<imap-server->/freebusy
-$rcmail_config['kolab_freebusy_server'] = 'https://<some-host>/<freebusy-path>';
+$config['kolab_freebusy_server'] = null;
// Enables listing of only subscribed folders. This e.g. will limit
// folders in calendar view or available addressbooks
-$rcmail_config['kolab_use_subscriptions'] = false;
+$config['kolab_use_subscriptions'] = false;
// List any of 'personal','shared','other' namespaces to be excluded from groupware folder listing
// example: array('other');
-$rcmail_config['kolab_skip_namespace'] = null;
+$config['kolab_skip_namespace'] = null;
// Enables the use of displayname folder annotations as introduced in KEP:?
// for displaying resource folder names (experimental!)
-$rcmail_config['kolab_custom_display_names'] = false;
+$config['kolab_custom_display_names'] = false;
// Configuration of HTTP requests.
// See http://pear.php.net/manual/en/package.http.http-request2.config.php
// for list of supported configuration options (array keys)
-$rcmail_config['kolab_http_request'] = array();
+$config['kolab_http_request'] = array();
// When kolab_cache is enabled Roundcube's messages cache will be redundant
// when working on kolab folders. Here we can:
// 2 - bypass messages/indexes cache completely
// 1 - bypass only messages, but use index cache
-$rcmail_config['kolab_messages_cache_bypass'] = 0;
+$config['kolab_messages_cache_bypass'] = 0;
// LDAP directory to find avilable users for folder sharing.
// Either contains an array with LDAP addressbook configuration or refers to entry in $config['ldap_public'].
// If not specified, the configuraton from 'kolab_auth_addressbook' will be used.
-$rcmail_config['kolab_users_directory'] = null;
+// Should be provided for multi-domain setups with placeholders like %dc, %d, %u, %fu or %dn.
+$config['kolab_users_directory'] = null;
// Filter to be used for resolving user folders in LDAP.
// Defaults to the 'kolab_auth_filter' configuration option.
-$rcmail_config['kolab_users_filter'] = '(&(objectclass=kolabInetOrgPerson)(|(uid=%u)(mail=%fu)))';
+$config['kolab_users_filter'] = '(&(objectclass=kolabInetOrgPerson)(|(uid=%u)(mail=%fu)))';
// Which property of the LDAP user record to use for user folder mapping in IMAP.
// Defaults to the 'kolab_auth_login' configuration option.
-$rcmail_config['kolab_users_id_attrib'] = null;
+$config['kolab_users_id_attrib'] = null;
// Use these attributes when searching users in LDAP
-$rcmail_config['kolab_users_search_attrib'] = array('cn','mail','alias');
+$config['kolab_users_search_attrib'] = array('cn','mail','alias');
// JSON-RPC endpoint configuration of the Bonnie web service providing historic data for groupware objects
-$rcmail_config['kolab_bonnie_api'] = array(
+$config['kolab_bonnie_api'] = array(
'uri' => 'https://<kolab-hostname>:8080/api/rpc',
'user' => 'webclient',
'pass' => 'Welcome2KolabSystems',
diff --git a/lib/plugins/libkolab/js/folderlist.js b/lib/plugins/libkolab/js/folderlist.js
index 1c8ce2f..62a60ef 100644
--- a/lib/plugins/libkolab/js/folderlist.js
+++ b/lib/plugins/libkolab/js/folderlist.js
@@ -68,7 +68,7 @@ function kolab_folderlist(node, p)
id = li.attr('id').replace(new RegExp('^'+p.id_prefix), '');
if (p.id_decode)
id = p.id_decode(id);
- node = search_results_widget.get_node(id),
+ node = search_results_widget.get_node(id);
has_children = node.children && node.children.length;
e.stopPropagation();
@@ -81,6 +81,11 @@ function kolab_folderlist(node, p)
li.children().first()
.toggleClass('subscribed')
.find('input[type=checkbox]').get(0).checked = true;
+
+ if (has_children && search_results[id].group == 'other user') {
+ li.find('ul li > div').addClass('subscribed')
+ .find('a.subscribed').attr('aria-checked', 'true');;
+ }
}
else if (!this.checked) {
return;
@@ -97,6 +102,11 @@ function kolab_folderlist(node, p)
li.remove();
}
+ // set partial subscription status
+ if (search_results[id].subscribed && search_results[id].parent && search_results[id].group == 'other') {
+ parent_subscription_status($(me.get_item(id, true)));
+ }
+
// set focus to cloned checkbox
if (rcube_event.is_keyboard(e)) {
$(me.get_item(id, true)).find('input[type=checkbox]').first().focus();
@@ -149,7 +159,8 @@ function kolab_folderlist(node, p)
prop = search_results[id],
parent_id = prop.parent || null,
has_children = node.children && node.children.length,
- dom_node = has_children ? li.children().first().clone(true, true) : li.children().first();
+ dom_node = has_children ? li.children().first().clone(true, true) : li.children().first(),
+ childs = [];
// find parent node and insert at the right place
if (parent_id && me.get_node(parent_id)) {
@@ -171,18 +182,58 @@ function kolab_folderlist(node, p)
.removeClass('virtual');
}
else {
+ // copy childs, too
+ if (has_children && prop.group == 'other user') {
+ for (var cid, j=0; j < node.children.length; j++) {
+ if ((cid = node.children[j].id) && search_results[cid]) {
+ childs.push(search_results_widget.get_node(cid));
+ }
+ }
+ }
+
// move this result item to the main list widget
me.insert({
id: id,
classes: [ prop.group || '' ],
virtual: prop.virtual,
html: dom_node,
+ level: node.level,
+ collapsed: true,
+ children: childs
}, parent_id, prop.group);
}
delete prop.html;
prop.active = active;
me.triggerEvent('insert-item', { id: id, data: prop, item: li });
+
+ // register childs, too
+ if (childs.length) {
+ for (var cid, j=0; j < node.children.length; j++) {
+ if ((cid = node.children[j].id) && search_results[cid]) {
+ prop = search_results[cid];
+ delete prop.html;
+ prop.active = false;
+ me.triggerEvent('insert-item', { id: cid, data: prop });
+ }
+ }
+ }
+ }
+
+ // update the given item's parent's (partial) subscription state
+ function parent_subscription_status(li)
+ {
+ var top_li = li.closest(me.container.children('li')),
+ all_childs = $('li > div:not(.treetoggle)', top_li),
+ subscribed = all_childs.filter('.subscribed').length;
+
+ if (subscribed == 0) {
+ top_li.children('div:first').removeClass('subscribed partial');
+ }
+ else {
+ top_li.children('div:first')
+ .addClass('subscribed')[subscribed < all_childs.length ? 'addClass' : 'removeClass']('partial');
+ }
}
// do some magic when search is performed on the widget
@@ -239,25 +290,60 @@ function kolab_folderlist(node, p)
}
});
- this.container.on('click', 'a.subscribed, span.subscribed', function(e){
+ this.container.on('click', 'a.subscribed, span.subscribed', function(e) {
var li = $(this).closest('li'),
id = li.attr('id').replace(new RegExp('^'+p.id_prefix), ''),
- div = li.children().first();
+ div = li.children().first(),
+ is_subscribed;
- if (me.is_search())
- id = id.replace(/--xsR$/, '');
+ if (me.is_search()) {
+ id = id.replace(/--xsR$/, '');
+ li = $(me.get_item(id, true));
+ div = $(div).add(li.children().first());
+ }
if (p.id_decode)
id = p.id_decode(id);
div.toggleClass('subscribed');
- $(this).attr('aria-checked', div.hasClass('subscribed') ? 'true' : 'false');
- me.triggerEvent('subscribe', { id: id, subscribed: div.hasClass('subscribed'), item: li });
+ is_subscribed = div.hasClass('subscribed');
+ $(this).attr('aria-checked', is_subscribed ? 'true' : 'false');
+ me.triggerEvent('subscribe', { id: id, subscribed: is_subscribed, item: li });
+
+ // update subscribe state of all 'virtual user' child folders
+ if (li.hasClass('other user')) {
+ $('ul li > div', li).each(function() {
+ $(this)[is_subscribed ? 'addClass' : 'removeClass']('subscribed');
+ $('.subscribed', div).attr('aria-checked', is_subscribed ? 'true' : 'false');
+ });
+ div.removeClass('partial');
+ }
+ // propagate subscription state to parent 'virtual user' folder
+ else if (li.closest('li.other.user').length) {
+ parent_subscription_status(li);
+ }
e.stopPropagation();
return false;
- })
+ });
+
+ this.container.on('click', 'a.remove', function(e) {
+ var li = $(this).closest('li'),
+ id = li.attr('id').replace(new RegExp('^'+p.id_prefix), '');
+
+ if (me.is_search()) {
+ id = id.replace(/--xsR$/, '');
+ li = $(me.get_item(id, true));
+ }
+ if (p.id_decode)
+ id = p.id_decode(id);
+
+ me.triggerEvent('remove', { id: id, item: li });
+
+ e.stopPropagation();
+ return false;
+ });
}
// link prototype from base class
diff --git a/lib/plugins/libkolab/lib/kolab_bonnie_api.php b/lib/plugins/libkolab/lib/kolab_bonnie_api.php
index 23dafd8..e8ac131 100644
--- a/lib/plugins/libkolab/lib/kolab_bonnie_api.php
+++ b/lib/plugins/libkolab/lib/kolab_bonnie_api.php
@@ -36,7 +36,7 @@ class kolab_bonnie_api
*/
public function __construct($config)
{
- $this->config = $confg;
+ $this->config = $config;
$this->client = new kolab_bonnie_api_client($config['uri'], $config['timeout'] ?: 5, (bool)$config['debug']);
diff --git a/lib/plugins/libkolab/lib/kolab_format.php b/lib/plugins/libkolab/lib/kolab_format.php
index ae7705c..625483b 100644
--- a/lib/plugins/libkolab/lib/kolab_format.php
+++ b/lib/plugins/libkolab/lib/kolab_format.php
@@ -47,6 +47,117 @@ abstract class kolab_format
const KTYPE_PREFIX = 'application/x-vnd.kolab.';
const PRODUCT_ID = 'Roundcube-libkolab-1.1';
+ // mapping table for valid PHP timezones not supported by libkolabxml
+ // basically the entire list of ftp://ftp.iana.org/tz/data/backward
+ protected static $timezone_map = array(
+ 'Africa/Asmera' => 'Africa/Asmara',
+ 'Africa/Timbuktu' => 'Africa/Abidjan',
+ 'America/Argentina/ComodRivadavia' => 'America/Argentina/Catamarca',
+ 'America/Atka' => 'America/Adak',
+ 'America/Buenos_Aires' => 'America/Argentina/Buenos_Aires',
+ 'America/Catamarca' => 'America/Argentina/Catamarca',
+ 'America/Coral_Harbour' => 'America/Atikokan',
+ 'America/Cordoba' => 'America/Argentina/Cordoba',
+ 'America/Ensenada' => 'America/Tijuana',
+ 'America/Fort_Wayne' => 'America/Indiana/Indianapolis',
+ 'America/Indianapolis' => 'America/Indiana/Indianapolis',
+ 'America/Jujuy' => 'America/Argentina/Jujuy',
+ 'America/Knox_IN' => 'America/Indiana/Knox',
+ 'America/Louisville' => 'America/Kentucky/Louisville',
+ 'America/Mendoza' => 'America/Argentina/Mendoza',
+ 'America/Porto_Acre' => 'America/Rio_Branco',
+ 'America/Rosario' => 'America/Argentina/Cordoba',
+ 'America/Virgin' => 'America/Port_of_Spain',
+ 'Asia/Ashkhabad' => 'Asia/Ashgabat',
+ 'Asia/Calcutta' => 'Asia/Kolkata',
+ 'Asia/Chungking' => 'Asia/Shanghai',
+ 'Asia/Dacca' => 'Asia/Dhaka',
+ 'Asia/Katmandu' => 'Asia/Kathmandu',
+ 'Asia/Macao' => 'Asia/Macau',
+ 'Asia/Saigon' => 'Asia/Ho_Chi_Minh',
+ 'Asia/Tel_Aviv' => 'Asia/Jerusalem',
+ 'Asia/Thimbu' => 'Asia/Thimphu',
+ 'Asia/Ujung_Pandang' => 'Asia/Makassar',
+ 'Asia/Ulan_Bator' => 'Asia/Ulaanbaatar',
+ 'Atlantic/Faeroe' => 'Atlantic/Faroe',
+ 'Atlantic/Jan_Mayen' => 'Europe/Oslo',
+ 'Australia/ACT' => 'Australia/Sydney',
+ 'Australia/Canberra' => 'Australia/Sydney',
+ 'Australia/LHI' => 'Australia/Lord_Howe',
+ 'Australia/NSW' => 'Australia/Sydney',
+ 'Australia/North' => 'Australia/Darwin',
+ 'Australia/Queensland' => 'Australia/Brisbane',
+ 'Australia/South' => 'Australia/Adelaide',
+ 'Australia/Tasmania' => 'Australia/Hobart',
+ 'Australia/Victoria' => 'Australia/Melbourne',
+ 'Australia/West' => 'Australia/Perth',
+ 'Australia/Yancowinna' => 'Australia/Broken_Hill',
+ 'Brazil/Acre' => 'America/Rio_Branco',
+ 'Brazil/DeNoronha' => 'America/Noronha',
+ 'Brazil/East' => 'America/Sao_Paulo',
+ 'Brazil/West' => 'America/Manaus',
+ 'Canada/Atlantic' => 'America/Halifax',
+ 'Canada/Central' => 'America/Winnipeg',
+ 'Canada/East-Saskatchewan' => 'America/Regina',
+ 'Canada/Eastern' => 'America/Toronto',
+ 'Canada/Mountain' => 'America/Edmonton',
+ 'Canada/Newfoundland' => 'America/St_Johns',
+ 'Canada/Pacific' => 'America/Vancouver',
+ 'Canada/Saskatchewan' => 'America/Regina',
+ 'Canada/Yukon' => 'America/Whitehorse',
+ 'Chile/Continental' => 'America/Santiago',
+ 'Chile/EasterIsland' => 'Pacific/Easter',
+ 'Cuba' => 'America/Havana',
+ 'Egypt' => 'Africa/Cairo',
+ 'Eire' => 'Europe/Dublin',
+ 'Europe/Belfast' => 'Europe/London',
+ 'Europe/Tiraspol' => 'Europe/Chisinau',
+ 'GB' => 'Europe/London',
+ 'GB-Eire' => 'Europe/London',
+ 'Greenwich' => 'Etc/GMT',
+ 'Hongkong' => 'Asia/Hong_Kong',
+ 'Iceland' => 'Atlantic/Reykjavik',
+ 'Iran' => 'Asia/Tehran',
+ 'Israel' => 'Asia/Jerusalem',
+ 'Jamaica' => 'America/Jamaica',
+ 'Japan' => 'Asia/Tokyo',
+ 'Kwajalein' => 'Pacific/Kwajalein',
+ 'Libya' => 'Africa/Tripoli',
+ 'Mexico/BajaNorte' => 'America/Tijuana',
+ 'Mexico/BajaSur' => 'America/Mazatlan',
+ 'Mexico/General' => 'America/Mexico_City',
+ 'NZ' => 'Pacific/Auckland',
+ 'NZ-CHAT' => 'Pacific/Chatham',
+ 'Navajo' => 'America/Denver',
+ 'PRC' => 'Asia/Shanghai',
+ 'Pacific/Ponape' => 'Pacific/Pohnpei',
+ 'Pacific/Samoa' => 'Pacific/Pago_Pago',
+ 'Pacific/Truk' => 'Pacific/Chuuk',
+ 'Pacific/Yap' => 'Pacific/Chuuk',
+ 'Poland' => 'Europe/Warsaw',
+ 'Portugal' => 'Europe/Lisbon',
+ 'ROC' => 'Asia/Taipei',
+ 'ROK' => 'Asia/Seoul',
+ 'Singapore' => 'Asia/Singapore',
+ 'Turkey' => 'Europe/Istanbul',
+ 'UCT' => 'Etc/UCT',
+ 'US/Alaska' => 'America/Anchorage',
+ 'US/Aleutian' => 'America/Adak',
+ 'US/Arizona' => 'America/Phoenix',
+ 'US/Central' => 'America/Chicago',
+ 'US/East-Indiana' => 'America/Indiana/Indianapolis',
+ 'US/Eastern' => 'America/New_York',
+ 'US/Hawaii' => 'Pacific/Honolulu',
+ 'US/Indiana-Starke' => 'America/Indiana/Knox',
+ 'US/Michigan' => 'America/Detroit',
+ 'US/Mountain' => 'America/Denver',
+ 'US/Pacific' => 'America/Los_Angeles',
+ 'US/Samoa' => 'Pacific/Pago_Pago',
+ 'Universal' => 'Etc/UTC',
+ 'W-SU' => 'Europe/Moscow',
+ 'Zulu' => 'Etc/UTC',
+ );
+
/**
* Factory method to instantiate a kolab_format object of the given type and version
*
@@ -63,7 +174,7 @@ abstract class kolab_format
if (!self::supports($version))
return PEAR::raiseError("No support for Kolab format version " . $version);
- $type = preg_replace('/configuration\.[a-z.]+$/', 'configuration', $type);
+ $type = preg_replace('/configuration\.[a-z._]+$/', 'configuration', $type);
$suffix = preg_replace('/[^a-z]+/', '', $type);
$classname = 'kolab_format_' . $suffix;
if (class_exists($classname))
@@ -112,7 +223,7 @@ abstract class kolab_format
if ($tz) $datetime->setTimezone($tz);
}
else if (is_string($datetime) && strlen($datetime)) {
- $datetime = new DateTime($datetime, $tz ?: null);
+ $datetime = $tz ? new DateTime($datetime, $tz) : new DateTime($datetime);
}
}
catch (Exception $e) {}
@@ -123,10 +234,15 @@ abstract class kolab_format
if (!$dateonly)
$result->setTime($datetime->format('G'), $datetime->format('i'), $datetime->format('s'));
- if ($tz && in_array($tz->getName(), array('UTC', 'GMT', '+00:00', 'Z')))
+ if ($tz && in_array($tz->getName(), array('UTC', 'GMT', '+00:00', 'Z'))) {
$result->setUTC(true);
- else if ($tz !== false)
- $result->setTimezone($tz->getName());
+ }
+ else if ($tz !== false) {
+ $tzid = $tz->getName();
+ if (array_key_exists($tzid, self::$timezone_map))
+ $tzid = self::$timezone_map[$tzid];
+ $result->setTimezone($tzid);
+ }
}
return $result;
diff --git a/lib/plugins/libkolab/lib/kolab_format_configuration.php b/lib/plugins/libkolab/lib/kolab_format_configuration.php
index 17b46a7..ceb7ebb 100644
--- a/lib/plugins/libkolab/lib/kolab_format_configuration.php
+++ b/lib/plugins/libkolab/lib/kolab_format_configuration.php
@@ -24,7 +24,7 @@
class kolab_format_configuration extends kolab_format
{
- public $CTYPE = 'application/x-vnd.kolab.configuration';
+ public $CTYPE = 'application/vnd.kolab+xml';
public $CTYPEv2 = 'application/x-vnd.kolab.configuration';
protected $objclass = 'Configuration';
@@ -32,12 +32,14 @@ class kolab_format_configuration extends kolab_format
protected $write_func = 'writeConfiguration';
private $type_map = array(
- 'category' => Configuration::TypeCategoryColor,
- 'dictionary' => Configuration::TypeDictionary,
- 'relation' => Configuration::TypeRelation,
- 'snippet' => Configuration::TypeSnippet,
+ 'category' => Configuration::TypeCategoryColor,
+ 'dictionary' => Configuration::TypeDictionary,
+ 'file_driver' => Configuration::TypeFileDriver,
+ 'relation' => Configuration::TypeRelation,
+ 'snippet' => Configuration::TypeSnippet,
);
+ private $driver_settings_fields = array('host', 'port', 'username', 'password');
/**
* Set properties to the kolabformat object
@@ -46,9 +48,6 @@ class kolab_format_configuration extends kolab_format
*/
public function set(&$object)
{
- // set common object properties
- parent::set($object);
-
// read type-specific properties
switch ($object['type']) {
case 'dictionary':
@@ -63,6 +62,21 @@ class kolab_format_configuration extends kolab_format
$this->obj = new Configuration($categories);
break;
+ case 'file_driver':
+ $driver = new FileDriver($object['driver'], $object['title']);
+
+ $driver->setEnabled((bool) $object['enabled']);
+
+ foreach ($this->driver_settings_fields as $field) {
+ $value = $object[$field];
+ if ($value !== null) {
+ $driver->{'set' . ucfirst($field)}($value);
+ }
+ }
+
+ $this->obj = new Configuration($driver);
+ break;
+
case 'relation':
$relation = new Relation(strval($object['name']), strval($object['category']));
@@ -109,7 +123,12 @@ class kolab_format_configuration extends kolab_format
}
// adjust content-type string
- $this->CTYPE = $this->CTYPEv2 = 'application/x-vnd.kolab.configuration.' . $object['type'];
+ $this->CTYPEv2 = 'application/x-vnd.kolab.configuration.' . $object['type'];
+
+ // reset old object data, otherwise set() will overwrite current data (#4095)
+ $this->xmldata = null;
+ // set common object properties
+ parent::set($object);
// cache this data
$this->data = $object;
@@ -157,6 +176,19 @@ class kolab_format_configuration extends kolab_format
// TODO: implement this
break;
+ case 'file_driver':
+ $driver = $this->obj->fileDriver();
+
+ $object['driver'] = $driver->driver();
+ $object['title'] = $driver->title();
+ $object['enabled'] = $driver->enabled();
+
+ foreach ($this->driver_settings_fields as $field) {
+ $object[$field] = $driver->{$field}();
+ }
+
+ break;
+
case 'relation':
$relation = $this->obj->relation();
@@ -192,7 +224,7 @@ class kolab_format_configuration extends kolab_format
// adjust content-type string
if ($object['type']) {
- $this->CTYPE = $this->CTYPEv2 = 'application/x-vnd.kolab.configuration.' . $object['type'];
+ $this->CTYPEv2 = 'application/x-vnd.kolab.configuration.' . $object['type'];
}
$this->data = $object;
@@ -241,6 +273,10 @@ class kolab_format_configuration extends kolab_format
else if (!empty($member['params']['message-id'])) {
$words[] = $member['params']['message-id'];
}
+ else {
+ // derive message identifier from URI
+ $words[] = md5($url);
+ }
}
return $words;
diff --git a/lib/plugins/libkolab/lib/kolab_format_event.php b/lib/plugins/libkolab/lib/kolab_format_event.php
index c233f44..8cad89a 100644
--- a/lib/plugins/libkolab/lib/kolab_format_event.php
+++ b/lib/plugins/libkolab/lib/kolab_format_event.php
@@ -96,11 +96,13 @@ class kolab_format_event extends kolab_format_xcal
// save recurrence exceptions
if (is_array($object['recurrence']) && $object['recurrence']['EXCEPTIONS']) {
$vexceptions = new vectorevent;
- foreach((array)$object['recurrence']['EXCEPTIONS'] as $exception) {
+ foreach((array)$object['recurrence']['EXCEPTIONS'] as $i => $exception) {
$exevent = new kolab_format_event;
- $exevent->set($this->compact_exception($exception, $object)); // only save differing values
+ $exevent->set(($compacted = $this->compact_exception($exception, $object))); // only save differing values
$exevent->obj->setRecurrenceID(self::get_datetime($exception['start'], null, true), (bool)$exception['thisandfuture']);
$vexceptions->push($exevent->obj);
+ // write cleaned-up exception data back to memory/cache
+ $object['recurrence']['EXCEPTIONS'][$i] = $this->expand_exception($compacted, $object);
}
$this->obj->setExceptions($vexceptions);
}
@@ -217,6 +219,12 @@ class kolab_format_event extends kolab_format_xcal
}
}
+ foreach ($master as $prop => $value) {
+ if (isset($exception[$prop]) && gettype($exception[$prop]) == gettype($value) && $exception[$prop] == $value) {
+ unset($exception[$prop]);
+ }
+ }
+
return $exception;
}
diff --git a/lib/plugins/libkolab/lib/kolab_format_xcal.php b/lib/plugins/libkolab/lib/kolab_format_xcal.php
index 421ee92..ad54505 100644
--- a/lib/plugins/libkolab/lib/kolab_format_xcal.php
+++ b/lib/plugins/libkolab/lib/kolab_format_xcal.php
@@ -237,7 +237,7 @@ abstract class kolab_format_xcal extends kolab_format
if ($type == 'EMAIL') {
$valarm['attendees'] = array();
- $attvec = $this->obj->attendees();
+ $attvec = $alarm->attendees();
for ($j=0; $j < $attvec->size(); $j++) {
$cr = $attvec->get($j);
$valarm['attendees'][] = $cr->email();
@@ -364,14 +364,17 @@ abstract class kolab_format_xcal extends kolab_format
$cr = new ContactReference(ContactReference::EmailReference, $attendee['email']);
$cr->setName($attendee['name']);
+ // set attendee RSVP if missing
+ if (!isset($attendee['rsvp'])) {
+ $object['attendees'][$i]['rsvp'] = $attendee['rsvp'] = true;
+ }
+
$att = new Attendee;
$att->setContact($cr);
$att->setPartStat($this->part_status_map[$attendee['status']]);
$att->setRole($this->role_map[$attendee['role']] ? $this->role_map[$attendee['role']] : kolabformat::Required);
$att->setCutype($this->cutype_map[$attendee['cutype']] ? $this->cutype_map[$attendee['cutype']] : kolabformat::CutypeIndividual);
- $att->setRSVP((bool)$attendee['rsvp'] || $reschedule);
-
- $object['attendees'][$i]['rsvp'] = $attendee['rsvp'] || $reschedule;
+ $att->setRSVP((bool)$attendee['rsvp']);
if (!empty($attendee['delegated-from'])) {
$vdelegators = new vectorcontactref;
diff --git a/lib/plugins/libkolab/lib/kolab_storage.php b/lib/plugins/libkolab/lib/kolab_storage.php
index 7287fc2..47c1e4b 100644
--- a/lib/plugins/libkolab/lib/kolab_storage.php
+++ b/lib/plugins/libkolab/lib/kolab_storage.php
@@ -35,6 +35,11 @@ class kolab_storage
const UID_KEY_PRIVATE = '/private/vendor/kolab/uniqueid';
const UID_KEY_CYRUS = '/shared/vendor/cmu/cyrus-imapd/uniqueid';
+ const ERROR_IMAP_CONN = 1;
+ const ERROR_CACHE_DB = 2;
+ const ERROR_NO_PERMISSION = 3;
+ const ERROR_INVALID_FOLDER = 4;
+
public static $version = '3.0';
public static $last_error;
public static $encode_ids = false;
@@ -139,7 +144,6 @@ class kolab_storage
return self::$ldap;
}
-
/**
* Get a list of storage folders for the given data type
*
@@ -154,7 +158,7 @@ class kolab_storage
if (self::setup()) {
foreach ((array)self::list_folders('', '*', $type, $subscribed, $folderdata) as $foldername) {
- $folders[$foldername] = new kolab_storage_folder($foldername, $folderdata[$foldername]);
+ $folders[$foldername] = new kolab_storage_folder($foldername, $type, $folderdata[$foldername]);
}
}
@@ -171,26 +175,26 @@ class kolab_storage
{
if (self::setup()) {
foreach ((array)self::list_folders('', '*', $type . '.default', false, $folderdata) as $foldername) {
- return new kolab_storage_folder($foldername, $folderdata[$foldername]);
+ return new kolab_storage_folder($foldername, $type, $folderdata[$foldername]);
}
}
return null;
}
-
/**
* Getter for a specific storage folder
*
- * @param string IMAP folder to access (UTF7-IMAP)
+ * @param string IMAP folder to access (UTF7-IMAP)
+ * @param string Expected folder type
+ *
* @return object kolab_storage_folder The folder object
*/
- public static function get_folder($folder)
+ public static function get_folder($folder, $type = null)
{
- return self::setup() ? new kolab_storage_folder($folder) : null;
+ return self::setup() ? new kolab_storage_folder($folder, $type) : null;
}
-
/**
* Getter for a single Kolab object, identified by its UID.
* This will search all folders storing objects of the given type.
@@ -203,11 +207,11 @@ class kolab_storage
{
self::setup();
$folder = null;
- foreach ((array)self::list_folders('', '*', $type) as $foldername) {
+ foreach ((array)self::list_folders('', '*', $type, null, $folderdata) as $foldername) {
if (!$folder)
- $folder = new kolab_storage_folder($foldername);
+ $folder = new kolab_storage_folder($foldername, $type, $folderdata[$foldername]);
else
- $folder->set_folder($foldername);
+ $folder->set_folder($foldername, $type, $folderdata[$foldername]);
if ($object = $folder->get_object($uid, '*'))
return $object;
@@ -230,11 +234,11 @@ class kolab_storage
$folder = null;
$result = array();
- foreach ((array)self::list_folders('', '*', $type) as $foldername) {
+ foreach ((array)self::list_folders('', '*', $type, null, $folderdata) as $foldername) {
if (!$folder)
- $folder = new kolab_storage_folder($foldername);
+ $folder = new kolab_storage_folder($foldername, $type, $folderdata[$foldername]);
else
- $folder->set_folder($foldername);
+ $folder->set_folder($foldername, $type, $folderdata[$foldername]);
foreach ($folder->select($query, '*') as $object) {
$result[] = $object;
@@ -245,13 +249,16 @@ class kolab_storage
}
/**
- *
+ * Returns Free-busy server URL
*/
public static function get_freebusy_server()
{
- return unslashify(self::$config->get('kolab_freebusy_server', 'https://' . $_SESSION['imap_host'] . '/freebusy'));
- }
+ $url = 'https://' . $_SESSION['imap_host'] . '/freebusy';
+ $url = self::$config->get('kolab_freebusy_server', $url);
+ $url = rcube_utils::resolve_url($url);
+ return unslashify($url);
+ }
/**
* Compose an URL to query the free/busy status for the given user
@@ -261,7 +268,6 @@ class kolab_storage
return self::get_freebusy_server() . '/' . $email . '.ifb';
}
-
/**
* Creates folder ID from folder name
*
@@ -276,7 +282,6 @@ class kolab_storage
asciiwords(strtr($folder, '/.-', '___'));
}
-
/**
* Encode the given ID to a safe ascii representation
*
@@ -300,7 +305,6 @@ class kolab_storage
return base64_decode(str_pad(strtr($id, '-_', '+/'), strlen($id) % 4, '=', STR_PAD_RIGHT));
}
-
/**
* Return the (first) path of the requested IMAP namespace
*
@@ -403,13 +407,13 @@ class kolab_storage
'oldname' => $oldname, 'newname' => $newname));
$oldfolder = self::get_folder($oldname);
- $active = self::folder_is_active($oldname);
- $success = self::$imap->rename_folder($oldname, $newname);
+ $active = self::folder_is_active($oldname);
+ $success = self::$imap->rename_folder($oldname, $newname);
self::$last_error = self::$imap->get_error_str();
// pass active state to new folder name
if ($success && $active) {
- self::set_state($oldnam, false);
+ self::set_state($oldname, false);
self::set_state($newname, true);
}
@@ -901,7 +905,7 @@ class kolab_storage
!self::folder_is_subscribed($foldername, true) &&
!in_array(self::$imap->folder_namespace($foldername), (array)$exclude_ns)
) {
- $folders[] = new kolab_storage_folder($foldername, $folderdata[$foldername]);
+ $folders[] = new kolab_storage_folder($foldername, $type, $folderdata[$foldername]);
}
}
@@ -974,7 +978,7 @@ class kolab_storage
$parent_parent = join($delim, $path);
if (!$refs[$parent]) {
if ($folder->type && self::folder_type($parent) == $folder->type) {
- $refs[$parent] = new kolab_storage_folder($parent, $folder->type);
+ $refs[$parent] = new kolab_storage_folder($parent, $folder->type, $folder->type);
$refs[$parent]->parent = $parent_parent;
}
else if ($parent_parent == $other_ns) {
@@ -1049,7 +1053,8 @@ class kolab_storage
foreach ((array)self::$imap->get_metadata('%', $type_keys) as $folder => $metadata) {
if (!in_array($folder, $blacklist)) {
$folderdata[$folder] = $metadata;
- if ($data = self::$imap->get_metadata($folder.$delimiter.'*', $type_keys)) {
+ $opts = self::$imap->folder_attributes($folder);
+ if (!in_array('\\HasNoChildren', $opts) && ($data = self::$imap->get_metadata($folder.$delimiter.'*', $type_keys))) {
$folderdata += $data;
}
}
@@ -1085,7 +1090,7 @@ class kolab_storage
return $types[self::CTYPE_KEY_PRIVATE];
}
else if (!empty($types[self::CTYPE_KEY])) {
- list($ctype, $suffix) = explode('.', $types[self::CTYPE_KEY]);
+ list($ctype, ) = explode('.', $types[self::CTYPE_KEY]);
return $ctype;
}
return null;
@@ -1104,8 +1109,10 @@ class kolab_storage
self::setup();
// return in-memory cached result
- if (is_array(self::$typedata['*']) && array_key_exists($folder, self::$typedata['*'])) {
- return self::$typedata['*'][$folder];
+ foreach (self::$typedata as $typedata) {
+ if (array_key_exists($folder, $typedata)) {
+ return $typedata[$folder];
+ }
}
$metadata = self::$imap->get_metadata($folder, array(self::CTYPE_KEY, self::CTYPE_KEY_PRIVATE));
@@ -1190,7 +1197,7 @@ class kolab_storage
}
}
else if (self::$imap->subscribe($folder)) {
- self::$subscriptions === null;
+ self::$subscriptions = null;
return true;
}
@@ -1218,7 +1225,7 @@ class kolab_storage
return true;
}
else if (self::$imap->unsubscribe($folder)) {
- self::$subscriptions === null;
+ self::$subscriptions = null;
return true;
}
@@ -1461,7 +1468,7 @@ class kolab_storage
$user_attrib = self::$config->get('kolab_users_id_attrib', self::$config->get('kolab_auth_login', 'mail'));
array_walk($results, function(&$user, $dn) use ($root, $user_attrib) {
- list($localpart, $domain) = explode('@', $user[$user_attrib]);
+ list($localpart, ) = explode('@', $user[$user_attrib]);
$user['kolabtargetfolder'] = $root . $localpart;
});
@@ -1534,6 +1541,16 @@ class kolab_storage
$folders[$foldername] = new kolab_storage_folder_user($foldername, $other_ns);
}
}
+
+ // for every (subscribed) user folder, list all (unsubscribed) subfolders
+ foreach ($folders as $userfolder) {
+ foreach ((array)self::list_folders($userfolder->name . $delimiter, '*', $type, false, $folderdata) as $foldername) {
+ if (!$folders[$foldername]) {
+ $folders[$foldername] = new kolab_storage_folder($foldername, $type, $folderdata[$foldername]);
+ $userfolder->children[] = $folders[$foldername];
+ }
+ }
+ }
}
return $folders;
@@ -1549,8 +1566,6 @@ class kolab_storage
{
$db = rcmail::get_instance()->get_dbh();
$prefix = 'imap://' . urlencode($args['username']) . '@' . $args['host'] . '/%';
- $db->query("DELETE FROM " . $db->table_name('kolab_folders') . " WHERE resource LIKE ?", $prefix);
+ $db->query("DELETE FROM " . $db->table_name('kolab_folders', true) . " WHERE `resource` LIKE ?", $prefix);
}
-
}
-
diff --git a/lib/plugins/libkolab/lib/kolab_storage_cache.php b/lib/plugins/libkolab/lib/kolab_storage_cache.php
index d56f04d..227fa4e 100644
--- a/lib/plugins/libkolab/lib/kolab_storage_cache.php
+++ b/lib/plugins/libkolab/lib/kolab_storage_cache.php
@@ -26,6 +26,8 @@ class kolab_storage_cache
{
const DB_DATE_FORMAT = 'Y-m-d H:i:s';
+ public $sync_complete = false;
+
protected $db;
protected $imap;
protected $folder;
@@ -46,6 +48,7 @@ class kolab_storage_cache
protected $extra_cols = array();
protected $order_by = null;
protected $limit = null;
+ protected $error = 0;
/**
@@ -78,6 +81,7 @@ class kolab_storage_cache
$this->db = $rcmail->get_dbh();
$this->imap = $rcmail->get_storage();
$this->enabled = $rcmail->config->get('kolab_cache', false);
+ $this->folders_table = $this->db->table_name('kolab_folders');
if ($this->enabled) {
// always read folder cache and lock state from DB master
@@ -96,8 +100,7 @@ class kolab_storage_cache
*/
public function select_by_id($folder_id)
{
- $folders_table = $this->db->table_name('kolab_folders');
- $sql_arr = $this->db->fetch_assoc($this->db->query("SELECT * FROM $folders_table WHERE folder_id=?", $folder_id));
+ $sql_arr = $this->db->fetch_assoc($this->db->query("SELECT * FROM `{$this->folders_table}` WHERE `folder_id` = ?", $folder_id));
if ($sql_arr) {
$this->metadata = $sql_arr;
$this->folder_id = $sql_arr['folder_id'];
@@ -118,14 +121,13 @@ class kolab_storage_cache
{
$this->folder = $storage_folder;
- if (empty($this->folder->name)) {
+ if (empty($this->folder->name) || !$this->folder->valid) {
$this->ready = false;
return;
}
// compose fully qualified ressource uri for this instance
$this->resource_uri = $this->folder->get_resource_uri();
- $this->folders_table = $this->db->table_name('kolab_folders');
$this->cache_table = $this->db->table_name('kolab_cache_' . $this->folder->type);
$this->ready = $this->enabled && !empty($this->folder->type);
$this->folder_id = null;
@@ -149,6 +151,16 @@ class kolab_storage_cache
}
/**
+ * Returns code of last error
+ *
+ * @return int Error code
+ */
+ public function get_error()
+ {
+ return $this->error;
+ }
+
+ /**
* Synchronize local cache data with remote
*/
public function synchronize()
@@ -158,7 +170,14 @@ class kolab_storage_cache
return;
// increase time limit
- @set_time_limit($this->max_sync_lock_time);
+ @set_time_limit($this->max_sync_lock_time - 60);
+
+ // get effective time limit we have for synchronization (~70% of the execution time)
+ $time_limit = ini_get('max_execution_time') * 0.7;
+ $sync_start = time();
+
+ // assume sync will be completed
+ $this->sync_complete = true;
if (!$this->ready) {
// kolab cache is disabled, synchronize IMAP mailbox cache only
@@ -188,20 +207,26 @@ class kolab_storage_cache
// read cache index
$sql_result = $this->db->query(
- "SELECT msguid, uid FROM $this->cache_table WHERE folder_id=?",
+ "SELECT `msguid`, `uid` FROM `{$this->cache_table}` WHERE `folder_id` = ?",
$this->folder_id
);
$old_index = array();
while ($sql_arr = $this->db->fetch_assoc($sql_result)) {
$old_index[] = $sql_arr['msguid'];
- $this->uid2msg[$sql_arr['uid']] = $sql_arr['msguid'];
}
// fetch new objects from imap
+ $i = 0;
foreach (array_diff($imap_index, $old_index) as $msguid) {
if ($object = $this->folder->read_object($msguid, '*')) {
$this->_extended_insert($msguid, $object);
+
+ // check time limit and abort sync if running too long
+ if (++$i % 50 == 0 && time() - $sync_start > $time_limit) {
+ $this->sync_complete = false;
+ break;
+ }
}
}
$this->_extended_insert(0, null);
@@ -211,13 +236,15 @@ class kolab_storage_cache
if (!empty($del_index)) {
$quoted_ids = join(',', array_map(array($this->db, 'quote'), $del_index));
$this->db->query(
- "DELETE FROM $this->cache_table WHERE folder_id=? AND msguid IN ($quoted_ids)",
+ "DELETE FROM `{$this->cache_table}` WHERE `folder_id` = ? AND `msguid` IN ($quoted_ids)",
$this->folder_id
);
}
// update ctag value (will be written to database in _sync_unlock())
- $this->metadata['ctag'] = $this->folder->get_ctag();
+ if ($this->sync_complete) {
+ $this->metadata['ctag'] = $this->folder->get_ctag();
+ }
}
$this->bypass(false);
@@ -227,6 +254,7 @@ class kolab_storage_cache
}
}
+ $this->check_error();
$this->synched = time();
}
@@ -243,7 +271,12 @@ class kolab_storage_cache
{
// delegate to another cache instance
if ($foldername && $foldername != $this->folder->name) {
- return kolab_storage::get_folder($foldername)->cache->get($msguid, $type);
+ $success = false;
+ if ($targetfolder = kolab_storage::get_folder($foldername)) {
+ $success = $targetfolder->cache->get($msguid, $type);
+ $this->error = $targetfolder->cache->get_error();
+ }
+ return $success;
}
// load object if not in memory
@@ -252,8 +285,8 @@ class kolab_storage_cache
$this->_read_folder_data();
$sql_result = $this->db->query(
- "SELECT * FROM $this->cache_table ".
- "WHERE folder_id=? AND msguid=?",
+ "SELECT * FROM `{$this->cache_table}` ".
+ "WHERE `folder_id` = ? AND `msguid` = ?",
$this->folder_id,
$msguid
);
@@ -265,11 +298,14 @@ class kolab_storage_cache
// fetch from IMAP if not present in cache
if (empty($this->objects[$msguid])) {
- $result = $this->_fetch(array($msguid), $type, $foldername);
- $this->objects = array($msguid => $result[0]); // store only this object in memory (#2827)
+ if ($object = $this->folder->read_object($msguid, $type ?: '*', $foldername)) {
+ $this->objects = array($msguid => $object);
+ $this->set($msguid, $object);
+ }
}
}
+ $this->check_error();
return $this->objects[$msguid];
}
@@ -289,14 +325,17 @@ class kolab_storage_cache
// delegate to another cache instance
if ($foldername && $foldername != $this->folder->name) {
- kolab_storage::get_folder($foldername)->cache->set($msguid, $object);
- return;
+ if ($targetfolder = kolab_storage::get_folder($foldername)) {
+ $targetfolder->cache->set($msguid, $object);
+ $this->error = $targetfolder->cache->get_error();
+ }
+ return;
}
// remove old entry
if ($this->ready) {
$this->_read_folder_data();
- $this->db->query("DELETE FROM $this->cache_table WHERE folder_id=? AND msguid=?",
+ $this->db->query("DELETE FROM `{$this->cache_table}` WHERE `folder_id` = ? AND `msguid` = ?",
$this->folder_id, $msguid);
}
@@ -308,6 +347,8 @@ class kolab_storage_cache
// ...or set in-memory cache to false
$this->objects[$msguid] = $object;
}
+
+ $this->check_error();
}
@@ -343,13 +384,13 @@ class kolab_storage_cache
$cols[$idx] = "$col = ?";
}
- $query = "UPDATE $this->cache_table SET " . implode(', ', $cols)
- . " WHERE folder_id = ? AND msguid = ?";
+ $query = "UPDATE `{$this->cache_table}` SET " . implode(', ', $cols)
+ . " WHERE `folder_id` = ? AND `msguid` = ?";
$args[] = $this->folder_id;
$args[] = $olduid;
}
else {
- $query = "INSERT INTO $this->cache_table (created, " . implode(', ', $cols)
+ $query = "INSERT INTO `{$this->cache_table}` (`created`, " . implode(', ', $cols)
. ") VALUES (" . $this->db->now() . str_repeat(', ?', count($cols)) . ")";
}
@@ -366,6 +407,8 @@ class kolab_storage_cache
// keep a copy in memory for fast access
$this->objects = array($msguid => $object);
$this->uid2msg = array($object['uid'] => $msguid);
+
+ $this->check_error();
}
@@ -374,20 +417,21 @@ class kolab_storage_cache
*
* @param string Entry's IMAP message UID
* @param string Entry's Object UID
- * @param string Target IMAP folder to move it to
+ * @param object kolab_storage_folder Target storage folder instance
*/
- public function move($msguid, $uid, $target_folder)
+ public function move($msguid, $uid, $target)
{
if ($this->ready) {
- $target = kolab_storage::get_folder($target_folder);
+ // clear cached uid mapping and force new lookup
+ unset($target->cache->uid2msg[$uid]);
// resolve new message UID in target folder
if ($new_msguid = $target->cache->uid2msguid($uid)) {
$this->_read_folder_data();
$this->db->query(
- "UPDATE $this->cache_table SET folder_id=?, msguid=? ".
- "WHERE folder_id=? AND msguid=?",
+ "UPDATE `{$this->cache_table}` SET `folder_id` = ?, `msguid` = ? ".
+ "WHERE `folder_id` = ? AND `msguid` = ?",
$target->cache->get_folder_id(),
$new_msguid,
$this->folder_id,
@@ -404,13 +448,14 @@ class kolab_storage_cache
}
unset($this->uid2msg[$uid]);
+ $this->check_error();
}
/**
* Remove all objects from local cache
*/
- public function purge($type = null)
+ public function purge()
{
if (!$this->ready) {
return true;
@@ -419,7 +464,7 @@ class kolab_storage_cache
$this->_read_folder_data();
$result = $this->db->query(
- "DELETE FROM $this->cache_table WHERE folder_id=?",
+ "DELETE FROM `{$this->cache_table}` WHERE `folder_id` = ?",
$this->folder_id
);
@@ -437,15 +482,20 @@ class kolab_storage_cache
return;
}
- $target = kolab_storage::get_folder($new_folder);
+ if ($target = kolab_storage::get_folder($new_folder)) {
+ // resolve new message UID in target folder
+ $this->db->query(
+ "UPDATE `{$this->folders_table}` SET `resource` = ? ".
+ "WHERE `resource` = ?",
+ $target->get_resource_uri(),
+ $this->resource_uri
+ );
- // resolve new message UID in target folder
- $this->db->query(
- "UPDATE $this->folders_table SET resource=? ".
- "WHERE resource=?",
- $target->get_resource_uri(),
- $this->resource_uri
- );
+ $this->check_error();
+ }
+ else {
+ $this->error = kolab_storage::ERROR_IMAP_CONN;
+ }
}
/**
@@ -466,8 +516,8 @@ class kolab_storage_cache
// fetch full object data on one query if a small result set is expected
$fetchall = !$uids && ($this->limit ? $this->limit[0] : $this->count($query)) < 500;
- $sql_query = "SELECT " . ($fetchall ? '*' : 'msguid AS _msguid, uid') . " FROM $this->cache_table ".
- "WHERE folder_id=? " . $this->_sql_where($query);
+ $sql_query = "SELECT " . ($fetchall ? '*' : '`msguid` AS `_msguid`, `uid`') . " FROM `{$this->cache_table}` ".
+ "WHERE `folder_id` = ? " . $this->_sql_where($query);
if (!empty($this->order_by)) {
$sql_query .= ' ORDER BY ' . $this->order_by;
}
@@ -510,6 +560,7 @@ class kolab_storage_cache
}
if ($index->is_error()) {
+ $this->check_error();
if ($uids) {
return null;
}
@@ -532,6 +583,8 @@ class kolab_storage_cache
}
}
+ $this->check_error();
+
return $result;
}
@@ -549,8 +602,8 @@ class kolab_storage_cache
$this->_read_folder_data();
$sql_result = $this->db->query(
- "SELECT COUNT(*) AS numrows FROM $this->cache_table ".
- "WHERE folder_id=? " . $this->_sql_where($query),
+ "SELECT COUNT(*) AS `numrows` FROM `{$this->cache_table}` ".
+ "WHERE `folder_id` = ?" . $this->_sql_where($query),
$this->folder_id
);
@@ -574,6 +627,7 @@ class kolab_storage_cache
}
if ($index->is_error()) {
+ $this->check_error();
return null;
}
@@ -582,6 +636,7 @@ class kolab_storage_cache
$count = $index->count();
}
+ $this->check_error();
return $count;
}
@@ -591,7 +646,7 @@ class kolab_storage_cache
public function set_order_by($sortcols)
{
if (!empty($sortcols)) {
- $this->order_by = join(', ', (array)$sortcols);
+ $this->order_by = '`' . join('`, `', (array)$sortcols) . '`';
}
else {
$this->order_by = null;
@@ -787,6 +842,40 @@ class kolab_storage_cache
$line = '';
if ($object) {
$sql_data = $this->_serialize($object);
+
+ // Skip multifolder insert for Oracle, we can't put long data inline
+ if ($this->db->db_provider == 'oracle') {
+ $extra_cols = '';
+ if ($this->extra_cols) {
+ $extra_cols = array_map(function($n) { return "`{$n}`"; }, $this->extra_cols);
+ $extra_cols = ', ' . join(', ', $extra_cols);
+ $extra_args = str_repeat(', ?', count($this->extra_cols));
+ }
+
+ $params = array($this->folder_id, $msguid, $object['uid'], $sql_data['changed'],
+ $sql_data['data'], $sql_data['xml'], $sql_data['tags'], $sql_data['words']);
+
+ foreach ($this->extra_cols as $col) {
+ $params[] = $sql_data[$col];
+ }
+
+ $result = $this->db->query(
+ "INSERT INTO `{$this->cache_table}` "
+ . " (`folder_id`, `msguid`, `uid`, `created`, `changed`, `data`, `xml`, `tags`, `words` $extra_cols)"
+ . " VALUES (?, ?, ?, " . $this->db->now() . ", ?, ?, ?, ?, ? $extra_args)",
+ $params
+ );
+
+ if (!$this->db->affected_rows($result)) {
+ rcube::raise_error(array(
+ 'code' => 900, 'type' => 'php',
+ 'message' => "Failed to write to kolab cache"
+ ), true);
+ }
+
+ return;
+ }
+
$values = array(
$this->db->quote($this->folder_id),
$this->db->quote($msguid),
@@ -805,12 +894,18 @@ class kolab_storage_cache
}
if ($buffer && (!$msguid || (strlen($buffer) + strlen($line) > $this->max_sql_packet()))) {
- $extra_cols = $this->extra_cols ? ', ' . join(', ', $this->extra_cols) : '';
+ $extra_cols = '';
+ if ($this->extra_cols) {
+ $extra_cols = array_map(function($n) { return "`{$n}`"; }, $this->extra_cols);
+ $extra_cols = ', ' . join(', ', $extra_cols);
+ }
+
$result = $this->db->query(
- "INSERT INTO $this->cache_table ".
- " (folder_id, msguid, uid, created, changed, data, xml, tags, words $extra_cols)".
+ "INSERT INTO `{$this->cache_table}` ".
+ " (`folder_id`, `msguid`, `uid`, `created`, `changed`, `data`, `xml`, `tags`, `words` $extra_cols)".
" VALUES $buffer"
);
+
if (!$this->db->affected_rows($result)) {
rcube::raise_error(array(
'code' => 900, 'type' => 'php',
@@ -847,13 +942,20 @@ class kolab_storage_cache
if (!empty($this->folder_id) || !$this->ready)
return;
- $sql_arr = $this->db->fetch_assoc($this->db->query("SELECT folder_id, synclock, ctag FROM $this->folders_table WHERE resource=?", $this->resource_uri));
+ $sql_arr = $this->db->fetch_assoc($this->db->query(
+ "SELECT `folder_id`, `synclock`, `ctag`"
+ . " FROM `{$this->folders_table}` WHERE `resource` = ?",
+ $this->resource_uri
+ ));
+
if ($sql_arr) {
$this->metadata = $sql_arr;
$this->folder_id = $sql_arr['folder_id'];
}
else {
- $this->db->query("INSERT INTO $this->folders_table (resource, type) VALUES (?, ?)", $this->resource_uri, $this->folder->type);
+ $this->db->query("INSERT INTO `{$this->folders_table}` (`resource`, `type`)"
+ . " VALUES (?, ?)", $this->resource_uri, $this->folder->type);
+
$this->folder_id = $this->db->insert_id('kolab_folders');
$this->metadata = array();
}
@@ -868,24 +970,29 @@ class kolab_storage_cache
return;
$this->_read_folder_data();
- $sql_query = "SELECT synclock, ctag FROM $this->folders_table WHERE folder_id=?";
// abort if database is not set-up
if ($this->db->is_error()) {
+ $this->check_error();
$this->ready = false;
return;
}
- $this->synclock = true;
+ $read_query = "SELECT `synclock`, `ctag` FROM `{$this->folders_table}` WHERE `folder_id` = ?";
+ $write_query = "UPDATE `{$this->folders_table}` SET `synclock` = ? WHERE `folder_id` = ? AND `synclock` = ?";
- // wait if locked (expire locks after 10 minutes)
- while ($this->metadata && intval($this->metadata['synclock']) > 0 && $this->metadata['synclock'] + $this->max_sync_lock_time > time()) {
+ // wait if locked (expire locks after 10 minutes) ...
+ // ... or if setting lock fails (another process meanwhile set it)
+ while (
+ (intval($this->metadata['synclock']) + $this->max_sync_lock_time > time()) ||
+ (($res = $this->db->query($write_query, time(), $this->folder_id, intval($this->metadata['synclock']))) &&
+ !($affected = $this->db->affected_rows($res)))
+ ) {
usleep(500000);
- $this->metadata = $this->db->fetch_assoc($this->db->query($sql_query, $this->folder_id));
+ $this->metadata = $this->db->fetch_assoc($this->db->query($read_query, $this->folder_id));
}
- // set lock
- $this->db->query("UPDATE $this->folders_table SET synclock = ? WHERE folder_id = ?", time(), $this->folder_id);
+ $this->synclock = $affected > 0;
}
/**
@@ -897,7 +1004,7 @@ class kolab_storage_cache
return;
$this->db->query(
- "UPDATE $this->folders_table SET synclock = 0, ctag = ? WHERE folder_id = ?",
+ "UPDATE `{$this->folders_table}` SET `synclock` = 0, `ctag` = ? WHERE `folder_id` = ?",
$this->metadata['ctag'],
$this->folder_id
);
@@ -906,6 +1013,22 @@ class kolab_storage_cache
}
/**
+ * Check IMAP connection error state
+ */
+ protected function check_error()
+ {
+ if (($err_code = $this->imap->get_error_code()) < 0) {
+ $this->error = kolab_storage::ERROR_IMAP_CONN;
+ if (($res_code = $this->imap->get_response_code()) !== 0 && in_array($res_code, array(rcube_storage::NOPERM, rcube_storage::READONLY))) {
+ $this->error = kolab_storage::ERROR_NO_PERMISSION;
+ }
+ }
+ else if ($this->db->is_error()) {
+ $this->error = kolab_storage::ERROR_CACHE_DB;
+ }
+ }
+
+ /**
* Resolve an object UID into an IMAP message UID
*
* @param string Kolab object UID
@@ -919,8 +1042,8 @@ class kolab_storage_cache
$this->_read_folder_data();
$sql_result = $this->db->query(
- "SELECT msguid FROM $this->cache_table ".
- "WHERE folder_id=? AND uid=? ORDER BY msguid DESC",
+ "SELECT `msguid` FROM `{$this->cache_table}` ".
+ "WHERE `folder_id` = ? AND `uid` = ? ORDER BY `msguid` DESC",
$this->folder_id,
$uid
);
diff --git a/lib/plugins/libkolab/lib/kolab_storage_cache_configuration.php b/lib/plugins/libkolab/lib/kolab_storage_cache_configuration.php
index ec015dd..c3c7ac4 100644
--- a/lib/plugins/libkolab/lib/kolab_storage_cache_configuration.php
+++ b/lib/plugins/libkolab/lib/kolab_storage_cache_configuration.php
@@ -39,6 +39,28 @@ class kolab_storage_cache_configuration extends kolab_storage_cache
}
/**
+ * Select Kolab objects filtered by the given query
+ *
+ * @param array Pseudo-SQL query as list of filter parameter triplets
+ * @param boolean Set true to only return UIDs instead of complete objects
+ * @return array List of Kolab data objects (each represented as hash array) or UIDs
+ */
+ public function select($query = array(), $uids = false)
+ {
+ // modify query for IMAP search: query param 'type' is actually a subtype
+ if (!$this->ready) {
+ foreach ($query as $i => $tuple) {
+ if ($tuple[0] == 'type') {
+ $tuple[2] = 'configuration.' . $tuple[2];
+ $query[$i] = $tuple;
+ }
+ }
+ }
+
+ return parent::select($query, $uids);
+ }
+
+ /**
* Helper method to compose a valid SQL query from pseudo filter triplets
*/
protected function _sql_where($query)
diff --git a/lib/plugins/libkolab/lib/kolab_storage_config.php b/lib/plugins/libkolab/lib/kolab_storage_config.php
index 9bc5d50..036b827 100644
--- a/lib/plugins/libkolab/lib/kolab_storage_config.php
+++ b/lib/plugins/libkolab/lib/kolab_storage_config.php
@@ -125,6 +125,7 @@ class kolab_storage_config
}
foreach ($folder->select($filter) as $object) {
+ unset($object['_formatobj']);
$list[] = $object;
}
}
@@ -350,6 +351,8 @@ class kolab_storage_config
'params' => $params,
);
}
+
+ return false;
}
/**
@@ -626,20 +629,24 @@ class kolab_storage_config
// use faster method
if ($uid && $uid != '*') {
$filter[] = array('member', '=', $uid);
- return $this->get_objects($filter, $default);
+ $tags = $this->get_objects($filter, $default);
+ }
+ else {
+ $this->tags = $tags = $this->get_objects($filter, $default);
}
-
- $this->tags = $this->get_objects($filter, $default);
+ }
+ else {
+ $tags = $this->tags;
}
if ($uid === '*') {
- return $this->tags;
+ return $tags;
}
$result = array();
$search = self::build_member_url($uid);
- foreach ($this->tags as $tag) {
+ foreach ($tags as $tag) {
if (in_array($search, (array) $tag['members'])) {
$result[] = $tag;
}
@@ -649,6 +656,100 @@ class kolab_storage_config
}
/**
+ * Find objects linked with the given groupware object through a relation
+ *
+ * @param string Object UUID
+ * @param array List of related URIs
+ */
+ public function get_object_links($uid)
+ {
+ $links = array();
+ $object_uri = self::build_member_url($uid);
+
+ foreach ($this->get_relations_for_member($uid) as $relation) {
+ if (in_array($object_uri, (array) $relation['members'])) {
+ // make relation members up-to-date
+ kolab_storage_config::resolve_members($relation);
+
+ foreach ($relation['members'] as $member) {
+ if ($member != $object_uri) {
+ $links[] = $member;
+ }
+ }
+ }
+ }
+
+ return array_unique($links);
+ }
+
+ /**
+ *
+ */
+ public function save_object_links($uid, $links, $remove = array())
+ {
+ $object_uri = self::build_member_url($uid);
+ $relations = $this->get_relations_for_member($uid);
+ $done = false;
+
+ foreach ($relations as $relation) {
+ // make relation members up-to-date
+ kolab_storage_config::resolve_members($relation);
+
+ // remove and add links
+ $members = array_diff($relation['members'], (array)$remove);
+ $members = array_unique(array_merge($members, $links));
+
+ // make sure the object_uri is still a member
+ if (!in_array($object_uri, $members)) {
+ $members[$object_uri];
+ }
+
+ // remove relation if no other members remain
+ if (count($members) <= 1) {
+ $done = $this->delete($relation['uid']);
+ }
+ // update relation object if members changed
+ else if (count(array_diff($members, $relation['members'])) || count(array_diff($relation['members'], $members))) {
+ $relation['members'] = $members;
+ $done = $this->save($relation, 'relation');
+ $links = array();
+ }
+ // no changes, we're happy
+ else {
+ $done = true;
+ $links = array();
+ }
+ }
+
+ // create a new relation
+ if (!$done && !empty($links)) {
+ $relation = array(
+ 'members' => array_merge($links, array($object_uri)),
+ 'category' => 'generic',
+ );
+
+ $ret = $this->save($relation, 'relation');
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Find relation objects referring to specified note
+ */
+ public function get_relations_for_member($uid, $reltype = 'generic')
+ {
+ $default = true;
+ $filter = array(
+ array('type', '=', 'relation'),
+ array('category', '=', $reltype),
+ array('member', '=', $uid),
+ );
+
+ return $this->get_objects($filter, $default, 100);
+ }
+
+ /**
* Find kolab objects assigned to specified e-mail message
*
* @param rcube_message $message E-mail message
@@ -659,6 +760,8 @@ class kolab_storage_config
*/
public function get_message_relations($message, $folder, $type)
{
+ static $_cache = array();
+
$result = array();
$uids = array();
$default = true;
@@ -666,28 +769,42 @@ class kolab_storage_config
$filter = array(
array('type', '=', 'relation'),
array('category', '=', 'generic'),
- // @TODO: what if Message-Id (and Date) does not exist?
- array('member', '=', $message->get('message-id', false)),
);
- // get UIDs of assigned notes
- foreach ($this->get_objects($filter, $default) as $relation) {
- // we don't need to update members if the URI is found
- if (in_array($uri, $relation['members'])) {
- // update members...
- $messages = kolab_storage_config::resolve_members($relation);
- // ...and check again
- if (empty($messages[$folder]) || !in_array($message->uid, $messages[$folder])) {
- continue;
+ // query by message-id
+ $member_id = $message->get('message-id', false);
+ if (empty($member_id)) {
+ // derive message identifier from URI
+ $member_id = md5($uri);
+ }
+ $filter[] = array('member', '=', $member_id);
+
+ if (!isset($_cache[$uri])) {
+ // get UIDs of related groupware objects
+ foreach ($this->get_objects($filter, $default) as $relation) {
+ // we don't need to update members if the URI is found
+ if (!in_array($uri, $relation['members'])) {
+ // update members...
+ $messages = kolab_storage_config::resolve_members($relation);
+ // ...and check again
+ if (empty($messages[$folder]) || !in_array($message->uid, $messages[$folder])) {
+ continue;
+ }
}
- }
- // find note UID(s)
- foreach ($relation['members'] as $member) {
- if (strpos($member, 'urn:uuid:') === 0) {
- $uids[] = substr($member, 9);
+ // find groupware object UID(s)
+ foreach ($relation['members'] as $member) {
+ if (strpos($member, 'urn:uuid:') === 0) {
+ $uids[] = substr($member, 9);
+ }
}
}
+
+ // remember this lookup
+ $_cache[$uri] = $uids;
+ }
+ else {
+ $uids = $_cache[$uri];
}
// get kolab objects of specified type
@@ -720,4 +837,30 @@ class kolab_storage_config
return self::build_member_url($params);
}
+
+ /**
+ * Resolve the email message reference from the given URI
+ */
+ public function get_message_reference($uri, $rel = null)
+ {
+ if ($linkref = self::parse_member_url($uri)) {
+ $linkref['subject'] = $linkref['params']['subject'];
+ $linkref['uri'] = $uri;
+
+ $rcmail = rcube::get_instance();
+ if (method_exists($rcmail, 'url')) {
+ $linkref['mailurl'] = $rcmail->url(array(
+ 'task' => 'mail',
+ 'action' => 'show',
+ 'mbox' => $linkref['folder'],
+ 'uid' => $linkref['uid'],
+ 'rel' => $rel,
+ ));
+ }
+
+ unset($linkref['params']);
+ }
+
+ return $linkref;
+ }
}
diff --git a/lib/plugins/libkolab/lib/kolab_storage_folder.php b/lib/plugins/libkolab/lib/kolab_storage_folder.php
index ad6d5c0..ab3c63f 100644
--- a/lib/plugins/libkolab/lib/kolab_storage_folder.php
+++ b/lib/plugins/libkolab/lib/kolab_storage_folder.php
@@ -30,18 +30,28 @@ class kolab_storage_folder extends kolab_storage_folder_api
*/
public $cache;
- private $type_annotation;
- private $resource_uri;
+ /**
+ * Indicate validity status
+ * @var boolean
+ */
+ public $valid = false;
+
+ protected $error = 0;
+
+ protected $resource_uri;
/**
* Default constructor
+ *
+ * @param string The folder name/path
+ * @param string Expected folder type
*/
- function __construct($name, $type = null)
+ function __construct($name, $type = null, $type_annotation = null)
{
parent::__construct($name);
$this->imap->set_options(array('skip_deleted' => true));
- $this->set_folder($name, $type);
+ $this->set_folder($name, $type, $type_annotation);
}
@@ -49,29 +59,63 @@ class kolab_storage_folder extends kolab_storage_folder_api
* Set the IMAP folder this instance connects to
*
* @param string The folder name/path
+ * @param string Expected folder type
* @param string Optional folder type if known
*/
- public function set_folder($name, $type = null)
+ public function set_folder($name, $type = null, $type_annotation = null)
{
- $this->type_annotation = $type ? $type : kolab_storage::folder_type($name);
+ if (empty($type_annotation)) {
+ $type_annotation = kolab_storage::folder_type($name);
+ }
$oldtype = $this->type;
- list($this->type, $suffix) = explode('.', $this->type_annotation);
+ list($this->type, $suffix) = explode('.', $type_annotation);
$this->default = $suffix == 'default';
+ $this->subtype = $this->default ? '' : $suffix;
$this->name = $name;
$this->id = kolab_storage::folder_id($name);
+ $this->valid = !empty($this->type) && $this->type != 'mail' && (!$type || $this->type == $type);
+
+ if (!$this->valid) {
+ $this->error = $this->imap->get_error_code() < 0 ? kolab_storage::ERROR_IMAP_CONN : kolab_storage::ERROR_INVALID_FOLDER;
+ }
// reset cached object properties
$this->owner = $this->namespace = $this->resource_uri = $this->info = $this->idata = null;
- // get a new cache instance of folder type changed
- if (!$this->cache || $type != $oldtype)
+ // get a new cache instance if folder type changed
+ if (!$this->cache || $this->type != $oldtype)
$this->cache = kolab_storage_cache::factory($this);
+ else
+ $this->cache->set_folder($this);
$this->imap->set_folder($this->name);
- $this->cache->set_folder($this);
}
+ /**
+ * Returns code of last error
+ *
+ * @return int Error code
+ */
+ public function get_error()
+ {
+ return $this->error ?: $this->cache->get_error();
+ }
+
+ /**
+ * Check IMAP connection error state
+ */
+ public function check_error()
+ {
+ if (($err_code = $this->imap->get_error_code()) < 0) {
+ $this->error = kolab_storage::ERROR_IMAP_CONN;
+ if (($res_code = $this->imap->get_response_code()) !== 0 && in_array($res_code, array(rcube_storage::NOPERM, rcube_storage::READONLY))) {
+ $this->error = kolab_storage::ERROR_NO_PERMISSION;
+ }
+ }
+
+ return $this->error;
+ }
/**
* Compose a unique resource URI for this IMAP folder
@@ -96,7 +140,7 @@ class kolab_storage_folder extends kolab_storage_folder_api
}
// compose fully qualified ressource uri for this instance
- $this->resource_uri = 'imap://' . urlencode($this->get_owner()) . '@' . $this->imap->options['host'] . '/' . $subpath;
+ $this->resource_uri = 'imap://' . urlencode($this->get_owner(true)) . '@' . $this->imap->options['host'] . '/' . $subpath;
return $this->resource_uri;
}
@@ -118,9 +162,12 @@ class kolab_storage_folder extends kolab_storage_folder_api
// generate a folder UID and set it to IMAP
$uid = rtrim(chunk_split(md5($this->name . $this->get_owner() . uniqid('-', true)), 12, '-'), '-');
- $this->set_uid($uid);
+ if ($this->set_uid($uid)) {
+ return $uid;
+ }
- return $uid;
+ // create hash from folder name if we can't write the UID metadata
+ return md5($this->name . $this->get_owner());
}
/**
@@ -134,6 +181,8 @@ class kolab_storage_folder extends kolab_storage_folder_api
if (!($success = $this->set_metadata(array(kolab_storage::UID_KEY_SHARED => $uid)))) {
$success = $this->set_metadata(array(kolab_storage::UID_KEY_PRIVATE => $uid));
}
+
+ $this->check_error();
return $success;
}
@@ -143,6 +192,7 @@ class kolab_storage_folder extends kolab_storage_folder_api
public function get_ctag()
{
$fdata = $this->get_imap_data();
+ $this->check_error();
return sprintf('%d-%d-%d', $fdata['UIDVALIDITY'], $fdata['HIGHESTMODSEQ'], $fdata['UIDNEXT']);
}
@@ -200,6 +250,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
*/
public function count($query = null)
{
+ if (!$this->valid) {
+ return 0;
+ }
+
// synchronize cache first
$this->cache->synchronize();
@@ -217,6 +271,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
{
if (!$type) $type = $this->type;
+ if (!$this->valid) {
+ return array();
+ }
+
// synchronize caches
$this->cache->synchronize();
@@ -234,9 +292,14 @@ class kolab_storage_folder extends kolab_storage_folder_api
*/
public function select($query = array())
{
+ if (!$this->valid) {
+ return array();
+ }
+
// check query argument
- if (empty($query))
+ if (empty($query)) {
return $this->get_objects();
+ }
// synchronize caches
$this->cache->synchronize();
@@ -254,6 +317,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
*/
public function get_uids($query = array())
{
+ if (!$this->valid) {
+ return array();
+ }
+
// synchronize caches
$this->cache->synchronize();
@@ -315,6 +382,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
*/
public function get_object($uid, $type = null)
{
+ if (!$this->valid) {
+ return false;
+ }
+
// synchronize caches
$this->cache->synchronize();
@@ -344,7 +415,7 @@ class kolab_storage_folder extends kolab_storage_folder_api
*/
public function get_attachment($uid, $part, $mailbox = null, $print = false, $fp = null, $skip_charset_conv = false)
{
- if ($msguid = ($mailbox ? $uid : $this->cache->uid2msguid($uid))) {
+ if ($this->valid && ($msguid = ($mailbox ? $uid : $this->cache->uid2msguid($uid)))) {
$this->imap->set_folder($mailbox ? $mailbox : $this->name);
if (substr($part, 0, 2) == 'i:') {
@@ -356,7 +427,7 @@ class kolab_storage_folder extends kolab_storage_folder_api
$object['_formatobj']->get_attachments($object);
}
- foreach ($object['_attachments'] as $k => $attach) {
+ foreach ($object['_attachments'] as $attach) {
if ($attach['id'] == $part) {
if ($print) echo $attach['content'];
else if ($fp) fwrite($fp, $attach['content']);
@@ -388,6 +459,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
*/
public function read_object($msguid, $type = null, $folder = null)
{
+ if (!$this->valid) {
+ return false;
+ }
+
if (!$type) $type = $this->type;
if (!$folder) $folder = $this->name;
@@ -440,7 +515,7 @@ class kolab_storage_folder extends kolab_storage_folder_api
// get XML part
foreach ((array)$message->attachments as $part) {
if (!$xml && ($part->mimetype == $content_type || preg_match('!application/([a-z.]+\+)?xml!', $part->mimetype))) {
- $xml = $part->body ? $part->body : $message->get_part_content($part->mime_id);
+ $xml = $message->get_part_body($part->mime_id, true);
}
else if ($part->filename || $part->content_id) {
$key = $part->content_id ? trim($part->content_id, '<>') : $part->filename;
@@ -533,6 +608,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
*/
public function save(&$object, $type = null, $uid = null)
{
+ if (!$this->valid) {
+ return false;
+ }
+
if (!$type)
$type = $this->type;
@@ -728,6 +807,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
*/
public function delete($object, $expunge = true)
{
+ if (!$this->valid) {
+ return false;
+ }
+
$msguid = is_array($object) ? $object['_msguid'] : $this->cache->uid2msguid($object);
$success = false;
@@ -755,6 +838,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
*/
public function delete_all()
{
+ if (!$this->valid) {
+ return false;
+ }
+
$this->cache->purge();
$this->cache->bypass(true);
$result = $this->imap->clear_folder($this->name);
@@ -772,6 +859,10 @@ class kolab_storage_folder extends kolab_storage_folder_api
*/
public function undelete($uid)
{
+ if (!$this->valid) {
+ return false;
+ }
+
if ($msguid = $this->cache->uid2msguid($uid, true)) {
$this->cache->bypass(true);
$result = $this->imap->set_flag($msguid, 'UNDELETED', $this->name);
@@ -795,9 +886,16 @@ class kolab_storage_folder extends kolab_storage_folder_api
*/
public function move($uid, $target_folder)
{
+ if (!$this->valid) {
+ return false;
+ }
+
+ if (is_string($target_folder))
+ $target_folder = kolab_storage::get_folder($target_folder);
+
if ($msguid = $this->cache->uid2msguid($uid)) {
$this->cache->bypass(true);
- $result = $this->imap->move_message($msguid, $target_folder, $this->name);
+ $result = $this->imap->move_message($msguid, $target_folder->name, $this->name);
$this->cache->bypass(false);
if ($result) {
@@ -875,7 +973,7 @@ class kolab_storage_folder extends kolab_storage_folder_api
if (!empty($object['_attachments']) && ($mem_limit = parse_bytes(ini_get('memory_limit'))) > 0) {
$memory = function_exists('memory_get_usage') ? memory_get_usage() : 16*1024*1024; // safe value: 16MB
- foreach ($object['_attachments'] as $id => $attachment) {
+ foreach ($object['_attachments'] as $attachment) {
$memory += $attachment['size'];
}
@@ -1047,8 +1145,6 @@ class kolab_storage_folder extends kolab_storage_folder_api
*/
private function trigger_url($url, $auth_user = null, $auth_passwd = null)
{
- require_once('HTTP/Request2.php');
-
try {
$request = libkolab::http_request($url);
diff --git a/lib/plugins/libkolab/lib/kolab_storage_folder_api.php b/lib/plugins/libkolab/lib/kolab_storage_folder_api.php
index ef3309e..7280389 100644
--- a/lib/plugins/libkolab/lib/kolab_storage_folder_api.php
+++ b/lib/plugins/libkolab/lib/kolab_storage_folder_api.php
@@ -41,6 +41,12 @@ abstract class kolab_storage_folder_api
public $type;
/**
+ * The subtype of this folder.
+ * @var string
+ */
+ public $subtype;
+
+ /**
* Is this folder set to be the default for its type
* @var boolean
*/
@@ -79,9 +85,10 @@ abstract class kolab_storage_folder_api
/**
* Returns the owner of the folder.
*
+ * @param boolean Return a fully qualified owner name (i.e. including domain for shared folders)
* @return string The owner of this folder.
*/
- public function get_owner()
+ public function get_owner($fully_qualified = false)
{
// return cached value
if (isset($this->owner))
@@ -100,16 +107,21 @@ abstract class kolab_storage_folder_api
break;
default:
- list($prefix, $user) = explode($this->imap->get_hierarchy_delimiter(), $info['name']);
- if (strpos($user, '@') === false) {
- $domain = strstr($rcmail->get_user_name(), '@');
- if (!empty($domain))
- $user .= $domain;
- }
- $this->owner = $user;
+ list($prefix, $this->owner) = explode($this->imap->get_hierarchy_delimiter(), $info['name']);
+ $fully_qualified = true; // enforce email addresses (backwards compatibility)
break;
}
+ if ($fully_qualified && strpos($this->owner, '@') === false) {
+ // extract domain from current user name
+ $domain = strstr($rcmail->get_user_name(), '@');
+ // fall back to mail_domain config option
+ if (empty($domain) && ($mdomain = $rcmail->config->mail_domain($this->imap->options['host']))) {
+ $domain = '@' . $mdomain;
+ }
+ $this->owner .= $domain;
+ }
+
return $this->owner;
}
@@ -326,5 +338,14 @@ abstract class kolab_storage_folder_api
return $subscribed ? kolab_storage::folder_subscribe($this->name) : kolab_storage::folder_unsubscribe($this->name);
}
+ /**
+ * Return folder name as string representation of this object
+ *
+ * @return string Full IMAP folder name
+ */
+ public function __toString()
+ {
+ return $this->name;
+ }
}
diff --git a/lib/plugins/libkolab/lib/kolab_storage_folder_user.php b/lib/plugins/libkolab/lib/kolab_storage_folder_user.php
index 1c37da9..7c141c5 100644
--- a/lib/plugins/libkolab/lib/kolab_storage_folder_user.php
+++ b/lib/plugins/libkolab/lib/kolab_storage_folder_user.php
@@ -26,6 +26,7 @@ class kolab_storage_folder_user extends kolab_storage_folder_virtual
protected static $ldapcache = array();
public $ldaprec;
+ public $type;
/**
* Default constructor
@@ -85,13 +86,28 @@ class kolab_storage_folder_user extends kolab_storage_folder_virtual
}
/**
- * Check subscription status of this folder
+ * Check subscription status of this folder.
+ * Subscription of a virtual user folder depends on the subscriptions of subfolders.
*
* @return boolean True if subscribed, false if not
*/
public function is_subscribed()
{
- return kolab_storage::folder_is_subscribed($this->name, true);
+ if (!empty($this->type)) {
+ $children = $subscribed = 0;
+ $delimiter = $this->imap->get_hierarchy_delimiter();
+ foreach ((array)kolab_storage::list_folders($this->name . $delimiter, '*', $this->type, false) as $subfolder) {
+ if (kolab_storage::folder_is_subscribed($subfolder)) {
+ $subscribed++;
+ }
+ $children++;
+ }
+ if ($subscribed > 0) {
+ return $subscribed == $children ? true : 2;
+ }
+ }
+
+ return false;
}
/**
@@ -103,9 +119,17 @@ class kolab_storage_folder_user extends kolab_storage_folder_virtual
*/
public function subscribe($subscribed)
{
- return $subscribed ?
- kolab_storage::folder_subscribe($this->name, true) :
- kolab_storage::folder_unsubscribe($this->name, true);
+ $success = false;
+
+ // (un)subscribe all subfolders of a given type
+ if (!empty($this->type)) {
+ $delimiter = $this->imap->get_hierarchy_delimiter();
+ foreach ((array)kolab_storage::list_folders($this->name . $delimiter, '*', $this->type, false) as $subfolder) {
+ $success |= ($subscribed ? kolab_storage::folder_subscribe($subfolder) : kolab_storage::folder_unsubscribe($subfolder));
+ }
+ }
+
+ return $success;
}
} \ No newline at end of file
diff --git a/lib/plugins/libkolab/package.xml b/lib/plugins/libkolab/package.xml
deleted file mode 100644
index cd3e3a0..0000000
--- a/lib/plugins/libkolab/package.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
- http://pear.php.net/dtd/tasks-1.0.xsd
- http://pear.php.net/dtd/package-2.0
- http://pear.php.net/dtd/package-2.0.xsd">
- <name>libkolab</name>
- <uri>http://git.kolab.org/roundcubemail-plugins-kolab/</uri>
- <summary>Kolab core library</summary>
- <description>Plugin to setup a basic environment for the interaction with a Kolab server.</description>
- <lead>
- <name>Thomas Bruederli</name>
- <user>bruederli</user>
- <email>bruederli@kolabsys.com</email>
- <active>yes</active>
- </lead>
- <developer>
- <name>Alensader Machniak</name>
- <user>machniak</user>
- <email>machniak@kolabsys.com</email>
- <active>yes</active>
- </developer>
- <date>2013-04-19</date>
- <version>
- <release>0.9</release>
- <api>0.9</api>
- </version>
- <stability>
- <release>stable</release>
- <api>stable</api>
- </stability>
- <license uri="http://www.gnu.org/licenses/agpl.html">GNU AGPLv3</license>
- <notes>-</notes>
- <contents>
- <dir baseinstalldir="/" name="/">
- <file name="libkolab.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/kolab_format.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/kolab_format_configuration.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/kolab_format_contact.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/kolab_format_distributionlist.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/kolab_format_event.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/kolab_format_file.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/kolab_format_journal.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/kolab_format_note.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/kolab_format_task.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/kolab_format_xcal.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/kolab_storage.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/kolab_storage_cache.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/kolab_storage_folder.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/kolab_date_recurrence.php" role="php">
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
-
- <file name="bin/modcache.php" role="php"></file>
-
- <file name="config.inc.php.dist" role="data"></file>
- <file name="LICENSE" role="data"></file>
- <file name="README" role="data"></file>
- <file name="UPGRADING" role="data"></file>
- </dir>
- <!-- / -->
- </contents>
- <dependencies>
- <required>
- <php>
- <min>5.3.1</min>
- </php>
- <pearinstaller>
- <min>1.7.0</min>
- </pearinstaller>
- </required>
- </dependencies>
- <phprelease/>
-</package>
diff --git a/lib/plugins/managesieve/Changelog b/lib/plugins/managesieve/Changelog
index 01afe69..5255d5b 100644
--- a/lib/plugins/managesieve/Changelog
+++ b/lib/plugins/managesieve/Changelog
@@ -1,6 +1,17 @@
+* version 8.2 [2015-01-14]
+-----------------------------------------------------------
+- Fix bug where actions without if/elseif/else in sieve scripts were skipped
+- Support "not allof" test as a negation of all sub-tests
+- Fix bug where vacation rule was saved to wrong script if managesieve_kolab_master=true
+- Improve procedure of script selection to write a vacation rule
+
+* version 8.1 [2014-12-09]
+-----------------------------------------------------------
+- Added simple API to manage vacation rule
- Fix missing css/js scripts in filter form in mail task
- Fix default vacation status (#1490019)
- Make possible to set vacation start/end date and time
+- Fix compatibility with contextmenu plugin
* version 8.0 [2014-07-16]
-----------------------------------------------------------
diff --git a/lib/plugins/managesieve/composer.json b/lib/plugins/managesieve/composer.json
index 51e76bc..6d640da 100644
--- a/lib/plugins/managesieve/composer.json
+++ b/lib/plugins/managesieve/composer.json
@@ -2,8 +2,8 @@
"name": "roundcube/managesieve",
"type": "roundcube-plugin",
"description": "Adds a possibility to manage Sieve scripts (incoming mail filters). It's clickable interface which operates on text scripts and communicates with server using managesieve protocol. Adds Filters tab in Settings.",
- "license": "GNU GPLv3+",
- "version": "7.2",
+ "license": "GPLv3+",
+ "version": "8.2",
"authors": [
{
"name": "Aleksander Machniak",
diff --git a/lib/plugins/managesieve/config.inc.php.dist b/lib/plugins/managesieve/config.inc.php.dist
index 1f20b5a..b9f9a50 100644
--- a/lib/plugins/managesieve/config.inc.php.dist
+++ b/lib/plugins/managesieve/config.inc.php.dist
@@ -31,7 +31,7 @@ $config['managesieve_usetls'] = false;
// Connection scket context options
// See http://php.net/manual/en/context.ssl.php
// The example below enables server certificate validation
-//$config['imap_conn_options'] = array(
+//$config['managesieve_conn_options'] = array(
// 'ssl' => array(
// 'verify_peer' => true,
// 'verify_depth' => 3,
diff --git a/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php b/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
index 302c7c7..d412e17 100644
--- a/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
+++ b/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
@@ -5,8 +5,8 @@
*
* Engine part of Managesieve plugin implementing UI and backend access.
*
- * Copyright (C) 2008-2013, The Roundcube Dev Team
- * Copyright (C) 2011-2013, Kolab Systems AG
+ * Copyright (C) 2008-2014, The Roundcube Dev Team
+ * Copyright (C) 2011-2014, Kolab Systems AG
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -63,7 +63,7 @@ class rcube_sieve_engine
1 => 'notifyimportancehigh'
);
- const VERSION = '8.0';
+ const VERSION = '8.2';
const PROGNAME = 'Roundcube (Managesieve)';
const PORT = 4190;
@@ -220,14 +220,14 @@ class rcube_sieve_engine
*
* @return int Connection status: 0 on success, >0 on failure
*/
- public function load_script($script_name = null)
+ protected function load_script($script_name = null)
{
// Get list of scripts
$list = $this->list_scripts();
if ($script_name === null || $script_name === '') {
// get (first) active script
- if (!empty($this->active[0])) {
+ if (!empty($this->active)) {
$script_name = $this->active[0];
}
else if ($list) {
@@ -349,7 +349,7 @@ class rcube_sieve_engine
}
}
else if ($action == 'setact' && !$error) {
- $script_name = rcube_utils::get_input_value('_set', rcube_utils::INPUT_GPC, true);
+ $script_name = rcube_utils::get_input_value('_set', rcube_utils::INPUT_POST, true);
$result = $this->activate_script($script_name);
$kep14 = $this->rc->config->get('managesieve_kolab_master');
@@ -363,7 +363,7 @@ class rcube_sieve_engine
}
}
else if ($action == 'deact' && !$error) {
- $script_name = rcube_utils::get_input_value('_set', rcube_utils::INPUT_GPC, true);
+ $script_name = rcube_utils::get_input_value('_set', rcube_utils::INPUT_POST, true);
$result = $this->deactivate_script($script_name);
if ($result === true) {
@@ -376,7 +376,7 @@ class rcube_sieve_engine
}
}
else if ($action == 'setdel' && !$error) {
- $script_name = rcube_utils::get_input_value('_set', rcube_utils::INPUT_GPC, true);
+ $script_name = rcube_utils::get_input_value('_set', rcube_utils::INPUT_POST, true);
$result = $this->remove_script($script_name);
if ($result === true) {
@@ -419,14 +419,14 @@ class rcube_sieve_engine
$this->rc->output->command('managesieve_updatelist', 'list', array('list' => $result));
}
else if ($action == 'ruleadd') {
- $rid = rcube_utils::get_input_value('_rid', rcube_utils::INPUT_GPC);
+ $rid = rcube_utils::get_input_value('_rid', rcube_utils::INPUT_POST);
$id = $this->genid();
$content = $this->rule_div($fid, $id, false);
$this->rc->output->command('managesieve_rulefill', $content, $id, $rid);
}
else if ($action == 'actionadd') {
- $aid = rcube_utils::get_input_value('_aid', rcube_utils::INPUT_GPC);
+ $aid = rcube_utils::get_input_value('_aid', rcube_utils::INPUT_POST);
$id = $this->genid();
$content = $this->action_div($fid, $id, false);
@@ -1177,16 +1177,7 @@ class rcube_sieve_engine
function filter_frame($attrib)
{
- if (!$attrib['id'])
- $attrib['id'] = 'rcmfilterframe';
-
- $attrib['name'] = $attrib['id'];
-
- $this->rc->output->set_env('contentframe', $attrib['name']);
- $this->rc->output->set_env('blankpage', $attrib['src'] ?
- $this->rc->output->abs_url($attrib['src']) : 'program/resources/blank.gif');
-
- return $this->rc->output->frame($attrib);
+ return $this->rc->output->frame($attrib, true);
}
function filterset_form($attrib)
@@ -1279,8 +1270,11 @@ class rcube_sieve_engine
$out .= $hiddenfields->show();
// 'any' flag
- if (sizeof($scr['tests']) == 1 && $scr['tests'][0]['test'] == 'true' && !$scr['tests'][0]['not'])
+ if ((!isset($this->form) && empty($scr['tests']) && !empty($scr))
+ || (sizeof($scr['tests']) == 1 && $scr['tests'][0]['test'] == 'true' && !$scr['tests'][0]['not'])
+ ) {
$any = true;
+ }
// filter name input
$field_id = '_name';
@@ -1341,7 +1335,7 @@ class rcube_sieve_engine
$out .= sprintf("%s<label for=\"%s\">%s</label>\n",
$input_join, $field_id, rcube::Q($this->plugin->gettext('filterany')));
- $rows_num = isset($scr) ? sizeof($scr['tests']) : 1;
+ $rows_num = !empty($scr['tests']) ? sizeof($scr['tests']) : 1;
$out .= '<div id="rules"'.($any ? ' style="display: none"' : '').'>';
for ($x=0; $x<$rows_num; $x++)
@@ -1472,31 +1466,26 @@ class rcube_sieve_engine
$select_op->add(rcube::Q($this->plugin->gettext('valuenotequals')), 'value-ne');
}
+ $test = self::rule_test($rule);
+ $target = '';
+
// target(s) input
if (in_array($rule['test'], array('header', 'address', 'envelope'))) {
- $test = ($rule['not'] ? 'not' : '').($rule['type'] ? $rule['type'] : 'is');
$target = $rule['arg2'];
}
else if (in_array($rule['test'], array('body', 'date', 'currentdate'))) {
- $test = ($rule['not'] ? 'not' : '').($rule['type'] ? $rule['type'] : 'is');
$target = $rule['arg'];
}
else if ($rule['test'] == 'size') {
- $test = '';
- $target = '';
if (preg_match('/^([0-9]+)(K|M|G)?$/', $rule['arg'], $matches)) {
$sizetarget = $matches[1];
- $sizeitem = $matches[2];
+ $sizeitem = $matches[2];
}
else {
$sizetarget = $rule['arg'];
- $sizeitem = $rule['item'];
+ $sizeitem = $rule['item'];
}
}
- else {
- $test = ($rule['not'] ? 'not' : '').$rule['test'];
- $target = '';
- }
// (current)date part select
if (in_array('date', $this->exts) || in_array('currentdate', $this->exts)) {
@@ -1646,6 +1635,43 @@ class rcube_sieve_engine
return $out;
}
+ private static function rule_test(&$rule)
+ {
+ // first modify value/count tests with 'not' keyword
+ // we'll revert the meaning of operators
+ if ($rule['not'] && preg_match('/^(count|value)-([gteqnl]{2})/', $rule['type'], $m)) {
+ $rule['not'] = false;
+
+ switch ($m[2]) {
+ case 'gt': $rule['type'] = $m[1] . '-le'; break;
+ case 'ge': $rule['type'] = $m[1] . '-lt'; break;
+ case 'lt': $rule['type'] = $m[1] . '-ge'; break;
+ case 'le': $rule['type'] = $m[1] . '-gt'; break;
+ case 'eq': $rule['type'] = $m[1] . '-ne'; break;
+ case 'ne': $rule['type'] = $m[1] . '-eq'; break;
+ }
+ }
+ else if ($rule['not'] && $rule['test'] == 'size') {
+ $rule['not'] = false;
+ $rule['type'] = $rule['type'] == 'over' ? 'under' : 'over';
+ }
+
+ $set = array('header', 'address', 'envelope', 'body', 'date', 'currentdate');
+
+ // build test string supported by select element
+ if ($rule['size']) {
+ $test = $rule['type'];
+ }
+ else if (in_array($rule['test'], $set)) {
+ $test = ($rule['not'] ? 'not' : '') . ($rule['type'] ? $rule['type'] : 'is');
+ }
+ else {
+ $test = ($rule['not'] ? 'not' : '') . $rule['test'];
+ }
+
+ return $test;
+ }
+
function action_div($fid, $id, $div=true)
{
$action = isset($this->form) ? $this->form['actions'][$id] : $this->script[$fid]['actions'][$id];
@@ -2052,7 +2078,6 @@ class rcube_sieve_engine
// Handle active script(s) and list of scripts according to Kolab's KEP:14
if ($this->rc->config->get('managesieve_kolab_master')) {
-
// Skip protected names
foreach ((array)$this->list as $idx => $name) {
$_name = strtoupper($name);
@@ -2080,7 +2105,10 @@ class rcube_sieve_engine
foreach ($rules['actions'] as $action) {
if ($action['type'] == 'include' && empty($action['global'])) {
$name = preg_replace($filename_regex, '', $action['target']);
- $this->active[] = $name;
+ // make sure the script exist
+ if (in_array($name, $this->list)) {
+ $this->active[] = $name;
+ }
}
}
}
@@ -2114,6 +2142,11 @@ class rcube_sieve_engine
}
}
+ // reindex
+ if (!empty($this->list)) {
+ $this->list = array_values($this->list);
+ }
+
return $this->list;
}
@@ -2291,7 +2324,7 @@ class rcube_sieve_engine
$i = 1;
foreach ($this->script as $idx => $filter) {
- if ($filter['type'] != 'if') {
+ if (empty($filter['actions'])) {
continue;
}
$fname = $filter['name'] ? $filter['name'] : "#$i";
diff --git a/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php b/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
index bc62d2f..518d79d 100644
--- a/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
+++ b/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
@@ -622,6 +622,7 @@ class rcube_sieve_script
$disabled = false;
$join = false;
+ $join_not = false;
// disabled rule (false + comment): if false # .....
if (preg_match('/^\s*false\s+#/i', $content)) {
@@ -650,15 +651,22 @@ class rcube_sieve_script
$not = false;
}
+ // we support "not allof" as a negation of allof sub-tests
+ if ($join_not) {
+ $not = !$not;
+ }
+
switch ($token) {
case 'allof':
- $join = true;
+ $join = true;
+ $join_not = $not;
break;
+
case 'anyof':
break;
case 'size':
- $test = array('test' => 'size', 'not' => $not);
+ $test = array('test' => 'size', 'not' => $not);
$test['arg'] = array_pop($tokens);
@@ -740,16 +748,16 @@ class rcube_sieve_script
break;
case 'exists':
- $tests[] = array('test' => 'exists', 'not' => $not,
+ $tests[] = array('test' => 'exists', 'not' => $not,
'arg' => array_pop($tokens));
break;
case 'true':
- $tests[] = array('test' => 'true', 'not' => $not);
+ $tests[] = array('test' => 'true', 'not' => $not);
break;
case 'false':
- $tests[] = array('test' => 'true', 'not' => !$not);
+ $tests[] = array('test' => 'true', 'not' => !$not);
break;
}
diff --git a/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php b/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php
index 10aaea0..28fd801 100644
--- a/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php
+++ b/lib/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php
@@ -24,6 +24,8 @@
class rcube_sieve_vacation extends rcube_sieve_engine
{
protected $error;
+ protected $script_name;
+ protected $vacation = array();
function actions()
{
@@ -34,6 +36,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$this->vacation_rule();
$this->vacation_post();
}
+
$this->plugin->add_label('vacation.saving');
$this->rc->output->add_handlers(array(
'vacationform' => array($this, 'vacation_form'),
@@ -43,15 +46,90 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$this->rc->output->send('managesieve.vacation');
}
- private function vacation_rule()
+ /**
+ * Find and load sieve script with/for vacation rule
+ *
+ * @return int Connection status: 0 on success, >0 on failure
+ */
+ protected function load_script()
{
- $this->vacation = array();
+ if ($this->script_name !== null) {
+ return 0;
+ }
+
+ $list = $this->list_scripts();
+ $master = $this->rc->config->get('managesieve_kolab_master');
+ $included = array();
+
+ $this->script_name = false;
+
+ // first try the active script(s)...
+ if (!empty($this->active)) {
+ // Note: there can be more than one active script on KEP:14-enabled server
+ foreach ($this->active as $script) {
+ if ($this->sieve->load($script)) {
+ foreach ($this->sieve->script->as_array() as $rule) {
+ if (!empty($rule['actions'])) {
+ if ($rule['actions'][0]['type'] == 'vacation') {
+ $this->script_name = $script;
+ return 0;
+ }
+ else if (empty($master) && $rule['actions'][0]['type'] == 'include') {
+ $included[] = $rule['actions'][0]['target'];
+ }
+ }
+ }
+ }
+ }
+
+ // ...else try scripts included in active script (not for KEP:14)
+ foreach ($included as $script) {
+ if ($this->sieve->load($script)) {
+ foreach ($this->sieve->script->as_array() as $rule) {
+ if (!empty($rule['actions']) && $rule['actions'][0]['type'] == 'vacation') {
+ $this->script_name = $script;
+ return 0;
+ }
+ }
+ }
+ }
+ }
+
+ // try all other scripts
+ if (!empty($list)) {
+ // else try included scripts
+ foreach (array_diff($list, $included, $this->active) as $script) {
+ if ($this->sieve->load($script)) {
+ foreach ($this->sieve->script->as_array() as $rule) {
+ if (!empty($rule['actions']) && $rule['actions'][0]['type'] == 'vacation') {
+ $this->script_name = $script;
+ return 0;
+ }
+ }
+ }
+ }
+
+ // none of the scripts contains existing vacation rule
+ // use any (first) active or just existing script (in that order)
+ if (!empty($this->active)) {
+ $this->sieve->load($this->script_name = $this->active[0]);
+ }
+ else {
+ $this->sieve->load($this->script_name = $list[0]);
+ }
+ }
+
+ return $this->sieve->error();
+ }
- if (empty($this->active)) {
+ private function vacation_rule()
+ {
+ if ($this->script_name === false || $this->script_name === null || !$this->sieve->load($this->script_name)) {
return;
}
- $list = array();
+ $list = array();
+ $active = in_array($this->script_name, $this->active);
// find (first) vacation rule
foreach ($this->script as $idx => $rule) {
@@ -68,14 +146,14 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$this->vacation = array_merge($rule['actions'][0], array(
'idx' => $idx,
- 'disabled' => $rule['disabled'],
+ 'disabled' => $rule['disabled'] || !$active,
'name' => $rule['name'],
'tests' => $rule['tests'],
'action' => $action ?: 'keep',
'target' => $target,
));
}
- else {
+ else if ($active) {
$list[$idx] = $rule['name'];
}
}
@@ -202,8 +280,6 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$vacation_tests = $this->rc->config->get('managesieve_vacation_test', array(array('test' => 'true')));
}
- // @TODO: handle situation when there's no active script
-
if (!$error) {
$rule = $this->vacation;
$rule['type'] = 'if';
@@ -212,6 +288,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$rule['tests'] = $vacation_tests;
$rule['join'] = $date_extension ? count($vacation_tests) > 1 : false;
$rule['actions'] = array($vacation_action);
+ $rule['after'] = $after;
if ($action && $action != 'keep') {
$rule['actions'][] = array(
@@ -221,40 +298,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
);
}
- // reset original vacation rule
- if (isset($this->vacation['idx'])) {
- $this->script[$this->vacation['idx']] = null;
- }
-
- // re-order rules if needed
- if (isset($after) && $after !== '') {
- // add at target position
- if ($after >= count($this->script) - 1) {
- $this->script[] = $rule;
- }
- else {
- $script = array();
-
- foreach ($this->script as $idx => $r) {
- if ($r) {
- $script[] = $r;
- }
-
- if ($idx == $after) {
- $script[] = $rule;
- }
- }
-
- $this->script = $script;
- }
- }
- else {
- array_unshift($this->script, $rule);
- }
-
- $this->sieve->script->content = array_values(array_filter($this->script));
-
- if ($this->save_script()) {
+ if ($this->save_vacation_script($rule)) {
$this->rc->output->show_message('managesieve.vacationsaved', 'confirmation');
$this->rc->output->send();
}
@@ -507,6 +551,87 @@ class rcube_sieve_vacation extends rcube_sieve_engine
}
/**
+ * Saves vacation script (adding some variables)
+ */
+ protected function save_vacation_script($rule)
+ {
+ // if script does not exist create a new one
+ if ($this->script_name === null || $this->script_name === false) {
+ $this->script_name = $this->rc->config->get('managesieve_script_name');
+ if (empty($this->script_name)) {
+ $this->script_name = 'roundcube';
+ }
+
+ $this->script = array($rule);
+ $script_active = false;
+ }
+ // if script exists
+ else {
+ $script_active = in_array($this->script_name, $this->active);
+
+ // re-order rules if needed
+ if (isset($rule['after']) && $rule['after'] !== '') {
+ // reset original vacation rule
+ if (isset($this->vacation['idx'])) {
+ $this->script[$this->vacation['idx']] = null;
+ }
+
+ // add at target position
+ if ($rule['after'] >= count($this->script) - 1) {
+ $this->script[] = $rule;
+ }
+ else {
+ $script = array();
+
+ foreach ($this->script as $idx => $r) {
+ if ($r) {
+ $script[] = $r;
+ }
+
+ if ($idx == $rule['after']) {
+ $script[] = $rule;
+ }
+ }
+
+ $this->script = $script;
+ }
+
+ $this->script = array_values(array_filter($this->script));
+ }
+ // update original vacation rule if it exists
+ else if (isset($this->vacation['idx'])) {
+ $this->script[$this->vacation['idx']] = $rule;
+ }
+ // otherwise put vacation rule on top
+ else {
+ array_unshift($this->script, $rule);
+ }
+
+ // if the script was not active, we need to de-activate
+ // all rules except the vacation rule, but only if it is not disabled
+ if (!$script_active && !$rule['disabled']) {
+ foreach ($this->script as $idx => $r) {
+ if (empty($r['actions']) || $r['actions'][0]['type'] != 'vacation') {
+ $this->script[$idx]['disabled'] = true;
+ }
+ }
+ }
+ }
+
+ $this->sieve->script->content = $this->script;
+
+ // save the script
+ $saved = $this->save_script($this->script_name);
+
+ // activate the script
+ if ($saved && !$script_active && !$rule['disabled']) {
+ $this->activate_script($this->script_name);
+ }
+
+ return $saved;
+ }
+
+ /**
* API: get vacation rule
*
* @return array Vacation rule information
@@ -684,8 +809,6 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$vacation_tests = $this->rc->config->get('managesieve_vacation_test', array(array('test' => 'true')));
}
- // @TODO: handle situation when there's no active script
-
$rule = $this->vacation;
$rule['type'] = 'if';
$rule['name'] = $rule['name'] ?: 'Out-of-Office';
@@ -702,16 +825,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
);
}
- // reset original vacation rule
- if (isset($this->vacation['idx'])) {
- $this->script[$this->vacation['idx']] = null;
- }
-
- array_unshift($this->script, $rule);
-
- $this->sieve->script->content = array_values(array_filter($this->script));
-
- return $this->save_script();
+ return $this->save_vacation_script($rule);
}
/**
diff --git a/lib/plugins/managesieve/localization/ar_SA.inc b/lib/plugins/managesieve/localization/ar_SA.inc
index 8e6d841..88e8957 100644
--- a/lib/plugins/managesieve/localization/ar_SA.inc
+++ b/lib/plugins/managesieve/localization/ar_SA.inc
@@ -15,19 +15,174 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/
*/
+$labels['filters'] = 'تصفية';
+$labels['managefilters'] = 'ادارة تصفية البريد الوارد';
+$labels['filtername'] = 'اسم التصفية';
+$labels['newfilter'] = 'تصفية جديدة';
+$labels['filteradd'] = 'اضافة تصفية';
+$labels['filterdel'] = 'حذف تصفية';
+$labels['moveup'] = 'نقل الى الاعلى ';
+$labels['movedown'] = 'نقل الى الاسفل';
+$labels['filterallof'] = 'مطابقة جميع القواعد التالية';
+$labels['filteranyof'] = 'مطابقة اي القواعد التالية';
+$labels['filterany'] = 'كل الرسائل';
+$labels['filtercontains'] = 'محتوى';
+$labels['filternotcontains'] = 'بدون محتوى';
+$labels['filteris'] = 'مساوي الى';
+$labels['filterisnot'] = 'لا يساوي';
+$labels['filterexists'] = 'موجود';
+$labels['filternotexists'] = 'غير موجود';
+$labels['filtermatches'] = 'يطابق التعبير';
+$labels['filternotmatches'] = 'لا يطابق التعبير';
+$labels['filterregex'] = 'يطابق التعبير العادي';
+$labels['filternotregex'] = 'لا يطابق التعبير العادي';
+$labels['filterunder'] = 'تحت';
+$labels['filterover'] = 'خلال';
+$labels['addrule'] = 'اضافة قاعدة';
+$labels['delrule'] = 'حذف قاعدة';
+$labels['messagemoveto'] = 'نقل الرساله الى ';
+$labels['messageredirect'] = 'إعادة توجيه الرسالة الى ';
+$labels['messagecopyto'] = 'نسخ الرسالة الى ';
+$labels['messagesendcopy'] = 'ارسال نسخة من الرسالة الى ';
+$labels['messagereply'] = 'الرد مع رسالة';
$labels['messagedelete'] = 'حذف الرسالة';
+$labels['messagediscard'] = 'تجاهل مع الرسالة';
+$labels['messagekeep'] = 'إبقاء الرسالة في علبة الوارد';
+$labels['messagesrules'] = 'للبريد الوارد:';
+$labels['messagesactions'] = '...تنفيذ المهام التالية:';
$labels['add'] = 'إضافة';
$labels['del'] = 'حذف';
+$labels['sender'] = 'المرسل';
$labels['recipient'] = 'مستلم';
+$labels['vacationaddr'] = 'عناوين البريد الالكتروني(ـة) الاضافية:';
+$labels['vacationdays'] = 'في الغالب كم رسالة ترسل (بالايام):';
+$labels['vacationinterval'] = 'كم عدد الرسائل المرسلة عادةً:';
+$labels['vacationreason'] = 'نص الرسالة (بسبب الاجازة):';
+$labels['vacationsubject'] = 'موضوع الرسالة:';
+$labels['days'] = 'ايام';
+$labels['seconds'] = 'ثواني';
+$labels['rulestop'] = 'ايقاف تقييم القواعد';
+$labels['enable'] = 'تفعيل/تعطيل';
+$labels['filterset'] = 'مجموعة مصفياة';
+$labels['filtersets'] = 'مجموعة تصفية';
+$labels['filtersetadd'] = 'اضافة مجموعة تصفية';
+$labels['filtersetdel'] = 'حذف مجموعة التصفية الحالية';
+$labels['filtersetact'] = 'تفعيل مجموعة التصفية الحالية ';
+$labels['filtersetdeact'] = 'تعطيل مجموعة التصفية الحالية ';
+$labels['filterdef'] = 'تعريف التصفية ';
+$labels['filtersetname'] = 'اسم مجموعة التصفية';
+$labels['newfilterset'] = 'مجموعة تصفية جديدة';
$labels['active'] = 'نشط';
+$labels['none'] = 'لاشيء';
+$labels['fromset'] = 'من مجموعة';
+$labels['fromfile'] = 'من ملف';
+$labels['filterdisabled'] = 'تعطيل التصفية';
+$labels['countisgreaterthan'] = 'العدد اكبر من ';
+$labels['countisgreaterthanequal'] = 'العدد اكبر من او يساوي ';
+$labels['countislessthan'] = 'العدد اقل من ';
+$labels['countislessthanequal'] = 'العدد اقل من او يساوي';
+$labels['countequals'] = 'العدد يساوي ';
+$labels['countnotequals'] = 'العدد لا يساوي';
+$labels['valueisgreaterthan'] = 'القيمة اكبر من ';
+$labels['valueisgreaterthanequal'] = 'القيمة اكبر من او تساوي';
+$labels['valueislessthan'] = 'القيمة اقل من ';
+$labels['valueislessthanequal'] = 'القيمة اقل من او يساوي';
+$labels['valueequals'] = 'القيمة تساوي';
+$labels['valuenotequals'] = 'القيمة لا تساوي';
+$labels['setflags'] = 'ضع وسم على هذه الرسالة ';
+$labels['addflags'] = 'اضف وسم على هذه الرسالة ';
+$labels['removeflags'] = 'احذف الوسم الموجود على هذه الرسالة ';
+$labels['flagread'] = 'قراءة ';
$labels['flagdeleted'] = 'محذوف';
+$labels['flaganswered'] = 'مجابة';
$labels['flagflagged'] = 'موسوم';
$labels['flagdraft'] = 'مسودة';
+$labels['setvariable'] = 'تعيين متغير';
+$labels['setvarname'] = 'اسم المتغير:';
+$labels['setvarvalue'] = 'قيمة المتغير:';
+$labels['setvarmodifiers'] = 'تعديلات:';
+$labels['varquotewildcard'] = 'أقتبس أحرف خاصة';
+$labels['varlength'] = 'الطول';
+$labels['notify'] = 'ارسل تنبية';
+$labels['notifyimportance'] = 'اهمية:';
$labels['notifyimportancelow'] = 'منخفض';
$labels['notifyimportancenormal'] = 'عادي';
$labels['notifyimportancehigh'] = 'مرتفع';
+$labels['filtercreate'] = 'انشئ تصفية';
+$labels['usedata'] = 'استخدم البيانات التالية في الفلتر:';
+$labels['nextstep'] = 'الخطوة التالية';
+$labels['...'] = '...';
+$labels['currdate'] = 'التاريخ الحالي';
+$labels['datetest'] = 'التاريخ';
+$labels['dateheader'] = 'الراس:';
+$labels['year'] = 'السنة';
+$labels['month'] = 'شهر';
+$labels['day'] = 'يوم';
+$labels['date'] = 'التاريخ (yyyy-mm-dd)';
+$labels['julian'] = 'التاريخ (يوليان)';
+$labels['hour'] = 'ساعات';
+$labels['minute'] = 'دقائق';
+$labels['second'] = 'ثواني';
+$labels['time'] = 'الوقت (hh:mm:ss)';
+$labels['iso8601'] = 'التاريخ (ISO8601)';
+$labels['std11'] = 'التاريخ (RFC2822)';
+$labels['zone'] = 'المنطقة الزمنية';
+$labels['weekday'] = 'ايام العمل (0-6)';
$labels['advancedopts'] = 'خيارات متقدّمة';
+$labels['body'] = 'نص';
$labels['address'] = 'العنوان';
+$labels['modifier'] = 'تعديل:';
+$labels['text'] = 'نص';
+$labels['contenttype'] = 'نوع المحتوى';
+$labels['modtype'] = 'نوع:';
$labels['allparts'] = 'الكل';
$labels['domain'] = 'المجال';
+$labels['localpart'] = 'الجزء المحلي';
+$labels['user'] = 'مستخدم';
+$labels['detail'] = 'تفاصيل';
+$labels['default'] = 'افتراضي';
+$labels['index'] = 'الوارد:';
+$labels['indexlast'] = 'تراجع';
+$labels['vacation'] = 'اجازة ';
+$labels['vacation.advanced'] = 'اعدادات متقدمة';
+$labels['vacation.subject'] = 'موضوع';
+$labels['vacation.body'] = 'محتوى ';
+$labels['vacation.status'] = 'الحالة ';
+$labels['vacation.on'] = 'تشغيل';
+$labels['vacation.off'] = 'ايقاف';
+$labels['vacation.addresses'] = 'عناوينني الاضافية';
+$labels['vacation.saving'] = 'يتم حفظ البيانات...';
+$messages['filterunknownerror'] = 'خطا غير معروف من الخادم.';
+$messages['filterconnerror'] = 'لا يمكن الاتصال بالخادم.';
+$messages['filterdeleteerror'] = 'لا يمكن حذف التصفية.خطا في الخادم.';
+$messages['filterdeleted'] = 'تم حذف التصفية بنجاح.';
+$messages['filtersaved'] = 'تم حفظ التصفية بنجاح.';
+$messages['filtersaveerror'] = 'لا يمكن حفظ التصفية.خطا في الخادم.';
+$messages['filterdeleteconfirm'] = 'هل تريد فعلاً حذف التصفية المحددة؟';
+$messages['ruledeleteconfirm'] = 'هل تريد فعلاً حذف القواعد المحددة؟';
+$messages['actiondeleteconfirm'] = 'هل تريد فعلاً حذف الاجراءات المحددة؟';
+$messages['forbiddenchars'] = 'احرف محظورة في هذا الحقل.';
+$messages['cannotbeempty'] = 'لا يمكن ترك الحقل فارغاً';
+$messages['ruleexist'] = 'اسم هذة التصفية موجود مسبقاً';
+$messages['setactivateerror'] = 'لا يمكن تفعيل مجموعة التصفية المحددة.خطا في الخادم.';
+$messages['setdeactivateerror'] = 'لا يمكن تعطيل مجموعة التصفية المحددة.خطا في الخادم.';
+$messages['setdeleteerror'] = 'لا يمكن حذف مجموعة التصفية المحددة.خطا في الخادم.';
+$messages['setactivated'] = 'تم تفعيل مجموعة التصفية بنجاح.';
+$messages['setdeactivated'] = 'تم تعطيل مجموعة التصفية بنجاح.';
+$messages['setdeleted'] = 'تم حذف مجموعة التصفية بنجاح.';
+$messages['setdeleteconfirm'] = 'هل تريد فعلاً حذف مجموعات التصفية المحددة؟';
+$messages['setcreateerror'] = 'لا يمكن انشاء مجموعة تصفية.خطا في الخادم.';
+$messages['setcreated'] = 'تم انشاء مجموعة التصفية بنجاح.';
+$messages['activateerror'] = 'لا يمكن تمكين التصفية(ـات) المحددة .خطا في الخادم.';
+$messages['deactivateerror'] = 'لا يمكن تعطيل التصفية(ـات) المحددة .خطا في الخادم.';
+$messages['deactivated'] = 'تم تعطيل المصفيـ(ـاة) بنجاح.';
+$messages['activated'] = 'تم تفعيل المصفيـ(ـاة) بنجاح.';
+$messages['moved'] = 'تم نقل التصفية بنجاح.';
+$messages['moveerror'] = 'لا يمكن نقل التصفياة المحددة.خطا في الخادم.';
+$messages['nametoolong'] = 'الإسم طويل جداً';
+$messages['setexist'] = 'المجموعة موجودة مسبقا.';
+$messages['nodata'] = 'يجب تحديد موضع واحد على الأقل!';
+$messages['invaliddateformat'] = 'تاريخ غير صحيح او يوجد خطا في تنسق اجزاء التاريخ';
+$messages['saveerror'] = 'لا يمكن حفظ البيانات. خطا في الخادم.';
+$messages['vacationsaved'] = 'تم حفظ تاريخ الاجازة بنجاح.';
?>
diff --git a/lib/plugins/managesieve/localization/az_AZ.inc b/lib/plugins/managesieve/localization/az_AZ.inc
index d692b96..8aec7e3 100644
--- a/lib/plugins/managesieve/localization/az_AZ.inc
+++ b/lib/plugins/managesieve/localization/az_AZ.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Qəbul edən';
$labels['vacationaddr'] = 'Mənim əlavə e-poçt ünvan(lar)ım: ';
$labels['vacationdays'] = 'Məktub neçə müddətdən bir göndərilsin (gündə):';
$labels['vacationinterval'] = 'Məktublar nə qədər sıx göndərilsin:';
-$labels['days'] = 'günlər';
-$labels['seconds'] = 'saniyələr';
$labels['vacationreason'] = 'Məktubun mətni (səbəb yoxdur):';
$labels['vacationsubject'] = 'Məktubun mövzusu:';
+$labels['days'] = 'günlər';
+$labels['seconds'] = 'saniyələr';
$labels['rulestop'] = 'Yerinə yetirməyi dayandır';
$labels['enable'] = 'Yandır/Söndür';
$labels['filterset'] = 'Süzgəc dəsti';
@@ -108,10 +108,6 @@ $labels['varupperfirst'] = 'yuxarı registrdə birinci simvol';
$labels['varquotewildcard'] = 'dırnaq simvolu';
$labels['varlength'] = 'uzunluq';
$labels['notify'] = 'Bildiriş göndər';
-$labels['notifyaddress'] = 'Poçt ünvanı:';
-$labels['notifybody'] = 'Bildiriş mətni';
-$labels['notifysubject'] = 'Bildiriş mövzusu';
-$labels['notifyfrom'] = 'Bildirişi yolla:';
$labels['notifyimportance'] = 'Vaciblik';
$labels['notifyimportancelow'] = 'aşağı';
$labels['notifyimportancenormal'] = 'normal';
diff --git a/lib/plugins/managesieve/localization/be_BE.inc b/lib/plugins/managesieve/localization/be_BE.inc
index 29c97ad..5a691cd 100644
--- a/lib/plugins/managesieve/localization/be_BE.inc
+++ b/lib/plugins/managesieve/localization/be_BE.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Каму';
$labels['vacationaddr'] = 'Дадатковы(я) адрасы эл. пошты:';
$labels['vacationdays'] = 'Як часта дасылаць паведамленні (у днях):';
$labels['vacationinterval'] = 'Як часта дасылаць паведамленні:';
-$labels['days'] = 'дзён';
-$labels['seconds'] = 'секунд';
$labels['vacationreason'] = 'Цела паведамлення (прычына вакацый):';
$labels['vacationsubject'] = 'Тэма паведамлення:';
+$labels['days'] = 'дзён';
+$labels['seconds'] = 'секунд';
$labels['rulestop'] = 'Перастаць выконваць праверку правілаў';
$labels['enable'] = 'Уключыць/Выключыць';
$labels['filterset'] = 'Набор фільтраў';
@@ -108,10 +108,6 @@ $labels['varupperfirst'] = 'першы знак у верхнім рэгістр
$labels['varquotewildcard'] = 'службовыя знакі забіраць у апострафы';
$labels['varlength'] = 'даўжыня';
$labels['notify'] = 'Паслаць апавяшчэнне';
-$labels['notifyaddress'] = 'На эл. адрас:';
-$labels['notifybody'] = 'Цела апавяшчэння:';
-$labels['notifysubject'] = 'Тэма апавяшчэння:';
-$labels['notifyfrom'] = 'Адпраўнік апавяшчэння:';
$labels['notifyimportance'] = 'Важнасць:';
$labels['notifyimportancelow'] = 'нізкая';
$labels['notifyimportancenormal'] = 'звычайная';
diff --git a/lib/plugins/managesieve/localization/bg_BG.inc b/lib/plugins/managesieve/localization/bg_BG.inc
index c9d06d2..432cb4f 100644
--- a/lib/plugins/managesieve/localization/bg_BG.inc
+++ b/lib/plugins/managesieve/localization/bg_BG.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Получател';
$labels['vacationaddr'] = 'Мои допълнителни e-mail адреси:';
$labels['vacationdays'] = 'Колко често да праща писма (в дни):';
$labels['vacationinterval'] = 'Колко често да праща писма:';
-$labels['days'] = 'дни';
-$labels['seconds'] = 'секунди';
$labels['vacationreason'] = 'Текст на писмото (причина за ваканцията)';
$labels['vacationsubject'] = 'Заглавие на писмото';
+$labels['days'] = 'дни';
+$labels['seconds'] = 'секунди';
$labels['rulestop'] = 'Спри проверка на други условия';
$labels['enable'] = 'Включи/Изключи';
$labels['filterset'] = 'Набор филтри';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'първи знак с главна буква';
$labels['varquotewildcard'] = 'цитиране на специални знаци';
$labels['varlength'] = 'дължина';
$labels['notify'] = 'Изпрати известие';
-$labels['notifyaddress'] = 'До e-mail адрес:';
-$labels['notifybody'] = 'Основен текст на известието:';
-$labels['notifysubject'] = 'Заглавие на известието:';
-$labels['notifyfrom'] = 'Подател на известието:';
+$labels['notifytarget'] = 'Известие към:';
+$labels['notifymessage'] = 'Съдържание на известие (опционално):';
+$labels['notifyoptions'] = 'Опции на известие (опционално):';
+$labels['notifyfrom'] = 'Известие от (опционално):';
$labels['notifyimportance'] = 'Приоритет:';
$labels['notifyimportancelow'] = 'нисък';
$labels['notifyimportancenormal'] = 'нормален';
$labels['notifyimportancehigh'] = 'висок';
+$labels['notifymethodmailto'] = 'Ел. поща';
+$labels['notifymethodtel'] = 'Телефон';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Използвай за нов филтър';
$labels['usedata'] = 'Използвай следните данни във филтъра:';
$labels['nextstep'] = 'Следваща стъпка';
@@ -157,6 +160,18 @@ $labels['asciicasemap'] = 'без значение малки/големи бу
$labels['asciinumeric'] = 'цифрово';
$labels['index'] = 'индекс:';
$labels['indexlast'] = 'наобратно';
+$labels['vacation'] = 'Отпуск';
+$labels['vacation.reply'] = 'Писмо отговор';
+$labels['vacation.advanced'] = 'Разширени настройки';
+$labels['vacation.subject'] = 'Относно';
+$labels['vacation.body'] = 'Съдържание';
+$labels['vacation.status'] = 'Статус';
+$labels['vacation.on'] = 'Вкл.';
+$labels['vacation.off'] = 'Изкл.';
+$labels['vacation.addresses'] = 'Моите допълнителни адреси';
+$labels['vacation.interval'] = 'Интервал на отговор';
+$labels['vacation.after'] = 'Постави правило за отпуск след';
+$labels['vacation.saving'] = 'Запис на данни...';
$messages['filterunknownerror'] = 'Неизвестна сървърна грешка.';
$messages['filterconnerror'] = 'Неуспешно свързване с managesieve сървъра.';
$messages['filterdeleteerror'] = 'Невъзможно изтриване на филтъра. Възникна сървърна грешка.';
@@ -189,4 +204,6 @@ $messages['namereserved'] = 'Резервирано име.';
$messages['setexist'] = 'Вече има такъв набор филтри.';
$messages['nodata'] = 'Поне една позиция трябва да е избрана!';
$messages['invaliddateformat'] = 'невалидна дата или формат на част от дата';
+$messages['saveerror'] = 'Невъзможен запис на данни. Грешка при достъп до сървър.';
+$messages['vacationsaved'] = 'Данните за отпуск са записани успешно.';
?>
diff --git a/lib/plugins/managesieve/localization/bs_BA.inc b/lib/plugins/managesieve/localization/bs_BA.inc
index bee1aba..84a85a3 100644
--- a/lib/plugins/managesieve/localization/bs_BA.inc
+++ b/lib/plugins/managesieve/localization/bs_BA.inc
@@ -165,9 +165,8 @@ $labels['vacation.reply'] = 'Poruka sa odgovorom';
$labels['vacation.advanced'] = 'Napredmen postavke';
$labels['vacation.subject'] = 'Naslov';
$labels['vacation.body'] = 'Tijelo';
-$labels['vacation.dates'] = 'Vrijeme odmora';
-$labels['vacation.from'] = 'Od:';
-$labels['vacation.to'] = 'Do:';
+$labels['vacation.start'] = 'Početak odmora';
+$labels['vacation.end'] = 'Kraj odmora';
$labels['vacation.status'] = 'Status';
$labels['vacation.on'] = 'Uključeno';
$labels['vacation.off'] = 'Isključeno';
diff --git a/lib/plugins/managesieve/localization/ca_ES.inc b/lib/plugins/managesieve/localization/ca_ES.inc
index 5e54c6a..0dc6863 100644
--- a/lib/plugins/managesieve/localization/ca_ES.inc
+++ b/lib/plugins/managesieve/localization/ca_ES.inc
@@ -24,7 +24,7 @@ $labels['filterdel'] = 'Suprimeix el filtre';
$labels['moveup'] = 'Mou amunt';
$labels['movedown'] = 'Mou avall';
$labels['filterallof'] = 'que coincideixi amb totes les regles següents';
-$labels['filteranyof'] = 'que no coincideixi amb cap de les regles següents';
+$labels['filteranyof'] = 'que coincideixi amb qualsevol de les regles següents';
$labels['filterany'] = 'tots els missatges';
$labels['filtercontains'] = 'conté';
$labels['filternotcontains'] = 'no conté';
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Destinatari';
$labels['vacationaddr'] = 'Les meves adreces de correu addicionals:';
$labels['vacationdays'] = 'Cada quan enviar un missatge (en dies):';
$labels['vacationinterval'] = 'Amb quina freqüència s\'han d\'enviar els missatges:';
-$labels['days'] = 'dies';
-$labels['seconds'] = 'segons';
$labels['vacationreason'] = 'Cos del missatge (raó de l\'absència):';
$labels['vacationsubject'] = 'Assumpte del missatge:';
+$labels['days'] = 'dies';
+$labels['seconds'] = 'segons';
$labels['rulestop'] = 'Deixa d\'avaluar regles';
$labels['enable'] = 'Habilita/Deshabilita';
$labels['filterset'] = 'Conjunt de filtres';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'el primer caràcter en majúscula';
$labels['varquotewildcard'] = 'engloba els caràcters especials amb cometes';
$labels['varlength'] = 'llargada';
$labels['notify'] = 'Envia notificació';
-$labels['notifyaddress'] = 'A l\'adreça de correu electrònic:';
-$labels['notifybody'] = 'Cos de la notificació:';
-$labels['notifysubject'] = 'Assumpte de la notificació:';
-$labels['notifyfrom'] = 'Remitent de la notificació:';
+$labels['notifytarget'] = 'Objectiu de la notificació:';
+$labels['notifymessage'] = 'Missatge de notificació (opcional):';
+$labels['notifyoptions'] = 'Opcions de notificació (opcional):';
+$labels['notifyfrom'] = 'Remitent de la notificació (opcional):';
$labels['notifyimportance'] = 'Importància:';
$labels['notifyimportancelow'] = 'baixa';
$labels['notifyimportancenormal'] = 'normal';
$labels['notifyimportancehigh'] = 'alta';
+$labels['notifymethodmailto'] = 'Correu electrònic';
+$labels['notifymethodtel'] = 'Telèfon';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Crea filtre';
$labels['usedata'] = 'Fes servir les següents dades al filtre:';
$labels['nextstep'] = 'Següent pas';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'No distingeix entre majúscules i minúscules (ascii
$labels['asciinumeric'] = 'numèric (ascii-numeric)';
$labels['index'] = 'índex:';
$labels['indexlast'] = 'cap enrere';
+$labels['vacation'] = 'Vacances';
+$labels['vacation.reply'] = 'Missatge de resposta';
+$labels['vacation.advanced'] = 'Paràmetres avançats';
+$labels['vacation.subject'] = 'Assumpte';
+$labels['vacation.body'] = 'Cos';
+$labels['vacation.start'] = 'Inici de vacances';
+$labels['vacation.end'] = 'Finalització de vacances';
+$labels['vacation.status'] = 'Estat';
+$labels['vacation.on'] = 'Activat';
+$labels['vacation.off'] = 'Desactivat';
+$labels['vacation.addresses'] = 'Les meves adreces addicionals:';
+$labels['vacation.interval'] = 'Interval de resposta';
+$labels['vacation.after'] = 'Posa la regla de vacances després';
+$labels['vacation.saving'] = 'S\'estan desant les dades...';
+$labels['vacation.action'] = 'Acció pel missatge entrant';
+$labels['vacation.keep'] = 'Conserva';
+$labels['vacation.discard'] = 'Descarta';
+$labels['vacation.redirect'] = 'Redirigeix cap a';
+$labels['vacation.copy'] = 'Envia còpia a';
+$labels['arialabelfiltersetactions'] = 'Accions pel conjunt de filtres';
+$labels['arialabelfilteractions'] = 'Accions del filtre';
+$labels['arialabelfilterform'] = 'Propietats del filtre';
+$labels['ariasummaryfilterslist'] = 'Llistat de filtres';
+$labels['ariasummaryfiltersetslist'] = 'Llistat de conjunts de filtres';
+$labels['filterstitle'] = 'Edita els filtres pels missatges entrants';
+$labels['vacationtitle'] = 'Edita la norma "fora de l\'oficina"';
$messages['filterunknownerror'] = 'Error desconegut al servidor.';
$messages['filterconnerror'] = 'No s\'ha pogut connectar al servidor.';
$messages['filterdeleteerror'] = 'No s\'ha pogut suprimir el filtre. Hi ha hagut un error al servidor.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Nom reservat.';
$messages['setexist'] = 'El conjunt ja existeix.';
$messages['nodata'] = 'S\'ha de seleccionar com a mínim una posició!';
$messages['invaliddateformat'] = 'data no vàlida o format no vàlid';
+$messages['saveerror'] = 'No s\'han pogut desar les dades. Hi ha hagut un error al servidor.';
+$messages['vacationsaved'] = 'Les dades de les vacances s\'han desat correctament.';
+$messages['emptyvacationbody'] = 'És obligatori definir el cos del missatge de vacances';
?>
diff --git a/lib/plugins/managesieve/localization/cs_CZ.inc b/lib/plugins/managesieve/localization/cs_CZ.inc
index d304da6..6db6bac 100644
--- a/lib/plugins/managesieve/localization/cs_CZ.inc
+++ b/lib/plugins/managesieve/localization/cs_CZ.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Příjemce';
$labels['vacationaddr'] = 'Moje další e-mailová adresa(y):';
$labels['vacationdays'] = 'Počet dnů mezi automatickými odpověďmi:';
$labels['vacationinterval'] = 'Prodleva mezi automatickými odpověďmi:';
-$labels['days'] = 'dnů';
-$labels['seconds'] = 'sekund';
$labels['vacationreason'] = 'Zpráva (Důvod nepřítomnosti):';
$labels['vacationsubject'] = 'Předmět zprávy:';
+$labels['days'] = 'dnů';
+$labels['seconds'] = 'sekund';
$labels['rulestop'] = 'Zastavit pravidla';
$labels['enable'] = 'Zapnout/Vypnout';
$labels['filterset'] = 'Sada filtrů';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'první písmeno velké';
$labels['varquotewildcard'] = 'uvodit speciální znaky uvozovkama';
$labels['varlength'] = 'délka';
$labels['notify'] = 'Odeslat oznámení';
-$labels['notifyaddress'] = 'Na emailovou adresu:';
-$labels['notifybody'] = 'Zpráva oznámení:';
-$labels['notifysubject'] = 'Předmět oznámení:';
-$labels['notifyfrom'] = 'Odesílatel oznámení:';
+$labels['notifytarget'] = 'Cíl oznámení:';
+$labels['notifymessage'] = 'Zpráva oznámení (nepovinné):';
+$labels['notifyoptions'] = 'Možnosti oznámení (nepovinné):';
+$labels['notifyfrom'] = 'Odesílatel oznámení (nepovinné):';
$labels['notifyimportance'] = 'Důležitost:';
$labels['notifyimportancelow'] = 'nízká';
$labels['notifyimportancenormal'] = 'normální';
$labels['notifyimportancehigh'] = 'vysoká';
+$labels['notifymethodmailto'] = 'E-mail';
+$labels['notifymethodtel'] = 'Telefon';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Vytvořit filtr';
$labels['usedata'] = 'Použít následující údaje ve filtru:';
$labels['nextstep'] = 'Další krok';
@@ -157,6 +160,26 @@ $labels['asciicasemap'] = 'necitlivé na velikost písmen (ascii-casemap)';
$labels['asciinumeric'] = 'číslené (ascii-numeric)';
$labels['index'] = 'index:';
$labels['indexlast'] = 'pozpátku';
+$labels['vacation'] = 'Dovolená';
+$labels['vacation.reply'] = 'Odpověd';
+$labels['vacation.advanced'] = 'Pokročilá nastavení';
+$labels['vacation.subject'] = 'Předmět';
+$labels['vacation.body'] = 'Tělo';
+$labels['vacation.start'] = 'Začátek dovolené';
+$labels['vacation.end'] = 'Konec dovolené';
+$labels['vacation.status'] = 'Stav';
+$labels['vacation.on'] = 'Zapnuto';
+$labels['vacation.off'] = 'Vypnuto';
+$labels['vacation.addresses'] = 'Moje další adresy:';
+$labels['vacation.interval'] = 'Doba mezi odpověďmi';
+$labels['vacation.after'] = 'Uložit pravidlo o dovolené za';
+$labels['vacation.saving'] = 'Ukládám data...';
+$labels['vacation.keep'] = 'Zachovat';
+$labels['vacation.discard'] = 'Zrušit';
+$labels['vacation.copy'] = 'Odeslat kopii zprávy na';
+$labels['arialabelfilterform'] = 'Vlastnosti filtru';
+$labels['ariasummaryfilterslist'] = 'Seznam filtrů';
+$labels['ariasummaryfiltersetslist'] = 'Seznam sad filtrů';
$messages['filterunknownerror'] = 'Neznámá chyba serveru';
$messages['filterconnerror'] = 'Nebylo možné se připojit k sieve serveru';
$messages['filterdeleteerror'] = 'Nebylo možné smazat filtr. Došlo k chybě serveru.';
@@ -180,7 +203,7 @@ $messages['setcreateerror'] = 'Nelze vytvořit sadu filtrů. Došlo k chybě ser
$messages['setcreated'] = 'Sada filtrů úspěšně vytvořena.';
$messages['activateerror'] = 'Nelze zapnout vybrané filtr/y. Došlo k chybě serveru.';
$messages['deactivateerror'] = 'Nelze vypnout vybrané filtr/y. Došlo k chybě serveru.';
-$messages['deactivated'] = 'Filtr/y úspěšne vypnuty.';
+$messages['deactivated'] = 'Filtr(y) úspěšně vypnuty.';
$messages['activated'] = 'Filtr/y úspěšně zapnuty.';
$messages['moved'] = 'Filtr byl úspěšně přesunut.';
$messages['moveerror'] = 'Nelze přesunout vybraný filtr. Došlo k chybě serveru.';
@@ -189,4 +212,7 @@ $messages['namereserved'] = 'Vyhrazený název.';
$messages['setexist'] = 'Sada již existuje.';
$messages['nodata'] = 'Musí být vybrána minimálně jedna pozice!';
$messages['invaliddateformat'] = 'Neplatné datum nebo část data';
+$messages['saveerror'] = 'Nebylo možné uložit data. Došlo k chybě serveru.';
+$messages['vacationsaved'] = 'Data o dovolené byla uložena.';
+$messages['emptyvacationbody'] = 'Tělo zprávy';
?>
diff --git a/lib/plugins/managesieve/localization/cy_GB.inc b/lib/plugins/managesieve/localization/cy_GB.inc
index a10205d..8d8d1a5 100644
--- a/lib/plugins/managesieve/localization/cy_GB.inc
+++ b/lib/plugins/managesieve/localization/cy_GB.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Derbynnwr';
$labels['vacationaddr'] = 'Fy nghyfeiriad(au) ebost ychwanegol:';
$labels['vacationdays'] = 'Pa mor aml i ddanfon negeseuon (mewn dyddiau):';
$labels['vacationinterval'] = 'Pa mor aml i ddanfon negeseuon:';
-$labels['days'] = 'dyddiau';
-$labels['seconds'] = 'eiliadau';
$labels['vacationreason'] = 'Corff neges (rheswm ar wyliau):';
$labels['vacationsubject'] = 'Pwnc neges:';
+$labels['days'] = 'dyddiau';
+$labels['seconds'] = 'eiliadau';
$labels['rulestop'] = 'Stopio gwerthuso rheolau';
$labels['enable'] = 'Galluogi/Analluogi';
$labels['filterset'] = 'Set hidlyddion';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'llythyren gyntaf yn briflythyren';
$labels['varquotewildcard'] = 'dyfynnu nodau arbennig';
$labels['varlength'] = 'hyd';
$labels['notify'] = 'Anfon hysbysiad';
-$labels['notifyaddress'] = 'I gyfeiriad ebost:';
-$labels['notifybody'] = 'Corff hysbysiad:';
-$labels['notifysubject'] = 'Pwnc hysbysiad:';
-$labels['notifyfrom'] = 'Anfonwr hysbysiad:';
+$labels['notifytarget'] = 'Target hysbysu:';
+$labels['notifymessage'] = 'Neges hysbysu (dewisol):';
+$labels['notifyoptions'] = 'Dewisiadau hysbysu (dewisol):';
+$labels['notifyfrom'] = 'Anfonwr hysbysiad (dewisol):';
$labels['notifyimportance'] = 'Pwysigrwydd:';
$labels['notifyimportancelow'] = 'isel';
$labels['notifyimportancenormal'] = 'arferol';
$labels['notifyimportancehigh'] = 'uchel';
+$labels['notifymethodmailto'] = 'Ebost';
+$labels['notifymethodtel'] = 'Ffôn';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Creu hidlydd';
$labels['usedata'] = 'Defnyddio\'r wybodaeth ganlynol yn yr hidlydd:';
$labels['nextstep'] = 'Cam nesaf';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'maint llythrennau (ascii-casemap)';
$labels['asciinumeric'] = 'rhifau (ascii-numeric)';
$labels['index'] = 'mynegai:';
$labels['indexlast'] = 'o chwith';
+$labels['vacation'] = 'Gwyliau';
+$labels['vacation.reply'] = 'Neges ymateb';
+$labels['vacation.advanced'] = 'Gosodiadau uwch';
+$labels['vacation.subject'] = 'Pwnc';
+$labels['vacation.body'] = 'Corff';
+$labels['vacation.start'] = 'Dechrau gwyliau';
+$labels['vacation.end'] = 'Diwedd gwyliau';
+$labels['vacation.status'] = 'Statws';
+$labels['vacation.on'] = 'Ymlaen';
+$labels['vacation.off'] = 'I ffwrdd';
+$labels['vacation.addresses'] = 'Fy nghyfeiriadau ychwanegol';
+$labels['vacation.interval'] = 'Cyfnod ymateb';
+$labels['vacation.after'] = 'Rhoi rheol gwyliau ar ôl';
+$labels['vacation.saving'] = 'Yn cadw\'r data...';
+$labels['vacation.action'] = 'Gweithred neges i fewn';
+$labels['vacation.keep'] = 'Cadw';
+$labels['vacation.discard'] = 'Gwaredu';
+$labels['vacation.redirect'] = 'Ailgyfeirio i';
+$labels['vacation.copy'] = 'Danfon copi i';
+$labels['arialabelfiltersetactions'] = 'Gweithrediadau set hidlydd';
+$labels['arialabelfilteractions'] = 'Gweithrediadau hidlydd';
+$labels['arialabelfilterform'] = 'Nodweddion hidlydd';
+$labels['ariasummaryfilterslist'] = 'Rhestr o hidlyddion';
+$labels['ariasummaryfiltersetslist'] = 'Rhestr o setiau hidlyddion';
+$labels['filterstitle'] = 'Golygu hidlyddion ebost i fewn';
+$labels['vacationtitle'] = 'Golygu rheol allan-o\'r-swyddfa';
$messages['filterunknownerror'] = 'Gwall gweinydd anhysbys.';
$messages['filterconnerror'] = 'Methwyd cysylltu a\'r gweinydd.';
$messages['filterdeleteerror'] = 'Methwyd dileu hidlydd. Cafwydd gwall gweinydd.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Enw neilltuedig.';
$messages['setexist'] = 'Mae\'r set yn bodoli\'n barod.';
$messages['nodata'] = 'Rhaid dewis o leia un safle!';
$messages['invaliddateformat'] = 'Dyddiad neu fformat dyddiad annilys';
+$messages['saveerror'] = 'Methwyd cadw\'r data. Cafwyd gwall gweinydd.';
+$messages['vacationsaved'] = 'Cadwyd y data gwyliau yn llwyddiannus.';
+$messages['emptyvacationbody'] = 'Mae angen rhoi corff y neges wyliau!';
?>
diff --git a/lib/plugins/managesieve/localization/da_DK.inc b/lib/plugins/managesieve/localization/da_DK.inc
index b240741..ebf1cb0 100644
--- a/lib/plugins/managesieve/localization/da_DK.inc
+++ b/lib/plugins/managesieve/localization/da_DK.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Modtager';
$labels['vacationaddr'] = 'Min(e) yderligere email-adresse(r):';
$labels['vacationdays'] = 'Hvor tit skal besked sendes (i dage):';
$labels['vacationinterval'] = 'Hvor tit skal besked sendes:';
-$labels['days'] = 'dage';
-$labels['seconds'] = 'sekunder';
$labels['vacationreason'] = 'Besked (ved ferie):';
$labels['vacationsubject'] = 'Besked emne:';
+$labels['days'] = 'dage';
+$labels['seconds'] = 'sekunder';
$labels['rulestop'] = 'Stop behandling af regler';
$labels['enable'] = 'Aktivér/Deaktivér';
$labels['filterset'] = 'Filter sæt';
@@ -108,14 +108,13 @@ $labels['varupperfirst'] = 'Første bogstav stort';
$labels['varquotewildcard'] = 'Sæt specialle tegn i citationstegn ';
$labels['varlength'] = 'længde';
$labels['notify'] = 'Send meddelelse';
-$labels['notifyaddress'] = 'Til e-mail adresse:';
-$labels['notifybody'] = 'meddelelses indhold:';
-$labels['notifysubject'] = 'Meddelelses emne:';
-$labels['notifyfrom'] = 'Meddelelses afsender:';
$labels['notifyimportance'] = 'Vigtighed:';
$labels['notifyimportancelow'] = 'lav';
$labels['notifyimportancenormal'] = 'normal';
$labels['notifyimportancehigh'] = 'høj';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Telefon';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Opret filter';
$labels['usedata'] = 'Brug følgende data i filteret:';
$labels['nextstep'] = 'Næste trin';
@@ -157,6 +156,18 @@ $labels['asciicasemap'] = 'store og små bogstaver (ascii-bogstaver)';
$labels['asciinumeric'] = 'numerisk (ascii-numerisk)';
$labels['index'] = 'indeks:';
$labels['indexlast'] = 'baglends';
+$labels['vacation'] = 'Ferie';
+$labels['vacation.reply'] = 'Svar besked';
+$labels['vacation.advanced'] = 'Avanceret indstillinger ';
+$labels['vacation.subject'] = 'Emne';
+$labels['vacation.start'] = 'Ferie star';
+$labels['vacation.end'] = 'Ferie slut';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.saving'] = 'Gemmer data...';
+$labels['vacation.keep'] = 'Behold';
+$labels['vacation.discard'] = 'Kasser';
+$labels['vacation.redirect'] = 'Omdiriger til ';
+$labels['vacation.copy'] = 'Send kopi til';
$messages['filterunknownerror'] = 'Ukendt server fejl.';
$messages['filterconnerror'] = 'Kan ikke forbinde til server.';
$messages['filterdeleteerror'] = 'Kunne ikke slette filter. Serverfejl opstod.';
@@ -189,4 +200,6 @@ $messages['namereserved'] = 'Reserveret navn.';
$messages['setexist'] = 'Filterv sæt eksisterer allerede';
$messages['nodata'] = 'Mindst en position skal vælges!';
$messages['invaliddateformat'] = 'Ugyldigt dato- eller tidsformat';
+$messages['saveerror'] = 'Kunne ikke gemme data. Server fejl';
+$messages['vacationsaved'] = 'Ferie data gemt';
?>
diff --git a/lib/plugins/managesieve/localization/de_CH.inc b/lib/plugins/managesieve/localization/de_CH.inc
index 234f313..13a4a67 100644
--- a/lib/plugins/managesieve/localization/de_CH.inc
+++ b/lib/plugins/managesieve/localization/de_CH.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Empfänger';
$labels['vacationaddr'] = 'Meine weiteren E-Mail-Adressen:';
$labels['vacationdays'] = 'Antwort wird erneut gesendet nach (in Tagen):';
$labels['vacationinterval'] = 'Wie oft senden:';
-$labels['days'] = 'Tage';
-$labels['seconds'] = 'Sekunden';
$labels['vacationreason'] = 'Inhalt der Nachricht (Abwesenheitsgrund):';
$labels['vacationsubject'] = 'Betreff';
+$labels['days'] = 'Tage';
+$labels['seconds'] = 'Sekunden';
$labels['rulestop'] = 'Regelauswertung anhalten';
$labels['enable'] = 'Aktivieren/Deaktivieren';
$labels['filterset'] = 'Filtersätze';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'Erster Buchstabe gross';
$labels['varquotewildcard'] = 'Sonderzeichen auszeichnen';
$labels['varlength'] = 'Länge';
$labels['notify'] = 'Mitteilung senden';
-$labels['notifyaddress'] = 'Empfängeradresse:';
-$labels['notifybody'] = 'Mitteilungstext:';
-$labels['notifysubject'] = 'Mitteilungsbetreff:';
-$labels['notifyfrom'] = 'Absender:';
+$labels['notifytarget'] = 'Mitteilungsempfänger:';
+$labels['notifymessage'] = 'Mitteilungstext (optional):';
+$labels['notifyoptions'] = 'Mitteilungsoptionen (optional):';
+$labels['notifyfrom'] = 'Absender (optional):';
$labels['notifyimportance'] = 'Wichtigkeit:';
$labels['notifyimportancelow'] = 'tief';
$labels['notifyimportancenormal'] = 'normal';
$labels['notifyimportancehigh'] = 'hoch';
+$labels['notifymethodmailto'] = 'E-Mail';
+$labels['notifymethodtel'] = 'Telefon';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Filter erstellen';
$labels['usedata'] = 'Die folgenden Daten im Filter benutzen:';
$labels['nextstep'] = 'Nächster Schritt';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'Gross-/Kleinschreibung ignorieren';
$labels['asciinumeric'] = 'numerisch (ascii-numeric)';
$labels['index'] = 'Index:';
$labels['indexlast'] = 'rückwärts';
+$labels['vacation'] = 'Abwesenheit';
+$labels['vacation.reply'] = 'Antworte mit Nachricht';
+$labels['vacation.advanced'] = 'Erweiterte Einstellungen';
+$labels['vacation.subject'] = 'Betreff';
+$labels['vacation.body'] = 'Inhalt';
+$labels['vacation.start'] = 'Beginn der Abwesenheit';
+$labels['vacation.end'] = 'Ende der Abwesenheit';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.on'] = 'Ein';
+$labels['vacation.off'] = 'Aus';
+$labels['vacation.addresses'] = 'Meine weiteren E-Mail-Adressen';
+$labels['vacation.interval'] = 'Antwort-Intervall';
+$labels['vacation.after'] = 'Abwesenheitsregel einfügen nach';
+$labels['vacation.saving'] = 'Speichere Daten...';
+$labels['vacation.action'] = 'Aktion für eingehende Nachrichten';
+$labels['vacation.keep'] = 'Behalten';
+$labels['vacation.discard'] = 'Verwerfen';
+$labels['vacation.redirect'] = 'Weiterleiten an';
+$labels['vacation.copy'] = 'Kopie an';
+$labels['arialabelfiltersetactions'] = 'Filtersatz-Aktionen';
+$labels['arialabelfilteractions'] = 'Filteraktionen';
+$labels['arialabelfilterform'] = 'Filtereigenschaften';
+$labels['ariasummaryfilterslist'] = 'Filterliste';
+$labels['ariasummaryfiltersetslist'] = 'Filtersatzliste';
+$labels['filterstitle'] = 'Eingehende Nachrichtenfilter bearbeiten';
+$labels['vacationtitle'] = 'Abwesenheitsregel bearbeiten';
$messages['filterunknownerror'] = 'Unbekannter Serverfehler';
$messages['filterconnerror'] = 'Kann nicht zum Sieve-Server verbinden';
$messages['filterdeleteerror'] = 'Serverfehler beim Löschen des Filters.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Reservierter Name.';
$messages['setexist'] = 'Filtersatz existiert bereits.';
$messages['nodata'] = 'Mindestens eine Position muss ausgewählt werden!';
$messages['invaliddateformat'] = 'Ungültiges Datumsformat';
+$messages['saveerror'] = 'Fehler beim Speichern (Serverfehler)';
+$messages['vacationsaved'] = 'Abwesenheitsnotiz erfolgreich gespeichert.';
+$messages['emptyvacationbody'] = 'Mitteilungstext ist erforderlich!';
?>
diff --git a/lib/plugins/managesieve/localization/de_DE.inc b/lib/plugins/managesieve/localization/de_DE.inc
index 2eaa215..f57ffa3 100644
--- a/lib/plugins/managesieve/localization/de_DE.inc
+++ b/lib/plugins/managesieve/localization/de_DE.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Empfänger';
$labels['vacationaddr'] = 'Meine zusätzliche E-Mail-Adresse(n):';
$labels['vacationdays'] = 'Wie oft sollen Nachrichten gesendet werden (in Tagen):';
$labels['vacationinterval'] = 'Wie oft sollen Nachrichten gesendet werden:';
-$labels['days'] = 'Tage';
-$labels['seconds'] = 'Sekunden';
$labels['vacationreason'] = 'Nachrichteninhalt (Abwesenheitsgrund):';
$labels['vacationsubject'] = 'Nachrichtenbetreff';
+$labels['days'] = 'Tage';
+$labels['seconds'] = 'Sekunden';
$labels['rulestop'] = 'Regelauswertung anhalten';
$labels['enable'] = 'Aktivieren/Deaktivieren';
$labels['filterset'] = 'Filtersätze';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'Erster Buchstabe großgeschrieben';
$labels['varquotewildcard'] = 'maskiere Sonderzeichen';
$labels['varlength'] = 'Länge';
$labels['notify'] = 'Sende Benachrichtigung';
-$labels['notifyaddress'] = 'An Email Adresse:';
-$labels['notifybody'] = 'Benachrichtigungs-Text:';
-$labels['notifysubject'] = 'Benachrichtigungs-Betreff:';
-$labels['notifyfrom'] = 'Benachrichtigungs-Absender:';
+$labels['notifytarget'] = 'Benachrichtigungs-Empfänger:';
+$labels['notifymessage'] = 'Inhalt der Benachrichtigung (optional):';
+$labels['notifyoptions'] = 'Optionen für die Benachrichtigung (optional)';
+$labels['notifyfrom'] = 'Absender der Benachrichtigung (optional):';
$labels['notifyimportance'] = 'Priorität:';
$labels['notifyimportancelow'] = 'niedrig';
$labels['notifyimportancenormal'] = 'normal';
$labels['notifyimportancehigh'] = 'hoch';
+$labels['notifymethodmailto'] = 'E-Mail';
+$labels['notifymethodtel'] = 'Telefon';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Filter erstellen';
$labels['usedata'] = 'Die folgenden Daten im Filter benutzen:';
$labels['nextstep'] = 'Nächster Schritt';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'Groß-/Kleinschreibung ignorieren';
$labels['asciinumeric'] = 'numerisch (ascii-numeric)';
$labels['index'] = 'index:';
$labels['indexlast'] = 'rückwärts';
+$labels['vacation'] = 'Urlaub';
+$labels['vacation.reply'] = 'Antwort';
+$labels['vacation.advanced'] = 'Erweiterte Einstellungen';
+$labels['vacation.subject'] = 'Betreff';
+$labels['vacation.body'] = 'Hauptteil';
+$labels['vacation.start'] = 'Beginn des Urlaubs';
+$labels['vacation.end'] = 'Ende des Urlaubs';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.on'] = 'An';
+$labels['vacation.off'] = 'Aus';
+$labels['vacation.addresses'] = 'Meine weiteren Adressen';
+$labels['vacation.interval'] = 'Antwort Intervall';
+$labels['vacation.after'] = 'Setze Urlaubsregel nach';
+$labels['vacation.saving'] = 'Speichere Daten...';
+$labels['vacation.action'] = 'Eingehende Nachrichtaktion';
+$labels['vacation.keep'] = 'Behalten';
+$labels['vacation.discard'] = 'Verwerfen';
+$labels['vacation.redirect'] = 'Weiterleiten an';
+$labels['vacation.copy'] = 'Kopie senden an';
+$labels['arialabelfiltersetactions'] = 'Aktionen für Filtersätze';
+$labels['arialabelfilteractions'] = 'Aktionen für Filter';
+$labels['arialabelfilterform'] = 'Filtereigenschaften';
+$labels['ariasummaryfilterslist'] = 'Liste von Filtern';
+$labels['ariasummaryfiltersetslist'] = 'Liste von Filtersätzen';
+$labels['filterstitle'] = 'Eingehende Mailfilter bearbeiten';
+$labels['vacationtitle'] = 'Abwesendheitsregel bearbeiten';
$messages['filterunknownerror'] = 'Unbekannter Serverfehler';
$messages['filterconnerror'] = 'Kann keine Verbindung mit Managesieve-Server herstellen';
$messages['filterdeleteerror'] = 'Filter kann nicht gelöscht werden. Ein Serverfehler ist aufgetreten.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Reservierter Name.';
$messages['setexist'] = 'Filtersatz existiert bereits.';
$messages['nodata'] = 'Mindestens eine Position muss ausgewählt werden!';
$messages['invaliddateformat'] = 'Ungültiges Datum oder Teil-Format';
+$messages['saveerror'] = 'Ein Serverfehler ist aufgetreten, Speicherung war nicht möglich.';
+$messages['vacationsaved'] = 'Urlaubsdaten erfolgreich gespeichert.';
+$messages['emptyvacationbody'] = 'Inhalt der Abwesenheitsbenachrichtigung wird benötigt!';
?>
diff --git a/lib/plugins/managesieve/localization/el_GR.inc b/lib/plugins/managesieve/localization/el_GR.inc
index 73ec786..d1c7833 100644
--- a/lib/plugins/managesieve/localization/el_GR.inc
+++ b/lib/plugins/managesieve/localization/el_GR.inc
@@ -47,18 +47,20 @@ $labels['messagesendcopy'] = 'Αποστολη της αντιγραφης μυ
$labels['messagereply'] = 'Απάντηση με μήνυμα';
$labels['messagedelete'] = 'Διαγραφή μηνύματος';
$labels['messagediscard'] = 'Απόρριψη με μήνυμα';
+$labels['messagekeep'] = 'Διατήρηση μηνύματος στα Εισερχόμενα';
$labels['messagesrules'] = 'Για εισερχόμενα μηνύματα που:';
$labels['messagesactions'] = '...εκτέλεση των παρακάτω ενεργειών:';
$labels['add'] = 'Προσθήκη';
$labels['del'] = 'Διαγραφή';
$labels['sender'] = 'Αποστολέας';
$labels['recipient'] = 'Παραλήπτης';
+$labels['vacationaddr'] = 'Πρόσθετες διευθύνσεις email:';
$labels['vacationdays'] = 'Συχνότητα αποστολής μηνυμάτων (σε ημέρες):';
$labels['vacationinterval'] = 'Συχνότητα αποστολής μηνυμάτων:';
-$labels['days'] = 'ημερες';
-$labels['seconds'] = 'δευτερόλεπτα';
$labels['vacationreason'] = 'Σώμα μηνύματος (λόγος απουσίας):';
$labels['vacationsubject'] = 'Θέμα μηνύματος: ';
+$labels['days'] = 'ημερες';
+$labels['seconds'] = 'δευτερόλεπτα';
$labels['rulestop'] = 'Παύση επαλήθευσης κανόνων';
$labels['enable'] = 'Ενεργοποιηση/Απενεργοποιηση';
$labels['filterset'] = 'Φίλτρα';
@@ -106,14 +108,17 @@ $labels['varupperfirst'] = 'πρώτος χαρακτήρας κεφαλαία
$labels['varquotewildcard'] = 'παραθέση ειδικων χαρακτήρων';
$labels['varlength'] = 'Μήκος';
$labels['notify'] = 'Αποστολή ειδοποίησης ';
-$labels['notifyaddress'] = 'Σε διεύθυνση email:';
-$labels['notifybody'] = 'Οργανισμός ειδοποιησης:';
-$labels['notifysubject'] = 'Θεμα ειδοποιησης:';
-$labels['notifyfrom'] = 'Αποστολεας ειδοποιησης:';
+$labels['notifytarget'] = 'Παραλήπτης ειδοποίησης:';
+$labels['notifymessage'] = 'Μήνυμα ειδοποίησης (προαιρετικά):';
+$labels['notifyoptions'] = 'Επιλογές ειδοποίησης (προαιρετικά):';
+$labels['notifyfrom'] = 'Αποστολέας ειδοποίησης (προαιρετικά):';
$labels['notifyimportance'] = 'Σημασία: ';
$labels['notifyimportancelow'] = 'Χαμηλή';
$labels['notifyimportancenormal'] = 'Κανονική';
$labels['notifyimportancehigh'] = 'Υψηλή';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Τηλέφωνο';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Δημιουργία φίλτρου';
$labels['usedata'] = 'Χρησιμοποιηση ακολουθων δεδομενων στο φιλτρο:';
$labels['nextstep'] = 'Επομενο βημα';
@@ -155,27 +160,65 @@ $labels['asciicasemap'] = 'πεζά ή κεφαλαία (ascii-casemap)';
$labels['asciinumeric'] = 'αριθμητικό (ascii-αριθμητικο)';
$labels['index'] = 'ευρετήριο:';
$labels['indexlast'] = 'προς τα πίσω';
+$labels['vacation'] = 'Διακοπές';
+$labels['vacation.reply'] = 'Μήνυμα απάντησης';
+$labels['vacation.advanced'] = 'Προηγμένες ρυθμίσεις';
+$labels['vacation.subject'] = 'Θέμα';
+$labels['vacation.body'] = 'Σώμα';
+$labels['vacation.start'] = 'Έναρξη διακοπών';
+$labels['vacation.end'] = 'Λήξη διακοπών';
+$labels['vacation.status'] = 'Κατάσταση';
+$labels['vacation.on'] = 'Ενεργό';
+$labels['vacation.off'] = 'Ανενεργό';
+$labels['vacation.addresses'] = 'Επιπλέον διευθύνσεις';
+$labels['vacation.interval'] = 'Διάστημα απάντησης';
+$labels['vacation.after'] = 'Εισαγωγή κανόνα διακοπών μετά από';
+$labels['vacation.saving'] = 'Αποθήκευση δεδομένων...';
+$labels['vacation.action'] = 'Ενέργεια εισερχόμενου μηνύματος';
+$labels['vacation.keep'] = 'Διατήρηση';
+$labels['vacation.discard'] = 'Διαγραφή';
+$labels['vacation.redirect'] = 'Ανακατεύθυνση σε';
+$labels['vacation.copy'] = 'Αποστολή αντιγράφου σε';
+$labels['arialabelfiltersetactions'] = 'Ενέργειες ομάδας φίλτρων';
+$labels['arialabelfilteractions'] = 'Ενέργειες φίλτρων';
+$labels['arialabelfilterform'] = 'Ιδιότητες φίλτρων';
+$labels['ariasummaryfilterslist'] = 'Λίστα φίλτρων';
+$labels['ariasummaryfiltersetslist'] = 'Λίστα ομάδων φίλτρων';
+$labels['filterstitle'] = 'Επεξεργασία φίλτρων εισερχόμενης αλληλογραφίας';
+$labels['vacationtitle'] = 'Επεξεργασία κανόνα εκτός-γραφείου';
$messages['filterunknownerror'] = 'Άγνωστο σφάλμα διακομιστή';
$messages['filterconnerror'] = 'Αδυναμία σύνδεσης στον διακομιστή managesieve';
+$messages['filterdeleteerror'] = 'Αδυναμία διαγραφής φίλτρου. Προέκυψε σφάλμα στον διακομιστή';
$messages['filterdeleted'] = 'Το φίλτρο διαγράφηκε επιτυχώς';
$messages['filtersaved'] = 'Το φίλτρο αποθηκεύτηκε επιτυχώς';
+$messages['filtersaveerror'] = 'Αδυναμία αποθήκευσης φίλτρου. Προέκυψε σφάλμα στον διακομιστή';
$messages['filterdeleteconfirm'] = 'Είστε σίγουροι ότι θέλετε να διαγράψετε το επιλεγμένο φίλτρο? ';
$messages['ruledeleteconfirm'] = 'Θέλετε όντως να διαγράψετε τον επιλεγμένο κανόνα;';
$messages['actiondeleteconfirm'] = 'Θέλετε όντως να διαγράψετε την επιλεγμένη ενέργεια;';
$messages['forbiddenchars'] = 'Μη επιτρεπτοί χαρακτήρες στο πεδίο';
$messages['cannotbeempty'] = 'Το πεδίο δεν μπορεί να είναι κενό';
$messages['ruleexist'] = 'Φιλτρο με αυτο το όνομα υπάρχει ήδη. ';
+$messages['setactivateerror'] = 'Αδυναμία ενεργοποίησης επιλεγμένων ομάδων φίλτρων. Προέκυψε σφάλμα στον διακομιστή.';
+$messages['setdeactivateerror'] = 'Αδυναμία απενεργοποίησης επιλεγμένων ομάδων φίλτρων. Προέκυψε σφάλμα στον διακομιστή.';
+$messages['setdeleteerror'] = 'Αδυναμία διαγραφής των επιλεγμένων ομάδων φίλτρων. Προέκυψε σφάλμα στον διακομιστή';
$messages['setactivated'] = 'Φίλτρα ενεργοποιήθηκαν με επιτυχία.';
$messages['setdeactivated'] = 'Φίλτρα απενεργοποιήθηκαν με επιτυχία.';
$messages['setdeleted'] = 'Τα φίλτρα διαγράφηκαν επιτυχώς.';
$messages['setdeleteconfirm'] = 'Θέλετε όντως να διαγράψετε τα επιλεγμένα φιλτρα?';
+$messages['setcreateerror'] = 'Αδυναμία δημιουργίας ομάδας φίλτρων. Προέκυψε σφάλμα στον διακομιστή.';
$messages['setcreated'] = 'Τα φιλτρα δημιουργηθηκαν επιτυχως.';
+$messages['activateerror'] = 'Αδυναμία ενεργοποίησης επιλεγμένου φίλτρου(ων). Προέκυψε σφάλμα στον διακομιστή.';
+$messages['deactivateerror'] = 'Αδυναμία απενεργοποίησης επιλεγμένου φίλτρου(ων). Προέκυψε σφάλμα στον διακομιστή.';
$messages['deactivated'] = 'Το φιλτρο(α) απενεργοποιηθηκαν επιτυχως.';
$messages['activated'] = 'Το φίλτρο(α) ενεργοποιηθηκαν επιτυχώς.';
$messages['moved'] = 'Το φίλτρο μετακινηθηκε επιτυχώς.';
+$messages['moveerror'] = 'Αδυναμία μετακίνησης επιλεγμένου φίλτρου. Προέκυψε σφάλμα στον διακομιστή.';
$messages['nametoolong'] = 'Το όνομα είναι πολύ μεγάλο.';
$messages['namereserved'] = 'Δεσμευμένο όνομα. ';
$messages['setexist'] = 'Set υπάρχει ήδη. ';
$messages['nodata'] = 'Τουλάχιστον μία θέση πρέπει να επιλεγεί!';
$messages['invaliddateformat'] = 'Μη έγκυρη ημερομηνία ή η ημερομηνία μορφής τμήμα';
+$messages['saveerror'] = 'Αδύνατη η αποθήκευση δεδομένων. Προέκυψε σφάλμα στον διακομιστή';
+$messages['vacationsaved'] = 'Τα δεδομένα διακοπών αποθηκεύτηκαν επιτυχώς.';
+$messages['emptyvacationbody'] = 'Απαιτείται σώμα για το μήνυμα διακοπών!';
?>
diff --git a/lib/plugins/managesieve/localization/en_CA.inc b/lib/plugins/managesieve/localization/en_CA.inc
index 311e595..400f835 100644
--- a/lib/plugins/managesieve/localization/en_CA.inc
+++ b/lib/plugins/managesieve/localization/en_CA.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Recipient';
$labels['vacationaddr'] = 'My additional e-mail address(es):';
$labels['vacationdays'] = 'How often send messages (in days):';
$labels['vacationinterval'] = 'How often send messages:';
-$labels['days'] = 'days';
-$labels['seconds'] = 'seconds';
$labels['vacationreason'] = 'Message body (vacation reason):';
$labels['vacationsubject'] = 'Message subject:';
+$labels['days'] = 'days';
+$labels['seconds'] = 'seconds';
$labels['rulestop'] = 'Stop evaluating rules';
$labels['enable'] = 'Enable/Disable';
$labels['filterset'] = 'Filters set';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'first character upper-case';
$labels['varquotewildcard'] = 'quote special characters';
$labels['varlength'] = 'length';
$labels['notify'] = 'Send notification';
-$labels['notifyaddress'] = 'To e-mail address:';
-$labels['notifybody'] = 'Notification body:';
-$labels['notifysubject'] = 'Notification subject:';
-$labels['notifyfrom'] = 'Notification sender:';
+$labels['notifytarget'] = 'Notification target:';
+$labels['notifymessage'] = 'Notification message (optional):';
+$labels['notifyoptions'] = 'Notification options (optional):';
+$labels['notifyfrom'] = 'Notification sender (optional):';
$labels['notifyimportance'] = 'Importance:';
$labels['notifyimportancelow'] = 'low';
$labels['notifyimportancenormal'] = 'normal';
$labels['notifyimportancehigh'] = 'high';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Phone';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Create filter';
$labels['usedata'] = 'Use following data in the filter:';
$labels['nextstep'] = 'Next Step';
@@ -157,6 +160,18 @@ $labels['asciicasemap'] = 'case insensitive (ascii-casemap)';
$labels['asciinumeric'] = 'numeric (ascii-numeric)';
$labels['index'] = 'index:';
$labels['indexlast'] = 'backwards';
+$labels['vacation'] = 'Vacation';
+$labels['vacation.reply'] = 'Reply message';
+$labels['vacation.advanced'] = 'Advanced settings';
+$labels['vacation.subject'] = 'Subject';
+$labels['vacation.body'] = 'Body';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.on'] = 'On';
+$labels['vacation.off'] = 'Off';
+$labels['vacation.addresses'] = 'My additional addresses';
+$labels['vacation.interval'] = 'Reply interval';
+$labels['vacation.after'] = 'Put vacation rule after';
+$labels['vacation.saving'] = 'Saving data...';
$messages['filterunknownerror'] = 'Unknown server error.';
$messages['filterconnerror'] = 'Unable to connect to server.';
$messages['filterdeleteerror'] = 'Unable to delete filter. Server error occurred.';
@@ -189,4 +204,6 @@ $messages['namereserved'] = 'Reserved name.';
$messages['setexist'] = 'Set already exists.';
$messages['nodata'] = 'At least one position must be selected!';
$messages['invaliddateformat'] = 'Invalid date or date part format';
+$messages['saveerror'] = 'Unable to save data. Server error occurred.';
+$messages['vacationsaved'] = 'Vacation data saved successfully.';
?>
diff --git a/lib/plugins/managesieve/localization/en_GB.inc b/lib/plugins/managesieve/localization/en_GB.inc
index f899e60..0cc8872 100644
--- a/lib/plugins/managesieve/localization/en_GB.inc
+++ b/lib/plugins/managesieve/localization/en_GB.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Recipient';
$labels['vacationaddr'] = 'My additional e-mail address(es):';
$labels['vacationdays'] = 'How often send messages (in days):';
$labels['vacationinterval'] = 'How often send messages:';
-$labels['days'] = 'days';
-$labels['seconds'] = 'seconds';
$labels['vacationreason'] = 'Message body (vacation reason):';
$labels['vacationsubject'] = 'Message subject:';
+$labels['days'] = 'days';
+$labels['seconds'] = 'seconds';
$labels['rulestop'] = 'Stop evaluating rules';
$labels['enable'] = 'Enable/Disable';
$labels['filterset'] = 'Filters set';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'first character upper-case';
$labels['varquotewildcard'] = 'quote special characters';
$labels['varlength'] = 'length';
$labels['notify'] = 'Send notification';
-$labels['notifyaddress'] = 'To e-mail address:';
-$labels['notifybody'] = 'Notification body:';
-$labels['notifysubject'] = 'Notification subject:';
-$labels['notifyfrom'] = 'Notification sender:';
+$labels['notifytarget'] = 'Notification target:';
+$labels['notifymessage'] = 'Notification message (optional):';
+$labels['notifyoptions'] = 'Notification options (optional):';
+$labels['notifyfrom'] = 'Notification sender (optional):';
$labels['notifyimportance'] = 'Importance:';
$labels['notifyimportancelow'] = 'low';
$labels['notifyimportancenormal'] = 'normal';
$labels['notifyimportancehigh'] = 'high';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Phone';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Create filter';
$labels['usedata'] = 'Use following data in the filter:';
$labels['nextstep'] = 'Next Step';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'case insensitive (ascii-casemap)';
$labels['asciinumeric'] = 'numeric (ascii-numeric)';
$labels['index'] = 'index:';
$labels['indexlast'] = 'backwards';
+$labels['vacation'] = 'Vacation';
+$labels['vacation.reply'] = 'Reply message';
+$labels['vacation.advanced'] = 'Advanced settings';
+$labels['vacation.subject'] = 'Subject';
+$labels['vacation.body'] = 'Body';
+$labels['vacation.start'] = 'Vacation start';
+$labels['vacation.end'] = 'Vacation end';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.on'] = 'On';
+$labels['vacation.off'] = 'Off';
+$labels['vacation.addresses'] = 'My additional addresses';
+$labels['vacation.interval'] = 'Reply interval';
+$labels['vacation.after'] = 'Put vacation rule after';
+$labels['vacation.saving'] = 'Saving data...';
+$labels['vacation.action'] = 'Incoming message action';
+$labels['vacation.keep'] = 'Keep';
+$labels['vacation.discard'] = 'Discard';
+$labels['vacation.redirect'] = 'Redirect to';
+$labels['vacation.copy'] = 'Send copy to';
+$labels['arialabelfiltersetactions'] = 'Filter set actions';
+$labels['arialabelfilteractions'] = 'Filter actions';
+$labels['arialabelfilterform'] = 'Filter properties';
+$labels['ariasummaryfilterslist'] = 'List of filters';
+$labels['ariasummaryfiltersetslist'] = 'List of filter sets';
+$labels['filterstitle'] = 'Edit incoming mail filters';
+$labels['vacationtitle'] = 'Edit out-of-office rule';
$messages['filterunknownerror'] = 'Unknown server error';
$messages['filterconnerror'] = 'Unable to connect to managesieve server';
$messages['filterdeleteerror'] = 'Unable to delete filter. Server error occurred.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Reserved name.';
$messages['setexist'] = 'Set already exists.';
$messages['nodata'] = 'At least one position must be selected!';
$messages['invaliddateformat'] = 'Invalid date or date part format';
+$messages['saveerror'] = 'Unable to save data. Server error occurred.';
+$messages['vacationsaved'] = 'Vacation data saved successfully.';
+$messages['emptyvacationbody'] = 'Body of vacation message is required!';
?>
diff --git a/lib/plugins/managesieve/localization/en_US.inc b/lib/plugins/managesieve/localization/en_US.inc
index ac766f9..f455d55 100644
--- a/lib/plugins/managesieve/localization/en_US.inc
+++ b/lib/plugins/managesieve/localization/en_US.inc
@@ -167,9 +167,8 @@ $labels['vacation.reply'] = 'Reply message';
$labels['vacation.advanced'] = 'Advanced settings';
$labels['vacation.subject'] = 'Subject';
$labels['vacation.body'] = 'Body';
-$labels['vacation.dates'] = 'Vacation time';
-$labels['vacation.from'] = 'From:';
-$labels['vacation.to'] = 'To:';
+$labels['vacation.start'] = 'Vacation start';
+$labels['vacation.end'] = 'Vacation end';
$labels['vacation.status'] = 'Status';
$labels['vacation.on'] = 'On';
$labels['vacation.off'] = 'Off';
diff --git a/lib/plugins/managesieve/localization/es_419.inc b/lib/plugins/managesieve/localization/es_419.inc
index 45b5dfb..6131895 100644
--- a/lib/plugins/managesieve/localization/es_419.inc
+++ b/lib/plugins/managesieve/localization/es_419.inc
@@ -165,9 +165,8 @@ $labels['vacation.reply'] = 'Responder mensaje';
$labels['vacation.advanced'] = 'Opciones avanzadas';
$labels['vacation.subject'] = 'Asunto';
$labels['vacation.body'] = 'Cuerpo';
-$labels['vacation.dates'] = 'Horario de vacaciones';
-$labels['vacation.from'] = 'De:';
-$labels['vacation.to'] = 'Para:';
+$labels['vacation.start'] = 'Inicio de vacaciones';
+$labels['vacation.end'] = 'Final de vacaciones';
$labels['vacation.status'] = 'Estado';
$labels['vacation.on'] = 'Encendido';
$labels['vacation.off'] = 'Apagado';
diff --git a/lib/plugins/managesieve/localization/es_AR.inc b/lib/plugins/managesieve/localization/es_AR.inc
index 6b3749d..6ac6533 100644
--- a/lib/plugins/managesieve/localization/es_AR.inc
+++ b/lib/plugins/managesieve/localization/es_AR.inc
@@ -165,9 +165,8 @@ $labels['vacation.reply'] = 'Responder mensaje';
$labels['vacation.advanced'] = 'Opciones avanzdas';
$labels['vacation.subject'] = 'Asunto';
$labels['vacation.body'] = 'Cuerpo';
-$labels['vacation.dates'] = 'Período de vacaciones';
-$labels['vacation.from'] = 'De:';
-$labels['vacation.to'] = 'Para:';
+$labels['vacation.start'] = 'Inicio de vacaciones';
+$labels['vacation.end'] = 'Final de vacaciones';
$labels['vacation.status'] = 'Estado';
$labels['vacation.on'] = 'On';
$labels['vacation.off'] = 'Off';
diff --git a/lib/plugins/managesieve/localization/es_ES.inc b/lib/plugins/managesieve/localization/es_ES.inc
index 91602ee..62f357b 100644
--- a/lib/plugins/managesieve/localization/es_ES.inc
+++ b/lib/plugins/managesieve/localization/es_ES.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Destinatario';
$labels['vacationaddr'] = 'Mis direcciones adicionales de correo electrónico:';
$labels['vacationdays'] = 'Cada cuánto enviar mensajes (en días):';
$labels['vacationinterval'] = 'Cada cuánto enviar mensajes:';
-$labels['days'] = 'días';
-$labels['seconds'] = 'segundos';
$labels['vacationreason'] = 'Cuerpo del mensaje (razón de vacaciones):';
$labels['vacationsubject'] = 'Asunto del Mensaje:';
+$labels['days'] = 'días';
+$labels['seconds'] = 'segundos';
$labels['rulestop'] = 'Parar de evaluar reglas';
$labels['enable'] = 'Habilitar/Deshabilitar';
$labels['filterset'] = 'Conjunto de filtros';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'inicial en mayúsculas';
$labels['varquotewildcard'] = 'entrecomillar caracteres especiales';
$labels['varlength'] = 'longitud';
$labels['notify'] = 'Enviar notificación';
-$labels['notifyaddress'] = 'A la dirección de correo:';
-$labels['notifybody'] = 'Cuerpo de la notificación:';
-$labels['notifysubject'] = 'Tema de la notificación:';
-$labels['notifyfrom'] = 'Remitente de la notificación:';
+$labels['notifytarget'] = 'Destino de la notificación:';
+$labels['notifymessage'] = 'Mensaje de notificación (opcional):';
+$labels['notifyoptions'] = 'Opciones de notificación (opcional):';
+$labels['notifyfrom'] = 'Remitente de la notificación (opcional):';
$labels['notifyimportance'] = 'Importancia:';
$labels['notifyimportancelow'] = 'baja';
$labels['notifyimportancenormal'] = 'normal';
$labels['notifyimportancehigh'] = 'alta';
+$labels['notifymethodmailto'] = 'Correo electrónico';
+$labels['notifymethodtel'] = 'Teléfono';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Crear Filtro';
$labels['usedata'] = 'Usar los siguientes datos en el filtro:';
$labels['nextstep'] = 'Siguiente paso';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'no sensible a mayúsculas (ascii-casemap)';
$labels['asciinumeric'] = 'numerico (ascii-numeric)';
$labels['index'] = 'índice:';
$labels['indexlast'] = 'hacia atrás';
+$labels['vacation'] = 'Vacaciones';
+$labels['vacation.reply'] = 'Mensaje de respuesta';
+$labels['vacation.advanced'] = 'Configuración avanzada';
+$labels['vacation.subject'] = 'Asunto';
+$labels['vacation.body'] = 'Cuerpo';
+$labels['vacation.start'] = 'Comienzo de las vacaciones';
+$labels['vacation.end'] = 'Final de las vacaciones';
+$labels['vacation.status'] = 'Estado';
+$labels['vacation.on'] = 'Activado';
+$labels['vacation.off'] = 'Desactivado';
+$labels['vacation.addresses'] = 'Mis direcciones adicionales';
+$labels['vacation.interval'] = 'Intervalo de respuesta';
+$labels['vacation.after'] = 'Poner regla de vacaciones después de';
+$labels['vacation.saving'] = 'Guardando datos...';
+$labels['vacation.action'] = 'Acción de mensaje entrante';
+$labels['vacation.keep'] = 'Mantener';
+$labels['vacation.discard'] = 'Descartar';
+$labels['vacation.redirect'] = 'Redireccionar a';
+$labels['vacation.copy'] = 'Enviar copia a';
+$labels['arialabelfiltersetactions'] = 'Acciones de un paquete de filtros';
+$labels['arialabelfilteractions'] = 'Acciones de filtro';
+$labels['arialabelfilterform'] = 'Propiedades de filtro';
+$labels['ariasummaryfilterslist'] = 'Lista de filtros';
+$labels['ariasummaryfiltersetslist'] = 'Lista de paquetes de filtros';
+$labels['filterstitle'] = 'Editar filtros de mensajes entrantes';
+$labels['vacationtitle'] = 'Editar la regla fuera-de-la-oficina';
$messages['filterunknownerror'] = 'Error desconocido en el servidor.';
$messages['filterconnerror'] = 'No se ha podido conectar con el servidor managesieve.';
$messages['filterdeleteerror'] = 'No se ha podido borrar el filtro. Ha ocurrido un error en el servidor.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Nombre reservado.';
$messages['setexist'] = 'El conjunto ya existe.';
$messages['nodata'] = '¡Al menos una posición debe ser seleccionada!';
$messages['invaliddateformat'] = 'Fecha o formato de parte de la fecha no válido';
+$messages['saveerror'] = 'No fue posible guardar los datos. Ha ocurrido un error en el servidor.';
+$messages['vacationsaved'] = 'Datos de vacaciones guardados correctamente.';
+$messages['emptyvacationbody'] = '¡Hace falta un texto en el mensaje de vacaciones!';
?>
diff --git a/lib/plugins/managesieve/localization/et_EE.inc b/lib/plugins/managesieve/localization/et_EE.inc
index e8a3bd3..3957dcb 100644
--- a/lib/plugins/managesieve/localization/et_EE.inc
+++ b/lib/plugins/managesieve/localization/et_EE.inc
@@ -55,10 +55,10 @@ $labels['sender'] = 'Saatja';
$labels['recipient'] = 'Saaja';
$labels['vacationdays'] = 'Kui tihti kirju saata (päevades):';
$labels['vacationinterval'] = 'Kui tihti kirju saata:';
-$labels['days'] = 'päeva';
-$labels['seconds'] = 'sekundit';
$labels['vacationreason'] = 'Kirja sisu (puhkuse põhjus):';
$labels['vacationsubject'] = 'Kirja teema:';
+$labels['days'] = 'päeva';
+$labels['seconds'] = 'sekundit';
$labels['rulestop'] = 'Peata reeglite otsimine';
$labels['enable'] = 'Luba/keela';
$labels['filterset'] = 'Filtrite kogum';
@@ -106,10 +106,6 @@ $labels['varupperfirst'] = 'esimene märk on suurtäht';
$labels['varquotewildcard'] = 'tsiteeri erimärke';
$labels['varlength'] = 'pikkus';
$labels['notify'] = 'Saada teavitus';
-$labels['notifyaddress'] = 'Saaja e-posti aadress:';
-$labels['notifybody'] = 'Teavituse sisu:';
-$labels['notifysubject'] = 'Teavituse pealkiri:';
-$labels['notifyfrom'] = 'Teavituse saatja:';
$labels['notifyimportance'] = 'Tähtsus:';
$labels['notifyimportancelow'] = 'madal';
$labels['notifyimportancenormal'] = 'tavaline';
diff --git a/lib/plugins/managesieve/localization/eu_ES.inc b/lib/plugins/managesieve/localization/eu_ES.inc
index fe29e58..c9a39dc 100644
--- a/lib/plugins/managesieve/localization/eu_ES.inc
+++ b/lib/plugins/managesieve/localization/eu_ES.inc
@@ -32,10 +32,10 @@ $labels['filteris'] = 'honen berdina da';
$labels['filterisnot'] = 'ez da honen berdina';
$labels['filterexists'] = 'badago';
$labels['filternotexists'] = 'ez dago';
-$labels['filtermatches'] = 'bat datorren espresio';
-$labels['filternotmatches'] = 'bat ez datorren espresio';
-$labels['filterregex'] = 'bat datozen adierazpen erregularrak';
-$labels['filternotregex'] = 'bat ez datorren espresio erregularrak';
+$labels['filtermatches'] = 'bat datorren espresioa';
+$labels['filternotmatches'] = 'bat ez datorren espresioa';
+$labels['filterregex'] = 'bat datozen adierazpen erregularra';
+$labels['filternotregex'] = 'bat ez datorren espresio erregularra';
$labels['filterunder'] = 'azpian';
$labels['filterover'] = 'gainean';
$labels['addrule'] = 'Gehitu araua';
@@ -55,12 +55,12 @@ $labels['del'] = 'Ezabatu';
$labels['sender'] = 'Bidaltzailea';
$labels['recipient'] = 'Hartzailea';
$labels['vacationaddr'] = 'Nire helbide elektroniko osagarria(k):';
-$labels['vacationdays'] = 'Zer maiztasunarekin bidaltzen ditu mezuak (egunak)';
+$labels['vacationdays'] = 'Zenbatero bidali mezuak (egunak)';
$labels['vacationinterval'] = 'Zenbatero bidali mezuak:';
+$labels['vacationreason'] = 'Mezuaren gorputza (oporrak direla medio):';
+$labels['vacationsubject'] = 'Mezuaren gaia:';
$labels['days'] = 'egun';
$labels['seconds'] = 'segundo';
-$labels['vacationreason'] = 'Mezuaren gorputza (oporrak direla medio):';
-$labels['vacationsubject'] = 'Mezuaren izenburua:';
$labels['rulestop'] = 'Gelditu arauak ebaluatzen';
$labels['enable'] = 'Gaitu/Ezgaitu';
$labels['filterset'] = 'Iragazki-paketea';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'lehenengo karakterea maiuskulan';
$labels['varquotewildcard'] = 'aipatu karaktere bereziak';
$labels['varlength'] = 'luzera';
$labels['notify'] = 'Bidali jakinarazpena';
-$labels['notifyaddress'] = 'e-posta helbidera:';
-$labels['notifybody'] = 'Jakinarazpenaren gorputza:';
-$labels['notifysubject'] = 'Jakinarazpenaren subjektua:';
-$labels['notifyfrom'] = 'Jakinarazpenaren bidaltzailea:';
+$labels['notifytarget'] = 'Jakinarazpenaren xedea:';
+$labels['notifymessage'] = 'Jakinarazpenaren mezua (aukerakoa):';
+$labels['notifyoptions'] = 'Jakinarazpenaren aukerak (aukerakoa):';
+$labels['notifyfrom'] = 'Jakinarazpenaren bidaltzailea (aukerakoa):';
$labels['notifyimportance'] = 'Garrantzia:';
$labels['notifyimportancelow'] = 'baxua';
$labels['notifyimportancenormal'] = 'normala';
$labels['notifyimportancehigh'] = 'altua';
+$labels['notifymethodmailto'] = 'Helbide elektronikoa';
+$labels['notifymethodtel'] = 'Telefonoa';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Sortu iragazkia';
$labels['usedata'] = 'Erabili datorren data iragazkian:';
$labels['nextstep'] = 'Hurrengo urratsa';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'minuskulak eta maiuskulak (ascii-casemap)';
$labels['asciinumeric'] = 'numerikoa (ascii-numeric)';
$labels['index'] = 'indexatu:';
$labels['indexlast'] = 'atzeraka';
+$labels['vacation'] = 'Oporraldia';
+$labels['vacation.reply'] = 'Erantzun mezua';
+$labels['vacation.advanced'] = 'Ezarpen aurreratuak';
+$labels['vacation.subject'] = 'Gaia';
+$labels['vacation.body'] = 'Gorputza';
+$labels['vacation.start'] = 'Oporraldiaren hasiera';
+$labels['vacation.end'] = 'Oporraldiaren bukaera';
+$labels['vacation.status'] = 'Egoera';
+$labels['vacation.on'] = 'Piztuta';
+$labels['vacation.off'] = 'Itzalita';
+$labels['vacation.addresses'] = 'Nire helbide osagarriak';
+$labels['vacation.interval'] = 'Erantzun tartea';
+$labels['vacation.after'] = 'Jarri oporren erregela honen ondoren';
+$labels['vacation.saving'] = 'Datuak gordetzen...';
+$labels['vacation.action'] = 'Sarrerako mezuaren ekintza';
+$labels['vacation.keep'] = 'Mantendu';
+$labels['vacation.discard'] = 'Baztertu';
+$labels['vacation.redirect'] = 'Birbideratu hona';
+$labels['vacation.copy'] = 'Bidali kopia hona';
+$labels['arialabelfiltersetactions'] = 'Iragazki-paketearen ekintzak';
+$labels['arialabelfilteractions'] = 'Iragazki-ekintzak';
+$labels['arialabelfilterform'] = 'Iragazkiaren ezaugarriak';
+$labels['ariasummaryfilterslist'] = 'Iragazkien zerrenda';
+$labels['ariasummaryfiltersetslist'] = 'Iragazki-paketeen zerrenda';
+$labels['filterstitle'] = 'Editatu postaren sarrera-iragazkiak';
+$labels['vacationtitle'] = 'Bulegotik-kanpo -erantzun automatiko- araua';
$messages['filterunknownerror'] = 'Zerbitzari ezezaguna errorea';
$messages['filterconnerror'] = 'Ezin da konektatu zerbitzariarekin.';
$messages['filterdeleteerror'] = 'Ezin da ezabatu iragazkia. Errore bat gertatu da zerbitzarian.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Izen erreserbatua.';
$messages['setexist'] = 'Lehendik badago pakete hori.';
$messages['nodata'] = 'Gutxienez posizio bat hautatu behar da!';
$messages['invaliddateformat'] = 'Dataren edo dataren zati baten formatua ez da baliozkoa ';
+$messages['saveerror'] = 'Ezin dira datuak gorde. Errorea gertatu da zerbitzarian.';
+$messages['vacationsaved'] = 'Oporren data ongi gorde da.';
+$messages['emptyvacationbody'] = 'Beharrezkoa da oporraldiko mezua jartzea!';
?>
diff --git a/lib/plugins/managesieve/localization/fa_IR.inc b/lib/plugins/managesieve/localization/fa_IR.inc
index b938c58..65f2d0d 100644
--- a/lib/plugins/managesieve/localization/fa_IR.inc
+++ b/lib/plugins/managesieve/localization/fa_IR.inc
@@ -15,18 +15,18 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/
*/
-$labels['filters'] = 'صافی‌ها';
-$labels['managefilters'] = 'مدیریت صافی‌های نامه ورودی';
-$labels['filtername'] = 'نام صافی';
-$labels['newfilter'] = 'صافی جدید';
-$labels['filteradd'] = 'افزودن صافی';
-$labels['filterdel'] = 'حذف صافی';
+$labels['filters'] = 'پالایه‌ها';
+$labels['managefilters'] = 'مدیریت پالایه‌های نامه ورودی';
+$labels['filtername'] = 'نام پالایه';
+$labels['newfilter'] = 'پالایه جدید';
+$labels['filteradd'] = 'افزودن پالایه';
+$labels['filterdel'] = 'حذف پالایه';
$labels['moveup'] = 'انتقال به بالا';
$labels['movedown'] = 'انتقال به پایین';
$labels['filterallof'] = 'مطابقت همه قوانین ذیل';
$labels['filteranyof'] = 'مطابقت هر کدام از قوانین ذیل';
$labels['filterany'] = 'همه پیغام ها';
-$labels['filtercontains'] = 'شامل‌';
+$labels['filtercontains'] = 'دربرگیرنده';
$labels['filternotcontains'] = 'بدون';
$labels['filteris'] = 'برابر است با';
$labels['filterisnot'] = 'برابر نیست با';
@@ -54,29 +54,29 @@ $labels['add'] = 'افزودن';
$labels['del'] = 'حذف';
$labels['sender'] = 'فرستنده';
$labels['recipient'] = 'گیرنده';
-$labels['vacationaddr'] = 'آدرس(های) ایمیل اضافی من:';
+$labels['vacationaddr'] = 'نشانی(های) رایانامه دیگر من:';
$labels['vacationdays'] = 'پیغام ها در چه مواقعی فرستاده شدند (در روزهای):';
$labels['vacationinterval'] = 'مواقعی که پیغام‌ها ارسال می‌شوند:';
-$labels['days'] = 'روزها';
-$labels['seconds'] = 'ثانیه‌ها';
$labels['vacationreason'] = 'بدنه پیغام (علت مسافرت):';
$labels['vacationsubject'] = 'موضوع پیغام:';
+$labels['days'] = 'روزها';
+$labels['seconds'] = 'ثانیه‌ها';
$labels['rulestop'] = 'توقف قوانین ارزیابی';
$labels['enable'] = 'فعال/غیرفعال‌سازی';
-$labels['filterset'] = 'مجموعه صافی‌ها';
-$labels['filtersets'] = 'مجموعه‌های صافی‌ها';
-$labels['filtersetadd'] = 'افزودن مجموعه صافی‌ها';
-$labels['filtersetdel'] = 'حذف مجموعه صافی‌های جاری';
-$labels['filtersetact'] = 'فعال کردن مجموعه صافی‌های جاری';
-$labels['filtersetdeact'] = 'غیرفعال کردن مجموعه صافی‌های جاری';
-$labels['filterdef'] = 'تعریف صافی';
-$labels['filtersetname'] = 'نام مجموعه صافی‌ها';
-$labels['newfilterset'] = 'مجموعه صافی‌های جدید';
+$labels['filterset'] = 'مجموعه پالایه‌ها';
+$labels['filtersets'] = 'مجموعه‌های پالایه‌ها';
+$labels['filtersetadd'] = 'افزودن مجموعه پالایه‌ها';
+$labels['filtersetdel'] = 'حذف مجموعه پالایه‌های جاری';
+$labels['filtersetact'] = 'فعال کردن مجموعه پالایه‌های جاری';
+$labels['filtersetdeact'] = 'غیرفعال کردن مجموعه پالایه‌های جاری';
+$labels['filterdef'] = 'تعریف پالایه';
+$labels['filtersetname'] = 'نام مجموعه پالایه‌ها';
+$labels['newfilterset'] = 'مجموعه پالایه‌های جدید';
$labels['active'] = 'فعال';
$labels['none'] = 'هیچ‌کدام';
$labels['fromset'] = 'از مجموعه';
$labels['fromfile'] = 'از پرونده';
-$labels['filterdisabled'] = 'صافی غیرفعال شد';
+$labels['filterdisabled'] = 'پالایه غیرفعال شد';
$labels['countisgreaterthan'] = 'تعداد بیشتر است از';
$labels['countisgreaterthanequal'] = 'تعداد بیشتر یا مساوی است با';
$labels['countislessthan'] = 'تعداد کمتر است از';
@@ -108,16 +108,19 @@ $labels['varupperfirst'] = 'حرف اول بزرگ';
$labels['varquotewildcard'] = 'نقل قول کاراکترهای خاص';
$labels['varlength'] = 'طول';
$labels['notify'] = 'ارسال تذکر';
-$labels['notifyaddress'] = 'به آدرس پست الکترونیکی:';
-$labels['notifybody'] = 'بدنه تذکر:';
-$labels['notifysubject'] = 'موضوع تذکر:';
-$labels['notifyfrom'] = 'فرستنده تذکر:';
+$labels['notifytarget'] = 'مقصد آگاه‌سازی:';
+$labels['notifymessage'] = 'متن آگاه‌سازی (تختیاری):';
+$labels['notifyoptions'] = 'گزینه‌های آگاه‌سازی (اختیاری):';
+$labels['notifyfrom'] = 'فرستنده آگاه‌سازی (اختیاری):';
$labels['notifyimportance'] = 'اهمیت:';
$labels['notifyimportancelow'] = 'کم';
$labels['notifyimportancenormal'] = 'معمولی';
$labels['notifyimportancehigh'] = 'زیاد';
-$labels['filtercreate'] = 'ایجاد صافی';
-$labels['usedata'] = 'استفاده از داده ذیل در صافی:';
+$labels['notifymethodmailto'] = 'رایانامه';
+$labels['notifymethodtel'] = 'تلفن';
+$labels['notifymethodsms'] = 'پیامک';
+$labels['filtercreate'] = 'ایجاد پالایه';
+$labels['usedata'] = 'استفاده از داده ذیل در پالایه:';
$labels['nextstep'] = 'مرحله بعدی';
$labels['...'] = '...';
$labels['currdate'] = 'تاریخ جاری';
@@ -157,36 +160,65 @@ $labels['asciicasemap'] = 'حساس به حروه کوچک و بزرگ (ascii-ca
$labels['asciinumeric'] = 'عددی (ascii-numeric)';
$labels['index'] = 'فهرست:';
$labels['indexlast'] = 'به عقب';
+$labels['vacation'] = 'مسافرت';
+$labels['vacation.reply'] = 'پاسخ به یغام';
+$labels['vacation.advanced'] = 'تنظیمات پیشرفته';
+$labels['vacation.subject'] = 'موضوع';
+$labels['vacation.body'] = 'بدنه';
+$labels['vacation.start'] = 'شروع تعطیلی';
+$labels['vacation.end'] = 'پایان تعطیلی';
+$labels['vacation.status'] = 'وضعیت';
+$labels['vacation.on'] = 'روشن';
+$labels['vacation.off'] = 'خاموش';
+$labels['vacation.addresses'] = 'نشانی‌های دیگر من';
+$labels['vacation.interval'] = 'فاصله پاسخ';
+$labels['vacation.after'] = 'قرار دادن قانون مسافرت بعد از';
+$labels['vacation.saving'] = 'ذخیره داده‌ها...';
+$labels['vacation.action'] = 'کنش عملکرد ورودی';
+$labels['vacation.keep'] = 'نگه داشتن';
+$labels['vacation.discard'] = 'دور انداختن';
+$labels['vacation.redirect'] = 'بازگردانی به';
+$labels['vacation.copy'] = 'ارسال رونوشت به';
+$labels['arialabelfiltersetactions'] = 'کنش‌های مجموعه پالایه';
+$labels['arialabelfilteractions'] = 'کنش‌های پالایه';
+$labels['arialabelfilterform'] = 'خصوصیات پالایه';
+$labels['ariasummaryfilterslist'] = 'فهرست پالایه‌ها';
+$labels['ariasummaryfiltersetslist'] = 'فهرست مجموعه پالایه‌ها';
+$labels['filterstitle'] = 'ویرایش پالایه‌های پست ورودی';
+$labels['vacationtitle'] = 'ویرایش نقش بیرون از دفتر';
$messages['filterunknownerror'] = 'خطای سرور نامعلوم.';
$messages['filterconnerror'] = 'ناتوانی در اتصال به سرور.';
-$messages['filterdeleteerror'] = 'ناتوانی در حذف صافی. خطای سرور رخ داد.';
-$messages['filterdeleted'] = 'صافی با موفقیت حذف شد.';
-$messages['filtersaved'] = 'صافی با موفقیت ذخیره شد.';
+$messages['filterdeleteerror'] = 'ناتوانی در حذف پالایه. خطای سرور رخ داد.';
+$messages['filterdeleted'] = 'پالایه با کام‌یابی حذف شد.';
+$messages['filtersaved'] = 'پالایه با کام‌یابی ذخیره شد.';
$messages['filtersaveerror'] = 'ناتوانی در ذخیره فیلتر. خطای سرور رخ داد.';
-$messages['filterdeleteconfirm'] = 'آیا مطمئن به حذف صافی انتخاب شده هستید؟';
+$messages['filterdeleteconfirm'] = 'آیا مطمئن به حذف پالایه انتخاب شده هستید؟';
$messages['ruledeleteconfirm'] = 'آیا مطمئن هستید که می خواهید قانون انتخاب شده را حذف کنید؟';
$messages['actiondeleteconfirm'] = 'آیا مطمئن هستید که می خواهید عمل انتخاب شده را حذف کنید.';
$messages['forbiddenchars'] = 'حروف ممنوعه در فیلد.';
$messages['cannotbeempty'] = 'فیلد نمی تواند خالی باشد.';
-$messages['ruleexist'] = 'صافی با این نام مشخص وجود دارد.';
-$messages['setactivateerror'] = 'ناتوان در فعال کردن مجموعه صافی‌ها انتخاب شده. خطای سرور رخ داد.';
-$messages['setdeactivateerror'] = 'ناتوان در غیرفعال کردن مجموعه صافی‌ها انتخاب شده. خطای سرور رخ داد.';
-$messages['setdeleteerror'] = 'ناتوان در حذف مجموعه صافی‌ها انتخاب شده. خطای سرور رخ داد.';
-$messages['setactivated'] = 'مجموعه صافی‌ها با موفقیت فعال شد.';
-$messages['setdeactivated'] = 'مجموعه صافی‌ها با موفقیت غیرفعال شد.';
-$messages['setdeleted'] = 'مجموعه صافی‌ها با موفقیت حذف شد.';
-$messages['setdeleteconfirm'] = 'آیا مطمئن هستید که می‌خواهید مجموعه صافی‌ها انتخاب شده را حذف کنید؟';
-$messages['setcreateerror'] = 'ناتوانی در ایجاد مجموعه صافی‌ها. خطای سرور رخ داد.';
-$messages['setcreated'] = 'مجموعه صافی‌ها با موفقیت ایجاد شد.';
-$messages['activateerror'] = 'ناتوانی در فعال کردن صافی(های) انتخاب شده. خطای سرور رخ داد.';
-$messages['deactivateerror'] = 'ناتوانی در غیرفعال کردن صافی(های) انتخاب شده. خطای سرور رخ داد.';
-$messages['deactivated'] = 'صافی(ها) با موفقیت فعال شدند.';
-$messages['activated'] = 'صافی(ها) با موفقیت غیرفعال شدند.';
-$messages['moved'] = 'صافی با موفقیت منتقل شد.';
-$messages['moveerror'] = 'ناتوانی در انتقال صافی انتخاب شده. خطای سرور رخ داد.';
+$messages['ruleexist'] = 'پالایه با این نام مشخص وجود دارد.';
+$messages['setactivateerror'] = 'ناتوان در فعال کردن مجموعه پالایه‌ها انتخاب شده. خطای سرور رخ داد.';
+$messages['setdeactivateerror'] = 'ناتوان در غیرفعال کردن مجموعه پالایه‌ها انتخاب شده. خطای سرور رخ داد.';
+$messages['setdeleteerror'] = 'ناتوان در حذف مجموعه پالایه‌ها انتخاب شده. خطای سرور رخ داد.';
+$messages['setactivated'] = 'مجموعه پالایه‌ها با کام‌یابی فعال شد.';
+$messages['setdeactivated'] = 'مجموعه پالایه‌ها با کام‌یابی غیرفعال شد.';
+$messages['setdeleted'] = 'مجموعه پالایه‌ها با کام‌یابی حذف شد.';
+$messages['setdeleteconfirm'] = 'آیا مطمئن هستید که می‌خواهید مجموعه پالایه‌ها انتخاب شده را حذف کنید؟';
+$messages['setcreateerror'] = 'ناتوانی در ایجاد مجموعه پالایه‌ها. خطای سرور رخ داد.';
+$messages['setcreated'] = 'مجموعه پالایه‌ها با کام‌یابی ایجاد شد.';
+$messages['activateerror'] = 'ناتوانی در فعال کردن پالایه(های) انتخاب شده. خطای سرور رخ داد.';
+$messages['deactivateerror'] = 'ناتوانی در غیرفعال کردن پالایه(های) انتخاب شده. خطای سرور رخ داد.';
+$messages['deactivated'] = 'پالایه(ها) با کام‌یابی فعال شدند.';
+$messages['activated'] = 'پالایه(ها) با کام‌یابی غیرفعال شدند.';
+$messages['moved'] = 'پالایه با کام‌یابی منتقل شد.';
+$messages['moveerror'] = 'ناتوانی در انتقال پالایه انتخاب شده. خطای سرور رخ داد.';
$messages['nametoolong'] = 'نام خیلی بلند.';
$messages['namereserved'] = 'نام رزرو شده.';
$messages['setexist'] = 'مجموعه در حال حاضر موجود است.';
$messages['nodata'] = 'حداقل باید یک موقعیت باید انتخاب شود.';
$messages['invaliddateformat'] = 'قالب تاریخ اشتباه';
+$messages['saveerror'] = 'ناتوانی در ذخیره اطلاعات. خطای سرور رخ داد.';
+$messages['vacationsaved'] = 'اطلاعات مسافرت با کام‌یابی ذخیره شد.';
+$messages['emptyvacationbody'] = 'متن پیغام تعطیلی لازم است!';
?>
diff --git a/lib/plugins/managesieve/localization/fi_FI.inc b/lib/plugins/managesieve/localization/fi_FI.inc
index 1bec7a3..ba10b1f 100644
--- a/lib/plugins/managesieve/localization/fi_FI.inc
+++ b/lib/plugins/managesieve/localization/fi_FI.inc
@@ -48,17 +48,48 @@ $labels['messagereply'] = 'Vastaa viestillä';
$labels['messagedelete'] = 'Poista viesti';
$labels['messagediscard'] = 'Hylkää viestillä';
$labels['messagekeep'] = 'Säilytä viesti saapuneissa';
+$labels['messagesrules'] = 'Saapuville viesteille:';
$labels['messagesactions'] = '...suorita seuraavat toiminnot:';
$labels['add'] = 'Lisää';
$labels['del'] = 'Poista';
$labels['sender'] = 'Lähettäjä';
$labels['recipient'] = 'Vastaanottaja';
+$labels['vacationaddr'] = 'Muut sähköpostiosoitteeni:';
+$labels['vacationreason'] = 'Viestin runko (loman syy):';
$labels['vacationsubject'] = 'Viestin aihe:';
$labels['days'] = 'päivää';
$labels['seconds'] = 'sekuntia';
+$labels['rulestop'] = 'Lopeta sääntöjen arviointi';
+$labels['enable'] = 'Ota käyttöön/poista käytöstä';
+$labels['filterset'] = 'Suodattimien asetus';
+$labels['filtersets'] = 'Suodattimen asetus';
+$labels['filtersetadd'] = 'Lisää suodatinasetus';
+$labels['filtersetdel'] = 'Poista nykyiset suodatinasetukset';
+$labels['filtersetact'] = 'Aktivoi nykyinen suodattimien asetus';
+$labels['filtersetdeact'] = 'Poista käytöstä nykyinen suodattimien asetus';
+$labels['filterdef'] = 'Suodattimen määrittely';
+$labels['filtersetname'] = 'Suodattimien asetuksen nimi';
+$labels['active'] = 'aktiivinen';
+$labels['none'] = 'Ei mikään';
+$labels['fromset'] = 'sarjasta';
+$labels['fromfile'] = 'tiedostosta';
+$labels['filterdisabled'] = 'Suodatin poistettu käytöstä';
+$labels['countisgreaterthan'] = 'määrä on suurempi kuin';
+$labels['countisgreaterthanequal'] = 'määrä on suurempi tai yhtä suuri kuin';
+$labels['countislessthan'] = 'määrä on vähemmän kuin';
+$labels['countislessthanequal'] = 'määrä on vähemmän tai yhtä suuri kuin';
+$labels['countequals'] = 'määrä on yhtä suuri kuin';
+$labels['countnotequals'] = 'määrä ei ole yhtä suuri kuin';
+$labels['valueisgreaterthan'] = 'arvo on suurempi kuin';
+$labels['valueisgreaterthanequal'] = 'arvo on suurempi kuin tai yhtä suuri kuin';
+$labels['valueislessthan'] = 'arvo on vähemmän kuin';
+$labels['valueislessthanequal'] = 'määrä on vähemmän tai yhtä suuri kuin';
+$labels['valueequals'] = 'arvo on yhtä suuri kuin';
+$labels['valuenotequals'] = 'arvo ei ole yhtä suuri kuin';
$labels['setflags'] = 'Aseta liput viestiin';
$labels['addflags'] = 'Lisää liput viestiin';
$labels['removeflags'] = 'Poista liput viestistä';
+$labels['flagread'] = 'Lue';
$labels['flagdeleted'] = 'Poistettu';
$labels['flaganswered'] = 'Vastattu';
$labels['flagflagged'] = 'Liputettu';
@@ -66,42 +97,84 @@ $labels['flagdraft'] = 'Luonnos';
$labels['setvariable'] = 'Aseta muuttuja';
$labels['setvarname'] = 'Muuttujan nimi:';
$labels['setvarvalue'] = 'Muuttujan arvo:';
+$labels['setvarmodifiers'] = 'Muuntimet:';
+$labels['varlower'] = 'pienellä kirjoitettu';
+$labels['varupper'] = 'isolla kirjoitettu';
+$labels['varlowerfirst'] = 'ensimmäinen merkki pienellä kirjoitettuna';
+$labels['varupperfirst'] = 'ensimmäinen merkki isolla kirjoitettuna';
+$labels['varquotewildcard'] = 'lainaa erikoismerkit';
+$labels['varlength'] = 'pituus';
+$labels['notify'] = 'Lähetä ilmoitus';
+$labels['notifytarget'] = 'Ilmoituksen kohde:';
+$labels['notifymessage'] = 'Ilmoituksen viesti (valinnainen):';
+$labels['notifyoptions'] = 'Ilmoituksen valinnat (valinnainen)';
+$labels['notifyfrom'] = 'Ilmoituksen lähettäjä (valinnainen):';
$labels['notifyimportance'] = 'Tärkeysaste:';
+$labels['notifyimportancelow'] = 'matala';
+$labels['notifyimportancenormal'] = 'normaali';
+$labels['notifyimportancehigh'] = 'korkea';
$labels['notifymethodmailto'] = 'Sähköposti';
$labels['notifymethodtel'] = 'Puhelin';
$labels['notifymethodsms'] = 'Tekstiviesti';
$labels['filtercreate'] = 'Luo suodatin';
+$labels['usedata'] = 'Käytä seuraavaa dataa suodattimessa:';
+$labels['nextstep'] = 'Seuraava vaihe';
$labels['...'] = '...';
+$labels['currdate'] = 'Nykyinen päivämäärä';
+$labels['datetest'] = 'Päivämäärä';
+$labels['dateheader'] = 'otsikko:';
$labels['year'] = 'vuosi';
$labels['month'] = 'kuukausi';
$labels['day'] = 'päivä';
+$labels['date'] = 'päivämäärä (vvvv-kk-pp)';
+$labels['julian'] = 'päivämäärä (juliaaninen)';
$labels['hour'] = 'tunti';
$labels['minute'] = 'minuutti';
$labels['second'] = 'sekunti';
$labels['time'] = 'aika (hh:mm:ss)';
+$labels['iso8601'] = 'päivämäärä (ISO8601)';
+$labels['std11'] = 'päivämäärä (RFC2882)';
$labels['zone'] = 'aikavyöhyke';
+$labels['weekday'] = 'viikonpäivä (0-6)';
$labels['advancedopts'] = 'Lisävalinnat';
+$labels['body'] = 'Runko';
$labels['address'] = 'osoite';
+$labels['envelope'] = 'kirjekuori';
+$labels['modifier'] = 'muuntaja:';
+$labels['text'] = 'teksti';
+$labels['undecoded'] = 'dekoodaamaton (raaka)';
+$labels['contenttype'] = 'sisällön tyyppi';
+$labels['modtype'] = 'tyyppi:';
$labels['allparts'] = 'kaikki';
+$labels['domain'] = 'domain';
+$labels['localpart'] = 'paikallinen osa';
$labels['user'] = 'käyttäjä';
+$labels['detail'] = 'yksityiskohta';
+$labels['comparator'] = 'vertailija:';
$labels['default'] = 'oletus';
$labels['vacation'] = 'Loma';
$labels['vacation.reply'] = 'Vastausviesti';
$labels['vacation.advanced'] = 'Lisäasetukset';
$labels['vacation.subject'] = 'Aihe';
$labels['vacation.body'] = 'Sisältö';
-$labels['vacation.dates'] = 'Loma-aika';
-$labels['vacation.from'] = 'Lähettäjä:';
-$labels['vacation.to'] = 'Vastaanottaja:';
$labels['vacation.status'] = 'Tila';
$labels['vacation.on'] = 'Päällä';
$labels['vacation.off'] = 'Pois';
$labels['vacation.saving'] = 'Tallennetaan tietoja...';
+$labels['vacation.action'] = 'Toiminto saapuvalle viestille';
+$labels['vacation.keep'] = 'Säilytä';
+$labels['vacation.discard'] = 'Hylkää';
+$labels['vacation.redirect'] = 'Ohjaa uudelleen osoitteeseen';
+$labels['vacation.copy'] = 'Lähetä kopio osoitteeseen';
$messages['filterunknownerror'] = 'Tuntematon palvelinvirhe.';
$messages['filterconnerror'] = 'Yhteys palvelimeen epäonnistui.';
$messages['filterdeleted'] = 'Suodatin poistettu onnistuneesti.';
+$messages['filtersaved'] = 'Suodatin tallennettu onnistuneesti.';
+$messages['filtersaveerror'] = 'Suodattimen tallennus epäonnistui palvelinvirheen vuoksi.';
$messages['filterdeleteconfirm'] = 'Haluatko varmasti poistaa valitun suodattimen?';
+$messages['forbiddenchars'] = 'Virheellisiä merkkejä kentässä.';
$messages['cannotbeempty'] = 'Kenttä ei voi olla tyhjä.';
+$messages['ruleexist'] = 'Suodatin samalla nimellä on jo olemassa.';
$messages['moved'] = 'Suodatin siirretty onnistuneesti.';
$messages['nametoolong'] = 'Nimi on liian pitkä.';
$messages['saveerror'] = 'Tietojen tallennus epäonnistui palvelinvirheen vuoksi.';
diff --git a/lib/plugins/managesieve/localization/fr_FR.inc b/lib/plugins/managesieve/localization/fr_FR.inc
index 67a73a9..6377d12 100644
--- a/lib/plugins/managesieve/localization/fr_FR.inc
+++ b/lib/plugins/managesieve/localization/fr_FR.inc
@@ -16,14 +16,14 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/
*/
$labels['filters'] = 'Filtres';
-$labels['managefilters'] = 'Gérer les filtres sur les courriels entrants';
+$labels['managefilters'] = 'Gérer les filtres de courriels entrants';
$labels['filtername'] = 'Nom du filtre';
$labels['newfilter'] = 'Nouveau filtre';
$labels['filteradd'] = 'Ajouter un filtre';
$labels['filterdel'] = 'Supprimer le filtre';
$labels['moveup'] = 'Monter';
$labels['movedown'] = 'Descendre';
-$labels['filterallof'] = 'valident toutes les conditions suivantes';
+$labels['filterallof'] = 'correspondant à toutes les règles suivantes';
$labels['filteranyof'] = 'valident au moins une des conditions suivantes';
$labels['filterany'] = 'tous les messages';
$labels['filtercontains'] = 'contient';
@@ -32,16 +32,16 @@ $labels['filteris'] = 'est égal à';
$labels['filterisnot'] = 'est différent de';
$labels['filterexists'] = 'existe';
$labels['filternotexists'] = 'n\'existe pas';
-$labels['filtermatches'] = 'concorde avec l\'expression';
-$labels['filternotmatches'] = 'ne concorde pas avec l\'expression';
-$labels['filterregex'] = 'concorde avec l\'expression régulière';
-$labels['filternotregex'] = 'ne concorde pas avec l\'expression régulière';
-$labels['filterunder'] = 'est plus petit que';
-$labels['filterover'] = 'est plus grand que';
+$labels['filtermatches'] = 'correspond à l\'expression';
+$labels['filternotmatches'] = 'ne correspond pas à l\'expression';
+$labels['filterregex'] = 'correspond à l\'expression rationnelle';
+$labels['filternotregex'] = 'ne correspond pas à l\'expression rationnelle';
+$labels['filterunder'] = 'plus petit que';
+$labels['filterover'] = 'plus grand que';
$labels['addrule'] = 'Ajouter une règle';
$labels['delrule'] = 'Supprimer une règle';
$labels['messagemoveto'] = 'Déplacer le message vers';
-$labels['messageredirect'] = 'Transférer le message à';
+$labels['messageredirect'] = 'Rediriger le message à';
$labels['messagecopyto'] = 'Copier le message vers';
$labels['messagesendcopy'] = 'Envoyer une copie du message à';
$labels['messagereply'] = 'Répondre avec le message';
@@ -49,84 +49,87 @@ $labels['messagedelete'] = 'Supprimer le message';
$labels['messagediscard'] = 'Rejeter avec le message';
$labels['messagekeep'] = 'Conserver le message dans la boîte de réception';
$labels['messagesrules'] = 'Pour les courriels entrants :';
-$labels['messagesactions'] = '...exécuter les actions suivantes:';
+$labels['messagesactions'] = '...exécuter les actions suivantes :';
$labels['add'] = 'Ajouter';
$labels['del'] = 'Supprimer';
$labels['sender'] = 'Expéditeur';
$labels['recipient'] = 'Destinataire';
-$labels['vacationaddr'] = 'Adresse(s) e-mail additionnelle(s):';
-$labels['vacationdays'] = 'Ne pas renvoyer un message avant (jours) :';
-$labels['vacationinterval'] = 'Comment envoyer les messages :';
+$labels['vacationaddr'] = 'Mes adresses courriel additionnelles :';
+$labels['vacationdays'] = 'Fréquence d\'envoi des messages (en jours) :';
+$labels['vacationinterval'] = 'Fréquence d\'envoi des messages :';
+$labels['vacationreason'] = 'Corps du message (raison de l\'absence) :';
+$labels['vacationsubject'] = 'Objet du message :';
$labels['days'] = 'jours';
$labels['seconds'] = 'secondes';
-$labels['vacationreason'] = 'Corps du message (raison de l\'absence) :';
-$labels['vacationsubject'] = 'Sujet du message:';
-$labels['rulestop'] = 'Arrêter d\'évaluer les prochaines règles';
-$labels['enable'] = 'Activer/Désactiver';
-$labels['filterset'] = 'Groupe de filtres';
-$labels['filtersets'] = 'Groupes de filtres';
-$labels['filtersetadd'] = 'Ajouter un groupe de filtres';
-$labels['filtersetdel'] = 'Supprimer le groupe de filtres actuel';
-$labels['filtersetact'] = 'Activer le groupe de filtres actuel';
-$labels['filtersetdeact'] = 'Désactiver le groupe de filtres actuel';
+$labels['rulestop'] = 'Arrêter l\'évaluation des règles';
+$labels['enable'] = 'Activer/désactiver';
+$labels['filterset'] = 'Jeu de filtres';
+$labels['filtersets'] = 'Jeux de filtres';
+$labels['filtersetadd'] = 'Ajouter un jeu de filtres';
+$labels['filtersetdel'] = 'Supprimer le jeu de filtres actuel';
+$labels['filtersetact'] = 'Activer le jeu de filtres actuel';
+$labels['filtersetdeact'] = 'Désactiver le jeu de filtres actuel';
$labels['filterdef'] = 'Définition du filtre';
-$labels['filtersetname'] = 'Nom du groupe de filtres';
-$labels['newfilterset'] = 'Nouveau groupe de filtres';
-$labels['active'] = 'actif';
+$labels['filtersetname'] = 'Nom du jeu de filtres';
+$labels['newfilterset'] = 'Nouveau jeu de filtres';
+$labels['active'] = 'activer';
$labels['none'] = 'aucun';
-$labels['fromset'] = 'à partir du filtre';
+$labels['fromset'] = 'à partir du jeu';
$labels['fromfile'] = 'à partir du fichier';
$labels['filterdisabled'] = 'Filtre désactivé';
$labels['countisgreaterthan'] = 'total supérieur à';
$labels['countisgreaterthanequal'] = 'total supérieur ou égal à';
$labels['countislessthan'] = 'total inférieur à';
-$labels['countislessthanequal'] = 'total inférieur à';
+$labels['countislessthanequal'] = 'total inférieur ou égal à';
$labels['countequals'] = 'total égal à';
-$labels['countnotequals'] = 'le comptage n\'est pas égal à';
+$labels['countnotequals'] = 'le nombre n\'est pas égal à';
$labels['valueisgreaterthan'] = 'valeur supérieure à';
$labels['valueisgreaterthanequal'] = 'valeur supérieure ou égale à';
$labels['valueislessthan'] = 'valeur inférieure à';
$labels['valueislessthanequal'] = 'valeur inférieure ou égale à';
$labels['valueequals'] = 'valeur égale à';
$labels['valuenotequals'] = 'la valeur n\'est pas égale à';
-$labels['setflags'] = 'Mettre les marqueurs au message';
-$labels['addflags'] = 'Ajouter les marqueurs au message';
-$labels['removeflags'] = 'Supprimer les marqueurs du message';
+$labels['setflags'] = 'Définir les drapeaux pour le message';
+$labels['addflags'] = 'Ajouter les drapeaux au message';
+$labels['removeflags'] = 'Supprimer les drapeaux du message';
$labels['flagread'] = 'Lu';
$labels['flagdeleted'] = 'Supprimé';
-$labels['flaganswered'] = 'Répondu';
-$labels['flagflagged'] = 'Marqué';
+$labels['flaganswered'] = 'Réponse envoyée';
+$labels['flagflagged'] = 'Signalé';
$labels['flagdraft'] = 'Brouillon';
$labels['setvariable'] = 'Définir une variable';
$labels['setvarname'] = 'Nom de la variable :';
$labels['setvarvalue'] = 'Valeur de la variable :';
-$labels['setvarmodifiers'] = 'Modifications :';
+$labels['setvarmodifiers'] = 'Modificateurs :';
$labels['varlower'] = 'minuscule';
$labels['varupper'] = 'majuscule';
-$labels['varlowerfirst'] = 'premier caractère minuscule';
-$labels['varupperfirst'] = 'premier caractère majuscule';
-$labels['varquotewildcard'] = 'Échapper les caractères spéciaux';
+$labels['varlowerfirst'] = 'premier caractère en minuscule';
+$labels['varupperfirst'] = 'premier caractère en majuscule';
+$labels['varquotewildcard'] = 'citer les caractères spéciaux';
$labels['varlength'] = 'longueur';
$labels['notify'] = 'Envoyer la notification';
-$labels['notifyaddress'] = 'A l\'adresse e-mail :';
-$labels['notifybody'] = 'Corps de la notification :';
-$labels['notifysubject'] = 'Objet de la notification :';
-$labels['notifyfrom'] = 'Expéditeur de la notification :';
+$labels['notifytarget'] = 'Cible de la notification :';
+$labels['notifymessage'] = 'Message de notification (optionnel) :';
+$labels['notifyoptions'] = 'Options de notification (optionnel) :';
+$labels['notifyfrom'] = 'Expéditeur de la notification (optionnel) :';
$labels['notifyimportance'] = 'Importance :';
$labels['notifyimportancelow'] = 'faible';
-$labels['notifyimportancenormal'] = 'normal';
+$labels['notifyimportancenormal'] = 'normale';
$labels['notifyimportancehigh'] = 'haute';
+$labels['notifymethodmailto'] = 'Courriel';
+$labels['notifymethodtel'] = 'Téléphone';
+$labels['notifymethodsms'] = 'Message texte';
$labels['filtercreate'] = 'Créer un filtre';
-$labels['usedata'] = 'Utiliser les informations suivantes dans le filtre';
+$labels['usedata'] = 'Utiliser les données suivantes dans le filtre :';
$labels['nextstep'] = 'Étape suivante';
$labels['...'] = '...';
$labels['currdate'] = 'Date actuelle';
$labels['datetest'] = 'Date';
-$labels['dateheader'] = 'header:';
+$labels['dateheader'] = 'en-tête :';
$labels['year'] = 'année';
$labels['month'] = 'mois';
$labels['day'] = 'jour';
-$labels['date'] = 'date (yyyy-mm-dd)';
+$labels['date'] = 'date (aaaa-mm-jj)';
$labels['julian'] = 'date (julien)';
$labels['hour'] = 'heure';
$labels['minute'] = 'minute';
@@ -137,56 +140,85 @@ $labels['std11'] = 'date (RFC2822)';
$labels['zone'] = 'fuseau horaire';
$labels['weekday'] = 'jour de la semaine (0-6)';
$labels['advancedopts'] = 'Options avancées';
-$labels['body'] = 'Corps du message';
+$labels['body'] = 'Corps';
$labels['address'] = 'adresse';
$labels['envelope'] = 'enveloppe';
-$labels['modifier'] = 'modificateur:';
+$labels['modifier'] = 'modificateur :';
$labels['text'] = 'texte';
$labels['undecoded'] = 'non décodé (brut)';
$labels['contenttype'] = 'type de contenu';
-$labels['modtype'] = 'type:';
+$labels['modtype'] = 'type :';
$labels['allparts'] = 'tout';
$labels['domain'] = 'domaine';
$labels['localpart'] = 'partie locale';
$labels['user'] = 'utilisateur';
$labels['detail'] = 'détail';
-$labels['comparator'] = 'comparateur';
+$labels['comparator'] = 'comparateur :';
$labels['default'] = 'par défaut';
$labels['octet'] = 'strict (octet)';
$labels['asciicasemap'] = 'insensible à la casse (ascii-casemap)';
$labels['asciinumeric'] = 'numérique (ascii-numeric)';
-$labels['index'] = 'index:';
-$labels['indexlast'] = 'retour arrière';
-$messages['filterunknownerror'] = 'Erreur du serveur inconnue';
-$messages['filterconnerror'] = 'Connexion au serveur Managesieve impossible';
-$messages['filterdeleteerror'] = 'Impossible de supprimer le filtre. Une erreur serveur est survenue.';
-$messages['filterdeleted'] = 'Le filtre a bien été supprimé';
-$messages['filtersaved'] = 'Le filtre a bien été enregistré';
-$messages['filtersaveerror'] = 'Impossible de sauvegarder le filtre. Une erreur serveur est survenue.';
-$messages['filterdeleteconfirm'] = 'Voulez-vous vraiment supprimer le filtre sélectionné?';
-$messages['ruledeleteconfirm'] = 'Voulez-vous vraiment supprimer la règle sélectionnée?';
-$messages['actiondeleteconfirm'] = 'Voulez-vous vraiment supprimer l\'action sélectionnée?';
+$labels['index'] = 'index :';
+$labels['indexlast'] = 'à l\'envers';
+$labels['vacation'] = 'Vacances';
+$labels['vacation.reply'] = 'Message de réponse';
+$labels['vacation.advanced'] = 'Paramètres avancés';
+$labels['vacation.subject'] = 'Objet';
+$labels['vacation.body'] = 'Corps';
+$labels['vacation.start'] = 'Début de vacances';
+$labels['vacation.end'] = 'Fin de vacances';
+$labels['vacation.status'] = 'État';
+$labels['vacation.on'] = 'Arrêt';
+$labels['vacation.off'] = 'Marche';
+$labels['vacation.addresses'] = 'Mes adresses supplémentaires';
+$labels['vacation.interval'] = 'Plage de réponse';
+$labels['vacation.after'] = 'Mettre en place la règle de vacances après';
+$labels['vacation.saving'] = 'Enregistrement des données...';
+$labels['vacation.action'] = 'Action pour message entrant';
+$labels['vacation.keep'] = 'Garder';
+$labels['vacation.discard'] = 'Rejeter';
+$labels['vacation.redirect'] = 'Réacheminer à';
+$labels['vacation.copy'] = 'Envoyer une copie à';
+$labels['arialabelfiltersetactions'] = 'Actions des jeux de filtrage';
+$labels['arialabelfilteractions'] = 'Actions de filtrage';
+$labels['arialabelfilterform'] = 'Propriété du filtrage';
+$labels['ariasummaryfilterslist'] = 'Liste des filtres';
+$labels['ariasummaryfiltersetslist'] = 'Liste des jeux de filtrage';
+$labels['filterstitle'] = 'Modifier les filtres de courriels entrants';
+$labels['vacationtitle'] = 'Modifier la règle d\'absence du bureau';
+$messages['filterunknownerror'] = 'Erreur de serveur inconnue';
+$messages['filterconnerror'] = 'Connexion au serveur impossible.';
+$messages['filterdeleteerror'] = 'Impossible de supprimer le filtre. Une erreur de serveur est survenue.';
+$messages['filterdeleted'] = 'Le filtre a été supprimé avec succès.';
+$messages['filtersaved'] = 'Le filtre a été enregistré avec succès.';
+$messages['filtersaveerror'] = 'Impossible d\'enregistrer le filtre. Une erreur de serveur est survenue.';
+$messages['filterdeleteconfirm'] = 'Voulez-vous vraiment supprimer le filtre sélectionné ?';
+$messages['ruledeleteconfirm'] = 'Voulez-vous vraiment supprimer la règle sélectionnée ?';
+$messages['actiondeleteconfirm'] = 'Voulez-vous vraiment supprimer l\'action sélectionnée ?';
$messages['forbiddenchars'] = 'Caractères interdits dans le champ';
$messages['cannotbeempty'] = 'Le champ ne peut pas être vide';
$messages['ruleexist'] = 'Un filtre existe déjà avec ce nom.';
-$messages['setactivateerror'] = 'Impossible d\'activer le set de filtres sélectionné. Une erreur serveur est survenue.';
-$messages['setdeactivateerror'] = 'Impossible de désactiver le set de filtres sélectionné. Une erreur serveur est survenue.';
-$messages['setdeleteerror'] = 'Impossible de supprimer les set de filtres sélectionné. Une erreur serveur est survenue.';
-$messages['setactivated'] = 'Le groupe de filtres a bien été activé.';
-$messages['setdeactivated'] = 'Le groupe de filtres a bien été désactivé.';
-$messages['setdeleted'] = 'Le groupe de filtres a bien été supprimé.';
-$messages['setdeleteconfirm'] = 'Voulez vous vraiment supprimer le groupe de filtres sélectionné ?';
-$messages['setcreateerror'] = 'Impossible de créer un set de filtres. Une erreur serveur est survenue.';
-$messages['setcreated'] = 'Le groupe de filtres a bien été créé.';
-$messages['activateerror'] = 'Impossible d\'activer le ou les filtres sélectionné(s). Une erreur serveur est survenue.';
-$messages['deactivateerror'] = 'Impossible de désactiver le ou les filtres sélectionné(s). Une erreur serveur est survenue.';
+$messages['setactivateerror'] = 'Impossible d\'activer le jeu de filtres sélectionné. Une erreur de serveur est survenue.';
+$messages['setdeactivateerror'] = 'Impossible de désactiver le jeu de filtres sélectionné. Une erreur de serveur est survenue.';
+$messages['setdeleteerror'] = 'Impossible de supprimer le jeu de filtres sélectionné. Une erreur de serveur est survenue.';
+$messages['setactivated'] = 'Le jeu de filtres a été activé avec succès.';
+$messages['setdeactivated'] = 'Le jeu de filtres a été désactivé avec succès.';
+$messages['setdeleted'] = 'Le jeu de filtres a été supprimé avec succès.';
+$messages['setdeleteconfirm'] = 'Voulez vous vraiment supprimer le jeu de filtres sélectionné ?';
+$messages['setcreateerror'] = 'Impossible de créer un jeu de filtres. Une erreur de serveur est survenue.';
+$messages['setcreated'] = 'Le jeu de filtres a été créé avec succès.';
+$messages['activateerror'] = 'Impossible d\'activer le/les filtre(s) sélectionné(s). Une erreur de serveur est survenue.';
+$messages['deactivateerror'] = 'Impossible de désactiver le/les filtre(s) sélectionné(s). Une erreur de serveur est survenue.';
$messages['deactivated'] = 'Filtre(s) désactivé(s) avec succès.';
$messages['activated'] = 'Filtre(s) activé(s) avec succès.';
$messages['moved'] = 'Filtre déplacé avec succès.';
-$messages['moveerror'] = 'Impossible de déplacer le filtre sélectionné. Une erreur serveur est survenue.';
+$messages['moveerror'] = 'Impossible de déplacer le filtre sélectionné. Une erreur de serveur est survenue.';
$messages['nametoolong'] = 'Nom trop long.';
$messages['namereserved'] = 'Nom réservé.';
-$messages['setexist'] = 'Ce groupe existe déjà.';
-$messages['nodata'] = 'Au moins un élément doit être selectionné !';
-$messages['invaliddateformat'] = 'Date non valide ou format d\'une partie de la date';
+$messages['setexist'] = 'Le jeu existe déjà.';
+$messages['nodata'] = 'Au moins un élément doit être sélectionné !';
+$messages['invaliddateformat'] = 'Format de date ou d\'une partie de la date invalide';
+$messages['saveerror'] = 'Impossible d\'enregistrer les données. Une erreur du serveur est survenue.';
+$messages['vacationsaved'] = 'Les données de vacances ont été enregistrées avec succès.';
+$messages['emptyvacationbody'] = 'Le corps du message de vacances est nécessaire !';
?>
diff --git a/lib/plugins/managesieve/localization/gl_ES.inc b/lib/plugins/managesieve/localization/gl_ES.inc
index f1f9d2f..cbe45ca 100644
--- a/lib/plugins/managesieve/localization/gl_ES.inc
+++ b/lib/plugins/managesieve/localization/gl_ES.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Persoa destinataria';
$labels['vacationaddr'] = 'O(s) meu(s) outro (s) enderezo(s) de correo:';
$labels['vacationdays'] = 'Cada canto enviar mensaxes (en días):';
$labels['vacationinterval'] = 'Con que frecuencia se van enviar mensaxes:';
-$labels['days'] = 'días';
-$labels['seconds'] = 'segundos';
$labels['vacationreason'] = 'Corpo da mensaxe (por vacacións):';
$labels['vacationsubject'] = 'Asunto da mensaxe:';
+$labels['days'] = 'días';
+$labels['seconds'] = 'segundos';
$labels['rulestop'] = 'Parar de avaliar regras';
$labels['enable'] = 'Activar/Desactivar';
$labels['filterset'] = 'Conxunto de filtros';
@@ -108,14 +108,13 @@ $labels['varupperfirst'] = 'primeira letra maiúscula';
$labels['varquotewildcard'] = 'poñer entre aspas caracteres especiais';
$labels['varlength'] = 'lonxitude';
$labels['notify'] = 'Enviar notificación';
-$labels['notifyaddress'] = 'A este enderezo de correo:';
-$labels['notifybody'] = 'Corpo da notificación:';
-$labels['notifysubject'] = 'Asunto da notificación:';
-$labels['notifyfrom'] = 'Remite da notificación:';
$labels['notifyimportance'] = 'Importancia:';
$labels['notifyimportancelow'] = 'baixa';
$labels['notifyimportancenormal'] = 'normal';
$labels['notifyimportancehigh'] = 'alta';
+$labels['notifymethodmailto'] = 'Correo electrónico';
+$labels['notifymethodtel'] = 'Teléfono';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Crear filtro';
$labels['usedata'] = 'Usar os seguintes datos no filtro:';
$labels['nextstep'] = 'Seguinte paso';
@@ -157,6 +156,21 @@ $labels['asciicasemap'] = 'non sensíbel a maiúsculas/minúsculas (ascii-casema
$labels['asciinumeric'] = 'numérico (ascii-numerico)';
$labels['index'] = 'índice:';
$labels['indexlast'] = 'atrás';
+$labels['vacation.reply'] = 'Respostar á mensaxe';
+$labels['vacation.advanced'] = 'Opcións avanzadas';
+$labels['vacation.subject'] = 'Asunto';
+$labels['vacation.body'] = 'Corpo';
+$labels['vacation.status'] = 'Estado';
+$labels['vacation.on'] = 'Activar';
+$labels['vacation.off'] = 'Desactivar';
+$labels['vacation.saving'] = 'Gardando datos...';
+$labels['vacation.keep'] = 'Manter';
+$labels['vacation.discard'] = 'Descartar';
+$labels['vacation.redirect'] = 'Redirixir a';
+$labels['vacation.copy'] = 'Enviar copia a';
+$labels['arialabelfilteractions'] = 'Accións de filtrado';
+$labels['arialabelfilterform'] = 'Propiedades dos filtros';
+$labels['ariasummaryfilterslist'] = 'Lista de filtros';
$messages['filterunknownerror'] = 'Erro descoñecido do servidor';
$messages['filterconnerror'] = 'Imposíbel conectar co servidor.';
$messages['filterdeleteerror'] = 'Non se pode eliminar filtro. Produciuse un erro de servidor.';
diff --git a/lib/plugins/managesieve/localization/he_IL.inc b/lib/plugins/managesieve/localization/he_IL.inc
index f347d94..4e7b597 100644
--- a/lib/plugins/managesieve/localization/he_IL.inc
+++ b/lib/plugins/managesieve/localization/he_IL.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'הנמען';
$labels['vacationaddr'] = 'כתובות דוא"ל נוספות:';
$labels['vacationdays'] = 'באיזו תדירות ( בימים ) לשלוח הודעות:';
$labels['vacationinterval'] = 'באיזו תדירות לשלוח ההודעה';
-$labels['days'] = 'ימים';
-$labels['seconds'] = 'שניות';
$labels['vacationreason'] = 'גוף ההודעה (סיבת החופשה):';
$labels['vacationsubject'] = 'נושא ההודעה:';
+$labels['days'] = 'ימים';
+$labels['seconds'] = 'שניות';
$labels['rulestop'] = 'עצירה של בחינת הכללים';
$labels['enable'] = 'אפשור/ניטרול';
$labels['filterset'] = 'קבוצת מסננים';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'התו הראשון אות גדולה';
$labels['varquotewildcard'] = 'תו מיוחד יש לשים בין מרכאות';
$labels['varlength'] = 'אורך';
$labels['notify'] = 'משלוח התראה';
-$labels['notifyaddress'] = 'אל כתובת דו"אל:';
-$labels['notifybody'] = 'גוף ההתראה:';
-$labels['notifysubject'] = 'נושא ההתראה:';
-$labels['notifyfrom'] = 'שולח ההתראה:';
+$labels['notifytarget'] = 'יעד התראה:';
+$labels['notifymessage'] = 'הודעת התראה (רשות):';
+$labels['notifyoptions'] = 'אפשרויות התראה (רשות):';
+$labels['notifyfrom'] = 'שולח התראה (רשות):';
$labels['notifyimportance'] = 'חשיובת:';
$labels['notifyimportancelow'] = 'נמוכה';
$labels['notifyimportancenormal'] = 'רגילה';
$labels['notifyimportancehigh'] = 'גבוהה';
+$labels['notifymethodmailto'] = 'דוא״ל';
+$labels['notifymethodtel'] = 'טלפון';
+$labels['notifymethodsms'] = 'מסרון';
$labels['filtercreate'] = 'יצירת מסנן';
$labels['usedata'] = 'שימוש במידע שלהלן ליצירת המסנן:';
$labels['nextstep'] = 'הצעד הבא';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'case insensitive (ascii-casemap)';
$labels['asciinumeric'] = 'numeric (ascii-numeric)';
$labels['index'] = 'אינדקס:';
$labels['indexlast'] = 'בחזרה';
+$labels['vacation'] = 'חופשה';
+$labels['vacation.reply'] = 'הודעת תשובה';
+$labels['vacation.advanced'] = 'הגדרות מתקדמות';
+$labels['vacation.subject'] = 'נושא';
+$labels['vacation.body'] = 'גוף ההודעה';
+$labels['vacation.start'] = 'תאריך התחלה';
+$labels['vacation.end'] = 'תאריך סיום';
+$labels['vacation.status'] = 'מצב';
+$labels['vacation.on'] = 'מופעל';
+$labels['vacation.off'] = 'כבוי';
+$labels['vacation.addresses'] = 'כתובות נוספות שלי';
+$labels['vacation.interval'] = 'מרווח בין תשובות';
+$labels['vacation.after'] = 'העתקת סרגל החופשה אחרי';
+$labels['vacation.saving'] = 'שמירת מידע...';
+$labels['vacation.action'] = 'פעולה על הודעה נכנסת';
+$labels['vacation.keep'] = 'להשאיר';
+$labels['vacation.discard'] = 'להפטר';
+$labels['vacation.redirect'] = 'הפניה אל';
+$labels['vacation.copy'] = 'שליחת העתק אל';
+$labels['arialabelfiltersetactions'] = 'פעולות על קבוצה של חוקי סינון';
+$labels['arialabelfilteractions'] = 'פעולות מסנן';
+$labels['arialabelfilterform'] = 'מאפייני מסנן';
+$labels['ariasummaryfilterslist'] = 'רשימה של מסננים';
+$labels['ariasummaryfiltersetslist'] = 'רשימת קבוצות של חוקי סינון';
+$labels['filterstitle'] = 'ערוך מסנני דואר נכנס';
+$labels['vacationtitle'] = 'ערוך כלל מחוץ-אל-משרדי';
$messages['filterunknownerror'] = 'שגיאת שרת בלתי מוכרת.';
$messages['filterconnerror'] = 'לא ניתן להתחבר לשרת.';
$messages['filterdeleteerror'] = 'לא ניתן למחוק סינון. שגיאת שרת.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'השם הזה שמור.';
$messages['setexist'] = 'הערכה כבר קיימת.';
$messages['nodata'] = 'חובה לבחור במיקום אחד לפחות!';
$messages['invaliddateformat'] = 'תאריך לא חוקי אן פורמט לא תקין';
+$messages['saveerror'] = 'לא ניתן לשמור המידע בשל שגיאה של השרת';
+$messages['vacationsaved'] = 'הודעת החופשה נשמרה בהצלחה';
+$messages['emptyvacationbody'] = 'גוף של הודעת חופשה נדרש!';
?>
diff --git a/lib/plugins/managesieve/localization/hr_HR.inc b/lib/plugins/managesieve/localization/hr_HR.inc
index b3192ab..efcd4da 100644
--- a/lib/plugins/managesieve/localization/hr_HR.inc
+++ b/lib/plugins/managesieve/localization/hr_HR.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Primatelj';
$labels['vacationaddr'] = 'Dodatna e-mail adresa(e):';
$labels['vacationdays'] = 'Koliko često slati poruku (u danima):';
$labels['vacationinterval'] = 'Koliko često slati poruku:';
-$labels['days'] = 'dana';
-$labels['seconds'] = 'sekundi';
$labels['vacationreason'] = 'Tijelo poruke (razlog odmora):';
$labels['vacationsubject'] = 'Naslov poruke:';
+$labels['days'] = 'dana';
+$labels['seconds'] = 'sekundi';
$labels['rulestop'] = 'Prekini izvođenje filtera';
$labels['enable'] = 'Omogući/Onemogući';
$labels['filterset'] = 'Grupa filtera';
@@ -108,10 +108,6 @@ $labels['varupperfirst'] = 'prvo slovo veliko';
$labels['varquotewildcard'] = 'Citiraj specijalne znakove';
$labels['varlength'] = 'duljina';
$labels['notify'] = 'Pošalji obavijest';
-$labels['notifyaddress'] = 'Na e-mail adresu:';
-$labels['notifybody'] = 'Tekst obavijesti:';
-$labels['notifysubject'] = 'Naslov obavijesti:';
-$labels['notifyfrom'] = 'Pošiljatelj obavijesti:';
$labels['notifyimportance'] = 'Važnost:';
$labels['notifyimportancelow'] = 'niska';
$labels['notifyimportancenormal'] = 'normalna';
@@ -157,6 +153,11 @@ $labels['asciicasemap'] = 'neosjetljivo na veličinu slova (ascii-casemap)';
$labels['asciinumeric'] = 'numerički (ascii-numeric)';
$labels['index'] = 'indeks:';
$labels['indexlast'] = 'unatrag';
+$labels['vacation.advanced'] = 'Napredne postavke';
+$labels['vacation.subject'] = 'Naslov';
+$labels['vacation.body'] = 'Tijelo poruke';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.saving'] = 'Spremanje podataka...';
$messages['filterunknownerror'] = 'Nepoznata greška na poslužitelju';
$messages['filterconnerror'] = 'Nemoguće spajanje na poslužitelj (managesieve)';
$messages['filterdeleteerror'] = 'Nemoguće brisanje filtera. Greška na poslužitelju.';
@@ -189,4 +190,5 @@ $messages['namereserved'] = 'Rezervirano ime.';
$messages['setexist'] = 'Skup već postoji.';
$messages['nodata'] = 'Barem jedan pozicija mora biti odabrana!';
$messages['invaliddateformat'] = 'Neispravan datum ili dio datuma';
+$messages['saveerror'] = 'Nemoguće spremiti podatke. Greška na poslužitelju.';
?>
diff --git a/lib/plugins/managesieve/localization/hu_HU.inc b/lib/plugins/managesieve/localization/hu_HU.inc
index afab3f3..eae7650 100644
--- a/lib/plugins/managesieve/localization/hu_HU.inc
+++ b/lib/plugins/managesieve/localization/hu_HU.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Címzett';
$labels['vacationaddr'] = 'További e-mail címeim:';
$labels['vacationdays'] = 'Válaszüzenet küldése ennyi naponként:';
$labels['vacationinterval'] = 'Milyen gyakran küld üzeneteket:';
-$labels['days'] = 'napok';
-$labels['seconds'] = 'másodpercek';
$labels['vacationreason'] = 'Levél szövege (automatikus válasz):';
$labels['vacationsubject'] = 'Üzenet tárgya:';
+$labels['days'] = 'napok';
+$labels['seconds'] = 'másodpercek';
$labels['rulestop'] = 'Műveletek végrehajtásának befejezése';
$labels['enable'] = 'Bekapcsol/Kikapcsol';
$labels['filterset'] = 'Szűrök készlet';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'első karakter nagybetű';
$labels['varquotewildcard'] = 'speciális karakterek idézése';
$labels['varlength'] = 'hossz';
$labels['notify'] = 'Értesítés küldése';
-$labels['notifyaddress'] = 'Címzett e-mail címe:';
-$labels['notifybody'] = 'Értesítés levéltörzse:';
-$labels['notifysubject'] = 'Értesítés tárgya:';
-$labels['notifyfrom'] = 'Értesítés feladója:';
+$labels['notifytarget'] = 'Értesítés célja:';
+$labels['notifymessage'] = 'Értesítési üzenet (opcionális):';
+$labels['notifyoptions'] = 'Értesítés opcióik (opcionális):';
+$labels['notifyfrom'] = 'Értesítés feladója (opcionális):';
$labels['notifyimportance'] = 'Fontosság:';
$labels['notifyimportancelow'] = 'alacsony';
$labels['notifyimportancenormal'] = 'normál';
$labels['notifyimportancehigh'] = 'magas';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Telefonszám';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Szűrő létrehozása';
$labels['usedata'] = 'A következő adatok használata a szűrőben';
$labels['nextstep'] = 'Következő lépés';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'kis-nagybetüre nem érzékeny (ascii-casemap)';
$labels['asciinumeric'] = 'számszerü (ascii-numeric)';
$labels['index'] = 'index:';
$labels['indexlast'] = 'visszafelé';
+$labels['vacation'] = 'Vakáció';
+$labels['vacation.reply'] = 'Válasz az üzenetre';
+$labels['vacation.advanced'] = 'Haladó beállítások';
+$labels['vacation.subject'] = 'Tárgy';
+$labels['vacation.body'] = 'Törzs';
+$labels['vacation.start'] = 'Szünidő kezdete';
+$labels['vacation.end'] = 'Szünidő vége';
+$labels['vacation.status'] = 'Állapot';
+$labels['vacation.on'] = 'Be';
+$labels['vacation.off'] = 'Ki';
+$labels['vacation.addresses'] = 'További címeim';
+$labels['vacation.interval'] = 'Válasz intervallum';
+$labels['vacation.after'] = 'Rakd a szabadság szabályt ez után ';
+$labels['vacation.saving'] = 'Adatok mentése...';
+$labels['vacation.action'] = 'Beérkező üzenet akció';
+$labels['vacation.keep'] = 'Megtartás';
+$labels['vacation.discard'] = 'Érvénytelenít';
+$labels['vacation.redirect'] = 'Átírányítás ide';
+$labels['vacation.copy'] = 'Másolat kűldése ide';
+$labels['arialabelfiltersetactions'] = 'Szűrő készlet müveletek';
+$labels['arialabelfilteractions'] = 'Szűrő müveletek';
+$labels['arialabelfilterform'] = 'Szűrő tulajdonságai';
+$labels['ariasummaryfilterslist'] = 'Szűrők listája';
+$labels['ariasummaryfiltersetslist'] = 'Szűrő készletek listája';
+$labels['filterstitle'] = 'Bejövő üzenetek szűrőinek szerkesztése';
+$labels['vacationtitle'] = 'Irodán kiívül szabász szerkesztése';
$messages['filterunknownerror'] = 'Ismeretlen szerverhiba';
$messages['filterconnerror'] = 'Nem tudok a szűrőszerverhez kapcsolódni';
$messages['filterdeleteerror'] = 'A szűrőt nem lehet törölni. Szerverhiba történt';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Nem használható (foglalt) név-';
$messages['setexist'] = 'A készlet már létezik.';
$messages['nodata'] = 'Legalább egyet ki kell választani.';
$messages['invaliddateformat'] = 'hibás dátum formátum';
+$messages['saveerror'] = 'Az adat mentése sikertelen. Szerverhiba történt';
+$messages['vacationsaved'] = 'Vakáció adatai sikeresen elmentve.';
+$messages['emptyvacationbody'] = 'A vakácíó üzenet szövegtörzse kötelező!';
?>
diff --git a/lib/plugins/managesieve/localization/id_ID.inc b/lib/plugins/managesieve/localization/id_ID.inc
index 59dadc7..b445ef6 100644
--- a/lib/plugins/managesieve/localization/id_ID.inc
+++ b/lib/plugins/managesieve/localization/id_ID.inc
@@ -165,9 +165,6 @@ $labels['vacation.reply'] = 'Balas pesan';
$labels['vacation.advanced'] = 'Pengaturan Lanjutan';
$labels['vacation.subject'] = 'Judul';
$labels['vacation.body'] = 'Isi';
-$labels['vacation.dates'] = 'Waktu Liburan';
-$labels['vacation.from'] = 'Pengirim:';
-$labels['vacation.to'] = 'Kepada:';
$labels['vacation.status'] = 'Status';
$labels['vacation.on'] = 'Nyala';
$labels['vacation.off'] = 'Mati';
diff --git a/lib/plugins/managesieve/localization/it_IT.inc b/lib/plugins/managesieve/localization/it_IT.inc
index b7fc970..b97fde8 100644
--- a/lib/plugins/managesieve/localization/it_IT.inc
+++ b/lib/plugins/managesieve/localization/it_IT.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Destinatario';
$labels['vacationaddr'] = 'Account email aggiuntivo(i):';
$labels['vacationdays'] = 'Ogni quanti giorni ribadire il messaggio allo stesso mittente';
$labels['vacationinterval'] = 'Ogni quanto tempo inviare i messaggi:';
-$labels['days'] = 'giorni';
-$labels['seconds'] = 'secondi';
$labels['vacationreason'] = 'Corpo del messaggio (dettagli relativi all\'assenza):';
$labels['vacationsubject'] = 'Oggetto del messaggio';
+$labels['days'] = 'giorni';
+$labels['seconds'] = 'secondi';
$labels['rulestop'] = 'Non valutare le regole successive';
$labels['enable'] = 'Abilita/disabilita';
$labels['filterset'] = 'Gruppi di filtri';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'primo carattere maiuscolo';
$labels['varquotewildcard'] = 'caratteri speciali di quoting';
$labels['varlength'] = 'lunghezza';
$labels['notify'] = 'Invia notifica';
-$labels['notifyaddress'] = 'All\'indirizzo email:';
-$labels['notifybody'] = 'Corpo della notifica:';
-$labels['notifysubject'] = 'Oggetto della notifica:';
-$labels['notifyfrom'] = 'Mittente della notifica:';
+$labels['notifytarget'] = 'Destinatario della notifica';
+$labels['notifymessage'] = 'Messaggio di notifica (opzionale):';
+$labels['notifyoptions'] = 'Opzioni di notifica (opzionale):';
+$labels['notifyfrom'] = 'Mittente della notifica (opzionale):';
$labels['notifyimportance'] = 'Importanza:';
$labels['notifyimportancelow'] = 'bassa';
$labels['notifyimportancenormal'] = 'normale';
$labels['notifyimportancehigh'] = 'alta';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Telefono';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Crea filtro';
$labels['usedata'] = 'utilizza i seguenti dati nel filtro';
$labels['nextstep'] = 'passo successivo';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'non differenziare maiuscole/minuscole (ascii-casemap)
$labels['asciinumeric'] = 'numerico';
$labels['index'] = 'indice:';
$labels['indexlast'] = 'indietro';
+$labels['vacation'] = 'Vacanza';
+$labels['vacation.reply'] = 'Messaggio di risposta';
+$labels['vacation.advanced'] = 'Impostazioni avanzate';
+$labels['vacation.subject'] = 'Oggetto';
+$labels['vacation.body'] = 'Testo';
+$labels['vacation.start'] = 'Inizio vacanza';
+$labels['vacation.end'] = 'Fine vacanza';
+$labels['vacation.status'] = 'Stato';
+$labels['vacation.on'] = 'Attivato';
+$labels['vacation.off'] = 'Disattivato';
+$labels['vacation.addresses'] = 'I miei indirizzi aggiuntivi';
+$labels['vacation.interval'] = 'Intervallo di risposta';
+$labels['vacation.after'] = 'Imposta regola di vacanza dopo';
+$labels['vacation.saving'] = 'Salvataggio...';
+$labels['vacation.action'] = 'Azione messaggio in arrivo';
+$labels['vacation.keep'] = 'Mantieni';
+$labels['vacation.discard'] = 'Elimina';
+$labels['vacation.redirect'] = 'Ridireziona a';
+$labels['vacation.copy'] = 'Invia copia a';
+$labels['arialabelfiltersetactions'] = 'Azione settaggio dei filtri ';
+$labels['arialabelfilteractions'] = 'Azione Filtri';
+$labels['arialabelfilterform'] = 'Proprietà filtri';
+$labels['ariasummaryfilterslist'] = 'Lista dei filtri';
+$labels['ariasummaryfiltersetslist'] = 'Lista settaggio dei filtri';
+$labels['filterstitle'] = 'Modifica filtri dei messaggio in arrivo';
+$labels['vacationtitle'] = 'Modifica le regole del Risponditore automatico';
$messages['filterunknownerror'] = 'Errore sconosciuto del server';
$messages['filterconnerror'] = 'Collegamento al server managesieve fallito';
$messages['filterdeleteerror'] = 'Eliminazione del filtro fallita. Si è verificato un errore nel server.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'nome riservato';
$messages['setexist'] = 'Il gruppo esiste già';
$messages['nodata'] = 'selezionare almeno una posizione';
$messages['invaliddateformat'] = 'Formato della data non valido';
+$messages['saveerror'] = 'Impossibile salvare i dati. Errore del server.';
+$messages['vacationsaved'] = 'Dati di vacanza salvati correttamente.';
+$messages['emptyvacationbody'] = 'Il testo del messaggio non puo\' essere vuoto!';
?>
diff --git a/lib/plugins/managesieve/localization/ja_JP.inc b/lib/plugins/managesieve/localization/ja_JP.inc
index 1fff7e3..db04084 100644
--- a/lib/plugins/managesieve/localization/ja_JP.inc
+++ b/lib/plugins/managesieve/localization/ja_JP.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = '宛先';
$labels['vacationaddr'] = 'My additional e-mail address(es):';
$labels['vacationdays'] = 'メッセージを(1日に)送信する頻度:';
$labels['vacationinterval'] = 'メッセージを送信する頻度:';
-$labels['days'] = '日';
-$labels['seconds'] = '秒';
$labels['vacationreason'] = 'メッセージ本体(休暇の理由):';
$labels['vacationsubject'] = 'メッセージの件名:';
+$labels['days'] = '日';
+$labels['seconds'] = '秒';
$labels['rulestop'] = 'ルールの評価を停止';
$labels['enable'] = '有効/無効';
$labels['filterset'] = 'フィルターセット';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = '最初の文字を大文字';
$labels['varquotewildcard'] = '特殊文字を引用処理';
$labels['varlength'] = '長さ';
$labels['notify'] = '通知を送信';
-$labels['notifyaddress'] = '送信先の電子メールアドレス:';
-$labels['notifybody'] = '通知の本文:';
-$labels['notifysubject'] = '通知の件名:';
-$labels['notifyfrom'] = '通知の送信者:';
+$labels['notifytarget'] = '通知の対象:';
+$labels['notifymessage'] = '通知のメッセージ(任意):';
+$labels['notifyoptions'] = '通知のオプション(任意):';
+$labels['notifyfrom'] = '通知の送信者(任意):';
$labels['notifyimportance'] = '重要度:';
$labels['notifyimportancelow'] = '低';
$labels['notifyimportancenormal'] = '通常';
$labels['notifyimportancehigh'] = '高';
+$labels['notifymethodmailto'] = '電子メール';
+$labels['notifymethodtel'] = '電話';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'フィルターを作成';
$labels['usedata'] = 'フィルターで次のデータを使用';
$labels['nextstep'] = '次のステップ';
@@ -157,6 +160,23 @@ $labels['asciicasemap'] = '大文字小文字を区別しない(ascii-casemap)';
$labels['asciinumeric'] = '数値(ascii-numeric)';
$labels['index'] = 'index:';
$labels['indexlast'] = 'backwards';
+$labels['vacation'] = '休暇';
+$labels['vacation.reply'] = '返信のメッセージ';
+$labels['vacation.advanced'] = '詳細な設定';
+$labels['vacation.subject'] = '件名';
+$labels['vacation.body'] = '本文';
+$labels['vacation.status'] = '状態';
+$labels['vacation.on'] = 'オン';
+$labels['vacation.off'] = 'オフ';
+$labels['vacation.addresses'] = '追加のアドレス';
+$labels['vacation.interval'] = '返信の間隔';
+$labels['vacation.after'] = '後に休暇のルールを記入';
+$labels['vacation.saving'] = 'データを保存中...';
+$labels['arialabelfiltersetactions'] = 'フィルターセットの動作';
+$labels['arialabelfilteractions'] = 'フィルターの動作';
+$labels['arialabelfilterform'] = 'フィルターの特性';
+$labels['ariasummaryfilterslist'] = 'フィルターの一覧';
+$labels['ariasummaryfiltersetslist'] = 'フィルターセットの一覧';
$messages['filterunknownerror'] = '不明なサーバーのエラーです。';
$messages['filterconnerror'] = 'サーバに接続できません。';
$messages['filterdeleteerror'] = 'フィルターを削除できません。サーバーでエラーが発生しました。';
@@ -189,4 +209,6 @@ $messages['namereserved'] = '予約されている名前です。';
$messages['setexist'] = 'フィルターセットが既に存在します。';
$messages['nodata'] = '少なくとも1つの場所を選択しなければなりません!';
$messages['invaliddateformat'] = '無効な日付または日付部分の書式';
+$messages['saveerror'] = 'フィルターの保存できません。サーバーでエラーが発生しました。';
+$messages['vacationsaved'] = '休暇のデータを保存しました。';
?>
diff --git a/lib/plugins/managesieve/localization/km_KH.inc b/lib/plugins/managesieve/localization/km_KH.inc
index a6094be..9d3de70 100644
--- a/lib/plugins/managesieve/localization/km_KH.inc
+++ b/lib/plugins/managesieve/localization/km_KH.inc
@@ -51,16 +51,17 @@ $labels['del'] = 'លុប';
$labels['sender'] = 'អ្នក​ផ្ញើ';
$labels['recipient'] = 'អ្នក​ទទួល';
$labels['vacationdays'] = 'តើ​ផ្ញើ​សារ​ញឹកញាប់​ប៉ុណ្ណា (ក្នុង​មួយ​ថ្ងៃ)៖';
-$labels['days'] = 'ថ្ងៃ';
-$labels['seconds'] = 'វិនាទី';
$labels['vacationreason'] = 'តួ​សារ (ហេតុផល​វិស្សមកាល)៖';
$labels['vacationsubject'] = 'ប្រធានបទ​សារ៖';
+$labels['days'] = 'ថ្ងៃ';
+$labels['seconds'] = 'វិនាទី';
$labels['rulestop'] = 'ឈប់​គិត​ទៅ​លើ​លក្ខខណ្ឌ';
$labels['enable'] = 'បើក/បិទ';
$labels['filterdef'] = 'អត្ថន័យ​តម្រង';
$labels['active'] = 'សកម្ម';
$labels['none'] = 'គ្មាន';
$labels['fromfile'] = 'ពី​ឯកសារ';
+$labels['filterdisabled'] = 'បាន​បិទ​តម្រង';
$labels['valuenotequals'] = 'តម្លៃ​មិន​ស្មើ​នឹង';
$labels['flagread'] = 'បាន​អាន';
$labels['flagdeleted'] = 'បាន​លុប';
@@ -74,10 +75,6 @@ $labels['varlower'] = 'អក្សរ​តូច';
$labels['varupper'] = 'អក្សរ​ធំ';
$labels['varlength'] = 'ប្រវែង';
$labels['notify'] = 'ផ្ញើ​ការ​ជូន​ដំណឹង';
-$labels['notifyaddress'] = 'ទៅ​អាសយដ្ឋាន​អ៊ីមែល៖';
-$labels['notifybody'] = 'តួ​ការ​ជូន​ដំណឹង៖';
-$labels['notifysubject'] = 'ប្រធានបទ​ការ​ជូន​ដំណឹង៖';
-$labels['notifyfrom'] = 'អ្នក​ផ្ញើ​ការ​ជូន​ដំណឹង៖';
$labels['notifyimportance'] = 'សំខាន់៖';
$labels['notifyimportancelow'] = 'ទាប';
$labels['notifyimportancenormal'] = 'ធម្មតា';
diff --git a/lib/plugins/managesieve/localization/ko_KR.inc b/lib/plugins/managesieve/localization/ko_KR.inc
index b552fa9..e9497e7 100644
--- a/lib/plugins/managesieve/localization/ko_KR.inc
+++ b/lib/plugins/managesieve/localization/ko_KR.inc
@@ -18,18 +18,18 @@
$labels['filters'] = '필터';
$labels['managefilters'] = '수신 메일 필터 관리';
$labels['filtername'] = '필터명';
-$labels['newfilter'] = '새 필터';
+$labels['newfilter'] = '새로운 필터';
$labels['filteradd'] = '필터 추가';
$labels['filterdel'] = '필터 삭제';
$labels['moveup'] = '위로 이동';
$labels['movedown'] = '아래로 이동';
-$labels['filterallof'] = '다음의 모든 규칙과 일치함';
+$labels['filterallof'] = '다음 모든 규칙과 일치함';
$labels['filteranyof'] = '다음 규칙 중 하나라도 일치함';
$labels['filterany'] = '모든 메시지';
$labels['filtercontains'] = '다음을 포함함';
$labels['filternotcontains'] = '다음을 포함하지 않음';
-$labels['filteris'] = '다음과 같음';
-$labels['filterisnot'] = '다음과 같지 않음';
+$labels['filteris'] = '다음과 일치함';
+$labels['filterisnot'] = '다음과 일치하지 않음';
$labels['filterexists'] = '다음이 존재함';
$labels['filternotexists'] = '다음이 존재하지 않음';
$labels['filtermatches'] = '다음 표현식과 일치함';
@@ -40,38 +40,39 @@ $labels['filterunder'] = '다음보다 아래임';
$labels['filterover'] = '다음보다 위임';
$labels['addrule'] = '규칙 추가';
$labels['delrule'] = '규칙 삭제';
-$labels['messagemoveto'] = '메시지를 다음 위치로 이동함';
-$labels['messageredirect'] = '메시지를 다음 주소로 전송함';
-$labels['messagecopyto'] = '메시지를 다음 위치로 복사함';
-$labels['messagesendcopy'] = '메시지의 사본을 다음 위치로 보냄';
+$labels['messagemoveto'] = '메시지를 다음 위치로 이동';
+$labels['messageredirect'] = '메시지를 다음 주소로 재전송';
+$labels['messagecopyto'] = '메시지를 다음 위치로 복사';
+$labels['messagesendcopy'] = '메시지 사본을 다음 대상에게 보내기';
$labels['messagereply'] = '다음 메시지로 회신';
-$labels['messagedelete'] = '메시지를 삭제';
+$labels['messagedelete'] = '메시지 삭제';
$labels['messagediscard'] = '다음 메시지와 함께 폐기';
$labels['messagekeep'] = '메시지를 받은 편지함에 보관';
$labels['messagesrules'] = '해당 받은 메일:';
$labels['messagesactions'] = '...다음 동작을 실행:';
$labels['add'] = '추가';
$labels['del'] = '삭제';
-$labels['sender'] = '발신인';
-$labels['recipient'] = '수신인';
+$labels['sender'] = '발송자';
+$labels['recipient'] = '수신자';
+$labels['vacationaddr'] = '나의 추가적인 이메일 주소:';
$labels['vacationdays'] = '메시지 발신 주기 (일):';
$labels['vacationinterval'] = '메시지 발신 주기:';
-$labels['days'] = '일';
-$labels['seconds'] = '초';
$labels['vacationreason'] = '메시지 본문 (휴가 사유):';
$labels['vacationsubject'] = '메시지 제목:';
+$labels['days'] = '일';
+$labels['seconds'] = '초';
$labels['rulestop'] = '규칙 평가를 중단';
$labels['enable'] = '활성화/비활성화';
$labels['filterset'] = '필터 세트';
$labels['filtersets'] = '필터 세트';
$labels['filtersetadd'] = '필터 세트 추가';
$labels['filtersetdel'] = '현재 필터 세트를 삭제';
-$labels['filtersetact'] = '현재 필터 세트를 활성화';
-$labels['filtersetdeact'] = '현재 필터 세트를 비활성화';
+$labels['filtersetact'] = '현재 필터 세트 활성화';
+$labels['filtersetdeact'] = '현재 필터 세트 비활성화';
$labels['filterdef'] = '필터 정의';
$labels['filtersetname'] = '필터 세트명';
$labels['newfilterset'] = '새 필터 세트';
-$labels['active'] = '활성';
+$labels['active'] = '활성화됨';
$labels['none'] = '없음';
$labels['fromset'] = '세트로부터';
$labels['fromfile'] = '파일로부터';
@@ -81,20 +82,20 @@ $labels['countisgreaterthanequal'] = '개수가 다음보다 크거나 같음';
$labels['countislessthan'] = '개수가 다음보다 작음';
$labels['countislessthanequal'] = '개수가 작거나 같음';
$labels['countequals'] = '개수가 다음과 같음';
-$labels['countnotequals'] = '갯수가 다음과 같지 않음';
+$labels['countnotequals'] = '개수가 다음과 일치하지 않음';
$labels['valueisgreaterthan'] = '값이 다음보다 큼';
$labels['valueisgreaterthanequal'] = '값이 다음보다 크거나 같음';
$labels['valueislessthan'] = '값이 다음보다 작음';
$labels['valueislessthanequal'] = '값이 다음보다 작거나 같음';
$labels['valueequals'] = '값이 다음과 같음';
-$labels['valuenotequals'] = '값이 다음과 같지 않음';
-$labels['setflags'] = '메시지에 깃발을 설정';
+$labels['valuenotequals'] = '값이 다음과 일치하지 않음';
+$labels['setflags'] = '메시지를 깃발로 표시';
$labels['addflags'] = '메시지에 깃발을 추가';
$labels['removeflags'] = '메시지에서 깃발을 제거';
$labels['flagread'] = '읽음';
$labels['flagdeleted'] = '삭제됨';
$labels['flaganswered'] = '응답함';
-$labels['flagflagged'] = '깃발을 추가함';
+$labels['flagflagged'] = '깃발로 표시함';
$labels['flagdraft'] = '임시 보관함';
$labels['setvariable'] = '변수 설정';
$labels['setvarname'] = '변수명:';
@@ -107,14 +108,17 @@ $labels['varupperfirst'] = '첫 문자를 대문자로';
$labels['varquotewildcard'] = '특수 기호를 인용';
$labels['varlength'] = '길이';
$labels['notify'] = '알림 메시지 보내기';
-$labels['notifyaddress'] = '대상 이메일 주소:';
-$labels['notifybody'] = '알림 메시지 본문:';
-$labels['notifysubject'] = '알림 메시지 제목:';
-$labels['notifyfrom'] = '알림 메시지 발신인:';
+$labels['notifytarget'] = '알림 대상:';
+$labels['notifymessage'] = '알림 메시지(옵션):';
+$labels['notifyoptions'] = '알림 옵션(옵션):';
+$labels['notifyfrom'] = '알림 발송자(옵션):';
$labels['notifyimportance'] = '중요도:';
$labels['notifyimportancelow'] = '낮음';
$labels['notifyimportancenormal'] = '보통';
$labels['notifyimportancehigh'] = '높음';
+$labels['notifymethodmailto'] = '이메일';
+$labels['notifymethodtel'] = '전화';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = '필터 생성';
$labels['usedata'] = '필터에서 다음 데이터를 사용:';
$labels['nextstep'] = '다음 단계';
@@ -141,7 +145,7 @@ $labels['address'] = '주소';
$labels['envelope'] = '봉투';
$labels['modifier'] = '수식자:';
$labels['text'] = '텍스트';
-$labels['undecoded'] = '암호화되지 않음 (원상태)';
+$labels['undecoded'] = '암호화되지 않음(원상태)';
$labels['contenttype'] = '내용 유형';
$labels['modtype'] = '유형:';
$labels['allparts'] = '모두';
@@ -156,27 +160,65 @@ $labels['asciicasemap'] = '대/소문자 구분 (ascii-casemap)';
$labels['asciinumeric'] = '숫자 (ascii-numeric)';
$labels['index'] = '색인:';
$labels['indexlast'] = '역방향';
+$labels['vacation'] = '휴가';
+$labels['vacation.reply'] = '메시지 회신';
+$labels['vacation.advanced'] = '고급 설정';
+$labels['vacation.subject'] = '제목';
+$labels['vacation.body'] = '본문';
+$labels['vacation.start'] = '휴가 시작';
+$labels['vacation.end'] = '휴가 끝';
+$labels['vacation.status'] = '상태';
+$labels['vacation.on'] = '켬';
+$labels['vacation.off'] = '끔';
+$labels['vacation.addresses'] = '내 추가적인 주소';
+$labels['vacation.interval'] = '회신 주기';
+$labels['vacation.after'] = '다음 이후에 휴가 규칙을 위치함';
+$labels['vacation.saving'] = '데이터를 저장하는 중...';
+$labels['vacation.action'] = '수신 메시지 동작';
+$labels['vacation.keep'] = '보관';
+$labels['vacation.discard'] = '폐기';
+$labels['vacation.redirect'] = '재전송';
+$labels['vacation.copy'] = '사본을 다음 대상에게 전송';
+$labels['arialabelfiltersetactions'] = '필터 세트 동작';
+$labels['arialabelfilteractions'] = '필터 동작';
+$labels['arialabelfilterform'] = '필터 속성';
+$labels['ariasummaryfilterslist'] = '필터 목록';
+$labels['ariasummaryfiltersetslist'] = '필터 세트 목록';
+$labels['filterstitle'] = '수신 메일 필터 편집';
+$labels['vacationtitle'] = '자리비움 규칙 편집';
$messages['filterunknownerror'] = '알수 없는 서버 오류.';
-$messages['filterconnerror'] = '서버에 연결할 수 없음.';
+$messages['filterconnerror'] = '서버에 연결할 수 없습니다.';
+$messages['filterdeleteerror'] = '필터를 삭제할 수 없습니다. 서버 오류가 발생했습니다.';
$messages['filterdeleted'] = '필터가 성공적으로 삭제됨.';
$messages['filtersaved'] = '필터가 성공적으로 저장됨.';
+$messages['filtersaveerror'] = '필터를 저장할 수 없습니다. 서버 오류가 발생했습니다.';
$messages['filterdeleteconfirm'] = '정말로 선택한 필터를 삭제하시겠습니까?';
$messages['ruledeleteconfirm'] = '정말로 선택한 규칙을 삭제하시겠습니까?';
$messages['actiondeleteconfirm'] = '정말로 선택한 동작을 삭제하시겠습니까?';
-$messages['forbiddenchars'] = '필드에 금지된 문자가 존재함.';
-$messages['cannotbeempty'] = '필드는 비워둘 수 없음.';
-$messages['ruleexist'] = '지정한 이름의 필터가 이미 존재함.';
+$messages['forbiddenchars'] = '필드에 금지된 문자가 존재합니다.';
+$messages['cannotbeempty'] = '필드는 비어둘 수 없습니다.';
+$messages['ruleexist'] = '지정한 이름의 필터가 이미 존재합니다.';
+$messages['setactivateerror'] = '선택한 필터 세트를 활성화할 수 없습니다. 서버 오류가 발생했습니다.';
+$messages['setdeactivateerror'] = '선택한 필터 세트를 비활성화할 수 없습니다. 서버 오류가 발생했습니다.';
+$messages['setdeleteerror'] = '선택한 필터 세트를 삭제할 수 없습니다. 서버 오류가 발생했습니다.';
$messages['setactivated'] = '필터 세트가 성공적으로 활성화됨.';
$messages['setdeactivated'] = '필터 세트가 성공적으로 비활성화됨.';
$messages['setdeleted'] = '필터 세트가 성공적으로 삭제됨.';
$messages['setdeleteconfirm'] = '정말로 선택한 필터 세트를 삭제하시겠습니까?';
+$messages['setcreateerror'] = '선택한 필터 세트를 생성할 수 없습니다. 서버 오류가 발생했습니다.';
$messages['setcreated'] = '필터 세트가 성공적으로 생성됨.';
+$messages['activateerror'] = '선택한 필터를 활성화할 수 없습니다. 서버 오류가 발생했습니다.';
+$messages['deactivateerror'] = '선택한 필터를 비활성화할 수 없습니다. 서버 오류가 발생했습니다.';
$messages['deactivated'] = '필터가 성공적으로 비활성화됨.';
$messages['activated'] = '필터가 성공적으로 활성화됨.';
-$messages['moved'] = '필터가 성공적으로 이동함.';
-$messages['nametoolong'] = '이름이 너무 김.';
-$messages['namereserved'] = '예약된 이름.';
-$messages['setexist'] = '세트가 이미 존재함.';
+$messages['moved'] = '필터가 성공적으로 이동되었습니다.';
+$messages['moveerror'] = '선택한 필터를 이동할 수 없습니다. 서버 오류가 발생했습니다.';
+$messages['nametoolong'] = '이름이 너무 깁니다.';
+$messages['namereserved'] = '예약된 이름입니다.';
+$messages['setexist'] = '세트가 이미 존재합니다.';
$messages['nodata'] = '최소 하나의 위치가 선택되어야 합니다!';
$messages['invaliddateformat'] = '유효하지 않은 날짜 또는 날짜 일부 형식';
+$messages['saveerror'] = '데이터를 저장할 수 없습니다.. 서버 오류가 발생했습니다.';
+$messages['vacationsaved'] = '휴가 데이터가 성공적으로 저장됨.';
+$messages['emptyvacationbody'] = '휴가 메시지의 본문이 필요합니다!';
?>
diff --git a/lib/plugins/managesieve/localization/lt_LT.inc b/lib/plugins/managesieve/localization/lt_LT.inc
index 5dc81af..575e43c 100644
--- a/lib/plugins/managesieve/localization/lt_LT.inc
+++ b/lib/plugins/managesieve/localization/lt_LT.inc
@@ -46,6 +46,8 @@ $labels['messagecopyto'] = 'Kopijuoti laišką į';
$labels['messagesendcopy'] = 'Nusiųsti laiško kopiją';
$labels['messagereply'] = 'Atsakyti laišku';
$labels['messagedelete'] = 'Pašalinti laišką';
+$labels['messagediscard'] = 'Panaikinti su laišku';
+$labels['messagekeep'] = 'Palikti laišką gautųjų aplanke';
$labels['messagesrules'] = 'Gaunamiems laiškams:';
$labels['messagesactions'] = '…vykdyti šiuos veiksmus:';
$labels['add'] = 'Pridėti';
@@ -55,10 +57,10 @@ $labels['recipient'] = 'Gavėjas';
$labels['vacationaddr'] = 'Papildomas gavėjų adresų sąrašas:';
$labels['vacationdays'] = 'Kaip dažnai išsiųsti laiškus (dienomis):';
$labels['vacationinterval'] = 'Kaip dažnai siųsti laiškus:';
-$labels['days'] = 'd.';
-$labels['seconds'] = 'sek.';
$labels['vacationreason'] = 'Laiško tekstas';
$labels['vacationsubject'] = 'Laiško tema:';
+$labels['days'] = 'd.';
+$labels['seconds'] = 'sek.';
$labels['rulestop'] = 'Nutraukti taisyklių vykdymą';
$labels['enable'] = 'Įjungti / išjungti';
$labels['filterset'] = 'Filtrų rinkinys';
@@ -106,14 +108,17 @@ $labels['varupperfirst'] = 'pirmoji raidė didžioji';
$labels['varquotewildcard'] = 'cituoti specialius simbolius';
$labels['varlength'] = 'ilgis';
$labels['notify'] = 'Siųsti priminimą';
-$labels['notifyaddress'] = 'Kam, el. pašto adresas:';
-$labels['notifybody'] = 'Priminimo tekstas';
-$labels['notifysubject'] = 'Priminimo pavadinimas';
-$labels['notifyfrom'] = 'Priminimo siuntėjas';
+$labels['notifytarget'] = 'Priminimo gavėjas:';
+$labels['notifymessage'] = 'Priminimo laiškas (nebūtina):';
+$labels['notifyoptions'] = 'Priminimo nustatymai (nebūtina):';
+$labels['notifyfrom'] = 'Priminimo siuntėjas (nebūtina):';
$labels['notifyimportance'] = 'Svarbumas';
$labels['notifyimportancelow'] = 'žemas';
$labels['notifyimportancenormal'] = 'normalus';
$labels['notifyimportancehigh'] = 'aukštas';
+$labels['notifymethodmailto'] = 'El. paštas';
+$labels['notifymethodtel'] = 'Telefono numeris';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Kurti filtrą';
$labels['usedata'] = 'Filtrui naudoti šiuos duomenis:';
$labels['nextstep'] = 'Kitas žingsnis';
@@ -155,27 +160,62 @@ $labels['asciicasemap'] = 'nepaisantis raidžių registro („ascii-casemap“)'
$labels['asciinumeric'] = 'skaitinis („ascii-numeric“)';
$labels['index'] = 'turinys:';
$labels['indexlast'] = 'atbulai';
+$labels['vacation'] = 'Atostogos';
+$labels['vacation.reply'] = 'Atsakyti laišku';
+$labels['vacation.advanced'] = 'Papildomos nuostatos';
+$labels['vacation.subject'] = 'Tema';
+$labels['vacation.body'] = 'Laiško tekstas';
+$labels['vacation.status'] = 'Būsena';
+$labels['vacation.on'] = 'Įjungta';
+$labels['vacation.off'] = 'Išjungta';
+$labels['vacation.addresses'] = 'Mano papildomi adresai';
+$labels['vacation.interval'] = 'Atsakymo intervalas';
+$labels['vacation.after'] = 'Atostogų taisyklę pastatyti po';
+$labels['vacation.saving'] = 'Išsaugomi duomenys...';
+$labels['vacation.action'] = 'Veiksmas su gaunamais laiškais';
+$labels['vacation.keep'] = 'Palikti';
+$labels['vacation.discard'] = 'Panaikinti';
+$labels['vacation.redirect'] = 'Peradresuoti kam';
+$labels['vacation.copy'] = 'Siųsti kopiją kam';
+$labels['arialabelfiltersetactions'] = 'Filtrų rinkinio veiksmai';
+$labels['arialabelfilteractions'] = 'Filtro veiksmai';
+$labels['arialabelfilterform'] = 'Filtro nustatymai';
+$labels['ariasummaryfilterslist'] = 'Filtrų sąrašas';
+$labels['ariasummaryfiltersetslist'] = 'Filtrų rinkinių sąrašas';
+$labels['filterstitle'] = 'Tvarkyti gaunamų laiškų filtrus';
+$labels['vacationtitle'] = 'Redaguoti ne-biure taisyklę';
$messages['filterunknownerror'] = 'Nežinoma serverio klaida.';
$messages['filterconnerror'] = 'Neįmanoma užmegzti ryšio su serveriu.';
+$messages['filterdeleteerror'] = 'Nepavyksta ištrinti filtro. Įvyko serverio klaida.';
$messages['filterdeleted'] = 'Filtras panaikintas sėkmingai.';
$messages['filtersaved'] = 'Filtras sėkmingai išsaugotas';
+$messages['filtersaveerror'] = 'Nepavyksta išsaugoti filtro. Įvyko serverio klaida.';
$messages['filterdeleteconfirm'] = 'Ar jūs esate įsitikinęs, jog norite panaikinti pasirinktus filtrus(-ą)?';
$messages['ruledeleteconfirm'] = 'Ar jūs įsitikinęs, jog norite panaikinti pasirinktą taisyklę?';
$messages['actiondeleteconfirm'] = 'Ar jūs įsitikinęs, jog norite panaikinti pasirinktą veiksmą?';
$messages['forbiddenchars'] = 'Laukelyje yra draudžiamų simbolių.';
$messages['cannotbeempty'] = 'Laukelis negali būti tuščias';
$messages['ruleexist'] = 'Filtras tokiu vardu jau yra.';
+$messages['setactivateerror'] = 'Neįmanoma aktyvuoti pasirinkto filtrų rinkinio. Įvyko serverio klaida.';
+$messages['setdeactivateerror'] = 'Neįmanoma išjungti pasirinkto filtrų rinkinio. Įvyko serverio klaida.';
+$messages['setdeleteerror'] = 'Neįmanoma panaikinti pasirinkto filtrų rinkinio. Įvyko serverio klaida.';
$messages['setactivated'] = 'Filtrų rinkinys sėkmingai aktyvuotas.';
$messages['setdeactivated'] = 'Filtrų rinkinys sėkmingai deaktyvuotas.';
$messages['setdeleted'] = 'Filtrų rinkinys sėkmingai panaikintas.';
$messages['setdeleteconfirm'] = 'Ar jūs esate tikri, jog norite panaikinti pasirinktą filtrų rinkinį?';
+$messages['setcreateerror'] = 'Neįmanoma sukurti filtrų rinkinio. Įvyko serverio klaida.';
$messages['setcreated'] = 'Filtrų rinkinys sėkmingai sukurtas.';
+$messages['activateerror'] = 'Neįmanoma įjungti pasirinktų filtrų(-o). Įvyko serverio klaida.';
+$messages['deactivateerror'] = 'Neįmanoma išjungti pasirinktų filtrų(-o). Įvyko serverio klaida.';
$messages['deactivated'] = 'Filtras(-as) sėkmingai išjungti.';
$messages['activated'] = 'Filtras(-as) sėkmingai įjungti.';
$messages['moved'] = 'Filtrai perkelti sėkmingai.';
+$messages['moveerror'] = 'Pasirinkto filtro perkelti neįmanoma. Įvyko serverio klaida.';
$messages['nametoolong'] = 'Vardas per ilgas.';
$messages['namereserved'] = 'Rezervuotas vardas.';
$messages['setexist'] = 'Rinkinys jau yra sukurtas.';
$messages['nodata'] = 'Būtina pasirinkti bent vieną poziciją!';
$messages['invaliddateformat'] = 'Neteisingas datos ar jos dalies formatas';
+$messages['saveerror'] = 'Nepavyksta išsaugoti duomenų. Įvyko serverio klaida.';
+$messages['vacationsaved'] = 'Sėkmingai išsaugoti atostogų duomenys.';
?>
diff --git a/lib/plugins/managesieve/localization/lv_LV.inc b/lib/plugins/managesieve/localization/lv_LV.inc
index 111f3b4..33c000e 100644
--- a/lib/plugins/managesieve/localization/lv_LV.inc
+++ b/lib/plugins/managesieve/localization/lv_LV.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Saņēmējs';
$labels['vacationaddr'] = 'Mana(s) papildus e-pasta adrese(s):';
$labels['vacationdays'] = 'Cik bieži sūtī ziņojumus (dienās):';
$labels['vacationinterval'] = 'Cik bieži sūtīt vēstules:';
-$labels['days'] = 'dienas';
-$labels['seconds'] = 'sekundes';
$labels['vacationreason'] = 'Atvaļinājuma paziņojuma teksts:';
$labels['vacationsubject'] = 'Vēstules tēma:';
+$labels['days'] = 'dienas';
+$labels['seconds'] = 'sekundes';
$labels['rulestop'] = 'Apturēt nosacījumu pārbaudi';
$labels['enable'] = 'Ieslēgt/Izslēgt';
$labels['filterset'] = 'Filtru kopa';
@@ -108,10 +108,6 @@ $labels['varupperfirst'] = 'pirmais burts kā lielais burts';
$labels['varquotewildcard'] = '"citēt" speciālās rakstzīmes';
$labels['varlength'] = 'garums';
$labels['notify'] = 'Sūtīt paziņojumus';
-$labels['notifyaddress'] = 'Uz e-pasta adresi:';
-$labels['notifybody'] = 'Paziņojuma teksts:';
-$labels['notifysubject'] = 'Paziņojuma tēma:';
-$labels['notifyfrom'] = 'Paziņojuma sūtītājs:';
$labels['notifyimportance'] = 'Svarīgums:';
$labels['notifyimportancelow'] = 'zems';
$labels['notifyimportancenormal'] = 'parasts';
diff --git a/lib/plugins/managesieve/localization/nb_NO.inc b/lib/plugins/managesieve/localization/nb_NO.inc
index e0a3448..c9224ae 100644
--- a/lib/plugins/managesieve/localization/nb_NO.inc
+++ b/lib/plugins/managesieve/localization/nb_NO.inc
@@ -47,18 +47,20 @@ $labels['messagesendcopy'] = 'Send en kopi av meldingen til';
$labels['messagereply'] = 'Svar med melding';
$labels['messagedelete'] = 'Slett melding';
$labels['messagediscard'] = 'Avvis med melding';
+$labels['messagekeep'] = 'Behold melding i innboks';
$labels['messagesrules'] = 'For innkommende e-post';
$labels['messagesactions'] = '... gjør følgende:';
$labels['add'] = 'Legg til';
$labels['del'] = 'Slett';
$labels['sender'] = 'Avsender';
$labels['recipient'] = 'Mottaker';
+$labels['vacationaddr'] = 'Tilleggs epost-adresse(r):';
$labels['vacationdays'] = 'Periode mellom meldinger (i dager):';
$labels['vacationinterval'] = 'Periode mellom meldinger:';
-$labels['days'] = 'dager';
-$labels['seconds'] = 'sekunder';
$labels['vacationreason'] = 'Innhold (begrunnelse for fravær)';
$labels['vacationsubject'] = 'Meldingsemne:';
+$labels['days'] = 'dager';
+$labels['seconds'] = 'sekunder';
$labels['rulestop'] = 'Stopp evaluering av regler';
$labels['enable'] = 'Aktiver/Deaktiver';
$labels['filterset'] = 'Filtersett';
@@ -106,10 +108,6 @@ $labels['varupperfirst'] = 'første tegn stor bokstav';
$labels['varquotewildcard'] = 'sitér spesialtegn';
$labels['varlength'] = 'lengde';
$labels['notify'] = 'Send melding';
-$labels['notifyaddress'] = 'Til e-postadresse:';
-$labels['notifybody'] = 'Varseltekst:';
-$labels['notifysubject'] = 'Varselemne:';
-$labels['notifyfrom'] = 'Varselavsender:';
$labels['notifyimportance'] = 'Viktighet:';
$labels['notifyimportancelow'] = 'lav';
$labels['notifyimportancenormal'] = 'normal';
@@ -157,22 +155,31 @@ $labels['index'] = 'index:';
$labels['indexlast'] = 'baklengs';
$messages['filterunknownerror'] = 'Ukjent problem med tjener.';
$messages['filterconnerror'] = 'Kunne ikke koble til tjeneren.';
+$messages['filterdeleteerror'] = 'Kunne ikke slette filter. Fikk feilmelding fra server.';
$messages['filterdeleted'] = 'Filteret er blitt slettet.';
$messages['filtersaved'] = 'Filteret er blitt lagret.';
+$messages['filtersaveerror'] = 'Kunne ikke lagre filter. Fikk feilmelding fra server.';
$messages['filterdeleteconfirm'] = 'Vil du virkelig slette det valgte filteret?';
$messages['ruledeleteconfirm'] = 'Er du sikker på at du vil slette valgte regel?';
$messages['actiondeleteconfirm'] = 'Er du sikker på at du vil slette valgte hendelse?';
$messages['forbiddenchars'] = 'Ugyldige tegn i felt.';
$messages['cannotbeempty'] = 'Feltet kan ikke stå tomt.';
$messages['ruleexist'] = 'Det finnes allerede et filter med dette navnet.';
+$messages['setactivateerror'] = 'Kunne ikke aktivere valgte filtersett. Fikk feilmelding fra server.';
+$messages['setdeactivateerror'] = 'Kunne ikke deaktivere valgte filtersett. Fikk feilmelding fra server.';
+$messages['setdeleteerror'] = 'Kunne ikke slette valgte filtersett. Fikk feilmelding fra server.';
$messages['setactivated'] = 'Filtersett aktivert.';
$messages['setdeactivated'] = 'Filtersett deaktivert.';
$messages['setdeleted'] = 'Filtersett slettet.';
$messages['setdeleteconfirm'] = 'Er du sikker på at du vil slette det valgte filtersettet?';
+$messages['setcreateerror'] = 'Kunne ikke opprette filtersett. Fikk feilmelding fra server.';
$messages['setcreated'] = 'Filtersett opprettet.';
+$messages['activateerror'] = 'Kunne ikke aktivere valgte filter(e). Fikk feilmelding fra server.';
+$messages['deactivateerror'] = 'Kunne ikke deaktivere valgte filter(e). Fikk feilmelding fra server.';
$messages['deactivated'] = 'Filter skrudd på.';
$messages['activated'] = 'Filter skrudd av.';
$messages['moved'] = 'Filter ble flyttet.';
+$messages['moveerror'] = 'Kunne ikke flytte valgte filter. Fikk feilmelding fra server.';
$messages['nametoolong'] = 'Navnet er for langt.';
$messages['namereserved'] = 'Navnet er reservert.';
$messages['setexist'] = 'Settet eksisterer allerede.';
diff --git a/lib/plugins/managesieve/localization/nl_NL.inc b/lib/plugins/managesieve/localization/nl_NL.inc
index 97a4e16..b84b87e 100644
--- a/lib/plugins/managesieve/localization/nl_NL.inc
+++ b/lib/plugins/managesieve/localization/nl_NL.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Ontvanger';
$labels['vacationaddr'] = 'Mijn extra e-mailadres(sen):';
$labels['vacationdays'] = 'Hoe vaak moet een bericht verstuurd worden (in dagen):';
$labels['vacationinterval'] = 'Hoe vaak moet een bericht verstuurd worden:';
-$labels['days'] = 'dagen';
-$labels['seconds'] = 'seconden';
$labels['vacationreason'] = 'Bericht (vakantiereden):';
$labels['vacationsubject'] = 'Onderwerp:';
+$labels['days'] = 'dagen';
+$labels['seconds'] = 'seconden';
$labels['rulestop'] = 'Stop met regels uitvoeren';
$labels['enable'] = 'In-/uitschakelen';
$labels['filterset'] = 'Filterset';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'eerste karakter als hoofdletter';
$labels['varquotewildcard'] = 'speciale karakters quoten';
$labels['varlength'] = 'lengte';
$labels['notify'] = 'Stuur melding';
-$labels['notifyaddress'] = 'Naar e-mailadres:';
-$labels['notifybody'] = 'Meldingsbericht:';
-$labels['notifysubject'] = 'Onderwerp van melding:';
-$labels['notifyfrom'] = 'Afzender:';
+$labels['notifytarget'] = 'Meldingsdoel:';
+$labels['notifymessage'] = 'Meldingsbericht (optioneel):';
+$labels['notifyoptions'] = 'Meldingsopties (optioneel):';
+$labels['notifyfrom'] = 'Meldingsafzender (optioneel):';
$labels['notifyimportance'] = 'Prioriteit:';
$labels['notifyimportancelow'] = 'laag';
$labels['notifyimportancenormal'] = 'normaal';
$labels['notifyimportancehigh'] = 'hoog';
+$labels['notifymethodmailto'] = 'E-mail';
+$labels['notifymethodtel'] = 'Telefoon';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Filter aanmaken';
$labels['usedata'] = 'Gebruik de volgende gegevens in het filter:';
$labels['nextstep'] = 'Volgende stap';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'hoofdletterongevoelig (ascii-casemap)';
$labels['asciinumeric'] = 'numeriek (ascii-numeriek)';
$labels['index'] = 'index:';
$labels['indexlast'] = 'terugwaarts';
+$labels['vacation'] = 'Vakantie';
+$labels['vacation.reply'] = 'Antwoordbericht';
+$labels['vacation.advanced'] = 'Geavanceerde instellingen';
+$labels['vacation.subject'] = 'Onderwerp';
+$labels['vacation.body'] = 'Inhoud';
+$labels['vacation.start'] = 'Begin van vakantie';
+$labels['vacation.end'] = 'Einde van vakantie';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.on'] = 'Aan';
+$labels['vacation.off'] = 'Uit';
+$labels['vacation.addresses'] = 'Mijn extra e-mailadressen';
+$labels['vacation.interval'] = 'Antwoordinterval';
+$labels['vacation.after'] = 'Voeg een vakantieregel toe na';
+$labels['vacation.saving'] = 'Gegevens worden opgeslagen...';
+$labels['vacation.action'] = 'Actie voor inkomend bericht';
+$labels['vacation.keep'] = 'Bewaren';
+$labels['vacation.discard'] = 'Weggooien';
+$labels['vacation.redirect'] = 'Doorsturen naar';
+$labels['vacation.copy'] = 'Kopie sturen naar';
+$labels['arialabelfiltersetactions'] = 'Filtersetacties';
+$labels['arialabelfilteractions'] = 'Filteracties';
+$labels['arialabelfilterform'] = 'Filtereigenschappen';
+$labels['ariasummaryfilterslist'] = 'Filterlijst';
+$labels['ariasummaryfiltersetslist'] = 'Lijst met filtersets';
+$labels['filterstitle'] = 'Bewerk filters voor inkomende berichten';
+$labels['vacationtitle'] = 'Bewerk vakantieregel';
$messages['filterunknownerror'] = 'Onbekende fout';
$messages['filterconnerror'] = 'Kan geen verbinding maken met de managesieve server';
$messages['filterdeleteerror'] = 'Kan filter niet verwijderen. Er trad een serverfout op.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Gereserveerde naam.';
$messages['setexist'] = 'Filterset bestaat al.';
$messages['nodata'] = 'Tenminste één positie moet geselecteerd worden!';
$messages['invaliddateformat'] = 'Ongeldige datum of datumformaat';
+$messages['saveerror'] = 'Opslaan van de gegevens is mislukt. Er trad een serverfout op.';
+$messages['vacationsaved'] = 'Vakantiegegevens succesvol opgeslagen.';
+$messages['emptyvacationbody'] = 'Inhoud van vakantiebericht is verplicht!';
?>
diff --git a/lib/plugins/managesieve/localization/pl_PL.inc b/lib/plugins/managesieve/localization/pl_PL.inc
index 2759309..06c0a79 100644
--- a/lib/plugins/managesieve/localization/pl_PL.inc
+++ b/lib/plugins/managesieve/localization/pl_PL.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Odbiorca';
$labels['vacationaddr'] = 'Moje dodatkowe adresy email:';
$labels['vacationdays'] = 'Częstotliwość wysyłania wiadomości (w dniach):';
$labels['vacationinterval'] = 'Jak często wysyłać wiadomości:';
-$labels['days'] = 'dni';
-$labels['seconds'] = 'sekundy';
$labels['vacationreason'] = 'Treść (przyczyna nieobecności):';
$labels['vacationsubject'] = 'Temat wiadomości:';
+$labels['days'] = 'dni';
+$labels['seconds'] = 'sekundy';
$labels['rulestop'] = 'Przerwij przetwarzanie reguł';
$labels['enable'] = 'Włącz/Wyłącz';
$labels['filterset'] = 'Zbiór filtrów';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'pierwsza wielka litera';
$labels['varquotewildcard'] = 'zamień znaki specjalne';
$labels['varlength'] = 'długość';
$labels['notify'] = 'Wyślij powiadomienie';
-$labels['notifyaddress'] = 'Na adres e-mail:';
-$labels['notifybody'] = 'Treść powiadomienia:';
-$labels['notifysubject'] = 'Tytuł powiadomienia:';
-$labels['notifyfrom'] = 'Nadawca powiadomienia:';
+$labels['notifytarget'] = 'Odbiorca powiadomienia:';
+$labels['notifymessage'] = 'Wiadomość powiadomienia (opcjonalne):';
+$labels['notifyoptions'] = 'Opcje powiadomienia (opcjonalne):';
+$labels['notifyfrom'] = 'Nadawca powiadomienia (opcjonalne):';
$labels['notifyimportance'] = 'Priorytet:';
$labels['notifyimportancelow'] = 'niski';
$labels['notifyimportancenormal'] = 'normalny';
$labels['notifyimportancehigh'] = 'wysoki';
+$labels['notifymethodmailto'] = 'E-Mail';
+$labels['notifymethodtel'] = 'Telefon';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Utwórz filtr';
$labels['usedata'] = 'Użyj następujących danych do utworzenia filtra:';
$labels['nextstep'] = 'Następny krok';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'nierozróżniający wielkości liter (ascii-casemap)'
$labels['asciinumeric'] = 'numeryczny (ascii-numeric)';
$labels['index'] = 'indeks:';
$labels['indexlast'] = 'wstecz';
+$labels['vacation'] = 'Nieobecność';
+$labels['vacation.reply'] = 'Odpowiedź';
+$labels['vacation.advanced'] = 'Ustawienia zaawansowane';
+$labels['vacation.subject'] = 'Temat';
+$labels['vacation.body'] = 'Treść';
+$labels['vacation.start'] = 'Początek nieobecności';
+$labels['vacation.end'] = 'Koniec nieobecności';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.on'] = 'włączone';
+$labels['vacation.off'] = 'wyłączone';
+$labels['vacation.addresses'] = 'Moje dodatkowe adresy';
+$labels['vacation.interval'] = 'Częstotliwość odpowiedzi';
+$labels['vacation.after'] = 'Umieść regułę odpowiedzi po';
+$labels['vacation.saving'] = 'Zapisywanie danych...';
+$labels['vacation.action'] = 'Akcje wiadomości przychodzących';
+$labels['vacation.keep'] = 'Zachowaj';
+$labels['vacation.discard'] = 'Odrzuć';
+$labels['vacation.redirect'] = 'Przekaż do';
+$labels['vacation.copy'] = 'Wyślij kopię do';
+$labels['arialabelfiltersetactions'] = 'Zbiór filtrów akcji';
+$labels['arialabelfilteractions'] = 'Akcje filtrów';
+$labels['arialabelfilterform'] = 'Ustawienia filtrów';
+$labels['ariasummaryfilterslist'] = 'Spis filtrów';
+$labels['ariasummaryfiltersetslist'] = 'Lista zbiorów filtrów';
+$labels['filterstitle'] = 'Zarządzaj filtrami wiadomości przychodzących';
+$labels['vacationtitle'] = 'Zarządzaj asystentem nieobecności';
$messages['filterunknownerror'] = 'Nieznany błąd serwera.';
$messages['filterconnerror'] = 'Nie można nawiązać połączenia z serwerem.';
$messages['filterdeleteerror'] = 'Nie można usunąć filtra. Błąd serwera.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Nazwa zarezerwowana.';
$messages['setexist'] = 'Zbiór już istnieje.';
$messages['nodata'] = 'Należy wybrać co najmniej jedną pozycję!';
$messages['invaliddateformat'] = 'Nieprawidłowy format daty lub fragmentu daty';
+$messages['saveerror'] = 'Nie można zapisać danych. Wystąpił błąd serwera.';
+$messages['vacationsaved'] = 'Dane nieobecności zapisano pomyślnie.';
+$messages['emptyvacationbody'] = 'Treść wiadomości jest wymagana!';
?>
diff --git a/lib/plugins/managesieve/localization/pt_BR.inc b/lib/plugins/managesieve/localization/pt_BR.inc
index 063c60c..b0ccaf6 100644
--- a/lib/plugins/managesieve/localization/pt_BR.inc
+++ b/lib/plugins/managesieve/localization/pt_BR.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Destinatário';
$labels['vacationaddr'] = 'Meu endereço de e-mail adicional:';
$labels['vacationdays'] = 'Enviar mensagens com que frequência (em dias):';
$labels['vacationinterval'] = 'Como geralmente enviam mensagens:';
-$labels['days'] = 'dias';
-$labels['seconds'] = 'segundos';
$labels['vacationreason'] = 'Corpo da mensagem (motivo de férias):';
$labels['vacationsubject'] = 'Título da mensagem:';
+$labels['days'] = 'dias';
+$labels['seconds'] = 'segundos';
$labels['rulestop'] = 'Parar de avaliar regras';
$labels['enable'] = 'Habilitar/Desabilitar';
$labels['filterset'] = 'Conjunto de filtros';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'primeiro caractere maiúsculo';
$labels['varquotewildcard'] = 'caracteres especiais de citação';
$labels['varlength'] = 'tamanho';
$labels['notify'] = 'Enviar notificação';
-$labels['notifyaddress'] = 'Para endereço de e-mail:';
-$labels['notifybody'] = 'Corpo da notificação:';
-$labels['notifysubject'] = 'Título da notificação:';
-$labels['notifyfrom'] = 'Remetente da notificação:';
+$labels['notifytarget'] = 'Destino da notificação:';
+$labels['notifymessage'] = 'Mensagem de notificação (opcional):';
+$labels['notifyoptions'] = 'Opções de notificação (opcional):';
+$labels['notifyfrom'] = 'Remetente da notificação (opcional):';
$labels['notifyimportance'] = 'Importância';
$labels['notifyimportancelow'] = 'baixa';
$labels['notifyimportancenormal'] = 'normal';
$labels['notifyimportancehigh'] = 'alta';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Telefone';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Criar filtro';
$labels['usedata'] = 'Usar os seguintes dados no filtro:';
$labels['nextstep'] = 'Próximo Passo';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'caso insensível (mapa de caracteres ascii)';
$labels['asciinumeric'] = 'numérico (ascii-numeric)';
$labels['index'] = 'índice:';
$labels['indexlast'] = 'retroceder';
+$labels['vacation'] = 'Férias';
+$labels['vacation.reply'] = 'Responder mensagem';
+$labels['vacation.advanced'] = 'Opções avançadas';
+$labels['vacation.subject'] = 'Assunto';
+$labels['vacation.body'] = 'Conteúdo';
+$labels['vacation.start'] = 'Início das férias';
+$labels['vacation.end'] = 'Término das férias';
+$labels['vacation.status'] = 'Estado';
+$labels['vacation.on'] = 'Ligado';
+$labels['vacation.off'] = 'Desligado';
+$labels['vacation.addresses'] = 'Meus endereços de e-mail adicionais';
+$labels['vacation.interval'] = 'Intervalo de resposta';
+$labels['vacation.after'] = 'Colocar regra de férias após';
+$labels['vacation.saving'] = 'Salvando dados...';
+$labels['vacation.action'] = 'Ações para mensagens recebidas';
+$labels['vacation.keep'] = 'Manter';
+$labels['vacation.discard'] = 'Descartar';
+$labels['vacation.redirect'] = 'Redirecionar para';
+$labels['vacation.copy'] = 'Enviar cópia para';
+$labels['arialabelfiltersetactions'] = 'Ações do grupo de filtros';
+$labels['arialabelfilteractions'] = 'Ações do filtro';
+$labels['arialabelfilterform'] = 'Propriedades do filtro';
+$labels['ariasummaryfilterslist'] = 'Lista dos filtros';
+$labels['ariasummaryfiltersetslist'] = 'Lista de grupo de filtros';
+$labels['filterstitle'] = 'Editar filtro dos e-mails recebidos';
+$labels['vacationtitle'] = 'Editar regra de ausência';
$messages['filterunknownerror'] = 'Erro desconhecido de servidor';
$messages['filterconnerror'] = 'Não foi possível conectar ao servidor managesieve';
$messages['filterdeleteerror'] = 'Impossível excluir o filtro. Ocorreu um erro no servidor.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Nome reservado.';
$messages['setexist'] = 'Conjunto já existe.';
$messages['nodata'] = 'Pelo menos uma posição precisa ser selecionada!';
$messages['invaliddateformat'] = 'Data inválida';
+$messages['saveerror'] = 'Impossível salvar dados. Ocorreu um erro no servidor.';
+$messages['vacationsaved'] = 'Dados de férias salvos com sucesso.';
+$messages['emptyvacationbody'] = 'Conteúdo da mensagem de férias necessário!';
?>
diff --git a/lib/plugins/managesieve/localization/pt_PT.inc b/lib/plugins/managesieve/localization/pt_PT.inc
index 4e93076..ec39542 100644
--- a/lib/plugins/managesieve/localization/pt_PT.inc
+++ b/lib/plugins/managesieve/localization/pt_PT.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Destinatário';
$labels['vacationaddr'] = 'Os meus endereços de e-mail adicionais:';
$labels['vacationdays'] = 'Enviar mensagens com que frequência (em dias):';
$labels['vacationinterval'] = 'Com que frequência envia mensagens:';
-$labels['days'] = 'dias';
-$labels['seconds'] = 'segundos';
$labels['vacationreason'] = 'Conteúdo da mensagem (motivo da ausência):';
$labels['vacationsubject'] = 'Assunto da mensagem:';
+$labels['days'] = 'dias';
+$labels['seconds'] = 'segundos';
$labels['rulestop'] = 'Parar de avaliar regras';
$labels['enable'] = 'Activar/Desactivar';
$labels['filterset'] = 'Filtros definidos';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'primeira letra em maiúscula';
$labels['varquotewildcard'] = 'citar caracteres especiais';
$labels['varlength'] = 'tamanho';
$labels['notify'] = 'Enviar notificação';
-$labels['notifyaddress'] = 'Endereço de E-mail to:';
-$labels['notifybody'] = 'Corpo de Notificação:';
-$labels['notifysubject'] = 'Assunto Notificação:';
-$labels['notifyfrom'] = 'Remetente Notificação:';
+$labels['notifytarget'] = 'Destino da notificação:';
+$labels['notifymessage'] = 'Mensagem de notificação (opcional):';
+$labels['notifyoptions'] = 'Opções de notificação (opcional):';
+$labels['notifyfrom'] = 'Remetente da notificação (opcional):';
$labels['notifyimportance'] = 'Importância:';
$labels['notifyimportancelow'] = 'baixa';
$labels['notifyimportancenormal'] = 'normal';
$labels['notifyimportancehigh'] = 'alta';
+$labels['notifymethodmailto'] = 'Email';
+$labels['notifymethodtel'] = 'Telefone';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Criar filtro';
$labels['usedata'] = 'Usar os seguintes dados no filtro:';
$labels['nextstep'] = 'Próximo passo';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'não sensível a maiúsculas/minúsculas (caracteres
$labels['asciinumeric'] = 'numérico (numérico ascii)';
$labels['index'] = 'índice:';
$labels['indexlast'] = 'retroceder';
+$labels['vacation'] = 'Férias';
+$labels['vacation.reply'] = 'Mensagem de resposta';
+$labels['vacation.advanced'] = 'Definições avançadas';
+$labels['vacation.subject'] = 'Assunto';
+$labels['vacation.body'] = 'Corpo da mensagem';
+$labels['vacation.start'] = 'Início de férias';
+$labels['vacation.end'] = 'Fim de férias';
+$labels['vacation.status'] = 'Estado';
+$labels['vacation.on'] = 'Ligar';
+$labels['vacation.off'] = 'Desligar';
+$labels['vacation.addresses'] = 'Meus endereços adicionais';
+$labels['vacation.interval'] = 'Intervalo de resposta';
+$labels['vacation.after'] = 'Coloque regra de férias depois';
+$labels['vacation.saving'] = 'A guardar dados...';
+$labels['vacation.action'] = 'Acção para mensagem recebida';
+$labels['vacation.keep'] = 'Manter';
+$labels['vacation.discard'] = 'Rejeitar';
+$labels['vacation.redirect'] = 'Redireccionar para';
+$labels['vacation.copy'] = 'Enviar cópia para';
+$labels['arialabelfiltersetactions'] = 'Acções do conjunto de filtros';
+$labels['arialabelfilteractions'] = 'Acções dos filtros';
+$labels['arialabelfilterform'] = 'Propriedades dos filtro';
+$labels['ariasummaryfilterslist'] = 'Lista de filtros';
+$labels['ariasummaryfiltersetslist'] = 'Lista de conjuntos de filtros';
+$labels['filterstitle'] = 'Editar filtros de mensagens recebidas';
+$labels['vacationtitle'] = 'Editar regra de ausência do escritório';
$messages['filterunknownerror'] = 'Erro de servidor desconhecido';
$messages['filterconnerror'] = 'Não é possível ligar ao servidor Sieve';
$messages['filterdeleteerror'] = 'Não foi possível eliminar o filtro. Ocorreu um erro no servidor.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Nome invertido.';
$messages['setexist'] = 'O conjunto já existe.';
$messages['nodata'] = 'Deve selecionar pelo menos uma posição.';
$messages['invaliddateformat'] = 'Data ou formato de data inválido.';
+$messages['saveerror'] = 'Não foi possível guardar os dados. Ocorreu um erro no servidor.';
+$messages['vacationsaved'] = 'Dados de férias guardados com sucesso.';
+$messages['emptyvacationbody'] = 'É necessário o corpo da mensagem de férias!';
?>
diff --git a/lib/plugins/managesieve/localization/ro_RO.inc b/lib/plugins/managesieve/localization/ro_RO.inc
index 2cddf36..017320e 100644
--- a/lib/plugins/managesieve/localization/ro_RO.inc
+++ b/lib/plugins/managesieve/localization/ro_RO.inc
@@ -54,13 +54,13 @@ $labels['add'] = 'Adauga';
$labels['del'] = 'Sterge';
$labels['sender'] = 'Expeditor';
$labels['recipient'] = 'Destinatar';
-$labels['vacationaddr'] = 'Adrese(le) mele de email suplimentare:';
+$labels['vacationaddr'] = 'Adresele mele de e-mail (adiţionale)';
$labels['vacationdays'] = 'Cat de des sa trimit mesajele (in zile):';
$labels['vacationinterval'] = 'Cât de des să trimit mesaje:';
-$labels['days'] = 'zile';
-$labels['seconds'] = 'secunde';
$labels['vacationreason'] = 'Corpul mesajului (motivul vacantei):';
$labels['vacationsubject'] = 'Subiectul mesajului:';
+$labels['days'] = 'zile';
+$labels['seconds'] = 'secunde';
$labels['rulestop'] = 'Nu mai evalua reguli';
$labels['enable'] = 'Activeaza/Dezactiveaza';
$labels['filterset'] = 'Filtre setate';
@@ -108,10 +108,6 @@ $labels['varupperfirst'] = 'primul caracter cu litre mari';
$labels['varquotewildcard'] = 'caracterele speciale in citat';
$labels['varlength'] = 'lungime';
$labels['notify'] = 'Notificare trimitere';
-$labels['notifyaddress'] = 'La adresa de e-mail';
-$labels['notifybody'] = 'Mesajul de notificare:';
-$labels['notifysubject'] = 'Subiectul notificării:';
-$labels['notifyfrom'] = 'Expeditorul notificării:';
$labels['notifyimportance'] = 'Importanța:';
$labels['notifyimportancelow'] = 'mică';
$labels['notifyimportancenormal'] = 'normală';
@@ -157,27 +153,50 @@ $labels['asciicasemap'] = 'ignoră majusculele (ascii-casemap)';
$labels['asciinumeric'] = 'numeric (ascii-numeric)';
$labels['index'] = 'index:';
$labels['indexlast'] = 'invers';
+$labels['vacation'] = 'Vacanta';
+$labels['vacation.reply'] = 'Raspunde mesajului';
+$labels['vacation.advanced'] = 'Setari avansate';
+$labels['vacation.subject'] = 'Subiect';
+$labels['vacation.body'] = 'Corp';
+$labels['vacation.status'] = 'Statut';
+$labels['vacation.on'] = 'Pe';
+$labels['vacation.off'] = 'De pe';
+$labels['vacation.addresses'] = 'Adresa mea aditionala';
+$labels['vacation.interval'] = 'Interval de raspundere';
+$labels['vacation.after'] = 'Pune regula de vacanta dupa';
+$labels['vacation.saving'] = 'Salvez datele...';
$messages['filterunknownerror'] = 'Eroare necunoscută la server:';
$messages['filterconnerror'] = 'Nu mă pot conecta la server.';
+$messages['filterdeleteerror'] = 'Nu pot şterge filtrul. S-a produs o eroare la server.';
$messages['filterdeleted'] = 'Filtrul a fost şters cu succes.';
$messages['filtersaved'] = 'Filtrul a fost salvat cu succes.';
+$messages['filtersaveerror'] = 'Nu am putut salva filtrul. S-a produs o eroare la server.';
$messages['filterdeleteconfirm'] = 'Chiar vrei să ştergi filtrul selectat?';
$messages['ruledeleteconfirm'] = 'Eşti sigur că vrei să ştergi regula selectată?';
$messages['actiondeleteconfirm'] = 'Eşti sigur că vrei să ştergi acţiunea selectată?';
$messages['forbiddenchars'] = 'Caractere nepermise în câmp.';
$messages['cannotbeempty'] = 'Câmpul nu poate fi gol.';
$messages['ruleexist'] = 'Filtrul cu numele specificat există deja.';
+$messages['setactivateerror'] = 'Nu pot activa setul de filtre selectat. S-a produs o eroare la server.';
+$messages['setdeactivateerror'] = 'Nu pot dezactiva setul de filtre selectat. S-a produs o eroare la server.';
+$messages['setdeleteerror'] = 'Nu pot şterge setul de filtre selectat. S-a produs o eroare la server.';
$messages['setactivated'] = 'Setul de filtre activat cu succes.';
$messages['setdeactivated'] = 'Setul de filtre dezactivat cu succes.';
$messages['setdeleted'] = 'Setul de filtre şters cu succes.';
$messages['setdeleteconfirm'] = 'Eşti sigur(ă) că vrei să ştergi setul de filtre selectat?';
+$messages['setcreateerror'] = 'Nu am putut crea setul de filtre. S-a produs o eroare la server.';
$messages['setcreated'] = 'Setul de filtre creat cu succes.';
+$messages['activateerror'] = 'Nu am putut activa filtrul (filtrele) selectate. S-a produs o eroare la server.';
+$messages['deactivateerror'] = 'Nu am putut dezactiva filtrele (filtrele) selectate. S-a produs o eroare la server.';
$messages['deactivated'] = 'Filtrele au fost activate cu succes.';
$messages['activated'] = 'Filtrele au fost dezactivate cu succes.';
$messages['moved'] = 'Filtrele au fost mutate cu succes.';
+$messages['moveerror'] = 'Nu am putut muta filtrul selectat. S-a produs o eroare la server.';
$messages['nametoolong'] = 'Numele este prea lung.';
$messages['namereserved'] = 'Nume rezervat.';
$messages['setexist'] = 'Setul există deja.';
$messages['nodata'] = 'Trebuie selectată cel putin o poziţie!';
$messages['invaliddateformat'] = 'Data sau parte din data in format invalid';
+$messages['saveerror'] = 'Nu am putut salva datele. A aparut o eroare de server.';
+$messages['vacationsaved'] = 'Data de vacanta salvata cu succes';
?>
diff --git a/lib/plugins/managesieve/localization/ru_RU.inc b/lib/plugins/managesieve/localization/ru_RU.inc
index ea0ebd2..6714c4c 100644
--- a/lib/plugins/managesieve/localization/ru_RU.inc
+++ b/lib/plugins/managesieve/localization/ru_RU.inc
@@ -165,9 +165,8 @@ $labels['vacation.reply'] = 'Ответное сообщение';
$labels['vacation.advanced'] = 'Дополнительные настройки';
$labels['vacation.subject'] = 'Тема';
$labels['vacation.body'] = 'Тело письма';
-$labels['vacation.dates'] = 'Время отпуска';
-$labels['vacation.from'] = 'От:';
-$labels['vacation.to'] = 'Кому:';
+$labels['vacation.start'] = 'Начало отпуска';
+$labels['vacation.end'] = 'Конец отпуска';
$labels['vacation.status'] = 'Состояние';
$labels['vacation.on'] = 'Вкл.';
$labels['vacation.off'] = 'Выкл.';
diff --git a/lib/plugins/managesieve/localization/sk_SK.inc b/lib/plugins/managesieve/localization/sk_SK.inc
index 9a75586..4cad13f 100644
--- a/lib/plugins/managesieve/localization/sk_SK.inc
+++ b/lib/plugins/managesieve/localization/sk_SK.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Príjemca';
$labels['vacationaddr'] = 'Iná moja e-mailová adresa (adresy):';
$labels['vacationdays'] = 'Ako často odosielať správy (v dňoch):';
$labels['vacationinterval'] = 'Ako často odosielať správy:';
-$labels['days'] = 'dní';
-$labels['seconds'] = 'sekúnd';
$labels['vacationreason'] = 'Telo správy (dôvod neprítomnosti):';
$labels['vacationsubject'] = 'Predmet správy:';
+$labels['days'] = 'dní';
+$labels['seconds'] = 'sekúnd';
$labels['rulestop'] = 'Koniec pravidiel';
$labels['enable'] = 'Zapnúť/vypnúť';
$labels['filterset'] = 'Súprava filtrov';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'prvé písmeno veľké';
$labels['varquotewildcard'] = 'k špeciálnym znakom pridať úvodzovky';
$labels['varlength'] = 'dĺžka';
$labels['notify'] = 'Odoslať oznámenie';
-$labels['notifyaddress'] = 'Na e-mailovú adresu:';
-$labels['notifybody'] = 'Telo oznámenia:';
-$labels['notifysubject'] = 'Predmet oznámenia:';
-$labels['notifyfrom'] = 'Odosielateľ oznámenia:';
+$labels['notifytarget'] = 'Cieľ notifikácie:';
+$labels['notifymessage'] = 'Notifikačná správa (voliteľne):';
+$labels['notifyoptions'] = 'Nastavenia notifikácie (voliteľné):';
+$labels['notifyfrom'] = 'Odosielateľ notifikácie (voliteľne):';
$labels['notifyimportance'] = 'Priorita:';
$labels['notifyimportancelow'] = 'nízka';
$labels['notifyimportancenormal'] = 'normálna';
$labels['notifyimportancehigh'] = 'vysoká';
+$labels['notifymethodmailto'] = 'E-mail';
+$labels['notifymethodtel'] = 'Telefón';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Vytvoriť filter';
$labels['usedata'] = 'Použiť tieto údaje vo filtri:';
$labels['nextstep'] = 'Ďalší krok';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'nerozlišuje veľké a malé písmená (ascii tabuľk
$labels['asciinumeric'] = 'numerické (ascii čísla)';
$labels['index'] = 'index:';
$labels['indexlast'] = 'dozadu';
+$labels['vacation'] = 'Dovolenka';
+$labels['vacation.reply'] = 'Odpoveď na správu';
+$labels['vacation.advanced'] = 'Pokročilé nastavenia';
+$labels['vacation.subject'] = 'Predmet';
+$labels['vacation.body'] = 'Telo';
+$labels['vacation.start'] = 'Začiatok dovolenky';
+$labels['vacation.end'] = 'Koniec dovolenky';
+$labels['vacation.status'] = 'Stav';
+$labels['vacation.on'] = 'Zap.';
+$labels['vacation.off'] = 'Vyp.';
+$labels['vacation.addresses'] = 'Moje ďalšie adresy';
+$labels['vacation.interval'] = 'Interval odpovedania';
+$labels['vacation.after'] = 'Nastaviť pravidlo pre dovolenku po';
+$labels['vacation.saving'] = 'Ukladanie údajov...';
+$labels['vacation.action'] = 'Akcia pre prichádzajúcu správu';
+$labels['vacation.keep'] = 'Zachovať';
+$labels['vacation.discard'] = 'Vyhodiť do koša';
+$labels['vacation.redirect'] = 'Presmerovať na';
+$labels['vacation.copy'] = 'Poslať kópiu na';
+$labels['arialabelfiltersetactions'] = 'Akcie zo súpravy filtrov';
+$labels['arialabelfilteractions'] = 'Akcie filtra';
+$labels['arialabelfilterform'] = 'Nastavenia filtra';
+$labels['ariasummaryfilterslist'] = 'Zoznam filtrov';
+$labels['ariasummaryfiltersetslist'] = 'Zoznam súprav s filtrami';
+$labels['filterstitle'] = 'Upraviť filtre prichádzajúcich e-mailov';
+$labels['vacationtitle'] = 'Upraviť pravidlo pre čas mimo kancelárie';
$messages['filterunknownerror'] = 'Neznáma chyba servera.';
$messages['filterconnerror'] = 'Nepodarilo sa pripojiť k serveru.';
$messages['filterdeleteerror'] = 'Nemožno vymazať filter. Nastala chyba servera.';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Rezervovaný názov.';
$messages['setexist'] = 'Súprava už existuje.';
$messages['nodata'] = 'Aspoň jedna pozícia musí byť zvolená!';
$messages['invaliddateformat'] = 'Neplatný formát dátumu alebo časti dátumu';
+$messages['saveerror'] = 'Údaje nemožno uložiť. Nastala chyba servera.';
+$messages['vacationsaved'] = 'Údaje o dovolenke boli úspešne uložené.';
+$messages['emptyvacationbody'] = 'Musíte zadať telo správy, zobrazovanej v čase neprítomnosti!';
?>
diff --git a/lib/plugins/managesieve/localization/sl_SI.inc b/lib/plugins/managesieve/localization/sl_SI.inc
index 2915684..f0e5159 100644
--- a/lib/plugins/managesieve/localization/sl_SI.inc
+++ b/lib/plugins/managesieve/localization/sl_SI.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Prejemnik';
$labels['vacationaddr'] = 'Moji dodatni e-naslovi';
$labels['vacationdays'] = 'Kako pogosto naj bodo sporočila poslana (v dnevih):';
$labels['vacationinterval'] = 'Sporočila pošlji na:';
-$labels['days'] = 'dni';
-$labels['seconds'] = 'sekund';
$labels['vacationreason'] = 'Vsebina sporočila (vzrok za odsotnost):';
$labels['vacationsubject'] = 'Zadeva sporočila';
+$labels['days'] = 'dni';
+$labels['seconds'] = 'sekund';
$labels['rulestop'] = 'Prekini z izvajanjem pravil';
$labels['enable'] = 'Omogoči/Onemogoči';
$labels['filterset'] = 'Nastavitev filtrov';
@@ -108,10 +108,6 @@ $labels['varupperfirst'] = 'prvi znak velika začetnica';
$labels['varquotewildcard'] = 'citiraj posebne znake';
$labels['varlength'] = 'dolžina';
$labels['notify'] = 'Poštlji obvestilo';
-$labels['notifyaddress'] = 'Na elektronski naslov:';
-$labels['notifybody'] = 'Telo obvestila:';
-$labels['notifysubject'] = 'Zadeva obvestila:';
-$labels['notifyfrom'] = 'Pošiljatelj obvestila:';
$labels['notifyimportance'] = 'Pomembnost:';
$labels['notifyimportancelow'] = 'nizko';
$labels['notifyimportancenormal'] = 'običajno';
diff --git a/lib/plugins/managesieve/localization/sv_SE.inc b/lib/plugins/managesieve/localization/sv_SE.inc
index 131d46c..ede13cb 100644
--- a/lib/plugins/managesieve/localization/sv_SE.inc
+++ b/lib/plugins/managesieve/localization/sv_SE.inc
@@ -19,7 +19,7 @@ $labels['filters'] = 'Filter';
$labels['managefilters'] = 'Administrera filter';
$labels['filtername'] = 'Filternamn';
$labels['newfilter'] = 'Nytt filter';
-$labels['filteradd'] = 'Lägg till filter';
+$labels['filteradd'] = 'Nytt filter';
$labels['filterdel'] = 'Ta bort filter';
$labels['moveup'] = 'Flytta upp filter';
$labels['movedown'] = 'Flytta ner filter';
@@ -57,15 +57,15 @@ $labels['recipient'] = 'Mottagare';
$labels['vacationaddr'] = 'Ytterligare mottagaradresser:';
$labels['vacationdays'] = 'Antal dagar mellan auto-svar:';
$labels['vacationinterval'] = 'Tid mellan auto-svar:';
+$labels['vacationreason'] = 'Meddelandetext (frånvaroanledning):';
+$labels['vacationsubject'] = 'Meddelandeämne:';
$labels['days'] = 'Dagar';
$labels['seconds'] = 'Sekunder';
-$labels['vacationreason'] = 'Meddelande i auto-svar:';
-$labels['vacationsubject'] = 'Meddelandeämne:';
$labels['rulestop'] = 'Avsluta filtrering';
$labels['enable'] = 'Aktivera/deaktivera';
$labels['filterset'] = 'Filtergrupp';
$labels['filtersets'] = 'Filtergrupper';
-$labels['filtersetadd'] = 'Lägg till filtergrupp';
+$labels['filtersetadd'] = 'Ny filtergrupp';
$labels['filtersetdel'] = 'Ta bort filtergrupp';
$labels['filtersetact'] = 'Aktivera filtergrupp';
$labels['filtersetdeact'] = 'Deaktivera filtergrupp';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'Första tecken versalt';
$labels['varquotewildcard'] = 'Koda specialtecken';
$labels['varlength'] = 'Längd';
$labels['notify'] = 'Skicka avisering';
-$labels['notifyaddress'] = 'Mottagaradress:';
-$labels['notifybody'] = 'Aviseringsmeddelande:';
-$labels['notifysubject'] = 'Aviseringsämne:';
-$labels['notifyfrom'] = 'Aviseringsavsändare:';
+$labels['notifytarget'] = 'Aviseringsmål:';
+$labels['notifymessage'] = 'Aviseringsmeddelande (valfritt):';
+$labels['notifyoptions'] = 'Aviseringstillval (valfritt):';
+$labels['notifyfrom'] = 'Aviseringsavsändare (valfri):';
$labels['notifyimportance'] = 'Prioritet:';
$labels['notifyimportancelow'] = 'Låg';
$labels['notifyimportancenormal'] = 'Normal';
$labels['notifyimportancehigh'] = 'Hög';
+$labels['notifymethodmailto'] = 'E-post';
+$labels['notifymethodtel'] = 'Telefon';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Skapa filter';
$labels['usedata'] = 'Använd följande information i filtret:';
$labels['nextstep'] = 'Nästa steg';
@@ -157,6 +160,32 @@ $labels['asciicasemap'] = 'teckenlägesokänslig (ascii-casemap)';
$labels['asciinumeric'] = 'numerisk (ascii-numeric)';
$labels['index'] = 'index:';
$labels['indexlast'] = 'omvänd';
+$labels['vacation'] = 'Frånvaro';
+$labels['vacation.reply'] = 'Besvara meddelande';
+$labels['vacation.advanced'] = 'Avancerade inställningar';
+$labels['vacation.subject'] = 'Ämne';
+$labels['vacation.body'] = 'Innehåll';
+$labels['vacation.start'] = 'Frånvaron börjar';
+$labels['vacation.end'] = 'Frånvaron slutar';
+$labels['vacation.status'] = 'Status';
+$labels['vacation.on'] = 'På';
+$labels['vacation.off'] = 'Av';
+$labels['vacation.addresses'] = 'Ytterligare mottagaradresser';
+$labels['vacation.interval'] = 'Svarsintervall';
+$labels['vacation.after'] = 'Placera frånvaroregel efter';
+$labels['vacation.saving'] = 'Sparar data...';
+$labels['vacation.action'] = 'Hantering av inkommande meddelanden';
+$labels['vacation.keep'] = 'Behåll';
+$labels['vacation.discard'] = 'Förkasta';
+$labels['vacation.redirect'] = 'Ändra mottagare till';
+$labels['vacation.copy'] = 'Skicka kopia till';
+$labels['arialabelfiltersetactions'] = 'Hantera filtergrupper';
+$labels['arialabelfilteractions'] = 'Hantera filter';
+$labels['arialabelfilterform'] = 'Filteregenskaper';
+$labels['ariasummaryfilterslist'] = 'Lista med filter';
+$labels['ariasummaryfiltersetslist'] = 'Lista med filtergrupper';
+$labels['filterstitle'] = 'Ändra filter för inkommande meddelanden';
+$labels['vacationtitle'] = 'Ändra regel för frånvaromeddelande';
$messages['filterunknownerror'] = 'Okänt serverfel';
$messages['filterconnerror'] = 'Anslutning till serverns filtertjänst misslyckades';
$messages['filterdeleteerror'] = 'Filtret kunde inte tas bort på grund av serverfel';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'Reserverat namn.';
$messages['setexist'] = 'Filtergrupp finns redan.';
$messages['nodata'] = 'Minst en position måste väljas!';
$messages['invaliddateformat'] = 'Ogiltigt datum eller del av datumformat';
+$messages['saveerror'] = 'Datan kunde inte sparas på grund av serverfel.';
+$messages['vacationsaved'] = 'Frånvarodatan har sparats.';
+$messages['emptyvacationbody'] = 'Text för frånvaromeddelande saknas!';
?>
diff --git a/lib/plugins/managesieve/localization/tr_TR.inc b/lib/plugins/managesieve/localization/tr_TR.inc
index b0b09e1..c618386 100644
--- a/lib/plugins/managesieve/localization/tr_TR.inc
+++ b/lib/plugins/managesieve/localization/tr_TR.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Alıcı';
$labels['vacationaddr'] = 'Ek e-posta adres(ler)im:';
$labels['vacationdays'] = 'Ne sıklıkla mesajlar gönderilir(gün)';
$labels['vacationinterval'] = 'Ne kadar sıklıkla mesaj gönderirsiniz:';
-$labels['days'] = 'günler';
-$labels['seconds'] = 'saniyeler';
$labels['vacationreason'] = 'Mesaj gövdesi(tatil sebebi):';
$labels['vacationsubject'] = 'Mesaj konusu:';
+$labels['days'] = 'günler';
+$labels['seconds'] = 'saniyeler';
$labels['rulestop'] = 'Kuralları değerlendirmeyi bitir';
$labels['enable'] = 'Etkinleştir/Etkisiz Kıl';
$labels['filterset'] = 'Filtre seti';
@@ -98,7 +98,7 @@ $labels['flaganswered'] = 'Cevaplanmış';
$labels['flagflagged'] = 'İşaretli';
$labels['flagdraft'] = 'Taslak';
$labels['setvariable'] = 'Değişken tanımla';
-$labels['setvarname'] = 'Değişken adı';
+$labels['setvarname'] = 'Değişken adı:';
$labels['setvarvalue'] = 'Değişken değeri:';
$labels['setvarmodifiers'] = 'Değiştiriciler:';
$labels['varlower'] = 'küçük harf';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'İlk karakter büyük harf';
$labels['varquotewildcard'] = 'özel karakterleri tırnak içine al';
$labels['varlength'] = 'uzunluk';
$labels['notify'] = 'Bildirim gönder';
-$labels['notifyaddress'] = 'Alıcı e-posta adresi';
-$labels['notifybody'] = 'Bildirim gövdesi:';
-$labels['notifysubject'] = 'Bildirim konusu:';
-$labels['notifyfrom'] = 'Bildirim göndericisi:';
-$labels['notifyimportance'] = 'Önem derecesi';
+$labels['notifytarget'] = 'Bildirim hedefi:';
+$labels['notifymessage'] = 'Bildirim mesajı (tercihe bağlı):';
+$labels['notifyoptions'] = 'Bildirim tercihleri (tercihe bağlı):';
+$labels['notifyfrom'] = 'Bildirim göndericisi (tercihe bağlı):';
+$labels['notifyimportance'] = 'Önem derecesi:';
$labels['notifyimportancelow'] = 'düşük';
$labels['notifyimportancenormal'] = 'normal';
$labels['notifyimportancehigh'] = 'yüksek';
+$labels['notifymethodmailto'] = 'E-posta';
+$labels['notifymethodtel'] = 'Telefon';
+$labels['notifymethodsms'] = 'SMS';
$labels['filtercreate'] = 'Süzgeç oluştur';
$labels['usedata'] = 'Aşağıdaki verileri süzgeçte kullan';
$labels['nextstep'] = 'Sonraki adım';
@@ -157,11 +160,37 @@ $labels['asciicasemap'] = 'büyük küçük harf duyarsız(ascii-casemap)';
$labels['asciinumeric'] = 'sayı (ascii-numeric)';
$labels['index'] = 'indeks:';
$labels['indexlast'] = 'geriye yönelik';
+$labels['vacation'] = 'Tatil';
+$labels['vacation.reply'] = 'Cevap mesajı';
+$labels['vacation.advanced'] = 'Gelişmiş seçenekler';
+$labels['vacation.subject'] = 'Konu';
+$labels['vacation.body'] = 'Gövde';
+$labels['vacation.start'] = 'Tatil başlangıcı';
+$labels['vacation.end'] = 'Tatil bitişi';
+$labels['vacation.status'] = 'Durum';
+$labels['vacation.on'] = 'Etkin';
+$labels['vacation.off'] = 'Devre dışı';
+$labels['vacation.addresses'] = 'Ek adresler';
+$labels['vacation.interval'] = 'Cevap aralığı';
+$labels['vacation.after'] = 'Şundan sonra tatil kuralı koy';
+$labels['vacation.saving'] = 'Veri kaydediliyor...';
+$labels['vacation.action'] = 'Gelen mesaj aksiyonu';
+$labels['vacation.keep'] = 'Koru';
+$labels['vacation.discard'] = 'Yoksay';
+$labels['vacation.redirect'] = 'Şuraya yönlendir';
+$labels['vacation.copy'] = 'Şuraya kopya gönder';
+$labels['arialabelfiltersetactions'] = 'Filtre seti aksiyonları';
+$labels['arialabelfilteractions'] = 'Filtre aksiyonları';
+$labels['arialabelfilterform'] = 'Filtre özellikleri';
+$labels['ariasummaryfilterslist'] = 'Filtre listesi';
+$labels['ariasummaryfiltersetslist'] = 'Filtre seti listesi';
+$labels['filterstitle'] = 'Gelen e-posta filtrelerini düzenle';
+$labels['vacationtitle'] = 'Ofis dışında kuralını düzenle';
$messages['filterunknownerror'] = 'Bilinmeyen sunucu hatası.';
$messages['filterconnerror'] = 'Sunucuya bağlanamıyor.';
$messages['filterdeleteerror'] = 'Filtre silinemedi. Sunucuda hata oluştu.';
$messages['filterdeleted'] = 'Filtre başarıyla silindi.';
-$messages['filtersaved'] = 'Filter başarıyla kaydedildi.';
+$messages['filtersaved'] = 'Filtre başarıyla kaydedildi.';
$messages['filtersaveerror'] = 'Filtre kaydedilemedi. Sunucuda hata oluştu.';
$messages['filterdeleteconfirm'] = 'Seçilen filtreleri gerçekten silmek istiyor musun?';
$messages['ruledeleteconfirm'] = 'Seçili kuralları silmek istediğinizden emin misiniz?';
@@ -189,4 +218,7 @@ $messages['namereserved'] = 'rezerve edilmiş isim.';
$messages['setexist'] = 'Set zaten var.';
$messages['nodata'] = 'En az bir pozisyon seçilmelidir.';
$messages['invaliddateformat'] = 'geçersiz tarih veya tarih biçimi';
+$messages['saveerror'] = 'Veri kaydedilemedi. Sunucuda hata oluştu.';
+$messages['vacationsaved'] = 'Tatil verisi başarıyla kaydedildi.';
+$messages['emptyvacationbody'] = 'Tatil mesajı metni gerekmektedir.';
?>
diff --git a/lib/plugins/managesieve/localization/uk_UA.inc b/lib/plugins/managesieve/localization/uk_UA.inc
index d85b03b..fce7867 100644
--- a/lib/plugins/managesieve/localization/uk_UA.inc
+++ b/lib/plugins/managesieve/localization/uk_UA.inc
@@ -52,10 +52,10 @@ $labels['sender'] = 'Відправник';
$labels['recipient'] = 'Отримувач';
$labels['vacationaddr'] = 'Додаткова адреса(и):';
$labels['vacationdays'] = 'Як часто повторювати (у днях):';
-$labels['days'] = 'днів';
-$labels['seconds'] = 'секунд';
$labels['vacationreason'] = 'Текст повідомлення:';
$labels['vacationsubject'] = 'Тема листа:';
+$labels['days'] = 'днів';
+$labels['seconds'] = 'секунд';
$labels['rulestop'] = 'Зупинити перевірку правил';
$labels['enable'] = 'Увімкнути/Вимкнуни';
$labels['filterset'] = 'Набір фільтрів';
@@ -93,10 +93,6 @@ $labels['varlowerfirst'] = 'перший символ в нижньому рег
$labels['varupperfirst'] = 'перший символ в верхньому регістрі';
$labels['varlength'] = 'довжина';
$labels['notify'] = 'Надсилати сповіщення';
-$labels['notifyaddress'] = 'На електронну адресу:';
-$labels['notifybody'] = 'Тіло сповіщення:';
-$labels['notifysubject'] = 'Тема сповіщення:';
-$labels['notifyfrom'] = 'Відправник сповіщення:';
$labels['filtercreate'] = 'Створити фільтр';
$labels['nextstep'] = 'Наступний крок';
$labels['...'] = '...';
diff --git a/lib/plugins/managesieve/localization/vi_VN.inc b/lib/plugins/managesieve/localization/vi_VN.inc
index c791381..d22ff7e 100644
--- a/lib/plugins/managesieve/localization/vi_VN.inc
+++ b/lib/plugins/managesieve/localization/vi_VN.inc
@@ -57,10 +57,10 @@ $labels['recipient'] = 'Người nhận';
$labels['vacationaddr'] = '(Các) Địa chỉ email bổ sung của tôi:';
$labels['vacationdays'] = 'Số lần gửi thư (trong ngày)';
$labels['vacationinterval'] = 'Tần suất gửi thư:';
-$labels['days'] = 'ngày';
-$labels['seconds'] = 'giây';
$labels['vacationreason'] = 'Nội dung chính';
$labels['vacationsubject'] = 'Tiêu đề thư';
+$labels['days'] = 'ngày';
+$labels['seconds'] = 'giây';
$labels['rulestop'] = 'Ngừng đánh giá qui luật';
$labels['enable'] = 'Kích hoạt/Không kích hoạt';
$labels['filterset'] = 'Đặt các bộ lọc';
@@ -108,14 +108,17 @@ $labels['varupperfirst'] = 'chữ cái đầu viết hoa';
$labels['varquotewildcard'] = 'trích dẫn ký tự đặc biệt';
$labels['varlength'] = 'độ dài';
$labels['notify'] = 'Gửi thông báo';
-$labels['notifyaddress'] = 'Gửi đến địa chỉ email:';
-$labels['notifybody'] = 'Nội dung thông báo:';
-$labels['notifysubject'] = 'Tiêu đề thông báo:';
-$labels['notifyfrom'] = 'Người gửi thông báo:';
+$labels['notifytarget'] = 'Mục tiêu thông báo:';
+$labels['notifymessage'] = 'Nội dung thông báo (tuỳ chọn):';
+$labels['notifyoptions'] = 'Lựa chọn thông báo (tuỳ chọn):';
+$labels['notifyfrom'] = 'Người gửi thông báo (tuỳ chọn):';
$labels['notifyimportance'] = 'Mức độ quan trọng:';
$labels['notifyimportancelow'] = 'thấp';
$labels['notifyimportancenormal'] = 'vừa phải';
$labels['notifyimportancehigh'] = 'cao';
+$labels['notifymethodmailto'] = 'Thư điện tử';
+$labels['notifymethodtel'] = 'Điện thoại';
+$labels['notifymethodsms'] = 'Tin nhắn';
$labels['filtercreate'] = 'Tạo bộ lọc';
$labels['usedata'] = 'Dùng dữ liệu trong bộ lọc sau:';
$labels['nextstep'] = 'Bước tiếp theo';
@@ -157,6 +160,18 @@ $labels['asciicasemap'] = 'Không phân biệt chữ hoa chữ thường';
$labels['asciinumeric'] = 'Bảng mã ASCII';
$labels['index'] = 'chỉ mục:';
$labels['indexlast'] = 'ngược';
+$labels['vacation'] = 'Thiết lập tự động trả lời trong kỳ nghỉ';
+$labels['vacation.reply'] = 'Trả lời thư';
+$labels['vacation.advanced'] = 'Tùy chọn tính năng cao hơn';
+$labels['vacation.subject'] = 'Tiêu đề';
+$labels['vacation.body'] = 'Nội dung thư';
+$labels['vacation.status'] = 'Trạng thái';
+$labels['vacation.on'] = 'Bật';
+$labels['vacation.off'] = 'Tắt';
+$labels['vacation.addresses'] = 'Các địa chỉ bổ sung của tôi';
+$labels['vacation.interval'] = 'Khoảng thời gian trả lời';
+$labels['vacation.after'] = 'Đặt quy định kỳ nghỉ sau';
+$labels['vacation.saving'] = 'Lưu lại dữ liệu...';
$messages['filterunknownerror'] = 'Không tìm được lỗi máy chủ';
$messages['filterconnerror'] = 'Không kết nối được với máy chủ.';
$messages['filterdeleteerror'] = 'Không thể xóa bộ lọc. Xuất hiện lỗi ở máy chủ';
@@ -189,4 +204,6 @@ $messages['namereserved'] = 'Tên đã được bảo vệ';
$messages['setexist'] = 'Thiết lập đã tồn tại';
$messages['nodata'] = 'Ít nhất một vị trí phải được chọn';
$messages['invaliddateformat'] = 'Lỗi không đúng cú pháp ngày hoặc nhập ngày sai';
+$messages['saveerror'] = 'Không thể lưu trữ dữ liệu. Xuất hiện lỗi ở máy chủ.';
+$messages['vacationsaved'] = 'Thiết lập kỳ nghỉ đã được lưu lại thành công.';
?>
diff --git a/lib/plugins/managesieve/localization/zh_CN.inc b/lib/plugins/managesieve/localization/zh_CN.inc
index 5c38cfe..a39b312 100644
--- a/lib/plugins/managesieve/localization/zh_CN.inc
+++ b/lib/plugins/managesieve/localization/zh_CN.inc
@@ -55,10 +55,10 @@ $labels['sender'] = '发件人';
$labels['recipient'] = '收件人';
$labels['vacationdays'] = '发送邮件频率(单位:天):';
$labels['vacationinterval'] = '发送邮件频率:';
-$labels['days'] = '天';
-$labels['seconds'] = '秒';
$labels['vacationreason'] = '邮件正文(假期原因)';
$labels['vacationsubject'] = '邮件主题';
+$labels['days'] = '天';
+$labels['seconds'] = '秒';
$labels['rulestop'] = '停止评价规则';
$labels['enable'] = '启用/禁用';
$labels['filterset'] = '过滤器设置';
@@ -104,10 +104,6 @@ $labels['varupperfirst'] = '首字母大写';
$labels['varquotewildcard'] = '引用特殊字符';
$labels['varlength'] = '长度';
$labels['notify'] = '发送通知';
-$labels['notifyaddress'] = '收件地址:';
-$labels['notifybody'] = '通知正文:';
-$labels['notifysubject'] = '通知主题';
-$labels['notifyfrom'] = '通知的发送人:';
$labels['notifyimportance'] = '优先级:';
$labels['notifyimportancelow'] = '低';
$labels['notifyimportancenormal'] = '中';
diff --git a/lib/plugins/managesieve/managesieve.js b/lib/plugins/managesieve/managesieve.js
index cd0d5f3..4d60833 100644
--- a/lib/plugins/managesieve/managesieve.js
+++ b/lib/plugins/managesieve/managesieve.js
@@ -736,6 +736,9 @@ function smart_field_init(field)
if (field.attr('disabled'))
area.hide();
+ // disable the original field anyway, we don't want it in POST
+ else
+ field.prop('disabled', true);
field.after(area);
@@ -930,7 +933,7 @@ function sieve_form_init()
rcube_webmail.prototype.managesieve_create = function(force)
{
- if (!force && this.env.action != 'show' && !$('#'+this.env.contentframe).is(':visible')) {
+ if (!force && this.env.action != 'show') {
var uid = this.message_list.get_single_selection(),
lock = this.set_busy(true, 'loading');
diff --git a/lib/plugins/managesieve/managesieve.php b/lib/plugins/managesieve/managesieve.php
index 478f26b..f41394e 100644
--- a/lib/plugins/managesieve/managesieve.php
+++ b/lib/plugins/managesieve/managesieve.php
@@ -51,7 +51,9 @@ class managesieve extends rcube_plugin
}
else if ($this->rc->task == 'mail') {
// register message hook
- $this->add_hook('message_headers_output', array($this, 'mail_headers'));
+ if ($this->rc->action == 'show') {
+ $this->add_hook('message_headers_output', array($this, 'mail_headers'));
+ }
// inject Create Filter popup stuff
if (empty($this->rc->action) || $this->rc->action == 'show'
@@ -83,14 +85,10 @@ class managesieve extends rcube_plugin
// include styles
$skin_path = $this->local_skin_path();
if ($this->rc->task == 'settings' || $sieve_action) {
- if (is_file($this->home . "/$skin_path/managesieve.css")) {
- $this->include_stylesheet("$skin_path/managesieve.css");
- }
+ $this->include_stylesheet("$skin_path/managesieve.css");
}
else {
- if (is_file($this->home . "/$skin_path/managesieve_mail.css")) {
- $this->include_stylesheet("$skin_path/managesieve_mail.css");
- }
+ $this->include_stylesheet("$skin_path/managesieve_mail.css");
}
$this->ui_initialized = true;
@@ -192,9 +190,10 @@ class managesieve extends rcube_plugin
function managesieve_actions()
{
// handle fetching email headers for the new filter form
- if ($uid = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_GPC)) {
- $mailbox = $this->rc->get_storage()->get_folder();
- $message = new rcube_message($uid, $mailbox);
+ if ($uid = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST)) {
+ $uids = rcmail::get_uids();
+ $mailbox = key($uids);
+ $message = new rcube_message($uids[$mailbox][0], $mailbox);
$headers = $this->parse_headers($message->headers);
$this->rc->output->set_env('sieve_headers', $headers);
diff --git a/lib/plugins/managesieve/package.xml b/lib/plugins/managesieve/package.xml
deleted file mode 100644
index f4c4bb9..0000000
--- a/lib/plugins/managesieve/package.xml
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
- http://pear.php.net/dtd/tasks-1.0.xsd
- http://pear.php.net/dtd/package-2.0
- http://pear.php.net/dtd/package-2.0.xsd">
- <name>managesieve</name>
- <channel>pear.roundcube.net</channel>
- <summary>Sieve filters manager for Roundcube</summary>
- <description>
- Adds a possibility to manage Sieve scripts (incoming mail filters).
- It's clickable interface which operates on text scripts and communicates
- with server using managesieve protocol. Adds Filters tab in Settings.
- </description>
- <lead>
- <name>Aleksander Machniak</name>
- <user>alec</user>
- <email>alec@alec.pl</email>
- <active>yes</active>
- </lead>
- <date>2014-02-14</date>
- <version>
- <release>7.2</release>
- <api>7.0</api>
- </version>
- <stability>
- <release>stable</release>
- <api>stable</api>
- </stability>
- <license uri="http://www.gnu.org/licenses/gpl.html">GNU GPLv3+</license>
- <notes>-</notes>
- <contents>
- <dir baseinstalldir="/" name="/">
- <file name="managesieve.php" role="php">
- <tasks:replace from="@name@" to="name" type="package-info"/>
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="managesieve.js" role="data">
- <tasks:replace from="@name@" to="name" type="package-info"/>
- <tasks:replace from="@package_version@" to="version" type="package-info"/>
- </file>
- <file name="lib/Roundcube/rcube_sieve.php" role="php"></file>
- <file name="lib/Roundcube/rcube_sieve_engine.php" role="php"></file>
- <file name="lib/Roundcube/rcube_sieve_script.php" role="php"></file>
- <file name="lib/Net/Sieve.php" role="php"></file>
- <file name="localization/be_BE.inc" role="data"></file>
- <file name="localization/bg_BG.inc" role="data"></file>
- <file name="localization/bs_BA.inc" role="data"></file>
- <file name="localization/ca_ES_BA.inc" role="data"></file>
- <file name="localization/cs_CZ.inc" role="data"></file>
- <file name="localization/cy_GB.inc" role="data"></file>
- <file name="localization/da_DK.inc" role="data"></file>
- <file name="localization/de_CH.inc" role="data"></file>
- <file name="localization/de_DE.inc" role="data"></file>
- <file name="localization/el_GR.inc" role="data"></file>
- <file name="localization/en_GB.inc" role="data"></file>
- <file name="localization/en_US.inc" role="data"></file>
- <file name="localization/eo.inc" role="data"></file>
- <file name="localization/es_AR.inc" role="data"></file>
- <file name="localization/es_ES.inc" role="data"></file>
- <file name="localization/et_EE.inc" role="data"></file>
- <file name="localization/fa_IR.inc" role="data"></file>
- <file name="localization/fi_FI.inc" role="data"></file>
- <file name="localization/fr_FR.inc" role="data"></file>
- <file name="localization/gl_ES.inc" role="data"></file>
- <file name="localization/he_IL.inc" role="data"></file>
- <file name="localization/hr_HR.inc" role="data"></file>
- <file name="localization/hu_HU.inc" role="data"></file>
- <file name="localization/ia_IA.inc" role="data"></file>
- <file name="localization/id_ID.inc" role="data"></file>
- <file name="localization/it_IT.inc" role="data"></file>
- <file name="localization/ja_JP.inc" role="data"></file>
- <file name="localization/lt_LT.inc" role="data"></file>
- <file name="localization/lv_LV.inc" role="data"></file>
- <file name="localization/ml_ML.inc" role="data"></file>
- <file name="localization/mr_IN.inc" role="data"></file>
- <file name="localization/nb_NO.inc" role="data"></file>
- <file name="localization/nl_NL.inc" role="data"></file>
- <file name="localization/pl_PL.inc" role="data"></file>
- <file name="localization/pt_BR.inc" role="data"></file>
- <file name="localization/pt_PT.inc" role="data"></file>
- <file name="localization/ro_RO.inc" role="data"></file>
- <file name="localization/ru_RU.inc" role="data"></file>
- <file name="localization/si_LK.inc" role="data"></file>
- <file name="localization/sk_SK.inc" role="data"></file>
- <file name="localization/sl_SI.inc" role="data"></file>
- <file name="localization/sv_SE.inc" role="data"></file>
- <file name="localization/tr_TR.inc" role="data"></file>
- <file name="localization/uk_UA.inc" role="data"></file>
- <file name="localization/vi_VN.inc" role="data"></file>
- <file name="localization/zh_CN.inc" role="data"></file>
- <file name="localization/zh_TW.inc" role="data"></file>
- <file name="skins/classic/managesieve.css" role="data"></file>
- <file name="skins/classic/managesieve_mail.css" role="data"></file>
- <file name="skins/classic/templates/filteredit.html" role="data"></file>
- <file name="skins/classic/templates/managesieve.html" role="data"></file>
- <file name="skins/classic/templates/setedit.html" role="data"></file>
- <file name="skins/classic/images/add.png" role="data"></file>
- <file name="skins/classic/images/del.png" role="data"></file>
- <file name="skins/classic/images/down_small.gif" role="data"></file>
- <file name="skins/classic/images/erase.png" role="data"></file>
- <file name="skins/classic/images/filter.png" role="data"></file>
- <file name="skins/classic/images/up_small.gif" role="data"></file>
- <file name="skins/larry/managesieve.css" role="data"></file>
- <file name="skins/larry/managesieve_mail.css" role="data"></file>
- <file name="skins/larry/templates/filteredit.html" role="data"></file>
- <file name="skins/larry/templates/managesieve.html" role="data"></file>
- <file name="skins/larry/templates/setedit.html" role="data"></file>
- <file name="skins/larry/images/add.png" role="data"></file>
- <file name="skins/larry/images/del.png" role="data"></file>
- <file name="skins/larry/images/down_small.gif" role="data"></file>
- <file name="skins/larry/images/erase.png" role="data"></file>
- <file name="skins/larry/images/up_small.gif" role="data"></file>
- <file name="config.inc.php.dist" role="data"></file>
- </dir>
- <!-- / -->
- </contents>
- <dependencies>
- <required>
- <php>
- <min>5.2.1</min>
- </php>
- <pearinstaller>
- <min>1.7.0</min>
- </pearinstaller>
- </required>
- </dependencies>
- <phprelease/>
-</package>
diff --git a/lib/plugins/managesieve/skins/larry/managesieve.css b/lib/plugins/managesieve/skins/larry/managesieve.css
index 61d1c89..47e992c 100644
--- a/lib/plugins/managesieve/skins/larry/managesieve.css
+++ b/lib/plugins/managesieve/skins/larry/managesieve.css
@@ -309,19 +309,10 @@ a.button.disabled
max-width: 280px;
}
-html.mozilla #filter-form select
-{
- padding-top: 3px;
- padding-bottom: 3px;
-}
-
/* revert larry style button */
#filter-form input.button
{
- padding-bottom: 2px;
- padding-left: 5px;
- padding-right: 5px;
- padding-top: 2px;
+ padding: inherit;
}
fieldset
diff --git a/lib/plugins/managesieve/tests/Managesieve.php b/lib/plugins/managesieve/tests/Managesieve.php
index d802f56..6e930b8 100644
--- a/lib/plugins/managesieve/tests/Managesieve.php
+++ b/lib/plugins/managesieve/tests/Managesieve.php
@@ -5,7 +5,7 @@ class Managesieve_Plugin extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../managesieve.php';
+ include_once __DIR__ . '/../managesieve.php';
}
/**
diff --git a/lib/plugins/managesieve/tests/Parser.php b/lib/plugins/managesieve/tests/Parser.php
index 9050f09..33edce0 100644
--- a/lib/plugins/managesieve/tests/Parser.php
+++ b/lib/plugins/managesieve/tests/Parser.php
@@ -5,7 +5,7 @@ class Parser extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../lib/Roundcube/rcube_sieve_script.php';
+ include_once __DIR__ . '/../lib/Roundcube/rcube_sieve_script.php';
}
/**
@@ -34,7 +34,7 @@ class Parser extends PHPUnit_Framework_TestCase
*/
function data_parser()
{
- $dir_path = realpath(dirname(__FILE__) . '/src');
+ $dir_path = realpath(__DIR__ . '/src');
$dir = opendir($dir_path);
$result = array();
diff --git a/lib/plugins/managesieve/tests/Tokenizer.php b/lib/plugins/managesieve/tests/Tokenizer.php
index e71bae0..f50ed75 100644
--- a/lib/plugins/managesieve/tests/Tokenizer.php
+++ b/lib/plugins/managesieve/tests/Tokenizer.php
@@ -5,7 +5,7 @@ class Tokenizer extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../lib/Roundcube/rcube_sieve_script.php';
+ include_once __DIR__ . '/../lib/Roundcube/rcube_sieve_script.php';
}
function data_tokenizer()
diff --git a/lib/plugins/managesieve/tests/Vacation.php b/lib/plugins/managesieve/tests/Vacation.php
index e34eb7a..942525c 100644
--- a/lib/plugins/managesieve/tests/Vacation.php
+++ b/lib/plugins/managesieve/tests/Vacation.php
@@ -5,8 +5,8 @@ class Managesieve_Vacation extends PHPUnit_Framework_TestCase
function setUp()
{
- include_once dirname(__FILE__) . '/../lib/Roundcube/rcube_sieve_engine.php';
- include_once dirname(__FILE__) . '/../lib/Roundcube/rcube_sieve_vacation.php';
+ include_once __DIR__ . '/../lib/Roundcube/rcube_sieve_engine.php';
+ include_once __DIR__ . '/../lib/Roundcube/rcube_sieve_vacation.php';
}
/**