summaryrefslogtreecommitdiff
path: root/plugins/sieverules
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/sieverules')
-rw-r--r--plugins/sieverules/config.inc.php.dist147
-rw-r--r--plugins/sieverules/importFilters/avelsieve.php54
-rw-r--r--plugins/sieverules/importFilters/ingo.php52
-rw-r--r--plugins/sieverules/include/rcube_sieve.php249
-rw-r--r--plugins/sieverules/include/rcube_sieve_script.php969
-rw-r--r--plugins/sieverules/jquery.maskedinput.js7
l---------plugins/sieverules/lib/Net/Sieve.php1
-rw-r--r--plugins/sieverules/localization/ca_ES.inc168
-rw-r--r--plugins/sieverules/localization/cs_CZ.inc195
-rw-r--r--plugins/sieverules/localization/de_CH.inc192
-rw-r--r--plugins/sieverules/localization/de_DE.inc192
-rw-r--r--plugins/sieverules/localization/en_GB.inc205
-rw-r--r--plugins/sieverules/localization/en_US.inc205
-rw-r--r--plugins/sieverules/localization/es_AR.inc140
-rw-r--r--plugins/sieverules/localization/es_ES.inc185
-rw-r--r--plugins/sieverules/localization/et_EE.inc79
-rw-r--r--plugins/sieverules/localization/fi_FI.inc186
-rw-r--r--plugins/sieverules/localization/fr_FR.inc185
-rw-r--r--plugins/sieverules/localization/hu_HU.inc171
-rw-r--r--plugins/sieverules/localization/it_IT.inc202
-rw-r--r--plugins/sieverules/localization/nl_NL.inc205
-rw-r--r--plugins/sieverules/localization/pl_PL.inc205
-rw-r--r--plugins/sieverules/localization/pt_BR.inc183
-rw-r--r--plugins/sieverules/localization/pt_PT.inc183
-rw-r--r--plugins/sieverules/localization/ro_RO.inc175
-rw-r--r--plugins/sieverules/localization/ru_RU.inc182
-rw-r--r--plugins/sieverules/localization/sk_SK.inc159
-rw-r--r--plugins/sieverules/localization/sl_SI.inc185
-rw-r--r--plugins/sieverules/localization/sv_SE.inc159
-rw-r--r--plugins/sieverules/localization/zh_TW.inc192
-rw-r--r--plugins/sieverules/package.xml116
-rw-r--r--plugins/sieverules/sieverules.js1480
-rw-r--r--plugins/sieverules/sieverules.php2331
-rw-r--r--plugins/sieverules/skins/classic/cross.gifbin0 -> 577 bytes
-rw-r--r--plugins/sieverules/skins/classic/help.gifbin0 -> 1024 bytes
-rw-r--r--plugins/sieverules/skins/classic/icons.gifbin0 -> 2017 bytes
-rw-r--r--plugins/sieverules/skins/classic/icons.pngbin0 -> 2748 bytes
-rw-r--r--plugins/sieverules/skins/classic/ie6hacks.css10
-rw-r--r--plugins/sieverules/skins/classic/iehacks.css53
-rw-r--r--plugins/sieverules/skins/classic/safari.css8
-rw-r--r--plugins/sieverules/skins/classic/sieverules.css406
-rw-r--r--plugins/sieverules/skins/classic/tabstyles.css3
-rw-r--r--plugins/sieverules/skins/classic/templates/advancededitor.html55
-rw-r--r--plugins/sieverules/skins/classic/templates/editsieverule.html29
-rw-r--r--plugins/sieverules/skins/classic/templates/setupsieverules.html18
-rw-r--r--plugins/sieverules/skins/classic/templates/sieverules.html93
-rw-r--r--plugins/sieverules/skins/classic/tick.gifbin0 -> 545 bytes
-rw-r--r--plugins/sieverules/skins/larry/cross.pngbin0 -> 342 bytes
-rw-r--r--plugins/sieverules/skins/larry/help.pngbin0 -> 475 bytes
-rw-r--r--plugins/sieverules/skins/larry/icons.pngbin0 -> 1773 bytes
-rw-r--r--plugins/sieverules/skins/larry/iehacks.css53
-rw-r--r--plugins/sieverules/skins/larry/listicons.pngbin0 -> 1345 bytes
-rw-r--r--plugins/sieverules/skins/larry/safari.css8
-rw-r--r--plugins/sieverules/skins/larry/sieverules.css435
-rw-r--r--plugins/sieverules/skins/larry/tabstyles.css15
-rw-r--r--plugins/sieverules/skins/larry/templates/advancededitor.html60
-rw-r--r--plugins/sieverules/skins/larry/templates/editsieverule.html30
-rw-r--r--plugins/sieverules/skins/larry/templates/setupsieverules.html27
-rw-r--r--plugins/sieverules/skins/larry/templates/sieverules.html78
-rw-r--r--plugins/sieverules/skins/larry/tick.pngbin0 -> 284 bytes
60 files changed, 10920 insertions, 0 deletions
diff --git a/plugins/sieverules/config.inc.php.dist b/plugins/sieverules/config.inc.php.dist
new file mode 100644
index 000000000..7d8f48238
--- /dev/null
+++ b/plugins/sieverules/config.inc.php.dist
@@ -0,0 +1,147 @@
+<?php
+
+/**
+ * SieveRules configuration file
+ */
+
+// managesieve server address
+// The host can contain the following macros that will be expanded as follows:
+// %n - hostname ($_SERVER['SERVER_NAME'])
+// %t - hostname without the first part
+// %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
+// %s - domain name after the '@' from e-mail address provided at login screen
+// For example %n = mail.domain.tld, %t = domain.tld
+$rcmail_config['sieverules_host'] = 'localhost';
+
+// managesieve server port
+$rcmail_config['sieverules_port'] = 2000;
+
+// Log managesieve conversation to <log_dir>/sieverules or to syslog
+$rcmail_config['sieverules_debug'] = false;
+
+// authentication method. Can be CRAM-MD5, DIGEST-MD5, PLAIN, LOGIN, EXTERNAL
+// or none. Optional, defaults to best method supported by server.
+$rcmail_config['sieverules_auth_type'] = null;
+
+// optional managesieve authentication identifier to be used as authorization proxy,
+// authenticate as a different user but act on behalf of the logged in user,
+// works with PLAIN and DIGEST-MD5 auth.
+$rcmail_config['sieverules_auth_cid'] = null;
+
+// optional managesieve authentication password to be used for sieverules_auth_cid
+$rcmail_config['sieverules_auth_pw'] = null;
+
+// enable TLS for managesieve server connection
+$rcmail_config['sieverules_usetls'] = FALSE;
+
+// folder delimiter - if your sieve system uses a different folder delimiter to
+// your IMAP server set it here, otherwise leave as null to use IMAP delimiter
+$rcmail_config['sieverules_folder_delimiter'] = null;
+
+// Sieve RFC says that we should use UTF-8 encoding for mailbox names,
+// but some implementations does not covert UTF-8 to modified UTF-7.
+// set to null for default behaviour
+$rcmail_config['sieverules_folder_encoding'] = null;
+
+// include the IMAP root in the folder path when creating the rules
+// set to false to never include the IMAP root in the folder path
+// set to null for default behaviour
+$rcmail_config['sieverules_include_imap_root'] = null;
+
+// ruleset name
+$rcmail_config['sieverules_ruleset_name'] = 'roundcube';
+
+// allow multiple actions
+$rcmail_config['sieverules_multiple_actions'] = TRUE;
+
+// allowed actions
+$rcmail_config['sieverules_allowed_actions'] = array(
+ 'fileinto' => TRUE,
+ 'vacation' => TRUE,
+ 'reject' => TRUE,
+ 'redirect' => TRUE,
+ 'keep' => TRUE,
+ 'discard' => TRUE,
+ 'imapflags' => TRUE,
+ 'notify' => TRUE,
+ 'stop' => TRUE,
+ 'editheaderadd' => TRUE,
+ 'editheaderrem' => TRUE
+ );
+
+// headers listed as examples of "Other headers"
+$rcmail_config['sieverules_other_headers'] = array(
+ 'Reply-To', 'List-Id', 'MailingList', 'Mailing-List',
+ 'X-ML-Name', 'X-List', 'X-List-Name', 'X-Mailing-List',
+ 'Resent-From', 'Resent-To', 'X-Mailer', 'X-MailingList',
+ 'X-Spam-Status', 'X-Priority', 'Importance', 'X-MSMail-Priority',
+ 'Precedence', 'Return-Path', 'Received', 'Auto-Submitted',
+ 'X-Spam-Flag', 'X-Spam-Tests', 'Sender',
+ );
+
+// Predefined rules
+// each rule should be in it own array - examples provided in README
+// 'name' => name of the rule, displayed in the rule type select box
+// 'type' => one of: header, address, envelope, size
+// 'header' => name of the header to test
+// 'operator' => operator to use, for all possible values please see README
+// 'extra' => extra information needed for the rule in some cases
+// 'target' => value that the header is tested against
+$rcmail_config['sieverules_predefined_rules'] = array();
+
+// Advanced editor
+// allows the user to edit the sieve file directly, without the restrictions of the normal UI
+// 0 - Disabled, option not shown in the UI
+// 1 - Enabled, option shown in the UI
+// 2 - Option shown in the UI and used by default
+$rcmail_config['sieverules_adveditor'] = 0;
+
+// Allow users to use multiple rulesets
+$rcmail_config['sieverules_multiplerules'] = FALSE;
+
+// Default (or global) sieve rule file
+$rcmail_config['sieverules_default_file'] = '/etc/dovecot/sieve/default';
+
+// Auto load default sieve rule file if no rules exist and no import filters match
+$rcmail_config['sieverules_auto_load_default'] = FALSE;
+
+// Example sieve rule file
+$rcmail_config['sieverules_example_file'] = '/etc/dovecot/sieve/example';
+
+// Force the :addresses line to always be added to new vacation rules
+// Some sieve setups require that the :address part of a vacation rule is always present for the message to be sent
+// Cyrus setups need this to option set to true
+$rcmail_config['sieverules_force_vacto'] = FALSE;
+
+// Limit the selection of :addresses available to only those setup in as an identity
+// Setting this to false will give the user a textbox to enter in any address(es) they like, rather than a list of checkboxes
+$rcmail_config['sieverules_limit_vacto'] = TRUE;
+
+// Allow users to set the :from option when creating new vacation rules, not all servers support this option
+// If your server supports the variables extension users also have an 'auto detect' option which will detect the address to which the message was sent
+// Else the user's default identity will be used as the default value
+$rcmail_config['sieverules_show_vacfrom'] = FALSE;
+
+// Allow users to set the :handle option when creating new vacation rules, not all servers support this option
+$rcmail_config['sieverules_show_vachandle'] = FALSE;
+
+// The rule file can be written as one IF/ELSIF statement or as a series of unrelated IF statements
+// TRUE - one IF/ELSIF statement (default)
+// FALSE - a series of unrelated IF statements
+$rcmail_config['sieverules_use_elsif'] = TRUE;
+
+// Fileinto action options
+// 0 - List only subscribed folders
+// 1 - List subscribed and unsubscribed folders
+// 2 - List subscribed and unsubscribed folders and allow users to enter a folder name (for advanced users only, requires sieve mailbox extension)
+$rcmail_config['sieverules_fileinto_options'] = 0;
+
+// Define the format of the :from option value for vacation and notify actions
+// 0 - Use only the email address - :from "user@example.com"
+// 1 - Use the name and email address, not all servers support this option - :from "First Last <user@example.com>"
+$rcmail_config['sieverules_from_format'] = 0;
+
+// For information on customising the rule file see "The structure of the rule file" in the README
+// For information on customising the contents of the drop downs see "Default values for header, operator and flag drop downs" in the README
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/importFilters/avelsieve.php b/plugins/sieverules/importFilters/avelsieve.php
new file mode 100644
index 000000000..c1e3fef9a
--- /dev/null
+++ b/plugins/sieverules/importFilters/avelsieve.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * SieveRules import filter for Avelsieve
+ *
+ * The class should be named 'srimport_[filename]'
+ * Each import filter must have:
+ * An attribute called name
+ * A pubic function called detector
+ * A pubic function called importer
+ * The importer function can return either a string to be parsed by the SieveRules parser
+ * or an array, similar to the one created by the SieveRules parser
+ */
+class srimport_avelsieve
+{
+ public $name = 'Squirrelmail (Avelsieve)';
+
+ public function detector($script)
+ {
+ return preg_match('/#AVELSIEVE_VERSION.*/', $script) ? True : False;
+ }
+
+ public function importer($script)
+ {
+ $i = 0;
+ $content = '';
+ $name = array();
+
+ // tokenize rules
+ if ($tokens = preg_split('/(#START_SIEVE_RULE.*END_SIEVE_RULE)\n/', $script, -1, PREG_SPLIT_DELIM_CAPTURE)) {
+ foreach($tokens as $token) {
+ if (preg_match('/(require\s+\[.*\];)/i', $token, $matches)) {
+ $content .= $matches[1] . "\n";
+ }
+ elseif (!preg_match('/^#START_SIEVE_RULE.*/', $token, $matches)) {
+ $rulename = "# rule:[";
+ $parts = explode ('"', trim($token));
+
+ for ($i = 1; $i < count($parts); $i+=2)
+ $rulename .= $parts[$i] . " ";
+
+ $rulename .= "]\n";
+ $content .= $rulename;
+
+ $content .= trim($token) . "\n";
+ }
+ }
+ }
+
+ return $content;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/importFilters/ingo.php b/plugins/sieverules/importFilters/ingo.php
new file mode 100644
index 000000000..8d85ce6e1
--- /dev/null
+++ b/plugins/sieverules/importFilters/ingo.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * SieveRules import filter for INGO
+ *
+ * The class should be named 'srimport_[filename]'
+ * Each import filter must have:
+ * An attribute called name
+ * A pubic function called detector
+ * A pubic function called importer
+ * The importer function can return either a string to be parsed by the SieveRules parser
+ * or an array, similar to the one created by the SieveRules parser
+ */
+class srimport_ingo
+{
+ public $name = 'Horde (INGO)';
+
+ public function detector($script)
+ {
+ return preg_match('/# [a-z0-9\ ]+/i', $script) ? True : False;
+ }
+
+ public function importer($script)
+ {
+ $i = 0;
+ $name = array();
+ // tokenize rules
+ if ($tokens = preg_split('/(# .+)\r?\n/i', $script, -1, PREG_SPLIT_DELIM_CAPTURE)) {
+ // unset first token, its the ingo header
+ $tokens[1] = "";
+
+ foreach($tokens as $token) {
+ if (preg_match('/^# (.+)/i', $token, $matches)) {
+ $name[$i] = $matches[1];
+ $content .= "# rule:[" . $name[$i] . "]\n";
+ }
+ elseif (isset($name[$i])) {
+ $token = str_replace(":comparator \"i;ascii-casemap\" ", "", $token);
+ $content .= $token . "\n";
+ $i++;
+ }
+ elseif (preg_match('/^\r?\n?require/i', $token)) {
+ $content .= $token . "\n";
+ }
+ }
+ }
+
+ return $content;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/include/rcube_sieve.php b/plugins/sieverules/include/rcube_sieve.php
new file mode 100644
index 000000000..a5fd9649a
--- /dev/null
+++ b/plugins/sieverules/include/rcube_sieve.php
@@ -0,0 +1,249 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | rcube_sieve class for managesieve operations (using PEAR::Net_Sieve) |
+ | |
+ | Author: Aleksander Machniak <alec@alec.pl> |
+ | Modifications by: Philip Weir |
+ | * Make ruleset name configurable |
+ | * Added import functions |
+ +-----------------------------------------------------------------------+
+*/
+
+define('SIEVE_ERROR_CONNECTION', 1);
+define('SIEVE_ERROR_LOGIN', 2);
+define('SIEVE_ERROR_NOT_EXISTS', 3); // script not exists
+define('SIEVE_ERROR_INSTALL', 4); // script installation
+define('SIEVE_ERROR_ACTIVATE', 5); // script activation
+define('SIEVE_ERROR_OTHER', 255); // other/unknown error
+
+class rcube_sieve
+{
+ private $sieve;
+ private $ruleset;
+ private $importers = array();
+ private $elsif;
+ private $cache = false;
+ public $error = false;
+ public $list = array();
+ public $script;
+
+ public function __construct($username, $password, $host, $port, $auth_type = NULL, $usetls, $ruleset, $dir, $elsif = true, $auth_cid = NULL, $auth_pw = NULL)
+ {
+ $this->sieve = new Net_Sieve();
+
+ $data = rcube::get_instance()->plugins->exec_hook('sieverules_connect', array(
+ 'username' => $username, 'password' => $password, 'host' => $host, 'port' => $port,
+ 'auth_type' => $auth_type, 'usetls' => $usetls, 'ruleset' => $ruleset, 'dir' => $dir,
+ 'elsif' => $elsif, 'auth_cid' => $auth_cid, 'auth_pw' => $auth_pw));
+
+ $username = $data['username'];
+ $password = $data['password'];
+ $host = $data['host'];
+ $port = $data['port'];
+ $auth_type = $data['auth_type'];
+ $usetls = $data['usetls'];
+ $ruleset = $data['ruleset'];
+ $dir = $data['dir'];
+ $elsif = $data['elsif'];
+ $auth_cid = $data['auth_cid'];
+ $auth_pw = $data['auth_pw'];
+
+ if (PEAR::isError($this->sieve->connect($host, $port, NULL, $usetls)))
+ return $this->_set_error(SIEVE_ERROR_CONNECTION);
+
+ if (!empty($auth_cid)) {
+ $authz = $username;
+ $username = $auth_cid;
+ $password = $auth_pw;
+ }
+
+ if (PEAR::isError($this->sieve->login($username, $password, $auth_type ? strtoupper($auth_type) : NULL, $authz)))
+ return $this->_set_error(SIEVE_ERROR_LOGIN);
+
+ $this->ruleset = $ruleset;
+ $this->elsif = $elsif;
+
+ if ($this->ruleset !== false) {
+ $this->get_script();
+ }
+ else {
+ $this->ruleset = $this->get_active();
+ $this->get_script();
+ }
+
+ // init importers
+ $dir = slashify(realpath(slashify($dir) . 'importFilters/'));
+ $handle = opendir($dir);
+ while ($importer = readdir($handle)) {
+ if (is_file($dir . $importer) && is_readable($dir . $importer)) {
+ include($dir . $importer);
+
+ $importer = substr($importer, 0, -4);
+ $importer = 'srimport_' . $importer;
+
+ if (class_exists($importer, false)) {
+ $importerClass = new $importer();
+ $this->importers[$importer] = $importerClass;
+ }
+ }
+ }
+ closedir($handle);
+ }
+
+ public function __destruct()
+ {
+ $this->sieve->disconnect();
+ }
+
+ public function error()
+ {
+ return $this->error ? $this->error : false;
+ }
+
+ public function save($script = '')
+ {
+ if (!$script)
+ $script = $this->script->as_text();
+
+ if (!$script)
+ $script = '/* empty script */';
+
+ // allow additional actions before ruleset is saved
+ $data = rcube::get_instance()->plugins->exec_hook('sieverules_save', array(
+ 'ruleset' => $this->ruleset, 'script' => $script));
+
+ if ($data['abort'])
+ return $data['message'] ? $data['message'] : false;
+
+ if (PEAR::isError($this->sieve->installScript($this->ruleset, $data['script'])))
+ return $this->_set_error(SIEVE_ERROR_INSTALL);
+
+ if ($this->cache) $_SESSION['sieverules_script_cache_' . $this->ruleset] = serialize($this->script);
+
+ return true;
+ }
+
+ public function get_extensions()
+ {
+ if ($this->sieve) {
+ $ext = $this->sieve->getExtensions();
+ $ext = array_map('strtolower', (array) $ext);
+ return $ext;
+ }
+ }
+
+ public function check_import()
+ {
+ $result = false;
+
+ foreach ($this->list as $ruleset) {
+ if ($ruleset == $this->ruleset)
+ continue;
+
+ $script = $this->sieve->getScript($ruleset);
+
+ foreach ($this->importers as $id => $importer) {
+ if ($importer->detector($script)) {
+ $result = array($id, $importer->name, $ruleset);
+ break;
+ }
+ }
+ }
+
+ return $result;
+ }
+
+ public function do_import($type, $ruleset)
+ {
+ $script = $this->sieve->getScript($ruleset);
+ $content = $this->importers[$type]->importer($script);
+ $this->script->import_filters($content);
+
+ if (is_array($content))
+ return $this->save();
+ else
+ return $this->save($content);
+ }
+
+ public function get_script()
+ {
+ if (!$this->sieve)
+ return false;
+
+ if ($this->cache && $_SESSION['sieverules_script_cache']) {
+ $this->list = unserialize($_SESSION['sieverules_scripts_list']);
+ $this->script = unserialize($_SESSION['sieverules_script_cache_' . $this->ruleset]);
+ return;
+ }
+
+ $this->list = $this->sieve->listScripts();
+
+ if (PEAR::isError($this->list))
+ return $this->_set_error(SIEVE_ERROR_OTHER);
+
+ if (in_array($this->ruleset, $this->list)) {
+ $script = $this->sieve->getScript($this->ruleset);
+
+ if (PEAR::isError($script))
+ return $this->_set_error(SIEVE_ERROR_OTHER);
+ }
+ else {
+ $this->_set_error(SIEVE_ERROR_NOT_EXISTS);
+ $script = '';
+ }
+
+ $data = rcube::get_instance()->plugins->exec_hook('sieverules_load', array(
+ 'ruleset' => $this->ruleset, 'script' => $script));
+
+ $this->script = new rcube_sieve_script($data['script'], $this->get_extensions(), $this->elsif);
+
+ if ($this->cache) {
+ $_SESSION['sieverules_scripts_list'] = serialize($this->list);
+ $_SESSION['sieverules_script_cache_' . $this->ruleset] = serialize($this->script);
+ }
+ }
+
+ public function get_active()
+ {
+ return $this->sieve->getActive();
+ }
+
+ public function set_active($ruleset)
+ {
+ if (PEAR::isError($this->sieve->setActive($ruleset)))
+ return $this->_set_error(SIEVE_ERROR_ACTIVATE);
+
+ return true;
+ }
+
+ public function del_script($script)
+ {
+ return $this->sieve->removeScript($script);
+ }
+
+ public function set_ruleset($ruleset)
+ {
+ $this->ruleset = $ruleset;
+ $this->get_script();
+ }
+
+ public function set_debug($debug)
+ {
+ $this->sieve->setDebug($debug, array($this, 'debug_handler'));
+ }
+
+ public function debug_handler(&$sieve, $message)
+ {
+ rcube::write_log('sieverules', preg_replace('/\r\n$/', '', $message));
+ }
+
+ private function _set_error($error)
+ {
+ $this->error = $error;
+ return false;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/include/rcube_sieve_script.php b/plugins/sieverules/include/rcube_sieve_script.php
new file mode 100644
index 000000000..2dbd52a28
--- /dev/null
+++ b/plugins/sieverules/include/rcube_sieve_script.php
@@ -0,0 +1,969 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | rcube_sieve_script class for sieverules script parsing |
+ | |
+ | Author: Aleksander Machniak <alec@alec.pl> |
+ | Modifications by: Philip Weir |
+ | * Changed name of keys in script array |
+ | * Added support for address and envelope |
+ | * Added support for vacation |
+ | * Added support for disabled rules (written to file as comment) |
+ | * Added support for regex tests |
+ | * Added support for imapflags |
+ | * Added support for relational operators and comparators |
+ | * Added support for subaddress tests |
+ | * Added support for notify action |
+ | * Added support for stop action |
+ | * Added support for body and copy |
+ | * Added support for spamtest and virustest |
+ | * Added support for date |
+ | * Added support for editheader |
+ +-----------------------------------------------------------------------+
+*/
+
+define('SIEVE_ERROR_BAD_ACTION', 1);
+define('SIEVE_ERROR_NOT_FOUND', 2);
+
+// define constants for sieve file
+if (!defined('RCUBE_SIEVE_NEWLINE'))
+ define('RCUBE_SIEVE_NEWLINE', "\r\n");
+
+if (!defined('RCUBE_SIEVE_INDENT'))
+ define('RCUBE_SIEVE_INDENT', "\t");
+
+if (!defined('RCUBE_SIEVE_HEADER'))
+ define('RCUBE_SIEVE_HEADER', "## Generated by Roundcube Webmail SieveRules Plugin ##");
+
+class rcube_sieve_script
+{
+ private $elsif = true;
+ private $content = array();
+ private $supported = array(
+ 'fileinto',
+ 'reject',
+ 'ereject',
+ 'vacation',
+ 'imapflags',
+ 'imap4flags',
+ 'notify',
+ 'enotify',
+ 'spamtest',
+ 'virustest',
+ 'date',
+ 'editheader'
+ );
+ public $raw = '';
+
+ public function __construct($script, $ext = array(), $elsif = true)
+ {
+ $this->raw = $script;
+ $this->elsif = $elsif;
+
+ // adjust supported extenstion to match sieve server
+ $this->supported = array_intersect($this->supported, $ext);
+ if (in_array('copy', $ext))
+ $this->supported = array_merge($this->supported, array('fileinto_copy','redirect_copy'));
+
+ if (in_array('editheader', $ext))
+ $this->supported = array_merge($this->supported, array('editheaderadd','editheaderrem'));
+
+ // include standard actions in supported list
+ $this->supported = array_merge($this->supported, array('redirect','keep','discard','stop'));
+
+ // load script
+ $this->content = $this->parse_text($script);
+ }
+
+ public function add_text($script)
+ {
+ $content = $this->parse_text($script);
+ $result = false;
+
+ // check existsing script rules names
+ foreach ($this->content as $idx => $elem)
+ $names[$elem['name']] = $idx;
+
+ foreach ($content as $elem) {
+ if (!isset($names[$elem['name']])) {
+ array_push($this->content, $elem);
+ $result = true;
+ }
+ }
+
+ return $result;
+ }
+
+ public function import_filters($content)
+ {
+ if (is_array($content)) {
+ $result = false;
+
+ // check existsing script rules names
+ foreach ($this->content as $idx => $elem)
+ $names[$elem['name']] = $idx;
+
+ foreach ($content as $elem) {
+ if (!isset($names[$elem['name']])) {
+ array_push($this->content, $elem);
+ $result = true;
+ }
+ }
+ }
+ else {
+ $this->add_text($content);
+ }
+ }
+
+ public function add_rule($content, $pos = null)
+ {
+ foreach ($content['actions'] as $action) {
+ if (!in_array($action['type'], $this->supported))
+ return SIEVE_ERROR_BAD_ACTION;
+ }
+
+ if ($pos !== null)
+ array_splice($this->content, $pos, 0, array($content));
+ else
+ array_push($this->content, $content);
+
+ return true;
+ }
+
+ public function delete_rule($index)
+ {
+ if (isset($this->content[$index])) {
+ unset($this->content[$index]);
+ $this->content = array_values($this->content);
+ return true;
+ }
+
+ return SIEVE_ERROR_NOT_FOUND;
+ }
+
+ public function size()
+ {
+ return sizeof($this->content);
+ }
+
+ public function update_rule($index, $content)
+ {
+ foreach ($content['actions'] as $action) {
+ if (!in_array($action['type'], $this->supported))
+ return SIEVE_ERROR_BAD_ACTION;
+ }
+
+ if ($this->content[$index]) {
+ $this->content[$index] = $content;
+ return true;
+ }
+
+ return SIEVE_ERROR_NOT_FOUND;
+ }
+
+ public function move_rule($source, $destination)
+ {
+ $this->add_rule($this->content[$source], $destination);
+
+ if ($source < $destination)
+ $this->delete_rule($source);
+ else
+ $this->delete_rule($source + 1);
+ }
+
+ public function as_text()
+ {
+ $script = '';
+ $variables = '';
+ $exts = array();
+
+ // rules
+ $activeRules = 0;
+ foreach ($this->content as $rule) {
+ $tests = array();
+ $i = 0;
+
+ if ($rule['disabled'] == 1) {
+ $script .= '# rule:[' . $rule['name'] . "]" . RCUBE_SIEVE_NEWLINE;
+ $script .= '# disabledRule:[' . $this->_safe_serial(serialize($rule)) . "]" . RCUBE_SIEVE_NEWLINE;
+ }
+ else {
+ // header
+ $script .= '# rule:[' . $rule['name'] . "]" . RCUBE_SIEVE_NEWLINE;
+
+ // constraints expressions
+ foreach ($rule['tests'] as $test) {
+ $tests[$i] = '';
+
+ switch ($test['type']) {
+ case 'size':
+ $tests[$i] .= ($test['not'] ? 'not ' : '');
+ $tests[$i] .= 'size :' . ($test['operator']=='under' ? 'under ' : 'over ') . $test['target'];
+ break;
+ case 'virustest':
+ case 'spamtest':
+ array_push($exts, $test['type']);
+ array_push($exts, 'relational');
+ array_push($exts, 'comparator-i;ascii-numeric');
+ $tests[$i] .= ($test['not'] ? 'not ' : '');
+ $tests[$i] .= $test['type'] . ' :value ' . ($test['operator'] == 'eq' ? '"eq" ' :
+ ($test['operator'] == 'le' ? '"le" ' : '"ge" ')) .
+ ':comparator "i;ascii-numeric" "' . $test['target'] .'"';
+ break;
+ case 'true':
+ $tests[$i] .= ($test['not'] ? 'not true' : 'true');
+ break;
+ case 'exists':
+ $tests[$i] .= ($test['not'] ? 'not ' : '');
+
+ if (is_array($test['header']))
+ $tests[$i] .= 'exists ["' . implode('", "', $this->_escape_string($test['header'])) . '"]';
+ else
+ $tests[$i] .= 'exists "' . $this->_escape_string($test['header']) . '"';
+
+ break;
+ case 'envelope':
+ array_push($exts, 'envelope');
+ case 'header':
+ case 'address':
+ if ($test['operator'] == 'regex')
+ array_push($exts, 'regex');
+ elseif (substr($test['operator'], 0, 5) == 'count' || substr($test['operator'], 0, 5) == 'value')
+ array_push($exts, 'relational');
+ elseif ($test['operator'] == 'user' || $test['operator'] == 'detail' || $test['operator'] == 'domain')
+ array_push($exts, 'subaddress');
+
+ $tests[$i] .= ($test['not'] ? 'not ' : '');
+ $tests[$i] .= $test['type']. ' :' . $test['operator'];
+
+ if ($test['comparator'] != '') {
+ if ($test['comparator'] != 'i;ascii-casemap' && $test['comparator'] != 'i;octet')
+ array_push($exts, 'comparator-' . $test['comparator']);
+
+ $tests[$i] .= ' :comparator "' . $test['comparator'] . '"';
+ }
+
+ if (is_array($test['header']))
+ $tests[$i] .= ' ["' . implode('", "', $this->_escape_string($test['header'])) . '"]';
+ else
+ $tests[$i] .= ' "' . $this->_escape_string($test['header']) . '"';
+
+ if (is_array($test['target']))
+ $tests[$i] .= ' ["' . implode('", "', $this->_escape_string($test['target'])) . '"]';
+ else
+ $tests[$i] .= ' "' . $this->_escape_string($test['target']) . '"';
+
+ break;
+ case 'body':
+ array_push($exts, 'body');
+ if ($test['operator'] == 'regex')
+ array_push($exts, 'regex');
+ elseif (substr($test['operator'], 0, 5) == 'count' || substr($test['operator'], 0, 5) == 'value')
+ array_push($exts, 'relational');
+
+ $tests[$i] .= ($test['not'] ? 'not ' : '');
+ $tests[$i] .= $test['type'];
+
+ if ($test['bodypart'] != '')
+ $tests[$i] .= ' :' . $test['bodypart'];
+
+ if ($test['contentpart'] != '')
+ $tests[$i] .= ' "'. $test['contentpart'] .'"';
+
+ $tests[$i] .= ' :' . $test['operator'];
+
+ if ($test['comparator'] != '') {
+ if ($test['comparator'] != 'i;ascii-casemap' && $test['comparator'] != 'i;octet')
+ array_push($exts, 'comparator-' . $test['comparator']);
+
+ $tests[$i] .= ' :comparator "' . $test['comparator'] . '"';
+ }
+
+ if (is_array($test['target']))
+ $tests[$i] .= ' ["' . implode('", "', $this->_escape_string($test['target'])) . '"]';
+ else
+ $tests[$i] .= ' "' . $this->_escape_string($test['target']) . '"';
+
+ break;
+ case 'date':
+ array_push($exts, 'date');
+ if ($test['operator'] == 'regex')
+ array_push($exts, 'regex');
+ elseif (substr($test['operator'], 0, 5) == 'count' || substr($test['operator'], 0, 5) == 'value')
+ array_push($exts, 'relational');
+
+ $tests[$i] .= ($test['not'] ? 'not ' : '');
+ $tests[$i] .= $test['header'];
+
+ $timezone = rcube::get_instance()->config->get('timezone', 'auto');
+ if ($timezone != 'auto') {
+ $tz = new DateTimeZone($timezone);
+ $date = new DateTime('now', $tz);
+ $tests[$i] .= ' :zone ' . '"' . $date->format('O') . '"';
+ }
+
+ $tests[$i] .= ' :' . $test['operator'];
+
+ if ($test['comparator'] != '') {
+ if ($test['comparator'] != 'i;ascii-casemap' && $test['comparator'] != 'i;octet')
+ array_push($exts, 'comparator-' . $test['comparator']);
+
+ $tests[$i] .= ' :comparator "' . $test['comparator'] . '"';
+ }
+
+ $tests[$i] .= ' "' . $this->_escape_string($test['datepart']) . '"';
+ $tests[$i] .= ' "' . $this->_escape_string($test['target']) . '"';
+
+ break;
+ }
+
+ $i++;
+ }
+
+ $script .= ($activeRules > 0 && $this->elsif ? 'els' : '') . ($rule['join'] ? 'if allof (' : 'if anyof (');
+ $activeRules++;
+
+ if (sizeof($tests) > 1)
+ $script .= implode("," . RCUBE_SIEVE_NEWLINE . RCUBE_SIEVE_INDENT, $tests);
+ elseif (sizeof($tests))
+ $script .= $tests[0];
+ else
+ $script .= 'true';
+
+
+ $script .= ")". RCUBE_SIEVE_NEWLINE ."{" . RCUBE_SIEVE_NEWLINE;
+
+ // action(s)
+ $actions = '';
+ foreach ($rule['actions'] as $action) {
+ switch ($action['type']) {
+ case 'fileinto':
+ case 'fileinto_copy':
+ array_push($exts, 'fileinto');
+
+ $args = '';
+ if ($action['type'] == 'fileinto_copy') {
+ array_push($exts, 'copy');
+ $args .= ' :copy';
+ }
+
+ if ($action['create']) {
+ array_push($exts, 'mailbox');
+ $args .= ' :create';
+ }
+
+ // variables support in fileinto by David Warden
+ if (preg_match('/\$\{\d+\}/', $action['target']))
+ array_push($exts, 'variables');
+
+ $actions .= RCUBE_SIEVE_INDENT . "fileinto" . $args . " \"" . $this->_escape_string($action['target']) . "\";" . RCUBE_SIEVE_NEWLINE;
+ break;
+ case 'redirect':
+ case 'redirect_copy':
+ $args = '';
+ if ($action['type'] == 'redirect_copy') {
+ array_push($exts, 'copy');
+ $args .= ' :copy';
+ }
+
+ $tokens = preg_split('/[,;\s]/', $action['target']);
+ foreach ($tokens as $email)
+ $actions .= RCUBE_SIEVE_INDENT . "redirect" . $args . " \"" . $this->_escape_string($email) . "\";" . RCUBE_SIEVE_NEWLINE;
+ break;
+ case 'reject':
+ case 'ereject':
+ array_push($exts, $action['type']);
+
+ if (strpos($action['target'], "\n")!==false)
+ $actions .= RCUBE_SIEVE_INDENT . $action['type']." text:" . RCUBE_SIEVE_NEWLINE . $action['target'] . RCUBE_SIEVE_NEWLINE . "." . RCUBE_SIEVE_NEWLINE . ";" . RCUBE_SIEVE_NEWLINE;
+ else
+ $actions .= RCUBE_SIEVE_INDENT . $action['type']." \"" . $this->_escape_string($action['target']) . "\";" . RCUBE_SIEVE_NEWLINE;
+
+ break;
+ case 'vacation':
+ array_push($exts, 'vacation');
+ $action['subject'] = $this->_escape_string($action['subject']);
+
+// // encoding subject header with mb_encode provides better results with asian characters
+// if (function_exists("mb_encode_mimeheader"))
+// {
+// mb_internal_encoding($action['charset']);
+// $action['subject'] = mb_encode_mimeheader($action['subject'], $action['charset'], 'Q');
+// mb_internal_encoding(RCUBE_CHARSET);
+// }
+
+ // detect original recipient
+ if ($action['from'] == 'auto' && strpos($variables, 'set "from"') === false) {
+ array_push($exts, 'variables');
+
+ $variables .= 'set "from" "";' . RCUBE_SIEVE_NEWLINE;
+ $variables .= 'if header :matches "to" "*" {' . RCUBE_SIEVE_NEWLINE;
+ $variables .= RCUBE_SIEVE_INDENT . 'set "from" "${1}";' . RCUBE_SIEVE_NEWLINE;
+ $variables .= '}' . RCUBE_SIEVE_NEWLINE;
+
+ $action['from'] = "\${from}";
+ }
+ elseif ($action['from'] == 'auto') {
+ $action['from'] = "\${from}";
+ }
+
+ // append original subject
+ if ($action['origsubject'] == '1' && strpos($variables, 'set "subject"') === false) {
+ array_push($exts, 'variables');
+
+ $variables .= 'set "subject" "";' . RCUBE_SIEVE_NEWLINE;
+ $variables .= 'if header :matches "subject" "*" {' . RCUBE_SIEVE_NEWLINE;
+ $variables .= RCUBE_SIEVE_INDENT . 'set "subject" "${1}";' . RCUBE_SIEVE_NEWLINE;
+ $variables .= '}' . RCUBE_SIEVE_NEWLINE;
+
+ $action['subject'] = trim($action['subject']);
+ if (substr($action['subject'], -1, 1) != ":") $action['subject'] .= ":";
+ $action['subject'] .= " \${subject}";
+ }
+
+ $actions .= RCUBE_SIEVE_INDENT . "vacation" . RCUBE_SIEVE_NEWLINE;
+ if (!empty($action['days'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":days ". $action['days'] . RCUBE_SIEVE_NEWLINE;
+ if (!empty($action['addresses'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":addresses [\"". str_replace(",", "\",\"", $this->_escape_string($action['addresses'])) ."\"]" . RCUBE_SIEVE_NEWLINE;
+ if (!empty($action['subject'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":subject \"". $action['subject'] ."\"" . RCUBE_SIEVE_NEWLINE;
+ if (!empty($action['handle'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":handle \"". $this->_escape_string($action['handle']) ."\"" . RCUBE_SIEVE_NEWLINE;
+ if (!empty($action['from'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":from \"". $this->_escape_string($action['from']) ."\"" . RCUBE_SIEVE_NEWLINE;
+
+ if ($action['htmlmsg']) {
+ $MAIL_MIME = new Mail_mime("\r\n");
+
+ $action['msg'] = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">' .
+ "\r\n<html><body>\r\n" . $action['msg'] . "\r\n</body></html>\r\n";
+
+ $MAIL_MIME->setHTMLBody($action['msg']);
+
+ // add a plain text version of the e-mail as an alternative part.
+ $h2t = new rcube_html2text($action['msg'], false, true, 0);
+ $plainTextPart = $h2t->get_text();
+ if (!$plainTextPart) {
+ // empty message body breaks attachment handling in drafts
+ $plainTextPart = "\r\n";
+ }
+ else {
+ // make sure all line endings are CRLF (#1486712)
+ $plainTextPart = preg_replace('/\r?\n/', "\r\n", $plainTextPart);
+ }
+
+ $MAIL_MIME->setTXTBody($plainTextPart);
+
+ $MAIL_MIME->setParam('html_charset', $action['charset']);
+ $MAIL_MIME->setParam('text_charset', $action['charset']);
+
+ $action['msg'] = $MAIL_MIME->getMessage();
+ }
+
+ // escape lines which start is a .
+ $action['msg'] = preg_replace('/(^|\r?\n)\./', "$1..", $action['msg']);
+
+ if ($action['htmlmsg'])
+ $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":mime text:". RCUBE_SIEVE_NEWLINE . $action['msg'] . RCUBE_SIEVE_NEWLINE . "." . RCUBE_SIEVE_NEWLINE . ";" . RCUBE_SIEVE_NEWLINE;
+ elseif ($action['charset'] != "UTF-8")
+ $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":mime text:". RCUBE_SIEVE_NEWLINE ."Content-Type: text/plain; charset=". $action['charset'] . RCUBE_SIEVE_NEWLINE . RCUBE_SIEVE_NEWLINE . $action['msg'] . RCUBE_SIEVE_NEWLINE . "." . RCUBE_SIEVE_NEWLINE . ";" . RCUBE_SIEVE_NEWLINE;
+ elseif (strpos($action['msg'], "\n") !== false)
+ $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . "text:" . RCUBE_SIEVE_NEWLINE . $action['msg'] . RCUBE_SIEVE_NEWLINE . "." . RCUBE_SIEVE_NEWLINE . ";" . RCUBE_SIEVE_NEWLINE;
+ else
+ $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . "\"" . $this->_escape_string($action['msg']) . "\";" . RCUBE_SIEVE_NEWLINE;
+
+ break;
+ case 'imapflags':
+ case 'imap4flags':
+ array_push($exts, $action['type']);
+
+ if (strpos($actions, "setflag") !== false)
+ $actions .= RCUBE_SIEVE_INDENT . "addflag \"" . $this->_escape_string($action['target']) . "\";" . RCUBE_SIEVE_NEWLINE;
+ else
+ $actions .= RCUBE_SIEVE_INDENT . "setflag \"" . $this->_escape_string($action['target']) . "\";" . RCUBE_SIEVE_NEWLINE;
+
+ break;
+ case 'notify':
+ array_push($exts, 'notify');
+ $actions .= RCUBE_SIEVE_INDENT . "notify" . RCUBE_SIEVE_NEWLINE;
+ $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":method \"" . $this->_escape_string($action['method']) . "\"" . RCUBE_SIEVE_NEWLINE;
+ if (!empty($action['options'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":options [\"" . str_replace(",", "\",\"", $this->_escape_string($action['options'])) . "\"]" . RCUBE_SIEVE_NEWLINE;
+ if (!empty($action['from'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":from \"" . $this->_escape_string($action['from']) . "\"" . RCUBE_SIEVE_NEWLINE;
+ if (!empty($action['importance'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":importance \"" . $this->_escape_string($action['importance']) . "\"" . RCUBE_SIEVE_NEWLINE;
+ $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":message \"". $this->_escape_string($action['msg']) ."\";" . RCUBE_SIEVE_NEWLINE;
+ break;
+ case 'enotify':
+ array_push($exts, 'enotify');
+ $actions .= RCUBE_SIEVE_INDENT . "notify" . RCUBE_SIEVE_NEWLINE;
+ if (!empty($action['options'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":options [\"" . str_replace(",", "\",\"", $this->_escape_string($action['options'])) . "\"]" . RCUBE_SIEVE_NEWLINE;
+ if (!empty($action['from'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":from \"" . $this->_escape_string($action['from']) . "\"" . RCUBE_SIEVE_NEWLINE;
+ if (!empty($action['importance'])) $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":importance \"" . $this->_escape_string($action['importance']) . "\"" . RCUBE_SIEVE_NEWLINE;
+ $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . ":message \"". $this->_escape_string($action['msg']) ."\"" . RCUBE_SIEVE_NEWLINE;
+ $actions .= RCUBE_SIEVE_INDENT . RCUBE_SIEVE_INDENT . "\"" . $this->_escape_string($action['method']) . "\";" . RCUBE_SIEVE_NEWLINE;
+ break;
+ case 'editheaderadd':
+ array_push($exts, 'editheader');
+ $actions .= RCUBE_SIEVE_INDENT . "addheader";
+
+ if ($action['index'] == 'last')
+ $actions .= " :last";
+
+ $actions .= " \"". $this->_escape_string($action['name']) ."\" \"". $this->_escape_string($action['value']) ."\";" . RCUBE_SIEVE_NEWLINE;
+ break;
+ case 'editheaderrem':
+ array_push($exts, 'editheader');
+ $actions .= RCUBE_SIEVE_INDENT . "deleteheader";
+
+ if (is_numeric($action['index']))
+ $actions .= " :index " . $action['index'];
+ elseif ($action['index'] == 'last')
+ $actions .= " :last";
+
+ if (strlen($action['operator']) > 0)
+ $actions .= " :" . $action['operator'];
+
+ $actions .= " \"". $this->_escape_string($action['name']) ."\"";
+
+ if (strlen($action['value']) > 0)
+ $actions .= " \"". $this->_escape_string($action['value']) ."\"";
+
+ $actions .= ";" . RCUBE_SIEVE_NEWLINE;
+ break;
+ case 'keep':
+ case 'discard':
+ case 'stop':
+ $actions .= RCUBE_SIEVE_INDENT . $action['type'] .";" . RCUBE_SIEVE_NEWLINE;
+ break;
+ }
+ }
+
+ $script .= $actions . "}" . RCUBE_SIEVE_NEWLINE;
+ }
+ }
+
+ if ($variables)
+ $variables .= RCUBE_SIEVE_NEWLINE;
+
+ // requires
+ $exts = array_unique($exts);
+ if (sizeof($exts))
+ $script = 'require ["' . implode('","', $exts) . "\"];" . RCUBE_SIEVE_NEWLINE . RCUBE_SIEVE_NEWLINE . $variables . $script;
+
+ // author
+ if ($script && RCUBE_SIEVE_HEADER)
+ $script = RCUBE_SIEVE_HEADER . RCUBE_SIEVE_NEWLINE . $script;
+
+ return $script;
+ }
+
+ public function as_array()
+ {
+ return $this->content;
+ }
+
+ public function parse_text($script)
+ {
+ $i = 0;
+ $content = array();
+
+ // remove C comments
+ $script = preg_replace('|/\*.*?\*/|sm', '', $script);
+
+ // tokenize rules - \r is optional for backward compatibility (added 20090413)
+ if ($tokens = preg_split('/(# rule:\[.*\])\r?\n/', $script, -1, PREG_SPLIT_DELIM_CAPTURE)) {
+ foreach($tokens as $token) {
+ if (preg_match('/^# rule:\[(.*)\]/', $token, $matches)) {
+ $content[$i]['name'] = $matches[1];
+ }
+ elseif (isset($content[$i]['name']) && sizeof($content[$i]) == 1 && preg_match('/^# disabledRule:\[(.*)\]/', $token, $matches)) {
+ $content[$i] = unserialize($this->_regular_serial($matches[1]));
+ $i++;
+ }
+ elseif (isset($content[$i]['name']) && sizeof($content[$i]) == 1) {
+ if ($rule = $this->_tokenize_rule($token)) {
+ $content[$i] = array_merge($content[$i], $rule);
+ $i++;
+ }
+ else {
+ unset($content[$i]);
+ }
+ }
+ }
+ }
+
+ return $content;
+ }
+
+ private function _tokenize_rule($content)
+ {
+ $result = NULL;
+
+ if (preg_match('/^(if|elsif|else)\s+((true|not\s+true|allof|anyof|exists|header|not|size|envelope|address|spamtest|virustest|date|currentdate)\s+(.*))\s+\{(.*)\}$/sm', trim($content), $matches)) {
+ list($tests, $join) = $this->_parse_tests(trim($matches[2]));
+ $actions = $this->_parse_actions(trim($matches[5]));
+
+ if ($tests && $actions) {
+ $result = array(
+ 'tests' => $tests,
+ 'actions' => $actions,
+ 'join' => $join,
+ );
+ }
+ }
+
+ return $result;
+ }
+
+ private function _parse_actions($content)
+ {
+ $content = str_replace("\r\n", "\n", $content);
+ $result = NULL;
+
+ // supported actions
+ $patterns[] = '^\s*discard;';
+ $patterns[] = '^\s*keep;';
+ $patterns[] = '^\s*stop;';
+ $patterns[] = '^\s*fileinto\s+(:copy\s+)?(:create\s+)?(.*?[^\\\]);';
+ $patterns[] = '^\s*redirect\s+(:copy\s+)?(.*?[^\\\]);';
+ $patterns[] = '^\s*setflag\s+(.*?[^\\\]);';
+ $patterns[] = '^\s*addflag\s+(.*?[^\\\]);';
+ $patterns[] = '^\s*reject\s+text:(.*)\n\.\n;';
+ $patterns[] = '^\s*ereject\s+text:(.*)\n\.\n;';
+ $patterns[] = '^\s*reject\s+(.*?[^\\\]);';
+ $patterns[] = '^\s*ereject\s+(.*?[^\\\]);';
+ $patterns[] = '^\s*vacation\s+(:days\s+([0-9]+)\s+)?(:addresses\s+\[(.*?[^\\\])\]\s+)?(:subject\s+(".*?[^"\\\]")\s+)?(:handle\s+(".*?[^"\\\]")\s+)?(:from\s+(".*?[^"\\\]")\s+)?(:mime\s+)?text:(.*)\n\.\n;';
+ $patterns[] = '^\s*vacation\s+(:days\s+([0-9]+)\s+)?(:addresses\s+\[(.*?[^\\\])\]\s+)?(:subject\s+(".*?[^"\\\]")\s+)?(:handle\s+(".*?[^"\\\]")\s+)?(:from\s+(".*?[^"\\\]")\s+)?(.*?[^\\\]);';
+ $patterns[] = '^\s*notify\s+:method\s+(".*?[^"\\\]")\s+(:options\s+\[(.*?[^\\\])\]\s+)?(:from\s+(".*?[^"\\\]")\s+)?(:importance\s+(".*?[^"\\\]")\s+)?:message\s+(".*?[^"\\\]");';
+ $patterns[] = '^\s*notify\s+(:options\s+\[(.*?[^\\\])\]\s+)?(:from\s+(".*?[^"\\\]")\s+)?(:importance\s+(".*?[^"\\\]")\s+)?:message\s+(".*?[^"\\\]")\s+(.*);';
+ $patterns[] = '^\s*addheader\s+(:(last))?\s*(".*?[^"\\\]")\s+(".*?[^"\\\]");';
+ $patterns[] = '^\s*deleteheader\s+(:(last)|:index\s([0-9])+)?\s*(:(contains))?\s*(".*?[^"\\\]")\s*(".*?[^"\\\]")?;';
+
+ $pattern = '/(' . implode('$)|(', $patterns) . '$)/ms';
+
+ // parse actions body
+ if (preg_match_all($pattern, $content, $mm, PREG_SET_ORDER)) {
+ foreach ($mm as $m) {
+ $content = trim($m[0]);
+
+ if (preg_match('/^(discard|keep|stop)/', $content, $matches)) {
+ $result[] = array('type' => $matches[1]);
+ }
+ elseif (preg_match('/^fileinto\s+:copy/', $content)) {
+ $result[] = array('type' => 'fileinto_copy', 'target' => $this->_parse_string($m[sizeof($m)-1]));
+ }
+ elseif (preg_match('/^fileinto/', $content)) {
+ $result[] = array('type' => 'fileinto', 'target' => $this->_parse_string($m[sizeof($m)-1]));
+ }
+ elseif (preg_match('/^redirect\s+:copy/', $content)) {
+ $result[] = array('type' => 'redirect_copy', 'target' => $this->_parse_string($m[sizeof($m)-1]));
+ }
+ elseif (preg_match('/^redirect/', $content)) {
+ $result[] = array('type' => 'redirect', 'target' => $this->_parse_string($m[sizeof($m)-1]));
+ }
+ elseif (preg_match('/^(reject|ereject)\s+(.*);$/sm', $content, $matches)) {
+ $result[] = array('type' => $matches[1], 'target' => $this->_parse_string($matches[2]));
+ }
+ elseif (preg_match('/^(setflag|addflag)/', $content)) {
+ if (in_array('imap4flags', $this->supported))
+ $result[] = array('type' => 'imap4flags', 'target' => $this->_parse_string($m[sizeof($m)-1]));
+ else
+ $result[] = array('type' => 'imapflags', 'target' => $this->_parse_string($m[sizeof($m)-1]));
+ }
+ elseif (preg_match('/^vacation\s+(:days\s+([0-9]+)\s+)?(:addresses\s+\[(.*?[^\\\])\]\s+)?(:subject\s+(".*?[^"\\\]")\s+)?(:handle\s+(".*?[^"\\\]")\s+)?(:from\s+(".*?[^"\\\]")\s+)?(.*);$/sm', $content, $matches)) {
+ $origsubject = "";
+ if (substr($matches[6], -13, 12) == ": \${subject}") {
+ $matches[6] = trim(substr($matches[6], 0, -13)) . "\"";
+ $origsubject = "1";
+ }
+
+ if ($matches[10] == "\"\${from}\"")
+ $matches[10] = "\"auto\"";
+
+// if (function_exists("mb_decode_mimeheader")) $matches[5] = mb_decode_mimeheader($matches[5]);
+
+ if (strpos($matches[11], 'Content-Type: multipart/alternative') !== false) {
+ $htmlmsg = true;
+
+ preg_match('/Content-Type: text\/html; charset=([^\r\n]+).*<body>(.+)<\/body>/sm', $matches[11], $htmlparts);
+ $msg = quoted_printable_decode($htmlparts[2]);
+ $charset = $htmlparts[1];
+ }
+ else {
+ $htmlmsg = false;
+ $msg = $this->_parse_string($matches[11]);
+ $charset = $this->_parse_charset($matches[11]);
+ }
+
+ // unescape lines which start is a .
+ $msg = preg_replace('/(^|\r?\n)\.\./', "$1.", $msg);
+
+ $result[] = array('type' => 'vacation',
+ 'days' => $matches[2],
+ 'subject' => $this->_parse_string($matches[6]),
+ 'origsubject' => $origsubject,
+ 'from' => $this->_parse_string($matches[10]),
+ 'addresses' => $this->_parse_string(str_replace("\",\"", ",", $matches[4])),
+ 'handle' => $this->_parse_string($matches[8]),
+ 'msg' => $msg,
+ 'htmlmsg' => $htmlmsg,
+ 'charset' => $charset);
+ }
+ elseif (preg_match('/^notify\s+:method\s+(".*?[^"\\\]")\s+(:options\s+\[(.*?[^\\\])\]\s+)?(:from\s+(".*?[^"\\\]")\s+)?(:importance\s+(".*?[^"\\\]")\s+)?:message\s+(".*?[^"\\\]");$/sm', $content, $matches)) {
+ $result[] = array('type' => 'notify',
+ 'method' => $this->_parse_string($matches[1]),
+ 'options' => $this->_parse_string($matches[3]),
+ 'from' => $this->_parse_string($matches[5]),
+ 'importance' => $this->_parse_string($matches[7]),
+ 'msg' => $this->_parse_string($matches[8]));
+ }
+ elseif (preg_match('/^notify\s+(:options\s+\[(.*?[^\\\])\]\s+)?(:from\s+(".*?[^"\\\]")\s+)?(:importance\s+(".*?[^"\\\]")\s+)?:message\s+(".*?[^"\\\]")\s+(.*);$/sm', $content, $matches)) {
+ $result[] = array('type' => 'enotify',
+ 'method' => $this->_parse_string($matches[8]),
+ 'options' => $this->_parse_string($matches[2]),
+ 'from' => $this->_parse_string($matches[4]),
+ 'importance' => $this->_parse_string($matches[6]),
+ 'msg' => $this->_parse_string($matches[7]));
+ }
+ elseif (preg_match('/^addheader/', $content)) {
+ $result[] = array('type' => 'editheaderadd',
+ 'index' => $m[sizeof($m)-3],
+ 'name' => $this->_parse_string($m[sizeof($m)-2]),
+ 'value' => $this->_parse_string($m[sizeof($m)-1]));
+ }
+ elseif (preg_match('/^deleteheader/', $content)) {
+ $result[] = array('type' => 'editheaderrem',
+ 'index' => $m[sizeof($m)-6] == 'last' ? $m[sizeof($m)-6] : $m[sizeof($m)-5],
+ 'operator' => $m[sizeof($m)-3],
+ 'name' => strlen($m[sizeof($m)-2]) == 0 ? $this->_parse_string($m[sizeof($m)-1]) : $this->_parse_string($m[sizeof($m)-2]),
+ 'value' => strlen($m[sizeof($m)-2]) == 0 ? '' : $this->_parse_string($m[sizeof($m)-1]));
+ }
+ }
+ }
+
+ return $result;
+ }
+
+ private function _parse_tests($content)
+ {
+ $result = NULL;
+
+ // lists
+ if (preg_match('/^(allof|anyof)\s+\((.*)\)$/sm', $content, $matches)) {
+ $content = $matches[2];
+ $join = $matches[1]=='allof' ? true : false;
+ }
+ else {
+ $join = false;
+ }
+
+ // supported tests regular expressions
+ $patterns[] = '(not\s+)?(exists)\s+\[(.*?[^\\\])\]';
+ $patterns[] = '(not\s+)?(exists)\s+(".*?[^\\\]")';
+ $patterns[] = '(not\s+)?(true)';
+ $patterns[] = '(not\s+)?(size)\s+:(under|over)\s+([0-9]+[KGM]{0,1})';
+ $patterns[] = '(not\s+)?(spamtest|virustest)\s+:value\s+"(eq|ge|le)"\s+:comparator\s+"i;ascii-numeric"\s+"(.*?[^\\\])"';
+ $patterns[] = '(not\s+)?(header|address|envelope)\s+:(contains|is|matches|regex|user|detail|domain)((\s+))\[(.*?[^\\\]")\]\s+\[(.*?[^\\\]")\]';
+ $patterns[] = '(not\s+)?(header|address|envelope)\s+:(contains|is|matches|regex|user|detail|domain)((\s+))(".*?[^\\\]")\s+(".*?[^\\\]")';
+ $patterns[] = '(not\s+)?(header|address|envelope)\s+:(contains|is|matches|regex|user|detail|domain)((\s+))\[(.*?[^\\\]")\]\s+(".*?[^\\\]")';
+ $patterns[] = '(not\s+)?(header|address|envelope)\s+:(contains|is|matches|regex|user|detail|domain)((\s+))(".*?[^\\\]")\s+\[(.*?[^\\\]")\]';
+ $patterns[] = '(not\s+)?(header|address|envelope)\s+:(count\s+".*?[^\\\]"|value\s+".*?[^\\\]")(\s+:comparator\s+"(.*?[^\\\])")?\s+\[(.*?[^\\\]")\]\s+\[(.*?[^\\\]")\]';
+ $patterns[] = '(not\s+)?(header|address|envelope)\s+:(count\s+".*?[^\\\]"|value\s+".*?[^\\\]")(\s+:comparator\s+"(.*?[^\\\])")?\s+(".*?[^\\\]")\s+(".*?[^\\\]")';
+ $patterns[] = '(not\s+)?(header|address|envelope)\s+:(count\s+".*?[^\\\]"|value\s+".*?[^\\\]")(\s+:comparator\s+"(.*?[^\\\])")?\s+\[(.*?[^\\\]")\]\s+(".*?[^\\\]")';
+ $patterns[] = '(not\s+)?(header|address|envelope)\s+:(count\s+".*?[^\\\]"|value\s+".*?[^\\\]")(\s+:comparator\s+"(.*?[^\\\])")?\s+(".*?[^\\\]")\s+\[(.*?[^\\\]")\]';
+ $patterns[] = '(not\s+)?(body)(\s+:(raw|text|content\s+".*?[^\\\]"))?\s+:(contains|is|matches|regex)((\s+))\[(.*?[^\\\]")\]';
+ $patterns[] = '(not\s+)?(body)(\s+:(raw|text|content\s+".*?[^\\\]"))?\s+:(contains|is|matches|regex)((\s+))(".*?[^\\\]")';
+ $patterns[] = '(not\s+)?(body)(\s+:(raw|text|content\s+".*?[^\\\]"))?\s+:(count\s+".*?[^\\\]"|value\s+".*?[^\\\]")(\s+:comparator\s+"(.*?[^\\\])")?\s+\[(.*?[^\\\]")\]';
+ $patterns[] = '(not\s+)?(body)(\s+:(raw|text|content\s+".*?[^\\\]"))?\s+:(count\s+".*?[^\\\]"|value\s+".*?[^\\\]")(\s+:comparator\s+"(.*?[^\\\])")?\s+(".*?[^\\\]")';
+ $patterns[] = '(not\s+)?(date|currentdate)(\s+:zone\s+"([\+\-][0-9]{4})")?\s+:(contains|is|matches|regex)((\s+))(".*?[^\\\]"\s+)?(".*?[^\\\]")\s+(".*?[^\\\]")';
+ $patterns[] = '(not\s+)?(date|currentdate)(\s+:zone\s+"([\+\-][0-9]{4})")?\s+:(count\s+".*?[^\\\]"|value\s+".*?[^\\\]")(\s+:comparator\s+"(.*?[^\\\])")?(\s+".*?[^\\\]")?\s+(".*?[^\\\]")\s+(".*?[^\\\]")';
+
+ // join patterns...
+ $pattern = '/(' . implode(')|(', $patterns) . ')/';
+
+ // ...and parse tests list
+ if (preg_match_all($pattern, $content, $matches, PREG_SET_ORDER)) {
+ foreach ($matches as $match) {
+ $size = sizeof($match);
+
+ if (preg_match('/^(not\s+)?size/', $match[0])) {
+ $result[] = array(
+ 'type' => 'size',
+ 'not' => $match[$size-4] ? true : false,
+ 'operator' => $match[$size-2], // under/over
+ 'target' => $match[$size-1], // value
+ );
+ }
+ elseif (preg_match('/^(not\s+)?(spamtest|virustest)/', $match[0])) {
+ $result[] = array(
+ 'type' => $match[$size-3],
+ 'not' => $match[$size-4] ? true : false,
+ 'operator' => $match[$size-2], // ge/le/eq
+ 'target' => $match[$size-1], // value
+ );
+ }
+ elseif (preg_match('/^(not\s+)?(header|address|envelope)/', $match[0])) {
+ $result[] = array(
+ 'type' => $match[$size-6],
+ 'not' => $match[$size-7] ? true : false,
+ 'operator' => $match[$size-5], // is/contains/matches
+ 'header' => $this->_parse_list($match[$size-2]), // header(s)
+ 'target' => $this->_parse_list($match[$size-1], ($match[$size-5] == 'regex' ? true : false)), // string(s)
+ 'comparator' => trim($match[$size-3])
+ );
+ }
+ elseif (preg_match('/^(not\s+)?exists/', $match[0])) {
+ $result[] = array(
+ 'type' => 'exists',
+ 'not' => $match[$size-3] ? true : false,
+ 'operator' => 'exists',
+ 'header' => $this->_parse_list($match[$size-1]), // header(s)
+ );
+ }
+ elseif (preg_match('/^(not\s+)?true/', $match[0])) {
+ $result[] = array(
+ 'type' => 'true',
+ 'not' => $match[$size-2] ? true : false,
+ );
+ }
+ elseif (preg_match('/^(not\s+)?body/', $match[0])) {
+ if (preg_match('/.*content\s+"(.*?[^\\\])".*/', $match[$size-5], $parts)) {
+ $bodypart = 'content';
+ $contentpart = $parts[1];
+ }
+ else {
+ $bodypart = $match[$size-5];
+ $contentpart = '';
+ }
+
+ $result[] = array(
+ 'type' => 'body',
+ 'not' => $match[$size-8] ? true : false,
+ 'bodypart' => $bodypart,
+ 'contentpart' => $contentpart,
+ 'operator' => $match[$size-4], // is/contains/matches
+ 'header' => 'body', // header(s)
+ 'target' => $this->_parse_list($match[$size-1], ($match[$size-4] == 'regex' ? true : false)), // string(s)
+ 'comparator' => trim($match[$size-2])
+ );
+ }
+ elseif (preg_match('/^(not\s+)?(date|currentdate)/', $match[0])) {
+ $result[] = array(
+ 'type' => 'date',
+ 'not' => $match[$size-10] ? true : false,
+ 'header' => $match[$size-9], // header
+ 'operator' => $match[$size-6], // is/contains/matches
+ 'datepart' => $this->_parse_list($match[$size-2]),
+ 'target' => $this->_parse_list($match[$size-1], ($match[$size-5] == 'regex' ? true : false)), // string(s)
+ 'field' => $match[$size-3], // received
+ 'comparator' => trim($match[$size-4])
+ );
+ }
+ }
+ }
+
+ return array($result, $join);
+ }
+
+ private function _parse_string($content)
+ {
+ $text = '';
+ $content = trim($content);
+
+ if (preg_match('/^:mime\s+text:(.*)\.$/sm', $content, $matches)) {
+ $parts = preg_split("/\r?\n/", $matches[1], 4);
+ $text = trim($parts[3]);
+ }
+ elseif (preg_match('/^text:(.*)\.$/sm', $content, $matches))
+ $text = trim($matches[1]);
+ elseif (preg_match('/^"(.*)"$/', $content, $matches))
+ $text = str_replace('\"', '"', $matches[1]);
+
+ return $text;
+ }
+
+ private function _parse_charset($content)
+ {
+ $charset = RCUBE_CHARSET;
+ $content = trim($content);
+
+ if (preg_match('/^:mime\s+text:(.*)\.$/sm', $content, $matches)) {
+ $parts = preg_split("/\r?\n/", $matches[1], 4);
+
+ $charset = trim(substr($parts[1], stripos($parts[1], "charset=") + 8));
+ }
+
+ return $charset;
+ }
+
+ private function _escape_string($content)
+ {
+ $replace['/"/'] = '\\"';
+
+ if (is_array($content)) {
+ for ($x=0, $y=sizeof($content); $x<$y; $x++)
+ $content[$x] = preg_replace(array_keys($replace), array_values($replace), $content[$x]);
+
+ return $content;
+ }
+ else {
+ return preg_replace(array_keys($replace), array_values($replace), $content);
+ }
+ }
+
+ private function _parse_list($content, $regex = false)
+ {
+ $result = array();
+
+ if ($regex) {
+ if (preg_match('/^"(.*)"$/', $content, $matches));
+ $content = $matches[1];
+
+ $content = str_replace('\"', '"', $content);
+ return $content;
+ }
+
+ for ($x=0, $len=strlen($content); $x<$len; $x++) {
+ switch ($content[$x]) {
+ case '\\':
+ $str .= $content[++$x];
+
+ break;
+ case '"':
+ if (isset($str)) {
+ $result[] = $str;
+ unset($str);
+ }
+ else {
+ $str = '';
+ }
+
+ break;
+ default:
+ if (isset($str))
+ $str .= $content[$x];
+
+ break;
+ }
+ }
+
+ if (sizeof($result)>1)
+ return $result;
+ elseif (sizeof($result) == 1)
+ return $result[0];
+ else
+ return NULL;
+ }
+
+ private function _safe_serial($data)
+ {
+ $data = str_replace("\r", "[!r]", $data);
+ $data = str_replace("\n", "[!n]", $data);
+ return $data;
+ }
+
+ private function _regular_serial($data)
+ {
+ $data = str_replace("[!r]", "\r", $data);
+ $data = str_replace("[!n]", "\n", $data);
+ return $data;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/jquery.maskedinput.js b/plugins/sieverules/jquery.maskedinput.js
new file mode 100644
index 000000000..0d9ce6e06
--- /dev/null
+++ b/plugins/sieverules/jquery.maskedinput.js
@@ -0,0 +1,7 @@
+/*
+ Masked Input plugin for jQuery
+ Copyright (c) 2007-2013 Josh Bush (digitalbush.com)
+ Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license)
+ Version: 1.3.1
+*/
+(function(e){function t(){var e=document.createElement("input"),t="onpaste";return e.setAttribute(t,""),"function"==typeof e[t]?"paste":"input"}var n,a=t()+".mask",r=navigator.userAgent,i=/iphone/i.test(r),o=/android/i.test(r);e.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},dataName:"rawMaskFn",placeholder:"_"},e.fn.extend({caret:function(e,t){var n;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof e?(t="number"==typeof t?t:e,this.each(function(){this.setSelectionRange?this.setSelectionRange(e,t):this.createTextRange&&(n=this.createTextRange(),n.collapse(!0),n.moveEnd("character",t),n.moveStart("character",e),n.select())})):(this[0].setSelectionRange?(e=this[0].selectionStart,t=this[0].selectionEnd):document.selection&&document.selection.createRange&&(n=document.selection.createRange(),e=0-n.duplicate().moveStart("character",-1e5),t=e+n.text.length),{begin:e,end:t})},unmask:function(){return this.trigger("unmask")},mask:function(t,r){var c,l,s,u,f,h;return!t&&this.length>0?(c=e(this[0]),c.data(e.mask.dataName)()):(r=e.extend({placeholder:e.mask.placeholder,completed:null},r),l=e.mask.definitions,s=[],u=h=t.length,f=null,e.each(t.split(""),function(e,t){"?"==t?(h--,u=e):l[t]?(s.push(RegExp(l[t])),null===f&&(f=s.length-1)):s.push(null)}),this.trigger("unmask").each(function(){function c(e){for(;h>++e&&!s[e];);return e}function d(e){for(;--e>=0&&!s[e];);return e}function m(e,t){var n,a;if(!(0>e)){for(n=e,a=c(t);h>n;n++)if(s[n]){if(!(h>a&&s[n].test(R[a])))break;R[n]=R[a],R[a]=r.placeholder,a=c(a)}b(),x.caret(Math.max(f,e))}}function p(e){var t,n,a,i;for(t=e,n=r.placeholder;h>t;t++)if(s[t]){if(a=c(t),i=R[t],R[t]=n,!(h>a&&s[a].test(i)))break;n=i}}function g(e){var t,n,a,r=e.which;8===r||46===r||i&&127===r?(t=x.caret(),n=t.begin,a=t.end,0===a-n&&(n=46!==r?d(n):a=c(n-1),a=46===r?c(a):a),k(n,a),m(n,a-1),e.preventDefault()):27==r&&(x.val(S),x.caret(0,y()),e.preventDefault())}function v(t){var n,a,i,l=t.which,u=x.caret();t.ctrlKey||t.altKey||t.metaKey||32>l||l&&(0!==u.end-u.begin&&(k(u.begin,u.end),m(u.begin,u.end-1)),n=c(u.begin-1),h>n&&(a=String.fromCharCode(l),s[n].test(a)&&(p(n),R[n]=a,b(),i=c(n),o?setTimeout(e.proxy(e.fn.caret,x,i),0):x.caret(i),r.completed&&i>=h&&r.completed.call(x))),t.preventDefault())}function k(e,t){var n;for(n=e;t>n&&h>n;n++)s[n]&&(R[n]=r.placeholder)}function b(){x.val(R.join(""))}function y(e){var t,n,a=x.val(),i=-1;for(t=0,pos=0;h>t;t++)if(s[t]){for(R[t]=r.placeholder;pos++<a.length;)if(n=a.charAt(pos-1),s[t].test(n)){R[t]=n,i=t;break}if(pos>a.length)break}else R[t]===a.charAt(pos)&&t!==u&&(pos++,i=t);return e?b():u>i+1?(x.val(""),k(0,h)):(b(),x.val(x.val().substring(0,i+1))),u?t:f}var x=e(this),R=e.map(t.split(""),function(e){return"?"!=e?l[e]?r.placeholder:e:void 0}),S=x.val();x.data(e.mask.dataName,function(){return e.map(R,function(e,t){return s[t]&&e!=r.placeholder?e:null}).join("")}),x.attr("readonly")||x.one("unmask",function(){x.unbind(".mask").removeData(e.mask.dataName)}).bind("focus.mask",function(){clearTimeout(n);var e;S=x.val(),e=y(),n=setTimeout(function(){b(),e==t.length?x.caret(0,e):x.caret(e)},10)}).bind("blur.mask",function(){y(),x.val()!=S&&x.change()}).bind("keydown.mask",g).bind("keypress.mask",v).bind(a,function(){setTimeout(function(){var e=y(!0);x.caret(e),r.completed&&e==x.val().length&&r.completed.call(x)},0)}),y()}))}})})(jQuery); \ No newline at end of file
diff --git a/plugins/sieverules/lib/Net/Sieve.php b/plugins/sieverules/lib/Net/Sieve.php
new file mode 120000
index 000000000..fa112b6a9
--- /dev/null
+++ b/plugins/sieverules/lib/Net/Sieve.php
@@ -0,0 +1 @@
+../../../../../php/Net/Sieve.php \ No newline at end of file
diff --git a/plugins/sieverules/localization/ca_ES.inc b/plugins/sieverules/localization/ca_ES.inc
new file mode 100644
index 000000000..63ad80d0f
--- /dev/null
+++ b/plugins/sieverules/localization/ca_ES.inc
@@ -0,0 +1,168 @@
+<?php
+/* Author: GràciaNet */
+
+$labels = array();
+$labels['filters'] = 'Filtres';
+$labels['managefilters'] = 'Gesti&oacute; de filtres';
+$labels['filtername'] = 'Nom del filtre';
+$labels['disablerule'] = 'Desactivar regla';
+$labels['disabled'] = 'Desactivada';
+$labels['newfilter'] = 'Nou filtre';
+$labels['moveup'] = 'Moure amunt';
+$labels['movedown'] = 'Moure avall';
+$labels['filterallof'] = 'coincideix amb TOTES les regles seg&uuml;ents';
+$labels['filteranyof'] = 'coincideix amb ALGUNA de les seg&uuml;ents regles';
+$labels['filterany'] = 'tots els missatges';
+$labels['filtercontains'] = 'cont&eacute;';
+$labels['filternotcontains'] = 'no cont&eacute';
+$labels['filteris'] = '&eacutes igual a';
+$labels['filterisnot'] = 'es diferent de';
+$labels['filterexists'] = 'existeix';
+$labels['filternotexists'] = 'no existeix';
+$labels['filterregex'] = 'coincideix amb l\'expressi&oacute; regular';
+$labels['filternotregex'] = 'no coincideix amb l\'expressi&oacute; regular';
+$labels['filterunder'] = '&eacutes menys que';
+$labels['filterover'] = '&eacutes m&eacutes que';
+$labels['filteradvoptions'] = 'm&eacutes opcions...';
+$labels['spamtest'] = 'Probabilitat de Spam';
+$labels['operator'] = 'Operador';
+$labels['comparator'] = 'Comparador';
+$labels['isgreaterthan'] = '&eacutes major que';
+$labels['isgreaterthanequal'] = '&eacutes major o igual que';
+$labels['islessthan'] = '&eacutes menor que';
+$labels['islessthanequal'] = '&eacutes menor o igual que';
+$labels['equals'] = '&eacutes igual a';
+$labels['notequals'] = '&eacutes diferent de';
+$labels['countisgreaterthan'] = 'quantitat &eacutes major que';
+$labels['countisgreaterthanequal'] = 'quantitat ñes major o igual que';
+$labels['countislessthan'] = 'quantitat &eacutes menor que';
+$labels['countislessthanequal'] = 'quantitat &eacutes menor o igual que';
+$labels['countequals'] = 'quantitat &eacutes igual a';
+$labels['countnotequals'] = 'quantitat &eacutes diferent de';
+$labels['valueisgreaterthan'] = 'valor &eacutes major que';
+$labels['valueisgreaterthanequal'] = 'valor &eacutes major o igual que';
+$labels['valueislessthan'] = 'valor &eacutes menor que';
+$labels['valueislessthanequal'] = 'valor &eacutes menor o igual que';
+$labels['valueequals'] = 'valor &eacutes igual a';
+$labels['valuenotequals'] = 'valor &eacutes diferent de';
+$labels['userpart'] = 'la part de l\'usuari &eacutes igual a';
+$labels['notuserpart'] = 'la part de l\'usuari &eacutes diferent de';
+$labels['detailpart'] = 'la part del detall &eacutes igual a';
+$labels['notdetailpart'] = 'la part del detall &eacutes diferent de';
+$labels['domainpart'] = 'la part del domini &eacutes igual a';
+$labels['notdomainpart'] = 'la part del domini &eacutes diferent de';
+$labels['teststring'] = 'Iniciant prova';
+$labels['messagemoveto'] = 'Moure missatge a';
+$labels['messageredirect'] = 'Redirigir missatge a';
+$labels['messageimapflags'] = 'Marcar missatge com';
+$labels['messagereject'] = 'Rebutjar amb avís';
+$labels['messagevacation'] = 'Missatge de vacances';
+$labels['messagekeep'] = 'Mantenir missatges';
+$labels['messagediscard'] = 'Descartar missatge';
+$labels['messagenotify'] = 'Enviar notificaci&oacute; ';
+$labels['messagestop'] = 'Deixar de processar filtres';
+$labels['messagehelp'] = 'Qu&egrave; &eacutes això?';
+$labels['sieveorigsubj'] = 'Afegir assumpte original a la resposta';
+$labels['sievevachandle'] = 'Manejador';
+$labels['method'] = 'M&egrave;tode';
+$labels['options'] = 'Opcions';
+$labels['messagesrules'] = 'Regles de filtrat';
+$labels['messagesactions'] = 'Accions del filtre';
+$labels['sieveto'] = 'Àlies';
+$labels['sievefrom'] = 'De';
+$labels['flag'] = 'Marca';
+$labels['importancen'] = 'Cap';
+$labels['importance1'] = '1';
+$labels['importance2'] = '2';
+$labels['importance3'] = '3';
+$labels['flagread'] = 'Llegit';
+$labels['flagdeleted'] = 'Eliminat';
+$labels['flaganswered'] = 'Respost';
+$labels['flagdraft'] = 'Esborrany';
+$labels['flagflagged'] = 'Marcat';
+$labels['addsieverule'] = 'Afegir una altra regla despr&eacutes d\'aquesta';
+$labels['addsieveact'] = 'Afegir una altra acci&oacute; despr&eacutes d\'aquesta';
+$labels['deletesieverule'] = 'Eliminar aquesta regla';
+$labels['deletesieveact'] = 'Eliminar aquesta acci&oacute; ';
+$labels['envelopefrom'] = 'Remitent a la capçalera';
+$labels['envelopeto'] = 'Destinatari e la capçalera';
+$labels['otherheader'] = 'Una altra capçalera';
+$labels['days'] = 'Període';
+$labels['message'] = 'Missatge';
+$labels['sieveruleheaders'] = 'Veure exemples d\'altres capçaleres';
+$labels['examplefilters'] = 'Filtres d\'exemple';
+$labels['importfilters'] = 'Importar filtres';
+$labels['usedefaultfilter'] = 'Utilitzar filters per defecte';
+$labels['importfilter'] = 'Importar filtre';
+$labels['adveditor'] = 'Editor avançat';
+$labels['messageredirectcopy'] = 'Envía una còpia a ';
+$labels['messagecopyto'] = 'Copiar missatge a ';
+$labels['body'] = 'Cos';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Raw';
+$labels['text'] = 'Text';
+$labels['other'] = 'Altre';
+$labels['bodycontentpart'] = 'Contingut';
+$labels['notchecked'] = 'no seleccionat';
+$labels['spamlevelisgreaterthanequal'] = '&eacutes major o igual que';
+$labels['spamlevelislessthanequal'] = '&eacutes menor o igual que';
+$labels['spamlevelequals'] = '&eacutes igual a';
+$labels['selectruleset'] = 'Escollir conjunt de regles';
+$labels['activeruleset'] = '%s (actiu)';
+$labels['activateruleset'] = 'Activar aquest conjunt de regles';
+$labels['newruleset'] = 'Crear un nou conjunt de regles.';
+$labels['delruleset'] = 'Eliminar aquest conjunt de regles';
+$labels['renameruleset'] = 'Renombrar aquest conjunt de regles';
+$labels['copy'] = 'Copiar';
+$labels['copyexistingfilter'] = 'Copiar els filtres existentes';
+$labels['copytoruleset'] = 'Copiar filtre a un altre conjunt de regles';
+$labels['copyfromruleset'] = 'Copiar filtres des d\'un conjunt de regles existents';
+
+$messages = array();
+$messages['nosieverules'] = 'No s\'han trobat filtres.';
+$messages['filterdeleteconfirm'] = 'Est&agrave;s segur de voler eliminar aquest filtre?';
+$messages['ruledeleteconfirm'] = 'Est&agrave;s segur de voler eliminar aquesta regla?';
+$messages['actiondeleteconfirm'] = 'Est&agrave;s segur de voler eliminar aquesta acci&oacute; ?';
+$messages['filterunknownerror'] = 'Error desconegut en el servidor';
+$messages['filterconnerror'] = 'Impossible connectar amb el servidor sieve';
+$messages['filterdeleteerror'] = 'No s\'ha pogut eliminar el filtre. Error del servidor';
+$messages['filterdeleted'] = 'Filtre eliminat';
+$messages['filtersaved'] = 'Filtre guardat';
+$messages['filtersaveerror'] = 'Incapaç de guardar el filtre. Error en el servidor';
+$messages['vacdaysexp'] = 'El període &eacutes el número de dies que el missatge no ser&agrave; reenviat al mateix usuari, sense importar el nombre de vegades que intenti posar-se en contacte amb tu<br /><br />Por ejemplo, si en Jaume envia un misssatge un dilluns, i t&eacute un període fixat en 7, en Jaume rebr&agrave; un avís de vacances el dilluns però no en rebr&agrave; cap altre fins al proper dilluns, malgrat env&iuml;i m&eacutes missatges durant la setmana.';
+$messages['vachandleexp'] = 'Es pot usar un manejador per a vincular diferents missatges de vacances tots junts. Un cop s\'env&iuml;i el missatge no se n\'enviar&agrave; un altre que contingut el mateix manejador durant el període definit.';
+$messages['vactoexp'] = 'Llista de destinataris addicionals que seran inclosos en l\'auto-resposta. Si un usuari no &eacutes la sefa adreça personal i no est&agrave; a la llista no se li enviar&agrave;n missatges.';
+$messages['norulename'] = 'Cal assignar un nom al filtre';
+$messages['ruleexists'] = 'Ja existeix un filtre amb aquest nom. Escolleix-ne un altre';
+$messages['noheader'] = 'Heu d\'introdu&iuml;r el nom de la capçalera a verificar';
+$messages['headerbadchars'] = 'Error: La capçalera cont&eacute car&agrave;cters no permesos';
+$messages['noheadervalue'] = 'Ingresseu un valor per a comparar-lo amb la capçalera';
+$messages['sizewrongformat'] = 'Error: El tamany del missatge ha de ser num&egrave;ric';
+$messages['noredirect'] = 'Introdu&iuml;u una adreça de correu a la qual redirigir tots els missatges';
+$messages['redirectaddresserror'] = 'Error: Adreça no v&agrave;lida';
+$messages['noreject'] = 'Introdu&iuml;u el text a enviar en els missatges rebutjats';
+$messages['vacnodays'] = 'Introdu&iuml;u el número de dies per al període que el missatge no ser&agrave; reenviat a la mateixa persona';
+$messages['vacdayswrongformat'] = 'Error: El període ha de ser de m&eacutes d\'1 dia';
+$messages['vacnomsg'] = 'Introdu&iuml;u un text per al missatge';
+$messages['notifynomethod'] = 'Introdu&iuml;u un m&egrave;tode a trav&eacutes del qual s\'enviar&agrave; la notificaci&oacute; ';
+$messages['notifynomsg'] = 'Introdu&iuml;u un text per al seu missatge';
+$messages['sieveruleexp'] = 'Heu de definir una o m&eacutes regles que s\'empraran per a comprar els missatges. Els filtres s&oacute; n executats en l\'ordre que apareixen a l\'esquerra d\'aquesta pantalla. Si es troba una coincid&egrave;ncia, la resta del filtres no es comproven.';
+$messages['sieveactexp'] = 'Seleccioneu una de les opcions que apareixen a continuaci&oacute; . Aquesta acci&oacute; ser&agrave; executada per cada missatge que encaixi amb les regles definides a sobre d\'aquest text.';
+$messages['sieveheadershlp'] = 'A continuaci&oacute; hi ha alguns exemples de capçaleres que poden verificar-se amb filtres. Seleccioni\'n una per afegir a la regla o introdu&iuml;u-ne una de pròpia en el requadre de dalt.';
+$messages['movingfilter'] = 'Movent filtre...';
+$messages['noexistingfilters'] = 'No s\'han detectat filtres!';
+$messages['importdefault'] = '<b>Emprar filtres per defecte:</b> Hi ha un joc de filtres per defecte disponibles. Voleu instalar una còpia d\'aquests filtres?';
+$messages['importother'] = '<b>Importar filtres:</b> S\'ha trobat un altre joc de filtres de %s. Voleu importar-los a la llsita de filtres?';
+$messages['switchtoadveditor'] = 'L\'editor avançat li permet editar les regles de sieve directament. Qualsevol canvi que faci ser&agrave; il.legible per l\'editor normal de regles i es perder&agrave; si guarda modificacions amb l\'editor normal. Voleu continuar?';
+$messages['filterimported'] = 'Filtre importat correctament';
+$messages['filterimporterror'] = 'No s\'ha pogut importar el filtre . Error en el servidor';
+$messages['badoperator'] = 'Ho lamentem, però l\'operador seleccionat no es pot usar en aquesta regla.';
+$messages['filteractionerror'] = 'L\'acci&oacute; requerida no est&agrave; disponible en aquest servidor.';
+$messages['filtermissingerror'] = 'No s\'ha pogut localitzar la regla solicitada.';
+$messages['delrulesetconf'] = 'Esteu segur de voler eliminar aquest conjunt de regles?';
+$messages['rulesetexists'] = 'Ja existeix un conjunt de regles amb aquest nom. Escolliu-ne un altre.';
+$messages['copyexisting'] = '<b> Copia el seg&uuml;ent conjunt de regles:</b> Voleu importar els filtres d\'un conjunt de regles existents al conjunt actual?';
+$messages['filtercopied'] = 'Filtre copiat correctament';
+$messages['nosieverulesets'] = 'No s\'han trobat regles.';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/cs_CZ.inc b/plugins/sieverules/localization/cs_CZ.inc
new file mode 100644
index 000000000..f5a8b5f61
--- /dev/null
+++ b/plugins/sieverules/localization/cs_CZ.inc
@@ -0,0 +1,195 @@
+<?php
+/* Author: Kepi */
+
+$labels = array();
+$labels['filters'] = 'Filtry';
+$labels['filtersname'] = 'Filtry ($name)';
+$labels['managefilters'] = 'Spravovat filtry';
+$labels['filtername'] = 'Název filtru';
+$labels['disablerule'] = 'Vypnout filtr';
+$labels['disabled'] = 'vypnuto';
+$labels['newfilter'] = 'Nový filtr';
+$labels['moveup'] = 'Posunout nahoru';
+$labels['movedown'] = 'Posunout dolů';
+$labels['filterallof'] = 'odpovídá všem pravidlům';
+$labels['filteranyof'] = 'odpovídá alespoň jednomu pravidlu';
+$labels['filterany'] = 'všechny zprávy';
+$labels['filtercontains'] = 'obsahuje';
+$labels['filternotcontains'] = 'neobsahuje';
+$labels['filteris'] = 'je rovno';
+$labels['filterisnot'] = 'není rovno';
+$labels['filterexists'] = 'existuje';
+$labels['filternotexists'] = 'neexistuje';
+$labels['filterregex'] = 'odpovídá regulárnímu výrazu';
+$labels['filternotregex'] = 'neodpovídá regulárnímu výrazu';
+$labels['filterunder'] = 'je méně než';
+$labels['filterover'] = 'je více než';
+$labels['filterbefore'] = 'je před';
+$labels['filterafter'] = 'je po';
+$labels['filteradvoptions'] = 'více možností...';
+$labels['spamtest'] = 'Pravděpodobnost spamu';
+$labels['operator'] = 'Operátor';
+$labels['comparator'] = 'Porovnávání';
+$labels['isgreaterthan'] = 'je větší než';
+$labels['isgreaterthanequal'] = 'je větší nebo rovno';
+$labels['islessthan'] = 'je menší než';
+$labels['islessthanequal'] = 'je menší nebo rovno';
+$labels['equals'] = 'je rovno';
+$labels['notequals'] = 'není rovno';
+$labels['countisgreaterthan'] = 'počet je větší než';
+$labels['countisgreaterthanequal'] = 'počet je větší nebo roven';
+$labels['countislessthan'] = 'počet je menší než';
+$labels['countislessthanequal'] = 'počet je menší nebo roven';
+$labels['countequals'] = 'počet je roven';
+$labels['countnotequals'] = 'počet není roven';
+$labels['valueisgreaterthan'] = 'hodnota je větší než';
+$labels['valueisgreaterthanequal'] = 'hodnota je větší nebo rovna';
+$labels['valueislessthan'] = 'hodnota je menší než';
+$labels['valueislessthanequal'] = 'hodnota je menší nebo rovna';
+$labels['valueequals'] = 'hodnota je rovna';
+$labels['valuenotequals'] = 'hodnota není rovna';
+$labels['userpart'] = 'část uživatele je rovna';
+$labels['notuserpart'] = 'část uživatele není rovna';
+$labels['detailpart'] = 'upřesňující část je rovna';
+$labels['notdetailpart'] = 'upřesňující část není rovna';
+$labels['domainpart'] = 'doménová část je rovna';
+$labels['notdomainpart'] = 'doménová část není rovna';
+$labels['teststring'] = 'Testovací řetězec';
+$labels['messagemoveto'] = 'Přesunout zprávy do';
+$labels['messageredirect'] = 'Přesměrovat zprávy na';
+$labels['messageimapflags'] = 'Označit zprávy jako';
+$labels['messagereject'] = 'Odmítnout se zprávou';
+$labels['messagevacation'] = 'Automatická odpověď';
+$labels['messagekeep'] = 'Ponechat zprávu';
+$labels['messagediscard'] = 'Zahodit zprávu';
+$labels['messagenotify'] = 'Odeslat upozornění';
+$labels['messagestop'] = 'Přerušit vykonávání filtrů';
+$labels['messagehelp'] = 'Co je toto?';
+$labels['sieveorigsubj'] = 'K odpovědi připojit původní předmět';
+$labels['sievevachandle'] = 'Štítek';
+$labels['method'] = 'Metoda';
+$labels['options'] = 'Možnosti';
+$labels['messagesrules'] = 'Pravidla filtru';
+$labels['messagesactions'] = 'Akce filtru';
+$labels['sieveto'] = 'Aliasy';
+$labels['sievefrom'] = 'Od';
+$labels['flag'] = 'Priorita';
+$labels['importancen'] = 'Žádná';
+$labels['importance1'] = 'Vysoká';
+$labels['importance2'] = 'Normální';
+$labels['importance3'] = 'Nízká';
+$labels['flagread'] = 'Přečtené';
+$labels['flagdeleted'] = 'Odstraněné';
+$labels['flaganswered'] = 'Zodpovězené';
+$labels['flagdraft'] = 'Koncept';
+$labels['flagflagged'] = 'Označené';
+$labels['addsieverule'] = 'Přidat další pravidlo (pod toto pravidlo)';
+$labels['addsieveact'] = 'Přidat další akci (pod tuto akci)';
+$labels['deletesieverule'] = 'Odstranit toto pravidlo';
+$labels['deletesieveact'] = 'Odstranit tuto akci';
+$labels['envelopefrom'] = 'Skutečný odesílatel';
+$labels['envelopeto'] = 'Skutečný adresát';
+$labels['otherheader'] = 'Další hlavička';
+$labels['days'] = 'Prodleva';
+$labels['message'] = 'Zpráva';
+$labels['sieveruleheaders'] = 'Zobrazit ukázky dalších hlaviček';
+$labels['examplefilters'] = 'Ukázkové filtry';
+$labels['importfilters'] = 'Import filtrů';
+$labels['usedefaultfilter'] = 'Použít výchozí filtry';
+$labels['importfilter'] = 'Importovat filtry';
+$labels['moreactions'] = 'Více voleb...';
+$labels['adveditor'] = 'Pokročilý editor';
+$labels['stdeditor'] = 'Normální editor';
+$labels['messageredirectcopy'] = 'Odeslat kopii na';
+$labels['messagecopyto'] = 'Kopírovat zprávu do';
+$labels['body'] = 'Tělo zprávy';
+$labels['auto'] = 'Automaticky';
+$labels['raw'] = 'Surové';
+$labels['text'] = 'Textové';
+$labels['other'] = 'Ostatní';
+$labels['bodycontentpart'] = 'Obsahová část';
+$labels['notchecked'] = 'Nekontrolováno';
+$labels['spamlevelisgreaterthanequal'] = 'je větší nebo rovno';
+$labels['spamlevelislessthanequal'] = 'je menší nebo rovno';
+$labels['spamlevelequals'] = 'je rovno';
+$labels['i;ascii-casemap'] = 'shoda bez ohledu na velikost písmen';
+$labels['i;octet'] = 'přesná shoda';
+$labels['i;ascii-numeric'] = 'číselná shoda';
+$labels['selectruleset'] = 'Vyberte sadu pravidel';
+$labels['activeruleset'] = '%s (aktivní)';
+$labels['activateruleset'] = 'Aktivovat tuto sadu filtrů';
+$labels['isactive'] = 'Aktivní sada filtrů';
+$labels['isinactive'] = 'Neaktivní sada filtrů';
+$labels['newruleset'] = 'Vytvořit novou sadu filtrů';
+$labels['delruleset'] = 'Odstranit tuto sadu filtrů';
+$labels['renameruleset'] = 'Přejmenovat tuto sadu filtrů';
+$labels['copy'] = 'Kopírovat';
+$labels['copyexistingfilter'] = 'Kopírovat existující filtry';
+$labels['copytoruleset'] = 'Kopírovat filtr do jiné sady';
+$labels['copyfromruleset'] = 'Kopířovat filtry z existující sady';
+$labels['time'] = 'Čas';
+$labels['weekday'] = 'Den v týdnu';
+$labels['virustest'] = 'Pravděpodobnost viru';
+$labels['novirus'] = 'žádný virus nenalezen';
+$labels['virusremoved'] = 'virus nalezen a odstraněn';
+$labels['viruscured'] = 'virus nalezen a vyléčen';
+$labels['possiblevirus'] = 'zpráva pravděpodobně obsahuje virus';
+$labels['definitevirus'] = 'zpráva určitě obsahuje virus';
+
+$messages = array();
+$messages['nosieverules'] = 'Nenalezeny žádné filtry.';
+$messages['filterdeleteconfirm'] = 'Opravdu chcete smazat tento filtr?';
+$messages['ruledeleteconfirm'] = 'Opravdu chcete smazat toto pravidlo?';
+$messages['actiondeleteconfirm'] = 'Opravdu chcete smazat tuto akci?';
+$messages['filterunknownerror'] = 'Neznámá chyba serveru.';
+$messages['filterconnerror'] = 'Nepodařilo se připojit k serveru sieve.';
+$messages['filterdeleteerror'] = 'Nepodařilo se smazat filtr. Nastala chyba serveru.';
+$messages['filterdeleted'] = 'Filtr úspěšně smazán.';
+$messages['filtersaved'] = 'Filt úspěšně uložen.';
+$messages['filtersaveerror'] = 'Nepodařilo se uložit filtr. Nastala chyba serveru.';
+$messages['vacdaysexp'] = 'Prodleva je počet dní, během kterých nebude zpráva doručena stejnému uživateli, nehledě na to, kolikrát vás kontaktuje.<br /><br />Příklad: Pokud vám Honza napíše v pondělí a prodleva je nastavena na 7, Honza obdrží zprávu o vaší nedostupnosti v pondělí, ale do dalšího pondělí už žádnou další zprávu nedostane, nehledě na počet mailů, které vám během týdne pošle.';
+$messages['vachandleexp'] = 'Štítek může být použit ke spojení více různých oznámení o nedostupnosti dohromady. Jakmile je jedna zpráva zaslána, žádná další se stejným štítkem už v dané době zaslána nebude.';
+$messages['vactoexp'] = 'Seznam dalších emailů, které jsou v automatické odpovědi zahrnuty. Pokud není příjemcem emailu vaše hlavní adresa a není na tomto seznamu, žádná zpráva nebude odeslána.';
+$messages['vactoexp_adv'] = 'Jednotlivé adresy oddělte čárkou. Například: test1@adresa.cz,test2@adresa.cz,test3@adresa.cz';
+$messages['vactoexp_err'] = 'Chyba: Více aliasů musí být odděleno čárkou.';
+$messages['norulename'] = 'Zadejte prosím jméno pro tento filtr.';
+$messages['ruleexists'] = 'Filtr se stejným jménem již existuje. Zadejte prosím jiné.';
+$messages['noheader'] = 'Zadejte prosím jméno hlavičky k otestování.';
+$messages['headerbadchars'] = 'Chyba: hlavička obsahuje zakázané znaky.';
+$messages['noheadervalue'] = 'Zadejte prosím hodnotu, vůči které bude hlavička testována.';
+$messages['sizewrongformat'] = 'Chyba: velikost zprávy musí být číslo.';
+$messages['noredirect'] = 'Zadejte prosím emailovou adresu, na kterou se má zpráva přesměrovat.';
+$messages['redirectaddresserror'] = 'Chyba: zdá se, že je email chybný.';
+$messages['noreject'] = 'Zadejte prosím zprávu, která se odešle spolu s odmítnutým emailem.';
+$messages['vacnodays'] = 'Zadejte prosím počet dní pro prodlevu, během které nebude zpráva zasílána stejné osobě.';
+$messages['vacdayswrongformat'] = 'Chyba: prodleva musí být číslo větší nebo rovné 1.';
+$messages['vacnomsg'] = 'Zadejte prosím nějaký text pro vaši zprávu.';
+$messages['notifynomethod'] = 'Zadejte prosím metodu, jakou má být notifikace zaslána.';
+$messages['notifynomsg'] = 'Zadejte prosím nějaký text pro vaši zprávu.';
+$messages['sieveruleexp'] = 'Prosím přidejte jedno nebo více pravidel vůči kterým bude každá zpráva testována. Filtry jsou vyhodnocovány v pořadí v jakém jsou uvedeny v sloupci vlevo. Pokud je nalezena shoda, žádný další filtr se již nevyhodnocuje.';
+$messages['sieveruleexp_stop'] = 'Zadejte prosím jedno nebo více pravidel vůči kterým bude každá zpráva testována. Filtry jsou vyhodnocovány v pořadí v jakém jsou uvedeny v sloupci vlevo dokud není dosaženo \'Přerušení\' akce.';
+$messages['sieveactexp'] = 'Prosím vyberte si z voleb níže. Akce budou vykonány pro jakoukoliv zprávu, která vyhovuje pravidlům výše.';
+$messages['sieveheadershlp'] = 'Níže je několik případu hlaviček, které mohou být ve filtrech testovány. Pro přidání do pravidla vyberte hlavičku nebo zadejte vlastní v poli nahoře.';
+$messages['movingfilter'] = 'Přesouvám filtr...';
+$messages['noexistingfilters'] = 'Nenalezeny žádné existující filtry!';
+$messages['importdefault'] = '<b>Použít výchozí filtry:</b> Je dostupná sada výchozích filtrů. Přejte si tuto sadu využít?';
+$messages['importother'] = '<b>Importovat filtry:</b> Byla nalezena jiná sada filtrů z %s. Chcete tyto filtry importovat do stávající sady?';
+$messages['switchtoadveditor'] = 'Přepnutí do pokročilého editoru vám umožní přímo upravovat soubor sieve filtrů. Jakékoliv provedené změny mohou být nečitelné v normálním editoru a mohou být ztraceny, pokud je v normálním editoru uložíte. Přejete si pokračovat?';
+$messages['filterimported'] = 'Filtry úspěšně naimportovány.';
+$messages['filterimporterror'] = 'Nelze importovat filtry. Nastala chyba serveru.';
+$messages['notifyinvalidmethod'] = 'Metoda není napsána ve správném formátu, musí se jednat o URI. Například: `mailto:upozorneni@adresa.cz`.';
+$messages['nobodycontentpart'] = 'Zadejte prosím obsahovou část k otestování.';
+$messages['badoperator'] = 'Omlouváme se, ale operátor, který jste vybrali, nemůže být v tomto pravidle použit.';
+$messages['filteractionerror'] = 'Akce, které jste si vyžádali, není podporována serverem.';
+$messages['filtermissingerror'] = 'Nepodařilo se najít vyžádané pravidlo.';
+$messages['contentpartexp'] = 'MIME-typ nebo konkrétní část zprávy, která má být testována. Například: `message/rfc822`, `text/html`, `audio/mp3` or `image`.';
+$messages['delrulesetconf'] = 'Opravdu chcete smazat tuto sadu pravidel?';
+$messages['rulesetexists'] = 'Sada pravidel s tímto jménem již existuje. Zadejte prosím jinou.';
+$messages['copyexisting'] = '<b>Kopírovat existující sadu pravidel:</b> Chcete zkopírovat filtry z existující sady pravidel do vybrané sady?';
+$messages['filtercopied'] = 'Filtry úspěšně zkopírovány.';
+$messages['nosieverulesets'] = 'Nenalezeny žádné sady pravidel.';
+$messages['baddateformat'] = 'Chyba: Zadejte prosím datum ve formátu YYYY-MM-DD';
+$messages['badtimeformat'] = 'Chyba: Zadejte prosím čas ve formátu HH:MM:SS';
+$messages['missingfoldername'] = 'Chyba: Zadejte prosím jméno složky';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/de_CH.inc b/plugins/sieverules/localization/de_CH.inc
new file mode 100644
index 000000000..d203cd8c1
--- /dev/null
+++ b/plugins/sieverules/localization/de_CH.inc
@@ -0,0 +1,192 @@
+<?php
+/* Author: Mike Constabel */
+
+$labels = array();
+$labels['filters'] = 'Filter';
+$labels['managefilters'] = 'Filter verwalten';
+$labels['filtername'] = 'Filtername';
+$labels['disablerule'] = 'Filterregel abschalten';
+$labels['disabled'] = 'abgeschaltet';
+$labels['newfilter'] = 'Neuer Filter';
+$labels['moveup'] = 'Aufwärts';
+$labels['movedown'] = 'Abwärts';
+$labels['filterallof'] = 'trifft alle folgenden Regeln';
+$labels['filteranyof'] = 'trifft irgendeine der folgenden Regeln';
+$labels['filterany'] = 'alle Nachrichten';
+$labels['filtercontains'] = 'enthält';
+$labels['filternotcontains'] = 'enthält nicht';
+$labels['filteris'] = 'ist identisch mit';
+$labels['filterisnot'] = 'ist nicht identisch mit';
+$labels['filterexists'] = 'existiert';
+$labels['filternotexists'] = 'existiert nicht';
+$labels['filterregex'] = 'trifft auf den regulären Ausdruck zu';
+$labels['filternotregex'] = 'trifft nicht auf den regulären Ausdruck zu';
+$labels['filterunder'] = 'ist kleiner als';
+$labels['filterover'] = 'ist größer als';
+$labels['filterbefore'] = 'ist vor';
+$labels['filterafter'] = 'ist nach';
+$labels['filteradvoptions'] = 'weitere Optionen...';
+$labels['spamtest'] = 'Spam-Wahrscheinlichkeit';
+$labels['operator'] = 'Operator';
+$labels['comparator'] = 'Komparator';
+$labels['isgreaterthan'] = 'ist größer als';
+$labels['isgreaterthanequal'] = 'ist größer als oder gleich ';
+$labels['islessthan'] = 'ist kleiner als';
+$labels['islessthanequal'] = 'ist kleiner als oder gleich';
+$labels['equals'] = 'ist gleich';
+$labels['notequals'] = 'ist nicht gleich';
+$labels['countisgreaterthan'] = 'Anzahl ist größer als';
+$labels['countisgreaterthanequal'] = 'Anzahl ist mindestens';
+$labels['countislessthan'] = 'Anzahl ist kleiner';
+$labels['countislessthanequal'] = 'Anzahl ist höchstens';
+$labels['countequals'] = 'Anzahl ist gleich';
+$labels['countnotequals'] = 'Anzahl ist ungleich';
+$labels['valueisgreaterthan'] = 'Wert ist größer als';
+$labels['valueisgreaterthanequal'] = 'Wert ist mindestens';
+$labels['valueislessthan'] = 'Wert ist kleiner als';
+$labels['valueislessthanequal'] = 'Wert ist höchstens';
+$labels['valueequals'] = 'Wert ist gleich';
+$labels['valuenotequals'] = 'Wert ist ungleich';
+$labels['userpart'] = 'User-Teil gleicht';
+$labels['notuserpart'] = 'User-Teil gleicht nicht';
+$labels['detailpart'] = 'Detail-Teil gleicht';
+$labels['notdetailpart'] = 'Detail-Teil gleicht nicht';
+$labels['domainpart'] = 'Domain-Teil gleicht';
+$labels['notdomainpart'] = 'Domain-Teil gleicht nicht';
+$labels['teststring'] = 'Test-Zeichenkette';
+$labels['messagemoveto'] = 'Verschiebe Nachricht nach';
+$labels['messageredirect'] = 'Leite Nachricht weiter an';
+$labels['messageimapflags'] = 'Markiere Nachricht als';
+$labels['messagereject'] = 'Lehne Nachricht ab mit Begründung';
+$labels['messagevacation'] = 'Abwesenheitsnachricht';
+$labels['messagekeep'] = 'Behalte Nachricht';
+$labels['messagediscard'] = 'Verwerfe Nachricht';
+$labels['messagenotify'] = 'Sende Benachrichtigung';
+$labels['messagestop'] = 'Filterverarbeitung beenden';
+$labels['messagehelp'] = 'Hilfe';
+$labels['sieveorigsubj'] = 'Hänge originalen Betreff an die Antwort an';
+$labels['sievevachandle'] = 'Handle';
+$labels['method'] = 'Methode';
+$labels['options'] = 'Optionen';
+$labels['messagesrules'] = 'Filterregeln';
+$labels['messagesactions'] = 'Filteraktionen';
+$labels['sieveto'] = 'Alias';
+$labels['sievefrom'] = 'From';
+$labels['flag'] = 'Markierung';
+$labels['importancen'] = 'Keine';
+$labels['importance1'] = '1';
+$labels['importance2'] = '1';
+$labels['importance3'] = '1';
+$labels['flagread'] = 'Gelesen';
+$labels['flagdeleted'] = 'Gelöscht';
+$labels['flaganswered'] = 'Beantwortet';
+$labels['flagdraft'] = 'Entwurf';
+$labels['flagflagged'] = 'Markiert';
+$labels['addsieverule'] = 'Weitere Regel unterhalb dieser hinzufügen';
+$labels['addsieveact'] = 'Weitere Aktion unterhalb dieser hinzufügen';
+$labels['deletesieverule'] = 'Diese Regel löschen';
+$labels['deletesieveact'] = 'Diese Aktion löschen';
+$labels['envelopefrom'] = 'Envelope From';
+$labels['envelopeto'] = 'Envelope To';
+$labels['otherheader'] = 'Anderer Header';
+$labels['days'] = 'Zeitraum';
+$labels['message'] = 'Nachricht';
+$labels['sieveruleheaders'] = 'Zeige Beispiele für andere Header';
+$labels['examplefilters'] = 'Beispielfilter...';
+$labels['importfilters'] = 'Filter importieren';
+$labels['usedefaultfilter'] = 'Verwende Standardfilter';
+$labels['importfilter'] = 'Filter importieren';
+$labels['moreactions'] = 'Weitere Optionen...';
+$labels['adveditor'] = 'Erweiterter Editor';
+$labels['stdeditor'] = 'Standard-Editor';
+$labels['messageredirectcopy'] = 'Sende eine Kopie an';
+$labels['messagecopyto'] = 'Kopiere Nachricht nach';
+$labels['body'] = 'Body';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Raw';
+$labels['text'] = 'Text';
+$labels['other'] = 'Anderes';
+$labels['bodycontentpart'] = 'Content Part';
+$labels['notchecked'] = 'nicht geprüft';
+$labels['spamlevelisgreaterthanequal'] = 'ist mindestens';
+$labels['spamlevelislessthanequal'] = 'ist höchstens';
+$labels['spamlevelequals'] = 'ist gleich';
+$labels['i;ascii-casemap'] = 'schreibungsunabhängige Zeichenfolge';
+$labels['i;octet'] = 'exakte Zeichenfolge';
+$labels['i;ascii-numeric'] = 'zahlenmäßige Übereinstimmung';
+$labels['selectruleset'] = 'Wähle Regelsatz';
+$labels['activeruleset'] = '%s (aktiv)';
+$labels['activateruleset'] = 'Aktiviere Regelsatz';
+$labels['newruleset'] = 'Erstelle Regelsatz';
+$labels['delruleset'] = 'Lösche diesen Regelsatz';
+$labels['renameruleset'] = 'Regelsatz umbenennen';
+$labels['copy'] = 'Kopieren';
+$labels['copyexistingfilter'] = 'Kopiere bestehende Filter';
+$labels['copytoruleset'] = 'Kopiere Filter in anderen Regelsatz';
+$labels['copyfromruleset'] = 'Kopiere Filter aus anderem Regelsatz';
+$labels['time'] = 'Zeit';
+$labels['weekday'] = 'Wochentag';
+$labels['virustest'] = 'Viruswahrscheinlichkeit';
+$labels['novirus'] = 'keinen Virus gefunden';
+$labels['virusremoved'] = 'Virus gefunden und entfernt';
+$labels['viruscured'] = 'Virus gefunden und kuriert';
+$labels['possiblevirus'] = 'Nachricht enthält möglicherweise einen Virus';
+$labels['definitevirus'] = 'Nachricht enthält definitiv einen Virus';
+
+$messages = array();
+$messages['nosieverules'] = 'Keine Filter gefunden.';
+$messages['filterdeleteconfirm'] = 'Bist du sicher das du diesen Filter löschen möchtest?';
+$messages['ruledeleteconfirm'] = 'Bist du sicher das du diese Regel löschen möchtest?';
+$messages['actiondeleteconfirm'] = 'Bist du sicher das du diese Aktion löschen möchtest?';
+$messages['filterunknownerror'] = 'Unbekannter Serverfehler';
+$messages['filterconnerror'] = 'Konnte keine Verbindung zum Sieve-Server aufbauen';
+$messages['filterdeleteerror'] = 'Konnte Filter nicht löschen. Serverfehler';
+$messages['filterdeleted'] = 'Filter erfolgreich gelöscht';
+$messages['filtersaved'] = 'Filter erfolgreich gespeichert';
+$messages['filtersaveerror'] = 'Konnte Filter nicht speichern. Serverfehler';
+$messages['vacdaysexp'] = 'Zeitraum in Anzahl Tagen, in dem die Abwesenheitsnachricht nicht erneut an den selben Absender gesendet wird.<br /><br />Beispiel: Wenn Joe dir am Montag eine Mail schickt und der Zeitraum beträgt 7, bekommt Joe sofort eine Abwesenheitsnachricht gesendet, dann aber bis zum darauffolgenden Montag keine mehr, egal wie häufig er weitere Mails sendet.';
+$messages['vachandleexp'] = 'Ein Handle kann genutzt werden um verschiedene Abwesenheitsnachrichten zu koppeln, so dass im Zeitraum keine weiteren Abwesenheitsnachrichten gesendet werden die das selbe Handle besitzen.';
+$messages['vactoexp'] = 'Liste zusätzlicher Empfängeradressen für die ebenfalls eine Abwesenheitsnachricht gesendet wird. Gehen Mails ein, deren Empfänger nicht die Hauptadresse ist und die nicht in dieser Liste stehen wird keine Abwesenheitsnachricht gesendet.';
+$messages['vactoexp_adv'] = 'Trenne mehrere Adressen mit einem Komma (,). Zum Beispiel: test1@example.com,test2@example.com,test3@example.com';
+$messages['vactoexp_err'] = 'Fehler: Mehrere Adressen müssen durch ein Komma (,) getrennt werden';
+$messages['norulename'] = 'Bitte gib einen Namen für diesen Filter ein';
+$messages['ruleexists'] = 'Ein Filter mit diesem Namen existiert bereits. Wähle einen anderen';
+$messages['noheader'] = 'Bitte gib den Namen des zu testenden Headers ein';
+$messages['headerbadchars'] = 'Fehler: Header enthält unzulässige Zeichen';
+$messages['noheadervalue'] = 'Bitte gib den Wert ein, gegen den der Header getestet werden soll';
+$messages['sizewrongformat'] = 'Fehler: Nachrichtengröße muss numerisch sein';
+$messages['noredirect'] = 'Bitte gib eine E-Mail Adresse zur Weiterleitung ein';
+$messages['redirectaddresserror'] = 'Fehler: E-Mail Adresse ungültig';
+$messages['noreject'] = 'Bitte gib eine Nachricht als Begründung für die Abweisung der Mail ein';
+$messages['vacnodays'] = 'Bitte gib die Anzahl Tage ein, währendessen die Abwesenheitsnachricht nicht erneut an den selben Absender gesendet wird.';
+$messages['vacdayswrongformat'] = 'Fehler: Der Zeitraum muss numerisch größer gleich 1 sein';
+$messages['vacnomsg'] = 'Bitte gib einen Text für deine Nachricht ein';
+$messages['notifynomethod'] = 'Bitte gibt eine Methode an mit der Benachrichtigungen versendet werden sollen.';
+$messages['notifynomsg'] = 'Bitte gebe einen Text für die Nachricht ein';
+$messages['sieveruleexp'] = 'Bitte erstelle eine oder mehrere Regeln gegen die jede Nachricht getestet werden soll. Filter werden in der Reihenfolge durchlaufen, in der sie links gelistet sind. Wenn ein Filter zutrifft, werden keine weiteren Filter durchlaufen.';
+$messages['sieveruleexp_stop'] = 'Bitte wähle mindestens eine Regel, die auf die Nachrichten angewandt werden soll. Filter werden in der Reihenfolge abgearbeitet, wie sie auf der linken Seite dargestellt sind bis eine \'Stop\'-Regel zutrifft.';
+$messages['sieveactexp'] = 'Bitte wähle eine von den unten gelisteten Optionen. Diese Aktionen werden für jede Nachricht ausgeführt, die auf obige Filterregel(n) passt.';
+$messages['sieveheadershlp'] = 'Unten werden einige Header als Beispiel für mögliche Header angezeigt. Wähle einen oder füge oben einen eigenen Header hinzu.';
+$messages['movingfilter'] = 'Verschiebe Filter...';
+$messages['noexistingfilters'] = 'Keine vorhandenen Filter gefunden!';
+$messages['importdefault'] = '<b>Verwende Standardfilter:</b> Es sind eine Reihe von Standardfiltern verfügbar. Möchtest Du diese verwenden?';
+$messages['importother'] = '<b>Filter importieren:</b> EIne Reihe von Filtern von %s wurden gefunden. Möchtest Du diese Filter Deinen Filtern hinzufügen?';
+$messages['switchtoadveditor'] = 'Die verwendung des erweiterten Editors ermöglicht es, die Sieve-Filter direkt zu bearbeiten. Alle Änderungen sind für den normalen Editor unlesbar und werden verworfen wenn eine Regel mit dem normalen Editor gespeichert wird. Möchtest Du fortfahren?';
+$messages['filterimported'] = 'Filterimport erfolgreich';
+$messages['filterimporterror'] = 'Fehler beim Filterimport. Serverfehler.';
+$messages['notifyinvalidmethod'] = 'Die Methode scheint ein ungültiges Format zu haben. Es muss eine URI sein, z. B.: `mailto:alert@example.com`.';
+$messages['nobodycontentpart'] = 'Bitte gib den zu testenden Bereich des Inhalts an';
+$messages['badoperator'] = 'Der gewählte Operator kann in dieser Regel nicht verwendet werden';
+$messages['filteractionerror'] = 'Die gewünschte Aktion wird vom Server nicht unterstützt';
+$messages['filtermissingerror'] = 'Die angeforderte Regel konnte nicht gefunden werden';
+$messages['contentpartexp'] = 'Der MIME-Typ oder der Teil der Nachricht, der getestet werden soll. Zum Beispiel: `message/rfc822`, `text/html`, `audio/mp3` oder `image`.';
+$messages['delrulesetconf'] = 'Soll dieser Regelsatz wirklich gelöscht werden?';
+$messages['rulesetexists'] = 'Ein Regelsatz mit diesem Namen existiert bereits. Bitte wähle einen anderen Namen.';
+$messages['copyexisting'] = 'Kopiere bestehenden Regelsatz: Sollen die Filter von einem bestehenden Regelsatz in den akutellen Regelsatz kopiert werden?';
+$messages['filtercopied'] = 'Filter erfolgreich kopiert.';
+$messages['nosieverulesets'] = 'Keine Regelsätze gefunden.';
+$messages['baddateformat'] = 'Fehler: Bitte das Datum im Format JJJJ-MM-TT eingeben.';
+$messages['badtimeformat'] = 'Fehler: Bitte die Uhrzeit im Format HH:MM:SS eingeben.';
+$messages['missingfoldername'] = 'Fehler: Bitte ein Verzeichnisnamen eingeben.';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/de_DE.inc b/plugins/sieverules/localization/de_DE.inc
new file mode 100644
index 000000000..3d7499c35
--- /dev/null
+++ b/plugins/sieverules/localization/de_DE.inc
@@ -0,0 +1,192 @@
+<?php
+/* Author: Michael Metz */
+
+$labels = array();
+$labels['filters'] = 'Filter';
+$labels['managefilters'] = 'Filter verwalten';
+$labels['filtername'] = 'Filtername';
+$labels['disablerule'] = 'Filterregel abschalten';
+$labels['disabled'] = 'abgeschaltet';
+$labels['newfilter'] = 'Neuer Filter';
+$labels['moveup'] = 'Aufwärts';
+$labels['movedown'] = 'Abwärts';
+$labels['filterallof'] = 'trifft alle folgenden Regeln';
+$labels['filteranyof'] = 'trifft irgendeine der folgenden Regeln';
+$labels['filterany'] = 'alle Nachrichten';
+$labels['filtercontains'] = 'enthält';
+$labels['filternotcontains'] = 'enthält nicht';
+$labels['filteris'] = 'ist identisch mit';
+$labels['filterisnot'] = 'ist nicht identisch mit';
+$labels['filterexists'] = 'existiert';
+$labels['filternotexists'] = 'existiert nicht';
+$labels['filterregex'] = 'trifft auf den regulären Ausdruck zu';
+$labels['filternotregex'] = 'trifft nicht auf den regulären Ausdruck zu';
+$labels['filterunder'] = 'ist kleiner als';
+$labels['filterover'] = 'ist größer als';
+$labels['filterbefore'] = 'ist vor';
+$labels['filterafter'] = 'ist nach';
+$labels['filteradvoptions'] = 'weitere Optionen...';
+$labels['spamtest'] = 'Spam-Wahrscheinlichkeit';
+$labels['operator'] = 'Operator';
+$labels['comparator'] = 'Komparator';
+$labels['isgreaterthan'] = 'ist größer als';
+$labels['isgreaterthanequal'] = 'ist größer als oder gleich ';
+$labels['islessthan'] = 'ist kleiner als';
+$labels['islessthanequal'] = 'ist kleiner als oder gleich';
+$labels['equals'] = 'ist gleich';
+$labels['notequals'] = 'ist nicht gleich';
+$labels['countisgreaterthan'] = 'Anzahl ist größer als';
+$labels['countisgreaterthanequal'] = 'Anzahl ist mindestens';
+$labels['countislessthan'] = 'Anzahl ist kleiner';
+$labels['countislessthanequal'] = 'Anzahl ist höchstens';
+$labels['countequals'] = 'Anzahl ist gleich';
+$labels['countnotequals'] = 'Anzahl ist ungleich';
+$labels['valueisgreaterthan'] = 'Wert ist größer als';
+$labels['valueisgreaterthanequal'] = 'Wert ist mindestens';
+$labels['valueislessthan'] = 'Wert ist kleiner als';
+$labels['valueislessthanequal'] = 'Wert ist höchstens';
+$labels['valueequals'] = 'Wert ist gleich';
+$labels['valuenotequals'] = 'Wert ist ungleich';
+$labels['userpart'] = 'User-Teil gleicht';
+$labels['notuserpart'] = 'User-Teil gleicht nicht';
+$labels['detailpart'] = 'Detail-Teil gleicht';
+$labels['notdetailpart'] = 'Detail-Teil gleicht nicht';
+$labels['domainpart'] = 'Domain-Teil gleicht';
+$labels['notdomainpart'] = 'Domain-Teil gleicht nicht';
+$labels['teststring'] = 'Test-Zeichenkette';
+$labels['messagemoveto'] = 'Verschiebe Nachricht nach';
+$labels['messageredirect'] = 'Leite Nachricht weiter an';
+$labels['messageimapflags'] = 'Markiere Nachricht als';
+$labels['messagereject'] = 'Lehne Nachricht ab mit Begründung';
+$labels['messagevacation'] = 'Abwesenheitsnachricht';
+$labels['messagekeep'] = 'Behalte Nachricht';
+$labels['messagediscard'] = 'Verwerfe Nachricht';
+$labels['messagenotify'] = 'Sende Benachrichtigung';
+$labels['messagestop'] = 'Filterverarbeitung beenden';
+$labels['messagehelp'] = 'Hilfe';
+$labels['sieveorigsubj'] = 'Hänge originalen Betreff an die Antwort an';
+$labels['sievevachandle'] = 'Handle';
+$labels['method'] = 'Methode';
+$labels['options'] = 'Optionen';
+$labels['messagesrules'] = 'Filterregeln';
+$labels['messagesactions'] = 'Filteraktionen';
+$labels['sieveto'] = 'Empfänger';
+$labels['sievefrom'] = 'Absender';
+$labels['flag'] = 'Markierung';
+$labels['importancen'] = 'Keine';
+$labels['importance1'] = '1';
+$labels['importance2'] = '1';
+$labels['importance3'] = '1';
+$labels['flagread'] = 'Gelesen';
+$labels['flagdeleted'] = 'Gelöscht';
+$labels['flaganswered'] = 'Beantwortet';
+$labels['flagdraft'] = 'Entwurf';
+$labels['flagflagged'] = 'Markiert';
+$labels['addsieverule'] = 'Weitere Regel unterhalb dieser hinzufügen';
+$labels['addsieveact'] = 'Weitere Aktion unterhalb dieser hinzufügen';
+$labels['deletesieverule'] = 'Diese Regel löschen';
+$labels['deletesieveact'] = 'Diese Aktion löschen';
+$labels['envelopefrom'] = 'Envelope From';
+$labels['envelopeto'] = 'Envelope To';
+$labels['otherheader'] = 'Anderer Header';
+$labels['days'] = 'Zeitraum';
+$labels['message'] = 'Nachricht';
+$labels['sieveruleheaders'] = 'Zeige Beispiele für andere Header';
+$labels['examplefilters'] = 'Beispielfilter...';
+$labels['importfilters'] = 'Filter importieren';
+$labels['usedefaultfilter'] = 'Verwende Standardfilter';
+$labels['importfilter'] = 'Filter importieren';
+$labels['moreactions'] = 'Weitere Optionen...';
+$labels['adveditor'] = 'Erweiterter Editor';
+$labels['stdeditor'] = 'Standard-Editor';
+$labels['messageredirectcopy'] = 'Sende eine Kopie an';
+$labels['messagecopyto'] = 'Kopiere Nachricht nach';
+$labels['body'] = 'Body';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Raw';
+$labels['text'] = 'Text';
+$labels['other'] = 'Anderes';
+$labels['bodycontentpart'] = 'Content Part';
+$labels['notchecked'] = 'nicht geprüft';
+$labels['spamlevelisgreaterthanequal'] = 'ist mindestens';
+$labels['spamlevelislessthanequal'] = 'ist höchstens';
+$labels['spamlevelequals'] = 'ist gleich';
+$labels['i;ascii-casemap'] = 'schreibungsunabhängige Zeichenfolge';
+$labels['i;octet'] = 'exakte Zeichenfolge';
+$labels['i;ascii-numeric'] = 'zahlenmäßige Übereinstimmung';
+$labels['selectruleset'] = 'Wähle Regelsatz';
+$labels['activeruleset'] = '%s (aktiv)';
+$labels['activateruleset'] = 'Aktiviere Regelsatz';
+$labels['newruleset'] = 'Erstelle Regelsatz';
+$labels['delruleset'] = 'Lösche diesen Regelsatz';
+$labels['renameruleset'] = 'Regelsatz umbenennen';
+$labels['copy'] = 'Kopieren';
+$labels['copyexistingfilter'] = 'Kopiere bestehende Filter';
+$labels['copytoruleset'] = 'Kopiere Filter in anderen Regelsatz';
+$labels['copyfromruleset'] = 'Kopiere Filter aus anderem Regelsatz';
+$labels['time'] = 'Zeit';
+$labels['weekday'] = 'Wochentag';
+$labels['virustest'] = 'Viruswahrscheinlichkeit';
+$labels['novirus'] = 'keinen Virus gefunden';
+$labels['virusremoved'] = 'Virus gefunden und entfernt';
+$labels['viruscured'] = 'Virus gefunden und kuriert';
+$labels['possiblevirus'] = 'Nachricht enthält möglicherweise einen Virus';
+$labels['definitevirus'] = 'Nachricht enthält definitiv einen Virus';
+
+$messages = array();
+$messages['nosieverules'] = 'Keine Filter gefunden.';
+$messages['filterdeleteconfirm'] = 'Bist du sicher das du diesen Filter löschen möchtest?';
+$messages['ruledeleteconfirm'] = 'Bist du sicher das du diese Regel löschen möchtest?';
+$messages['actiondeleteconfirm'] = 'Bist du sicher das du diese Aktion löschen möchtest?';
+$messages['filterunknownerror'] = 'Unbekannter Serverfehler';
+$messages['filterconnerror'] = 'Konnte keine Verbindung zum Sieve-Server aufbauen';
+$messages['filterdeleteerror'] = 'Konnte Filter nicht löschen. Serverfehler';
+$messages['filterdeleted'] = 'Filter erfolgreich gelöscht';
+$messages['filtersaved'] = 'Filter erfolgreich gespeichert';
+$messages['filtersaveerror'] = 'Konnte Filter nicht speichern. Serverfehler';
+$messages['vacdaysexp'] = 'Zeitraum in Anzahl Tagen, in dem die Abwesenheitsnachricht nicht erneut an den selben Absender gesendet wird.<br /><br />Beispiel: Wenn Joe dir am Montag eine Mail schickt und der Zeitraum beträgt 7, bekommt Joe sofort eine Abwesenheitsnachricht gesendet, dann aber bis zum darauffolgenden Montag keine mehr, egal wie häufig er weitere Mails sendet.';
+$messages['vachandleexp'] = 'Ein Handle kann genutzt werden um verschiedene Abwesenheitsnachrichten zu koppeln, so dass im Zeitraum keine weiteren Abwesenheitsnachrichten gesendet werden die das selbe Handle besitzen.';
+$messages['vactoexp'] = 'Liste zusätzlicher Empfängeradressen, für die ebenfalls eine Abwesenheitsnachricht gesendet wird. Gehen Mails ein, deren Empfänger nicht die Hauptadresse ist und die nicht in dieser Liste stehen, wird keine Abwesenheitsnachricht gesendet.';
+$messages['vactoexp_adv'] = 'Trenne mehrere Adressen mit einem Komma (,). Zum Beispiel: test1@example.com,test2@example.com,test3@example.com';
+$messages['vactoexp_err'] = 'Fehler: Mehrere Adressen müssen durch ein Komma (,) getrennt werden';
+$messages['norulename'] = 'Bitte gib einen Namen für diesen Filter ein';
+$messages['ruleexists'] = 'Ein Filter mit diesem Namen existiert bereits. Wähle einen anderen';
+$messages['noheader'] = 'Bitte gib den Namen des zu testenden Headers ein';
+$messages['headerbadchars'] = 'Fehler: Header enthält unzulässige Zeichen';
+$messages['noheadervalue'] = 'Bitte gib den Wert ein, gegen den der Header getestet werden soll';
+$messages['sizewrongformat'] = 'Fehler: Nachrichtengröße muss numerisch sein';
+$messages['noredirect'] = 'Bitte gib eine E-Mail Adresse zur Weiterleitung ein';
+$messages['redirectaddresserror'] = 'Fehler: E-Mail Adresse ungültig';
+$messages['noreject'] = 'Bitte gib eine Nachricht als Begründung für die Abweisung der Mail ein';
+$messages['vacnodays'] = 'Bitte gib die Anzahl Tage ein, währendessen die Abwesenheitsnachricht nicht erneut an den selben Absender gesendet wird.';
+$messages['vacdayswrongformat'] = 'Fehler: Der Zeitraum muss numerisch größer gleich 1 sein';
+$messages['vacnomsg'] = 'Bitte gib einen Text für deine Nachricht ein';
+$messages['notifynomethod'] = 'Bitte gibt eine Methode an mit der Benachrichtigungen versendet werden sollen.';
+$messages['notifynomsg'] = 'Bitte gebe einen Text für die Nachricht ein';
+$messages['sieveruleexp'] = 'Bitte erstelle eine oder mehrere Regeln gegen die jede Nachricht getestet werden soll. Filter werden in der Reihenfolge durchlaufen, in der sie links gelistet sind. Wenn ein Filter zutrifft, werden keine weiteren Filter durchlaufen.';
+$messages['sieveruleexp_stop'] = 'Bitte wähle mindestens eine Regel, die auf die Nachrichten angewandt werden soll. Filter werden in der Reihenfolge abgearbeitet, wie sie auf der linken Seite dargestellt sind bis eine \'Stop\'-Regel zutrifft.';
+$messages['sieveactexp'] = 'Bitte wähle eine von den unten gelisteten Optionen. Diese Aktionen werden für jede Nachricht ausgeführt, die auf obige Filterregel(n) passt.';
+$messages['sieveheadershlp'] = 'Unten werden einige Header als Beispiel für mögliche Header angezeigt. Wähle einen oder füge oben einen eigenen Header hinzu.';
+$messages['movingfilter'] = 'Verschiebe Filter...';
+$messages['noexistingfilters'] = 'Keine vorhandenen Filter gefunden!';
+$messages['importdefault'] = '<b>Verwende Standardfilter:</b> Es sind eine Reihe von Standardfiltern verfügbar. Möchtest Du diese verwenden?';
+$messages['importother'] = '<b>Filter importieren:</b> EIne Reihe von Filtern von %s wurden gefunden. Möchtest Du diese Filter Deinen Filtern hinzufügen?';
+$messages['switchtoadveditor'] = 'Die verwendung des erweiterten Editors ermöglicht es, die Sieve-Filter direkt zu bearbeiten. Alle Änderungen sind für den normalen Editor unlesbar und werden verworfen wenn eine Regel mit dem normalen Editor gespeichert wird. Möchtest Du fortfahren?';
+$messages['filterimported'] = 'Filterimport erfolgreich';
+$messages['filterimporterror'] = 'Fehler beim Filterimport. Serverfehler.';
+$messages['notifyinvalidmethod'] = 'Die Methode scheint ein ungültiges Format zu haben. Es muss eine URI sein, z. B.: `mailto:alert@example.com`.';
+$messages['nobodycontentpart'] = 'Bitte gib den zu testenden Bereich des Inhalts an';
+$messages['badoperator'] = 'Der gewählte Operator kann in dieser Regel nicht verwendet werden';
+$messages['filteractionerror'] = 'Die gewünschte Aktion wird vom Server nicht unterstützt';
+$messages['filtermissingerror'] = 'Die angeforderte Regel konnte nicht gefunden werden';
+$messages['contentpartexp'] = 'Der MIME-Typ oder der Teil der Nachricht, der getestet werden soll. Zum Beispiel: `message/rfc822`, `text/html`, `audio/mp3` oder `image`.';
+$messages['delrulesetconf'] = 'Soll dieser Regelsatz wirklich gelöscht werden?';
+$messages['rulesetexists'] = 'Ein Regelsatz mit diesem Namen existiert bereits. Bitte wähle einen anderen Namen.';
+$messages['copyexisting'] = 'Kopiere bestehenden Regelsatz: Sollen die Filter von einem bestehenden Regelsatz in den akutellen Regelsatz kopiert werden?';
+$messages['filtercopied'] = 'Filter erfolgreich kopiert.';
+$messages['nosieverulesets'] = 'Keine Regelsätze gefunden.';
+$messages['baddateformat'] = 'Fehler: Bitte das Datum im Format JJJJ-MM-TT eingeben.';
+$messages['badtimeformat'] = 'Fehler: Bitte die Uhrzeit im Format HH:MM:SS eingeben.';
+$messages['missingfoldername'] = 'Fehler: Bitte ein Verzeichnisnamen eingeben.';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/en_GB.inc b/plugins/sieverules/localization/en_GB.inc
new file mode 100644
index 000000000..bdb0a15f4
--- /dev/null
+++ b/plugins/sieverules/localization/en_GB.inc
@@ -0,0 +1,205 @@
+<?php
+/* Author: Philip Weir */
+
+$labels = array();
+$labels['filters'] = 'Filters';
+$labels['filtersname'] = 'Filters ($name)';
+$labels['managefilters'] = 'Manage message filters';
+$labels['filtername'] = 'Filter name';
+$labels['disablerule'] = 'Disable rule';
+$labels['disabled'] = 'Disabled';
+$labels['newfilter'] = 'New filter';
+$labels['moveup'] = 'Move up';
+$labels['movedown'] = 'Move down';
+$labels['filterallof'] = 'matching all of the following rules';
+$labels['filteranyof'] = 'matching any of the following rules';
+$labels['filterany'] = 'all messages';
+$labels['filtercontains'] = 'contains';
+$labels['filternotcontains'] = 'does not contain';
+$labels['filteris'] = 'is equal to';
+$labels['filterisnot'] = 'is not equal to';
+$labels['filterexists'] = 'exists';
+$labels['filternotexists'] = 'does not exist';
+$labels['filterregex'] = 'matches regular expression';
+$labels['filternotregex'] = 'does not match regular expression';
+$labels['filterunder'] = 'is less than';
+$labels['filterover'] = 'is more than';
+$labels['filterbefore'] = 'is before';
+$labels['filterafter'] = 'is after';
+$labels['filteradvoptions'] = 'more options...';
+$labels['spamtest'] = 'Spam Probability';
+$labels['operator'] = 'Operator';
+$labels['comparator'] = 'Comparator';
+$labels['isgreaterthan'] = 'is greater than';
+$labels['isgreaterthanequal'] = 'is greater than or equal to';
+$labels['islessthan'] = 'is less than';
+$labels['islessthanequal'] = 'is less than or equal to';
+$labels['equals'] = 'is equal to';
+$labels['notequals'] = 'does not equal';
+$labels['countisgreaterthan'] = 'count is greater than';
+$labels['countisgreaterthanequal'] = 'count is greater than or equal to';
+$labels['countislessthan'] = 'count is less than';
+$labels['countislessthanequal'] = 'count is less than or equal to';
+$labels['countequals'] = 'count is equal to';
+$labels['countnotequals'] = 'count does not equal';
+$labels['valueisgreaterthan'] = 'value is greater than';
+$labels['valueisgreaterthanequal'] = 'value is greater than or equal to';
+$labels['valueislessthan'] = 'value is less than';
+$labels['valueislessthanequal'] = 'value is less than or equal to';
+$labels['valueequals'] = 'value is equal to';
+$labels['valuenotequals'] = 'value does not equal';
+$labels['userpart'] = 'user part equals';
+$labels['notuserpart'] = 'user part does not equal';
+$labels['detailpart'] = 'detail part equals';
+$labels['notdetailpart'] = 'detail part does not equal';
+$labels['domainpart'] = 'domain part equals';
+$labels['notdomainpart'] = 'domain part does not equal';
+$labels['teststring'] = 'Test string';
+$labels['messagemoveto'] = 'Move message to';
+$labels['messageredirect'] = 'Redirect message to';
+$labels['messageimapflags'] = 'Mark message as';
+$labels['messagereject'] = 'Reject with message';
+$labels['messagevacation'] = 'Out of Office Message';
+$labels['messagekeep'] = 'Keep message';
+$labels['messagediscard'] = 'Discard message';
+$labels['messagenotify'] = 'Send notification';
+$labels['messagestop'] = 'Stop processing filters';
+$labels['messagehelp'] = 'What is this?';
+$labels['sieveorigsubj'] = 'Append original subject to response';
+$labels['sievevachandle'] = 'Handle';
+$labels['method'] = 'Method';
+$labels['options'] = 'Options';
+$labels['messagesrules'] = 'Filter Rules';
+$labels['messagesactions'] = 'Filter Actions';
+$labels['sieveto'] = 'Aliases';
+$labels['sievefrom'] = 'From';
+$labels['flag'] = 'Importance';
+$labels['importancen'] = 'None';
+$labels['importance1'] = 'High';
+$labels['importance2'] = 'Normal';
+$labels['importance3'] = 'Low';
+$labels['flagread'] = 'Read';
+$labels['flagdeleted'] = 'Deleted';
+$labels['flaganswered'] = 'Answered';
+$labels['flagdraft'] = 'Draft';
+$labels['flagflagged'] = 'Flagged';
+$labels['addsieverule'] = 'Add another rule, below this one';
+$labels['addsieveact'] = 'Add another action, below this one';
+$labels['deletesieverule'] = 'Delete this rule';
+$labels['deletesieveact'] = 'Delete this action';
+$labels['envelopefrom'] = 'Envelope From';
+$labels['envelopeto'] = 'Envelope To';
+$labels['otherheader'] = 'Other header';
+$labels['days'] = 'Period';
+$labels['message'] = 'Message';
+$labels['sieveruleheaders'] = 'View examples of other headers';
+$labels['examplefilters'] = 'Example Filters';
+$labels['importfilters'] = 'Import Filters';
+$labels['usedefaultfilter'] = 'Use default filters';
+$labels['importfilter'] = 'Import filters';
+$labels['moreactions'] = 'More options...';
+$labels['adveditor'] = 'Advanced editor';
+$labels['stdeditor'] = 'Standard editor';
+$labels['messageredirectcopy'] = 'Send a copy to';
+$labels['messagecopyto'] = 'Copy message to';
+$labels['body'] = 'Body';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Raw';
+$labels['text'] = 'Text';
+$labels['other'] = 'Other';
+$labels['bodycontentpart'] = 'Content Part';
+$labels['notchecked'] = 'not checked';
+$labels['spamlevelisgreaterthanequal'] = 'is greater than or equal to';
+$labels['spamlevelislessthanequal'] = 'is less than or equal to';
+$labels['spamlevelequals'] = 'is equal to';
+$labels['i;ascii-casemap'] = 'case-insensitive string match';
+$labels['i;octet'] = 'exact string match';
+$labels['i;ascii-numeric'] = 'numeric match';
+$labels['selectruleset'] = 'Select ruleset';
+$labels['activeruleset'] = '%s (active)';
+$labels['activateruleset'] = 'Activate this ruleset';
+$labels['isactive'] = 'Active ruleset';
+$labels['isinactive'] = 'Inactive ruleset';
+$labels['newruleset'] = 'Create a new ruleset';
+$labels['delruleset'] = 'Delete this ruleset';
+$labels['renameruleset'] = 'Rename this ruleset';
+$labels['copy'] = 'Copy';
+$labels['copyexistingfilter'] = 'Copy existing filters';
+$labels['copytoruleset'] = 'Copy filter to another ruleset';
+$labels['copyfromruleset'] = 'Copy filters from existing ruleset';
+$labels['time'] = 'Time';
+$labels['weekday'] = 'Weekday';
+$labels['virustest'] = 'Virus Probability';
+$labels['novirus'] = 'no virus found';
+$labels['virusremoved'] = 'virus found and removed';
+$labels['viruscured'] = 'virus found and cured';
+$labels['possiblevirus'] = 'message possibly contains a virus';
+$labels['definitevirus'] = 'message defiantly contains a virus';
+$labels['addheader'] = 'Add header';
+$labels['removeheader'] = 'Remove header';
+$labels['headername'] = 'Header name';
+$labels['headervalue'] = 'Header value';
+$labels['headerappend'] = 'Append to existing message header.';
+$labels['headerindex'] = 'Header index';
+$labels['headerdelall'] = 'all occurrences';
+$labels['last'] = 'last';
+
+$messages = array();
+$messages['nosieverules'] = 'No filters found.';
+$messages['filterdeleteconfirm'] = 'Are you sure you want to delete this filter?';
+$messages['ruledeleteconfirm'] = 'Are you sure you want to delete this rule?';
+$messages['actiondeleteconfirm'] = 'Are you sure you want to delete this action?';
+$messages['filterunknownerror'] = 'Unknown server error';
+$messages['filterconnerror'] = 'Unable to connect to sieve server';
+$messages['filterdeleteerror'] = 'Unable to delete filter. Server error occurred';
+$messages['filterdeleted'] = 'Filter deleted successfully';
+$messages['filtersaved'] = 'Filter saved successfully';
+$messages['filtersaveerror'] = 'Unable to save filter. Server error occurred';
+$messages['vacdaysexp'] = 'The period is the number of days during which the message will not be resent to the same user, no matter how many times they contact you.<br /><br />For example: If Joe emails you on Monday and the period is set to 7 then Joe will receive an out of office message on Monday but will not get another one until the following Monday, no matter how many emails he sends an email during the week.';
+$messages['vachandleexp'] = 'A handle can be used to link different out of office messages together, once one message has been sent no other message with the same handle will be resent in that period.';
+$messages['vactoexp'] = 'List of additional recipient addresses which are included in the auto replying. If a mail\'s recipient is not your main address and it\'s not on this list, no message will be sent.';
+$messages['vactoexp_adv'] = 'Separate multiple aliases with a comma (,). For Example: test1@example.com,test2@example.com,test3@example.com';
+$messages['vactoexp_err'] = 'Error: Multiple aliases should be separated with a comma (,)';
+$messages['norulename'] = 'Please enter a name for this filter';
+$messages['ruleexists'] = 'A filter with this name already exists. Please enter another';
+$messages['noheader'] = 'Please enter the name of the header to test';
+$messages['headerbadchars'] = 'Error: Header contains forbidden characters';
+$messages['noheadervalue'] = 'Please enter a value to test the header against';
+$messages['sizewrongformat'] = 'Error: Message size must be numeric';
+$messages['noredirect'] = 'Please enter an email address to redirect messages to';
+$messages['redirectaddresserror'] = 'Error: Address appears invalid';
+$messages['noreject'] = 'Please enter a message to send with rejected email';
+$messages['vacnodays'] = 'Please enter a number of days for the period in which the message will not be resent to the same person';
+$messages['vacdayswrongformat'] = 'Error: The period must be a number greater than or equal to 1';
+$messages['vacnomsg'] = 'Please enter some text for your message';
+$messages['notifynomethod'] = 'Please enter a method by which the notification should be sent';
+$messages['notifynomsg'] = 'Please enter some text for your message';
+$messages['sieveruleexp'] = 'Please define one or more rules against which each message will be tested. Filters are run in the order in which they appear on the left of this screen, if a match is found no further filters will be tested.';
+$messages['sieveruleexp_stop'] = 'Please define one or more rules against which each message will be tested. Filters are run in the order in which they appear on the left of this screen until a \'Stop\' action is met.';
+$messages['sieveactexp'] = 'Please select from the options below. These actions will be performed for any message matching the above rule(s).';
+$messages['sieveheadershlp'] = 'Below are some examples of other headers that can be tested by the filters. Select a header to add it to the rule or enter a custom one in the box above.';
+$messages['movingfilter'] = 'Moving filter...';
+$messages['noexistingfilters'] = 'No existing filters detected!';
+$messages['importdefault'] = '<b>Use default filters:</b> There is a set of default filters available. Would you like to use these filters?';
+$messages['importother'] = '<b>Import filters:</b> Another set of filters from %s has been found. Would you like to import these filters into your current set?';
+$messages['switchtoadveditor'] = 'Switching to the advanced editor allows you to edit the sieve file directly. Any changes here may be unreadable in the normal editor and may be lost when filters are saved using the normal editor. Do you wish to continue?';
+$messages['filterimported'] = 'Filter imported successfully';
+$messages['filterimporterror'] = 'Unable to import filter. Server error occurred';
+$messages['notifyinvalidmethod'] = 'The method does not appear to be written in a valid format, it must be a URI. For example: `mailto:alert@example.com`.';
+$messages['nobodycontentpart'] = 'Please enter a content part to test';
+$messages['badoperator'] = 'Sorry the operator you selected cannot be used in this rule';
+$messages['filteractionerror'] = 'The action you requested is not supported by the server';
+$messages['filtermissingerror'] = 'Unable to find the rule requested';
+$messages['contentpartexp'] = 'The MIME-type or specific part of the message which should be tested. For example: `message/rfc822`, `text/html`, `audio/mp3` or `image`.';
+$messages['delrulesetconf'] = 'Are you sure you want to delete this ruleset?';
+$messages['rulesetexists'] = 'A ruleset with this name already exists. Please enter another';
+$messages['copyexisting'] = '<b>Copy exiting ruleset:</b> Would you like to copy filters from an existing ruleset into your current set?';
+$messages['filtercopied'] = 'Filter copied successfully';
+$messages['nosieverulesets'] = 'No rulesets found.';
+$messages['baddateformat'] = 'Error: Please enter the date in the format YYYY-MM-DD';
+$messages['badtimeformat'] = 'Error: Please enter the time in the format HH:MM:SS';
+$messages['missingfoldername'] = 'Error: Please enter a folder name';
+$messages['eheadernoname'] = 'Error: Please enter a header name';
+$messages['eheadernoval'] = 'Error: Please enter a header value';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/en_US.inc b/plugins/sieverules/localization/en_US.inc
new file mode 100644
index 000000000..6049eeb73
--- /dev/null
+++ b/plugins/sieverules/localization/en_US.inc
@@ -0,0 +1,205 @@
+<?php
+/* Author: Philip Weir */
+
+$labels = array();
+$labels['filters'] = 'Filters';
+$labels['filtersname'] = 'Filters ($name)';
+$labels['managefilters'] = 'Manage message filters';
+$labels['filtername'] = 'Filter name';
+$labels['disablerule'] = 'Disable rule';
+$labels['disabled'] = 'Disabled';
+$labels['newfilter'] = 'New filter';
+$labels['moveup'] = 'Move up';
+$labels['movedown'] = 'Move down';
+$labels['filterallof'] = 'matching all of the following rules';
+$labels['filteranyof'] = 'matching any of the following rules';
+$labels['filterany'] = 'all messages';
+$labels['filtercontains'] = 'contains';
+$labels['filternotcontains'] = 'does not contain';
+$labels['filteris'] = 'is equal to';
+$labels['filterisnot'] = 'is not equal to';
+$labels['filterexists'] = 'exists';
+$labels['filternotexists'] = 'does not exist';
+$labels['filterregex'] = 'matches regular expression';
+$labels['filternotregex'] = 'does not match regular expression';
+$labels['filterunder'] = 'is less than';
+$labels['filterover'] = 'is more than';
+$labels['filterbefore'] = 'is before';
+$labels['filterafter'] = 'is after';
+$labels['filteradvoptions'] = 'more options...';
+$labels['spamtest'] = 'Spam Probability';
+$labels['operator'] = 'Operator';
+$labels['comparator'] = 'Comparator';
+$labels['isgreaterthan'] = 'is greater than';
+$labels['isgreaterthanequal'] = 'is greater than or equal to';
+$labels['islessthan'] = 'is less than';
+$labels['islessthanequal'] = 'is less than or equal to';
+$labels['equals'] = 'is equal to';
+$labels['notequals'] = 'does not equal';
+$labels['countisgreaterthan'] = 'count is greater than';
+$labels['countisgreaterthanequal'] = 'count is greater than or equal to';
+$labels['countislessthan'] = 'count is less than';
+$labels['countislessthanequal'] = 'count is less than or equal to';
+$labels['countequals'] = 'count is equal to';
+$labels['countnotequals'] = 'count does not equal';
+$labels['valueisgreaterthan'] = 'value is greater than';
+$labels['valueisgreaterthanequal'] = 'value is greater than or equal to';
+$labels['valueislessthan'] = 'value is less than';
+$labels['valueislessthanequal'] = 'value is less than or equal to';
+$labels['valueequals'] = 'value is equal to';
+$labels['valuenotequals'] = 'value does not equal';
+$labels['userpart'] = 'user part equals';
+$labels['notuserpart'] = 'user part does not equal';
+$labels['detailpart'] = 'detail part equals';
+$labels['notdetailpart'] = 'detail part does not equal';
+$labels['domainpart'] = 'domain part equals';
+$labels['notdomainpart'] = 'domain part does not equal';
+$labels['teststring'] = 'Test string';
+$labels['messagemoveto'] = 'Move message to';
+$labels['messageredirect'] = 'Redirect message to';
+$labels['messageimapflags'] = 'Mark message as';
+$labels['messagereject'] = 'Reject with message';
+$labels['messagevacation'] = 'Out of Office Message';
+$labels['messagekeep'] = 'Keep message';
+$labels['messagediscard'] = 'Discard message';
+$labels['messagenotify'] = 'Send notification';
+$labels['messagestop'] = 'Stop processing filters';
+$labels['messagehelp'] = 'What is this?';
+$labels['sieveorigsubj'] = 'Append original subject to response';
+$labels['sievevachandle'] = 'Handle';
+$labels['method'] = 'Method';
+$labels['options'] = 'Options';
+$labels['messagesrules'] = 'Filter Rules';
+$labels['messagesactions'] = 'Filter Actions';
+$labels['sieveto'] = 'Aliases';
+$labels['sievefrom'] = 'From';
+$labels['flag'] = 'Importance';
+$labels['importancen'] = 'None';
+$labels['importance1'] = 'High';
+$labels['importance2'] = 'Normal';
+$labels['importance3'] = 'Low';
+$labels['flagread'] = 'Read';
+$labels['flagdeleted'] = 'Deleted';
+$labels['flaganswered'] = 'Answered';
+$labels['flagdraft'] = 'Draft';
+$labels['flagflagged'] = 'Flagged';
+$labels['addsieverule'] = 'Add another rule, below this one';
+$labels['addsieveact'] = 'Add another action, below this one';
+$labels['deletesieverule'] = 'Delete this rule';
+$labels['deletesieveact'] = 'Delete this action';
+$labels['envelopefrom'] = 'Envelope From';
+$labels['envelopeto'] = 'Envelope To';
+$labels['otherheader'] = 'Other header';
+$labels['days'] = 'Period';
+$labels['message'] = 'Message';
+$labels['sieveruleheaders'] = 'View examples of other headers';
+$labels['examplefilters'] = 'Example Filters';
+$labels['importfilters'] = 'Import Filters';
+$labels['usedefaultfilter'] = 'Use default filters';
+$labels['importfilter'] = 'Import filters';
+$labels['moreactions'] = 'More options...';
+$labels['adveditor'] = 'Advanced editor';
+$labels['stdeditor'] = 'Standard editor';
+$labels['messageredirectcopy'] = 'Send a copy to';
+$labels['messagecopyto'] = 'Copy message to';
+$labels['body'] = 'Body';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Raw';
+$labels['text'] = 'Text';
+$labels['other'] = 'Other';
+$labels['bodycontentpart'] = 'Content Part';
+$labels['notchecked'] = 'not checked';
+$labels['spamlevelisgreaterthanequal'] = 'is greater than or equal to';
+$labels['spamlevelislessthanequal'] = 'is less than or equal to';
+$labels['spamlevelequals'] = 'is equal to';
+$labels['i;ascii-casemap'] = 'case-insensitive string match';
+$labels['i;octet'] = 'exact string match';
+$labels['i;ascii-numeric'] = 'numeric match';
+$labels['selectruleset'] = 'Select ruleset';
+$labels['activeruleset'] = '%s (active)';
+$labels['activateruleset'] = 'Activate this ruleset';
+$labels['isactive'] = 'Active ruleset';
+$labels['isinactive'] = 'Inactive ruleset';
+$labels['newruleset'] = 'Create a new ruleset';
+$labels['delruleset'] = 'Delete this ruleset';
+$labels['renameruleset'] = 'Rename this ruleset';
+$labels['copy'] = 'Copy';
+$labels['copyexistingfilter'] = 'Copy existing filters';
+$labels['copytoruleset'] = 'Copy filter to another ruleset';
+$labels['copyfromruleset'] = 'Copy filters from existing ruleset';
+$labels['time'] = 'Time';
+$labels['weekday'] = 'Weekday';
+$labels['virustest'] = 'Virus Probability';
+$labels['novirus'] = 'no virus found';
+$labels['virusremoved'] = 'virus found and removed';
+$labels['viruscured'] = 'virus found and cured';
+$labels['possiblevirus'] = 'message possibly contains a virus';
+$labels['definitevirus'] = 'message possibly defiantly a virus';
+$labels['addheader'] = 'Add header';
+$labels['removeheader'] = 'Remove header';
+$labels['headername'] = 'Header name';
+$labels['headervalue'] = 'Header value';
+$labels['headerappend'] = 'Append to existing message header.';
+$labels['headerindex'] = 'Header index';
+$labels['headerdelall'] = 'all occurrences';
+$labels['last'] = 'last';
+
+$messages = array();
+$messages['nosieverules'] = 'No filters found.';
+$messages['filterdeleteconfirm'] = 'Are you sure you want to delete this filter?';
+$messages['ruledeleteconfirm'] = 'Are you sure you want to delete this rule?';
+$messages['actiondeleteconfirm'] = 'Are you sure you want to delete this action?';
+$messages['filterunknownerror'] = 'Unknown server error';
+$messages['filterconnerror'] = 'Unable to connect to sieve server';
+$messages['filterdeleteerror'] = 'Unable to delete filter. Server error occurred';
+$messages['filterdeleted'] = 'Filter deleted successfully';
+$messages['filtersaved'] = 'Filter saved successfully';
+$messages['filtersaveerror'] = 'Unable to save filter. Server error occurred';
+$messages['vacdaysexp'] = 'The period is the number of days during which the message will not be resent to the same user, no matter how many times they contact you.<br /><br />For example: If Joe emails you on Monday and the period is set to 7 then Joe will receive an out of office message on Monday but will not get another one until the following Monday, no matter how many emails he sends an email during the week.';
+$messages['vachandleexp'] = 'A handle can be used to link different out of office messages together, once one message has been sent no other message with the same handle will be resent in that period.';
+$messages['vactoexp'] = 'List of additional recipient addresses which are included in the auto replying. If a mail\'s recipient is not your main address and it\'s not on this list, no message will be sent.';
+$messages['vactoexp_adv'] = 'Separate multiple aliases with a comma (,). For Example: test1@example.com,test2@example.com,test3@example.com';
+$messages['vactoexp_err'] = 'Error: Multiple aliases should be separated with a comma (,)';
+$messages['norulename'] = 'Please enter a name for this filter';
+$messages['ruleexists'] = 'A filter with this name already exists. Please enter another';
+$messages['noheader'] = 'Please enter the name of the header to test';
+$messages['headerbadchars'] = 'Error: Header contains forbidden characters';
+$messages['noheadervalue'] = 'Please enter a value to test the header against';
+$messages['sizewrongformat'] = 'Error: Message size must be numeric';
+$messages['noredirect'] = 'Please enter an email address to redirect messages to';
+$messages['redirectaddresserror'] = 'Error: Address appears invalid';
+$messages['noreject'] = 'Please enter a message to send with rejected email';
+$messages['vacnodays'] = 'Please enter a number of days for the period in which the message will not be resent to the same person';
+$messages['vacdayswrongformat'] = 'Error: The period must be a number greater than or equal to 1';
+$messages['vacnomsg'] = 'Please enter some text for your message';
+$messages['notifynomethod'] = 'Please enter a method by which the notification should be sent';
+$messages['notifynomsg'] = 'Please enter some text for your message';
+$messages['sieveruleexp'] = 'Please define one or more rules against which each message will be tested. Filters are run in the order in which they appear on the left of this screen, if a match is found no further filters will be tested.';
+$messages['sieveruleexp_stop'] = 'Please define one or more rules against which each message will be tested. Filters are run in the order in which they appear on the left of this screen until a \'Stop\' action is met.';
+$messages['sieveactexp'] = 'Please select from the options below. These actions will be performed for any message matching the above rule(s).';
+$messages['sieveheadershlp'] = 'Below are some examples of other headers that can be tested by the filters. Select a header to add it to the rule or enter a custom one in the box above.';
+$messages['movingfilter'] = 'Moving filter...';
+$messages['noexistingfilters'] = 'No existing filters detected!';
+$messages['importdefault'] = '<b>Use default filters:</b> There is a set of default filters available. Would you like to use these filters?';
+$messages['importother'] = '<b>Import filters:</b> Another set of filters from %s has been found. Would you like to import these filters into your current set?';
+$messages['switchtoadveditor'] = 'Switching to the advanced editor allows you to edit the sieve file directly. Any changes here may be unreadable in the normal editor and may be lost when filters are saved using the normal editor. Do you wish to continue?';
+$messages['filterimported'] = 'Filter imported successfully';
+$messages['filterimporterror'] = 'Unable to import filter. Server error occurred';
+$messages['notifyinvalidmethod'] = 'The method does not appear to be written in a valid format, it must be a URI. For example: `mailto:alert@example.com`.';
+$messages['nobodycontentpart'] = 'Please enter a content part to test';
+$messages['badoperator'] = 'Sorry the operator you selected cannot be used in this rule';
+$messages['filteractionerror'] = 'The action you requested is not supported by the server';
+$messages['filtermissingerror'] = 'Unable to find the rule requested';
+$messages['contentpartexp'] = 'The MIME-type or specific part of the message which should be tested. For example: `message/rfc822`, `text/html`, `audio/mp3` or `image`.';
+$messages['delrulesetconf'] = 'Are you sure you want to delete this ruleset?';
+$messages['rulesetexists'] = 'A ruleset with this name already exists. Please enter another';
+$messages['copyexisting'] = '<b>Copy exiting ruleset:</b> Would you like to copy filters from an existing ruleset into your current set?';
+$messages['filtercopied'] = 'Filter copied successfully';
+$messages['nosieverulesets'] = 'No rulesets found.';
+$messages['baddateformat'] = 'Error: Please enter the date in the format YYYY-MM-DD';
+$messages['badtimeformat'] = 'Error: Please enter the time in the format HH:MM:SS';
+$messages['missingfoldername'] = 'Error: Please enter a folder name';
+$messages['eheadernoname'] = 'Error: Please enter a header name';
+$messages['eheadernoval'] = 'Error: Please enter a header value';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/es_AR.inc b/plugins/sieverules/localization/es_AR.inc
new file mode 100644
index 000000000..b57e223a4
--- /dev/null
+++ b/plugins/sieverules/localization/es_AR.inc
@@ -0,0 +1,140 @@
+<?php
+/* Author: Alejandro Vargas */
+
+$labels = array();
+$labels['filters'] = 'Filtros';
+$labels['managefilters'] = 'Manejo de filtros';
+$labels['filtername'] = 'Nombre del filtro';
+$labels['disablerule'] = 'Desactivar regla';
+$labels['disabled'] = 'Desactivada';
+$labels['newfilter'] = 'Nuevo filtro';
+$labels['moveup'] = 'Mover arriba';
+$labels['movedown'] = 'Mover abajo';
+$labels['filterallof'] = 'concuerda con TODAS las reglas siguientes';
+$labels['filteranyof'] = 'concuerda con ALGUNA de las reglas siguientes';
+$labels['filterany'] = 'todos los mensajes';
+$labels['filtercontains'] = 'contiene';
+$labels['filternotcontains'] = 'no contiene';
+$labels['filteris'] = 'es igual a';
+$labels['filterisnot'] = 'es distinto de';
+$labels['filterexists'] = 'existe';
+$labels['filternotexists'] = 'no existe';
+$labels['filterregex'] = 'concuerda con la expresion regular';
+$labels['filternotregex'] = 'no concuerda con la expresion regular';
+$labels['filterunder'] = 'es menos que';
+$labels['filterover'] = 'es mas que';
+$labels['filteradvoptions'] = 'mas opciones...';
+$labels['operator'] = 'Operador';
+$labels['comparator'] = 'Comparador';
+$labels['isgreaterthan'] = 'es mayor que';
+$labels['isgreaterthanequal'] = 'es mayor o igual que';
+$labels['islessthan'] = 'es menor que';
+$labels['islessthanequal'] = 'es menor o igual que';
+$labels['equals'] = 'es igual a';
+$labels['notequals'] = 'es distinto de';
+$labels['countisgreaterthan'] = 'cantidad es mayor que';
+$labels['countisgreaterthanequal'] = 'cantidad es mayor o igual que';
+$labels['countislessthan'] = 'cantidad es menor que';
+$labels['countislessthanequal'] = 'cantidad es menor o igual que';
+$labels['countequals'] = 'cantidad es igual a';
+$labels['countnotequals'] = 'cantidad es distinto de';
+$labels['valueisgreaterthan'] = 'valor es mayor que';
+$labels['valueisgreaterthanequal'] = 'valor es mayor o igual que';
+$labels['valueislessthan'] = 'valor es menor que';
+$labels['valueislessthanequal'] = 'valor es menor o igual que';
+$labels['valueequals'] = 'valor es igual a';
+$labels['valuenotequals'] = 'valor es distinto de';
+$labels['userpart'] = 'la parte del usuario es igual a';
+$labels['notuserpart'] = 'la parte del usuario es distinta de';
+$labels['detailpart'] = 'la parte del detalle es igual a';
+$labels['notdetailpart'] = 'la parte del detalle es distinta de';
+$labels['domainpart'] = 'la parte del dominio es igual a';
+$labels['notdomainpart'] = 'la parte del dominio es distinta de';
+$labels['teststring'] = 'Iniciando prueba';
+$labels['messagemoveto'] = 'Mover mensaje a';
+$labels['messageredirect'] = 'Redirigir mensaje a';
+$labels['messageimapflags'] = 'Marcar mensaje como';
+$labels['messagereject'] = 'Rechazar con aviso';
+$labels['messagevacation'] = 'Mensaje de vacaciones';
+$labels['messagekeep'] = 'Mantener mensaje';
+$labels['messagediscard'] = 'Descartar mensaje';
+$labels['messagenotify'] = 'Enviar notificacion';
+$labels['messagestop'] = 'Dejar de procesar filtros';
+$labels['messagehelp'] = 'Que es esto?';
+$labels['sieveorigsubj'] = 'Agregar asunto iriginal a la respuesta';
+$labels['sievevachandle'] = 'Manejador';
+$labels['method'] = 'Metodo';
+$labels['options'] = 'Opciones';
+$labels['messagesrules'] = 'Reglas de filtrado';
+$labels['messagesactions'] = 'Acciones del filtro';
+$labels['sieveto'] = 'Alias';
+$labels['sievefrom'] = 'De';
+$labels['flag'] = 'Marca';
+$labels['importancen'] = 'Ninguno';
+$labels['importance1'] = '1';
+$labels['importance2'] = '2';
+$labels['importance3'] = '3';
+$labels['flagread'] = 'Leido';
+$labels['flagdeleted'] = 'Borrado';
+$labels['flaganswered'] = 'Respondido';
+$labels['flagdraft'] = 'Borrador';
+$labels['flagflagged'] = 'Marcado';
+$labels['addsieverule'] = 'Agregar otra regla despues de esta';
+$labels['addsieveact'] = 'Agregar otra accion despues de esta';
+$labels['deletesieverule'] = 'Borrar esta regla';
+$labels['deletesieveact'] = 'Borrar esta accion';
+$labels['envelopefrom'] = 'Remitente en la cabecera';
+$labels['envelopeto'] = 'Destinatario en la cabecera';
+$labels['otherheader'] = 'Otra cabecera';
+$labels['days'] = 'Periodo';
+$labels['message'] = 'Mensaje';
+$labels['sieveruleheaders'] = 'Ver ejemplos de otras cabeceras';
+$labels['examplefilters'] = 'Filtros de ejemplo';
+$labels['importfilters'] = 'Importar filtros';
+$labels['usedefaultfilter'] = 'Usar filtros por defecto';
+$labels['importfilter'] = 'Importar filtro';
+$labels['adveditor'] = 'Editor avanzado';
+$labels['spamlevelisgreaterthanequal'] = 'es mayor o igual que';
+$labels['spamlevelislessthanequal'] = 'es menor o igual que';
+$labels['spamlevelequals'] = 'es igual a';
+
+$messages = array();
+$messages['nosieverules'] = 'No se han encontrado filtros.';
+$messages['filterdeleteconfirm'] = '¿Está seguro de que quiere borrar este filtro?';
+$messages['ruledeleteconfirm'] = '¿Está seguro de que quiere borrar esta regla?';
+$messages['actiondeleteconfirm'] = '¿Está seguro de que quiere borrar esta acción?';
+$messages['filterunknownerror'] = 'Error desconocido en el servidor';
+$messages['filterconnerror'] = 'Imposible conectar con el servidor sieve';
+$messages['filterdeleteerror'] = 'No se pudo borrar el filtro. Error del servidor';
+$messages['filterdeleted'] = 'Filtro borrado';
+$messages['filtersaved'] = 'Filtro grabado';
+$messages['filtersaveerror'] = 'Incapaz de grabar filtro. Error en el servidor';
+$messages['vacdaysexp'] = 'El periodo es el numero de dias que el mensaje no será reenviado al mismo usuario, sin importar cuantas veces intente contactar con usted<br /><br />Por ejemplo, si Juan le manda un mensaje, unlunes, y tiene el periodo fijado en 7, Juan recibirá un aviso de vacaciones el lunes pero no recibirá otro hasta el siguiente lunes, sin importar cuántos emails le envíe durente la semana.';
+$messages['vachandleexp'] = 'Se puede usar un manejador para vincular diferentes mensajes de vacaciones todos juntos, una vez se envio un mensaje, no se enviará otro que tenga el mismo manejador durante el periodo definido.';
+$messages['vactoexp'] = 'Lista de destinatarios adicionales que será incluida en la auto respuesta. Si un destinatario no es su dirección principal, y no está en esta lista, no se le enviarán mensajes.';
+$messages['norulename'] = 'Debe asignar un nombre al filtro';
+$messages['ruleexists'] = 'Ya hay un filtro con ese nombre. Elija otro';
+$messages['noheader'] = 'Debe ingresar el nombre de la cabecera a verificar';
+$messages['headerbadchars'] = 'Error: La cabecera contiene caracteres no permitidos';
+$messages['noheadervalue'] = 'Ingrese un valor contra el cual comparar la cabecera';
+$messages['sizewrongformat'] = 'Error: El tamaño del mensaje debe ser numérico';
+$messages['noredirect'] = 'Ingrese una dirección de email a la cual redirigir los mensajes';
+$messages['redirectaddresserror'] = 'Error: Dirección inválida';
+$messages['noreject'] = 'Ingrese el texto a enviar con los mensajes rechazados';
+$messages['vacnodays'] = 'Ingrese el numero de dias para el periodo que el mensaje no será reenviado a la misma persona';
+$messages['vacdayswrongformat'] = 'Error: El periodo debe ser 1 o más dias';
+$messages['vacnomsg'] = 'Ingrese un texto para el mensaje';
+$messages['notifynomethod'] = 'Ingrese el método por el cual se enviará la notificación';
+$messages['notifynomsg'] = 'Ingrese un texto para su mensaje';
+$messages['sieveruleexp'] = 'Debe definir una o más reglas contra las que se comprobarán los mensajes. Los filtros son ejecutados en el orden e nque aparecen a la izquierda de esta pantalla. Si se encuentra una coincidencia los demás filtros no se comprueban.';
+$messages['sieveactexp'] = 'Seleccione una de las opciones que figuran abajo. Esta acción será ejecutada por cada mensaje que concuerden con las reglas que figuran arriba.';
+$messages['sieveheadershlp'] = 'Debajo hay algunos ejemplos de cabeceras que pueden verificarse con filtros. Seleccione una cabecera para agregar a la regla o increse una propia en el cuadro de arriba.';
+$messages['movingfilter'] = 'Moviendo filtro...';
+$messages['noexistingfilters'] = '¡No se detectan filtros!';
+$messages['importdefault'] = '<b>Usar filtros por defecto:</b> Hay un juego de filtros por defecto disponibles. ¿Quiere instalar una copia de esos filtros?';
+$messages['importother'] = '<b>Importar filtros:</b> Se ha encontrado otro juego de filtros de %s. ¿Quiere importarlos a su lista de filtros?';
+$messages['switchtoadveditor'] = 'El editor avanzado le permite editar las reglas de sieve directamente. Cualquier cambio que haga será ilegible para el editor normal de reglas y se parderá si graba modificaciones con el editor normal. ¿Quiere continuar?';
+$messages['filterimported'] = 'Filtro importado correctamente';
+$messages['filterimporterror'] = 'No se pudo importar el filtro. Error en el servidor';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/es_ES.inc b/plugins/sieverules/localization/es_ES.inc
new file mode 100644
index 000000000..df9b0f24b
--- /dev/null
+++ b/plugins/sieverules/localization/es_ES.inc
@@ -0,0 +1,185 @@
+<?php
+/* Author: Alejandro Vargas */
+
+$labels = array();
+$labels['filters'] = 'Filtros';
+$labels['managefilters'] = 'Manejo de filtros';
+$labels['filtername'] = 'Nombre del filtro';
+$labels['disablerule'] = 'Desactivar regla';
+$labels['disabled'] = 'Desactivada';
+$labels['newfilter'] = 'Nuevo filtro';
+$labels['moveup'] = 'Mover arriba';
+$labels['movedown'] = 'Mover abajo';
+$labels['filterallof'] = 'concuerda con TODAS las reglas siguientes';
+$labels['filteranyof'] = 'concuerda con ALGUNA de las reglas siguientes';
+$labels['filterany'] = 'todos los mensajes';
+$labels['filtercontains'] = 'contiene';
+$labels['filternotcontains'] = 'no contiene';
+$labels['filteris'] = 'es igual a';
+$labels['filterisnot'] = 'es distinto de';
+$labels['filterexists'] = 'existe';
+$labels['filternotexists'] = 'no existe';
+$labels['filterregex'] = 'concuerda con la expresion regular';
+$labels['filternotregex'] = 'no concuerda con la expresion regular';
+$labels['filterunder'] = 'es menos que';
+$labels['filterover'] = 'es mas que';
+$labels['filterbefore'] = 'es antes que';
+$labels['filterafter'] = 'es después que';
+$labels['filteradvoptions'] = 'mas opciones...';
+$labels['spamtest'] = 'Probabilidad de Spam';
+$labels['operator'] = 'Operador';
+$labels['comparator'] = 'Comparador';
+$labels['isgreaterthan'] = 'es mayor que';
+$labels['isgreaterthanequal'] = 'es mayor o igual que';
+$labels['islessthan'] = 'es menor que';
+$labels['islessthanequal'] = 'es menor o igual que';
+$labels['equals'] = 'es igual a';
+$labels['notequals'] = 'es distinto de';
+$labels['countisgreaterthan'] = 'cantidad es mayor que';
+$labels['countisgreaterthanequal'] = 'cantidad es mayor o igual que';
+$labels['countislessthan'] = 'cantidad es menor que';
+$labels['countislessthanequal'] = 'cantidad es menor o igual que';
+$labels['countequals'] = 'cantidad es igual a';
+$labels['countnotequals'] = 'cantidad es distinto de';
+$labels['valueisgreaterthan'] = 'valor es mayor que';
+$labels['valueisgreaterthanequal'] = 'valor es mayor o igual que';
+$labels['valueislessthan'] = 'valor es menor que';
+$labels['valueislessthanequal'] = 'valor es menor o igual que';
+$labels['valueequals'] = 'valor es igual a';
+$labels['valuenotequals'] = 'valor es distinto de';
+$labels['userpart'] = 'la parte del usuario es igual a';
+$labels['notuserpart'] = 'la parte del usuario es distinta de';
+$labels['detailpart'] = 'la parte del detalle es igual a';
+$labels['notdetailpart'] = 'la parte del detalle es distinta de';
+$labels['domainpart'] = 'la parte del dominio es igual a';
+$labels['notdomainpart'] = 'la parte del dominio es distinta de';
+$labels['teststring'] = 'Iniciando prueba';
+$labels['messagemoveto'] = 'Mover mensaje a';
+$labels['messageredirect'] = 'Redirigir mensaje a';
+$labels['messageimapflags'] = 'Marcar mensaje como';
+$labels['messagereject'] = 'Rechazar con aviso';
+$labels['messagevacation'] = 'Mensaje de vacaciones';
+$labels['messagekeep'] = 'Mantener mensaje';
+$labels['messagediscard'] = 'Descartar mensaje';
+$labels['messagenotify'] = 'Enviar notificacion';
+$labels['messagestop'] = 'Dejar de procesar filtros';
+$labels['messagehelp'] = 'Que es esto?';
+$labels['sieveorigsubj'] = 'Agregar asunto iriginal a la respuesta';
+$labels['sievevachandle'] = 'Manejador';
+$labels['method'] = 'Metodo';
+$labels['options'] = 'Opciones';
+$labels['messagesrules'] = 'Reglas de filtrado';
+$labels['messagesactions'] = 'Acciones del filtro';
+$labels['sieveto'] = 'Alias';
+$labels['sievefrom'] = 'De';
+$labels['flag'] = 'Marca';
+$labels['importancen'] = 'Ninguno';
+$labels['importance1'] = '1';
+$labels['importance2'] = '2';
+$labels['importance3'] = '3';
+$labels['flagread'] = 'Leido';
+$labels['flagdeleted'] = 'Borrado';
+$labels['flaganswered'] = 'Respondido';
+$labels['flagdraft'] = 'Borrador';
+$labels['flagflagged'] = 'Marcado';
+$labels['addsieverule'] = 'Agregar otra regla despues de esta';
+$labels['addsieveact'] = 'Agregar otra accion despues de esta';
+$labels['deletesieverule'] = 'Borrar esta regla';
+$labels['deletesieveact'] = 'Borrar esta accion';
+$labels['envelopefrom'] = 'Remitente en la cabecera';
+$labels['envelopeto'] = 'Destinatario en la cabecera';
+$labels['otherheader'] = 'Otra cabecera';
+$labels['days'] = 'Periodo';
+$labels['message'] = 'Mensaje';
+$labels['sieveruleheaders'] = 'Ver ejemplos de otras cabeceras';
+$labels['examplefilters'] = 'Filtros de ejemplo';
+$labels['importfilters'] = 'Importar filtros';
+$labels['usedefaultfilter'] = 'Usar filtros por defecto';
+$labels['importfilter'] = 'Importar filtro';
+$labels['moreactions'] = 'Más opciones...';
+$labels['adveditor'] = 'Editor avanzado';
+$labels['stdeditor'] = 'Editor estándar';
+$labels['messageredirectcopy'] = 'Envia una copia a ';
+$labels['messagecopyto'] = 'Copiar mensaje a ';
+$labels['body'] = 'Cuerpo';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Raw';
+$labels['text'] = 'Texto';
+$labels['other'] = 'Otro';
+$labels['bodycontentpart'] = 'Contenido';
+$labels['notchecked'] = 'no seleccionado';
+$labels['spamlevelisgreaterthanequal'] = 'es mayor o igual que';
+$labels['spamlevelislessthanequal'] = 'es menor o igual que';
+$labels['spamlevelequals'] = 'es igual a';
+$labels['i;ascii-casemap'] = 'no distingue mayúsculas/minúsculas';
+$labels['i;octet'] = 'coincide exactamente';
+$labels['i;ascii-numeric'] = 'coincidencia numérica';
+$labels['selectruleset'] = 'Escojer conjunto de reglas';
+$labels['activeruleset'] = '%s (activo)';
+$labels['activateruleset'] = 'Activar este conjunto de reglas';
+$labels['newruleset'] = 'Crear un nuevo conjunto de reglas.';
+$labels['delruleset'] = 'Borrar este conjunto de reglas';
+$labels['renameruleset'] = 'Renombrar este conjunto de reglas';
+$labels['copy'] = 'Copiar';
+$labels['copyexistingfilter'] = 'Copiar los filtros existentes';
+$labels['copytoruleset'] = 'Copiar filtro a otro conjunto de reglas';
+$labels['copyfromruleset'] = 'Copiar filtros desde un conjunto de reglas existente';
+$labels['time'] = 'Tiempo';
+$labels['weekday'] = 'Día de la semana';
+
+$messages = array();
+$messages['nosieverules'] = 'No se han encontrado filtros.';
+$messages['filterdeleteconfirm'] = '¿Está seguro de que quiere borrar este filtro?';
+$messages['ruledeleteconfirm'] = '¿Está seguro de que quiere borrar esta regla?';
+$messages['actiondeleteconfirm'] = '¿Está seguro de que quiere borrar esta acción?';
+$messages['filterunknownerror'] = 'Error desconocido en el servidor';
+$messages['filterconnerror'] = 'Imposible conectar con el servidor sieve';
+$messages['filterdeleteerror'] = 'No se pudo borrar el filtro. Error del servidor';
+$messages['filterdeleted'] = 'Filtro borrado';
+$messages['filtersaved'] = 'Filtro grabado';
+$messages['filtersaveerror'] = 'Incapaz de grabar filtro. Error en el servidor';
+$messages['vacdaysexp'] = 'El periodo es el numero de dias que el mensaje no será reenviado al mismo usuario, sin importar cuantas veces intente contactar con usted<br /><br />Por ejemplo, si Juan le manda un mensaje, un lunes, y tiene el periodo fijado en 7, Juan recibirá un aviso de vacaciones el lunes pero no recibirá otro hasta el siguiente lunes, sin importar cuántos emails le envíe durente la semana.';
+$messages['vachandleexp'] = 'Se puede usar un manejador para vincular diferentes mensajes de vacaciones todos juntos, una vez se envio un mensaje, no se enviará otro que tenga el mismo manejador durante el periodo definido.';
+$messages['vactoexp'] = 'Lista de destinatarios adicionales que será incluida en la auto respuesta. Si un destinatario no es su dirección principal, y no está en esta lista, no se le enviarán mensajes.';
+$messages['vactoexp_adv'] = 'Separe multiples alias con coma (,). Por ejemplo test1@ejemplo.com,test2@ejemplo.com,test3@ejemplo.com';
+$messages['vactoexp_err'] = 'Error: Los distintos alias deben separarse con coma (,)';
+$messages['norulename'] = 'Debe asignar un nombre al filtro';
+$messages['ruleexists'] = 'Ya hay un filtro con ese nombre. Elija otro';
+$messages['noheader'] = 'Debe ingresar el nombre de la cabecera a verificar';
+$messages['headerbadchars'] = 'Error: La cabecera contiene caracteres no permitidos';
+$messages['noheadervalue'] = 'Ingrese un valor contra el cual comparar la cabecera';
+$messages['sizewrongformat'] = 'Error: El tamaño del mensaje debe ser numérico';
+$messages['noredirect'] = 'Ingrese una dirección de email a la cual redirigir los mensajes';
+$messages['redirectaddresserror'] = 'Error: Dirección inválida';
+$messages['noreject'] = 'Ingrese el texto a enviar con los mensajes rechazados';
+$messages['vacnodays'] = 'Ingrese el numero de dias para el periodo que el mensaje no será reenviado a la misma persona';
+$messages['vacdayswrongformat'] = 'Error: El periodo debe ser 1 o más dias';
+$messages['vacnomsg'] = 'Ingrese un texto para el mensaje';
+$messages['notifynomethod'] = 'Ingrese el método por el cual se enviará la notificación';
+$messages['notifynomsg'] = 'Ingrese un texto para su mensaje';
+$messages['sieveruleexp'] = 'Debe definir una o más reglas contra las que se comprobarán los mensajes. Los filtros son ejecutados en el orden en que aparecen a la izquierda de esta pantalla. Si se encuentra una coincidencia los demás filtros no se comprueban.';
+$messages['sieveruleexp_stop'] = 'Debe definir una o más reglas contra las que se comprobarán los mensajes. Los filtros son ejecutados en el orden en que aparecen a la izquierda de esta pantalla, hasta que una acción \'Stop\' se cumpla.';
+$messages['sieveactexp'] = 'Seleccione una de las opciones que figuran abajo. Esta acción será ejecutada por cada mensaje que concuerden con las reglas que figuran arriba.';
+$messages['sieveheadershlp'] = 'Debajo hay algunos ejemplos de cabeceras que pueden verificarse con filtros. Seleccione una cabecera para agregar a la regla o increse una propia en el cuadro de arriba.';
+$messages['movingfilter'] = 'Moviendo filtro...';
+$messages['noexistingfilters'] = '¡No se detectan filtros!';
+$messages['importdefault'] = '<b>Usar filtros por defecto:</b> Hay un juego de filtros por defecto disponibles. ¿Quiere instalar una copia de esos filtros?';
+$messages['importother'] = '<b>Importar filtros:</b> Se ha encontrado otro juego de filtros de %s. ¿Quiere importarlos a su lista de filtros?';
+$messages['switchtoadveditor'] = 'El editor avanzado le permite editar las reglas de sieve directamente. Cualquier cambio que haga será ilegible para el editor normal de reglas y se parderá si graba modificaciones con el editor normal. ¿Quiere continuar?';
+$messages['filterimported'] = 'Filtro importado correctamente';
+$messages['filterimporterror'] = 'No se pudo importar el filtro. Error en el servidor';
+$messages['notifyinvalidmethod'] = 'El método no parece estar escrito en un formato válido, debe ser una URI. Por ejemplo: "mailto: alert@example.com".';
+$messages['nobodycontentpart'] = 'Por favor, introduzca una parte de contenido para prueba';
+$messages['badoperator'] = 'Lo sentimos, el operador que ha seleccionado no se puede usar en esta regla.';
+$messages['filteractionerror'] = 'La acción requerida no está soportada por el servidor.';
+$messages['filtermissingerror'] = 'No ha sido posible encontrar la regla solicitada.';
+$messages['contentpartexp'] = 'El tipo MIME o una parte específica del mensaje debe ser probado. Por ejemplo: `message/rfc822`, `text/html`, `audio/mp3` or `image`.';
+$messages['delrulesetconf'] = 'Está seguro de querer borrar este conjunto de reglas?';
+$messages['rulesetexists'] = 'Ya existe un conjunto de reglas con ese nombre. Por favor, escoja otro.';
+$messages['copyexisting'] = '<b> Copia el siguiente conjunto de reglas:</b> ¿Quiere importar los filtros de un conjunto de reglas existente al conjunto actual?';
+$messages['filtercopied'] = 'Filtro copiado correctamente';
+$messages['nosieverulesets'] = 'No se han encontrado reglas.';
+$messages['baddateformat'] = 'Error: Por favor, introduzca la fecha en el formato AAAA-MM-DD';
+$messages['badtimeformat'] = 'Error: Por favor, introduzca la hora en el formato HH:MM:SS';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/et_EE.inc b/plugins/sieverules/localization/et_EE.inc
new file mode 100644
index 000000000..980097d14
--- /dev/null
+++ b/plugins/sieverules/localization/et_EE.inc
@@ -0,0 +1,79 @@
+<?php
+/* Author: Andi Lõhmus */
+
+$labels = array();
+$labels['filters'] = 'Filtrid';
+$labels['managefilters'] = 'Halda sisenevate kirjade filtreid';
+$labels['filtername'] = 'Filtri nimi';
+$labels['disablerule'] = 'Keela filter';
+$labels['disabled'] = 'Keelatud';
+$labels['newfilter'] = 'Uus filter';
+$labels['moveup'] = 'Liiguta ülesse';
+$labels['movedown'] = 'Liiguta alla';
+$labels['filterallof'] = 'vastab kõikidele järgnevatele reeglitele';
+$labels['filteranyof'] = 'vastab mõnele järgnevatest reeglitest';
+$labels['filterany'] = 'kõik kirjad';
+$labels['filtercontains'] = 'sisaldab';
+$labels['filternotcontains'] = 'ei sisalda';
+$labels['filteris'] = 'on võrdne kui';
+$labels['filterisnot'] = 'ei ole võrdne kui';
+$labels['filterexists'] = 'on olemas';
+$labels['filternotexists'] = 'pole olemas';
+$labels['filterregex'] = 'vastab regulaaravaldisele';
+$labels['filternotregex'] = 'ei vasta regulaaravaldisele';
+$labels['filterunder'] = 'on vähem kui';
+$labels['filterover'] = 'on rohkem kui';
+$labels['filteradvoptions'] = 'rohkem valikuid';
+$labels['spamtest'] = 'Spammi tõenäosus';
+$labels['operator'] = 'Operaator';
+$labels['comparator'] = 'Komparaator';
+$labels['isgreaterthan'] = 'on suurem kui';
+$labels['isgreaterthanequal'] = 'on suurem või samaväärne ';
+$labels['islessthan'] = 'on vähem kui';
+$labels['islessthanequal'] = 'on vähem või võrdne kui';
+$labels['equals'] = 'on võrdne';
+$labels['notequals'] = 'ei ole võrdne';
+$labels['countisgreaterthan'] = 'arv on suurem kui';
+$labels['countisgreaterthanequal'] = 'arv on suurem või võrdne kui';
+$labels['countislessthan'] = 'arv on väiksem kui';
+$labels['countislessthanequal'] = 'arv on väiksem või võrdne kui';
+$labels['countequals'] = 'arv on võrdne';
+$labels['countnotequals'] = 'arv ei ole võrdne';
+$labels['valueisgreaterthan'] = 'väärtus on suurem kui';
+$labels['valueisgreaterthanequal'] = 'väärtus on suurem või võrdne kui';
+$labels['valueislessthan'] = 'väärtus on võiksem kui';
+$labels['valueislessthanequal'] = 'väärtus on väiksem või võrdne kui';
+$labels['valueequals'] = 'väärtus on võrdne';
+$labels['valuenotequals'] = 'väärtus ei ole võrdne';
+$labels['userpart'] = 'kasutajanimi (enne "@" või "+" märki) on võrdne';
+$labels['notuserpart'] = 'kasutajanimi (enne "@" või "+" märki) ei ole võrdne';
+$labels['detailpart'] = 'nime osa peale "+" märki on võrdne';
+$labels['notdetailpart'] = 'nime osa peale "+" märki ei ole võrdne';
+$labels['domainpart'] = 'domeeninimi (peale "@") on võrdne';
+$labels['notdomainpart'] = 'domeeninimi (peale "@") ei ole võrdne';
+$labels['teststring'] = 'Võrdle reaga';
+$labels['messagemoveto'] = 'Liiguta kiri';
+$labels['messageredirect'] = 'Suuna teisele aadressile';
+$labels['messageimapflags'] = 'Märgi kiri';
+$labels['messagereject'] = 'Keeldu';
+$labels['messagevacation'] = 'Saada kontorist väljas teade';
+$labels['messagekeep'] = 'Säilita kiri';
+$labels['messagediscard'] = 'Kustuta kiri ära';
+$labels['messagenotify'] = 'Saada teadaanne';
+$labels['messagestop'] = 'Lõpeta filtrite töö';
+$labels['messagehelp'] = 'Mis see on?';
+$labels['sieveorigsubj'] = 'Lisa originaal vastusele';
+$labels['sievevachandle'] = 'Käsitle';
+$labels['method'] = 'Meetod';
+$labels['options'] = 'Valikud';
+$labels['messagesrules'] = 'Filtri reeglid';
+$labels['messagesactions'] = 'Filtri toimingud';
+$labels['sievefrom'] = 'Saatja';
+$labels['flag'] = 'Tähtsus';
+$labels['importancen'] = 'Mitte ükski';
+$labels['importance1'] = 'Kõrge';
+$labels['importance2'] = 'Normaalne';
+
+$messages = array();
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/fi_FI.inc b/plugins/sieverules/localization/fi_FI.inc
new file mode 100644
index 000000000..9114f4adc
--- /dev/null
+++ b/plugins/sieverules/localization/fi_FI.inc
@@ -0,0 +1,186 @@
+<?php
+/* Author: Samu Juvonen */
+
+$labels = array();
+$labels['filters'] = 'Suotimet';
+$labels['managefilters'] = 'Hallitse viestisuotimia';
+$labels['filtername'] = 'Suotimen nimi';
+$labels['disablerule'] = 'Poista käytöstä';
+$labels['disabled'] = 'Ei käytössä';
+$labels['newfilter'] = 'Uusi suodin';
+$labels['moveup'] = 'Siirrä ylös';
+$labels['movedown'] = 'Siirrä alas';
+$labels['filterallof'] = 'täsmää kaikkiin sääntöihin';
+$labels['filteranyof'] = 'täsmää johonkin säännöistä';
+$labels['filterany'] = 'kaikki viestit';
+$labels['filtercontains'] = 'Sisältää';
+$labels['filternotcontains'] = 'Ei sisällä';
+$labels['filteris'] = 'Sama kuin';
+$labels['filterisnot'] = 'Ei ole sama kuin';
+$labels['filterexists'] = 'On olemassa';
+$labels['filternotexists'] = 'Ei ole olemassa';
+$labels['filterregex'] = 'Täsmää säännölliseen lausekkeeseen';
+$labels['filternotregex'] = 'Ei täsmää säännölliseen lausekkeeseen';
+$labels['filterunder'] = 'Vähemmän kuin';
+$labels['filterover'] = 'Enemmän kuin';
+$labels['filterbefore'] = 'Ennen';
+$labels['filterafter'] = 'Jälkeen';
+$labels['filteradvoptions'] = 'Lisää vaihtoehtoja...';
+$labels['spamtest'] = 'Spammin todennäköisyys';
+$labels['operator'] = 'Operaattori';
+$labels['comparator'] = 'Vertailu';
+$labels['isgreaterthan'] = 'Suurempi kuin';
+$labels['isgreaterthanequal'] = 'Suurempi tai yhtä suuri kuin';
+$labels['islessthan'] = 'Vähemmän kuin';
+$labels['islessthanequal'] = 'Vähemmän tai yhtä suuri kuin';
+$labels['equals'] = 'Yhtä suuri kuin';
+$labels['notequals'] = 'Ei ole yhtä suuri';
+$labels['countisgreaterthan'] = 'Lukumäärä suurempi';
+$labels['countisgreaterthanequal'] = 'Lukumäärä suurempi tai yhtä suuri';
+$labels['countislessthan'] = 'Lukumäärä pienempi';
+$labels['countislessthanequal'] = 'Lukumäärä pienempi tai yhtä suuri';
+$labels['countequals'] = 'Lukumäärä yhtä suuri';
+$labels['countnotequals'] = 'Lukumäärä erisuuri';
+$labels['valueisgreaterthan'] = 'Arvo suurempi';
+$labels['valueisgreaterthanequal'] = 'Arvo suurempi tai yhtä suuri';
+$labels['valueislessthan'] = 'Arvo pienempi';
+$labels['valueislessthanequal'] = 'Arvo pienempi tai yhtä suuri';
+$labels['valueequals'] = 'Arvo on yhtä suuri';
+$labels['valuenotequals'] = 'Arvo on eri suuri';
+$labels['userpart'] = 'Käyttäjäosa täsmää';
+$labels['notuserpart'] = 'Käyttäjäosa ei täsmää';
+$labels['detailpart'] = 'Lisätiedot täsmäävät';
+$labels['notdetailpart'] = 'Lisätiedot eivät täsmää';
+$labels['domainpart'] = 'Domain täsmää';
+$labels['notdomainpart'] = 'Domain ei täsmää';
+$labels['teststring'] = 'Verrattava arvo';
+$labels['messagemoveto'] = 'Siirrä viesti kansioon';
+$labels['messageredirect'] = 'Uudelleenohjaa osoitteeseen';
+$labels['messageimapflags'] = 'Vaihda viestin tila';
+$labels['messagereject'] = 'Hylkää viestillä';
+$labels['messagevacation'] = 'Poissaoloviesti';
+$labels['messagekeep'] = 'Säilytä viesti';
+$labels['messagediscard'] = 'Hylkää viesti';
+$labels['messagenotify'] = 'Lähetä ilmoitus';
+$labels['messagestop'] = 'Keskeytä suotimien suoritus';
+$labels['messagehelp'] = 'Mikä tämä on?';
+$labels['sieveorigsubj'] = 'Lisää alkuperäinen otsikko vastauksen loppuun';
+$labels['sievevachandle'] = 'Handle';
+$labels['method'] = 'Method';
+$labels['options'] = 'Asetukset';
+$labels['messagesrules'] = 'Suotimen säännöt';
+$labels['messagesactions'] = 'Suotimen toiminnot';
+$labels['sieveto'] = 'Aliakset';
+$labels['sievefrom'] = 'Lähettäjä';
+$labels['flag'] = 'Tärkeys';
+$labels['importancen'] = 'Ei mitään';
+$labels['importance1'] = 'Korkea';
+$labels['importance2'] = 'Tavallinen';
+$labels['importance3'] = 'Alhainen';
+$labels['flagread'] = 'Luettu';
+$labels['flagdeleted'] = 'Poistettu';
+$labels['flaganswered'] = 'Vastattu';
+$labels['flagdraft'] = 'Luonnos';
+$labels['flagflagged'] = 'Merkitty';
+$labels['addsieverule'] = 'Lisää uusi sääntö alle';
+$labels['addsieveact'] = 'Lisää uusi toiminto alle';
+$labels['deletesieverule'] = 'Poista sääntö';
+$labels['deletesieveact'] = 'Poista toiminto';
+$labels['envelopefrom'] = 'Lähettäjä (envelope)';
+$labels['envelopeto'] = 'Vastaanottaja (envelope)';
+$labels['otherheader'] = 'Muu otsikkotieto';
+$labels['days'] = 'Aikaväli';
+$labels['message'] = 'Viesti';
+$labels['sieveruleheaders'] = 'Katso esimerkkejä muista otsikkotiedoista';
+$labels['examplefilters'] = 'Esimerkkejä';
+$labels['importfilters'] = 'Tuo suotimet';
+$labels['usedefaultfilter'] = 'Käytä oletussuotimia';
+$labels['importfilter'] = 'Tuo suotimet';
+$labels['moreactions'] = 'Lisää asetuksia...';
+$labels['adveditor'] = 'Laajennettu editori';
+$labels['stdeditor'] = 'Tavallinen editori';
+$labels['messageredirectcopy'] = 'Lähetä kopio osoitteeseen';
+$labels['messagecopyto'] = 'Kopioi viesti kansioon';
+$labels['body'] = 'Viesti';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Raaka';
+$labels['text'] = 'Teksti';
+$labels['other'] = 'Muu';
+$labels['bodycontentpart'] = 'Sisältöosa';
+$labels['spamnotchecked'] = 'Ei tarkistettu';
+$labels['spamlevelisgreaterthanequal'] = 'Korkeampi tai yhtä korkea kuin';
+$labels['spamlevelislessthanequal'] = 'Matalampi tai yhtä korkea kuin';
+$labels['spamlevelequals'] = 'Yhtä korkea';
+$labels['i;ascii-casemap'] = 'Kirjainkoosta riippumaton merkkijonovertailu';
+$labels['i;octet'] = 'Täydellinen merkkijonon vastaavuus';
+$labels['i;ascii-numeric'] = 'Numeerinen vastaavuus';
+$labels['selectruleset'] = 'Valitse säännöstö';
+$labels['activeruleset'] = '%s (aktiivinen)';
+$labels['activateruleset'] = 'Ota säännöstö käyttöön';
+$labels['newruleset'] = 'Luo uusi säännöstö';
+$labels['delruleset'] = 'Poista säännöstö';
+$labels['renameruleset'] = 'Nimeä säännöstö uudelleen';
+$labels['copy'] = 'Kopioi';
+$labels['copyexistingfilter'] = 'Kopioi nykyiset suotimet';
+$labels['copytoruleset'] = 'Kopioi suodin uuteen säännöstöön';
+$labels['copyfromruleset'] = 'Kopioi suotimia vanhasta säännöstöstä';
+$labels['time'] = 'Aika';
+$labels['weekday'] = 'Viikonpäivä';
+
+$messages = array();
+$messages['nosieverules'] = 'Suotimia ei löytynyt.';
+$messages['filterdeleteconfirm'] = 'Haluatko varmasti poistaa tämän suotimen?';
+$messages['ruledeleteconfirm'] = 'Haluatko varmasti poistaa tämän säännön?';
+$messages['actiondeleteconfirm'] = 'Haluatko varmasti poistaa tämän toiminnon?';
+$messages['filterunknownerror'] = 'Tuntematon palvelinvirhe';
+$messages['filterconnerror'] = 'Unable to connect to sieve server';
+$messages['filterdeleteerror'] = 'Palvelinvirhe. Suodinta ei poistettu.';
+$messages['filterdeleted'] = 'Suodin poistettu onnistuneesti';
+$messages['filtersaved'] = 'Suodin tallennettu onnistuneesti';
+$messages['filtersaveerror'] = 'Palvelinvirhe. Suodinta ei tallennettu.';
+$messages['vacdaysexp'] = 'Aikaväli on päivien määrä, jona aikana viestiä ei lähetetä samalle käyttäjälle välittämättä siitä, kuinka usein he ottavat sinuun yhteyttä.<br/><br/>Esimerkki: Jaakko lähettää sinulle sähköpostia maanantaina ja aikaväliksi on valittu 7 päivää. Jaakko saa poissaoloviestisi maanantaina, mutta jos hän lähettää sinulle samalla viikolla lisää viestejä, uutta ilmoitusta ei lähetetä ennen seuraavaa maanantaita.';
+$messages['vachandleexp'] = 'Ryhmittelyä voidaan käyttää yhdistämään eri poissaoloviestit toisiinsa. Kun yksi viesti on lähetetty, muita saman ryhmittelyn viestejä ei lähetetä kyseisen aikavälin aikana.';
+$messages['vactoexp'] = 'Lista muista vastaanottajien sähköpostiosoitteista, jotka liitetään automaattivastaukseen. Mikäli viestin vastaanottaja ei ole pääosoitteesi eikä löydy tältä listalta, mitään viestiä ei lähetetä.';
+$messages['vactoexp_adv'] = 'Erottele aliakset pilkulla (,). Esimerkki: testi1@esimerkki.fi,testi2@esimerkki.fi,testi3@esimerkki.fi';
+$messages['vactoexp_err'] = 'Virhe: aliakset tulee erotella pilkulla (,)';
+$messages['norulename'] = 'Anna suotimelle nimi';
+$messages['ruleexists'] = 'Tällä nimellä on jo suodin. Anna uusi nimi';
+$messages['noheader'] = 'Anna testattavan otsikkotiedon nimi';
+$messages['headerbadchars'] = 'Virhe: otsikkotiedossa on kiellettyjä merkkejä';
+$messages['noheadervalue'] = 'Anna arvo, jolla otsikkotietoa testataan';
+$messages['sizewrongformat'] = 'Virhe: viestin koon täytyy olla numeerinen';
+$messages['noredirect'] = 'Anna osoite, johon viestit ohjataan';
+$messages['redirectaddresserror'] = 'Virhe: osoite ei ole kelvollinen';
+$messages['noreject'] = 'Anna viesti, joka liitetään hylättyyn sähköpostiin';
+$messages['vacnodays'] = 'Ilmoita aikaväli (päivien määrä), jona samalle henkilölle ei lähetetä uutta viestiä.';
+$messages['vacdayswrongformat'] = 'Virhe: aikavälin täytyy olla suurempi tai yhtä suuri luku kuin 1';
+$messages['vacnomsg'] = 'Kirjoita viestiisi jotain sisältöä';
+$messages['notifynomethod'] = 'Määrittele metodi, jota käyttäen ilmoitus lähetetään.';
+$messages['notifynomsg'] = 'Kirjoita viestiisi jotain sisältöä';
+$messages['sieveruleexp'] = 'Määrittele yksi tai useampia sääntöjä, joihin jokaista viestiä testataan. Suotimet suoritetaan siinä järjestyksessä, jossa ne esiintyvät vasemmalla olevalla listalla. Kun jokin suotimista täsmää, loppuja suotimia ei suoriteta.';
+$messages['sieveruleexp_stop'] = 'Määrittele yksi tai useampia sääntöjä, joihin jokaista viestiä testataan. Suotimet suoritetaan siinä järjestyksessä, jossa ne esiintyvät vasemmalla olevalla listalla, kunnes keskeytyssääntö tavataan.';
+$messages['sieveactexp'] = 'Valitse jokin alla olevista vaihtoehdoista. Toiminnot suoritetaan kaikille viesteille, jotka täsmäävät yllä oleviin sääntöihin.';
+$messages['sieveheadershlp'] = 'Alla on esimerkkejä otsikkotiedoista, joita voidaan testata suotimilla. Valitse jokin otsikkotieto listasta tai määrittele muu otsikkotieto yllä olevaan kenttään.';
+$messages['movingfilter'] = 'Siirretään suodinta...';
+$messages['noexistingfilters'] = 'Suotimia ei löytynyt!';
+$messages['importdefault'] = '<b>Käytä oletussuotimia:</b> Suotimia on saatavilla. Haluatko käyttää näitä suotimia?';
+$messages['importother'] = '<b>Tuo suotimia:</b> Suotimia löydettiin palvelusta %s. Haluatko lisätä nämä suotimet nykyisiin suotimiin?';
+$messages['switchtoadveditor'] = 'Laajennetulla editorilla voit muokata seulatiedostoa suoraan. Tehdyt muutokset eivät välttämättä ole luettavissa tavallisessa editorissa ja saattavat hävitä, jos suotimia muokataan tavallisella editorilla. Haluatko jatkaa?';
+$messages['filterimported'] = 'Suodin lisätty onnistuneesti';
+$messages['filterimporterror'] = 'Palvelinvirhe. Suotimia ei lisätty';
+$messages['notifyinvalidmethod'] = 'Metodi ei ole kelvollisessa muodossa. Sen täytyy olla osoite. Esimerkki: mailto:virhe@esimerkki.fi';
+$messages['nobodycontentpart'] = 'Anna testattava sisältöosa';
+$messages['badoperator'] = 'Valitsemaasi operaattoria ei voida käyttää tässä säännössä';
+$messages['filteractionerror'] = 'Palvelin ei tue valitsemaasi toimintoa';
+$messages['filtermissingerror'] = 'Valittua sääntöä ei löytynyt';
+$messages['contentpartexp'] = 'MIME-tyyppi tai tietty viestin osa, jota testataan. Esimerkki: "message/rfc822", "text/html", "audio/mp3" tai "image"';
+$messages['delrulesetconf'] = 'Haluatko varmasti poistaa tämän säännöstön?';
+$messages['rulesetexists'] = 'Tällä nimellä on jo säännöstö. Anna uusi nimi';
+$messages['copyexisting'] = '<b>Kopioi säännöstö:</b> Haluatko kopioida toisen säännöstön nykyisiin sääntöihisi?';
+$messages['filtercopied'] = 'Suodin kopioitu onnistuneesti';
+$messages['nosieverulesets'] = 'Säännöstöä ei löytynyt.';
+$messages['baddateformat'] = 'Virhe: anna päivämäärä muodossa VVVV-KK-PP';
+$messages['badtimeformat'] = 'Virhe: anna aika muodossa TT:MM:SS';
+$messages['missingfoldername'] = 'Virhe: anna kansiolle nimi';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/fr_FR.inc b/plugins/sieverules/localization/fr_FR.inc
new file mode 100644
index 000000000..fb9f6d430
--- /dev/null
+++ b/plugins/sieverules/localization/fr_FR.inc
@@ -0,0 +1,185 @@
+<?php
+/* Author: Aymeric Peuch */
+
+$labels = array();
+$labels['filters'] = 'Filtres';
+$labels['managefilters'] = 'Gestion des filtres sur les mails entrants';
+$labels['filtername'] = 'Nom du filtre';
+$labels['disablerule'] = 'Désactiver le filtre';
+$labels['disabled'] = 'Désactivé';
+$labels['newfilter'] = 'Nouveau filtre';
+$labels['moveup'] = 'Monter';
+$labels['movedown'] = 'Descendre';
+$labels['filterallof'] = 'valident toutes les conditions suivantes';
+$labels['filteranyof'] = 'valident au moins une des conditions suivantes';
+$labels['filterany'] = 'tous les messages';
+$labels['filtercontains'] = 'contient';
+$labels['filternotcontains'] = 'ne contient pas';
+$labels['filteris'] = 'est';
+$labels['filterisnot'] = 'n\'est pas';
+$labels['filterexists'] = 'existe';
+$labels['filternotexists'] = 'n\'existe pas';
+$labels['filterregex'] = 'valide l\'expression régulière';
+$labels['filternotregex'] = 'ne valide pas l\'expression régulière';
+$labels['filterunder'] = 'est inférieur à';
+$labels['filterover'] = 'est supérieur à';
+$labels['filterbefore'] = 'antérieur(e) à';
+$labels['filterafter'] = 'postérieur(e) à';
+$labels['filteradvoptions'] = 'plus d\'options...';
+$labels['spamtest'] = 'Probabilité de spam';
+$labels['operator'] = 'Opérateur';
+$labels['comparator'] = 'Comparateur';
+$labels['isgreaterthan'] = 'plus grande que';
+$labels['isgreaterthanequal'] = 'plus grande ou égale à';
+$labels['islessthan'] = 'plus petite que';
+$labels['islessthanequal'] = 'plus petite ou égale à';
+$labels['equals'] = 'est égale à';
+$labels['notequals'] = 'n\'est pas égale à';
+$labels['countisgreaterthan'] = 'longueur plus grande que';
+$labels['countisgreaterthanequal'] = 'longueur plus grande ou égale à';
+$labels['countislessthan'] = 'longueur plus petite que';
+$labels['countislessthanequal'] = 'longueur plus petite ou égale à';
+$labels['countequals'] = 'longueur est égale à';
+$labels['countnotequals'] = 'longueur n\'est pas égale à';
+$labels['valueisgreaterthan'] = 'valeur plus grande que';
+$labels['valueisgreaterthanequal'] = 'valeur plus grande ou égale à';
+$labels['valueislessthan'] = 'valeur plus petite que';
+$labels['valueislessthanequal'] = 'valeur plus petite ou égale à';
+$labels['valueequals'] = 'valeur est égale à';
+$labels['valuenotequals'] = 'valeur n\'est pas égale à';
+$labels['userpart'] = 'partie utilisateur égale à';
+$labels['notuserpart'] = 'partie utilisateur n\'est pas égale à';
+$labels['detailpart'] = 'partie détaillée égale à';
+$labels['notdetailpart'] = 'partie détaillée n\'est pas égale à';
+$labels['domainpart'] = 'partie domaine égale à';
+$labels['notdomainpart'] = 'partie domaine n\'est pas égale à';
+$labels['teststring'] = 'Chaîne de test';
+$labels['messagemoveto'] = 'Déplacer le message vers';
+$labels['messageredirect'] = 'Rediriger le message à';
+$labels['messageimapflags'] = 'Marquer le message comme';
+$labels['messagereject'] = 'Rejeter le message';
+$labels['messagevacation'] = 'Message d\'absence';
+$labels['messagekeep'] = 'Garder le message';
+$labels['messagediscard'] = 'Refuser le message';
+$labels['messagenotify'] = 'Envoyer la notification';
+$labels['messagestop'] = 'Arrêter les filtres en cours';
+$labels['messagehelp'] = 'Qu\'est-ce que c\'est ?';
+$labels['sieveorigsubj'] = 'Ajouter le sujet original à la réponse';
+$labels['sievevachandle'] = 'Traiter';
+$labels['method'] = 'Méthode';
+$labels['options'] = 'Options';
+$labels['messagesrules'] = 'Règles du filtre';
+$labels['messagesactions'] = 'Actions du filtre';
+$labels['sieveto'] = 'Alias';
+$labels['sievefrom'] = 'De';
+$labels['flag'] = 'Importance';
+$labels['importancen'] = 'Aucune';
+$labels['importance1'] = 'Haute';
+$labels['importance2'] = 'Normale';
+$labels['importance3'] = 'Basse';
+$labels['flagread'] = 'Lu';
+$labels['flagdeleted'] = 'Supprimé';
+$labels['flaganswered'] = 'Répondu';
+$labels['flagdraft'] = 'Brouillon';
+$labels['flagflagged'] = 'Suivi';
+$labels['addsieverule'] = 'Ajouter une autre règle en dessous de celle-ci';
+$labels['addsieveact'] = 'Ajouter une autre action en dessous de celle-ci';
+$labels['deletesieverule'] = 'Effacer cette règle';
+$labels['deletesieveact'] = 'Effacer cette action';
+$labels['envelopefrom'] = 'Enveloppe De';
+$labels['envelopeto'] = 'Enveloppe Pour';
+$labels['otherheader'] = 'Autre entête';
+$labels['days'] = 'Période';
+$labels['message'] = 'Message';
+$labels['sieveruleheaders'] = 'Voir des exemples d\'autres entêtes';
+$labels['examplefilters'] = 'Exemple de filtres';
+$labels['importfilters'] = 'Importer des filtres';
+$labels['usedefaultfilter'] = 'Utiliser les filtres par défaut';
+$labels['importfilter'] = 'Importer des filtres';
+$labels['moreactions'] = 'Plus d\'options';
+$labels['adveditor'] = 'Editeur avancé';
+$labels['stdeditor'] = 'Editeur par défaut';
+$labels['messageredirectcopy'] = 'Envoyé une copie à';
+$labels['messagecopyto'] = 'Copier le message vers';
+$labels['body'] = 'Corps';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Brut';
+$labels['text'] = 'Texte';
+$labels['other'] = 'Autre';
+$labels['bodycontentpart'] = 'Contenu';
+$labels['notchecked'] = 'non coché';
+$labels['spamlevelisgreaterthanequal'] = 'plus grande ou égale à';
+$labels['spamlevelislessthanequal'] = 'plus petite ou égale à';
+$labels['spamlevelequals'] = 'est égale à';
+$labels['i;ascii-casemap'] = 'insensible à la casse';
+$labels['i;octet'] = 'correspondance exacte';
+$labels['i;ascii-numeric'] = 'correspondance numérique';
+$labels['selectruleset'] = 'Sélectionner un groupe de règles';
+$labels['activeruleset'] = '%s (actif)';
+$labels['activateruleset'] = 'Activer ce groupe de règles';
+$labels['newruleset'] = 'Créer un nouveau groupe de règles';
+$labels['delruleset'] = 'Effacer ce groupe de règles';
+$labels['renameruleset'] = 'Renomer ce groupe de règles';
+$labels['copy'] = 'Copier';
+$labels['copyexistingfilter'] = 'Copier les filtres éxistants';
+$labels['copytoruleset'] = 'Copier le filtre dans un autre groupe de règles';
+$labels['copyfromruleset'] = 'Copier des filtres depuis un autre groupe de règles';
+$labels['time'] = 'Heure';
+$labels['weekday'] = 'Jour de la semaine';
+
+$messages = array();
+$messages['nosieverules'] = 'Aucun filtre trouvé.';
+$messages['filterdeleteconfirm'] = 'Etes-vous sûr de vouloir effacer ce filtre ?';
+$messages['ruledeleteconfirm'] = 'Etes-vous sûr de vouloir effacer cette règle ?';
+$messages['actiondeleteconfirm'] = 'Etes-vous sûr de vouloir effacer cette action ?';
+$messages['filterunknownerror'] = 'Erreur serveur inconnue';
+$messages['filterconnerror'] = 'Impossible de se connecter au serveur sieve';
+$messages['filterdeleteerror'] = 'Impossible de supprimer le filtre. Une erreur serveur a eu lieu';
+$messages['filterdeleted'] = 'Suppression du filtre effectuée.';
+$messages['filtersaved'] = 'Sauvegarde du filtre effectuée.';
+$messages['filtersaveerror'] = 'Impossible d\'enregistrer le filtre. Une erreur serveur a eu lieu';
+$messages['vacdaysexp'] = 'La période est le nombre de jours pendant lesquels le message ne sera pas renvoyé à l\'utilisateur, peu importe le nombre de fois où il vous contacte. <br /> <br /> Par exemple: Si Joe vous contacte le lundi et la période est définie à 7, alors Joe va recevoir un message d\'absence du bureau le lundi, mais n\'en aura pas de nouveaux avant le lundi suivant, peu importe le nombre d\'emails qu\'il envoie au cours de la semaine.';
+$messages['vachandleexp'] = 'Un traitement peut être utilisé pour lier différents messages d\'absence ensemble ; une fois qu\'un message a été envoyé, aucun autre message autre avec le même traitement sera renvoyé durant la période.';
+$messages['vactoexp'] = 'Liste de destinataires supplémentaires qui sont inclus dans l\'auto réponse. Si le destinataire de l\'email n\'est pas votre adresse principale et qu\'elle n\'est pas dans la liste, aucun message ne sera envoyé.';
+$messages['vactoexp_adv'] = 'Séparez plusieurs adresses avec une virgule (,). Par exemple: test1@example.com,test2@example.com,test3@example.com';
+$messages['vactoexp_err'] = 'Erreur: Plusieurs adresses doivent être séparées par une virgule (,)';
+$messages['norulename'] = 'Veuillez entrer un nom pour le filtre';
+$messages['ruleexists'] = 'Un filtre avec le même nom existe déjà. Veuillez en choisir un autre';
+$messages['noheader'] = 'Veuillez entrer le nom de l\'entête à tester';
+$messages['headerbadchars'] = 'Erreur : L\'entête contient des caractères interdits.';
+$messages['noheadervalue'] = 'Veuillez entrer une valeur à tester pour l\'entête';
+$messages['sizewrongformat'] = 'Erreur : La taile du message doit être un nombre';
+$messages['noredirect'] = 'Veuillez entrer une adresse email pour la redirection du message';
+$messages['redirectaddresserror'] = 'Erreur : L\'adresse email semble invalide';
+$messages['noreject'] = 'Veuillez entrer un message à envoyer pour les emails rejetés';
+$messages['vacnodays'] = 'Veuillez entrer un nombre de jours pour la période durant laquelle le message ne sera pas renvoyé à la même personne.';
+$messages['vacdayswrongformat'] = 'Erreur : La période doit être un nombre supérieir à 1';
+$messages['vacnomsg'] = 'Veuillez entrer du texte pour votre message';
+$messages['notifynomethod'] = 'Veuillez entrer la méthode par laquellela notification doit être envoyé';
+$messages['notifynomsg'] = 'veuillez entrer du texte pour votre message';
+$messages['sieveruleexp'] = 'Veuillez définir une ou plusieurs règles pour le filtre. Les filtres sont exécutés dans l\'ordre dans lequel ils apparaissent sur la gauche de l\'écran. Si un filtre est exécuté, plus aucun autre filtre ne sera testé.';
+$messages['sieveruleexp_stop'] = 'Veuillez définir une ou plusieurs règles pour le filtre. Les filtres sont exécutés dans l\'ordre dans lequel ils apparaissent sur la gauche de l\'écran, et ce, jusqu\'à ce qu\'une action d\'arrêt des filtres soit exécutée.';
+$messages['sieveactexp'] = 'Veuillez définir une ou plusieurs actions ci-dessous. Ces actions seront exécutés pour chaque message qui correspondra au règles ci-dessus.';
+$messages['sieveheadershlp'] = 'Voici ci-dessous une liste d\'exemple d\'entête que vous pouvez utilisez dans votre règle. Sélectionnez-en une pour l\'ajouter à la règle ou entrez-en une manuellement dans le champs texte ci-dessous.';
+$messages['movingfilter'] = 'Déplacement du filtre...';
+$messages['noexistingfilters'] = 'Aucun filtre détecté!';
+$messages['importdefault'] = '<b>Utiliser les filtres par défaut : </b>Il y a des filtres disponibles. Voulez-vous utiliser ces filtres ?';
+$messages['importother'] = '<b>Importer des filtres : </b>Un autre set de filtres de %s a été trouvé. Voulez-vous importer ces filtres dans votre profil ?';
+$messages['switchtoadveditor'] = 'Changer pour l\'éditeur avancé vous permet de modifier le fichier sieve directement. Tout changement ici peut le rendre illisible pour l\'édteur normal et peut être perdu quand les filtres sont enregistré avec l\'édteur normal. Voulez-vous continuer ?';
+$messages['filterimported'] = 'Importation des filtres effectuée.';
+$messages['filterimporterror'] = 'Impossible d\'importer les filtres. Une erreur serveur a eu lieu';
+$messages['notifyinvalidmethod'] = 'La méthode ne semble pas être écrite dans un format valide, elle doit être une URI. Par exemple : \'mailto:alert@exemple.com\'';
+$messages['nobodycontentpart'] = 'Veuillez entrer un contenu à tester';
+$messages['badoperator'] = 'Désolé, l\'opérateur que vous avez sélectionner ne peut pas être utilisé pour cette règle';
+$messages['filteractionerror'] = 'L\'action demandée n\'est pas supportée par le serveur';
+$messages['filtermissingerror'] = 'Impossible de trouver la règle demandée';
+$messages['contentpartexp'] = 'Le MIME-type our la partie spécifique du message qui doit être testé. Par exemple : `message/rfc822`, `text/html`, `audio/mp3` ou `image`.';
+$messages['delrulesetconf'] = 'Êtes vous sûr de vouloir effacer ce groupe de règles ?';
+$messages['rulesetexists'] = 'Un groupe de règles porte déjà ce nom. Veuillez en choisir un autre.';
+$messages['copyexisting'] = '<b>Copie d\'un groupe de règles éxistant :</b> Voulez vous copier les filtres d\'un groupe de règles éxistant dans le groupe courant ?';
+$messages['filtercopied'] = 'Filtre copié avec succès';
+$messages['nosieverulesets'] = 'Aucun groupe de règles trouvé.';
+$messages['baddateformat'] = 'Erreur: Veuillez entrer une date sous la forme AAAA-MM-JJ';
+$messages['badtimeformat'] = 'Erreur: Veuillez entrer une heure sous la forme HH:MM:SS';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/hu_HU.inc b/plugins/sieverules/localization/hu_HU.inc
new file mode 100644
index 000000000..21addfbcf
--- /dev/null
+++ b/plugins/sieverules/localization/hu_HU.inc
@@ -0,0 +1,171 @@
+<?php
+/* Author: Tamas P */
+
+$labels = array();
+$labels['filters'] = 'Szűrők';
+$labels['managefilters'] = 'Szűrők kezelése';
+$labels['filtername'] = 'Szűrő neve';
+$labels['disablerule'] = 'Szabály kikapcsolása';
+$labels['disabled'] = 'Kikapcsolva';
+$labels['newfilter'] = 'Új szűrő';
+$labels['moveup'] = 'Fennebb';
+$labels['movedown'] = 'Lennebb';
+$labels['filterallof'] = 'illeszkedik az összes következő szabályra';
+$labels['filteranyof'] = 'illeszkedik valamely szabályra';
+$labels['filterany'] = 'összes üzenet';
+$labels['filtercontains'] = 'tartalmazza';
+$labels['filternotcontains'] = 'nem tartalmazza';
+$labels['filteris'] = 'egyenlő';
+$labels['filterisnot'] = 'nem egyenlő';
+$labels['filterexists'] = 'létezik';
+$labels['filternotexists'] = 'nem létezik';
+$labels['filterregex'] = 'illeszkedik reguláris kifejezésre';
+$labels['filternotregex'] = 'nem illeszkedik reguláris kifejezésre';
+$labels['filterunder'] = 'kevesebb mint';
+$labels['filterover'] = 'több mint';
+$labels['filteradvoptions'] = 'több beállítás...';
+$labels['spamtest'] = 'Spam valószínűség';
+$labels['operator'] = 'számítás';
+$labels['comparator'] = 'Összehasonlító';
+$labels['isgreaterthan'] = 'nagyobb mint';
+$labels['isgreaterthanequal'] = 'nagyobb vagy egyenlő';
+$labels['islessthan'] = 'kissebb mint';
+$labels['islessthanequal'] = 'kissebb vagy egyenlő';
+$labels['equals'] = 'egyenlő';
+$labels['notequals'] = 'nem egyenlő';
+$labels['countisgreaterthan'] = 'számítás nagyobb mint';
+$labels['countisgreaterthanequal'] = 'számítás nagyobb vagy egyenlő';
+$labels['countislessthan'] = 'számítás kissebb mint';
+$labels['countislessthanequal'] = 'számítás kissebb vagy egyenlő';
+$labels['countequals'] = 'számítás egyenlő';
+$labels['countnotequals'] = 'számítás nem egyenlő';
+$labels['valueisgreaterthan'] = 'érték nagyobb mint';
+$labels['valueisgreaterthanequal'] = 'érték nagyobb vagy egyenlő';
+$labels['valueislessthan'] = 'érték kissebb mint';
+$labels['valueislessthanequal'] = 'érték kissebb vagy egyenlő';
+$labels['valueequals'] = 'érték egyenlő';
+$labels['valuenotequals'] = 'érték nem egyenlő';
+$labels['userpart'] = 'felhasználó része egyenlő';
+$labels['notuserpart'] = 'felhasználó része nem egyenlő';
+$labels['detailpart'] = 'részlet része egyenlő';
+$labels['notdetailpart'] = 'részlet része nem egyenlő';
+$labels['domainpart'] = 'domain része egyenlő';
+$labels['notdomainpart'] = 'domain része nem egyenlő';
+$labels['teststring'] = 'Teszt szöveg';
+$labels['messagemoveto'] = 'Üzenet áthelyezése';
+$labels['messageredirect'] = 'Üzenet átirányítása';
+$labels['messageimapflags'] = 'Megjelőlés mint';
+$labels['messagereject'] = 'Elutasítás, üzenettel';
+$labels['messagevacation'] = 'Irodán kivűl üzenet';
+$labels['messagekeep'] = 'Megtartás';
+$labels['messagediscard'] = 'Üzenet eldobása';
+$labels['messagenotify'] = 'Értesítés küldése';
+$labels['messagestop'] = 'Szűrők feldolgozásának leállítása';
+$labels['messagehelp'] = 'Mi ez?';
+$labels['sieveorigsubj'] = 'Az eredeti tárgy hozzáfűzése a válaszhoz';
+$labels['sievevachandle'] = 'Kezel';
+$labels['method'] = 'Módszer';
+$labels['options'] = 'Feltételek';
+$labels['messagesrules'] = 'Szűrő szabályok';
+$labels['messagesactions'] = 'Szűrő akció';
+$labels['sieveto'] = 'Aliaszok';
+$labels['sievefrom'] = 'Feladó';
+$labels['flag'] = 'Jelőlés';
+$labels['importancen'] = 'Egyik sem';
+$labels['importance1'] = '1';
+$labels['importance2'] = '2';
+$labels['importance3'] = '3';
+$labels['flagread'] = 'Olvasott';
+$labels['flagdeleted'] = 'Törölt';
+$labels['flaganswered'] = 'Megválaszolt';
+$labels['flagdraft'] = 'Piszkozat';
+$labels['flagflagged'] = 'Megjelőlve';
+$labels['addsieverule'] = 'Új szabály hozzáadása, ez alá';
+$labels['addsieveact'] = 'Új akció hozzáadása, ez alá';
+$labels['deletesieverule'] = 'Szabály törlése';
+$labels['deletesieveact'] = 'Akció törlése';
+$labels['envelopefrom'] = 'Boríték, Küldő';
+$labels['envelopeto'] = 'Boríték, Cimzett';
+$labels['otherheader'] = 'Más fejléc';
+$labels['days'] = 'Időszak';
+$labels['message'] = 'Üzenet';
+$labels['sieveruleheaders'] = 'Fejléc minták megtekintése';
+$labels['examplefilters'] = 'Szűrő minták';
+$labels['importfilters'] = 'Szűrők importálása';
+$labels['usedefaultfilter'] = 'Alapértelmezett szűrők használata';
+$labels['importfilter'] = 'Szűrők importálása';
+$labels['moreactions'] = 'Tobábbi opciók...';
+$labels['adveditor'] = 'Haladó szerkesztő';
+$labels['stdeditor'] = 'Egyszerű szerkesztő';
+$labels['messageredirectcopy'] = 'Másolat küldése';
+$labels['auto'] = 'Auto';
+$labels['text'] = 'Szöveg';
+$labels['other'] = 'Egyéb';
+$labels['spamlevelisgreaterthanequal'] = 'nagyobb vagy egyenlő';
+$labels['spamlevelislessthanequal'] = 'kissebb vagy egyenlő';
+$labels['spamlevelequals'] = 'egyenlő';
+$labels['i;ascii-casemap'] = 'kis/nagybetű nem számít';
+$labels['i;octet'] = 'pontos egyezés';
+$labels['selectruleset'] = 'Szabálycsoport kiválasztása';
+$labels['activateruleset'] = 'Szabálycsoport aktiválása';
+$labels['newruleset'] = 'Új szabálycsoport létrehozása';
+$labels['delruleset'] = 'Szabálycsoport törlése';
+$labels['renameruleset'] = 'Szabálycsoport átnevezése';
+$labels['copy'] = 'Másol';
+$labels['copyexistingfilter'] = 'Létező szűrők másolása';
+$labels['copytoruleset'] = 'Szűrő másolása másik szabálycsoportba';
+$labels['copyfromruleset'] = 'Szűrő(k) másolása másik szabálycsoportból';
+$labels['time'] = 'Idő';
+$labels['weekday'] = 'Hétköznap';
+
+$messages = array();
+$messages['nosieverules'] = 'Nem található szűrő';
+$messages['filterdeleteconfirm'] = 'Biztosan törölni akarod ezt a szűrőt?';
+$messages['ruledeleteconfirm'] = 'Biztosan törölni akarod ezt a szabályt?';
+$messages['actiondeleteconfirm'] = 'Biztosan törölni akarod ezt az akciót?';
+$messages['filterunknownerror'] = 'Ismeretlen szerverhiba';
+$messages['filterconnerror'] = 'Nem sikerült kapcsolódni a sieve szerverhez';
+$messages['filterdeleteerror'] = 'Nem lehet törölni a szűrőt. Szerver hiba';
+$messages['filterdeleted'] = 'A szűrő sikeresen törölve';
+$messages['filtersaved'] = 'Szűrő elmentve';
+$messages['filtersaveerror'] = 'Nem sikerült elmenteni a szűrőt. Szerver hiba';
+$messages['vacdaysexp'] = 'Az dőszak, azon napok száma míg egy üzenet nem lesz újraküldve ugyanannak a címzettnek, függetlenül attól hányszolt lépett önnel kapcsolatba.<br /><br />Pédául: Ha János üzenetet küld Hétfőn és az időszak 7, válaszul kap egy Irodán kívül üzenetet ami nem lesz neki újraküldve a következő Hétfőig, bármennyi üzenetet is küld János ebben az időszakban.';
+$messages['vachandleexp'] = 'A mutató arra használható, hogy összekapcsoljon külömböző Irodán kívül üzeneteket. Ha egy ilyen üzenet el lett küldve, másik ilyen mutatóju üzenet nem lesz elküldve megadott időszakban';
+$messages['vactoexp'] = 'A többi címzett listája akiknek az automatikus válasz el lesz küldve. Ha egy címzett nem a fő cím én nincs ebben a listában, nem lesz neki üzenet küldve.';
+$messages['vactoexp_adv'] = 'Több álnevet vesszővel (,) lehet elválasztani. Pl. teszt1@pelda.hu, teszt2@pelda.hu, teszt3@pelda.hu';
+$messages['vactoexp_err'] = 'Hiba! Több álnév esetén vesszőt (,) kell használni';
+$messages['norulename'] = 'Irjon be egy nevet a szűrőnek';
+$messages['ruleexists'] = 'Ez a szűrőnév már létezik. Kérem irjon be másikat';
+$messages['noheader'] = 'Kérem irja be a fejléc nevét a teszthez';
+$messages['headerbadchars'] = 'Hiba: A fejléc illegális karaktert tartalmaz';
+$messages['noheadervalue'] = 'Kérem irjon be egy értéket a fejléc teszteléséhez';
+$messages['sizewrongformat'] = 'Hiba: az üzenet mérete szám kell legyen';
+$messages['noredirect'] = 'Kérem irjon be egy e-mail címet az átirányításhoz';
+$messages['redirectaddresserror'] = 'Hiba: A cím nem megfelelő';
+$messages['noreject'] = 'Írja be az üzenetet amit válaszolni szeretne a visszadobott üzenetre';
+$messages['vacnodays'] = 'Írja be a napok számát arra az időszakra mig az üzenet nem lesz újraküldve ugyanannak a címzettnek';
+$messages['vacdayswrongformat'] = 'Hiba: az időszak 1-nél nagyobb vagy egyenlő lehet';
+$messages['vacnomsg'] = 'Írja be az üzenet szövegét';
+$messages['notifynomethod'] = 'Írja be a módszert, melyel az értesitést eloküldjük';
+$messages['notifynomsg'] = 'Írja be az üzenet szövegét';
+$messages['sieveruleexp'] = 'Kérem határozzon meg egy vagy több szabályt mellyel az üzenetek szelve lesznek. A szűrők olyan sorrendben futnak le, ahogyan megjelennek a baloldalon. Ha egy szűrőnek megfelel az üzenet, több szűrő nem hajtodik végre.';
+$messages['sieveactexp'] = 'Kérem válasszon a következő lehetőségekből. ezek minden üzenetnre végrehajtódnak, melyek megfelelnek a szabálynak.';
+$messages['sieveheadershlp'] = 'Alább néhány példa más fejlécre melyek tesztelhetőek a szűrőkkel. Válassza ki a fejlécet, adja hozzá a szűrőhőz vagy írjon be egyénit az alábbi szövegmezőbe.';
+$messages['movingfilter'] = 'Szűrő áthelyezése...';
+$messages['noexistingfilters'] = 'Nem találhatók szűrők';
+$messages['importdefault'] = '<b>Alapértelmezett szűrők használata:</b> Alapértelmezett szűrők léteznek. Szeretné használni ezeket a szűrőket?';
+$messages['importother'] = '<b>Szűrők importálása:</b> Egy másik szűrőcsoport %s től létezik. Be szeretné tölteni ezt a szűrőcsoportot?';
+$messages['switchtoadveditor'] = 'ÿtváltás halado szerkesztőre, mellyel Ön direktbe szerkesztheti a sieve fájlt. Az itt végzett változtatások nem lesznek olvashatóak a norlál szerkesztöben és elvesznek ha a szűrők mentésre kerülnek a normál szerkesztőben. Szeretné folytatni?';
+$messages['filterimported'] = 'A szűrő sikeresen importálva';
+$messages['filterimporterror'] = 'Nem sikerült a szűrő importálása. Szerver hiba';
+$messages['filteractionerror'] = 'A kért műveletet nem támogatja a szerver';
+$messages['filtermissingerror'] = 'Nem találom a keresett szabályt';
+$messages['delrulesetconf'] = 'Biztosan törölni szeretné ezt a szabálycsoportot?';
+$messages['rulesetexists'] = 'Már létezik ilyen nevű szabálycsoport. Írjon be másikat!';
+$messages['filtercopied'] = 'Szűrő sikeresen átmásolva';
+$messages['nosieverulesets'] = 'Nincs ilyen szabálycsoport.';
+$messages['baddateformat'] = 'Hiba: a dátumot ÉÉÉÉ-HH-NN formátumban kell megadni.';
+$messages['badtimeformat'] = 'Hiba: az időt ÓÓ:PP:MP fromátumban kell megadni';
+$messages['missingfoldername'] = 'Hiba! Írjon be egy mappanevet.';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/it_IT.inc b/plugins/sieverules/localization/it_IT.inc
new file mode 100644
index 000000000..a5a7bc484
--- /dev/null
+++ b/plugins/sieverules/localization/it_IT.inc
@@ -0,0 +1,202 @@
+<?php
+/* Author: Alessio Cecchi */
+
+$labels = array();
+$labels['filters'] = 'Filtri';
+$labels['managefilters'] = 'Gestisci filtri';
+$labels['filtername'] = 'Nome del filtro';
+$labels['disablerule'] = 'Disabilita regola';
+$labels['disabled'] = 'Disabilitata';
+$labels['newfilter'] = 'Nuovo filtro';
+$labels['moveup'] = 'Muovi su';
+$labels['movedown'] = 'Muovi giù';
+$labels['filterallof'] = 'soddisfa tutte le seguenti regole';
+$labels['filteranyof'] = 'soddisfa una qualunque delle seguenti regole';
+$labels['filterany'] = 'tutti i messaggi';
+$labels['filtercontains'] = 'contiene';
+$labels['filternotcontains'] = 'non contiene';
+$labels['filteris'] = 'è uguale a';
+$labels['filterisnot'] = 'non è uguale a';
+$labels['filterexists'] = 'esiste';
+$labels['filternotexists'] = 'non esiste';
+$labels['filterregex'] = 'soddisfa espressione regolare';
+$labels['filternotregex'] = 'non soddisfa espressione regolare';
+$labels['filterunder'] = 'è minore di';
+$labels['filterover'] = 'è maggiore di';
+$labels['filterbefore'] = 'prima';
+$labels['filterafter'] = 'dopo';
+$labels['filteradvoptions'] = 'altre opzioni...';
+$labels['spamtest'] = 'Probabilità Spam';
+$labels['operator'] = 'Operatore';
+$labels['comparator'] = 'Comparatore';
+$labels['isgreaterthan'] = 'è maggiore di';
+$labels['isgreaterthanequal'] = 'è maggiore o uguale a';
+$labels['islessthan'] = 'è minore di';
+$labels['islessthanequal'] = 'è minore o uguale a';
+$labels['equals'] = 'è uguale a';
+$labels['notequals'] = 'è diverso da';
+$labels['countisgreaterthan'] = 'numero di occorrenze maggiore di';
+$labels['countisgreaterthanequal'] = 'numero di occorrenze maggiore o uguale a';
+$labels['countislessthan'] = 'numero di occorrenze minore di';
+$labels['countislessthanequal'] = 'numero di occorrenze minore o uguale a';
+$labels['countequals'] = 'numero di occorrenze uguale a';
+$labels['countnotequals'] = 'numero di occorrenze diverso da';
+$labels['valueisgreaterthan'] = 'valore maggiore di';
+$labels['valueisgreaterthanequal'] = 'valore maggiore o uguale a';
+$labels['valueislessthan'] = 'valore minore di';
+$labels['valueislessthanequal'] = 'valore minore o uguale a';
+$labels['valueequals'] = 'valore uguale a';
+$labels['valuenotequals'] = 'valore diverso da';
+$labels['userpart'] = 'parte utente dell\'indirizzo uguale a';
+$labels['notuserpart'] = 'parte utente dell\'indirizzo diversa da';
+$labels['detailpart'] = 'parte del dettaglio dell\'indirizzo uguale a';
+$labels['notdetailpart'] = 'parte del dettaglio dell\'indirizzo diverso da';
+$labels['domainpart'] = 'dominio uguale a';
+$labels['notdomainpart'] = 'dominio diverso da';
+$labels['teststring'] = 'Stringa di test';
+$labels['messagemoveto'] = 'Sposta il messaggio in';
+$labels['messageredirect'] = 'Reindirizza il messaggio in';
+$labels['messageimapflags'] = 'Contrassegna il messaggio come';
+$labels['messagereject'] = 'Respingi con il seguente messaggio';
+$labels['messagevacation'] = 'Messaggio di assenza';
+$labels['messagekeep'] = 'Conserva il messaggio';
+$labels['messagediscard'] = 'Scarta il messaggio';
+$labels['messagenotify'] = 'Invia notifica';
+$labels['messagestop'] = 'Smetti di processare i filtri';
+$labels['messagehelp'] = 'Cos\'è questo?';
+$labels['sieveorigsubj'] = 'Appendi l\'oggetto originale alla risposta';
+$labels['sievevachandle'] = 'Gestisci';
+$labels['method'] = 'Metodo';
+$labels['options'] = 'Opzioni';
+$labels['messagesrules'] = 'Regole del filtro';
+$labels['messagesactions'] = 'Azioni del filtro';
+$labels['sieveto'] = 'Alias';
+$labels['sievefrom'] = 'Da';
+$labels['flag'] = 'Importanza';
+$labels['importancen'] = 'Nessuna';
+$labels['importance1'] = 'Alta';
+$labels['importance2'] = 'Normale';
+$labels['importance3'] = 'Bassa';
+$labels['flagread'] = 'Letto';
+$labels['flagdeleted'] = 'Cancellato';
+$labels['flaganswered'] = 'Risposto';
+$labels['flagdraft'] = 'Bozza';
+$labels['flagflagged'] = 'Etichettati';
+$labels['addsieverule'] = 'Aggiungi un\'altra regola sotto';
+$labels['addsieveact'] = 'Aggiungi un\'altra azione sotto';
+$labels['deletesieverule'] = 'Cancella questa regola';
+$labels['deletesieveact'] = 'Cancella questa azione';
+$labels['envelopefrom'] = 'Envelope Da';
+$labels['envelopeto'] = 'Envelope A';
+$labels['otherheader'] = 'Altra intestazione';
+$labels['days'] = 'Periodo';
+$labels['message'] = 'Messaggio';
+$labels['sieveruleheaders'] = 'Vedi esempi di altre intestazioni';
+$labels['examplefilters'] = 'Filtri di esempio';
+$labels['importfilters'] = 'Importa Filtri';
+$labels['usedefaultfilter'] = 'Usa i filtri predefiniti';
+$labels['importfilter'] = 'Importa filtri';
+$labels['moreactions'] = 'Altre opzioni...';
+$labels['adveditor'] = 'Editor avanzato';
+$labels['stdeditor'] = 'Editor semplice';
+$labels['messageredirectcopy'] = 'Invia una copia a';
+$labels['messagecopyto'] = 'Copia il messaggio in';
+$labels['body'] = 'Corpo';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Raw';
+$labels['text'] = 'Testo';
+$labels['other'] = 'Altro';
+$labels['bodycontentpart'] = 'Contenuto del corpo';
+$labels['notchecked'] = 'non etichettato';
+$labels['spamlevelisgreaterthanequal'] = 'è maggiore o uguale a';
+$labels['spamlevelislessthanequal'] = 'è minore o uguale a';
+$labels['spamlevelequals'] = 'è uguale a';
+$labels['i;ascii-casemap'] = 'corrispondenza non sensibile alle maiuscole';
+$labels['i;octet'] = 'corrispondenza esatta';
+$labels['i;ascii-numeric'] = 'corrispondenza numerica';
+$labels['selectruleset'] = 'Seleziona set di regole';
+$labels['activeruleset'] = '%s (attivo)';
+$labels['activateruleset'] = 'Attiva questo set di regole';
+$labels['newruleset'] = 'Crea un nuovo set di regole';
+$labels['delruleset'] = 'Cancella questo set di regole';
+$labels['renameruleset'] = 'Rinomina questo set di regole';
+$labels['copy'] = 'Copia';
+$labels['copyexistingfilter'] = 'Copia i filtri esistenti';
+$labels['copytoruleset'] = 'Copia il filtro in un altro set di regole';
+$labels['copyfromruleset'] = 'Copia i filtri da un set di regole esistente';
+$labels['time'] = 'Ora';
+$labels['weekday'] = 'Giorno della settimana';
+$labels['virustest'] = 'Probabilità Virus';
+$labels['novirus'] = 'nessun virus trovato';
+$labels['virusremoved'] = 'virus trovato e rimosso';
+$labels['viruscured'] = 'virus trovato e curato';
+$labels['possiblevirus'] = 'il messaggio potrebbe contenere un virus';
+$labels['definitevirus'] = 'il messaggio potrebbe essere certamente un virus';
+$labels['addheader'] = 'Aggiungi un header';
+$labels['removeheader'] = 'Rimuovi un header';
+$labels['headername'] = 'Nome header';
+$labels['headervalue'] = 'Contenuto header';
+$labels['headerappend'] = 'Accoda ad un header esistente';
+$labels['headerindex'] = 'Indice header';
+$labels['headerdelall'] = 'Tutte le occorrenze';
+$labels['last'] = 'ultimo';
+
+$messages = array();
+$messages['nosieverules'] = 'Nessun filtro trovato.';
+$messages['filterdeleteconfirm'] = 'Sei sicuro/a di di voler cancellare questo filtro?';
+$messages['ruledeleteconfirm'] = 'Sei sicuro/a di voler cancellare questa regola?';
+$messages['actiondeleteconfirm'] = 'Sei sicuro/a di voler cancellare questa azione?';
+$messages['filterunknownerror'] = 'Errore sconosciuto del server';
+$messages['filterconnerror'] = 'Impossibile connettersi al server sieve';
+$messages['filterdeleteerror'] = 'Impossibile cancellare il filtro. Errore del server';
+$messages['filterdeleted'] = 'Filtro cancellato con successo';
+$messages['filtersaved'] = 'Filtro salvato con successo';
+$messages['filtersaveerror'] = 'Impossibile salvare il filtro. Errore del server';
+$messages['vacdaysexp'] = 'Il periodo è il numero di giorni durante i quali il messaggio non sarà più spedito allo stesso utente, a prescindere da quante volte ti abbiano contattato.<br /><br />Per esempio: Se Marco ti scrive una email lunedì e il periodo è impostato a 7, Marco riceverà un messaggio di assenza lunedì ma non ne riceverà altri fino al lunedì successivo, indipendentemente dal n. di email che invia durante la settimana.';
+$messages['vachandleexp'] = 'Un handle può essere usato per collegare diversi messaggi di assenza insieme, una volta che un messaggio è stato inviato nessun altro con lo stesso handle sarà rispedito in quel periodo.';
+$messages['vactoexp'] = 'Lista degli indirizzi dei destinatari aggiuntivi che sono inclusi nella risposta automatica. Se un destinatario non è il tuo indirizzo principale e non è in questa lista, nessun messaggio sarà inviato.';
+$messages['vactoexp_adv'] = 'Separare i diversi indirizzi con una virgola. Per esempio: test1@example.com,test2@example.com,test3@example.com';
+$messages['vactoexp_err'] = 'Errore: i diversi indirizzi devono essere separati da virgole';
+$messages['norulename'] = 'Inserire un nome per il filtro';
+$messages['ruleexists'] = 'Un filtro con questo nome esiste già. Per favore scegline un altro.';
+$messages['noheader'] = 'Inserire il nome dell\'intestazione da testare';
+$messages['headerbadchars'] = 'Errore: L\'intestazione contiene caratteri proibiti';
+$messages['noheadervalue'] = 'Inserire un valore con cui testare l\'intestazione';
+$messages['sizewrongformat'] = 'Errore: Le dimensioni del messaggio devono essere espresse in formato numerico';
+$messages['noredirect'] = 'Inserire un indirizzo email a cui reindirizzare i messaggi';
+$messages['redirectaddresserror'] = 'Errore: L\'indirizzo non è valido';
+$messages['noreject'] = 'Inserire un messaggio da inviare con le email respinte';
+$messages['vacnodays'] = 'Inserire il numero di giorni per il periodo in cui il messaggio non sarà reinviato alla stessa persona';
+$messages['vacdayswrongformat'] = 'Errore: Il periodo deve essere un numero maggiore o uguale a 1';
+$messages['vacnomsg'] = 'Inserire un testo per il messaggio';
+$messages['notifynomethod'] = 'Inserire un metodo con cui la notifica dovrà essere inviata';
+$messages['notifynomsg'] = 'Inserire un testo per il messaggio';
+$messages['sieveruleexp'] = 'Definire una o più regole con cui ogni messaggio sarà testato. I filtri sono lanciati nell\'ordine in cui essi appaiono nella sinistra della schermata. Se una regola viene soddisfatta nessun altro filtro viene valutato.';
+$messages['sieveruleexp_stop'] = 'Definire una o più regole con le quali testare i messaggi. I filtri sono lanciati nell\'ordine in cui appaiono nella sinistra della schermata fintanto che non viene eseguita un\'azione di \'Stop\'.';
+$messages['sieveactexp'] = 'Selezionare una delle opzioni. Queste azioni saranno eseguite per ogni messaggio che soddiferà le regole qui sopra.';
+$messages['sieveheadershlp'] = 'Questi sono alcuni esempi di intestazioni che possono essere testate dal filtro. Scegliere un\'intestazione per aggiungerla alla regola, o scriverne una personalizzata nella casella qui sopra.';
+$messages['movingfilter'] = 'Sto spostando il filtro...';
+$messages['noexistingfilters'] = 'Nessun filtro esistente rilevato!';
+$messages['importdefault'] = '<b>Usa i filtri predefiniti:</b> C\'è un set predefinito di filtri disponibile. Vuoi usare questi filtri?';
+$messages['importother'] = '<b>Importa filtri:</b> è stato trovato un altro set di filtri da %s. Vuoi importare questi filtri nel tuo set corrente?';
+$messages['switchtoadveditor'] = 'Passare all\'editor avanzato ti consente di editare il \'file sieve\' direttamente. Ogni cambiamento qui potrà risultare illeggibile nell\'editor normale e può essere perso quando i filtri sono salvati usando l\'editor normale. Vuoi continuare?';
+$messages['filterimported'] = 'Filtro importato con successo';
+$messages['filterimporterror'] = 'Impossibile importare il filtro. Errore del server.';
+$messages['notifyinvalidmethod'] = 'Il metodo non sembra essere scritto in un formato valido, deve essere un URI, per esempio: `mailto:alert@example.com`.';
+$messages['nobodycontentpart'] = 'Inserire una parte di contenuto da testare';
+$messages['badoperator'] = 'Spiacente, l\'operatore che hai selezionato non può essere usato in questa regola';
+$messages['filteractionerror'] = 'L\'azione che hai richiesto non è supportata dal server';
+$messages['filtermissingerror'] = 'Impossibile trovare la regola richiesta';
+$messages['contentpartexp'] = 'Il MIME-type o la parte specifica del messaggio che dovrebbe essere testato. Per esempio: `message/rfc822`, `text/html`, `audio/mp3` o `image`.';
+$messages['delrulesetconf'] = 'Sei sicuro di voler cancellare questo set di regole?';
+$messages['rulesetexists'] = 'Un set di regole con questo nome esiste già. Inseriscine un altro.';
+$messages['copyexisting'] = '<b>Copia del set di regole:</b> Vuoi copiare i filtri dal set di regole esistente nel set corrente?';
+$messages['filtercopied'] = 'Filtro copiato con successo';
+$messages['nosieverulesets'] = 'Nessun set di regole trovato.';
+$messages['baddateformat'] = 'Errore: Inserire la data nel formato YYYY-MM-DD';
+$messages['badtimeformat'] = 'Errore: Inserire l\'ora nel formato HH:MM:SS';
+$messages['missingfoldername'] = 'Errore: Per favore inserisci il nome di una cartella';
+$messages['eheadernoname'] = 'Errore: Per favore inserisci il nome di un header';
+$messages['eheadernoval'] = 'Errore: Per favore inserisci il contenuto di un header';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/nl_NL.inc b/plugins/sieverules/localization/nl_NL.inc
new file mode 100644
index 000000000..ccdeeb7c4
--- /dev/null
+++ b/plugins/sieverules/localization/nl_NL.inc
@@ -0,0 +1,205 @@
+<?php
+/* Author: Beheer */
+
+$labels = array();
+$labels['filters'] = 'Filters';
+$labels['filtersname'] = 'Filters ($name)';
+$labels['managefilters'] = 'Beheer inkomende mail filters';
+$labels['filtername'] = 'Filternaam';
+$labels['disablerule'] = 'Regel uitschakelen';
+$labels['disabled'] = 'Uitgeschakeld';
+$labels['newfilter'] = 'Nieuw filter';
+$labels['moveup'] = 'Omhoog';
+$labels['movedown'] = 'Omlaag';
+$labels['filterallof'] = 'die voldoen aan alle volgende regels';
+$labels['filteranyof'] = 'die voldoen aan een van de volgende regels';
+$labels['filterany'] = 'alle berichten';
+$labels['filtercontains'] = 'bevat';
+$labels['filternotcontains'] = 'bevat niet';
+$labels['filteris'] = 'is gelijk aan';
+$labels['filterisnot'] = 'is niet gelijk aan';
+$labels['filterexists'] = 'bestaat';
+$labels['filternotexists'] = 'bestaat niet';
+$labels['filterregex'] = 'voldoet aan reguliere expressie';
+$labels['filternotregex'] = 'voldoet niet aan reguliere expressie';
+$labels['filterunder'] = 'onder';
+$labels['filterover'] = 'over';
+$labels['filterbefore'] = 'is voor';
+$labels['filterafter'] = 'is na';
+$labels['filteradvoptions'] = 'meer opties...';
+$labels['spamtest'] = 'Spam waarschijnlijkheid';
+$labels['operator'] = 'Operator';
+$labels['comparator'] = 'Vergelijker';
+$labels['isgreaterthan'] = 'is groter dan';
+$labels['isgreaterthanequal'] = 'is groter dan of gelijk aan';
+$labels['islessthan'] = 'is minder dan';
+$labels['islessthanequal'] = 'is minder dan of gelijk aan';
+$labels['equals'] = 'is gelijk aan';
+$labels['notequals'] = 'is niet gelijk aan';
+$labels['countisgreaterthan'] = 'aantal is groter dan';
+$labels['countisgreaterthanequal'] = 'aantal is groter dan of gelijk aan';
+$labels['countislessthan'] = 'aantal is kleiner dan';
+$labels['countislessthanequal'] = 'aantal is kleiner dan of gelijk aan';
+$labels['countequals'] = 'aantal is gelijk aan';
+$labels['countnotequals'] = 'aantal is niet gelijk aan';
+$labels['valueisgreaterthan'] = 'waarde is groter dan';
+$labels['valueisgreaterthanequal'] = 'waarde is groter dan of gelijk aan';
+$labels['valueislessthan'] = 'waarde is minder dan';
+$labels['valueislessthanequal'] = 'waarde is minder dan of gelijk aan';
+$labels['valueequals'] = 'waarde is gelijk aan';
+$labels['valuenotequals'] = 'waarde is niet gelijk aan';
+$labels['userpart'] = 'gebruikersdeel is gelijk aan';
+$labels['notuserpart'] = 'gebruikersdeel is niet gelijk aan';
+$labels['detailpart'] = 'detaildeel is gelijk aan';
+$labels['notdetailpart'] = 'detaildeel is niet gelijk aan';
+$labels['domainpart'] = 'domeindeel is gelijk aan';
+$labels['notdomainpart'] = 'domeindeel is niet gelijk aan';
+$labels['teststring'] = 'Testwaarde';
+$labels['messagemoveto'] = 'Verplaats bericht naar';
+$labels['messageredirect'] = 'Verstuur bericht door naar';
+$labels['messageimapflags'] = 'Markeer bericht als';
+$labels['messagereject'] = 'Weiger met bericht';
+$labels['messagevacation'] = 'Afwezigheidsbericht';
+$labels['messagekeep'] = 'Bericht behouden';
+$labels['messagediscard'] = 'Ontdoen van bericht';
+$labels['messagenotify'] = 'Verstuur notificatie';
+$labels['messagestop'] = 'Stop filterverwerking';
+$labels['messagehelp'] = 'Wat is dit?';
+$labels['sieveorigsubj'] = 'Voeg origineel onderwerp toe aan reactie';
+$labels['sievevachandle'] = 'Reactienaam (\'handle\')';
+$labels['method'] = 'Methode';
+$labels['options'] = 'Opties';
+$labels['messagesrules'] = 'Filterregels';
+$labels['messagesactions'] = 'Filteracties';
+$labels['sieveto'] = 'Aliassen';
+$labels['sievefrom'] = 'Van';
+$labels['flag'] = 'Belangrijkheid';
+$labels['importancen'] = 'Geen';
+$labels['importance1'] = 'Hoog';
+$labels['importance2'] = 'Normaal';
+$labels['importance3'] = 'Laag';
+$labels['flagread'] = 'Gelezen';
+$labels['flagdeleted'] = 'Verwijderd';
+$labels['flaganswered'] = 'Beantwoord';
+$labels['flagdraft'] = 'Concept';
+$labels['flagflagged'] = 'Gemarkeerd';
+$labels['addsieverule'] = 'Nieuwe regel onder deze';
+$labels['addsieveact'] = 'Nieuwe actie onder deze';
+$labels['deletesieverule'] = 'Verwijder deze regel';
+$labels['deletesieveact'] = 'Verwijder deze actie';
+$labels['envelopefrom'] = 'Envelop Van';
+$labels['envelopeto'] = 'Envelop Aan';
+$labels['otherheader'] = 'Andere header';
+$labels['days'] = 'Periode';
+$labels['message'] = 'Bericht';
+$labels['sieveruleheaders'] = 'Bekijk voorbeelden van andere headers';
+$labels['examplefilters'] = 'Voorbeelden filters';
+$labels['importfilters'] = 'Importeer filters';
+$labels['usedefaultfilter'] = 'Gebruik standaardfilters';
+$labels['importfilter'] = 'Importeer filters';
+$labels['moreactions'] = 'Meer opties...';
+$labels['adveditor'] = 'Geavanceerde editor';
+$labels['stdeditor'] = 'Standaard editor';
+$labels['messageredirectcopy'] = 'Verstuur kopie naar';
+$labels['messagecopyto'] = 'Kopie bericht naar';
+$labels['body'] = 'Bericht';
+$labels['auto'] = 'Automatisch';
+$labels['raw'] = 'Bron';
+$labels['text'] = 'Tekst';
+$labels['other'] = 'Anders';
+$labels['bodycontentpart'] = 'Inhoudsgedeelte';
+$labels['notchecked'] = 'niet gecontroleerd';
+$labels['spamlevelisgreaterthanequal'] = 'is groter dan of gelijk aan';
+$labels['spamlevelislessthanequal'] = 'is kleiner dan of gelijk aan';
+$labels['spamlevelequals'] = 'is gelijk aan';
+$labels['i;ascii-casemap'] = 'hoofdlettergevoelige vergelijking';
+$labels['i;octet'] = 'exacte vergelijking';
+$labels['i;ascii-numeric'] = 'numerieke vergelijking';
+$labels['selectruleset'] = 'Selecteer regelset';
+$labels['activeruleset'] = '%s (actief)';
+$labels['activateruleset'] = 'Activeer deze regelset';
+$labels['isactive'] = 'Actieve regelset';
+$labels['isinactive'] = 'Inactieve regelset';
+$labels['newruleset'] = 'Maak een nieuwe regelset';
+$labels['delruleset'] = 'Verwijder deze regelset';
+$labels['renameruleset'] = 'Hernoem deze regelset';
+$labels['copy'] = 'Kopie';
+$labels['copyexistingfilter'] = 'Kopieer bestaande filters';
+$labels['copytoruleset'] = 'Kopieer filter naar een andere regelset';
+$labels['copyfromruleset'] = 'Kopieer filters van bestaande regelset';
+$labels['time'] = 'Tijd';
+$labels['weekday'] = 'Weekdag';
+$labels['virustest'] = 'Virus waarschijnlijkheid';
+$labels['novirus'] = 'geen virus gevonden';
+$labels['virusremoved'] = 'virus gevonden en verwijderd';
+$labels['viruscured'] = 'virus gevonden en genezen';
+$labels['possiblevirus'] = 'bericht bevat mogelijk een virus';
+$labels['definitevirus'] = 'bericht bevat hoogstwaarschijnlijk een virus';
+$labels['addheader'] = 'Header toevoegen';
+$labels['removeheader'] = 'Header verwijderen';
+$labels['headername'] = 'Header naam';
+$labels['headervalue'] = 'Header waarde';
+$labels['headerappend'] = 'Toevoegen aan bestaande header.';
+$labels['headerindex'] = 'Header index';
+$labels['headerdelall'] = 'allen';
+$labels['last'] = 'laatste';
+
+$messages = array();
+$messages['nosieverules'] = 'Geen filters gevonden.';
+$messages['filterdeleteconfirm'] = 'Weet u zeker dat u dit filter wilt verwijderen?';
+$messages['ruledeleteconfirm'] = 'Weet u zeker dat u deze regel wilt verwijderen?';
+$messages['actiondeleteconfirm'] = 'Weet u zeker dat u deze actie wilt verwijderen?';
+$messages['filterunknownerror'] = 'Onbekende serverfout';
+$messages['filterconnerror'] = 'Kan geen verbinding maken met de managesieve server';
+$messages['filterdeleteerror'] = 'Kan filter niet verwijderen. Er is een fout opgetreden';
+$messages['filterdeleted'] = 'Filter succesvol verwijderd';
+$messages['filtersaved'] = 'Filter succesvol opgeslagen';
+$messages['filtersaveerror'] = 'Kan filter niet opslaan. Er is een fout opgetreden.';
+$messages['vacdaysexp'] = 'De periode is het aantal dagen dat een bericht niet opnieuw wordt verzonden naar dezelfde ontvanger, ongeacht het aantal keer dat deze contact opneemt.<br /><br />Voorbeeld: Als Jan u op maandag emailt en de periode is op 7 ingesteld dan zal Jan op maandag een afwezigheidsbericht ontvangen, maar geen andere tot de daaropvolgende maandag, ongeacht het aantal emails welke hij gedurende de week verstuurt.';
+$messages['vachandleexp'] = 'Een reactienaam of handle kan verschillende afwezigheidsberichten groeperen, zodat er binnen een periode slechts een enkel afwezigheidsbericht met dezelfde reactienaam wordt verstuurd.';
+$messages['vactoexp'] = 'Lijst van extra adressen welke bij een afwezigsheidmelding gebruikt worden. Meldingen worden alleen verzonden als het bericht aan het standaard adres of een adres in deze lijst gericht is.';
+$messages['vactoexp_adv'] = 'Scheid meerdere aliases met een komma (,). Bijvoorbeeld: test1@example.com,test2@example.com,test3@example.com';
+$messages['vactoexp_err'] = 'Fout: Meerdere aliases moeten met een komma (,) worden gescheiden';
+$messages['norulename'] = 'Vul een naam in voor dit filter';
+$messages['ruleexists'] = 'Deze naam is al in gebruik voor een ander filter, voer a.u.b. een andere in';
+$messages['noheader'] = 'Vul een naam voor de kop in om te testen';
+$messages['headerbadchars'] = 'Fout: de kop bevat ongeldige tekens';
+$messages['noheadervalue'] = 'Vul een waarde in om met de kop te testen';
+$messages['sizewrongformat'] = 'Fout: berichtgrootte is niet numeriek';
+$messages['noredirect'] = 'Vul een e-mailadres in om berichten naar door te sturen';
+$messages['redirectaddresserror'] = 'Fout: ongeldig e-mailadres';
+$messages['noreject'] = 'Vul een bericht in om mee te zenden met geweigerde e-mail';
+$messages['vacnodays'] = 'Vul het aantal dagen in voor de periode waarin het bericht niet opnieuw naar dezelfde persoon wordt verzonden';
+$messages['vacdayswrongformat'] = '\'Fout: De periode moet groter dan of gelijk aan 1 zijn';
+$messages['vacnomsg'] = 'Vul tekst in voor uw bericht';
+$messages['notifynomethod'] = 'Kies een verzendmethode voor de notificatie';
+$messages['notifynomsg'] = 'Vul tekst in voor uw melding';
+$messages['sieveruleexp'] = 'Maak een of meer regels waaraan een bericht moet voldoen. Filters worden uitgevoerd in de volgorde zoals deze links op het scherm zijn te zien. Als aan een regel wordt voldaan dan worden eventuele volgende regels genegeerd.';
+$messages['sieveruleexp_stop'] = 'Maak een of meer regels waaraan een bericht moet voldoen. Filters worden uitgevoerd in de volgorde zoals deze links op het scherm zijn te zien totdat een \'Stop\' aktie optreedt';
+$messages['sieveactexp'] = '\'Maak een keuze uit onderstaande opties. Deze acties worden uitgevoerd voor elk bericht dat aan bovenstaande regels voldoet.';
+$messages['sieveheadershlp'] = 'Hieronder staan voorbeelden van andere koppen die kunnen worden getest door de filters. Kies een kop om toe te voegen aan de regel of vul een kop in in het invoerveld.';
+$messages['movingfilter'] = 'Bezig met filter verplaatsen...';
+$messages['noexistingfilters'] = 'Geen bestaande filters gevonden!';
+$messages['importdefault'] = '\'<b>Gebruik standaardfilters:</b> Er is een set van standaardfilters beschikbaar. Wilt u deze filters gebruiken?';
+$messages['importother'] = '<b>Import filters:</b> Er is een andere set filters van %s gevonden. Wilt u deze filters in uw huidige set importeren?';
+$messages['switchtoadveditor'] = 'U kunt het \'Sieve\' bestand rechtstreeks wijzigen via de geavanceerde editor. Veranderingen zijn mogelijk onleesbaar in de standaardeditor en kunnen verloren gaan als filters via de standaardeditor worden opgeslagen. Wilt u doorgaan?';
+$messages['filterimported'] = 'Filter succesvol geimporteerd';
+$messages['filterimporterror'] = 'Kan filter niet importeren. Er is een fout opgetreden.';
+$messages['notifyinvalidmethod'] = 'De methode is in een ongeldig formaat (URI) geschreven. Voorbeeld: `mailto:alert@example.com`.';
+$messages['nobodycontentpart'] = 'Vul een inhoudsgedeelte in om te testen';
+$messages['badoperator'] = 'De gekozen operator kan niet in deze regel worden gebruikt';
+$messages['filteractionerror'] = 'De server ondersteund deze actie niet';
+$messages['filtermissingerror'] = 'Regel niet gevonden';
+$messages['contentpartexp'] = 'Het MIME-type of specifiek gedeelte van het bericht welke getest moet worden. Bijvoorbeeld: `message/rfc822`, `text/html`, `audio/mp3` or `image`.';
+$messages['delrulesetconf'] = 'Weet u zeker dat u deze regelset wilt verwijderen?';
+$messages['rulesetexists'] = 'Er is al een regelset met deze naam, voer a.u.b. een andere in';
+$messages['copyexisting'] = '<b>Bestaande regelset kopie&euml;ren:</b> Wilt u filters van een bestaande regelset naar u huidige regelset kopie&euml;ren?';
+$messages['filtercopied'] = 'Filter succesvol gekopieerd';
+$messages['nosieverulesets'] = 'Geen regelsets gevonden.';
+$messages['baddateformat'] = 'Fout: Vul de datum in het JJJJ-MM-DD in';
+$messages['badtimeformat'] = 'Fout: Vul de tijd in het format UU:MM:SS in';
+$messages['missingfoldername'] = 'Fout: Vul een mapnaam in';
+$messages['eheadernoname'] = 'Fout: Vul een header naam in';
+$messages['eheadernoval'] = 'Fout: Vul een header waarde in';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/pl_PL.inc b/plugins/sieverules/localization/pl_PL.inc
new file mode 100644
index 000000000..4f1de93f8
--- /dev/null
+++ b/plugins/sieverules/localization/pl_PL.inc
@@ -0,0 +1,205 @@
+<?php
+/* Author: Bartosz Mierzwiak */
+
+$labels = array();
+$labels['filters'] = 'Filtry';
+$labels['filtersname'] = 'Filtry ($name)';
+$labels['managefilters'] = 'Zarządzaj filtrami';
+$labels['filtername'] = 'Nazwa reguły:';
+$labels['disablerule'] = 'Wyłącz regułę';
+$labels['disabled'] = 'Wyłączona';
+$labels['newfilter'] = 'Nowy filtr';
+$labels['moveup'] = 'Przenieś wyżej';
+$labels['movedown'] = 'Przenieś niżej';
+$labels['filterallof'] = 'spełniające wszystkie poniższe kryteria';
+$labels['filteranyof'] = 'spełniające dowolne z poniższych kryteriów';
+$labels['filterany'] = 'wszystkie wiadomości';
+$labels['filtercontains'] = 'zawiera';
+$labels['filternotcontains'] = 'nie zawiera';
+$labels['filteris'] = 'jest równa';
+$labels['filterisnot'] = 'nie jest równa';
+$labels['filterexists'] = 'istnieje';
+$labels['filternotexists'] = 'nie istnieje';
+$labels['filterregex'] = 'pasuje do wyrażenia regularnego';
+$labels['filternotregex'] = 'nie pasuje do wyrażenia regularnego ';
+$labels['filterunder'] = 'jest mniejsza niż';
+$labels['filterover'] = 'jest większa niż';
+$labels['filterbefore'] = 'jest wcześniejsza';
+$labels['filterafter'] = 'jest późniejsza';
+$labels['filteradvoptions'] = 'więcej opcji...';
+$labels['spamtest'] = 'Przypuszczalnie Spam';
+$labels['operator'] = 'Operator';
+$labels['comparator'] = 'Komparator';
+$labels['isgreaterthan'] = 'jest większe od';
+$labels['isgreaterthanequal'] = 'jest większa lub równa';
+$labels['islessthan'] = 'jest mniejsza niż';
+$labels['islessthanequal'] = 'jest mniejsza lub równa';
+$labels['equals'] = 'jest równy';
+$labels['notequals'] = 'nie równa się';
+$labels['countisgreaterthan'] = 'liczba jest większa niż';
+$labels['countisgreaterthanequal'] = 'liczba jest większa lub równa';
+$labels['countislessthan'] = 'liczba jest równa';
+$labels['countislessthanequal'] = 'liczba jest mniejsza niż';
+$labels['countequals'] = 'liczba jest równa';
+$labels['countnotequals'] = 'liczba jest inna niż';
+$labels['valueisgreaterthan'] = 'wartość jest wyższa niż';
+$labels['valueisgreaterthanequal'] = 'wartość jest większa lub równa';
+$labels['valueislessthan'] = 'wartość jest mniejsza niż';
+$labels['valueislessthanequal'] = 'wartość jest mniejsza lub równa';
+$labels['valueequals'] = 'wartość jest równa';
+$labels['valuenotequals'] = 'wartość jest inna niż';
+$labels['userpart'] = 'część użytkowników jest równa';
+$labels['notuserpart'] = 'część użytkowników jest inna niż';
+$labels['detailpart'] = 'część szczegółów jest równa';
+$labels['notdetailpart'] = 'część szczegółów jest inna niż';
+$labels['domainpart'] = 'część domeny zawiera';
+$labels['notdomainpart'] = 'część domeny nie zawiera';
+$labels['teststring'] = 'Łańcuch testowy';
+$labels['messagemoveto'] = 'Przenieś wiadomość do';
+$labels['messageredirect'] = 'Przekierowanie wiadomości';
+$labels['messageimapflags'] = 'Oznacz wiadomość jako';
+$labels['messagereject'] = 'Odrzuć wiadomość';
+$labels['messagevacation'] = 'Automatyczna odpowiedź';
+$labels['messagekeep'] = 'Zachowaj wiadomość';
+$labels['messagediscard'] = 'Odrzuć wiadomość';
+$labels['messagenotify'] = 'Wyślij zgłoszenie';
+$labels['messagestop'] = 'Nie sprawdzaj kolejnych filtrów';
+$labels['messagehelp'] = 'Co to jest?';
+$labels['sieveorigsubj'] = 'Dołącz oryginalny przedmiot odpowiedzi';
+$labels['sievevachandle'] = 'Obsłuż';
+$labels['method'] = 'Metoda';
+$labels['options'] = 'Opcje';
+$labels['messagesrules'] = 'Reguły filtra';
+$labels['messagesactions'] = 'Filtr działania';
+$labels['sieveto'] = 'alians';
+$labels['sievefrom'] = 'Z';
+$labels['flag'] = 'Ważność';
+$labels['importancen'] = 'Najwyższa';
+$labels['importance1'] = 'Wysoka';
+$labels['importance2'] = 'Normalna';
+$labels['importance3'] = 'Niska';
+$labels['flagread'] = 'Odebrane';
+$labels['flagdeleted'] = 'Usunięto';
+$labels['flaganswered'] = 'Odpowiedział';
+$labels['flagdraft'] = 'Projekt';
+$labels['flagflagged'] = 'Oflagowane';
+$labels['addsieverule'] = 'Dodaj nowy przepis, poniżej tej jednej';
+$labels['addsieveact'] = 'Dodaj kolejne działania, pod tym jednym';
+$labels['deletesieverule'] = 'Usuń tę regułę';
+$labels['deletesieveact'] = 'Usuń to działanie';
+$labels['envelopefrom'] = 'Adres Nadawcy';
+$labels['envelopeto'] = 'Adres Odbiorcy';
+$labels['otherheader'] = 'Inny nagłówek';
+$labels['days'] = 'Liczba dni';
+$labels['message'] = 'Wiadomość';
+$labels['sieveruleheaders'] = 'Pokaż przykłady innych nagłówków';
+$labels['examplefilters'] = 'Przykłady filtrów';
+$labels['importfilters'] = 'Importuj filtry';
+$labels['usedefaultfilter'] = 'Użyj domyślnych filtrów';
+$labels['importfilter'] = 'Importuj filtr';
+$labels['moreactions'] = 'Więcej opcji...';
+$labels['adveditor'] = 'Zaawansowana edycja';
+$labels['stdeditor'] = 'Edytor standardowy';
+$labels['messageredirectcopy'] = 'Wyślij kopię wiadomości do:';
+$labels['messagecopyto'] = 'Kopiuj wiadomość do:';
+$labels['body'] = 'Cała wiadomość';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Raw';
+$labels['text'] = 'Text';
+$labels['other'] = 'Inny';
+$labels['bodycontentpart'] = 'Zawartość części';
+$labels['notchecked'] = 'nie sprawdza';
+$labels['spamlevelisgreaterthanequal'] = 'jest większa lub równa';
+$labels['spamlevelislessthanequal'] = 'jest mniejsza lub równa';
+$labels['spamlevelequals'] = 'jest równa';
+$labels['i;ascii-casemap'] = 'przypadek-ignorowania łańcucha dopasowania';
+$labels['i;octet'] = 'dopasowanie łańcucha';
+$labels['i;ascii-numeric'] = 'numeryczne dopasowanie';
+$labels['selectruleset'] = 'Zaznacz zestaw reguł';
+$labels['activeruleset'] = '%s (aktywna)';
+$labels['activateruleset'] = 'Aktywuj zestaw reguł';
+$labels['isactive'] = 'Aktywny zestaw reguł';
+$labels['isinactive'] = 'Niekatywny zestaw reguł';
+$labels['newruleset'] = 'Utwórz nowy zestaw reguł';
+$labels['delruleset'] = 'Usuń ten zestaw reguł';
+$labels['renameruleset'] = 'Zmień nazwę tego zestawu reguł';
+$labels['copy'] = 'Kopiuj';
+$labels['copyexistingfilter'] = 'Kopiuj istniejące filtry';
+$labels['copytoruleset'] = 'Kopiuj filtr do innego zestawu reguł';
+$labels['copyfromruleset'] = 'Kopiuj filtry z istniejącego zestawu reguł';
+$labels['time'] = 'Czas';
+$labels['weekday'] = 'Dzień tygodnia';
+$labels['virustest'] = 'Prawdopodobieństwo wirusa';
+$labels['novirus'] = 'nie znaleziono wirusa';
+$labels['virusremoved'] = 'wirus znaleziony i usunięty';
+$labels['viruscured'] = 'wirus znaleziony i zneutralizowany';
+$labels['possiblevirus'] = 'wiadomość może zawierać wirusa';
+$labels['definitevirus'] = 'wiadomość może zawierać groźnego wirusa';
+$labels['addheader'] = 'Dodaj nagłówek';
+$labels['removeheader'] = 'Usuń nagłówek';
+$labels['headername'] = 'Nazwa nagłówka';
+$labels['headervalue'] = 'Wartość nagłówka';
+$labels['headerappend'] = 'Dodaj do istniejącego nagłówka wiadomości';
+$labels['headerindex'] = 'Indeks nagłówka';
+$labels['headerdelall'] = 'wszystkie zdarzenia';
+$labels['last'] = 'ostatni';
+
+$messages = array();
+$messages['nosieverules'] = 'Nie znaleziono filtrów.';
+$messages['filterdeleteconfirm'] = 'Czy na pewno chcesz usunąć ten filtr?';
+$messages['ruledeleteconfirm'] = 'Czy na pewno chcesz usunąć tę regułę?';
+$messages['actiondeleteconfirm'] = 'Czy na pewno chcesz usunąć tę zasadę działania? ';
+$messages['filterunknownerror'] = 'Nieznany błąd serwera.';
+$messages['filterconnerror'] = 'Nie można się połączyć z serwerem filtrów';
+$messages['filterdeleteerror'] = 'Nie można usunąć filtru. Błąd serwera!';
+$messages['filterdeleted'] = 'Filtr został usunięty';
+$messages['filtersaved'] = 'Filtr zapisany';
+$messages['filtersaveerror'] = 'Nie można zapisać filtra - Błąd serwera!';
+$messages['vacdaysexp'] = 'Okres to liczba dni, podczas których wiadomość nie zostanie wysłana ponownie do tego samego użytkownika, bez względu na to ile razy próbował się z tobą skontaktować. Na przykład: Jeśli Jasio wyśle wiadomości e-mail w poniedziałek, a okres ten zostanie ustawiony na 7 dni, Małgosia otrzyma automatyczną odpowiedź w poniedziałek, ale nie będzie dostawała kolejnych do następnego poniedziałku, bez względu na liczbę wiadomości e-mail wysłanych w ciągu tygodnia.';
+$messages['vachandleexp'] = 'Uchwyt może być stosowany do łączenia różnych komunikatów razem, gdy jedna wiadomość została wysłana, żadne inne wiadomości nie bedą wysyłane w tym okresie.';
+$messages['vactoexp'] = 'Lista dodatkowych adresów odbiorców, które są zawarte w automatycznej odpowiedzi.';
+$messages['vactoexp_adv'] = 'Rozdziel adresy aliasów przecinkiem (,). Na przykład: test1@example.com,test2@example.com,test3@example.com';
+$messages['vactoexp_err'] = 'Błąd: Adresy aliasów muszą być rodzielone przecinkiem (,)';
+$messages['norulename'] = 'Proszę podać nazwę tego filtru';
+$messages['ruleexists'] = 'Filtr o takiej nazwie już istnieje. Proszę podać inną nazwę!';
+$messages['noheader'] = 'Proszę wprowadzić nazwę nagłówka do badania';
+$messages['headerbadchars'] = 'Błąd: Nagłówek zawiera zakazane znaki!';
+$messages['noheadervalue'] = 'Proszę wprowadzić wartość do badań nagłówka.';
+$messages['sizewrongformat'] = 'Błąd: Rozmiar wiadomości musi być określony numeryczne';
+$messages['noredirect'] = 'Proszę podać adres e-mail aby przekierować wiadomości';
+$messages['redirectaddresserror'] = 'Błąd: Adres wydaje się nieprawidłowy';
+$messages['noreject'] = 'Proszę wprowadzić treść wiadomości, aby wysłać e-mail z komunikatem odrzucenia';
+$messages['vacnodays'] = 'Proszę podać liczbę dni w okresie, w którym wiadomość nie zostanie wysłana ponownie do tej samej osoby';
+$messages['vacdayswrongformat'] = 'Błąd: Okres ten musi być liczbą większą lub równą 1 ';
+$messages['vacnomsg'] = 'Proszę wprowadzić treść do Twojej wiadomości generowanej automatycznie';
+$messages['notifynomethod'] = 'Proszę wprowadzić metodę, dzięki której zgłoszenie powinno być wysłane';
+$messages['notifynomsg'] = 'Proszę wprowadzić treść do Twojej wiadomości';
+$messages['sieveruleexp'] = 'Proszę określić jedną lub więcej reguł z których każda wiadomość będzie testowane. Filtry są uruchamiane w kolejności, w jakiej znajdują się na lewo od ekranu, jeśli nie zostaną znalezione żadne dodatkowe, filtry zostaną przetestowane.';
+$messages['sieveruleexp_stop'] = 'Proszę podać jedną lub więcej reguł jakimi testowana będzie wiadomość. Filtry będą używane w kolejności w jakiej widnieją po lewej stronie tego ekranu, do momentu dotarcia do akcji \'Stop\'.';
+$messages['sieveactexp'] = 'Proszę wybrać jedną z poniższych opcji. Działania te będą wykonywane dla wszystkich wiadomości pasujących do reguł(y).';
+$messages['sieveheadershlp'] = 'Poniżej kilka przykładów innych nagłówków, które mogą być badane przez filtry. Wybierz nagłówek, aby dodać go do przepisu lub wprowadź własny w polu powyżej.';
+$messages['movingfilter'] = 'Przemieszczanie filtra...';
+$messages['noexistingfilters'] = 'Nie znaleziono istniejących filtrów!';
+$messages['importdefault'] = 'Użyj domyślnego zestawu filtrów: Nie ma domyślnie dostępnego zestawu filtrów. Chcesz używać tych filtrów? ';
+$messages['importother'] = 'Importuj filtry: Kolejny zestaw filtrów %s zostało znalezione. Czy chcesz zaimportować te filtry do bieżącego zestawu?';
+$messages['switchtoadveditor'] = 'Przełącz na zaawansowany edytor pozwala na edycję plików bezpośrednio sito. Wszelkie zmiany w tym względzie może być nieczytelne w normalnym edytorze i mogą zostać utracone, gdy filtry są zapisywane przy użyciu normalnego edytora. Czy chcesz kontynuować? ';
+$messages['filterimported'] = 'Filtr zaimportowany';
+$messages['filterimporterror'] = 'Nie można zaimportować filtra. Błąd serwera!';
+$messages['notifyinvalidmethod'] = 'Ta metoda ma nieprawidłowy format, podaj URI. Na przykład: "mailto: alert@example.com".';
+$messages['nobodycontentpart'] = 'Proszę wprowadzić zawartość strony do testowania';
+$messages['badoperator'] = 'Przepraszamy, wybrany operator nie może być stosowany w tej regule.';
+$messages['filteractionerror'] = 'Żądane działanie nie jest obsługiwane przez serwer!';
+$messages['filtermissingerror'] = 'Nie można znaleźć treści reguły';
+$messages['contentpartexp'] = 'Typ MIME lub określonej części wiadomości, które powinny być badane. Na przykład: "message/rfc822`, `text/html`, `audio/mp3` lub `image`.';
+$messages['delrulesetconf'] = 'Czy na pewno chcesz usunąć ten zestaw reguł?';
+$messages['rulesetexists'] = 'Reguła o takiej nazwie już istnieje. Proszę podać inną nazwę';
+$messages['copyexisting'] = 'Kopiowanie istniejącego zestawu reguł: Czy chcesz skopiować filtry z istniejącego zestawu reguł do bieżącego zestawu?';
+$messages['filtercopied'] = 'Filtr przekopiowany';
+$messages['nosieverulesets'] = 'Nie znaleziono zestawu filtrów.';
+$messages['baddateformat'] = 'Błąd: Podaj datę w formacie YYYY-MM-DD';
+$messages['badtimeformat'] = 'Błąd: Podaj czas w formacie HH:MM:SS';
+$messages['missingfoldername'] = 'Błąd: Podaj nazwę folderu';
+$messages['eheadernoname'] = 'Błąd: Podaj nazwę nagłówka';
+$messages['eheadernoval'] = 'Błąd: Podaj wartość nagłówka';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/pt_BR.inc b/plugins/sieverules/localization/pt_BR.inc
new file mode 100644
index 000000000..1cf68551a
--- /dev/null
+++ b/plugins/sieverules/localization/pt_BR.inc
@@ -0,0 +1,183 @@
+<?php
+/* Author: Pedro Padron */
+
+$labels = array();
+$labels['filters'] = 'Filtros';
+$labels['managefilters'] = 'Gerenciar filtros';
+$labels['filtername'] = 'Nome do filtro';
+$labels['disablerule'] = 'Desativar regra';
+$labels['disabled'] = 'Desativado';
+$labels['newfilter'] = 'Novo filtro';
+$labels['moveup'] = 'Mover para cima';
+$labels['movedown'] = 'Mover para baixo';
+$labels['filterallof'] = 'corresponde a todas as seguintes regras';
+$labels['filteranyof'] = 'corresponde a uma das seguintes regras';
+$labels['filterany'] = 'todas as mensagens';
+$labels['filtercontains'] = 'contém';
+$labels['filternotcontains'] = 'não contém';
+$labels['filteris'] = 'é igual a';
+$labels['filterisnot'] = 'é diferente de';
+$labels['filterexists'] = 'existe';
+$labels['filternotexists'] = 'não existe';
+$labels['filterregex'] = 'corresponde à expressão';
+$labels['filternotregex'] = 'não corresponde à expressão';
+$labels['filterunder'] = 'é inferior a';
+$labels['filterover'] = 'é superior a';
+$labels['filterbefore'] = 'é antes';
+$labels['filterafter'] = 'é depois';
+$labels['filteradvoptions'] = 'mais opções...';
+$labels['spamtest'] = 'Probabilidade de Spam';
+$labels['operator'] = 'Operador';
+$labels['comparator'] = 'Comparador';
+$labels['isgreaterthan'] = 'é maior que';
+$labels['isgreaterthanequal'] = 'é maior ou igual a';
+$labels['islessthan'] = 'é menor que';
+$labels['islessthanequal'] = 'é menor ou igual a';
+$labels['equals'] = 'é igual a';
+$labels['notequals'] = 'é diferente de';
+$labels['countisgreaterthan'] = 'contagem é maior que';
+$labels['countisgreaterthanequal'] = 'contagem é maior ou igual a';
+$labels['countislessthan'] = 'contagem é menor que';
+$labels['countislessthanequal'] = 'contagem é menor ou igual a';
+$labels['countequals'] = 'contagem é igual a';
+$labels['countnotequals'] = 'contagem é diferente de';
+$labels['valueisgreaterthan'] = 'valor é maior que';
+$labels['valueisgreaterthanequal'] = 'valor é maior ou igual a';
+$labels['valueislessthan'] = 'valor é menor que';
+$labels['valueislessthanequal'] = 'valor é menor ou igual a';
+$labels['valueequals'] = 'valor é igual a';
+$labels['valuenotequals'] = 'valor diferente de';
+$labels['userpart'] = 'parte do utilizador igual a';
+$labels['notuserpart'] = 'parte do utilizador diferente de';
+$labels['detailpart'] = 'parte do detalhe igual a';
+$labels['notdetailpart'] = 'parte do detalhe diferente de';
+$labels['domainpart'] = 'parte do domínio igual a';
+$labels['notdomainpart'] = 'parte do domínio diferente de';
+$labels['teststring'] = 'Texto de teste';
+$labels['messagemoveto'] = 'Mover mensagem para';
+$labels['messageredirect'] = 'Redirecionar mensagem para';
+$labels['messageimapflags'] = 'Marcar mensagem como';
+$labels['messagereject'] = 'Rejeitar com a mensagem';
+$labels['messagevacation'] = 'Mensagem de Fora do Escritório';
+$labels['messagekeep'] = 'Manter mensagem';
+$labels['messagediscard'] = 'Rejeitar mensagem';
+$labels['messagenotify'] = 'Enviar notificação';
+$labels['messagestop'] = 'Parar o processamento de filtros';
+$labels['messagehelp'] = 'O que é isto?';
+$labels['sieveorigsubj'] = 'Acrescentar assunto original à resposta';
+$labels['sievevachandle'] = 'Identificador';
+$labels['method'] = 'Método';
+$labels['options'] = 'Opções';
+$labels['messagesrules'] = 'Regras para Filtros';
+$labels['messagesactions'] = 'Ações para Filtros';
+$labels['sieveto'] = 'Alias';
+$labels['sievefrom'] = 'De';
+$labels['flag'] = 'Importância';
+$labels['importancen'] = 'Nenhum';
+$labels['importance1'] = 'Alta';
+$labels['importance2'] = 'Normal';
+$labels['importance3'] = 'Baixa';
+$labels['flagread'] = 'Lida';
+$labels['flagdeleted'] = 'Eliminada';
+$labels['flaganswered'] = 'Respondida';
+$labels['flagdraft'] = 'Rascunho';
+$labels['flagflagged'] = 'Marcada';
+$labels['addsieverule'] = 'Adicionar outra regra, depois desta';
+$labels['addsieveact'] = 'Adicionar outra ação, depois desta';
+$labels['deletesieverule'] = 'Eliminar esta regra';
+$labels['deletesieveact'] = 'Eliminar esta ação';
+$labels['envelopefrom'] = 'Envelope De';
+$labels['envelopeto'] = 'Envelope Para';
+$labels['otherheader'] = 'Outro cabeçalho';
+$labels['days'] = 'Periodo';
+$labels['message'] = 'Mensagem';
+$labels['sieveruleheaders'] = 'Ver exemplos de outros cabecalhos';
+$labels['examplefilters'] = 'Exemplo de Filtros';
+$labels['importfilters'] = 'Importar Filtros';
+$labels['usedefaultfilter'] = 'Usar filtros predefinidos';
+$labels['importfilter'] = 'Importar filtros';
+$labels['moreactions'] = 'Mais opções...';
+$labels['adveditor'] = 'Editor avançado';
+$labels['stdeditor'] = 'Editor padrão';
+$labels['messageredirectcopy'] = 'Enviar cópia para';
+$labels['messagecopyto'] = 'Copiar mensagem para';
+$labels['body'] = 'Corpo';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Raw';
+$labels['text'] = 'Texto';
+$labels['other'] = 'Outro';
+$labels['bodycontentpart'] = 'Parte Conteúdo';
+$labels['notchecked'] = 'não verificado';
+$labels['spamlevelisgreaterthanequal'] = 'é maior ou igual a';
+$labels['spamlevelislessthanequal'] = 'é menor ou igual a';
+$labels['spamlevelequals'] = 'é igual a';
+$labels['i;ascii-casemap'] = 'correspondência de texto indeferente a maiúsculas e minúsculas';
+$labels['i;octet'] = 'correspondência exata do texto';
+$labels['i;ascii-numeric'] = 'correspondência numérica';
+$labels['selectruleset'] = 'Selecionar conjunto de regras';
+$labels['activeruleset'] = '%s (ativo)';
+$labels['activateruleset'] = 'Ativar este conjunto de regras';
+$labels['newruleset'] = 'Criar um no grupo de regras';
+$labels['delruleset'] = 'Eliminar este conjunto de regras';
+$labels['renameruleset'] = 'Renomear este conjunto de regras';
+$labels['copy'] = 'Copiar';
+$labels['copyexistingfilter'] = 'Copiar filtros existentes';
+$labels['copytoruleset'] = 'Copiar o filtro para outro conjunto de regras';
+$labels['copyfromruleset'] = 'Copiar filtros de um conjunto regras existente';
+$labels['time'] = 'Tempo';
+$labels['weekday'] = 'dia da semana';
+
+$messages = array();
+$messages['nosieverules'] = 'Nenhum filtro encontrado.';
+$messages['filterdeleteconfirm'] = 'Tem a certeza que pretende eliminar este filtro?';
+$messages['ruledeleteconfirm'] = 'Tem a certeza que pretende eliminar esta regra?';
+$messages['actiondeleteconfirm'] = 'Tem a certeza que pretende eliminar esta ação?';
+$messages['filterunknownerror'] = 'Erro de servidor desconhecido';
+$messages['filterconnerror'] = 'Não foi possível conectar ao servidor Sieve';
+$messages['filterdeleteerror'] = 'Não foi possível eliminar o filtro. Erro no servidor';
+$messages['filterdeleted'] = 'Filtro eliminado com sucesso';
+$messages['filtersaved'] = 'Filtro salvo com sucesso';
+$messages['filtersaveerror'] = 'Não foi possível salvar o filtro. Erro no servidor';
+$messages['vacdaysexp'] = 'O período é o número de dias durante o qual a mensagem não será reenviada para o mesmo remetente, não importando quantas vezes ele entre contato.<br/><br/>Por exemplo: Se João lhe enviar e-mails na segunda-feira e o período estiver definido para 7 dias, João irá receber uma mensagem de Fora do Escritório na segunda-feira, mas não irá receber mais nenhuma até à segunda-feira seguinte, não importando quantos e-mails ele lhe envie durante a semana.';
+$messages['vachandleexp'] = 'Um identificador pode ser usado para ligar as diferentes mensagens de Fora do Escritório em conjunto, uma vez que uma mensagem foi enviada nenhuma outra com o mesmo identificador será enviada.';
+$messages['vactoexp'] = 'Lista de endereços de destinatários adicionais que estão incluídos na resposta automática. Se um destinatário de e-mail não for seu endereço principal e não estiver nesta lista, nenhuma mensagem será enviada.';
+$messages['norulename'] = 'Por favor, indique um nome para este filtro';
+$messages['ruleexists'] = 'Já existe um filtro com este nome. Por favor, indique outro';
+$messages['noheader'] = 'Por favor, indique o nome do cabeçalho para testar';
+$messages['headerbadchars'] = 'Erro: O cabeçalho contém caracteres proibidos';
+$messages['noheadervalue'] = 'Por favor indique um valor para testar o cabeçalho contra';
+$messages['sizewrongformat'] = 'Erro: O tamanho da mensagem deve ser numérico';
+$messages['noredirect'] = 'Indique um endereço de e-mail para redirecionar as mensagens';
+$messages['redirectaddresserror'] = 'Erro: O endereço de e-mail parece ser inválido';
+$messages['noreject'] = 'Indique uma mensagem para enviar juntamente com o e-mail rejeitado';
+$messages['vacnodays'] = 'Por favor insira um número de dias para o período em que a mensagem não será reenviado para a mesma pessoa';
+$messages['vacdayswrongformat'] = 'Erro: O período deve ser um número maior ou igual a 1';
+$messages['vacnomsg'] = 'Insira o texto para a sua mensagem';
+$messages['notifynomethod'] = 'Por favor, indique um método pelo qual a notificação deve ser enviada';
+$messages['notifynomsg'] = 'Insira o texto para a sua mensagem';
+$messages['sieveruleexp'] = 'Por favor, defina uma ou mais regras sobre as quais cada mensagem será testada. Os filtros são executados na ordem em que aparecem à esquerda da tela, se for encontrada uma correspondência mais nenhum filtro será testado.';
+$messages['sieveruleexp_stop'] = 'Por favor, defina uma ou mais regras sobre as quais cada mensagem será testada. Os filtros são executados na ordem em que aparecem à esquerda da tela até uma ação de \'Stop\' ser encontrada.';
+$messages['sieveactexp'] = 'Por favor, selecione uma das opções abaixo. Essas ações serão realizadas para qualquer mensagem correspondente à(s) regra(s) acima.';
+$messages['sieveheadershlp'] = 'Abaixo estão alguns exemplos de outros cabeçalhos que podem ser testados pelos filtros. Selecione um cabeçalho para adicioná-lo à regra, ou introduza um personalizado na caixa acima.';
+$messages['movingfilter'] = 'Movendo filtro...';
+$messages['noexistingfilters'] = 'Não foi detectado nenhum filtro existente!';
+$messages['importdefault'] = '<b>Usar filtros predefinidos:</b> Há um conjunto de filtros predefinidos disponíveis. Gostaria de usar esses filtros?';
+$messages['importother'] = '<b>Importação de filtros:</b>Foi encontrado outro conjunto de filtros de %s. Gostaria de importar esses filtros para o seu conjunto actual?';
+$messages['switchtoadveditor'] = 'Mudando para o editor avançado é possível editar o arquivo Sieve diretamente. Quaisquer alterações aqui efetuadas podem ser ilegíveis no editor normal e podem ser perdidas quando os filtros são guardados usando o editor normal. Deseja continuar?';
+$messages['filterimported'] = 'Filtro importado com sucesso';
+$messages['filterimporterror'] = 'Não foi possível importar o filtro. Ocorreu um erro no servidor.';
+$messages['notifyinvalidmethod'] = 'O método parece não estar escrito num formato válido, ele deve ser uma URL. Por exemplo: "mailto: alert@example.com».';
+$messages['nobodycontentpart'] = 'Por favor, indique uma parte de conteúdo para testar';
+$messages['badoperator'] = 'O operador seleccionado não pode ser usado nesta regra';
+$messages['filteractionerror'] = 'A ação solicitada não é suportada pelo servidor';
+$messages['filtermissingerror'] = 'Não foi possível encontrar a regra solicitada';
+$messages['contentpartexp'] = 'O tipo de MIME ou parte específica da mensagem que deve ser testado. Por exemplo: `text/html`, `audio/mp3` or `image`.';
+$messages['delrulesetconf'] = 'Tem certeza que quer eliminar este conjunto de regras?';
+$messages['rulesetexists'] = 'Um conjunto de regras com este nome já existe. Por favor, indique outro nome';
+$messages['copyexisting'] = '<b>Copiar conjunto de regras existente:</b>Gostaria de copiar os filtros de um conjunto de de regras existente para o seu conjunto actual?';
+$messages['filtercopied'] = 'Filtro copiado com sucesso';
+$messages['nosieverulesets'] = 'Nenhum conjunto de regras encontrado.';
+$messages['baddateformat'] = 'Erro: Indique a data no formato AAAA-MM-DD';
+$messages['badtimeformat'] = 'Erro: Indique a hora no formato HH:MM:SS';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/pt_PT.inc b/plugins/sieverules/localization/pt_PT.inc
new file mode 100644
index 000000000..5b3dffc24
--- /dev/null
+++ b/plugins/sieverules/localization/pt_PT.inc
@@ -0,0 +1,183 @@
+<?php
+/* Author: Ling Fude */
+
+$labels = array();
+$labels['filters'] = 'Filtros';
+$labels['managefilters'] = 'Gerir filtros';
+$labels['filtername'] = 'Nome do filtro';
+$labels['disablerule'] = 'Desactivar regra';
+$labels['disabled'] = 'Desactivado';
+$labels['newfilter'] = 'Novo filtro';
+$labels['moveup'] = 'Mover para cima';
+$labels['movedown'] = 'Mover para baixo';
+$labels['filterallof'] = 'corresponde a todas as seguintes regras';
+$labels['filteranyof'] = 'corresponde a uma das seguintes regras';
+$labels['filterany'] = 'todas as mensagens';
+$labels['filtercontains'] = 'contém';
+$labels['filternotcontains'] = 'não contém';
+$labels['filteris'] = 'é igual a';
+$labels['filterisnot'] = 'é diferente de';
+$labels['filterexists'] = 'existe';
+$labels['filternotexists'] = 'não existe';
+$labels['filterregex'] = 'corresponde à expressão';
+$labels['filternotregex'] = 'não corresponde à expressão';
+$labels['filterunder'] = 'é inferior a';
+$labels['filterover'] = 'é superior a';
+$labels['filterbefore'] = 'é antes';
+$labels['filterafter'] = 'é depois';
+$labels['filteradvoptions'] = 'mais opções...';
+$labels['spamtest'] = 'Probabilidade de Spam';
+$labels['operator'] = 'Operador';
+$labels['comparator'] = 'Comparador';
+$labels['isgreaterthan'] = 'é maior que';
+$labels['isgreaterthanequal'] = 'é maior ou igual a';
+$labels['islessthan'] = 'é menor que';
+$labels['islessthanequal'] = 'é menor ou igual a';
+$labels['equals'] = 'é igual a';
+$labels['notequals'] = 'é diferente de';
+$labels['countisgreaterthan'] = 'contagem é maior que';
+$labels['countisgreaterthanequal'] = 'contagem é maior ou igual a';
+$labels['countislessthan'] = 'contagem é menor que';
+$labels['countislessthanequal'] = 'contagem é menor ou igual a';
+$labels['countequals'] = 'contagem é igual a';
+$labels['countnotequals'] = 'contagem é diferente de';
+$labels['valueisgreaterthan'] = 'valor é maior que';
+$labels['valueisgreaterthanequal'] = 'valor é maior ou igual a';
+$labels['valueislessthan'] = 'valor é menor que';
+$labels['valueislessthanequal'] = 'valor é menor ou igual a';
+$labels['valueequals'] = 'valor é igual a';
+$labels['valuenotequals'] = 'valor diferente de';
+$labels['userpart'] = 'parte do utilizador igual a';
+$labels['notuserpart'] = 'parte do utilizador diferente de';
+$labels['detailpart'] = 'parte do detalhe igual a';
+$labels['notdetailpart'] = 'parte do detalhe diferente de';
+$labels['domainpart'] = 'parte do domínio igual a';
+$labels['notdomainpart'] = 'parte do domínio diferente de';
+$labels['teststring'] = 'Texto de teste';
+$labels['messagemoveto'] = 'Mover mensagem para';
+$labels['messageredirect'] = 'Redirecionar mensagem para';
+$labels['messageimapflags'] = 'Marcar mensagem como';
+$labels['messagereject'] = 'Rejeitar com a mensagem';
+$labels['messagevacation'] = 'Mensagem Fora do Escritório';
+$labels['messagekeep'] = 'Manter mensagem';
+$labels['messagediscard'] = 'Rejeitar mensagem';
+$labels['messagenotify'] = 'Enviar notificação';
+$labels['messagestop'] = 'Parar o processamento de filtros';
+$labels['messagehelp'] = 'O que é isto?';
+$labels['sieveorigsubj'] = 'Acrescentar assunto original à resposta';
+$labels['sievevachandle'] = 'Identificador';
+$labels['method'] = 'Método';
+$labels['options'] = 'Opções';
+$labels['messagesrules'] = 'Regras para Filtros';
+$labels['messagesactions'] = 'Acções para Filtros';
+$labels['sieveto'] = 'Alias';
+$labels['sievefrom'] = 'De';
+$labels['flag'] = 'Importância';
+$labels['importancen'] = 'Nenhum';
+$labels['importance1'] = 'Alta';
+$labels['importance2'] = 'Normal';
+$labels['importance3'] = 'Baixa';
+$labels['flagread'] = 'Lida';
+$labels['flagdeleted'] = 'Eliminada';
+$labels['flaganswered'] = 'Respondida';
+$labels['flagdraft'] = 'Rascunho';
+$labels['flagflagged'] = 'Marcada';
+$labels['addsieverule'] = 'Adicionar outra regra, depois desta';
+$labels['addsieveact'] = 'Adicionar outra acção, depois desta';
+$labels['deletesieverule'] = 'Eliminar esta regra';
+$labels['deletesieveact'] = 'Eliminar esta acção';
+$labels['envelopefrom'] = 'Envelope De';
+$labels['envelopeto'] = 'Envelope Para';
+$labels['otherheader'] = 'Outro cabeçalho';
+$labels['days'] = 'Periodo';
+$labels['message'] = 'Mensagem';
+$labels['sieveruleheaders'] = 'Ver exemplos de outros cabecalhos';
+$labels['examplefilters'] = 'Exemplo de Filtros';
+$labels['importfilters'] = 'Importar Filtros';
+$labels['usedefaultfilter'] = 'Usar filtros predefinidos';
+$labels['importfilter'] = 'Importar filtros';
+$labels['moreactions'] = 'Mais opções...';
+$labels['adveditor'] = 'Editor avançado';
+$labels['stdeditor'] = 'Editor padrão';
+$labels['messageredirectcopy'] = 'Enviar cópia para';
+$labels['messagecopyto'] = 'Copiar mensagem para';
+$labels['body'] = 'Corpo';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Raw';
+$labels['text'] = 'Texto';
+$labels['other'] = 'Outro';
+$labels['bodycontentpart'] = 'Parte Conteúdo';
+$labels['notchecked'] = 'não verificado';
+$labels['spamlevelisgreaterthanequal'] = 'é maior ou igual a';
+$labels['spamlevelislessthanequal'] = 'é menor ou igual a';
+$labels['spamlevelequals'] = 'é igual a';
+$labels['i;ascii-casemap'] = 'correspondência de texto indeferente a maiúsculas e minúsculas';
+$labels['i;octet'] = 'correspondência exacta do texto';
+$labels['i;ascii-numeric'] = 'correspondência numérica';
+$labels['selectruleset'] = 'Seleccionar conjunto de regras';
+$labels['activeruleset'] = '%s (activo)';
+$labels['activateruleset'] = 'Activar este conjunto de regras';
+$labels['newruleset'] = 'Criar um no grupo de regras';
+$labels['delruleset'] = 'Eliminar este conjunto de regras';
+$labels['renameruleset'] = 'Renomear este conjunto de regras';
+$labels['copy'] = 'Copiar';
+$labels['copyexistingfilter'] = 'Copiar filtros existentes';
+$labels['copytoruleset'] = 'Copiar o filtro para outro conjunto de regras';
+$labels['copyfromruleset'] = 'Copiar filtros de um conjunto regras existente';
+$labels['time'] = 'Tempo';
+$labels['weekday'] = 'dia da semana';
+
+$messages = array();
+$messages['nosieverules'] = 'Nenhum filtro encontrado.';
+$messages['filterdeleteconfirm'] = 'Tem a certeza que pretende eliminar este filtro?';
+$messages['ruledeleteconfirm'] = 'Tem a certeza que pretende eliminar esta regra?';
+$messages['actiondeleteconfirm'] = 'Tem a certeza que pretende eliminar esta acção?';
+$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. Erro no servidor';
+$messages['filterdeleted'] = 'Filtro eliminado com sucesso';
+$messages['filtersaved'] = 'Filtro guardado com sucesso';
+$messages['filtersaveerror'] = 'Não foi possível guardar o filtro. Erro no servidor';
+$messages['vacdaysexp'] = 'O período é o número de dias durante o qual a mensagem não será reenviado para o mesmo remetente, não importa quantas vezes ele entre contacto consigo.<br/><br/>Por exemplo: Se o João lhe enviar e-mails na segunda-feira e o período está definido para 7 dias, o João irá receber uma mensagem de Fora do Escritório na segunda-feira, mas não irá receber mais nenhuma até à segunda-feira seguinte, não importa quantos e-mails ele lhe envie durante a semana.';
+$messages['vachandleexp'] = 'Um identificador pode ser usado para ligar as diferentes mensagens de Fora do Escritório em conjunto, uma vez que uma mensagem for enviada nenhuma outra mensagem com o mesmo identificador será enviada no mesmo período.';
+$messages['vactoexp'] = 'Lista de endereços de destinatários adicionais que estão incluídos na resposta automática. Se um destinatário de e-mail não é o seu endereço principal e não está nesta lista, nenhuma mensagem será enviada.';
+$messages['norulename'] = 'Por favor, indique um nome para este filtro';
+$messages['ruleexists'] = 'Já existe um filtro com este nome. Por favor, indique outro';
+$messages['noheader'] = 'Por favor, indique o nome do cabeçalho para testar';
+$messages['headerbadchars'] = 'Erro: O cabeçalho contém caracteres proibidos';
+$messages['noheadervalue'] = 'Por favor indique um valor para testar o cabeçalho contra';
+$messages['sizewrongformat'] = 'Erro: O tamanho da mensagem deve ser numérico';
+$messages['noredirect'] = 'Indique um endereço de e-mail para redirecionar as mensagens';
+$messages['redirectaddresserror'] = 'Erro: O endereço de e-mail parece ser inválido';
+$messages['noreject'] = 'Indique uma mensagem para enviar juntamente com o e-mail rejeitado';
+$messages['vacnodays'] = 'Por favor insira um número de dias para o período em que a mensagem não será reenviado para a mesma pessoa';
+$messages['vacdayswrongformat'] = 'Erro: O período deve ser um número maior ou igual a 1';
+$messages['vacnomsg'] = 'Insira o texto para a sua mensagem';
+$messages['notifynomethod'] = 'Por favor, indique um método pelo qual a notificação deve ser enviada';
+$messages['notifynomsg'] = 'Insira o texto para a sua mensagem';
+$messages['sieveruleexp'] = 'Por favor, defina uma ou mais regras sobre as quais cada mensagem será testada. Os filtros são executados na ordem em que aparecem à esquerda do ecrã, se for encontrada uma correspondência mais nenhum filtro será testado.';
+$messages['sieveruleexp_stop'] = 'Por favor, defina uma ou mais regras sobre as quais cada mensagem será testada. Os filtros são executados na ordem em que aparecem à esquerda do ecrã até uma acção de \'Stop\' ser encontrada.';
+$messages['sieveactexp'] = 'Por favor, seleccione uma das opções abaixo. Essas acções serão realizadas para qualquer mensagem correspondente à(s) regra(s) acima.';
+$messages['sieveheadershlp'] = 'Abaixo estão alguns exemplos de outros cabeçalhos que podem ser testados pelos filtros. Selecione um cabeçalho para adicioná-lo à regra, ou introduza um personalizado na caixa acima.';
+$messages['movingfilter'] = 'A mover filtro...';
+$messages['noexistingfilters'] = 'Não foi detectado nenhum filtro existente!';
+$messages['importdefault'] = '<b>Usar filtros predefinidos:</b> Há um conjunto de filtros predefinidos disponíveis. Gostaria de usar esses filtros?';
+$messages['importother'] = '<b>Importação de filtros:</b>Foi encontrado outro conjunto de filtros de %s. Gostaria de importar esses filtros para o seu conjunto actual?';
+$messages['switchtoadveditor'] = 'Mudando para o editor avançado permite editar o ficheiro Sieve directamente. Quaisquer alterações aqui efectuadas podem ser ilegíveis no editor normal e podem ser perdidas quando os filtros são guardados usando o editor normal. Deseja continuar?';
+$messages['filterimported'] = 'Filtro importado com sucesso';
+$messages['filterimporterror'] = 'Não foi possível importar o filtro. Ocorreu um erro no servidor.';
+$messages['notifyinvalidmethod'] = 'O método parece não estar escrito num formato válido, ele deve ser um URL. Por exemplo: "mailto: alert@example.com».';
+$messages['nobodycontentpart'] = 'Por favor, indique uma parte de conteúdo para testar';
+$messages['badoperator'] = 'O operador seleccionado não pode ser usado nesta regra';
+$messages['filteractionerror'] = 'A acção solicitada não é suportada pelo servidor';
+$messages['filtermissingerror'] = 'Não foi possível encontrar a regra solicitada';
+$messages['contentpartexp'] = 'O tipo de MIME ou parte específica da mensagem que deve ser testado. Por exemplo: `text/html`, `audio/mp3` or `image`.';
+$messages['delrulesetconf'] = 'Tem certeza que quer eliminar este conjunto de regras?';
+$messages['rulesetexists'] = 'Um conjunto de regras com este nome já existe. Por favor, indique outro nome';
+$messages['copyexisting'] = '<b>Copiar conjunto de regras existente:</b>Gostaria de copiar os filtros de um conjunto de de regras existente para o seu conjunto actual?';
+$messages['filtercopied'] = 'Filtro copiado com sucesso';
+$messages['nosieverulesets'] = 'Nenhum conjunto de regras encontrado.';
+$messages['baddateformat'] = 'Erro: Indique a data no formato AAAA-MM-DD';
+$messages['badtimeformat'] = 'Erro: Indique a hora no formato HH:MM:SS';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/ro_RO.inc b/plugins/sieverules/localization/ro_RO.inc
new file mode 100644
index 000000000..f8dce4c02
--- /dev/null
+++ b/plugins/sieverules/localization/ro_RO.inc
@@ -0,0 +1,175 @@
+<?php
+/* Author: Ovidiu Bica */
+
+$labels = array();
+$labels['filters'] = 'Filtre';
+$labels['managefilters'] = 'Administrează filtrele';
+$labels['filtername'] = 'Nume filtru';
+$labels['disablerule'] = 'Dezactivează regula';
+$labels['disabled'] = 'Dezactivat';
+$labels['newfilter'] = 'Filtru nou';
+$labels['moveup'] = 'Mută sus';
+$labels['movedown'] = 'Mută jos';
+$labels['filterallof'] = 'îndeplineşte toate regulile de mai jos';
+$labels['filteranyof'] = 'îndeplineşte oricare regula de mai jos';
+$labels['filterany'] = 'toate mesajele';
+$labels['filtercontains'] = 'conţine';
+$labels['filternotcontains'] = 'nu conţine';
+$labels['filteris'] = 'este egal cu';
+$labels['filterisnot'] = 'nu este egal cu';
+$labels['filterexists'] = 'există';
+$labels['filternotexists'] = 'nu există';
+$labels['filterregex'] = 'indeplineşte expresia';
+$labels['filternotregex'] = 'nu indeplineşte expresia';
+$labels['filterunder'] = 'este mai puţin de';
+$labels['filterover'] = 'este mai mult de';
+$labels['filteradvoptions'] = 'mai multe opţiuni';
+$labels['spamtest'] = 'Probabilitate de spam';
+$labels['operator'] = 'Operator';
+$labels['comparator'] = 'Comparator';
+$labels['isgreaterthan'] = 'este mai mare de';
+$labels['isgreaterthanequal'] = 'este mai mare sau egal cu';
+$labels['islessthan'] = 'este mai mic de';
+$labels['islessthanequal'] = 'este mai mic sau egal cu';
+$labels['equals'] = 'este egal cu';
+$labels['notequals'] = 'nu este egal';
+$labels['countisgreaterthan'] = 'numărul este mai mare de';
+$labels['countisgreaterthanequal'] = 'numărul este mai mare sau egal cu';
+$labels['countislessthan'] = 'numărul este mai mic de';
+$labels['countislessthanequal'] = 'numărul este mai mic sau egal cu';
+$labels['countequals'] = 'numărul este egal cu';
+$labels['countnotequals'] = 'numărul nu este egal cu';
+$labels['valueisgreaterthan'] = 'valoarea este mai mare de';
+$labels['valueisgreaterthanequal'] = 'valoarea este mai mare sau egală cu';
+$labels['valueislessthan'] = 'valoarea este mai mică de';
+$labels['valueislessthanequal'] = 'valoarea este mai mică sau egală cu';
+$labels['valueequals'] = 'valoarea este egala cu';
+$labels['valuenotequals'] = 'valoarea nu este egală';
+$labels['userpart'] = 'utilizatorul este';
+$labels['notuserpart'] = 'utilizatorul nu este';
+$labels['detailpart'] = 'detaliul este';
+$labels['notdetailpart'] = 'detaliul nu este';
+$labels['domainpart'] = 'domeniul este';
+$labels['notdomainpart'] = 'domeniul nu este';
+$labels['teststring'] = 'mesaj de test';
+$labels['messagemoveto'] = 'Mută mesajul în';
+$labels['messageredirect'] = 'Redirectionează mesajul la';
+$labels['messageimapflags'] = 'Marchează mesajul ca';
+$labels['messagereject'] = 'Refuză mesajul cu';
+$labels['messagevacation'] = 'Mesaj - Plecat din birou';
+$labels['messagekeep'] = 'Păastrează mesajul';
+$labels['messagediscard'] = 'Refuză mesajul';
+$labels['messagenotify'] = 'Trimite notificare';
+$labels['messagestop'] = 'Opreşte procesarea filtrelor';
+$labels['messagehelp'] = 'Ce este asta?';
+$labels['sieveorigsubj'] = 'Atasează subiectul original la răspuns';
+$labels['sievevachandle'] = 'Foloseşte';
+$labels['method'] = 'Metodă';
+$labels['options'] = 'Opţiuni';
+$labels['messagesrules'] = 'Reguli filtrare';
+$labels['messagesactions'] = 'Acţiuni filtrare';
+$labels['sieveto'] = 'Sinonime';
+$labels['sievefrom'] = 'De la';
+$labels['flag'] = 'Importanţă';
+$labels['importancen'] = 'Nici unul';
+$labels['importance1'] = 'Mare';
+$labels['importance2'] = 'Normal';
+$labels['importance3'] = 'Scăzut';
+$labels['flagread'] = 'Citit';
+$labels['flagdeleted'] = 'Şters';
+$labels['flaganswered'] = 'Răspuns';
+$labels['flagdraft'] = 'Ciornă';
+$labels['flagflagged'] = 'Marcat';
+$labels['addsieverule'] = 'Adaugă o nouă regulă sub aceasta';
+$labels['addsieveact'] = 'Adaugă o nouă acţiune sub aceasta';
+$labels['deletesieverule'] = 'Şterge această regulă';
+$labels['deletesieveact'] = 'Şterge această acţiune';
+$labels['envelopefrom'] = 'Mesaj de la';
+$labels['envelopeto'] = 'Mesaj către';
+$labels['otherheader'] = 'Alt cuprins';
+$labels['days'] = 'Perioadă';
+$labels['message'] = 'Mesaj';
+$labels['sieveruleheaders'] = 'Vezi exemple de alte cuprinsuri';
+$labels['examplefilters'] = 'Exemple de filtre';
+$labels['importfilters'] = 'Importa filtre';
+$labels['usedefaultfilter'] = 'Foloseste filtre implicite';
+$labels['importfilter'] = 'Importa filtru';
+$labels['adveditor'] = 'Editor avansat';
+$labels['messageredirectcopy'] = 'Trimite o copie către';
+$labels['messagecopyto'] = 'Copiază mesajul către';
+$labels['body'] = 'Conţinut';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Brut';
+$labels['text'] = 'Text';
+$labels['other'] = 'Altul';
+$labels['bodycontentpart'] = 'Conţinut';
+$labels['notchecked'] = 'neverificat';
+$labels['spamlevelisgreaterthanequal'] = 'este mai mare sau egal cu';
+$labels['spamlevelislessthanequal'] = 'este mai mic sau egal cu';
+$labels['spamlevelequals'] = 'este egal cu';
+$labels['i;ascii-casemap'] = 'potrivire caractere mici/mari';
+$labels['i;octet'] = 'potrivire exactă';
+$labels['i;ascii-numeric'] = 'potrivire numerică';
+$labels['selectruleset'] = 'Selectează setul de reguli';
+$labels['activeruleset'] = '%s (activ)';
+$labels['activateruleset'] = 'Activează acest set de reguli';
+$labels['newruleset'] = 'Crează un nou set de reguli';
+$labels['delruleset'] = 'Sterge acest set de reguli';
+$labels['renameruleset'] = 'Redenumeşte acest set de reguli';
+$labels['copy'] = 'Copiază';
+$labels['copyexistingfilter'] = 'Copiază filtre existente';
+$labels['copytoruleset'] = 'Copiază filtrul la un alt set de reguli';
+$labels['copyfromruleset'] = 'Copiază filtrele de la un set de reguli existent';
+
+$messages = array();
+$messages['nosieverules'] = 'Nu a fost găsit niciun filtru.';
+$messages['filterdeleteconfirm'] = 'Eşti sigur că doreşti să ştergi acest filtru?';
+$messages['ruledeleteconfirm'] = 'Eşti sigur că doreşti să ştergi această regulă?';
+$messages['actiondeleteconfirm'] = 'Eşti sigur că doreşti să ştergi această acţiune?';
+$messages['filterunknownerror'] = 'Eroare de server necunoscută.';
+$messages['filterconnerror'] = 'Nu m-am putut conecta la serverul Sieve.';
+$messages['filterdeleteerror'] = 'Nu am putut şterge filtrul. Eroare de server.';
+$messages['filterdeleted'] = 'Filtru şters cu succes.';
+$messages['filtersaved'] = 'Filtru salvat cu succes.';
+$messages['filtersaveerror'] = 'Nu am putut salva filtrul. Eroare de server.';
+$messages['vacdaysexp'] = 'Perioada este numărul de zile în care mesajul nu va fi retrimis persoanei indiferent de câte ori te va contacta.<br /><br />De exemplu: Dacă Ion iţi trimite un email luni şi perioada este setată la 7 zile, atunci Ion va primi un mesaj OUT of OFFICE luni însă nu va mai primi niciunul pana lunea următoare indiferent de câte mesaje îţi va trimite.';
+$messages['vachandleexp'] = 'Poate fi folosită o regulă pentru a lega mesaje OUT of OFFICE împreună. Odată trimis un mesaj, nu va mai fi trimis niciun mesaj cu aceeasi regulă.';
+$messages['vactoexp'] = 'Lista adreselor de email aditionale care vor fi incluse in raspunsul automat. ';
+$messages['norulename'] = 'Te rog sa introduci un nume pentru acest filtru.';
+$messages['ruleexists'] = 'Un filtru cu acest nume există deja. Te rog să introduci altul.';
+$messages['noheader'] = 'Te rog să introduci numele headerului pentru verificare.';
+$messages['headerbadchars'] = 'Eroare: Headerul conţine caractere ilegale.';
+$messages['noheadervalue'] = 'Te rog să introduci o valoare pentru a testa headerul.';
+$messages['sizewrongformat'] = 'Eroare: Mărimea mesajului trebuie să fie numerică .';
+$messages['noredirect'] = 'Te rog să introduci o adresă de email pentru a redirecţiona mesajele.';
+$messages['redirectaddresserror'] = 'Eroare: Adresa nu pare să fie validă.';
+$messages['noreject'] = 'Te rog să introduci un mesaj pentru a fi trimis impreună cu mesajul de respingere.';
+$messages['vacnodays'] = 'Te rog să introduci o perioadă de zile în care mesaju';
+$messages['vacdayswrongformat'] = 'Eroare: Perioada trebuie să fie un număr mai mare sau egal cu 1.';
+$messages['vacnomsg'] = 'Te rog să introduci un text pentru mesaj.';
+$messages['notifynomethod'] = 'Te rog să introduci o metodă prin care să se trimită notificarea.';
+$messages['notifynomsg'] = 'Te rog să introduci un text pentru mesaj.';
+$messages['sieveruleexp'] = 'Te rog să introduci una sau mai multe reguli prin care va fi testat fiecare mesaj. Filtrele sunt aplicate în ordinea în care apar în stânga ecranului. Dacă este găsită o potrivire, niciun alt filtru nu va mai fi testat.';
+$messages['sieveruleexp_stop'] = 'Te rog să introduci una sau mai multe reguli prin care va fi testat fiecare mesaj. Filtrele sunt aplicate în ordinea în care apar în stânga ecranului până câand este găsită o acţiune de stopare.';
+$messages['sieveactexp'] = 'Te rog sa selectezi una din opţiunile de mai jos. Aceste acţiuni vor fi efectuate pentru orice mesaj ce se potriveşte regulilor de mai jos.';
+$messages['sieveheadershlp'] = 'Mai jos aveţi exemple de alte headere ce pot fi testate de către filtre. Selectează un header pentru a-l adăuga la regulă sau introdu una proprie în câmpul de mai sus.';
+$messages['movingfilter'] = 'Se mută filtrul ...';
+$messages['noexistingfilters'] = 'Nici un filtru existent ...';
+$messages['importdefault'] = '<b>Foloseşte filtrele implicite:</b>Există un set de filtre implicite. Doreşti să foloseşti aceste filtre?';
+$messages['importother'] = '<b>Importă filtre</b> Un alt set de filtre de la %s a fost găsit. Doreşti să imporţi aceste filtre in setul tău curent?';
+$messages['switchtoadveditor'] = 'Trecerea la editorul avansat iti permite să editezi fişierul sieve direct. Orice modificare faci aici poate fi de nedescifrat in editorul normal si poate fi pierdută atunci când filtrele sunt salvate folosind editorul normal. Doreşti să continui?';
+$messages['filterimported'] = 'Filtrul importat cu succes?';
+$messages['filterimporterror'] = 'Imposibil de importat filtrul. Eroare de server.';
+$messages['notifyinvalidmethod'] = 'Metoda nu pare a fi scrisă într-un format valid, trebuie să fie un URL. De ex. `mailto:ion@exemplu.com`';
+$messages['nobodycontentpart'] = 'Te rog să introduci un conţinut de probă.';
+$messages['badoperator'] = 'Îmi pare rău, operatorul selectat nu poate fi folosit în această regulă.';
+$messages['filteractionerror'] = 'Acţiunea cerută nu este suportată de server.';
+$messages['filtermissingerror'] = 'Imposibil de găsit regula cerută.';
+$messages['contentpartexp'] = 'Tipul MIME-Type sau o parte specifica din mesajul ce trebuie testat. De ex. `message/rfc822`, `text/html`, `audio/mp3` sau `image`.';
+$messages['delrulesetconf'] = 'Eşti sigur că doreşti să ştergi acest set de reguli?';
+$messages['rulesetexists'] = 'Un set de reguli cu acest nume există deja. Introdu altul.';
+$messages['copyexisting'] = '<b>Copiază setul de reguli existent:</b> Doreşti să copiezi filtrele dintr-un set de reguli existent in setul tău curent?';
+$messages['filtercopied'] = 'Filtrul copiat cu succes.';
+$messages['nosieverulesets'] = 'Niciun set de reguli găsit.';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/ru_RU.inc b/plugins/sieverules/localization/ru_RU.inc
new file mode 100644
index 000000000..12aaeea53
--- /dev/null
+++ b/plugins/sieverules/localization/ru_RU.inc
@@ -0,0 +1,182 @@
+<?php
+/* Author: Peter Zotov */
+
+$labels = array();
+$labels['filters'] = 'Фильтры';
+$labels['managefilters'] = 'управление фильтрами';
+$labels['filtername'] = 'Имя фильтра';
+$labels['disablerule'] = 'отключить правило';
+$labels['disabled'] = 'отключено';
+$labels['newfilter'] = 'Новый фильтр';
+$labels['moveup'] = 'вверх';
+$labels['movedown'] = 'вниз';
+$labels['filterallof'] = 'соответствует всем правилам';
+$labels['filteranyof'] = 'соответствует хотя бы одному из правил';
+$labels['filterany'] = 'все сообщения';
+$labels['filtercontains'] = 'содержит';
+$labels['filternotcontains'] = 'не содержит';
+$labels['filteris'] = 'совпадает с';
+$labels['filterisnot'] = 'не совпадает с';
+$labels['filterexists'] = 'существует';
+$labels['filternotexists'] = 'не существует';
+$labels['filterregex'] = 'соответствует регулярному выражению';
+$labels['filternotregex'] = 'не соответствует регулярному выражению';
+$labels['filterunder'] = 'меньше чем';
+$labels['filterover'] = 'больше чем';
+$labels['filterbefore'] = 'до';
+$labels['filterafter'] = 'после';
+$labels['filteradvoptions'] = 'другие...';
+$labels['spamtest'] = 'Вероятность спама';
+$labels['operator'] = 'Условие';
+$labels['comparator'] = 'Сравнение';
+$labels['isgreaterthan'] = 'больше чем';
+$labels['isgreaterthanequal'] = 'больше чем или равен';
+$labels['islessthan'] = 'меньше чем';
+$labels['islessthanequal'] = 'меньше чем или равен';
+$labels['equals'] = 'равен';
+$labels['notequals'] = 'не равен';
+$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['userpart'] = 'имя пользователя (перед \'@\' или \'+\') равно';
+$labels['notuserpart'] = 'имя пользователя не равно';
+$labels['detailpart'] = 'часть имени после \'+\' равна';
+$labels['notdetailpart'] = 'часть имени после \'+\' не равна';
+$labels['domainpart'] = 'имя домена (после \'@\') равно';
+$labels['notdomainpart'] = 'имя домена не равно';
+$labels['teststring'] = 'Сравнить со строкой';
+$labels['messagemoveto'] = 'переместить сообщения в';
+$labels['messageredirect'] = 'перенаправить сообщения на адрес';
+$labels['messageimapflags'] = 'пометить сообщения как';
+$labels['messagereject'] = 'отклонить с сообщением';
+$labels['messagevacation'] = 'сообщение "Нет на месте"';
+$labels['messagekeep'] = 'сохранить сообщение';
+$labels['messagediscard'] = 'отклонить сообщение';
+$labels['messagenotify'] = 'отправить уведомление';
+$labels['messagestop'] = 'прекратить обработку фильтров';
+$labels['messagehelp'] = 'Что это?';
+$labels['sieveorigsubj'] = 'Добавить тему исходного сообщения к ответу';
+$labels['sievevachandle'] = 'Метка';
+$labels['method'] = 'Способ';
+$labels['options'] = 'Параметры';
+$labels['messagesrules'] = 'Правила фильтра';
+$labels['messagesactions'] = 'Действия фильтра';
+$labels['sieveto'] = 'Адреса';
+$labels['sievefrom'] = 'От';
+$labels['flag'] = 'Важность';
+$labels['importancen'] = 'не указана';
+$labels['importance1'] = 'высокая';
+$labels['importance2'] = 'обычная';
+$labels['importance3'] = 'низкая';
+$labels['flagread'] = 'прочитано';
+$labels['flagdeleted'] = 'удалено';
+$labels['flaganswered'] = 'ответ написан';
+$labels['flagdraft'] = 'черновик';
+$labels['flagflagged'] = 'помечено';
+$labels['addsieverule'] = 'добавить правило';
+$labels['addsieveact'] = 'добавить дополнительное действие';
+$labels['deletesieverule'] = 'удалить правило';
+$labels['deletesieveact'] = 'удалить действие';
+$labels['otherheader'] = 'Другой заголовок';
+$labels['days'] = 'Периодичность';
+$labels['message'] = 'Сообщение';
+$labels['sieveruleheaders'] = 'посмотреть примеры других заголовков';
+$labels['examplefilters'] = 'Примеры фильтров';
+$labels['importfilters'] = 'Импорт фильтров';
+$labels['usedefaultfilter'] = 'Использовать фильтры по умолчанию';
+$labels['importfilter'] = 'Импортировать фильтры';
+$labels['moreactions'] = 'Другие варианты...';
+$labels['adveditor'] = 'Расширенный редактор';
+$labels['stdeditor'] = 'Стандартный редактор';
+$labels['messageredirectcopy'] = 'отослать копию на адрес';
+$labels['messagecopyto'] = 'сохранить копию в папку';
+$labels['body'] = 'Тело сообщения';
+$labels['auto'] = 'автоматически';
+$labels['raw'] = 'в исходнике';
+$labels['text'] = 'в тексте';
+$labels['other'] = 'часть сообщения';
+$labels['bodycontentpart'] = 'MIME-тип части сообщения';
+$labels['notchecked'] = 'не проверено';
+$labels['spamlevelisgreaterthanequal'] = 'больше чем или равна';
+$labels['spamlevelislessthanequal'] = 'меньше чем или равна';
+$labels['spamlevelequals'] = 'равна';
+$labels['i;ascii-casemap'] = 'сравнение строк без учета регистра';
+$labels['i;octet'] = 'точное сравнение строк';
+$labels['i;ascii-numeric'] = 'числовое сравнение';
+$labels['selectruleset'] = 'Выбрать набор правил';
+$labels['activeruleset'] = '%s (активный)';
+$labels['activateruleset'] = 'Активировать набор правил';
+$labels['newruleset'] = 'Создать набор правил';
+$labels['delruleset'] = 'Удалить набор правил';
+$labels['renameruleset'] = 'Переименовать набор правил';
+$labels['copy'] = 'Скопировать';
+$labels['copyexistingfilter'] = 'Скопировать существующие фильтры';
+$labels['copytoruleset'] = 'Скопировать фильтры в другой набор';
+$labels['copyfromruleset'] = 'Скопировать фильтры из существующего набора';
+$labels['time'] = 'Время';
+$labels['weekday'] = 'День недели';
+
+$messages = array();
+$messages['nosieverules'] = 'Фильтры не найдены.';
+$messages['filterdeleteconfirm'] = 'Вы уверены, что хотите удалить этот фильтр?';
+$messages['ruledeleteconfirm'] = 'Вы уверены, что хотите удалить это правило?';
+$messages['actiondeleteconfirm'] = 'Вы уверены, что хотите удалить это действие?';
+$messages['filterunknownerror'] = 'Неизвестная ошибка сервера.';
+$messages['filterconnerror'] = 'Невозможно соединиться с сервером sieve.';
+$messages['filterdeleteerror'] = 'Невозможно удалить фильтр. Возникла ошибка сервера.';
+$messages['filterdeleted'] = 'Фильтр успешно удален.';
+$messages['filtersaved'] = 'Фильтр успешно сохранен.';
+$messages['filtersaveerror'] = 'Невозможно сохранить фильтр. Возникла ошибка сервера.';
+$messages['vacdaysexp'] = 'Количество дней, в течение которого корреспонденты не будут получать повторные сообщения об вашем отсутствии, вне зависимости от того, сколько раз они вам написали за это время.<br /><br />Например: Если Вася написал вам письмо в понедельник и вы установили периодичность в 7 (дней), то Вася получит сообщение о Вашем отсутствии в понедельник, и больше не будет получать таких сообщений до следующего понедельника, даже если он писал вам много раз.';
+$messages['vachandleexp'] = 'Метка связывает несколько сообщений об отсутствии вместе: после того, как одно из них было отправлено, другие сообщения с той же меткой не будут отправляться в течение этого периода..';
+$messages['vactoexp'] = 'Список дополнительных адресов получателей, для которых будет работать "автоответчик". Ответы не будут отправляться, если адреса получателя принятого сообщения нет в этом списке.';
+$messages['vactoexp_adv'] = 'Несколько адресов разделяются запятой (,). Например, test1@example.com,test2@example.com,test3@example.com.';
+$messages['vactoexp_err'] = 'Ошибка: Несколько ардесов должны быть разделены запятыми.';
+$messages['norulename'] = 'Пожалуйста, введите имя для этого фильтра.';
+$messages['ruleexists'] = 'Фильтр с таким именем уже существует. Введите другое имя фильтра.';
+$messages['noheader'] = 'Пожалуйста, введите имя заголовка для проверки.';
+$messages['headerbadchars'] = 'Ошибка: указанная строка содержит запрещенные символы.';
+$messages['noheadervalue'] = 'Пожалуйста, введите значение для проверки заголовка.';
+$messages['sizewrongformat'] = 'Ошибка: размер сообщения должен быть числовым.';
+$messages['noredirect'] = 'Пожалуйста, введите адрес электронной почты для перенаправки сообщения.';
+$messages['redirectaddresserror'] = 'Ошибка: введен неверный адрес.';
+$messages['noreject'] = 'Пожалуйста, введите текст сообщения.';
+$messages['vacnodays'] = 'Пожалуйста, укажите периодичность отсылки уведомлений';
+$messages['vacdayswrongformat'] = 'Ошибка: Периодичность должна быть положительным целым числом';
+$messages['vacnomsg'] = 'Пожалуйста, введите текст сообщения.';
+$messages['notifynomethod'] = 'Пожалуйста, введите способ отправки уведомления.';
+$messages['notifynomsg'] = 'Пожалуйста, введите текст сообщения.';
+$messages['sieveruleexp'] = 'Пожалуйста, введите одно или несколько правил, согласно которым будут проверяться сообщения. Фильтры работают в том порядке, в котором они появляются слева. Если соответствие найдено, остальные фильтры тестироваться не будут.';
+$messages['sieveactexp'] = 'Пожалуйста, выберите одно или несколько действий. Эти действия будут выполняться для каждого сообщения, соответствующего вышеуказанным правилам.';
+$messages['sieveheadershlp'] = 'Ниже находятся несколько примеров заголовков, которые могут быть проверены фильтрами. Выберите заголовок, чтобы добавить его, либо введите другой в поле ввода.';
+$messages['movingfilter'] = 'Перемещение фильтра...';
+$messages['noexistingfilters'] = 'Фильтров не найдено!';
+$messages['importdefault'] = '<b>Фильтры по умолчанию:</b> Доступен набор фильтров по умолчанию. Использовать?';
+$messages['importother'] = '<b>Импорт фильтров:</b> Найден набор фильтров от приложения %s. Импортировать?';
+$messages['switchtoadveditor'] = 'Переключение в режим расширенного редактора позволяет редактировать исходный текст сценария \'sieve\'. Изменения, сделанные в этом режиме, могут не восприниматься графическим интерфейсом, и могут быть потеряны в случае сохранения фильтров в графическом интерфейсе. Продолжить?';
+$messages['filterimported'] = 'Фильтр успешно импортирован';
+$messages['filterimporterror'] = 'Ошибка сервера во время импорта фильтра. Импорт не выполнен';
+$messages['notifyinvalidmethod'] = 'Формат метода неверен. Нужно указать URI, например: «mailto:alert@example.com».';
+$messages['nobodycontentpart'] = 'Укажите часть тела сообщения';
+$messages['badoperator'] = 'Такой оператор не может использоваться в данном правиле';
+$messages['filteractionerror'] = 'Запрошенное действие не поддерживается сервером';
+$messages['filtermissingerror'] = 'Указанное правило не существует';
+$messages['contentpartexp'] = 'MIME-тип или часть сообщения для проверки. Например, «message/rfc822», «text/html», «audio/mp3» или «image».';
+$messages['delrulesetconf'] = 'Действительно удалить этот набор правил?';
+$messages['rulesetexists'] = 'Набор правил с таким названием уже существует. Выберите другое название.';
+$messages['copyexisting'] = '<b>Копирование существующего набора правил:</b> Скопировать фильтры из существующего набора правил в текущий набор?';
+$messages['filtercopied'] = 'Фильтры успешно скопированы';
+$messages['nosieverulesets'] = 'Наборы правил не найдены.';
+$messages['baddateformat'] = 'Ошибка: Дата должна вводиться в формате ГГГГ-ММ-ДД';
+$messages['badtimeformat'] = 'Ошибка: Время должно вводиться в формате ЧЧ:ММ:СС';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/sk_SK.inc b/plugins/sieverules/localization/sk_SK.inc
new file mode 100644
index 000000000..420ffbb88
--- /dev/null
+++ b/plugins/sieverules/localization/sk_SK.inc
@@ -0,0 +1,159 @@
+<?php
+/* Author: Michal Michalac */
+
+$labels = array();
+$labels['filters'] = 'Pravidlá';
+$labels['managefilters'] = 'Spravovať pravidlá';
+$labels['filtername'] = 'Názov pravidla';
+$labels['disablerule'] = 'Zakázať pravidlo';
+$labels['disabled'] = 'zakázané';
+$labels['newfilter'] = 'Nové pravidlo';
+$labels['moveup'] = 'Posunúť vyššie';
+$labels['movedown'] = 'Posunúť nižšie';
+$labels['filterallof'] = 'vyhovuje všetkým nasl. podmienkam';
+$labels['filteranyof'] = 'vyhovuje niektorej z nasl. podmienok';
+$labels['filterany'] = 'všetky správy';
+$labels['filtercontains'] = 'obsahuje';
+$labels['filternotcontains'] = 'neobsahuje';
+$labels['filteris'] = 'je presne';
+$labels['filterisnot'] = 'nie je';
+$labels['filterexists'] = 'existuje';
+$labels['filternotexists'] = 'neexistuje';
+$labels['filterregex'] = 'vyhovuje regulárnemu výrazu';
+$labels['filternotregex'] = 'nevyhovuje regulárnemu výrazu';
+$labels['filterunder'] = 'je menšie ako';
+$labels['filterover'] = 'je väčšie ako';
+$labels['filteradvoptions'] = 'viac volieb...';
+$labels['spamtest'] = 'Pravdepodobnosť spamu';
+$labels['operator'] = 'Operátor';
+$labels['comparator'] = 'Porovnanie';
+$labels['isgreaterthan'] = 'je väčšie ako';
+$labels['isgreaterthanequal'] = 'je väčšie, alebo rovné ako';
+$labels['islessthan'] = 'je menšie ako';
+$labels['islessthanequal'] = 'je menšie, alebo rovné ako';
+$labels['equals'] = 'je rovné';
+$labels['notequals'] = 'nie je rovné';
+$labels['countisgreaterthan'] = 'počet je väčší ako';
+$labels['countisgreaterthanequal'] = 'počet je väčší, alebo rovný ako';
+$labels['countislessthan'] = 'počet je menší ako';
+$labels['countislessthanequal'] = 'počet je menší, alebo rovný ako';
+$labels['countequals'] = 'počet je';
+$labels['countnotequals'] = 'počet nie je ';
+$labels['valueisgreaterthan'] = 'hodnota je väčšia ako';
+$labels['valueisgreaterthanequal'] = 'hodnota je väčšia, alebo rovná ako';
+$labels['valueislessthan'] = 'hodnota je menšia ako';
+$labels['valueislessthanequal'] = 'hodnota je menšia, alebo rovná ako';
+$labels['valueequals'] = 'hodnota je rovná';
+$labels['valuenotequals'] = 'hodnota nie je rovná';
+$labels['userpart'] = 'užívateľská časť sa zhoduje s';
+$labels['notuserpart'] = 'užívateľská časť sa nezhoduje s';
+$labels['detailpart'] = 'detail sa zhoduje s';
+$labels['notdetailpart'] = 'detail sa nezhoduje s';
+$labels['domainpart'] = 'doména sa zhoduje';
+$labels['notdomainpart'] = 'doména sa nezhoduje';
+$labels['teststring'] = 'Testovací text';
+$labels['messagemoveto'] = 'Presunúť správu do';
+$labels['messageredirect'] = 'Preposlať správu na';
+$labels['messageimapflags'] = 'Označiť správu ako';
+$labels['messagereject'] = 'Odmietnuť so správou';
+$labels['messagevacation'] = 'Dovolenka';
+$labels['messagekeep'] = 'Zachovať správu';
+$labels['messagediscard'] = 'Zrušiť správu';
+$labels['messagenotify'] = 'Zaslať upozornenie';
+$labels['messagestop'] = 'Ukončiť spracovanie pravidiel';
+$labels['messagehelp'] = 'Čo je toto?';
+$labels['sieveorigsubj'] = 'Pripojiť k odpovedi pôvodný predmet';
+$labels['sievevachandle'] = 'Odkaz';
+$labels['method'] = 'Metóda';
+$labels['options'] = 'Voľby';
+$labels['messagesrules'] = 'Podmienky pravidla';
+$labels['messagesactions'] = 'Akcie pravidla';
+$labels['sieveto'] = 'Aliasy';
+$labels['sievefrom'] = 'Od';
+$labels['flag'] = 'Dôležitosť';
+$labels['importancen'] = 'žiadna';
+$labels['importance1'] = 'vysoká';
+$labels['importance2'] = 'štandardná';
+$labels['importance3'] = 'nízka';
+$labels['flagread'] = 'Prečítanú';
+$labels['flagdeleted'] = 'Vymazanú';
+$labels['flaganswered'] = 'Zodpovedanú';
+$labels['flagdraft'] = 'Koncept';
+$labels['flagflagged'] = 'Označenú';
+$labels['addsieverule'] = 'Pridať ďalšiu podmienku';
+$labels['addsieveact'] = 'Pridať ďalšiu akciu';
+$labels['deletesieverule'] = 'Vymazať túto podmienku';
+$labels['deletesieveact'] = 'Vymazať túto akciu';
+$labels['envelopefrom'] = 'Odosielateľ na obálke';
+$labels['envelopeto'] = 'Adresát na obálke';
+$labels['otherheader'] = 'Iná hlavička';
+$labels['days'] = 'Obdobie';
+$labels['message'] = 'Správa';
+$labels['sieveruleheaders'] = 'Zobraziť príklady ďalších hlavičiek';
+$labels['examplefilters'] = 'Pripravené pravidlá';
+$labels['importfilters'] = 'Importovať pravidlá';
+$labels['usedefaultfilter'] = 'Použiť predvolené pravidlá';
+$labels['importfilter'] = 'Importovať pravidlo';
+$labels['adveditor'] = 'Pokročilý editor';
+$labels['messageredirectcopy'] = 'Preposlať kópiu na';
+$labels['messagecopyto'] = 'Kopírovať správu do';
+$labels['body'] = 'Telo';
+$labels['auto'] = 'Automatické';
+$labels['raw'] = 'Hrubé';
+$labels['text'] = 'Text';
+$labels['other'] = 'Iné';
+$labels['bodycontentpart'] = 'Obsah správy';
+$labels['notchecked'] = 'nekontrolovaný';
+$labels['spamlevelisgreaterthanequal'] = 'je väčší, alebo rovný ako';
+$labels['spamlevelislessthanequal'] = 'je menší, alebo rovný ako';
+$labels['spamlevelequals'] = 'je rovný';
+$labels['i;ascii-casemap'] = 'text sa zhoduje bez rozlíšenia veľkosti písmen';
+$labels['i;octet'] = 'text sa zhoduje';
+$labels['i;ascii-numeric'] = 'číslo sa zhoduje';
+
+$messages = array();
+$messages['nosieverules'] = 'Žiadne pravidlá neboli nájdené.';
+$messages['filterdeleteconfirm'] = 'Ste si istí, že chcete toto pravidlo naozaj vymazať?';
+$messages['ruledeleteconfirm'] = 'Ste si istí, že chcete túto podmienku naozaj vymazať?';
+$messages['actiondeleteconfirm'] = 'Ste si istí, že chcete túto akciu naozaj vymazať?';
+$messages['filterunknownerror'] = 'Neznáma chyba servera';
+$messages['filterconnerror'] = 'Nie je možné pripojiť sa k sieve serveru';
+$messages['filterdeleteerror'] = 'Pravidlo nie je možné vymazať. Vyskytla sa chyba serveru';
+$messages['filterdeleted'] = 'Pravidlo bolo úspešne vymazané';
+$messages['filtersaved'] = 'Pravidlo bolo úspešne uložené';
+$messages['filtersaveerror'] = 'Pravidlo nie je možné uložiť. Vyskytla sa chyba serveru';
+$messages['vacdaysexp'] = "Obdobie je počet dní, počas ktorého nebude správa posielaná rovnakému užívateľovi bez ohľadu na to, koľko krát Vás bude kontaktovať. Napr.: Ak si nastavíte obdobie na 7 (dní) a Jozef Vám pošle e-mail v pondelok, v stredu, v nedeľu a na ďalší pondelok, dostane správu o Vašej neprítomnosti vždy len v pondelok.";
+$messages['vachandleexp'] = 'Odkaz sa dá použiť na pripojenie iných dovolenkových správ. Každá z nich sa v nastavenom období použije len raz.';
+$messages['vactoexp'] = "Zoznam ďalších adresátov zahrnutých do automatického odpovedania. Ak e-mail nie je adresovaný na Vašu hlavnú e-mailovú adresu ani na adresu v tomto zozname, automatická odpoveď sa neposiela.";
+$messages['norulename'] = 'Zadajte prosím názov pravidla';
+$messages['ruleexists'] = 'Pravidlo s týmto názvom už existuje. Zadajte prosím iný názov';
+$messages['noheader'] = 'Zadajte prosím názov hlavičky pre porovnanie';
+$messages['headerbadchars'] = 'Chyba: Hlavička obsahuje zakázané znaky';
+$messages['noheadervalue'] = 'Zadajte prosím hodnotu s ktorou sa má hlavička porovnávať';
+$messages['sizewrongformat'] = 'Chyba: Veľkosť správy musí byť číslo';
+$messages['noredirect'] = 'Zadajte prosím e-mailovú adresu na ktorú sa má správa preposlať';
+$messages['redirectaddresserror'] = 'Chyba: Adresa vyzerá ako neplatná';
+$messages['noreject'] = 'Zadajte prosím správu, ktorá sa pošle s odmietnutím';
+$messages['vacnodays'] = 'Zadajte prosím do obdobia počet dní, počas ktorých nebude automatická odpoveď posielaná rovnakému užívateľovi';
+$messages['vacdayswrongformat'] = 'Chyba: Obdobie musí byť číslo väčšie, alebo rovné 1';
+$messages['vacnomsg'] = 'Zadajte prosím nejaký text správy';
+$messages['notifynomethod'] = 'Zadajte prosím spôsob, ktorým má byť upozornenie poslané';
+$messages['notifynomsg'] = 'Zadajte prosím text Vašej správy';
+$messages['sieveruleexp'] = "Zadefinujte prosím podmienky s ktorými bude správa porovnávaná. Pravidlá sa vyhodnocujú v poradí v akom sú zobrazené v ľavej časti tejto obrazovky. Ak sa nájde zhoda, ďalšie pravidlá sa vyhodnocovať nebudú.";
+$messages['sieveactexp'] = 'Vyberte prosím zo zoznamu akciu, ktorá sa bude vykonávať pre všetky e-maily vyhovujúce podmienke/podmienkam vyššie.';
+$messages['sieveheadershlp'] = 'Nižšie je uvedených niekoľko príkladov hlavičiek, ktoré môžu byť použité v podmienkach. Vyberte si tú, ktorú chcete vložiť do podmienky hore, alebo zadajte názov hlavičky do okienka ručne.';
+$messages['movingfilter'] = 'Presúvam pravidlo...';
+$messages['noexistingfilters'] = 'Žiadne pravidlo nebolo nájdené!';
+$messages['importdefault'] = '<b>Použiť pripravené pravidlá:</b> Je dostupných niekoľko pravidiel. Chcete ich použiť?';
+$messages['importother'] = '<b>Importovať pravidlá:</b> Ďalšia sada pravidiel bola nájdená v %s. Chcete ich importovať?';
+$messages['switchtoadveditor'] = 'Prepnutie do pokročilého editora Vám umožní priamo editovať súbor pravidel. Úpravy, ktoré tu urobíte môžu byť pre štandardný editor pravidiel nečitateľné a môžu sa pri uložení v ňom stratiť. Chcete pokračovať?';
+$messages['filterimported'] = 'Pravidlá boli úspešne importované';
+$messages['filterimporterror'] = 'Pravidlá nebolo možné importovať. Vyskytla sa chyba servera';
+$messages['notifyinvalidmethod'] = 'Vyzerá to, že metóda nie je zapísaná v platnom formáte. Musí to byť URI. Napr.: `mailto:adresa@domena.sk`.';
+$messages['nobodycontentpart'] = 'Zadajte prosím obsahovú časť testu';
+$messages['badoperator'] = 'Prepáčte, ale operátor ktorý ste vybrali nemôže byť v tejto podmienke použitý';
+$messages['filteractionerror'] = 'Akcia, ktorú ste vybrali nie je podporovaná serverom';
+$messages['filtermissingerror'] = 'Nepodarilo sa nájsť požadovanú podmienku';
+$messages['contentpartexp'] = 'Typ MIME, alebo špecifická časť správy, ktorá má byť testovaná. Napr.: `message/rfc822`, `text/html`, `audio/mp3` či `image`.';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/sl_SI.inc b/plugins/sieverules/localization/sl_SI.inc
new file mode 100644
index 000000000..16bc1851d
--- /dev/null
+++ b/plugins/sieverules/localization/sl_SI.inc
@@ -0,0 +1,185 @@
+<?php
+/* Author: Jernej Simončič */
+
+$labels = array();
+$labels['filters'] = 'Pravila';
+$labels['managefilters'] = 'Upravljal pravila';
+$labels['filtername'] = 'Ime';
+$labels['disablerule'] = 'Onemogoči pravilo';
+$labels['disabled'] = 'Onemogočeno';
+$labels['newfilter'] = 'Novo pravilo';
+$labels['moveup'] = 'Premakni višje';
+$labels['movedown'] = 'Premakni nižje';
+$labels['filterallof'] = 'sporočilo zadošča vsem pogojem';
+$labels['filteranyof'] = 'sporočilo zadošča kateremukoli od pogojev';
+$labels['filterany'] = 'vsa sporočila';
+$labels['filtercontains'] = 'vsebuje';
+$labels['filternotcontains'] = 'ne vsebuje';
+$labels['filteris'] = 'je enak';
+$labels['filterisnot'] = 'ni enak';
+$labels['filterexists'] = 'obstaja';
+$labels['filternotexists'] = 'ne obstaja';
+$labels['filterregex'] = 'ustreza regularnemu izrazu';
+$labels['filternotregex'] = 'ne ustreza regularnemu izrazu';
+$labels['filterunder'] = 'je manj kot';
+$labels['filterover'] = 'je več kot';
+$labels['filterbefore'] = 'je pred';
+$labels['filterafter'] = 'je po';
+$labels['filteradvoptions'] = 'več možnosti...';
+$labels['spamtest'] = 'spam verjetnost';
+$labels['operator'] = 'Operater';
+$labels['comparator'] = 'Primerjava';
+$labels['isgreaterthan'] = 'je večje kot';
+$labels['isgreaterthanequal'] = 'je večje ali enako';
+$labels['islessthan'] = 'je manjše kot';
+$labels['islessthanequal'] = 'je manjše ali enako';
+$labels['equals'] = 'je enako';
+$labels['notequals'] = 'ni enako';
+$labels['countisgreaterthan'] = 'število je večje kot';
+$labels['countisgreaterthanequal'] = 'število je večje ali enako';
+$labels['countislessthan'] = 'število je manjše kot';
+$labels['countislessthanequal'] = 'število je manjše ali enako';
+$labels['countequals'] = 'število je enako';
+$labels['countnotequals'] = 'število ni enako';
+$labels['valueisgreaterthan'] = 'vrednost je večja kot';
+$labels['valueisgreaterthanequal'] = 'vrednost je večja ali enaka';
+$labels['valueislessthan'] = 'vrednost je manjša kot';
+$labels['valueislessthanequal'] = 'vrednost je manjša ali enaka';
+$labels['valueequals'] = 'vrednost je enaka';
+$labels['valuenotequals'] = 'vrednost ni enaka';
+$labels['userpart'] = 'uporabniški del naslova je enak';
+$labels['notuserpart'] = 'uporabniški del naslova ni enak';
+$labels['detailpart'] = 'podrobni del naslova je enak';
+$labels['notdetailpart'] = 'podrobni del naslova ni enak';
+$labels['domainpart'] = 'domena je enaka';
+$labels['notdomainpart'] = 'domena ni enaka';
+$labels['teststring'] = 'Vzorčno besedilo';
+$labels['messagemoveto'] = 'Premakni sporočilo v';
+$labels['messageredirect'] = 'Preusmeri sporočilo';
+$labels['messageimapflags'] = 'Označi sporočilo kot';
+$labels['messagereject'] = 'Zavrni s sporočilom';
+$labels['messagevacation'] = 'Samodejni odgovor';
+$labels['messagekeep'] = 'Ohrani sporočilo';
+$labels['messagediscard'] = 'Zavrzi sporočilo';
+$labels['messagenotify'] = 'Pošlji obvestilo';
+$labels['messagestop'] = 'Prenehaj z izvajanjem pravil';
+$labels['messagehelp'] = 'Kaj je to?';
+$labels['sieveorigsubj'] = 'Pripni originalno zadevo k odgovoru';
+$labels['sievevachandle'] = 'Vzdevek';
+$labels['method'] = 'Metoda';
+$labels['options'] = 'Možnosti';
+$labels['messagesrules'] = 'Pogoji';
+$labels['messagesactions'] = 'Dejanja';
+$labels['sieveto'] = 'Drugi prejemniki';
+$labels['sievefrom'] = 'Od';
+$labels['flag'] = 'Pomembnost';
+$labels['importancen'] = 'Brez';
+$labels['importance1'] = 'Visoka';
+$labels['importance2'] = 'Običajna';
+$labels['importance3'] = 'Nizka';
+$labels['flagread'] = 'Prebrano';
+$labels['flagdeleted'] = 'Izbrisano';
+$labels['flaganswered'] = 'Odgovorjeno';
+$labels['flagdraft'] = 'Osnutek';
+$labels['flagflagged'] = 'Zastavica';
+$labels['addsieverule'] = 'Dodaj novo pravilo';
+$labels['addsieveact'] = 'Dodaj novo dejanje';
+$labels['deletesieverule'] = 'Izbriši to pravilo';
+$labels['deletesieveact'] = 'Izbriši to dejanje';
+$labels['envelopefrom'] = 'Pošiljatelj ovojnice';
+$labels['envelopeto'] = 'Prejemnik ovojnice';
+$labels['otherheader'] = 'Druga polja';
+$labels['days'] = 'Ponovitev';
+$labels['message'] = 'Sporočilo';
+$labels['sieveruleheaders'] = 'Prikaži vzorce polj';
+$labels['examplefilters'] = 'Vzorčni filtri';
+$labels['importfilters'] = 'Uvozi filtre';
+$labels['usedefaultfilter'] = 'Uporabi privzete filtre';
+$labels['importfilter'] = 'Uvozi filter';
+$labels['moreactions'] = 'Več možnosti...';
+$labels['adveditor'] = 'Napredni urejevalnik';
+$labels['stdeditor'] = 'Običajni urejevalnik';
+$labels['messageredirectcopy'] = 'Pošlji kopijo';
+$labels['messagecopyto'] = 'Kopiraj sporočilo v';
+$labels['body'] = 'Telo';
+$labels['auto'] = 'Samodejno';
+$labels['raw'] = 'Surovo';
+$labels['text'] = 'Besedilo';
+$labels['other'] = 'Drugo';
+$labels['bodycontentpart'] = 'Del vsebine';
+$labels['notchecked'] = 'ni pregledano';
+$labels['spamlevelisgreaterthanequal'] = 'je večja ali enaka';
+$labels['spamlevelislessthanequal'] = 'je manjša ali enaka';
+$labels['spamlevelequals'] = 'je enaka';
+$labels['i;ascii-casemap'] = 'primerjaj brez razlikovanja velikih in malih črk';
+$labels['i;octet'] = 'primerjaj z razlikovanjem velikih in malih črk';
+$labels['i;ascii-numeric'] = 'primerjaj kot število';
+$labels['selectruleset'] = 'Izberi zbirko pravil';
+$labels['activeruleset'] = '%s (aktivna)';
+$labels['activateruleset'] = 'Aktiviraj to zbirko';
+$labels['newruleset'] = 'Ustvari novo zbirko';
+$labels['delruleset'] = 'Izbriši to zbirko';
+$labels['renameruleset'] = 'Preimenuj to zbirko';
+$labels['copy'] = 'Kopiraj';
+$labels['copyexistingfilter'] = 'Kopiraj obstoječa pravila';
+$labels['copytoruleset'] = 'Kopiraj pravilo v drugo zbirko';
+$labels['copyfromruleset'] = 'Kopiraj pravila iz obstoječe zbirke';
+$labels['time'] = 'Čas';
+$labels['weekday'] = 'Dan v tednu';
+
+$messages = array();
+$messages['nosieverules'] = 'Ni pravil.';
+$messages['filterdeleteconfirm'] = 'Ali resnično želiš izbrisati to pravilo?';
+$messages['ruledeleteconfirm'] = 'Ali resnično želiš izbrisati ta pogoj?';
+$messages['actiondeleteconfirm'] = 'Ali resnično želiš izbrisati to dejanje?';
+$messages['filterunknownerror'] = 'Neznana napaka strežnika';
+$messages['filterconnerror'] = 'Ni se bilo mogoče povezati na strežnik sieve';
+$messages['filterdeleteerror'] = 'Ni mogoče izbrisati pravila. Prišlo je do napake strežnika';
+$messages['filterdeleted'] = 'Pravilo izbrisano';
+$messages['filtersaved'] = 'Pravilo shranjeno';
+$messages['filtersaveerror'] = 'Ni mogoče shraniti pravila. Prišlo je do napake strežnika';
+$messages['vacdaysexp'] = 'Ponovitev je število dni, ki mora preteči, preden bo sporočilo znova poslano istemu pošiljatelju, ne glede na to, koliko sporočil je poslal v tem času.<br /><br />Npr.: če Janez pošlje sporočilo v ponedeljek, in je ponovitev nastavljena na 7, potem bo dobil odgovor v ponedeljek, še enega pa ne bo dobil pred naslednjim ponedeljkom, ne glede na to, koliko sporočil bo poslal vmes.';
+$messages['vachandleexp'] = 'Z vzdevkom se lahko med seboj poveže več različnih samodejnih odgovorov - ko je bil samodejni odgovor z nekim vzdevkom poslan, ne bo v tej ponovitvi poslano noben drug odgovor z istim vzdevkom.';
+$messages['vactoexp'] = 'Seznam dodatnih naslovov prejemnikov, ki bodo vključeni pri samodejnem odgovarjanju. Če naslova prejemnika sporočila ni na tem seznamu, samodejni odgovor na sporočilo ne bo poslan.';
+$messages['vactoexp_adv'] = 'Naslove ločite z vejicami. Primer: naslov1@example.com,naslov2@example.org,naslov3@example.com';
+$messages['vactoexp_err'] = 'Napaka: naslovi morajo biti ločeni z vejicami (,)';
+$messages['norulename'] = 'Vnesite ime pravila';
+$messages['ruleexists'] = 'Pravilo s tem imenom že obstaja. Vnesite drugo ime';
+$messages['noheader'] = 'Vnesite ime polja';
+$messages['headerbadchars'] = 'Napaka: polje vsebuje nedovoljene znake';
+$messages['noheadervalue'] = 'Vnesite vrednost, s katero se preizkuša polje';
+$messages['sizewrongformat'] = 'Napaka: velikost sporočila mora biti število';
+$messages['noredirect'] = 'Vnestie e-poštni naslov, na katerega naj se preusmeri sporočilo';
+$messages['redirectaddresserror'] = 'Napaka: naslov ni videti veljaven';
+$messages['noreject'] = 'Vnesite sporočilo, ki naj se pošlje z zavrnitvijo';
+$messages['vacnodays'] = 'Vnesite število dni, po preteku katerih se bo samodejni odgovor ponovil';
+$messages['vacdayswrongformat'] = 'Napaka: ponovitev mora biti večja ali enaka 1';
+$messages['vacnomsg'] = 'Vnesite besedilo sporočila';
+$messages['notifynomethod'] = 'Vnesite metodo, s katero naj bo poslano sporočilo';
+$messages['notifynomsg'] = 'Vnesite besedilo sporočila';
+$messages['sieveruleexp'] = 'Pripravite enega ali več pogojev, pod katerimi bo to pravilo uveljavljeno. Pravila se izvajajo v vrstnem redu, po katerem so razvrščena na seznamu na levi strani. Če sporočilo ustreza pogojem, se nadaljna pravila ne bodo izvedla.';
+$messages['sieveruleexp_stop'] = 'Pripravite enega ali več pogojev, pod katerimi bo to pravilo uveljavljeno. Pravila se izvajajo v vrstnem redu, po katerem so razvrščena na seznamu na levi strani, in se izvajajo do dejanja ›Prenehaj‹.';
+$messages['sieveactexp'] = 'Izberite eno od spodnjih možnosti. Ta dejanja se bodo izvedla za vsako sporočilo, ki ustreza zgornjim pravilom.';
+$messages['sieveheadershlp'] = 'Spodaj je nekaj primerov drugih polj, ki jih lahko preizkušajo pravila. Izberite polje s seznama, ali pa vnesite poljubno polje.';
+$messages['movingfilter'] = 'Premikam pravilo...';
+$messages['noexistingfilters'] = 'Obstoječa pravila niso bila zaznana!';
+$messages['importdefault'] = '<b>Uporabi privzeta pravila:</b> na voljo so privzeta pravila. Ali jih želite uvoziti?';
+$messages['importother'] = '<b>Uvozi filtre:</b> Najdena je bila druga zbirka pravil %s. Ali želite uvoziti ta pravila v trenutno zbirko?';
+$messages['switchtoadveditor'] = 'Preklop v napredni urejevalnik omogoča neposredno urejanje datoteke sieve. Sprememb, ki jih naredite v naprednem urejevalniku, običajni urejevalnik morda ne bo razumel, in se lahko izgubijo, če pravila shranite z običajnim urejevalnikom. Ali želite nadaljevati?';
+$messages['filterimported'] = 'Pravilo uspešno uvoženo';
+$messages['filterimporterror'] = 'Pravila ni bilo mogoče uvoziti. Prišlo je do napake strežnika';
+$messages['notifyinvalidmethod'] = 'Metoda mora biti zapisana v URI formatu, npr.: ›mailto:alert@example.com‹.';
+$messages['nobodycontentpart'] = 'Vnesite del vsebine za preizkus';
+$messages['badoperator'] = 'Izbranega operaterja ne morete uporabiti s tem pravilom';
+$messages['filteractionerror'] = 'Strežnik ne podpira željenega dejanja';
+$messages['filtermissingerror'] = 'Željenega pravila ni bilo mogoče najti';
+$messages['contentpartexp'] = 'MIME vrsta ali specifičen del sporočila, ki naj se testira. Npr.: ›message/rfc822‹, ›text/html‹, ›audio/mp3‹ ali ›image‹.';
+$messages['delrulesetconf'] = 'Ali ste prepričani, da želite izbrisati izbrano zbirko?';
+$messages['rulesetexists'] = 'Zbirka s tem imenom že obstaja. Vnesite drugo ime';
+$messages['copyexisting'] = '<b>Kopiraj obstoječo zbirko:</b> Ali želite kopirati pravila iz obstoječe zbirke v trenutno?';
+$messages['filtercopied'] = 'Pravilo uspešno prekopirano';
+$messages['nosieverulesets'] = 'Ni zbirk.';
+$messages['baddateformat'] = 'Napaka: vnesite datum v obliki LLLL-MM-DD';
+$messages['badtimeformat'] = 'Napaka: vnesite čas v obliki UU:MM:SS';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/sv_SE.inc b/plugins/sieverules/localization/sv_SE.inc
new file mode 100644
index 000000000..2aa2d4e03
--- /dev/null
+++ b/plugins/sieverules/localization/sv_SE.inc
@@ -0,0 +1,159 @@
+<?php
+/* Author: Ida Wellner */
+
+$labels = array();
+$labels['filters'] = 'Filter';
+$labels['managefilters'] = 'Hantera filter';
+$labels['filtername'] = 'Filternamn';
+$labels['disablerule'] = 'Inaktivera regel';
+$labels['disabled'] = 'Inaktiverad';
+$labels['newfilter'] = 'Nytt filter';
+$labels['moveup'] = 'Flytta uppåt';
+$labels['movedown'] = 'Flytta nedåt';
+$labels['filterallof'] = 'matcha samtliga av följande regler';
+$labels['filteranyof'] = 'matcha en av följande regler';
+$labels['filterany'] = 'alla meddelanden';
+$labels['filtercontains'] = 'innehåller';
+$labels['filternotcontains'] = 'inte innehåller';
+$labels['filteris'] = 'är';
+$labels['filterisnot'] = 'inte är';
+$labels['filterexists'] = 'existerar';
+$labels['filternotexists'] = 'inte existerar';
+$labels['filterregex'] = 'matchar följande reguljära uttryck';
+$labels['filternotregex'] = 'inte matchar följande reguljära uttryck';
+$labels['filterunder'] = 'är mindre än';
+$labels['filterover'] = 'är större än';
+$labels['filteradvoptions'] = 'fler inställningar...';
+$labels['spamtest'] = 'Spamklassning';
+$labels['operator'] = 'Operator';
+$labels['comparator'] = 'Typ av matchning';
+$labels['isgreaterthan'] = 'är större än';
+$labels['isgreaterthanequal'] = 'är större än eller lika med';
+$labels['islessthan'] = 'är mindre än';
+$labels['islessthanequal'] = 'är mindre än eller lika med';
+$labels['equals'] = 'är lika med';
+$labels['notequals'] = 'är inte lika med';
+$labels['countisgreaterthan'] = 'antal är större än';
+$labels['countisgreaterthanequal'] = 'antal är större än eller lika med';
+$labels['countislessthan'] = 'antal är mindre än';
+$labels['countislessthanequal'] = 'antal är mindre än eller lika med';
+$labels['countequals'] = 'antal är lika med';
+$labels['countnotequals'] = 'antal är inte lika med';
+$labels['valueisgreaterthan'] = 'värdet är större än';
+$labels['valueisgreaterthanequal'] = 'värdet är större än eller lika med';
+$labels['valueislessthan'] = 'värdet är mindre än';
+$labels['valueislessthanequal'] = 'värdet är mindre än eller lika med';
+$labels['valueequals'] = 'värdet är lika med';
+$labels['valuenotequals'] = 'värdet är inte lika med';
+$labels['userpart'] = 'användare är lika med';
+$labels['notuserpart'] = 'användare är inte lika med';
+$labels['detailpart'] = 'klartextnamn är lika med';
+$labels['notdetailpart'] = 'klartextnamn är inte lika med';
+$labels['domainpart'] = 'domän är lika med';
+$labels['notdomainpart'] = 'domän är inte lika med';
+$labels['teststring'] = 'Matcha mot';
+$labels['messagemoveto'] = 'Flytta meddelande till';
+$labels['messageredirect'] = 'Omdirigera meddelande till';
+$labels['messageimapflags'] = 'Markera meddelande som';
+$labels['messagereject'] = 'Avvisa med meddelande';
+$labels['messagevacation'] = 'Frånvarobesked';
+$labels['messagekeep'] = 'Behåll meddelandet';
+$labels['messagediscard'] = 'Kasta meddelandet';
+$labels['messagenotify'] = 'Skicka notifiering';
+$labels['messagestop'] = 'Sluta behandla filter';
+$labels['messagehelp'] = 'Vad är detta?';
+$labels['sieveorigsubj'] = 'Lägg till orginalmeddelandets ämnesrad i svaret';
+$labels['sievevachandle'] = 'Id';
+$labels['method'] = 'Metod';
+$labels['options'] = 'Options';
+$labels['messagesrules'] = 'Filterregler';
+$labels['messagesactions'] = 'Filteråtgärder';
+$labels['sieveto'] = 'Alias';
+$labels['sievefrom'] = 'Från';
+$labels['flag'] = 'Prioritet';
+$labels['importancen'] = 'Ingen';
+$labels['importance1'] = 'Hög';
+$labels['importance2'] = 'Normal';
+$labels['importance3'] = 'Låg';
+$labels['flagread'] = 'Läst';
+$labels['flagdeleted'] = 'Borttaget';
+$labels['flaganswered'] = 'Besvarat';
+$labels['flagdraft'] = 'Utkast';
+$labels['flagflagged'] = 'Flaggat';
+$labels['addsieverule'] = 'Lägg till ytterligare regel under denna';
+$labels['addsieveact'] = 'Lägg till ytterligare åtgärd under denna';
+$labels['deletesieverule'] = 'Ta bort denna regel';
+$labels['deletesieveact'] = 'Ta bort denna åtgärd';
+$labels['envelopefrom'] = 'Kuvertavsändare';
+$labels['envelopeto'] = 'Kuvertmottagare';
+$labels['otherheader'] = 'Annat brevhuvud';
+$labels['days'] = 'Dagar';
+$labels['message'] = 'Meddelande';
+$labels['sieveruleheaders'] = 'Se exempel på andra brevhuvuden';
+$labels['examplefilters'] = 'Exempelfilter';
+$labels['importfilters'] = 'Importera filter';
+$labels['usedefaultfilter'] = 'Använd standardfilter';
+$labels['importfilter'] = 'Importera filter';
+$labels['adveditor'] = 'Avancerad editor';
+$labels['messageredirectcopy'] = 'Skicka en kopia till';
+$labels['messagecopyto'] = 'Kopiera meddelandet till';
+$labels['body'] = 'Meddelandetext';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Raw';
+$labels['text'] = 'Text';
+$labels['other'] = 'Annat';
+$labels['bodycontentpart'] = 'Innehållsdel';
+$labels['notchecked'] = 'inte kontrollerat';
+$labels['spamlevelisgreaterthanequal'] = 'är större än eller lika med';
+$labels['spamlevelislessthanequal'] = 'är mindre än eller lika med';
+$labels['spamlevelequals'] = 'är lika med';
+$labels['i;ascii-casemap'] = 'ej skiftlägeskänslig strängmatchning';
+$labels['i;octet'] = 'exakt strängmatchning';
+$labels['i;ascii-numeric'] = 'numerisk matchning';
+
+$messages = array();
+$messages['nosieverules'] = 'Inga filter funna.';
+$messages['filterdeleteconfirm'] = 'Är du säker på att du vill ta bort det här filtret?';
+$messages['ruledeleteconfirm'] = 'Är du säker på att du vill radera den här regeln?';
+$messages['actiondeleteconfirm'] = 'Är du säker på att du vill radera den här åtgärden?';
+$messages['filterunknownerror'] = 'Okänt serverfel';
+$messages['filterconnerror'] = 'Kan ej kontakta sieve-servern';
+$messages['filterdeleteerror'] = 'Kan ej ta bort filtret. Ett serverfel inträffade.';
+$messages['filterdeleted'] = 'Filtret har tagits bort';
+$messages['filtersaved'] = 'Filret har sparats';
+$messages['filtersaveerror'] = 'Kan inte spara filtret. Ett serverfel inträffade.';
+$messages['vacdaysexp'] = 'Frånvaromeddelandet kommer endast att skickas en gång till samma användare under det antal dagar som anges ovan, oavsett hur många gånger den personen mailar dig.<br /> <br />Exempel: Om Joe mailar dig på måndag och antalet dagar är 7 kommer han att få ett frånvaromeddelande på måndag, men sedan får han inget nytt förrän nästa måndag oavsett hur många gånger han mailar dig under veckan.';
+$messages['vachandleexp'] = 'Ett id kan använndas för att länka samman flera frånvaromeddelanden. När ett frånvaromeddelande med detta id har skickats kommer inga fler att frånvaromeddelanden med samma id att skickas under perioden.';
+$messages['vactoexp'] = 'Frånvaromeddelandet skickas enbart till din huvudsakliga adress + de adresser du valt i listan ovan. Har du fler mottagaradresser du vill kunna välja bland måste du först lägga till dessa under Profiler.';
+$messages['norulename'] = 'Fyll i ett namn på detta filter.';
+$messages['ruleexists'] = 'Ett filter med det valda namnet finns redan. Vänligen fyll i ett annat namn.';
+$messages['noheader'] = 'Fyll i namnet på brevhuvudet';
+$messages['headerbadchars'] = 'Fel: Brevhuvudet innehåller otillåtna tecken';
+$messages['noheadervalue'] = 'Fyll i ett värde som brevhuvudet ska testas mot';
+$messages['sizewrongformat'] = 'Fel: Meddelandestorlek måste anges i siffror';
+$messages['noredirect'] = 'Fyll i en e-postadress att omdirigera meddelanden till';
+$messages['redirectaddresserror'] = 'Fel: e-postadressen har inte giltigt format';
+$messages['noreject'] = 'Fyll i ett meddelande som ska skickas med brev som avvisas';
+$messages['vacnodays'] = 'Fyll i antalet dagar för den period under vilken meddelandet inte kommer att skickas på nytt till samma person';
+$messages['vacdayswrongformat'] = 'Fel: Antalet dagar måste vara ett tal större än eller lika med 1';
+$messages['vacnomsg'] = 'Fyll i text som ska skickas i frånvaromeddelandet';
+$messages['notifynomethod'] = 'Fyll i med vilken metod notifieringen ska skickas';
+$messages['notifynomsg'] = 'Fyll i en notifieringstext';
+$messages['sieveruleexp'] = 'Definiera en eller flera regler som varje meddelande kommer att testas mot. Filter körs i den ordning de listas till vänster.';
+$messages['sieveactexp'] = 'Välj bland alternativen nedan. Dessa åtgärder kommer att utföras varje gång ett meddelande matchar reglerna ovan.';
+$messages['sieveheadershlp'] = 'Detta är några exempel på andra brevhuvudet som filtren kan testa. Välj ett brevhuvud för att lägga till det till regeln eller fyll i ett eget brevhuvud.';
+$messages['movingfilter'] = 'Flyttar filter...';
+$messages['noexistingfilters'] = 'Hittar inga existerande filter!';
+$messages['importdefault'] = '<b>Använd standardfilter:</b> Det finns en uppsättning standardfilter tillgängliga. Skulle du vilja använda dem?';
+$messages['importother'] = '<b>Importera filter:</b> En annan uppsättning filter från %s har upptäckts. Skulle du vilja importera dem till din nuvarande filteruppsättning?';
+$messages['switchtoadveditor'] = 'Med den avancerade editorn kan du redigera din filterfil direkt. Ändringar gjorda där kan gå förlorade om du senare redigerar dina filter via den vanliga filterredigeringen. Vill du fortsätta?';
+$messages['filterimported'] = 'Importen av filter lyckades';
+$messages['filterimporterror'] = 'Importen av filter misslyckades. Ett serverfel uppstod.';
+$messages['notifyinvalidmethod'] = 'Den angivna metoden har inte ett giltigt format, det måste vara en URI. Exempel: `mailto:alert@example.com`.';
+$messages['nobodycontentpart'] = 'Fyll i vilken del av innehållet som ska testas';
+$messages['badoperator'] = 'Den valda operatorn kan inte användas i den här regeln';
+$messages['filteractionerror'] = 'Den valda åtgärden stöds inte av servern';
+$messages['filtermissingerror'] = 'Kan inte hitta den önskade regeln';
+$messages['contentpartexp'] = 'Fyll i MIME-typ eller specifik del av meddelandet som ska testas. Exempel: `message/rfc822`, `text/html`, `audio/mp3`';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/localization/zh_TW.inc b/plugins/sieverules/localization/zh_TW.inc
new file mode 100644
index 000000000..4f63b1e70
--- /dev/null
+++ b/plugins/sieverules/localization/zh_TW.inc
@@ -0,0 +1,192 @@
+<?php
+/* Author: Guo-Wei Su */
+
+$labels = array();
+$labels['filters'] = '郵件規則';
+$labels['managefilters'] = '管理郵件規則';
+$labels['filtername'] = '規則名稱';
+$labels['disablerule'] = '停用規則';
+$labels['disabled'] = '停用';
+$labels['newfilter'] = '建立新規則';
+$labels['moveup'] = '上移';
+$labels['movedown'] = '下移';
+$labels['filterallof'] = '符合所有條件';
+$labels['filteranyof'] = '符合任何一個條件';
+$labels['filterany'] = '所有郵件';
+$labels['filtercontains'] = '包含';
+$labels['filternotcontains'] = '不包含';
+$labels['filteris'] = '等於';
+$labels['filterisnot'] = '不等於';
+$labels['filterexists'] = '存在';
+$labels['filternotexists'] = '不存在';
+$labels['filterregex'] = '符合正則表示式';
+$labels['filternotregex'] = '不符合正則表示式';
+$labels['filterunder'] = '小於';
+$labels['filterover'] = '大於';
+$labels['filterbefore'] = '之前';
+$labels['filterafter'] = '之後';
+$labels['filteradvoptions'] = '更多選項...';
+$labels['spamtest'] = 'Spam 可能性';
+$labels['operator'] = '操作';
+$labels['comparator'] = '比較';
+$labels['isgreaterthan'] = '大於';
+$labels['isgreaterthanequal'] = '大於或等於';
+$labels['islessthan'] = '小於';
+$labels['islessthanequal'] = '小於或等於';
+$labels['equals'] = '等於';
+$labels['notequals'] = '不等於';
+$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['userpart'] = 'user part equals';
+$labels['notuserpart'] = 'user part does not equal';
+$labels['detailpart'] = 'detail part equals';
+$labels['notdetailpart'] = 'detail part does not equal';
+$labels['domainpart'] = 'domain part equals';
+$labels['notdomainpart'] = 'domain part does not equal';
+$labels['teststring'] = '測試字串';
+$labels['messagemoveto'] = '移動郵件至';
+$labels['messageredirect'] = 'Redirect message to';
+$labels['messageimapflags'] = '變更為';
+$labels['messagereject'] = '拒絕郵件';
+$labels['messagevacation'] = '不在辦公室訊息';
+$labels['messagekeep'] = '保留郵件';
+$labels['messagediscard'] = '丟棄郵件';
+$labels['messagenotify'] = '寄送通知';
+$labels['messagestop'] = '中斷郵件規則';
+$labels['messagehelp'] = '這是什麼?';
+$labels['sieveorigsubj'] = '附加來件主旨至回信主旨中';
+$labels['sievevachandle'] = 'Handle';
+$labels['method'] = '方式';
+$labels['options'] = '選項';
+$labels['messagesrules'] = '規則條件';
+$labels['messagesactions'] = '規則動作';
+$labels['sieveto'] = '別名';
+$labels['sievefrom'] = '寄件者';
+$labels['flag'] = '重要性';
+$labels['importancen'] = '無';
+$labels['importance1'] = '高';
+$labels['importance2'] = '一般';
+$labels['importance3'] = '低';
+$labels['flagread'] = '讀取';
+$labels['flagdeleted'] = '刪除';
+$labels['flaganswered'] = '已答覆';
+$labels['flagdraft'] = '草稿';
+$labels['flagflagged'] = '標幟';
+$labels['addsieverule'] = '新增條件,在這筆之後';
+$labels['addsieveact'] = '新增動作,在這筆之後';
+$labels['deletesieverule'] = '刪除這個條件';
+$labels['deletesieveact'] = '刪除這個動作';
+$labels['envelopefrom'] = 'Envelope From';
+$labels['envelopeto'] = 'Envelope To';
+$labels['otherheader'] = '其他郵件表頭';
+$labels['days'] = '期間';
+$labels['message'] = '訊息';
+$labels['sieveruleheaders'] = '顯示表頭範例';
+$labels['examplefilters'] = '規則範例';
+$labels['importfilters'] = '匯入規則';
+$labels['usedefaultfilter'] = '使用預設規則';
+$labels['importfilter'] = '匯入規則';
+$labels['moreactions'] = '更多選項...';
+$labels['adveditor'] = '進階編輯器';
+$labels['stdeditor'] = '一般編輯器';
+$labels['messageredirectcopy'] = '寄送副本到';
+$labels['messagecopyto'] = '複製郵件到';
+$labels['body'] = 'Body';
+$labels['auto'] = 'Auto';
+$labels['raw'] = 'Raw';
+$labels['text'] = 'Text';
+$labels['other'] = 'Other';
+$labels['bodycontentpart'] = 'Content Part';
+$labels['notchecked'] = 'not checked';
+$labels['spamlevelisgreaterthanequal'] = '大於或等於';
+$labels['spamlevelislessthanequal'] = '小於或等於';
+$labels['spamlevelequals'] = '等於';
+$labels['i;ascii-casemap'] = 'case-insensitive string match';
+$labels['i;octet'] = 'exact string match';
+$labels['i;ascii-numeric'] = '數字符合';
+$labels['selectruleset'] = 'Select ruleset';
+$labels['activeruleset'] = '%s (active)';
+$labels['activateruleset'] = 'Activate this ruleset';
+$labels['newruleset'] = 'Create a new ruleset';
+$labels['delruleset'] = 'Delete this ruleset';
+$labels['renameruleset'] = 'Rename this ruleset';
+$labels['copy'] = '複製';
+$labels['copyexistingfilter'] = '複製規則';
+$labels['copytoruleset'] = 'Copy filter to another ruleset';
+$labels['copyfromruleset'] = 'Copy filters from existing ruleset';
+$labels['time'] = '時間';
+$labels['weekday'] = '平日';
+$labels['virustest'] = 'Virus Probability';
+$labels['novirus'] = '找不到病毒';
+$labels['virusremoved'] = '發現病毒並移除';
+$labels['viruscured'] = '發現病毒並清除';
+$labels['possiblevirus'] = 'message possibly contains a virus';
+$labels['definitevirus'] = 'message possibly defiantly a virus';
+
+$messages = array();
+$messages['nosieverules'] = '沒有任何規則';
+$messages['filterdeleteconfirm'] = '您確定要刪除這筆郵件規則嗎?';
+$messages['ruledeleteconfirm'] = '您確定要刪除這筆規則條件嗎?';
+$messages['actiondeleteconfirm'] = '您確定要刪除這筆規則動作嗎?';
+$messages['filterunknownerror'] = '未知的伺服器錯誤';
+$messages['filterconnerror'] = '無法連線至sieve伺服器';
+$messages['filterdeleteerror'] = '無法刪除郵件規則。(伺服器錯誤)';
+$messages['filterdeleted'] = '成功刪除郵件規則';
+$messages['filtersaved'] = '郵件規則儲存完必';
+$messages['filtersaveerror'] = '無法儲存郵件規則。(伺服器錯誤)';
+$messages['vacdaysexp'] = 'The period is the number of days during which the message will not be resent to the same user, no matter how many times they contact you.<br /><br />For example: If Joe emails you on Monday and the period is set to 7 then Joe will receive an out of office message on Monday but will not get another one until the following Monday, no matter how many emails he sends an email during the week.';
+$messages['vachandleexp'] = 'A handle can be used to link different out of office messages together, once one message has been sent no other message with the same handle will be resent in that period.';
+$messages['vactoexp'] = 'List of additional recipient addresses which are included in the auto replying. If a mail\'s recipient is not your main address and it\'s not on this list, no message will be sent.';
+$messages['vactoexp_adv'] = 'Separate multiple aliases with a comma (,). For Example: test1@example.com,test2@example.com,test3@example.com';
+$messages['vactoexp_err'] = 'Error: Multiple aliases should be separated with a comma (,)';
+$messages['norulename'] = '請輸入規則名稱';
+$messages['ruleexists'] = '重複的規則名稱。請重新輸入';
+$messages['noheader'] = 'Please enter the name of the header to test';
+$messages['headerbadchars'] = 'Error: Header contains forbidden characters';
+$messages['noheadervalue'] = 'Please enter a value to test the header against';
+$messages['sizewrongformat'] = '錯誤: 郵件大小必須是數字';
+$messages['noredirect'] = '請輸入一個電子郵件位址以便轉寄訊息';
+$messages['redirectaddresserror'] = 'Error: Address appears invalid';
+$messages['noreject'] = 'Please enter a message to send with rejected email';
+$messages['vacnodays'] = 'Please enter a number of days for the period in which the message will not be resent to the same person';
+$messages['vacdayswrongformat'] = 'Error: The period must be a number greater than or equal to 1';
+$messages['vacnomsg'] = 'Please enter some text for your message';
+$messages['notifynomethod'] = 'Please enter a method by which the notification should be sent';
+$messages['notifynomsg'] = 'Please enter some text for your message';
+$messages['sieveruleexp'] = '請定義一個或多個規則條件。每封信都會依照左側列表,採由上而下的順序比對規則條件,如果符合其中一個規則,後續的郵件規則將不被執行。';
+$messages['sieveruleexp_stop'] = 'Please define one or more rules against which each message will be tested. Filters are run in the order in which they appear on the left of this screen until a \'Stop\' action is met.';
+$messages['sieveactexp'] = '請從選單中選擇項目,這些動作將會套用在符合上述規則條件的郵件。';
+$messages['sieveheadershlp'] = 'Below are some examples of other headers that can be tested by the filters. Select a header to add it to the rule or enter a custom one in the box above.';
+$messages['movingfilter'] = '移動郵件規則...';
+$messages['noexistingfilters'] = 'No existing filters detected!';
+$messages['importdefault'] = '<b>Use default filters:</b> There is a set of default filters available. Would you like to use these filters?';
+$messages['importother'] = '<b>Import filters:</b> Another set of filters from %s has been found. Would you like to import these filters into your current set?';
+$messages['switchtoadveditor'] = 'Switching to the advanced editor allows you to edit the sieve file directly. Any changes here may be unreadable in the normal editor and may be lost when filters are saved using the normal editor. Do you wish to continue?';
+$messages['filterimported'] = 'Filter imported successfully';
+$messages['filterimporterror'] = '無法匯入郵件規則。(伺服器錯誤)';
+$messages['notifyinvalidmethod'] = 'The method does not appear to be written in a valid format, it must be a URI. For example: `mailto:alert@example.com`.';
+$messages['nobodycontentpart'] = 'Please enter a content part to test';
+$messages['badoperator'] = 'Sorry the operator you selected cannot be used in this rule';
+$messages['filteractionerror'] = 'The action you requested is not supported by the server';
+$messages['filtermissingerror'] = 'Unable to find the rule requested';
+$messages['contentpartexp'] = 'The MIME-type or specific part of the message which should be tested. For example: `message/rfc822`, `text/html`, `audio/mp3` or `image`.';
+$messages['delrulesetconf'] = 'Are you sure you want to delete this ruleset?';
+$messages['rulesetexists'] = 'A ruleset with this name already exists. Please enter another';
+$messages['copyexisting'] = '<b>Copy exiting ruleset:</b> Would you like to copy filters from an existing ruleset into your current set?';
+$messages['filtercopied'] = 'Filter copied successfully';
+$messages['nosieverulesets'] = 'No rulesets found.';
+$messages['baddateformat'] = 'Error: Please enter the date in the format YYYY-MM-DD';
+$messages['badtimeformat'] = 'Error: Please enter the time in the format HH:MM:SS';
+$messages['missingfoldername'] = '錯誤: 請輸入資料夾名稱';
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/package.xml b/plugins/sieverules/package.xml
new file mode 100644
index 000000000..1ca73d3f8
--- /dev/null
+++ b/plugins/sieverules/package.xml
@@ -0,0 +1,116 @@
+<?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>sieverules</name>
+ <uri>http://github.com/JohnDoh/Roundcube-Plugin-SieveRules-Managesieve/</uri>
+ <summary>Control sieve filter settings from within Roundcube</summary>
+ <description>Adds a 'Filters' tab to the 'Personal Settings' to allow the user to manage their Sieve mail rules. Uses the Managesieve protocol. Predefined rules created for the user to select.</description>
+ <lead>
+ <name>Philip Weir</name>
+ <user>JohnDoh</user>
+ <email>roundcube@tehinterweb.co.uk</email>
+ <active>yes</active>
+ </lead>
+ <date>2013-02-24</date>
+ <time>10:16:53</time>
+ <version>
+ <release>1.18</release>
+ <api>1.18</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="sieverules.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="sieverules.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 name="CHANGELOG" role="data"/>
+ <file name="README.md" role="data"/>
+ <file name="importFilters/avelsieve.php" role="php"/>
+ <file name="importFilters/ingo.php" role="php"/>
+ <file name="include/rcube_sieve.php" role="php"/>
+ <file name="include/rcube_sieve_script.php" role="php"/>
+ <file name="jquery.maskedinput.js" role="data"/>
+ <file name="lib/Net/Sieve.php" role="php"/>
+ <file name="localization/ca_ES.inc" role="data"/>
+ <file name="localization/cs_CZ.inc" role="data"/>
+ <file name="localization/de_CH.inc" role="data"/>
+ <file name="localization/de_DE.inc" role="data"/>
+ <file name="localization/en_GB.inc" role="data"/>
+ <file name="localization/en_US.inc" role="data"/>
+ <file name="localization/es_AR.inc" role="data"/>
+ <file name="localization/es_ES.inc" role="data"/>
+ <file name="localization/et_EE.inc" role="data"/>
+ <file name="localization/fi_FI.inc" role="data"/>
+ <file name="localization/fr_FR.inc" role="data"/>
+ <file name="localization/hu_HU.inc" role="data"/>
+ <file name="localization/it_IT.inc" role="data"/>
+ <file name="localization/nl_NL.inc" role="data"/>
+ <file name="localization/pl_PL.inc" role="data"/>
+ <file name="localization/pt_BR.inc" role="data"/>
+ <file name="localization/pt_PT.inc" role="data"/>
+ <file name="localization/ro_RO.inc" role="data"/>
+ <file name="localization/ru_RU.inc" role="data"/>
+ <file name="localization/sk_SK.inc" role="data"/>
+ <file name="localization/sl_SI.inc" role="data"/>
+ <file name="localization/sv_SE.inc" role="data"/>
+ <file name="localization/zh_TW.inc" role="data"/>
+ <file name="skins/classic/cross.gif" role="data"/>
+ <file name="skins/classic/help.gif" role="data"/>
+ <file name="skins/classic/icons.gif" role="data"/>
+ <file name="skins/classic/icons.png" role="data"/>
+ <file name="skins/classic/ie6hacks.css" role="data"/>
+ <file name="skins/classic/iehacks.css" role="data"/>
+ <file name="skins/classic/safari.css" role="data"/>
+ <file name="skins/classic/sieverules.css" role="data"/>
+ <file name="skins/classic/tabstyles.css" role="data"/>
+ <file name="skins/classic/templates/advancededitor.html" role="data"/>
+ <file name="skins/classic/templates/editsieverule.html" role="data"/>
+ <file name="skins/classic/templates/setupsieverules.html" role="data"/>
+ <file name="skins/classic/templates/sieverules.html" role="data"/>
+ <file name="skins/classic/tick.gif" role="data"/>
+ <file name="skins/larry/cross.png" role="data"/>
+ <file name="skins/larry/help.png" role="data"/>
+ <file name="skins/larry/icons.png" role="data"/>
+ <file name="skins/larry/iehacks.css" role="data"/>
+ <file name="skins/larry/listicons.png" role="data"/>
+ <file name="skins/larry/safari.css" role="data"/>
+ <file name="skins/larry/sieverules.css" role="data"/>
+ <file name="skins/larry/tabstyles.css" role="data"/>
+ <file name="skins/larry/templates/advancededitor.html" role="data"/>
+ <file name="skins/larry/templates/editsieverule.html" role="data"/>
+ <file name="skins/larry/templates/setupsieverules.html" role="data"/>
+ <file name="skins/larry/templates/sieverules.html" role="data"/>
+ <file name="skins/larry/tick.png" role="data"/>
+ </dir>
+ <!-- / -->
+ </contents>
+ <dependencies>
+ <required>
+ <php>
+ <min>5.2.1</min>
+ </php>
+ <pearinstaller>
+ <min>1.7.0</min>
+ </pearinstaller>
+ <package>
+ <name>jqueryui</name>
+ <uri>http://trac.roundcube.net/browser/trunk/plugins/jqueryui/</uri>
+ <min>1.8.14</min>
+ </package>
+ </required>
+ </dependencies>
+ <phprelease/>
+</package>
diff --git a/plugins/sieverules/sieverules.js b/plugins/sieverules/sieverules.js
new file mode 100644
index 000000000..5ec505869
--- /dev/null
+++ b/plugins/sieverules/sieverules.js
@@ -0,0 +1,1480 @@
+/**
+ * SieveRules plugin script
+ */
+
+rcube_webmail.prototype.sieverules_select = function(list) {
+ if (rcmail.sieverules_examples) rcmail.sieverules_examples.clear_selection();
+ var id;
+
+ if (this.sieverules_timer)
+ clearTimeout(rcmail.sieverules_timer);
+
+ if (id = list.get_single_selection())
+ rcmail.sieverules_timer = window.setTimeout(function() { rcmail.sieverules_load(id, 'plugin.sieverules.edit'); }, 200);
+}
+
+rcube_webmail.prototype.sieverules_keypress = function(list) {
+ if (list.key_pressed == list.DELETE_KEY)
+ rcmail.command('plugin.sieverules.delete');
+ else if (list.key_pressed == list.BACKSPACE_KEY)
+ rcmail.command('plugin.sieverules.delete');
+}
+
+rcube_webmail.prototype.sieverules_ex_select = function(list) {
+ rcmail.sieverules_list.clear_selection();
+ if (list.multi_selecting)
+ return false;
+
+ if (this.sieverules_timer)
+ clearTimeout(this.sieverules_timer);
+
+ var id;
+ if (id = list.get_single_selection())
+ rcmail.sieverules_timer = window.setTimeout(function() { rcmail.sieverules_load(id, 'plugin.sieverules.add'); }, 200);
+}
+
+rcube_webmail.prototype.sieverules_mouse_up = function(e) {
+ if (rcmail.sieverules_list) {
+ if (!rcube_mouse_is_over(e, rcmail.sieverules_list.list))
+ rcmail.sieverules_list.blur();
+ }
+
+ if (rcmail.sieverules_examples) {
+ if (!rcube_mouse_is_over(e, rcmail.sieverules_examples.list))
+ rcmail.sieverules_examples.blur();
+ }
+
+ // handle mouse release when dragging
+ if (rcmail.sieverules_ex_drag_active && rcmail.sieverules_list && rcmail.env.sieverules_last_target) {
+ rcmail.command('plugin.sieverules.import_ex');
+ rcmail.sieverules_examples.draglayer.hide();
+ }
+ else if (rcmail.sieverules_drag_active && rcmail.sieverules_list && rcmail.env.sieverules_last_target) {
+ var _src = rcmail.sieverules_list.get_single_selection();
+
+ if (rcmail.env.sieverules_last_target == 'end') {
+ var _dst = rcmail.sieverules_list.rows.length;
+ $(rcmail.gui_objects.sieverules_list).children('tbody').children('tr:last').removeClass('droptargetend');
+ }
+ else {
+ var _dst = rcmail.env.sieverules_last_target.substr(6);
+ $('#' + rcmail.env.sieverules_last_target).removeClass('droptarget');
+ }
+
+ rcmail.command('plugin.sieverules.move', { source:_src, dest:_dst });
+ rcmail.sieverules_list.draglayer.hide();
+ }
+};
+
+rcube_webmail.prototype.sieverules_ex_drag_start = function(list) {
+ rcmail.sieverules_ex_drag_active = true;
+ rcmail.sieverules_list.drag_active = true;
+ rcmail.sieverules_drag_start(list);
+};
+
+rcube_webmail.prototype.sieverules_drag_start = function(list) {
+ rcmail.sieverules_drag_active = true;
+
+ if (this.sieverules_timer)
+ clearTimeout(this.sieverules_timer);
+
+ if (rcmail.gui_objects.sieverules_list) {
+ rcmail.initialBodyScrollTop = bw.ie ? 0 : window.pageYOffset;
+ rcmail.initialListScrollTop = rcmail.gui_objects.sieverules_list.parentNode.scrollTop;
+
+ var pos, list, rulesTable;
+ list = $(rcmail.gui_objects.sieverules_list.parentNode);
+ pos = list.offset();
+ rcmail.env.sieveruleslist_coords = { x1:pos.left, y1:pos.top, x2:pos.left + list.width(), y2:pos.top + list.height() };
+
+ rows = rcmail.sieverules_list.rows;
+ rcmail.env.sieverules_coords = new Array();
+ for (var i = 0; i < rows.length; i++) {
+ pos = $('#' + rows[i].id).offset();
+ rcmail.env.sieverules_coords[rows[i].id] = { x1:pos.left, y1:pos.top, x2:pos.left + $('#' + rows[i].id).width(), y2:pos.top + $('#' + rows[i].id).height(), on:0 };
+ }
+ }
+};
+
+rcube_webmail.prototype.sieverules_drag_move = function(e) {
+ if (rcmail.gui_objects.sieverules_list && rcmail.env.sieveruleslist_coords) {
+ // offsets to compensate for scrolling while dragging a message
+ var boffset = bw.ie ? -document.documentElement.scrollTop : rcmail.initialBodyScrollTop;
+ var moffset = rcmail.initialListScrollTop-rcmail.gui_objects.sieverules_list.parentNode.scrollTop;
+ var toffset = -moffset-boffset;
+
+ var li, pos, mouse;
+ mouse = rcube_event.get_mouse_pos(e);
+ pos = rcmail.env.sieveruleslist_coords;
+ mouse.y += toffset;
+
+ // if mouse pointer is outside of folderlist
+ if (mouse.x < pos.x1 || mouse.x >= pos.x2 || mouse.y < pos.y1 || mouse.y >= pos.y2) {
+ $(rcmail.gui_objects.sieverules_list).children('tbody').children('tr:last').removeClass('droptargetend');
+ rcmail.env.sieverules_last_target = null;
+ }
+ else {
+ $(rcmail.gui_objects.sieverules_list).children('tbody').children('tr:last').addClass('droptargetend');
+ rcmail.env.sieverules_last_target = 'end';
+ }
+
+ // over the folders
+ for (var k in rcmail.env.sieverules_coords) {
+ pos = rcmail.env.sieverules_coords[k];
+ if (mouse.x >= pos.x1 && mouse.x < pos.x2 && mouse.y >= pos.y1 && mouse.y < pos.y2) {
+ $(rcmail.gui_objects.sieverules_list).children('tbody').children('tr:last').removeClass('droptargetend');
+ $('#' + k).addClass('droptarget');
+ rcmail.env.sieverules_last_target = k;
+ rcmail.env.sieverules_coords[k].on = 1;
+ }
+ else if (pos.on) {
+ $('#' + k).removeClass('droptarget');
+ rcmail.env.sieverules_last_target = null;
+ rcmail.env.sieverules_coords[k].on = 0;
+ }
+ }
+ }
+};
+
+rcube_webmail.prototype.sieverules_drag_end = function(e) {
+ rcmail.sieverules_drag_active = false;
+ rcmail.sieverules_ex_drag_active = false;
+ rcmail.env.sieverules_last_target = null;
+
+ // over the rules
+ if (rcmail.gui_objects.sieverules_list && rcmail.env.sieverules_coords) {
+ for (var k in rcmail.env.sieverules_coords) {
+ if (rcmail.env.sieverules_coords[k].on) {
+ $('#' + k).removeClass('droptarget');
+ }
+ }
+ }
+
+ $(rcmail.gui_objects.sieverules_list).children('tbody').children('tr:last').removeClass('droptargetend');
+};
+
+rcube_webmail.prototype.sieverules_load = function(id, action) {
+ if (action == 'plugin.sieverules.edit' && (!id || id == rcmail.env.iid))
+ return false;
+
+ var add_url = '';
+ var target = window;
+ if (rcmail.env.contentframe && window.frames && window.frames[rcmail.env.contentframe]) {
+ add_url = '&_framed=1';
+ target = window.frames[rcmail.env.contentframe];
+ rcube_find_object(rcmail.env.contentframe).style.visibility = 'inherit';
+ }
+
+ if (action && (id || action == 'plugin.sieverules.add')) {
+ rcmail.set_busy(true);
+ target.location.href = rcmail.env.comm_path+'&_action='+action+'&_iid='+id+add_url;
+ }
+
+ return true;
+}
+
+rcube_webmail.prototype.sieverules_ready = function(id) {
+ if (id.substring(0, 2) != 'ex')
+ rcmail.enable_command('plugin.sieverules.delete', true);
+
+ if (rcmail.sieverules_examples)
+ rcmail.sieverules_examples.clear_selection();
+
+ rcmail.sieverules_list.highlight_row(id);
+ rcmail.env.iid = id;
+
+ return true;
+}
+
+rcube_webmail.prototype.sieverules_update_list = function(action, param1, param2, param3, param4) {
+ var sid = rcmail.sieverules_list.get_single_selection();
+ var selection;
+ var rows = rcmail.sieverules_list.rows;
+ var rules = Array();
+
+ switch(action) {
+ case 'add-first':
+ rcmail.sieverules_list.clear();
+ case 'add':
+ if (rows.length == 1 && rows[0].obj.cells[0].innerHTML == rcmail.gettext('loading',''))
+ rcmail.sieverules_list.remove_row(0);
+
+ var newrow = document.createElement('tr');
+
+ if (param1 == -1) {
+ var cell = document.createElement('td');
+ cell.setAttribute('colspan', '2');
+ cell.appendChild(document.createTextNode(param2));
+ newrow.appendChild(cell);
+ }
+ else {
+ newrow.id = param1;
+ var cell = document.createElement('td');
+ cell.appendChild(document.createTextNode(param2));
+ newrow.appendChild(cell);
+
+ cell = document.createElement('td');
+ cell.className = 'control';
+
+ param3 = param3.replace(/\\'/g, '\'');
+ param4 = param4.replace(/\\'/g, '\'');
+
+ cell.innerHTML = param3 + param4;
+ newrow.appendChild(cell);
+ }
+
+ rcmail.sieverules_list.insert_row(newrow);
+ break;
+ case 'update':
+ rows[param1].obj.cells[0].innerHTML = param2;
+ break;
+ case 'delete':
+ rcmail.sieverules_list.clear_selection();
+ sid = null;
+ case 'reload':
+ rcmail.sieverules_list.clear();
+
+ var newrow = document.createElement('tr');
+ var cell = document.createElement('td');
+ cell.setAttribute('colspan', '2');
+ cell.appendChild(document.createTextNode(rcmail.gettext('loading','')));
+ newrow.appendChild(cell);
+ rcmail.sieverules_list.insert_row(newrow);
+
+ rcmail.http_request('plugin.sieverules.update_list', '', false);
+ break;
+ case 'move':
+ // create array of rules
+ for (var i = 0; i < rows.length; i++) {
+ rules[i] = rows[i].obj.cells[0].innerHTML;
+
+ if (sid == i) selection = rules[i];
+ }
+
+ // assign order
+ rules.splice(param2, 0, rules[param1]);
+
+ if (parseInt(param1) < parseInt(param2))
+ rules.splice(param1, 1);
+ else
+ rules.splice(parseInt(param1) + 1, 1);
+
+ // update table
+ for (var i = 0; i < rows.length; i++) {
+ rows[i].obj.cells[0].innerHTML = rules[i];
+
+ if (rules[i] == selection) sid = i;
+ }
+
+ var target = window;
+ if (rcmail.env.contentframe && window.frames && window.frames[rcmail.env.contentframe])
+ target = window.frames[rcmail.env.contentframe];
+
+ // update iid of rule being editied
+ var iid;
+ if (target.rcube_find_object && (iid = target.rcube_find_object('_iid'))) {
+ if (iid.value != param1 && iid.value != "") {
+ if (iid.value > param1 && iid.value < param2) {
+ sid = parseInt(iid.value) - 1;
+ rcmail.sieverules_list.highlight_row(sid);
+ rcmail.sieverules_list.select_row(sid);
+ iid.value = sid;
+ target.rcmail.env.iid = sid;
+ }
+ else if (iid.value < param1 && iid.value > param2) {
+ sid = parseInt(iid.value) + 1;
+ rcmail.sieverules_list.highlight_row(sid);
+ rcmail.sieverules_list.select_row(sid);
+ iid.value = sid;
+ target.rcmail.env.iid = sid;
+ }
+ else {
+ rcmail.sieverules_list.select_row(iid.value);
+ }
+ }
+ else if (iid.value != "") {
+ rcmail.sieverules_list.highlight_row(sid);
+ rcmail.sieverules_list.select_row(sid);
+ iid.value = sid;
+ target.rcmail.env.iid = sid;
+ }
+ }
+ else if (sid) {
+ rcmail.sieverules_list.highlight_row(sid);
+ rcmail.sieverules_list.select_row(sid);
+ }
+
+ break;
+ }
+}
+
+rcube_webmail.prototype.sieverules_rule_join_radio = function(value) {
+ var rulesTable = rcube_find_object('rules-table');
+
+ if (rulesTable.tBodies[0].rows.length == 3)
+ rcmail.command('plugin.sieverules.add_rule','', rulesTable.tBodies[0].rows[0]);
+
+ rulesTable.style.display = (value == 'any' ? 'none' : '');
+}
+
+rcube_webmail.prototype.sieverules_header_select = function(sel) {
+ var idx = sel.parentNode.parentNode.rowIndex / 3;
+ var eidx = ((idx + 1) * 3) - 1;
+ var obj = document.getElementsByName('_selheader[]')[idx];
+ var testType = obj.value.split('::')[0];
+ var header = obj.value.split('::')[1];
+ var selIdx = 0;
+ var target_obj = $("input[name='_target[]']")[idx];
+
+ document.getElementsByName('_test[]')[idx].value = testType;
+ document.getElementsByName('_header[]')[idx].value = header;
+ document.getElementsByName('_target[]')[idx].className = '';
+ document.getElementsByName('_operator[]')[idx].selectedIndex = 0;
+ document.getElementsByName('_bodypart[]')[idx].style.display = 'none';
+ document.getElementsByName('_datepart[]')[idx].style.display = 'none';
+ document.getElementsByName('_weekday[]')[idx].style.display = 'none';
+ $(target_obj).unmask();
+
+ if (header == 'size') {
+ document.getElementsByName('_header[]')[idx].style.visibility = 'hidden';
+ document.getElementsByName('_headerhlp')[idx].style.visibility = 'hidden';
+ document.getElementsByName('_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_date_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_spamtest_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_spam_probability[]')[idx].style.display = 'none';
+ document.getElementsByName('_virus_probability[]')[idx].style.display = 'none';
+ document.getElementsByName('_size_operator[]')[idx].style.display = '';
+ document.getElementsByName('_target[]')[idx].style.display = '';
+ document.getElementsByName('_target[]')[idx].className = 'short';
+ document.getElementsByName('_units[]')[idx].style.display = '';
+ }
+ else if (header == 'spamtest') {
+ document.getElementsByName('_header[]')[idx].style.visibility = 'hidden';
+ document.getElementsByName('_headerhlp')[idx].style.visibility = 'hidden';
+ document.getElementsByName('_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_size_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_date_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_spamtest_operator[]')[idx].style.display = '';
+ document.getElementsByName('_spam_probability[]')[idx].style.display = '';
+ document.getElementsByName('_virus_probability[]')[idx].style.display = 'none';
+ document.getElementsByName('_target[]')[idx].style.display = 'none';
+ document.getElementsByName('_target[]')[idx].value = document.getElementsByName('_spam_probability[]')[idx].value;
+ document.getElementsByName('_units[]')[idx].style.display = 'none';
+ }
+ else if (header == 'virustest') {
+ document.getElementsByName('_header[]')[idx].style.visibility = 'hidden';
+ document.getElementsByName('_headerhlp')[idx].style.visibility = 'hidden';
+ document.getElementsByName('_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_size_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_date_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_spamtest_operator[]')[idx].style.display = '';
+ document.getElementsByName('_spam_probability[]')[idx].style.display = 'none';
+ document.getElementsByName('_virus_probability[]')[idx].style.display = '';
+ document.getElementsByName('_target[]')[idx].style.display = 'none';
+ document.getElementsByName('_target[]')[idx].value = document.getElementsByName('_spam_probability[]')[idx].value;
+ document.getElementsByName('_units[]')[idx].style.display = 'none';
+ }
+ else if (header.indexOf('predefined_') == 0) {
+ document.getElementsByName('_header[]')[idx].style.visibility = 'hidden';
+ document.getElementsByName('_headerhlp')[idx].style.visibility = 'hidden';
+ document.getElementsByName('_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_size_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_date_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_spamtest_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_spam_probability[]')[idx].style.display = 'none';
+ document.getElementsByName('_virus_probability[]')[idx].style.display = 'none';
+ document.getElementsByName('_target[]')[idx].style.display = 'none';
+ document.getElementsByName('_units[]')[idx].style.display = 'none';
+
+ if (rcmail.env.predefined_rules[header.substring(11)][0] == 'size') {
+ document.getElementsByName('_header[]')[idx].value = 'size';
+ selIdx = rcmail.sieverules_get_index(document.getElementsByName('_size_operator[]')[idx], rcmail.env.predefined_rules[header.substring(11)][2]);
+ document.getElementsByName('_size_operator[]')[idx].selectedIndex = selIdx;
+ var reg = new RegExp('^([0-9]+)(K|M)*$');
+ var matches = reg.exec(rcmail.env.predefined_rules[header.substring(11)][3]);
+ document.getElementsByName('_target[]')[idx].value = matches[1];
+ selIdx = rcmail.sieverules_get_index(document.getElementsByName('_units[]')[idx], matches[2]);
+ document.getElementsByName('_units[]')[idx].selectedIndex = selIdx;
+ }
+ else if (rcmail.env.predefined_rules[header.substring(11)][0] == 'spamtest') {
+ document.getElementsByName('_header[]')[idx].value = 'spamtest';
+ selIdx = rcmail.sieverules_get_index(document.getElementsByName('_spamtest_operator[]')[idx], rcmail.env.predefined_rules[header.substring(11)][2]);
+ document.getElementsByName('_spamtest_operator[]')[idx].selectedIndex = selIdx;
+ document.getElementsByName('_spam_probability[]')[idx].value = rcmail.env.predefined_rules[header.substring(11)][3];
+ }
+ else if (rcmail.env.predefined_rules[header.substring(11)][0] == 'virustest') {
+ document.getElementsByName('_header[]')[idx].value = 'virustest';
+ selIdx = rcmail.sieverules_get_index(document.getElementsByName('_spamtest_operator[]')[idx], rcmail.env.predefined_rules[header.substring(11)][2]);
+ document.getElementsByName('_spamtest_operator[]')[idx].selectedIndex = selIdx;
+ document.getElementsByName('_virus_probability[]')[idx].value = rcmail.env.predefined_rules[header.substring(11)][3];
+ }
+ else {
+ document.getElementsByName('_header[]')[idx].value = rcmail.env.predefined_rules[header.substring(11)][1];
+ selIdx = rcmail.sieverules_get_index(document.getElementsByName('_operator[]')[idx], rcmail.env.predefined_rules[header.substring(11)][2], -1);
+
+ // check advanced options if standard not found
+ if (selIdx == -1 && rcmail.sieverules_get_index(document.getElementsByName('_advoperator[]')[idx], rcmail.env.predefined_rules[header.substring(11)][2], -1) > -1) {
+ document.getElementsByName('_operator[]')[idx].selectedIndex = rcmail.sieverules_get_index(document.getElementsByName('_operator[]')[idx], 'advoptions');
+ document.getElementsByName('_advoperator[]')[idx].selectedIndex = rcmail.sieverules_get_index(document.getElementsByName('_advoperator[]')[idx], rcmail.env.predefined_rules[header.substring(11)][2]);
+ document.getElementsByName('_comparator[]')[idx].selectedIndex = rcmail.sieverules_get_index(document.getElementsByName('_comparator[]')[idx], rcmail.env.predefined_rules[header.substring(11)][3]);
+ document.getElementsByName('_advtarget[]')[idx].value = rcmail.env.predefined_rules[header.substring(11)][4];
+ }
+ else {
+ document.getElementsByName('_operator[]')[idx].selectedIndex = selIdx;
+ document.getElementsByName('_target[]')[idx].value = rcmail.env.predefined_rules[header.substring(11)][4];
+ }
+ }
+ }
+ else {
+ document.getElementsByName('_operator[]')[idx].style.display = '';
+ document.getElementsByName('_size_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_spamtest_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_spam_probability[]')[idx].style.display = 'none';
+ document.getElementsByName('_virus_probability[]')[idx].style.display = 'none';
+ document.getElementsByName('_date_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_target[]')[idx].style.display = '';
+ document.getElementsByName('_units[]')[idx].style.display = 'none';
+
+ if (header == 'other') {
+ document.getElementsByName('_header[]')[idx].style.visibility = 'visible';
+ document.getElementsByName('_headerhlp')[idx].style.visibility = 'visible';
+ document.getElementsByName('_header[]')[idx].value = '';
+ }
+ else {
+ document.getElementsByName('_header[]')[idx].style.visibility = 'hidden';
+ document.getElementsByName('_headerhlp')[idx].style.visibility = 'hidden';
+ }
+
+ if (header == 'body') {
+ document.getElementsByName('_header[]')[idx].style.display = 'none';
+ document.getElementsByName('_headerhlp')[idx].style.display = 'none';
+ document.getElementsByName('_bodypart[]')[idx].style.display = '';
+
+ document.getElementsByName('_body_contentpart[]')[idx].parentNode.parentNode.style.display = '';
+ }
+ else if (testType == 'date') {
+ document.getElementsByName('_header[]')[idx].style.display = 'none';
+ document.getElementsByName('_headerhlp')[idx].style.display = 'none';
+ document.getElementsByName('_datepart[]')[idx].style.display = '';
+ document.getElementsByName('_operator[]')[idx].style.display = 'none';
+ document.getElementsByName('_date_operator[]')[idx].style.display = '';
+
+ document.getElementsByName('_datepart[]')[idx].selectedIndex = 0;
+ document.getElementsByName('_body_contentpart[]')[idx].parentNode.parentNode.style.display = 'none';
+ $(target_obj).datepicker({ dateFormat: 'yy-mm-dd' });
+ }
+ else {
+ document.getElementsByName('_header[]')[idx].style.display = '';
+ document.getElementsByName('_headerhlp')[idx].style.display = '';
+
+ document.getElementsByName('_body_contentpart[]')[idx].parentNode.parentNode.style.display = 'none';
+ }
+ }
+
+ var idx = sel.parentNode.parentNode.rowIndex;
+ rcube_find_object('rules-table').tBodies[0].rows[idx + 1].style.display = 'none';
+ rcube_find_object('rules-table').tBodies[0].rows[idx + 2].style.display = 'none';
+}
+
+rcube_webmail.prototype.sieverules_bodypart_select = function(sel) {
+ var idx = sel.parentNode.parentNode.rowIndex;
+ var eidx = idx / 3;
+ var obj = document.getElementsByName('_bodypart[]')[eidx];
+
+ document.getElementsByName('_body_contentpart[]')[eidx].disabled = false;
+ document.getElementsByName('_advoperator[]')[eidx].disabled = (document.getElementsByName('_operator[]')[eidx].value == 'advoptions') ? false : true;
+
+ if (document.getElementsByName('_operator[]')[eidx].value == 'advoptions')
+ rcmail.sieverules_rule_advop_select(document.getElementsByName('_advoperator[]')[eidx]);
+ else
+ document.getElementsByName('_comparator[]')[eidx].disabled = true;
+
+ document.getElementsByName('_advtarget[]')[eidx].disabled = (document.getElementsByName('_operator[]')[eidx].value == 'advoptions') ? false : true;
+ var advopts_row = rcube_find_object('rules-table').tBodies[0].rows[idx + 2];
+ if (obj.value != 'content' && document.getElementsByName('_operator[]')[eidx].value == 'advoptions')
+ document.getElementsByName('_body_contentpart[]')[eidx].disabled = true;
+ else
+ advopts_row.style.display = (obj.value == 'content' ? '' : 'none');
+}
+
+rcube_webmail.prototype.sieverules_datepart_select = function(sel) {
+ var idx = sel.parentNode.parentNode.rowIndex;
+ var eidx = idx / 3;
+ var obj = document.getElementsByName('_datepart[]')[eidx];
+ var opr = document.getElementsByName('_operator[]')[eidx];
+ var target_obj = $("input[name='_target[]']")[eidx];
+ $(target_obj).datepicker("destroy");
+ $(target_obj).unmask();
+
+ if (obj.value == 'date')
+ $(target_obj).datepicker({ dateFormat: 'yy-mm-dd' });
+ else if (obj.value == 'time')
+ $(target_obj).mask('99:99:99', {example: 'HH:MM:SS', placeholder: '0'});
+
+ document.getElementsByName('_advtarget[]')[eidx].style.display = (obj.value == 'weekday') ? 'none' : '';
+ document.getElementsByName('_advweekday[]')[eidx].style.display = (obj.value == 'weekday') ? '' : 'none';
+ if (opr.value != 'exists' && opr.value != 'notexists' && opr.value != 'advoptions') {
+ document.getElementsByName('_target[]')[eidx].style.display = (obj.value == 'weekday') ? 'none' : '';
+ document.getElementsByName('_weekday[]')[eidx].style.display = (obj.value == 'weekday') ? '' : 'none';
+ }
+}
+
+rcube_webmail.prototype.sieverules_rule_op_select = function(sel) {
+ var idx = sel.parentNode.parentNode.rowIndex;
+ var eidx = idx / 3;
+ var datepart = document.getElementsByName('_datepart[]')[eidx].value;
+
+ var obj = document.getElementsByName('_operator[]')[eidx];
+ if (obj.value == 'exists' || obj.value == 'notexists' || obj.value == 'advoptions') {
+ document.getElementsByName('_target[]')[eidx].style.display = 'none';
+ document.getElementsByName('_weekday[]')[eidx].style.display = 'none';
+ }
+ else {
+ document.getElementsByName('_target[]')[eidx].style.display = (datepart == 'weekday') ? 'none' : '';
+ document.getElementsByName('_weekday[]')[eidx].style.display = (datepart == 'weekday') ? '' : 'none';
+ }
+
+ if (obj.value != 'exists' && obj.value != 'notexists' && document.getElementsByName('_test[]')[eidx].value == 'exists') {
+ var h_obj = document.getElementsByName('_selheader[]')[eidx];
+ var testType = h_obj.value.split('::')[0];
+
+ document.getElementsByName('_test[]')[eidx].value = testType;
+ }
+
+ document.getElementsByName('_body_contentpart[]')[eidx].disabled = (document.getElementsByName('_bodypart[]')[eidx].value == 'content') ? false : true;
+ document.getElementsByName('_advoperator[]')[eidx].disabled = false;
+ rcmail.sieverules_rule_advop_select(document.getElementsByName('_advoperator[]')[eidx]);
+ document.getElementsByName('_advtarget[]')[eidx].disabled = false;
+ var advopts_row = rcube_find_object('rules-table').tBodies[0].rows[idx + 2];
+ if (obj.value != 'advoptions' && document.getElementsByName('_bodypart[]')[eidx].value == 'content') {
+ document.getElementsByName('_advoperator[]')[eidx].disabled = true;
+ document.getElementsByName('_comparator[]')[eidx].disabled = true;
+ document.getElementsByName('_advtarget[]')[eidx].disabled = true;
+ }
+ else {
+ advopts_row.style.display = (obj.value == 'advoptions' ? '' : 'none');
+ }
+
+ return false;
+}
+
+rcube_webmail.prototype.sieverules_rule_advop_select = function(sel) {
+ var obj = sel.parentNode.parentNode.parentNode.parentNode;
+ var idx = (obj.parentNode.parentNode.rowIndex - 2) / 3;
+
+ if (sel.value.substring(0, 5) == 'count' || sel.value.substring(0, 5) == 'value')
+ document.getElementsByName('_comparator[]')[idx].disabled = false;
+ else
+ document.getElementsByName('_comparator[]')[idx].disabled = true;
+
+ return false;
+}
+
+rcube_webmail.prototype.sieverules_action_select = function(sel) {
+ var idx = sel.parentNode.parentNode.rowIndex;
+ var actoion_row = rcube_find_object('actions-table').tBodies[0].rows[idx];
+ var obj = document.getElementsByName('_act[]')[idx];
+
+ // hide everything
+ document.getElementsByName('_folder[]')[idx].style.display = 'none';
+ $(document.getElementsByName('_customfolder[]')[idx]).parent().hide();
+ document.getElementsByName('_redirect[]')[idx].style.display = 'none';
+ document.getElementsByName('_reject[]')[idx].style.display = 'none';
+ document.getElementsByName('_imapflags[]')[idx].style.display = 'none';
+ document.getElementsByName('_day[]')[idx].parentNode.parentNode.parentNode.parentNode.style.display = 'none';
+ document.getElementsByName('_nmethod[]')[idx].parentNode.parentNode.parentNode.parentNode.style.display = 'none';
+ document.getElementsByName('_eheadname[]')[idx].parentNode.parentNode.parentNode.parentNode.style.display = 'none';
+
+ if (obj.value == 'fileinto' || obj.value == 'fileinto_copy')
+ document.getElementsByName('_folder[]')[idx].style.display = '';
+ else if (obj.value == 'reject' || obj.value == 'ereject')
+ document.getElementsByName('_reject[]')[idx].style.display = '';
+ else if (obj.value == 'vacation') {
+ document.getElementsByName('_day[]')[idx].parentNode.parentNode.parentNode.parentNode.style.display = '';
+
+ if (rcmail.env.sieverules_htmleditor == 1) {
+ rowid = document.getElementsByName('_msg[]')[idx].id.replace('rcmfd_sievevacmag_', '');
+ document.getElementById('rcmfd_sievevachtmlcb_' + rowid).checked = true;
+ rcmail.sieverules_toggle_vac_html(document.getElementById('rcmfd_sievevachtmlcb_' + rowid), rowid, 'rcmfd_sievevacmag_' + rowid);
+ }
+
+ rcmail.enable_sig(document.getElementsByName('_vacfrom[]')[idx]);
+ }
+ else if (obj.value == 'notify' || obj.value == 'enotify')
+ document.getElementsByName('_nmethod[]')[idx].parentNode.parentNode.parentNode.parentNode.style.display = '';
+ else if (obj.value == 'redirect' || obj.value == 'redirect_copy')
+ document.getElementsByName('_redirect[]')[idx].style.display = '';
+ else if (obj.value == 'imapflags' || obj.value == 'imap4flags')
+ document.getElementsByName('_imapflags[]')[idx].style.display = '';
+ else if (obj.value == 'editheaderadd' || obj.value == 'editheaderrem') {
+ document.getElementsByName('_eheadname[]')[idx].parentNode.parentNode.parentNode.parentNode.style.display = '';
+
+ if (obj.value == 'editheaderrem') {
+ document.getElementsByName('_eheadval[]')[idx].parentNode.parentNode.style.display = 'none';
+ document.getElementsByName('_eheadaddlast[]')[idx].parentNode.parentNode.style.display = 'none';
+ document.getElementsByName('_hadv_opts[]')[idx].parentNode.parentNode.style.display = '';
+ }
+ else {
+ document.getElementsByName('_eheadval[]')[idx].parentNode.parentNode.style.display = '';
+ document.getElementsByName('_eheadaddlast[]')[idx].parentNode.parentNode.style.display = '';
+ document.getElementsByName('_eheadopp[]')[idx].parentNode.parentNode.style.display = 'none';
+ document.getElementsByName('_eheadindex[]')[idx].parentNode.parentNode.style.display = 'none';
+ document.getElementsByName('_hadv_opts[]')[idx].parentNode.parentNode.style.display = 'none';
+ }
+ }
+
+ if ($(document.getElementsByName('_folder[]')[idx]).is(':visible') && document.getElementsByName('_folder[]')[idx].value == '@@newfolder')
+ $(document.getElementsByName('_customfolder[]')[idx]).parent().show();
+}
+
+rcube_webmail.prototype.sieverules_select_folder = function(sel) {
+ var idx = sel.parentNode.parentNode.rowIndex;
+ var actoion_row = rcube_find_object('actions-table').tBodies[0].rows[idx];
+ var obj = document.getElementsByName('_folder[]')[idx];
+
+ $(document.getElementsByName('_customfolder[]')[idx]).parent().hide();
+ if (obj.value == '@@newfolder')
+ $(document.getElementsByName('_customfolder[]')[idx]).parent().show();
+}
+
+rcube_webmail.prototype.sieverules_xheaders = function(sel) {
+ var idx = sel.parentNode.parentNode.rowIndex + 1;
+ var xheader_row = rcube_find_object('rules-table').tBodies[0].rows[idx];
+ xheader_row.style.display = (xheader_row.style.display == 'none' ? '' : 'none');
+ return false;
+}
+
+rcube_webmail.prototype.sieverules_set_xheader = function(sel) {
+ var obj = sel.parentNode.parentNode.parentNode.parentNode;
+ var idx = (obj.parentNode.parentNode.rowIndex - 1) / 3;
+ var headerBox = document.getElementsByName('_header[]')[idx];
+ headerBox.value = sel.value;
+}
+
+rcube_webmail.prototype.sieverules_get_index = function(list, value, fallback) {
+ fallback = fallback || 0;
+
+ for (var i = 0; i < list.length; i++) {
+ if (list[i].value == value)
+ return i;
+ }
+
+ return fallback;
+}
+
+rcube_webmail.prototype.sieverules_toggle_vac_to = function(sel, id) {
+ var obj = rcube_find_object('rcmfd_sievevacto_' + id);
+ var opts = document.getElementsByName('_vacto_check_' + id + '[]')
+
+ obj.value = "";
+ for (i = 0; i < opts.length; i++) {
+ if (opts[i].checked) {
+ if (obj.value.length > 0) obj.value += ",";
+ obj.value += opts[i].value;
+ }
+ }
+}
+
+rcube_webmail.prototype.sieverules_toggle_vac_osubj = function(sel, id) {
+ var obj = rcube_find_object('rcmfd_sievevactoh_' + id);
+ obj.value = sel.checked ? sel.value : "";
+}
+
+rcube_webmail.prototype.sieverules_toggle_vac_html = function(obj, rowid, txtid) {
+ rcmail_toggle_editor(obj, txtid);
+
+ var sel = rcube_find_object('rcmfd_sievevachtmlhd_' + rowid);
+ sel.value = obj.checked ? obj.value : "";
+}
+
+rcube_webmail.prototype.sieverules_notify_impt = function(sel, id) {
+ var obj = rcube_find_object('rcmfd_sievenimpt_' + id);
+ obj.value = sel.value == 'none' ? '' : sel.value;
+}
+
+rcmail.sieverules_help = function(sel, row) {
+ var obj = sel.parentNode.parentNode.parentNode.parentNode;
+ var help_row = obj.tBodies[0].rows[row];
+ help_row.style.display = (help_row.style.display == 'none' ? '' : 'none');
+ return false;
+}
+
+rcube_webmail.prototype.sieverules_show_adv = function(sel) {
+ var obj = sel.parentNode.parentNode.parentNode.parentNode;
+ var rows = obj.tBodies[0].rows;
+
+ if (sel.checked) {
+ for(var i = 0; i < rows.length; i++)
+ if(rows[i].className && rows[i].className.match(/advanced/))
+ rows[i].style.display = '';
+ }
+ else {
+ for(var i = 0; i < rows.length; i++)
+ if(rows[i].className && rows[i].className.match(/advanced/))
+ rows[i].style.display = 'none';
+
+ for(var i = 0; i < rows.length; i++)
+ if(rows[i].className && rows[i].className.match(/advhelp/))
+ rows[i].style.display = 'none';
+ }
+}
+
+rcube_webmail.prototype.sieverules_adveditor = function(sel) {
+ if (sel.checked && !confirm(rcmail.gettext('switchtoadveditor','sieverules'))) {
+ sel.checked = false;
+ return false;
+ }
+
+ if (sel.checked)
+ rcmail.goto_url('plugin.sieverules.advanced', '', true);
+ else
+ rcmail.goto_url('plugin.sieverules', '_override=1', true);
+}
+
+rcube_webmail.prototype.sieverules_load_setup = function() {
+ var add_url = '';
+
+ var target = window;
+ if (rcmail.env.contentframe && window.frames && window.frames[rcmail.env.contentframe]) {
+ add_url = '&_framed=1';
+ target = window.frames[rcmail.env.contentframe];
+ rcube_find_object(rcmail.env.contentframe).style.visibility = 'inherit';
+ }
+
+ target.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules.setup' + add_url;
+}
+
+rcube_webmail.prototype.sieverules_select_ruleset = function(obj, action) {
+ if (typeof obj == 'string') {
+ window.location.href = rcmail.env.comm_path+'&_action='+action+'&_ruleset=' + obj;
+ }
+ else {
+ var idx = obj.selectedIndex;
+ window.location.href = rcmail.env.comm_path+'&_action='+action+'&_ruleset=' + obj.options[idx].value;
+ }
+}
+
+rcube_webmail.prototype.sieverules_add_ruleset = function(val, text) {
+ var obj = rcube_find_object('rulelist');
+
+ // remove loading message
+ if (obj.options.length == 1 && obj.options[0].value == '' && obj.options[0].text == rcmail.gettext('loading',''))
+ obj.remove(0);
+
+ var opt = document.createElement('option');
+ opt.value = val;
+ opt.text = text;
+
+ obj.options.add(opt);
+
+ if (rcmail.env.ruleset == val)
+ obj.selectedIndex = obj.options.length - 1;
+}
+
+rcube_webmail.prototype.sieverules_disable_ruleset_options = function() {
+ $('#rulelist').attr("disabled", "disabled");
+ rcmail.enable_command('plugin.sieverules.ruleset_dialog', 'plugin.sieverules.activate_ruleset', 'plugin.sieverules.del_ruleset', false);
+}
+
+rcube_webmail.prototype.sieverulesdialog_submit = function() {
+ var action = rcube_find_object('sieverulesrsdialog_action').value;
+ var val = rcube_find_object('sieverulesrsdialog_name').value;
+
+ if (action == '' || action == 'rename_ruleset') {
+ var obj = rcube_find_object('sieverulesrsdialog_ruleset');
+ for (i = 0; i < obj.options.length ; i++) {
+ if (obj.options[i].value == val) {
+ alert(rcmail.gettext('rulesetexists','sieverules'));
+ rcube_find_object('sieverulesrsdialog_name').focus();
+ return false;
+ }
+ }
+ }
+ else if (action == 'copyto_ruleset' || action == 'copyfrom_ruleset') {
+ var obj = rcube_find_object('sieverulesrsdialog_ruleset');
+ var idx = obj.selectedIndex;
+ val = obj.options[idx].value;
+ }
+
+ $('#sieverulesrsdialog').dialog('close');
+
+ var target = window;
+ if (rcmail.env.contentframe && window.frames && window.frames[rcmail.env.contentframe])
+ target = window.frames[rcmail.env.contentframe];
+
+ if (action == 'rename_ruleset')
+ window.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules.rename_ruleset&_ruleset=' + rcmail.env.ruleset + '&_new=' + val;
+ else if (action == 'copyto_ruleset')
+ rcmail.http_request('plugin.sieverules.copy_filter', '_iid='+ target.rcmail.env.iid +'&_dest=' + val, true);
+ else if (action == 'copyfrom_ruleset')
+ window.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules.import&_import=_copy_&_ruleset=' + val + '&_new=' + rcmail.env.ruleset;
+ else
+ window.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules&_ruleset=' + val;
+}
+
+rcube_webmail.prototype.enable_sig = function(obj) {
+ var id;
+
+ if (obj.options[0].value == 'auto' || obj.options[0].value == '')
+ id = obj.selectedIndex;
+ else
+ id = obj.selectedIndex + 1;
+
+ // enable manual signature insert
+ if (rcmail.env.signatures && rcmail.env.signatures[id])
+ rcmail.enable_command('plugin.sieverules.vacation_sig', true);
+ else
+ rcmail.enable_command('plugin.sieverules.vacation_sig', false);
+}
+
+rcube_webmail.prototype.sieverules_toggle_eheadlast = function(obj) {
+ var selectobj = document.getElementById(obj.id.replace('_eheadaddlast_', '_eheadindex_'));
+
+ if (obj.checked)
+ selectobj.selectedIndex = 6;
+ else
+ selectobj.selectedIndex = 0;
+}
+
+$(document).ready(function() {
+ if (window.rcmail) {
+ rcmail.addEventListener('init', function(evt) {
+ if (rcmail.env.action == 'plugin.sieverules.add' || rcmail.env.action == 'plugin.sieverules.edit' || rcmail.env.action == 'plugin.sieverules.setup' || rcmail.env.action == 'plugin.sieverules.advanced')
+ var tab = $('<span>').attr('id', 'settingstabpluginsieverules').addClass('tablink selected');
+ else
+ var tab = $('<span>').attr('id', 'settingstabpluginsieverules').addClass('tablink');
+
+ var button = $('<a>').attr('href', rcmail.env.comm_path+'&_action=plugin.sieverules').attr('title', rcmail.gettext('managefilters', 'sieverules')).html(rcmail.gettext('filters','sieverules')).appendTo(tab);
+
+ // add button and register command
+ rcmail.add_element(tab, 'tabs');
+
+ if ((rcmail.env.action == 'plugin.sieverules' || rcmail.env.action == 'plugin.sieverules.advanced') && !rcmail.env.sieveruleserror) {
+ if (rcmail.gui_objects.sieverules_list) {
+ rcmail.sieverules_list = new rcube_list_widget(rcmail.gui_objects.sieverules_list, {multiselect:false, draggable:true, keyboard:true});
+
+ // override blur function to prevent current rule being deselected
+ rcmail.sieverules_list.blur = function() {}
+
+ rcmail.sieverules_list.addEventListener('select', function(o) { rcmail.sieverules_select(o); });
+ rcmail.sieverules_list.addEventListener('keypress', function(o) { rcmail.sieverules_keypress(o); });
+ rcmail.sieverules_list.addEventListener('dragstart', function(o) { rcmail.sieverules_drag_start(o); });
+ rcmail.sieverules_list.addEventListener('dragmove', function(e) { rcmail.sieverules_drag_move(e); });
+ rcmail.sieverules_list.addEventListener('dragend', function(e) { rcmail.sieverules_drag_end(e); });
+ document.onmouseup = function(e) { return rcmail.sieverules_mouse_up(e); };
+ rcmail.sieverules_list.init();
+ rcmail.sieverules_list.focus();
+
+ if (rcmail.env.iid && rcmail.env.iid < rcmail.sieverules_list.rows.length && !rcmail.env.eid)
+ rcmail.sieverules_list.select_row(rcmail.env.iid, false, false);
+ }
+
+ if (rcmail.gui_objects.sieverules_examples) {
+ rcmail.sieverules_examples = new rcube_list_widget(rcmail.gui_objects.sieverules_examples, {multiselect:true, draggable:true, keyboard:true});
+ rcmail.sieverules_examples.addEventListener('select', function(o) { rcmail.sieverules_ex_select(o); });
+ rcmail.sieverules_examples.addEventListener('dragstart', function(o) { rcmail.sieverules_ex_drag_start(o); });
+ rcmail.sieverules_examples.addEventListener('dragmove', function(e) { rcmail.sieverules_drag_move(e); });
+ rcmail.sieverules_examples.addEventListener('dragend', function(e) { rcmail.sieverules_drag_end(e); });
+ rcmail.sieverules_examples.init();
+
+ if (rcmail.env.eid)
+ rcmail.sieverules_examples.highlight_row(rcmail.env.eid);
+
+ rcmail.register_command('plugin.sieverules.import_ex', function() {
+ if (rcmail.sieverules_examples.get_selection().length > 0) {
+ rcmail.set_busy(true, 'sieverules.movingfilter');
+ rcmail.goto_url('plugin.sieverules.import', '_import=_example_&_pos='+ rcmail.env.sieverules_last_target +'&_eids=' + rcmail.sieverules_examples.get_selection(), true);
+ }
+ }, true);
+ }
+
+ if (rcmail.env.action == 'plugin.sieverules') {
+ rcmail.register_command('plugin.sieverules.move', function(props, obj) {
+ var args = (props.source) ? props : { source:obj.parentNode.parentNode.rowIndex - 1, dest:props };
+
+ if (args.dest > -1 && args.dest <= rcmail.sieverules_list.rows.length) {
+ var lock = rcmail.set_busy(true, 'sieverules.movingfilter');
+ rcmail.http_request('plugin.sieverules.move', '_src=' + args.source + '&_dst=' + args.dest, lock);
+ }
+ }, true);
+
+ rcmail.register_command('plugin.sieverules.add', function(id) {
+ if (rcmail.sieverules_examples) rcmail.sieverules_examples.clear_selection();
+ rcmail.sieverules_list.clear_selection();
+ rcmail.env.iid = null;
+ rcmail.enable_command('plugin.sieverules.delete', false);
+
+ var add_url = '';
+
+ var target = window;
+ if (rcmail.env.contentframe && window.frames && window.frames[rcmail.env.contentframe]) {
+ add_url = '&_framed=1';
+ target = window.frames[rcmail.env.contentframe];
+ rcube_find_object(rcmail.env.contentframe).style.visibility = 'inherit';
+ }
+
+ target.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules.add' + add_url;
+ }, true);
+ }
+
+ rcmail.register_command('plugin.sieverules.ruleset_dialog', function(props, obj) {
+ rcube_find_object('sieverulesrsdialog_add').style.display = 'none';
+ rcube_find_object('sieverulesrsdialog_edit').style.display = 'none';
+ rcube_find_object('sieverulesrsdialog_copyto').style.display = 'none';
+ rcube_find_object('sieverulesrsdialog_copyfrom').style.display = 'none';
+ rcube_find_object('sieverulesrsdialog_input').style.display = 'none';
+ rcube_find_object('sieverulesrsdialog_select').style.display = 'none';
+ rcube_find_object('sieverulesrsdialog_name').value = '';
+
+ if (props == 'rename_ruleset') {
+ //rcube_find_object('sieverulesrsdialog_edit').style.display = '';
+ boxtitle = rcube_find_object('sieverulesrsdialog_edit').innerHTML;
+ rcube_find_object('sieverulesrsdialog_input').style.display = '';
+ rcube_find_object('sieverulesrsdialog_name').value = rcmail.env.ruleset;
+ }
+ else if (props == 'copyto_ruleset') {
+ //rcube_find_object('sieverulesrsdialog_copyto').style.display = '';
+ boxtitle = rcube_find_object('sieverulesrsdialog_copyto').innerHTML;
+ rcube_find_object('sieverulesrsdialog_select').style.display = '';
+ }
+ else if (props == 'copyfrom_ruleset') {
+ //rcube_find_object('sieverulesrsdialog_copyfrom').style.display = '';
+ boxtitle = rcube_find_object('sieverulesrsdialog_copyfrom').innerHTML;
+ rcube_find_object('sieverulesrsdialog_select').style.display = '';
+ }
+ else {
+ //rcube_find_object('sieverulesrsdialog_add').style.display = '';
+ boxtitle = rcube_find_object('sieverulesrsdialog_add').innerHTML;
+ rcube_find_object('sieverulesrsdialog_input').style.display = '';
+ }
+
+ rcube_find_object('sieverulesrsdialog_action').value = props;
+
+ $('#sieverulesrsdialog').dialog({ title: boxtitle, width: 512, resizable: false, modal: true });
+ }, true);
+
+ rcmail.register_command('plugin.sieverules.activate_ruleset', function(props, obj) {
+ rcmail.set_busy(true);
+
+ var obj = rcube_find_object('rulelist');
+ if (obj) {
+ rcmail.http_request('plugin.sieverules.enable_ruleset', '_ruleset=' + rcmail.env.ruleset, true);
+ obj.options.length = 0;
+
+ var opt = document.createElement('option');
+ opt.value = '';
+ opt.text = rcmail.gettext('loading','');
+
+ obj.options.add(opt);
+ rcmail.enable_command('plugin.sieverules.activate_ruleset', false);
+ }
+ else {
+ window.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules.enable_ruleset&_reload=1&_ruleset=' + rcmail.env.ruleset;
+ }
+ }, false);
+
+ rcmail.register_command('plugin.sieverules.del_ruleset', function(props, obj) {
+ if (rcmail.env.ruleset_total < 2)
+ return false;
+
+ if (confirm(rcmail.gettext('delrulesetconf','sieverules')))
+ window.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules.del_ruleset&_ruleset=' + rcmail.env.ruleset + '&_next=' + rcmail.env.ruleset_next;
+ }, false);
+
+ rcmail.register_command('plugin.sieverules.sieverules_adveditor', function(props, obj) {
+ var chkbox = document.createElement('checkbox');
+
+ if (props == "1")
+ chkbox.checked = true;
+
+ rcmail.sieverules_adveditor(chkbox);
+ }, true);
+
+ rcmail.register_command('plugin.sieverules.delete', function(id) {
+ if (confirm(rcmail.gettext('filterdeleteconfirm','sieverules'))) {
+ var add_url = '';
+
+ var target = window;
+ if (rcmail.env.contentframe && window.frames && window.frames[rcmail.env.contentframe]) {
+ add_url = '&_framed=1';
+ target = window.frames[rcmail.env.contentframe];
+ rcube_find_object(rcmail.env.contentframe).style.visibility = 'inherit';
+ }
+
+ target.location.href = rcmail.env.comm_path+'&_action=plugin.sieverules.delete&_iid=' + rcmail.env.iid + add_url;
+ rcmail.enable_command('plugin.sieverules.delete', false);
+ }
+ }, false);
+
+ if (rcmail.env.action == 'plugin.sieverules.advanced') {
+ rcmail.register_command('plugin.sieverules.save', function() {
+ rcmail.gui_objects.editform.submit();
+ }, true);
+ }
+
+ // enable commands
+ if (!rcmail.env.ruleset_active && rcmail.env.ruleset_total > 1)
+ rcmail.enable_command('plugin.sieverules.del_ruleset', true);
+
+ if (!rcmail.env.ruleset_active)
+ rcmail.enable_command('plugin.sieverules.activate_ruleset', true);
+ }
+ else if (rcmail.env.action == 'plugin.sieverules.setup') {
+ rcmail.register_command('plugin.sieverules.import', function(props) {
+ var add_url = '';
+
+ var target = window;
+ if (rcmail.env.framed)
+ target = window.parent;
+
+ target.location.href = './?_task=settings&_action=plugin.sieverules.import&' + props;
+ }, true);
+
+ rcmail.register_command('plugin.sieverules.ruleset_dialog_setup', function(props, obj) {
+ var target = window;
+ if (rcmail.env.framed)
+ target = window.parent;
+
+ target.rcube_find_object('sieverulesrsdialog_add').style.display = 'none';
+ target.rcube_find_object('sieverulesrsdialog_edit').style.display = 'none';
+ target.rcube_find_object('sieverulesrsdialog_input').style.display = 'none';
+ //target.rcube_find_object('sieverulesrsdialog_copyfrom').style.display = '';
+ boxtitle = rcube_find_object('sieverulesrsdialog_copyfrom').innerHTML;
+ target.rcube_find_object('sieverulesrsdialog_select').style.display = '';
+ target.rcube_find_object('sieverulesrsdialog_action').value = props;
+
+ target.$('#sieverulesrsdialog').dialog({ title: boxtitle, width: 512, resizable: false, modal: true });
+ }, true);
+ }
+
+ if (rcmail.env.action == 'plugin.sieverules.add' || rcmail.env.action == 'plugin.sieverules.edit') {
+ rcmail.register_command('plugin.sieverules.add_rule', function(props, obj) {
+ rcmail.enable_command('plugin.sieverules.del_rule', true);
+ var rulesTable = rcube_find_object('rules-table').tBodies[0];
+ var idx = obj.parentNode.parentNode.rowIndex + 3;
+ var newNode1 = rulesTable.rows[0].cloneNode(true);
+ var newNode2 = rulesTable.rows[1].cloneNode(true);
+ var newNode3 = rulesTable.rows[2].cloneNode(true);
+
+ if (idx < rulesTable.rows.length) {
+ rulesTable.insertBefore(newNode3, rulesTable.rows[idx]);
+ rulesTable.insertBefore(newNode2, rulesTable.rows[idx]);
+ rulesTable.insertBefore(newNode1, rulesTable.rows[idx]);
+ }
+ else {
+ rulesTable.appendChild(newNode1);
+ rulesTable.appendChild(newNode2);
+ rulesTable.appendChild(newNode3);
+ }
+
+ rcmail.env.sieverules_rules++;
+ var tmp = $(newNode2).html().replace(/rowid/g, rcmail.env.sieverules_rules);
+ $(newNode2).html(tmp);
+ var tmp = $(newNode3).html().replace(/rowid/g, rcmail.env.sieverules_rules);
+ $(newNode3).html(tmp);
+
+ newNode1.style.display = "";
+ newNode2.style.display = "none";
+ newNode3.style.display = "none";
+
+ return false;
+ }, true);
+
+ rcmail.register_command('plugin.sieverules.del_rule', function(props, obj) {
+ var rulesTable = rcube_find_object('rules-table').tBodies[0];
+
+ if (rulesTable.rows.length == 6)
+ return false;
+
+ if (confirm(rcmail.gettext('ruledeleteconfirm','sieverules'))) {
+ rulesTable.deleteRow(obj.parentNode.parentNode.rowIndex + 2);
+ rulesTable.deleteRow(obj.parentNode.parentNode.rowIndex + 1);
+ rulesTable.deleteRow(obj.parentNode.parentNode.rowIndex);
+ }
+
+ if (rcube_find_object('rules-table').tBodies[0].rows.length == 6)
+ rcmail.enable_command('plugin.sieverules.del_rule', false);
+
+ return false;
+ }, false);
+
+ rcmail.register_command('plugin.sieverules.copy_rule', function(props, obj) {
+ parent.rcmail.command('plugin.sieverules.ruleset_dialog', 'copyto_ruleset', obj);
+ }, true);
+
+ rcmail.register_command('plugin.sieverules.add_action', function(props, obj) {
+ rcmail.enable_command('plugin.sieverules.del_action', true);
+ var actsTable = rcube_find_object('actions-table').tBodies[0];
+ var idx = obj.parentNode.parentNode.rowIndex + 1;
+ var newNode = actsTable.rows[0].cloneNode(true);
+
+ if (idx < actsTable.rows.length)
+ actsTable.insertBefore(newNode, actsTable.rows[idx]);
+ else
+ actsTable.appendChild(newNode);
+
+ rcmail.env.sieverules_actions++;
+ var tmp = $(newNode).html().replace(/rowid/g, rcmail.env.sieverules_actions);
+ $(newNode).html(tmp);
+
+ newNode.style.display = "";
+
+ return false;
+ }, true);
+
+ rcmail.register_command('plugin.sieverules.del_action', function(props, obj) {
+ var actsTable = rcube_find_object('actions-table').tBodies[0];
+
+ if (actsTable.rows.length == 2)
+ return false;
+
+ if (confirm(rcmail.gettext('actiondeleteconfirm','sieverules')))
+ actsTable.deleteRow(obj.parentNode.parentNode.rowIndex);
+
+ if (rcube_find_object('actions-table').tBodies[0].rows.length == 2)
+ rcmail.enable_command('plugin.sieverules.del_action', false);
+
+ return false;
+ }, false);
+
+ rcmail.register_command('plugin.sieverules.save', function() {
+ var rows;
+
+ if (rcmail.env.framed)
+ rows = parent.rcmail.sieverules_list.rows;
+ else
+ rows = rcmail.sieverules_list.rows;
+
+ var input_name = rcube_find_object('_name');
+ var rule_join = document.getElementsByName('_join');
+ var headers = document.getElementsByName('_header[]');
+ var bodyparts = document.getElementsByName('_bodypart[]');
+ var contentparts = document.getElementsByName('_body_contentpart[]');
+ var dateparts = document.getElementsByName('_datepart[]');
+ var ops = document.getElementsByName('_operator[]');
+ var advops = document.getElementsByName('_advoperator[]');
+ var targets = document.getElementsByName('_target[]');
+ var advtargets = document.getElementsByName('_advtarget[]');
+ var acts = document.getElementsByName('_act[]');
+ var folders = document.getElementsByName('_folder[]');
+ var customfolders = document.getElementsByName('_customfolder[]');
+ var addrs = document.getElementsByName('_redirect[]');
+ var rejects = document.getElementsByName('_reject[]');
+ var senders = document.getElementsByName('_vacfrom[]');
+ var aliases = document.getElementsByName('_vacto[]');
+ var days = document.getElementsByName('_day[]');
+ var subjects = document.getElementsByName('_subject[]');
+ var msgs = document.getElementsByName('_msg[]');
+ var nmethods = document.getElementsByName('_nmethod[]');
+ var nmsgs = document.getElementsByName('_nmsg[]');
+ var eheadernames = document.getElementsByName('_eheadname[]');
+ var eheadervals = document.getElementsByName('_eheadval[]');
+ var size_test = new RegExp('^[0-9]+$');
+ var spamtest_test = new RegExp('^[0-9]+$');
+ var header_test = new RegExp('^[a-zA-Z0-9\-]+( ?, ?[a-zA-Z0-9\-]+)*$');
+ var date_test = new RegExp('^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$');
+ var time_test = new RegExp('^[0-9]{2}:[0-9]{2}:[0-9]{2}$');
+
+ if (input_name && input_name.value == '') {
+ alert(rcmail.gettext('norulename','sieverules'));
+ input_name.focus();
+ return false;
+ }
+
+ for (var i = 0; i < rows.length; i++) {
+ if (input_name.value == rows[i].obj.cells[0].innerHTML && i != rcmail.env.iid) {
+ alert(rcmail.gettext('ruleexists','sieverules'));
+ input_name.focus();
+ return false;
+ }
+ }
+
+ for (var i = 1; i < headers.length && (rule_join[0].checked || rule_join[1].checked); i++) {
+ if (headers[i].value == '') {
+ alert(rcmail.gettext('noheader','sieverules'));
+ headers[i].focus();
+ return false;
+ }
+
+ if (!header_test.test(headers[i].value)) {
+ alert(rcmail.gettext('headerbadchars','sieverules'));
+ headers[i].focus();
+ return false;
+ }
+
+ if (bodyparts[i].value == 'content' && contentparts[i].value == '') {
+ alert(rcmail.gettext('nobodycontentpart','sieverules'));
+ contentparts[i].focus();
+ return false;
+ }
+
+ if (targets[i] && dateparts[i].value != 'weekday' && ops[i].value.indexOf("exists") == -1 && ops[i].value.indexOf("advoptions") == -1 && targets[i].value == '') {
+ alert(rcmail.gettext('noheadervalue','sieverules'));
+ targets[i].focus();
+ return false;
+ }
+
+ if (advtargets[i] && dateparts[i].value != 'weekday' && ops[i].value.indexOf("advoptions") != -1 && advtargets[i].value == '') {
+ alert(rcmail.gettext('noheadervalue','sieverules'));
+ advtargets[i].focus();
+ return false;
+ }
+
+ if (headers[i].value == 'size' && !size_test.test(targets[i].value)) {
+ alert(rcmail.gettext('sizewrongformat','sieverules'));
+ targets[i].focus();
+ return false;
+ }
+
+ if (headers[i].value == 'spamtest') {
+ targets[i].value = document.getElementsByName('_spam_probability[]')[i].value;
+ }
+
+ if (headers[i].value == 'virustest') {
+ targets[i].value = document.getElementsByName('_virus_probability[]')[i].value;
+ }
+
+ if (headers[i].value == 'body' && (advops[i].value.indexOf('user') > -1 || advops[i].value.indexOf('detail') > -1 || advops[i].value.indexOf('domain') > -1)) {
+ alert(rcmail.gettext('badoperator','sieverules'));
+ advops[i].focus();
+ return false;
+ }
+
+ if ((headers[i].value == 'date' || headers[i].value == 'currentdate')) {
+ if (dateparts[i].value == 'date' && !date_test.test(targets[i].value)) {
+ alert(rcmail.gettext('baddateformat','sieverules'));
+ targets[i].focus();
+ return false;
+ }
+ else if (dateparts[i].value == 'time' && !time_test.test(targets[i].value)) {
+ alert(rcmail.gettext('badtimeformat','sieverules'));
+ targets[i].focus();
+ return false;
+ }
+ }
+ }
+
+ for (var i = 1; i < acts.length; i++) {
+ var idx = acts[i].selectedIndex;
+
+ if (acts[i][idx].value == 'fileinto' || acts[i][idx].value == 'fileinto_copy') {
+ if (folders[i].value == '@@newfolder' && customfolders[i].value == '') {
+ alert(rcmail.gettext('missingfoldername','sieverules'));
+ customfolders[i].focus();
+ return false;
+ }
+ }
+ else if (acts[i][idx].value == 'redirect' || acts[i][idx].value == 'redirect_copy') {
+ if (addrs[i].value == '') {
+ alert(rcmail.gettext('noredirect','sieverules'));
+ addrs[i].focus();
+ return false;
+ }
+
+ if (!rcube_check_email(addrs[i].value.replace(/^\s+/, '').replace(/[\s,;]+$/, ''), true)) {
+ alert(rcmail.gettext('redirectaddresserror','sieverules'));
+ addrs[i].focus();
+ return false;
+ }
+ }
+ else if (acts[i][idx].value == 'reject' || acts[i][idx].value == 'ereject') {
+ if (rejects[i].value == '') {
+ alert(rcmail.gettext('noreject','sieverules'));
+ rejects[i].focus();
+ return false;
+ }
+ }
+ else if (acts[i][idx].value == 'vacation') {
+ if (senders[i].value != '' && senders[i].value != 'auto' && !rcube_check_email(senders[i].value.replace(/^\s+/, '').replace(/[\s,;]+$/, ''), true) && !$.isNumeric(senders[i].value)) {
+ alert(rcmail.gettext('redirectaddresserror','sieverules'));
+ senders[i].focus();
+ return false;
+ }
+
+ if (aliases[i].value.indexOf(' ') > -1 || aliases[i].value.indexOf(';') > -1) {
+ alert(rcmail.gettext('vactoexp_err','sieverules'));
+ aliases[i].focus();
+ return false;
+ }
+
+ //if (days[i].value == '') {
+ // alert(rcmail.gettext('vacnodays','sieverules'));
+ // days[i].focus();
+ // return false;
+ //}
+
+ if (days[i].value != '' && (!size_test.test(days[i].value) || days[i].value < 1)) {
+ alert(rcmail.gettext('vacdayswrongformat','sieverules'));
+ days[i].focus();
+ return false;
+ }
+
+ //if (subjects[i].value == '') {
+ // alert(rcmail.gettext('vacnosubject','sieverules'));
+ // subjects[i].focus();
+ // return false;
+ //}
+
+ var editor = tinyMCE.get("rcmfd_sievevacmag_" + (i - 1));
+ if ((editor && editor.getContent() == '') || (!editor && msgs[i].value == '')) {
+ alert(rcmail.gettext('vacnomsg','sieverules'));
+ msgs[i].focus();
+ return false;
+ }
+ }
+ else if (acts[i][idx].value == 'notify' || acts[i][idx].value == 'enotify') {
+ if (nmethods[i].value == '') {
+ alert(rcmail.gettext('notifynomethod','sieverules'));
+ nmethods[i].focus();
+ return false;
+ }
+
+ if (acts[i][idx].value == 'enotify' && nmethods[i].value.indexOf(':') == -1) {
+ alert(rcmail.gettext('notifyinvalidmethod','sieverules'));
+ nmethods[i].focus();
+ return false;
+ }
+
+ if (nmsgs[i].value == '') {
+ alert(rcmail.gettext('notifynomsg','sieverules'));
+ nmsgs[i].focus();
+ return false;
+ }
+ }
+ else if (acts[i][idx].value == 'editheaderadd' || acts[i][idx].value == 'editheaderrem') {
+ if (eheadernames[i].value == '') {
+ alert(rcmail.gettext('eheadernoname','sieverules'));
+ eheadernames[i].focus();
+ return false;
+ }
+
+ if (acts[i][idx].value == 'editheaderadd') {
+ if (eheadervals[i].value == '') {
+ alert(rcmail.gettext('eheadernoval','sieverules'));
+ eheadervals[i].focus();
+ return false;
+ }
+ }
+ }
+ }
+
+ // enable the comparators field
+ for (var i = 0; i < document.getElementsByName('_comparator[]').length; i++)
+ document.getElementsByName('_comparator[]')[i].disabled = false;
+
+ rcmail.gui_objects.editform.submit();
+ }, true);
+
+ rcmail.register_command('plugin.sieverules.vacation_sig', function(id) {
+ var obj = document.getElementById("rcmfd_sievevacfrom_" + id);
+ var is_html = ($("#rcmfd_sievevachtmlcb_" + id).is(':checked'));
+
+ if (!obj || !obj.options)
+ return false;
+
+ var sig, id;
+ var sig_separator = '-- ';
+
+ if (obj.options[0].value == 'auto' || obj.options[0].value == '')
+ id = obj.selectedIndex;
+ else
+ id = obj.selectedIndex + 1;
+
+ if (is_html) {
+ var editor = tinyMCE.get("rcmfd_sievevacmag_" + id),
+ sigElem = editor.dom.get('_rc_sig');
+
+ // Append the signature as a div within the body
+ if (!sigElem) {
+ var body = editor.getBody(),
+ doc = editor.getDoc();
+
+ sigElem = doc.createElement('div');
+ sigElem.setAttribute('id', '_rc_sig');
+
+ if (bw.ie) // add empty line before signature on IE
+ body.appendChild(doc.createElement('br'));
+
+ body.appendChild(sigElem);
+ }
+
+ if (rcmail.env.signatures[id]) {
+ if (rcmail.env.signatures[id].is_html) {
+ sig = rcmail.env.signatures[id].text;
+ if (!rcmail.env.signatures[id].plain_text.match(/^--[ -]\r?\n/m))
+ sig = sig_separator + '<br />' + sig;
+ }
+ else {
+ sig = rcmail.env.signatures[id].text;
+ if (!sig.match(/^--[ -]\r?\n/m))
+ sig = sig_separator + '\n' + sig;
+
+ sig = '<pre>' + sig + '</pre>';
+ }
+
+ sigElem.innerHTML = sig;
+ }
+ }
+ else {
+ var input_message = $("#rcmfd_sievevacmag_" + id);
+ var message = input_message.val();
+
+ if (rcmail.env.signatures && rcmail.env.signatures[id]) {
+ sig = rcmail.env.signatures[id]['text'];
+ sig = sig.replace(/\r\n/g, '\n');
+
+ if (!sig.match(/^--[ -]\n/))
+ sig = sig_separator + '\n' + sig;
+
+ message = message.replace(/[\r\n]+$/, '');
+ message += '\n\n' + sig;
+ }
+
+ input_message.val(message);
+ }
+
+ return false;
+ }, false);
+
+ // enable commands
+ if (rcube_find_object('rules-table').tBodies[0].rows.length > 6)
+ rcmail.enable_command('plugin.sieverules.del_rule', true);
+
+ if (rcube_find_object('actions-table').tBodies[0].rows.length > 2)
+ rcmail.enable_command('plugin.sieverules.del_action', true);
+
+ rcmail.enable_command('toggle-editor', true);
+
+ // enable sig button
+ var acts = document.getElementsByName('_act[]');
+ for (var i = 1; i < acts.length; i++) {
+ var idx = acts[i].selectedIndex;
+
+ if (acts[i][idx].value == 'vacation')
+ rcmail.enable_sig(document.getElementsByName('_vacfrom[]')[i]);
+ }
+
+ // add input masks
+ rcmail.add_onload(function setup_inputmasks() {
+ // date/time inputs
+ headers = document.getElementsByName('_selheader[]');
+ for (var i = 0; i < headers.length; i++) {
+ if (headers[i].value.indexOf('date::') == 0) {
+ var obj = document.getElementsByName('_datepart[]')[i];
+ var target_obj = $("input[name='_target[]']")[i];
+
+ $(target_obj).datepicker("destroy");
+ $(target_obj).unmask();
+
+ if (obj.value == 'date')
+ $(target_obj).datepicker({ dateFormat: 'yy-mm-dd' });
+ else if (obj.value == 'time')
+ $(target_obj).mask('99:99:99', {example: 'HH:MM:SS', placeholder: '0'});
+ }
+
+ }
+ });
+ }
+ });
+ }
+}); \ No newline at end of file
diff --git a/plugins/sieverules/sieverules.php b/plugins/sieverules/sieverules.php
new file mode 100644
index 000000000..adb2bc16b
--- /dev/null
+++ b/plugins/sieverules/sieverules.php
@@ -0,0 +1,2331 @@
+<?php
+
+/**
+ * SieveRules
+ *
+ * Plugin to allow the user to manage their Sieve filters using the managesieve protocol
+ *
+ * @version @package_version@
+ * @requires jQueryUI plugin
+ * @author Philip Weir
+ * Based on the Managesieve plugin by Aleksander Machniak
+ */
+class sieverules extends rcube_plugin
+{
+ public $task = 'settings';
+ private $sieve;
+ private $sieve_error;
+ private $script;
+ private $action;
+ private $examples = array();
+ private $force_vacto = false;
+ private $show_vacfrom = false;
+ private $show_vachandle = false;
+ private $current_ruleset;
+
+ // default values: label => value
+ private $headers = array('subject' => 'header::Subject',
+ 'from' => 'address::From',
+ 'to' => 'address::To',
+ 'cc' => 'address::Cc',
+ 'bcc' => 'address::Bcc',
+ 'envelopeto' => 'envelope::To',
+ 'envelopefrom' => 'envelope::From'
+ );
+
+ private $operators = array('filtercontains' => 'contains',
+ 'filternotcontains' => 'notcontains',
+ 'filteris' => 'is',
+ 'filterisnot' => 'notis',
+ 'filterexists' => 'exists',
+ 'filternotexists' => 'notexists'
+ );
+
+ private $flags = array('flagread' => '\\\\Seen',
+ 'flagdeleted' => '\\\\Deleted',
+ 'flaganswered' => '\\\\Answered',
+ 'flagdraft' => '\\\\Draft',
+ 'flagflagged' => '\\\\Flagged'
+ );
+
+ function init()
+ {
+ $rcmail = rcube::get_instance();
+ $this->load_config();
+
+ // load required plugin
+ $this->require_plugin('jqueryui');
+
+ if ($rcmail->config->get('sieverules_multiplerules') && rcube_utils::get_input_value('_ruleset', rcube_utils::INPUT_GET, true))
+ $this->current_ruleset = rcube_utils::get_input_value('_ruleset', rcube_utils::INPUT_GET, true);
+ elseif ($rcmail->config->get('sieverules_multiplerules') && $_SESSION['sieverules_current_ruleset'])
+ $this->current_ruleset = $_SESSION['sieverules_current_ruleset'];
+ elseif ($rcmail->config->get('sieverules_multiplerules'))
+ $this->current_ruleset = false;
+ else
+ $this->current_ruleset = $rcmail->config->get('sieverules_ruleset_name');
+
+ // override default values
+ if ($rcmail->config->get('sieverules_default_headers'))
+ $this->headers = $rcmail->config->get('sieverules_default_headers');
+
+ if ($rcmail->config->get('sieverules_default_operators'))
+ $this->operators = $rcmail->config->get('sieverules_default_operators');
+
+ if ($rcmail->config->get('sieverules_default_flags'))
+ $this->flags = $rcmail->config->get('sieverules_default_flags');
+
+ $this->action = $rcmail->action;
+
+ $this->add_texts('localization/', array('filters', 'managefilters'));
+ $this->include_stylesheet($this->local_skin_path() . '/tabstyles.css');
+ $this->include_script('sieverules.js');
+
+ $this->register_action('plugin.sieverules', array($this, 'init_html'));
+ $this->register_action('plugin.sieverules.add', array($this, 'init_html'));
+ $this->register_action('plugin.sieverules.edit', array($this, 'init_html'));
+ $this->register_action('plugin.sieverules.setup', array($this, 'init_setup'));
+ $this->register_action('plugin.sieverules.advanced', array($this, 'init_html'));
+ $this->register_action('plugin.sieverules.move', array($this, 'move'));
+ $this->register_action('plugin.sieverules.save', array($this, 'save'));
+ $this->register_action('plugin.sieverules.delete', array($this, 'delete'));
+ $this->register_action('plugin.sieverules.import', array($this, 'import'));
+ $this->register_action('plugin.sieverules.update_list', array($this, 'gen_js_list'));
+ $this->register_action('plugin.sieverules.del_ruleset', array($this, 'delete_ruleset'));
+ $this->register_action('plugin.sieverules.rename_ruleset', array($this, 'rename_ruleset'));
+ $this->register_action('plugin.sieverules.enable_ruleset', array($this, 'enable_ruleset'));
+ $this->register_action('plugin.sieverules.copy_filter', array($this, 'copy_filter'));
+ }
+
+ function init_html()
+ {
+ $rcmail = rcube::get_instance();
+
+ // always include all identities when creating vacation messages
+ if ($rcmail->config->get('sieverules_force_vacto'))
+ $this->force_vacto = $rcmail->config->get('sieverules_force_vacto');
+
+ // include the 'from' option when creating vacation messages
+ if ($rcmail->config->get('sieverules_show_vacfrom'))
+ $this->show_vacfrom = $rcmail->config->get('sieverules_show_vacfrom');
+
+ // include the 'handle' option when creating vacation messages
+ if ($rcmail->config->get('sieverules_show_vachandle'))
+ $this->show_vachandle = $rcmail->config->get('sieverules_show_vachandle');
+
+ $this->_startup();
+
+ if ($rcmail->config->get('sieverules_multiplerules') && $this->current_ruleset === false) {
+ if ($ruleset = $this->sieve->get_active()) {
+ $this->current_ruleset = $this->sieve->get_active();
+ }
+ else {
+ $this->current_ruleset = $rcmail->config->get('sieverules_ruleset_name');
+ $this->_startup();
+ $rcmail->overwrite_action('plugin.sieverules.setup');
+ $this->action = 'plugin.sieverules.setup';
+ }
+ }
+
+ if ($rcmail->config->get('sieverules_multiplerules'))
+ $_SESSION['sieverules_current_ruleset'] = $this->current_ruleset;
+
+ $this->api->output->set_env('ruleset', $this->current_ruleset);
+ if ($rcmail->config->get('sieverules_adveditor') == 2 && rcube_utils::get_input_value('_override', rcube_utils::INPUT_GET) != '1' && $this->action == 'plugin.sieverules') {
+ $rcmail->overwrite_action('plugin.sieverules.advanced');
+ $this->action = 'plugin.sieverules.advanced';
+ }
+
+ $this->api->output->add_handlers(array(
+ 'sieveruleslist' => array($this, 'gen_list'),
+ 'sieverulesexamplelist' => array($this, 'gen_examples'),
+ 'sieverulessetup' => array($this, 'gen_setup'),
+ 'sieveruleform' => array($this, 'gen_form'),
+ 'advancededitor' => array($this, 'gen_advanced'),
+ 'advswitch' => array($this, 'gen_advswitch'),
+ 'rulelist' => array($this, 'gen_rulelist'),
+ 'sieverulesframe' => array($this, 'sieverules_frame'),
+ ));
+
+ if ($this->action != 'plugin.sieverules.advanced')
+ $this->api->output->include_script('list.js');
+
+ if (sizeof($this->examples) > 0)
+ $this->api->output->set_env('examples', 'true');
+
+ if ($this->action == 'plugin.sieverules.add' || $this->action == 'plugin.sieverules.edit') {
+ $rcmail->html_editor('sieverules');
+ $this->api->output->add_script(sprintf("window.rcmail_editor_settings = %s",
+ json_encode(array(
+ 'plugins' => 'paste,tabfocus',
+ 'theme_advanced_buttons1' => 'bold,italic,underline,strikethrough,justifyleft,justifycenter,justifyright,justifyfull,separator,outdent,indent,charmap,hr',
+ 'theme_advanced_buttons2' => 'link,unlink,code,forecolor,fontselect,fontsizeselect',
+ ))), 'head');
+
+ $this->api->output->set_pagetitle($this->action == 'plugin.sieverules.add' ? $this->gettext('newfilter') : $this->gettext('edititem'));
+ $this->api->output->send('sieverules.editsieverule');
+ }
+ elseif ($this->action == 'plugin.sieverules.setup') {
+ $this->api->output->set_pagetitle($this->gettext('filters'));
+ $this->api->output->add_script(rcmail_output::JS_OBJECT_NAME .".add_onload('". rcmail_output::JS_OBJECT_NAME .".sieverules_load_setup()');");
+ $this->api->output->send('sieverules.sieverules');
+ }
+ elseif ($this->action == 'plugin.sieverules.advanced') {
+ $this->api->output->set_pagetitle($this->gettext('filters'));
+ $this->api->output->send('sieverules.advancededitor');
+ }
+ else {
+ $this->api->output->set_pagetitle($this->gettext('filters'));
+ $this->api->output->send('sieverules.sieverules');
+ }
+ }
+
+ function init_setup()
+ {
+ $this->_startup();
+
+ $this->api->output->add_handlers(array(
+ 'sieverulessetup' => array($this, 'gen_setup'),
+ ));
+
+ $this->api->output->set_pagetitle($this->gettext('filters'));
+ $this->api->output->send('sieverules.setupsieverules');
+ }
+
+ function sieverules_frame($attrib)
+ {
+ if (!$attrib['id'])
+ $attrib['id'] = 'rcmprefsframe';
+
+ return $this->api->output->frame($attrib, true);
+ }
+
+ function gen_advanced($attrib)
+ {
+ list($form_start, $form_end) = get_form_tags($attrib, 'plugin.sieverules.save');
+ $out = $form_start;
+
+ $input_script = new html_textarea(array('id' => 'sieverules_adv', 'name' => '_script'));
+ $out .= $input_script->show($this->sieve->script->raw);
+
+ $out .= $form_end;
+
+ return $out;
+ }
+
+ function gen_list($attrib)
+ {
+ $this->api->output->add_label('sieverules.movingfilter', 'loading', 'sieverules.switchtoadveditor', 'sieverules.filterdeleteconfirm');
+ $this->api->output->add_gui_object('sieverules_list', 'sieverules-table');
+
+ $table = new html_table(array('id' => 'sieverules-table', 'class' => 'records-table', 'cellspacing' => '0', 'cols' => 2));
+
+ if (rcube::get_instance()->config->get('sieverules_multiplerules', false)) {
+ if ($this->current_ruleset == $this->sieve->get_active())
+ $status = html::img(array('id' => 'rulesetstatus', 'src' => $attrib['activeicon'], 'alt' => $this->gettext('isactive'), 'title' => $this->gettext('isactive')));
+ else
+ $status = html::img(array('id' => 'rulesetstatus', 'src' => $attrib['inactiveicon'], 'alt' => $this->gettext('isinactive'), 'title' => $this->gettext('isinactive')));
+
+ $table->add_header(array('colspan' => '2'), html::span(array('title' => $this->current_ruleset), $this->gettext(array('name' => 'filtersname', 'vars' => array('name' => $this->current_ruleset)))) . $status);
+ }
+ else {
+ $table->add_header(array('colspan' => 2), $this->gettext('filters'));
+ }
+
+ if (sizeof($this->script) == 0) {
+ $table->add(array('colspan' => '2'), rcube_utils::rep_specialchars_output($this->gettext('nosieverules')));
+ }
+ else foreach($this->script as $idx => $filter) {
+ $table->set_row_attribs(array('id' => 'rcmrow' . $idx));
+
+ if ($filter['disabled'] == 1)
+ $table->add(null, rcmail::Q($filter['name']) . ' (' . $this->gettext('disabled') . ')');
+ else
+ $table->add(null, rcmail::Q($filter['name']));
+
+ $dst = $idx - 1;
+ $up_link = $this->api->output->button(array('command' => 'plugin.sieverules.move', 'prop' => $dst, 'type' => 'link', 'class' => 'up_arrow', 'title' => 'sieverules.moveup', 'content' => ' '));
+ $dst = $idx + 2;
+ $down_link = $this->api->output->button(array('command' => 'plugin.sieverules.move', 'prop' => $dst, 'type' => 'link', 'class' => 'down_arrow', 'title' => 'sieverules.movedown', 'content' => ' '));
+
+ $table->add('control', $down_link . $up_link);
+ }
+
+ return html::tag('div', array('id' => 'sieverules-list-filters'), $table->show($attrib));
+ }
+
+ function gen_js_list()
+ {
+ $this->_startup();
+
+ if (sizeof($this->script) == 0) {
+ $this->api->output->command('sieverules_update_list', 'add-first', -1, rcube_utils::rep_specialchars_output($this->gettext('nosieverules')));
+ }
+ else foreach($this->script as $idx => $filter) {
+ if ($filter['disabled'] == 1)
+ $filter_name = $filter['name'] . ' (' . $this->gettext('disabled') . ')';
+ else
+ $filter_name = $filter['name'];
+
+ $tmp_output = new rcmail_output_html('settings');
+ $dst = $idx - 1;
+ $up_link = $tmp_output->button(array('command' => 'plugin.sieverules.move', 'prop' => $dst, 'type' => 'link', 'class' => 'up_arrow', 'title' => 'sieverules.moveup', 'content' => ' '));
+ $up_link = str_replace("'", "\'", $up_link);
+ $dst = $idx + 2;
+ $down_link = $tmp_output->button(array('command' => 'plugin.sieverules.move', 'prop' => $dst, 'type' => 'link', 'class' => 'down_arrow', 'title' => 'sieverules.movedown', 'content' => ' '));
+ $down_link = str_replace("'", "\'", $down_link);
+
+ $this->api->output->command('sieverules_update_list', $idx == 0 ? 'add-first' : 'add', 'rcmrow' . $idx, rcmail::JQ($filter_name), $down_link, $up_link);
+ }
+
+ $this->api->output->send();
+ }
+
+ function gen_examples($attrib)
+ {
+ if (sizeof($this->examples) > 0) {
+ $this->api->output->add_gui_object('sieverules_examples', 'sieverules-examples');
+
+ $examples = new html_table(array('id' => 'sieverules-examples', 'class' => 'records-table', 'cellspacing' => '0', 'cols' => 1));
+ $examples->add_header(null, $this->gettext('examplefilters'));
+
+ foreach($this->examples as $idx => $filter) {
+ $examples->set_row_attribs(array('id' => 'rcmrowex' . $idx));
+ $examples->add(null, rcmail::Q($filter['name']));
+ }
+
+ return html::tag('div', array('id' => 'sieverules-list-examples'), $examples->show($attrib));
+ }
+ else {
+ return '';
+ }
+
+ }
+
+ function gen_advswitch($attrib)
+ {
+ $input_adv = new html_checkbox(array('id' => 'adveditor', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_adveditor(this);', 'value' => '1'));
+ $out = html::label('adveditor', rcmail::Q($this->gettext('adveditor'))) . $input_adv->show($this->action == 'plugin.sieverules.advanced' ? '1' : '');
+ return html::tag('div', array('id' => 'advancedmode'), $out);
+ }
+
+ function gen_rulelist($attrib)
+ {
+ $this->api->output->add_label('sieverules.delrulesetconf', 'sieverules.rulesetexists');
+
+ $rulesets = array();
+ foreach ($this->sieve->list as $ruleset) {
+ array_push($rulesets, $ruleset);
+ }
+ sort($rulesets);
+ $activeruleset = $this->sieve->get_active();
+
+ $next_ruleset = '';
+ for ($i = 0; $i < sizeof($rulesets); $i++) {
+ if ($rulesets[$i] == $this->current_ruleset) {
+ $i++;
+
+ if ($i == sizeof($rulesets))
+ $i = sizeof($rulesets) - 2;
+
+ $next_ruleset = $rulesets[$i];
+ break;
+ }
+ }
+
+ $this->api->output->set_env('ruleset_total', sizeof($rulesets));
+ $this->api->output->set_env('ruleset_active', $this->current_ruleset == $activeruleset ? True : False);
+ $this->api->output->set_env('ruleset_next', $next_ruleset);
+
+ // new/rename ruleset dialog
+ $out = '';
+ $table = new html_table(array('cols' => 2, 'class' => 'propform'));
+ $table->set_row_attribs(array('id' => 'sieverulesrsdialog_input'));
+ $table->add('title', html::label('sieverulesrsdialog_name', rcmail::Q($this->gettext('name'))));
+ $table->add(null, html::tag('input', array('type' => 'text', 'id' => 'sieverulesrsdialog_name', 'name' => '_name', 'value' => '')));
+
+ $select_ruleset = new html_select(array('id' => 'sieverulesrsdialog_ruleset'));
+ if (sizeof($this->sieve->list) == 1) {
+ $select_ruleset->add(rcmail::Q($this->gettext('nosieverulesets')), '');
+ }
+ else foreach ($rulesets as $ruleset) {
+ if ($ruleset !== $this->current_ruleset)
+ $select_ruleset->add(rcmail::Q($ruleset), rcmail::Q($ruleset));
+ }
+
+ $table->set_row_attribs(array('id' => 'sieverulesrsdialog_select'));
+ $table->add('title', html::label('sieverulesrsdialog_ruleset', rcmail::Q($this->gettext('selectruleset'))));
+ $table->add(null, $select_ruleset->show());
+
+ $buttons = html::tag('input', array('type' => 'hidden', 'id' => 'sieverulesrsdialog_action', 'value' => ''));
+ $buttons .= html::tag('input', array('type' => 'button', 'class' => 'button mainaction', 'value' => $this->gettext('save'), 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverulesdialog_submit();')) . '&nbsp;';
+
+ $out .= html::tag('h3', array('id' => 'sieverulesrsdialog_add'), rcmail::Q($this->gettext('newruleset')));
+ $out .= html::tag('h3', array('id' => 'sieverulesrsdialog_edit', 'style' => 'display: none;'), rcmail::Q($this->gettext('renameruleset')));
+ $out .= html::tag('h3', array('id' => 'sieverulesrsdialog_copyto', 'style' => 'display: none;'), rcmail::Q($this->gettext('copytoruleset')));
+ $out .= html::tag('h3', array('id' => 'sieverulesrsdialog_copyfrom', 'style' => 'display: none;'), rcmail::Q($this->gettext('copyfromruleset')));
+ $out .= $table->show();
+ $out .= html::p(array('class' => 'formbuttons'), $buttons);
+ $out = html::tag('form', array(), $out);
+ $out = html::div(array('id' => 'sieverulesrsdialog', 'style' => 'display: none;'), $out);
+
+ // add overlay input box to html page
+ $this->api->output->add_footer($out);
+
+ $action = ($this->action == 'plugin.sieverules.advanced') ? 'plugin.sieverules.advanced' : 'plugin.sieverules';
+ if ($attrib['type'] == 'link') {
+ $lis = '';
+
+ if (sizeof($this->sieve->list) == 0) {
+ $href = html::a(array('href' => "#", 'class' => 'active', 'onclick' => 'return false;'), rcmail::Q($this->gettext('nosieverulesets')));
+ $lis .= html::tag('li', $href);
+ }
+ else foreach ($rulesets as $ruleset) {
+ $class = 'active';
+ if ($ruleset === $this->current_ruleset)
+ $class .= ' selected';
+
+ $ruleset_text = $ruleset;
+ if ($ruleset === $activeruleset)
+ $ruleset_text = str_replace('%s', $ruleset, $this->gettext('activeruleset'));
+
+ $href = html::a(array('href' => "#", 'class' => $class, 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_select_ruleset(\''. $ruleset .'\', \''. $action .'\');'), rcmail::Q($ruleset_text));
+ $lis .= html::tag('li', null, $href);
+ }
+
+ return $lis;
+ }
+ elseif ($attrib['type'] == 'select') {
+ $select_ruleset = new html_select(array('id' => 'rulelist', 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_select_ruleset(this, \''. $action .'\');'));
+
+ if (sizeof($this->sieve->list) == 0) {
+ $select_ruleset->add(rcmail::Q($this->gettext('nosieverulesets')), '');
+ }
+ else foreach ($rulesets as $ruleset) {
+ if ($ruleset === $activeruleset)
+ $ruleset = str_replace('%s', $ruleset, $this->gettext('activeruleset'));
+
+ $select_ruleset->add(rcmail::Q($ruleset), rcmail::Q($ruleset));
+ }
+
+ return html::label('rulelist', rcmail::Q($this->gettext('selectruleset'))) . $select_ruleset->show(rcmail::Q($this->current_ruleset));
+ }
+ }
+
+ function gen_setup()
+ {
+ $rcmail = rcube::get_instance();
+ $text = '';
+ $buttons = '';
+
+ if ($rcmail->config->get('sieverules_default_file', false) && is_readable($rcmail->config->get('sieverules_default_file'))) {
+ $text .= "<br /><br />" . $this->gettext('importdefault');
+ $buttons .= $this->api->output->button(array('command' => 'plugin.sieverules.import', 'prop' => '_import=_default_', 'type' => 'input', 'class' => 'button', 'label' => 'sieverules.usedefaultfilter'));
+ }
+ elseif ($rcmail->config->get('sieverules_default_file', false) && !is_readable($rcmail->config->get('sieverules_default_file'))) {
+ rcube::raise_error(array(
+ 'code' => 600,
+ 'type' => 'php',
+ 'file' => __FILE__,
+ 'line' => __LINE__,
+ 'message' => "SieveRules plugin: Unable to open default rule file"
+ ), true, false);
+ }
+
+ $type = '';
+ $ruleset = '';
+ if (sizeof($this->sieve->list) > 0) {
+ if ($result = $this->sieve->check_import()) {
+ list($type, $name, $ruleset) = $result;
+ $text .= "<br /><br />" . str_replace('%s', $name, $this->gettext('importother'));
+ $buttons .= (strlen($buttons) > 0) ? '&nbsp;&nbsp;' : '';
+ $buttons .= $this->api->output->button(array('command' => 'plugin.sieverules.import', 'prop' => '_type=' . $type . '&_import=' . $ruleset, 'type' => 'input', 'class' => 'button', 'label' => 'sieverules.importfilter'));
+ }
+
+ if ($rcmail->config->get('sieverules_multiplerules', false)) {
+ $text .= "<br /><br />" . $this->gettext('copyexisting');
+ $buttons .= (strlen($buttons) > 0) ? '&nbsp;&nbsp;' : '';
+ $buttons .= $this->api->output->button(array('command' => 'plugin.sieverules.ruleset_dialog_setup', 'prop' => 'copyfrom_ruleset', 'type' => 'input', 'class' => 'button', 'label' => 'sieverules.copyexistingfilter'));
+ }
+ }
+
+ if ($rcmail->config->get('sieverules_auto_load_default') && !$rcmail->config->get('sieverules_multiplerules', false) && $type != '' && $ruleset != '' && $ruleset == $this->sieve->get_active()) {
+ $this->import($type, $ruleset, false);
+
+ if (isset($_GET['_framed']) || isset($_POST['_framed'])) {
+ $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".goto_url('plugin.sieverules');");
+ }
+ else {
+ // go to sieverules page
+ $rcmail->overwrite_action('plugin.sieverules');
+ $this->api->output->send('sieverules.sieverules');
+ }
+ }
+ else if ($rcmail->config->get('sieverules_auto_load_default') && is_readable($rcmail->config->get('sieverules_default_file')) && strlen($text) > 0 && strlen($buttons) > 0 && $type == '' && $ruleset == '') {
+ $this->import($type, '_default_', false);
+
+ if (isset($_GET['_framed']) || isset($_POST['_framed'])) {
+ $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".goto_url('plugin.sieverules');");
+ }
+ else {
+ // go to sieverules page
+ $rcmail->overwrite_action('plugin.sieverules');
+ $this->api->output->send('sieverules.sieverules');
+ }
+ }
+ else if (strlen($text) > 0 && strlen($buttons) > 0) {
+ $out = "<br />". $this->gettext('noexistingfilters') . $text . "<br /><br /><br />\n";
+ $out .= $buttons;
+ $out .= "&nbsp;&nbsp;" . $this->api->output->button(array('command' => 'plugin.sieverules.import', 'prop' => '_import=_none_', 'type' => 'input', 'class' => 'button', 'label' => 'cancel'));
+
+ $out = html::tag('p', array('style' => 'text-align: center; padding: 10px;'), "\n" . $out);
+ $out = html::tag('div', array('id' => 'prefs-title', 'class' => 'boxtitle'), rcmail::Q($this->gettext('importfilters'))) . $out;
+
+ return $out;
+ }
+ else {
+ if ($rcmail->config->get('sieverules_auto_load_default') && !is_readable($rcmail->config->get('sieverules_default_file')))
+ rcube::raise_error(array(
+ 'code' => 600,
+ 'type' => 'php',
+ 'file' => __FILE__,
+ 'line' => __LINE__,
+ 'message' => "SieveRules plugin: Unable to open default rule file"
+ ), true, false);
+
+ $this->sieve->save();
+ if (!($rcmail->config->get('sieverules_multiplerules', false) && sizeof($this->sieve->list) > 1))
+ $this->sieve->set_active($this->current_ruleset);
+
+ if (isset($_GET['_framed']) || isset($_POST['_framed'])) {
+ $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".goto_url('plugin.sieverules');");
+ }
+ else {
+ // go to sieverules page
+ $rcmail->overwrite_action('plugin.sieverules');
+ $this->api->output->send('sieverules.sieverules');
+ }
+ }
+ }
+
+ function gen_form($attrib)
+ {
+ $rcmail = rcube::get_instance();
+ $this->include_script('jquery.maskedinput.js');
+ $this->api->output->add_label(
+ 'sieverules.norulename', 'sieverules.ruleexists', 'sieverules.noheader',
+ 'sieverules.headerbadchars', 'sieverules.noheadervalue', 'sieverules.sizewrongformat',
+ 'sieverules.noredirect', 'sieverules.redirectaddresserror', 'sieverules.noreject', 'sieverules.vacnodays',
+ 'sieverules.vacdayswrongformat', 'sieverules.vacnomsg', 'sieverules.notifynomethod', 'sieverules.missingfoldername',
+ 'sieverules.notifynomsg', 'sieverules.ruledeleteconfirm',
+ 'sieverules.actiondeleteconfirm', 'sieverules.notifyinvalidmethod', 'sieverules.nobodycontentpart',
+ 'sieverules.badoperator','sieverules.baddateformat','sieverules.badtimeformat','sieverules.vactoexp_err','editorwarning',
+ 'sieverules.eheadernoname','sieverules.eheadernoval');
+
+ $ext = $this->sieve->get_extensions();
+ $iid = rcube_utils::get_input_value('_iid', rcube_utils::INPUT_GPC);
+ if ($iid == '')
+ $iid = sizeof($this->script);
+
+ if (substr($iid, 0, 2) == 'ex') {
+ $cur_script = $this->examples[substr($iid, 2)];
+ $this->api->output->set_env('eid', $iid);
+ $iid = sizeof($this->script);
+ $this->api->output->set_env('iid', $iid);
+ $example = true;
+ }
+ else {
+ $cur_script = $this->script[$iid];
+ $this->api->output->set_env('iid', $iid);
+ $example = false;
+
+ if (isset($this->script[$iid]))
+ $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".sieverules_ready('".$iid."');");
+ }
+
+ if (sizeof($rcmail->config->get('sieverules_predefined_rules')) > 0) {
+ $predefined = array();
+ foreach($rcmail->config->get('sieverules_predefined_rules') as $idx => $data)
+ array_push($predefined, array($data['type'], $data['header'], $data['operator'], $data['extra'], $data['target']));
+
+ $this->api->output->set_env('predefined_rules', $predefined);
+ }
+
+ list($form_start, $form_end) = get_form_tags($attrib, 'plugin.sieverules.save');
+
+ $out = $form_start;
+
+ $hidden_iid = new html_hiddenfield(array('name' => '_iid', 'value' => $iid));
+ $out .= $hidden_iid->show();
+
+ // 'any' flag
+ if (sizeof($cur_script['tests']) == 1 && $cur_script['tests'][0]['type'] == 'true' && !$cur_script['tests'][0]['not'])
+ $any = true;
+
+ // filter disable
+ $field_id = 'rcmfd_disable';
+ $input_disable = new html_checkbox(array('name' => '_disable', 'id' => $field_id, 'value' => 1));
+
+ $out .= html::span('disableLink', html::label($field_id, rcmail::Q($this->gettext('disablerule')))
+ . "&nbsp;" . $input_disable->show($cur_script['disabled']));
+
+ // filter name input
+ $field_id = 'rcmfd_name';
+ $input_name = new html_inputfield(array('name' => '_name', 'id' => $field_id));
+
+ $out .= html::label($field_id, rcmail::Q($this->gettext('filtername')));
+ $out .= "&nbsp;" . $input_name->show($cur_script['name']);
+
+ $out .= "<br /><br />";
+
+ if (sizeof($cur_script['tests']) == 1 && $cur_script['tests'][0]['type'] == 'true' && !$cur_script['tests'][0]['not'])
+ $join_any = true;
+
+ $field_id = 'rcmfd_join_all';
+ $input_join = new html_radiobutton(array('name' => '_join', 'id' => $field_id, 'value' => 'allof', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_rule_join_radio(\'allof\')'));
+ $join_type = $input_join->show($cur_script['join'] && !$join_any ? 'allof' : '');
+ $join_type .= "&nbsp;" . html::label($field_id, rcmail::Q($this->gettext('filterallof')));
+
+ $field_id = 'rcmfd_join_anyof';
+ $input_join = new html_radiobutton(array('name' => '_join', 'id' => $field_id, 'value' => 'anyof', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_rule_join_radio(\'anyof\')'));
+ $join_type .= "&nbsp;" . $input_join->show($cur_script['join'] && !$join_any ? '' : 'anyof');
+ $join_type .= "&nbsp;" . html::label($field_id, rcmail::Q($this->gettext('filteranyof')));
+
+ $field_id = 'rcmfd_join_any';
+ $input_join = new html_radiobutton(array('name' => '_join', 'id' => $field_id, 'value' => 'any', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_rule_join_radio(\'any\')'));
+ $join_type .= "&nbsp;" . $input_join->show($join_any ? 'any' : '');
+ $join_type .= "&nbsp;" . html::label($field_id, rcmail::Q($this->gettext('filterany')));
+
+ $rules_table = new html_table(array('id' => 'rules-table', 'class' => 'records-table', 'cellspacing' => '0', 'cols' => 5));
+ $rules_table = $this->_rule_row($ext, $rules_table, null, $rcmail->config->get('sieverules_predefined_rules'), $attrib);
+
+ if (!$join_any) {
+ if (!isset($cur_script))
+ $rules_table = $this->_rule_row($ext, $rules_table, array(), $rcmail->config->get('sieverules_predefined_rules'), $attrib);
+ else foreach ($cur_script['tests'] as $rules)
+ $rules_table = $this->_rule_row($ext, $rules_table, $rules, $rcmail->config->get('sieverules_predefined_rules'), $attrib);
+ }
+
+ $this->api->output->set_env('sieverules_rules', $rules_table->size());
+
+ $out .= html::tag('fieldset', null, html::tag('legend', null, rcmail::Q($this->gettext('messagesrules')))
+ . rcmail::Q((!$rcmail->config->get('sieverules_use_elsif', true)) ? $this->gettext('sieveruleexp_stop'): $this->gettext('sieveruleexp')) . "<br /><br />"
+ . $join_type . "<br /><br />"
+ . $rules_table->show($attrib));
+
+ $rcmail->storage_init();
+ $actions_table = new html_table(array('id' => 'actions-table', 'class' => 'records-table', 'cellspacing' => '0', 'cols' => 3));
+ $actions_table = $this->_action_row($ext, $actions_table, 'rowid', null, $attrib, $example);
+
+ if (!isset($cur_script))
+ $actions_table = $this->_action_row($ext, $actions_table, 0, array(), $attrib, $example);
+ else foreach ($cur_script['actions'] as $idx => $actions)
+ $actions_table = $this->_action_row($ext, $actions_table, $idx, $actions, $attrib, $example);
+
+ $this->api->output->set_env('sieverules_actions', $actions_table->size());
+ $this->api->output->set_env('sieverules_htmleditor', $rcmail->config->get('htmleditor'));
+
+ $out .= html::tag('fieldset', null, html::tag('legend', null, rcmail::Q($this->gettext('messagesactions')))
+ . rcmail::Q($this->gettext('sieveactexp')). "<br /><br />"
+ . $actions_table->show($attrib));
+
+ $out .= $form_end;
+
+ // output sigs for vacation messages
+ $user_identities = $rcmail->user->list_identities();
+ if (count($user_identities)) {
+ foreach ($user_identities as $sql_arr) {
+ // add signature to array
+ if (!empty($sql_arr['signature'])) {
+ $identity_id = $sql_arr['identity_id'];
+ $a_signatures[$identity_id]['text'] = $sql_arr['signature'];
+
+ if ($sql_arr['html_signature'] == 1) {
+ $h2t = new rcube_html2text($a_signatures[$identity_id]['text'], false, false);
+ $a_signatures[$identity_id]['text'] = trim($h2t->get_text());
+ }
+ }
+ }
+
+ $this->api->output->set_env('signatures', $a_signatures);
+ }
+
+ return $out;
+ }
+
+ function move()
+ {
+ $this->_startup();
+
+ $src = rcube_utils::get_input_value('_src', rcube_utils::INPUT_GET);
+ $dst = rcube_utils::get_input_value('_dst', rcube_utils::INPUT_GET);
+
+ $result = $this->sieve->script->move_rule($src, $dst);
+ $result = $this->sieve->save();
+
+ if ($result === true)
+ $this->api->output->command('sieverules_update_list', 'move', $src , $dst);
+ else
+ $this->api->output->command('display_message', $result !== false ? $result : $this->gettext('filtersaveerror'), 'error');
+
+ $this->api->output->send();
+ }
+
+ function save()
+ {
+ $rcmail = rcube::get_instance();
+ $this->_startup();
+
+ $script = trim(rcube_utils::get_input_value('_script', rcube_utils::INPUT_POST, true));
+ if ($script != '' && ($rcmail->config->get('sieverules_adveditor') == 1 || $rcmail->config->get('sieverules_adveditor') == 2)) {
+ $script = $this->_strip_val($script);
+ $save = $this->sieve->save($script);
+
+ if ($save === true) {
+ $this->api->output->command('display_message', $this->gettext('filtersaved'), 'confirmation');
+ $this->sieve->get_script();
+ }
+ else {
+ $this->api->output->command('display_message', $save !== false ? $save : $this->gettext('filtersaveerror'), 'error');
+ }
+
+ // go to next step
+ $rcmail->overwrite_action('plugin.sieverules.advanced');
+ $this->action = 'plugin.sieverules.advanced';
+ $this->init_html();
+ }
+ else {
+ // check if POST var limits have been reached
+ // code by Aleksander Machniak
+ $max_post = max(array(
+ ini_get('max_input_vars'),
+ ini_get('suhosin.request.max_vars'),
+ ini_get('suhosin.post.max_vars'),
+ ));
+
+ $max_depth = max(array(
+ ini_get('suhosin.request.max_array_depth'),
+ ini_get('suhosin.post.max_array_depth'),
+ ));
+
+ // check request size limit
+ if ($max_post && count($_POST, COUNT_RECURSIVE) >= $max_post) {
+ rcube::raise_error(array(
+ 'code' => 500,
+ 'type' => 'php',
+ 'file' => __FILE__,
+ 'line' => __LINE__,
+ 'message' => "SieveRules plugin: max_input_vars, suhosin.request.max_vars or suhosin.post.max_vars limit reached."
+ ), true, false);
+
+ $this->api->output->command('display_message', $this->gettext('filtersaveerror'), 'error');
+
+ // go to next step
+ $rcmail->overwrite_action('plugin.sieverules.edit');
+ $this->action = 'plugin.sieverules.edit';
+ $this->init_html();
+
+ return;
+ }
+ // check request depth limits
+ else if ($max_depth && count($_POST['_test']) > $max_depth) {
+ rcube::raise_error(array(
+ 'code' => 500,
+ 'type' => 'php',
+ 'file' => __FILE__,
+ 'line' => __LINE__,
+ 'message' => "SieveRules plugin: suhosin.request.max_array_depth or suhosin.post.max_array_depth limit reached."
+ ), true, false);
+
+ $this->api->output->command('display_message', $this->gettext('filtersaveerror'), 'error');
+
+ // go to next step
+ $rcmail->overwrite_action('plugin.sieverules.edit');
+ $this->action = 'plugin.sieverules.edit';
+ $this->init_html();
+
+ return;
+ }
+
+ $name = trim(rcube_utils::get_input_value('_name', rcube_utils::INPUT_POST, true));
+ $iid = trim(rcube_utils::get_input_value('_iid', rcube_utils::INPUT_POST));
+ $join = trim(rcube_utils::get_input_value('_join', rcube_utils::INPUT_POST));
+ $disabled = trim(rcube_utils::get_input_value('_disable', rcube_utils::INPUT_POST));
+
+ $tests = rcube_utils::get_input_value('_test', rcube_utils::INPUT_POST);
+ $headers = rcube_utils::get_input_value('_header', rcube_utils::INPUT_POST);
+ $bodyparts = rcube_utils::get_input_value('_bodypart', rcube_utils::INPUT_POST);
+ $ops = rcube_utils::get_input_value('_operator', rcube_utils::INPUT_POST);
+ $sizeops = rcube_utils::get_input_value('_size_operator', rcube_utils::INPUT_POST);
+ $dateops = rcube_utils::get_input_value('_date_operator', rcube_utils::INPUT_POST);
+ $spamtestops = rcube_utils::get_input_value('_spamtest_operator', rcube_utils::INPUT_POST);
+ $targets = rcube_utils::get_input_value('_target', rcube_utils::INPUT_POST, true);
+ $sizeunits = rcube_utils::get_input_value('_units', rcube_utils::INPUT_POST);
+ $contentparts = rcube_utils::get_input_value('_body_contentpart', rcube_utils::INPUT_POST);
+ $comparators = rcube_utils::get_input_value('_comparator', rcube_utils::INPUT_POST);
+ $advops = rcube_utils::get_input_value('_advoperator', rcube_utils::INPUT_POST);
+ $advtargets = rcube_utils::get_input_value('_advtarget', rcube_utils::INPUT_POST, true);
+ $actions = rcube_utils::get_input_value('_act', rcube_utils::INPUT_POST);
+ $folders = rcube_utils::get_input_value('_folder', rcube_utils::INPUT_POST);
+ $customfolders = rcube_utils::get_input_value('_customfolder', rcube_utils::INPUT_POST);
+ $addresses = rcube_utils::get_input_value('_redirect', rcube_utils::INPUT_POST);
+ $rejects = rcube_utils::get_input_value('_reject', rcube_utils::INPUT_POST);
+ $vacfroms = rcube_utils::get_input_value('_vacfrom', rcube_utils::INPUT_POST);
+ $vactos = rcube_utils::get_input_value('_vacto', rcube_utils::INPUT_POST);
+ $days = rcube_utils::get_input_value('_day', rcube_utils::INPUT_POST);
+ $handles = rcube_utils::get_input_value('_handle', rcube_utils::INPUT_POST);
+ $subjects = rcube_utils::get_input_value('_subject', rcube_utils::INPUT_POST, true);
+ $origsubjects = rcube_utils::get_input_value('_orig_subject', rcube_utils::INPUT_POST, true);
+ $msgs = rcube_utils::get_input_value('_msg', rcube_utils::INPUT_POST, true);
+ $htmlmsgs = rcube_utils::get_input_value('_htmlmsg', rcube_utils::INPUT_POST, true);
+ $charsets = rcube_utils::get_input_value('_vaccharset', rcube_utils::INPUT_POST);
+ $flags = rcube_utils::get_input_value('_imapflags', rcube_utils::INPUT_POST);
+ $nfroms = rcube_utils::get_input_value('_nfrom', rcube_utils::INPUT_POST);
+ $nimpts = rcube_utils::get_input_value('_nimpt', rcube_utils::INPUT_POST);
+ $nmethods = rcube_utils::get_input_value('_nmethod', rcube_utils::INPUT_POST);
+ $noptions = rcube_utils::get_input_value('_noption', rcube_utils::INPUT_POST);
+ $nmsgs = rcube_utils::get_input_value('_nmsg', rcube_utils::INPUT_POST, true);
+ $dateparts = rcube_utils::get_input_value('_datepart', rcube_utils::INPUT_POST);
+ $weekdays = rcube_utils::get_input_value('_weekday', rcube_utils::INPUT_POST);
+ $advweekdays = rcube_utils::get_input_value('_advweekday', rcube_utils::INPUT_POST);
+ $advweekdays = rcube_utils::get_input_value('_advweekday', rcube_utils::INPUT_POST);
+ $eheadnames = rcube_utils:: get_input_value('_eheadname', rcube_utils::INPUT_POST, true);
+ $eheadvals = rcube_utils::get_input_value('_eheadval', rcube_utils::INPUT_POST, true);
+ $eheadopps = rcube_utils::get_input_value('_eheadopp', rcube_utils::INPUT_POST);
+ $eheadindexes = rcube_utils::get_input_value('_eheadindex', rcube_utils::INPUT_POST);
+
+ $script = array();
+ $script['join'] = ($join == 'allof') ? true : false;
+ $script['name'] = $name;
+ $script['disabled'] = $disabled;
+ $script['tests'] = array();
+ $script['actions'] = array();
+
+ // rules
+ $i = 0;
+ if ($join == 'any') {
+ $script['tests'][0]['type'] = 'true';
+ }
+ else foreach($tests as $idx => $type) {
+ // ignore the first (default) row
+ if ($idx == 0)
+ continue;
+
+ $header = $this->_strip_val($headers[$idx]);
+ $op = $this->_strip_val($ops[$idx]);
+ $bodypart = $this->_strip_val($bodyparts[$idx]);
+ $advop = $this->_strip_val($advops[$idx]);
+ $contentpart = $this->_strip_val($contentparts[$idx]);
+ $target = $this->_strip_val($targets[$idx]);
+ $advtarget = $this->_strip_val($advtargets[$idx]);
+ $comparator = $this->_strip_val($comparators[$idx]);
+ $datepart = $this->_strip_val($dateparts[$idx]);
+ $weekday = $this->_strip_val($weekdays[$idx]);
+ $advweekday = $this->_strip_val($advweekdays[$idx]);
+
+ switch ($type) {
+ case 'size':
+ $sizeop = $this->_strip_val($sizeops[$idx]);
+ $sizeunit = $this->_strip_val($sizeunits[$idx]);
+
+ $script['tests'][$i]['type'] = 'size';
+ $script['tests'][$i]['operator'] = $sizeop;
+ $script['tests'][$i]['target'] = $target.$sizeunit;
+ break;
+ case 'spamtest':
+ case 'virustest':
+ $spamtestop = $this->_strip_val($spamtestops[$idx]);
+
+ $script['tests'][$i]['type'] = $type;
+ $script['tests'][$i]['operator'] = $spamtestop;
+ $script['tests'][$i]['target'] = $target;
+ break;
+ case 'date':
+ $op = $this->_strip_val($dateops[$idx]);
+
+ if ($datepart == 'weekday')
+ $target = $weekday;
+
+ $script['tests'][$i]['datepart'] = $datepart;
+ case 'body':
+ $script['tests'][$i]['bodypart'] = $bodypart;
+
+ if ($bodypart == 'content')
+ $script['tests'][$i]['contentpart'] = $contentpart;
+ else
+ $script['tests'][$i]['contentpart'] = '';
+ case 'exists':
+ case 'header':
+ case 'address':
+ case 'envelope':
+ if (preg_match('/^not/', $op) || preg_match('/^not/', $advop))
+ $script['tests'][$i]['not'] = true;
+ else
+ $script['tests'][$i]['not'] = '';
+
+ $op = preg_replace('/^not/', '', $op);
+ $advop = preg_replace('/^not/', '', $advop);
+ $header = preg_match('/[\s,]+/', $header) ? preg_split('/[\s,]+/', $header, -1, PREG_SPLIT_NO_EMPTY) : $header;
+
+ if ($op == 'exists') {
+ $script['tests'][$i]['type'] = 'exists';
+ $script['tests'][$i]['operator'] = 'exists';
+ $script['tests'][$i]['header'] = $header;
+ }
+ elseif ($op == 'advoptions') {
+ $script['tests'][$i]['type'] = $type;
+ $script['tests'][$i]['operator'] = $advop;
+ $script['tests'][$i]['header'] = $header;
+ $script['tests'][$i]['target'] = $advtarget;
+
+ if (substr($advop, 0, 5) == 'count' || substr($advop, 0, 5) == 'value')
+ $script['tests'][$i]['comparator'] = $comparator;
+ else
+ $script['tests'][$i]['comparator'] = '';
+ }
+ else {
+ $script['tests'][$i]['type'] = $type;
+ $script['tests'][$i]['operator'] = $op;
+ $script['tests'][$i]['header'] = $header;
+ $script['tests'][$i]['target'] = $target;
+ }
+ break;
+ }
+ $i++;
+ }
+
+ // actions
+ $i = 0;
+ foreach($actions as $idx => $type) {
+ // ignore the first (default) row
+ if ($idx == 0)
+ continue;
+
+ $type = $this->_strip_val($type);
+
+ $script['actions'][$i]['type'] = $type;
+
+ switch ($type) {
+ case 'fileinto':
+ case 'fileinto_copy':
+ $folder = $this->_strip_val($folders[$idx], false, false);
+ $rcmail = rcube::get_instance();
+ $rcmail->storage_init();
+ $script['actions'][$i]['create'] = false;
+ if ($folder == '@@newfolder') {
+ $script['actions'][$i]['create'] = true;
+ $folder = $this->_strip_val($customfolders[$idx]);
+ $folder = $rcmail->config->get('sieverules_include_imap_root', true) ? $rcmail->storage->mod_folder($folder, 'IN') : $folder;
+ }
+ $script['actions'][$i]['target'] = $rcmail->config->get('sieverules_include_imap_root', true) ? $folder : $rcmail->storage->mod_folder($folder);
+ if ($rcmail->config->get('sieverules_folder_delimiter', false))
+ $script['actions'][$i]['target'] = str_replace($rcmail->storage->get_hierarchy_delimiter(), $rcmail->config->get('sieverules_folder_delimiter'), $script['actions'][$i]['target']);
+ break;
+ case 'redirect':
+ case 'redirect_copy':
+ $address = $this->_strip_val($addresses[$idx]);
+ $script['actions'][$i]['target'] = $address;
+ break;
+ case 'reject':
+ case 'ereject':
+ $rejects = $this->_strip_val($rejects[$idx]);
+ $script['actions'][$i]['target'] = $rejects;
+ break;
+ case 'vacation':
+ $from = $this->_strip_val($vacfroms[$idx]);
+ $to = $this->_strip_val($vactos[$idx]);
+ $day = $this->_strip_val($days[$idx]);
+ $handle = $this->_strip_val($handles[$idx]);
+ $subject = $this->_strip_val($subjects[$idx]);
+ $origsubject = $this->_strip_val($origsubjects[$idx]);
+ $htmlmsg = $this->_strip_val($htmlmsgs[$idx]);
+ $msg = ($htmlmsg == "1") ? $msgs[$idx] : $this->_strip_val($msgs[$idx]);
+ $charset = $this->_strip_val($charsets[$idx]);
+
+ // format from address
+ if (is_numeric($from)) {
+ if (is_array($identity_arr = $this->_rcmail_get_identity($from))) {
+ if ($identity_arr['val_string'])
+ $from = $identity_arr['val_string'];
+ }
+ else {
+ $from = null;
+ }
+ }
+
+ $script['actions'][$i]['days'] = $day;
+ $script['actions'][$i]['subject'] = $subject;
+ $script['actions'][$i]['origsubject'] = $origsubject;
+ $script['actions'][$i]['from'] = $from;
+ $script['actions'][$i]['addresses'] = $to;
+ $script['actions'][$i]['handle'] = $handle;
+ $script['actions'][$i]['msg'] = $msg;
+ $script['actions'][$i]['htmlmsg'] = ($htmlmsg == "1") ? true : false;
+ $script['actions'][$i]['charset'] = $charset;
+ break;
+ case 'imapflags':
+ case 'imap4flags':
+ $flag = $this->_strip_val($flags[$idx]);
+ $script['actions'][$i]['target'] = $flag;
+ break;
+ case 'notify':
+ case 'enotify':
+ $from = $this->_strip_val($nfroms[$idx]);
+ $importance = $this->_strip_val($nimpts[$idx]);
+ $method = $this->_strip_val($nmethods[$idx]);
+ $option = $this->_strip_val($noptions[$idx]);
+ $msg = $this->_strip_val($nmsgs[$idx]);
+
+ // format from address
+ if (is_numeric($from)) {
+ if (is_array($identity_arr = $this->_rcmail_get_identity($from))) {
+ if ($identity_arr['val_string'])
+ $from = $identity_arr['val_string'];
+ }
+ else {
+ $from = null;
+ }
+ }
+
+ $script['actions'][$i]['from'] = $from;
+ $script['actions'][$i]['importance'] = $importance;
+ $script['actions'][$i]['method'] = $method;
+ $script['actions'][$i]['options'] = $option;
+ $script['actions'][$i]['msg'] = $msg;
+ break;
+ case 'editheaderadd':
+ case 'editheaderrem':
+ $name = $this->_strip_val($eheadnames[$idx]);
+ $value = $this->_strip_val($eheadvals[$idx]);
+ $script['actions'][$i]['name'] = $name;
+ $script['actions'][$i]['value'] = $value;
+ $script['actions'][$i]['index'] = $eheadindexes[$idx];
+
+ if (strlen($script['actions'][$i]['value']) > 0)
+ $script['actions'][$i]['operator'] = $eheadopps[$idx];
+
+ break;
+ }
+
+ $i++;
+ }
+
+ if (!isset($this->script[$iid]))
+ $result = $this->sieve->script->add_rule($script);
+ else
+ $result = $this->sieve->script->update_rule($iid, $script);
+
+ if ($result === true)
+ $save = $this->sieve->save();
+
+ if ($save === true && $result === true && !($rcmail->config->get('sieverules_multiplerules', false) && sizeof($this->sieve->list) > 1))
+ $save = $this->sieve->set_active($this->current_ruleset);
+
+ if ($save === true && $result === true) {
+ $this->api->output->command('display_message', $this->gettext('filtersaved'), 'confirmation');
+
+ if ($script['disabled'] == 1)
+ $filter_name = $script['name'] . ' (' . $this->gettext('disabled') . ')';
+ else
+ $filter_name = $script['name'];
+
+ $dst = $iid - 1;
+ $up_link = $this->api->output->button(array('command' => 'plugin.sieverules.move', 'prop' => $dst, 'type' => 'link', 'class' => 'up_arrow', 'title' => 'sieverules.moveup', 'content' => ' '));
+ $up_link = str_replace("'", "\'", $up_link);
+ $dst = $iid + 2;
+ $down_link = $this->api->output->button(array('command' => 'plugin.sieverules.move', 'prop' => $dst, 'type' => 'link', 'class' => 'down_arrow', 'title' => 'sieverules.movedown', 'content' => ' '));
+ $down_link = str_replace("'", "\'", $down_link);
+
+ if (!isset($this->script[$iid]) && sizeof($this->script) == 0)
+ $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".sieverules_update_list('add-first', 'rcmrow". $iid ."', '". rcmail::Q($filter_name) ."', '". $down_link ."', '". $up_link ."');");
+ elseif (!isset($this->script[$iid]))
+ $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".sieverules_update_list('add', 'rcmrow". $iid ."', '". rcmail::Q($filter_name) ."', '". $down_link ."', '". $up_link ."');");
+ else
+ $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".sieverules_update_list('update', ". $iid .", '". rcmail::Q($filter_name) ."');");
+ }
+ else {
+ if ($result === SIEVE_ERROR_BAD_ACTION)
+ $this->api->output->command('display_message', $this->gettext('filteractionerror'), 'error');
+ elseif ($result === SIEVE_ERROR_NOT_FOUND)
+ $this->api->output->command('display_message', $this->gettext('filtermissingerror'), 'error');
+ else
+ $this->api->output->command('display_message', $save !== false ? $save : $this->gettext('filtersaveerror'), 'error');
+ }
+
+ // update rule list
+ if ($this->sieve_error)
+ $this->script = array();
+ else
+ $this->script = $this->sieve->script->as_array();
+
+ // go to next step
+ $rcmail->overwrite_action('plugin.sieverules.edit');
+ $this->action = 'plugin.sieverules.edit';
+ $this->init_html();
+ }
+ }
+
+ function delete()
+ {
+ $this->_startup();
+
+ $result = false;
+ $ids = rcube_utils::get_input_value('_iid', rcube_utils::INPUT_GET);
+ if (is_numeric($ids) && isset($this->script[$ids]) && !$this->sieve_error) {
+ $result = $this->sieve->script->delete_rule($ids);
+ if ($result === true)
+ $result = $this->sieve->save();
+ }
+
+ if ($result === true) {
+ $this->api->output->command('display_message', $this->gettext('filterdeleted'), 'confirmation');
+ $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".sieverules_update_list('delete', ". $ids .");");
+ }
+ elseif ($result === SIEVE_ERROR_NOT_FOUND)
+ $this->api->output->command('display_message', $this->gettext('filtermissingerror'), 'error');
+ else
+ $this->api->output->command('display_message', $result !== false ? $result : $this->gettext('filterdeleteerror'), 'error');
+
+ // update rule list
+ if ($this->sieve_error)
+ $this->script = array();
+ else
+ $this->script = $this->sieve->script->as_array();
+
+ if (isset($_GET['_framed']) || isset($_POST['_framed'])) {
+ $this->api->output->add_script("parent.". rcmail_output::JS_OBJECT_NAME .".show_contentframe(false);");
+ }
+ else {
+ // go to sieverules page
+ rcube::get_instance()->overwrite_action('plugin.sieverules');
+ $this->action = 'plugin.sieverules';
+ $this->init_html();
+ }
+ }
+
+ function import($type = null, $ruleset = null, $redirect = true)
+ {
+ $rcmail = rcube::get_instance();
+ $this->_startup();
+
+ if (!$type && !$ruleset) {
+ $type = rcube_utils::get_input_value('_type', rcube_utils::INPUT_GET);
+ $ruleset = rcube_utils::get_input_value('_import', rcube_utils::INPUT_GET);
+ }
+
+ if ($ruleset == '_default_') {
+ if ($rcmail->config->get('sieverules_default_file', false) && is_readable($rcmail->config->get('sieverules_default_file'))) {
+ $this->sieve->script->add_text(file_get_contents($rcmail->config->get('sieverules_default_file')));
+ $save = $this->sieve->save();
+
+ if ($save === true && !($rcmail->config->get('sieverules_multiplerules', false) && sizeof($this->sieve->list) > 1))
+ $save = $this->sieve->set_active($this->current_ruleset);
+
+ if ($save === true)
+ $this->api->output->command('display_message', $this->gettext('filterimported'), 'confirmation');
+ else
+ $this->api->output->command('display_message', $save !== false ? $save : $this->gettext('filterimporterror'), 'error');
+
+ // update rule list
+ if ($this->sieve_error)
+ $this->script = array();
+ else
+ $this->script = $this->sieve->script->as_array();
+ }
+ elseif ($rcmail->config->get('sieverules_default_file', false) && !is_readable($rcmail->config->get('sieverules_default_file'))) {
+ rcube::raise_error(array(
+ 'code' => 600,
+ 'type' => 'php',
+ 'file' => __FILE__,
+ 'line' => __LINE__,
+ 'message' => "SieveRules plugin: Unable to open default rule file"
+ ), true, false);
+ }
+ }
+ elseif ($ruleset == '_example_') {
+ if (rcube_utils::get_input_value('_eids', rcube_utils::INPUT_GET)) {
+ $pos = rcube_utils::get_input_value('_pos', rcube_utils::INPUT_GET);
+ $eids = explode(",", rcube_utils::get_input_value('_eids', rcube_utils::INPUT_GET));
+
+ if ($pos == 'end')
+ $pos = null;
+ else
+ $pos = substr($pos, 6);
+
+ foreach ($eids as $eid) {
+ $this->sieve->script->add_rule($this->examples[substr($eid, 2)], $pos);
+ if ($pos) $pos++;
+ }
+
+ $this->sieve->save();
+ if (!($rcmail->config->get('sieverules_multiplerules', false) && sizeof($this->sieve->list) > 1))
+ $this->sieve->set_active($this->current_ruleset);
+
+ // update rule list
+ if ($this->sieve_error)
+ $this->script = array();
+ else
+ $this->script = $this->sieve->script->as_array();
+ }
+ }
+ elseif ($ruleset == '_none_') {
+ $this->sieve->save();
+ if (!($rcmail->config->get('sieverules_multiplerules', false) && sizeof($this->sieve->list) > 1))
+ $this->sieve->set_active($this->current_ruleset);
+ }
+ elseif ($ruleset == '_copy_') {
+ $this->rename_ruleset(true);
+ return;
+ }
+ elseif ($type != '' && $ruleset != '') {
+ $import = $this->sieve->do_import($type, $ruleset);
+
+ if ($import) {
+ $this->script = $this->sieve->script->as_array();
+ $this->sieve->save();
+
+ if (!($rcmail->config->get('sieverules_multiplerules', false) && sizeof($this->sieve->list) > 1))
+ $this->sieve->set_active($this->current_ruleset);
+
+ $this->api->output->command('display_message', $this->gettext('filterimported'), 'confirmation');
+ }
+ else {
+ $this->script = array();
+ if (!$redirect) $this->sieve->save();
+ $this->api->output->command('display_message', $this->gettext('filterimporterror'), 'error');
+ }
+ }
+
+ if ($redirect) {
+ // go to sieverules page
+ $rcmail->overwrite_action('plugin.sieverules');
+ $this->action = 'plugin.sieverules';
+ $this->init_html();
+ }
+ }
+
+ function delete_ruleset()
+ {
+ $this->_startup();
+ $this->sieve->del_script($this->current_ruleset);
+
+ $this->current_ruleset = rcube_utils::get_input_value('_next', rcube_utils::INPUT_GET);
+
+ rcube::get_instance()->overwrite_action('plugin.sieverules');
+ $this->action = 'plugin.sieverules';
+ $this->init_html();
+ }
+
+ function rename_ruleset($makeCopy = false)
+ {
+ $this->_startup();
+ $script = $this->sieve->script->as_text();
+ $active = $this->sieve->get_active() == $this->current_ruleset ? true : false;
+
+ $old_ruleset = $this->current_ruleset;
+ $this->current_ruleset = rcube_utils::get_input_value('_new', rcube_utils::INPUT_GET, true);
+ $this->sieve->set_ruleset($this->current_ruleset);
+ $this->sieve->save($script);
+
+ if (!$makeCopy) {
+ if ($active)
+ $this->sieve->set_active($this->current_ruleset);
+
+ $this->sieve->del_script($old_ruleset);
+ }
+
+ rcube::get_instance()->overwrite_action('plugin.sieverules');
+ $this->action = 'plugin.sieverules';
+ $this->init_html();
+ }
+
+ function enable_ruleset()
+ {
+ $this->_startup();
+ $activeruleset = rcube_utils::get_input_value('_ruleset', rcube_utils::INPUT_GET, true);
+ $this->sieve->set_active($activeruleset);
+
+ if (rcube_utils::get_input_value('_reload', rcube_utils::INPUT_GET, true) == "1") {
+ rcube::get_instance()->overwrite_action('plugin.sieverules');
+ $this->action = 'plugin.sieverules';
+ $this->init_html();
+ }
+ else {
+ $rulesets = array();
+ foreach ($this->sieve->list as $ruleset)
+ array_push($rulesets, $ruleset);
+
+ sort($rulesets);
+
+ foreach ($rulesets as $ruleset) {
+ if ($ruleset === $activeruleset)
+ $this->api->output->command('sieverules_add_ruleset', rcmail::Q($ruleset), rcmail::Q(str_replace('%s', $ruleset, $this->gettext('activeruleset'))));
+ else
+ $this->api->output->command('sieverules_add_ruleset', rcmail::Q($ruleset), rcmail::Q($ruleset));
+ }
+
+ $this->api->output->send();
+ }
+ }
+
+ function copy_filter()
+ {
+ $this->_startup();
+ $script = $this->script[rcube_utils::get_input_value('_iid', rcube_utils::INPUT_GET)];
+ $this->current_ruleset = rcube_utils::get_input_value('_dest', rcube_utils::INPUT_GET);
+ $this->_startup();
+ $this->sieve->script->add_rule($script);
+ $this->sieve->save();
+
+ $this->api->output->command('display_message', $this->gettext('filtercopied'), 'confirmation');
+ $this->api->output->send();
+ }
+
+ private function _startup()
+ {
+ $rcmail = rcube::get_instance();
+
+ if (!$this->sieve) {
+ include('lib/Net/Sieve.php');
+ include('include/rcube_sieve.php');
+ include('include/rcube_sieve_script.php');
+ $rcmail = rcube::get_instance();
+
+ // try to connect to managesieve server and to fetch the script
+ $this->sieve = new rcube_sieve($_SESSION['username'],
+ $rcmail->decrypt($_SESSION['password']),
+ rcube_utils::idn_to_ascii(rcube_utils::parse_host($rcmail->config->get('sieverules_host'))),
+ $rcmail->config->get('sieverules_port'), $rcmail->config->get('sieverules_auth_type', NULL),
+ $rcmail->config->get('sieverules_usetls'), $this->current_ruleset,
+ $this->home, $rcmail->config->get('sieverules_use_elsif', true),
+ $rcmail->config->get('sieverules_auth_cid', NULL), $rcmail->config->get('sieverules_auth_pw', NULL));
+
+ if ($rcmail->config->get('sieverules_debug', false))
+ $this->sieve->set_debug(true);
+
+ $this->sieve_error = $this->sieve->error();
+
+ if ($this->sieve_error == SIEVE_ERROR_NOT_EXISTS) {
+ // load default rule set
+ if (($rcmail->config->get('sieverules_default_file', false) && is_readable($rcmail->config->get('sieverules_default_file'))) || sizeof($this->sieve->list) > 0) {
+ $rcmail->overwrite_action('plugin.sieverules.setup');
+ $this->action = 'plugin.sieverules.setup';
+ }
+ elseif ($rcmail->config->get('sieverules_default_file', false) && !is_readable($rcmail->config->get('sieverules_default_file'))) {
+ rcube::raise_error(array(
+ 'code' => 600,
+ 'type' => 'php',
+ 'file' => __FILE__,
+ 'line' => __LINE__,
+ 'message' => "SieveRules plugin: Unable to open default rule file"
+ ), true, false);
+ }
+
+ // that's not exactly an error
+ $this->sieve_error = false;
+ }
+ elseif ($this->sieve_error) {
+ switch ($this->sieve_error) {
+ case SIEVE_ERROR_CONNECTION:
+ case SIEVE_ERROR_LOGIN:
+ $this->api->output->command('display_message', $this->gettext('filterconnerror'), 'error');
+ break;
+ default:
+ $this->api->output->command('display_message', $this->gettext('filterunknownerror'), 'error');
+ break;
+ }
+
+ $this->api->output->set_env('sieveruleserror', true);
+ }
+
+ // finally set script objects
+ if ($this->sieve_error) {
+ $this->script = array();
+ }
+ else {
+ $this->script = $this->sieve->script->as_array();
+
+ // load example filters
+ if ($rcmail->config->get('sieverules_example_file', false) && is_readable($rcmail->config->get('sieverules_example_file')))
+ $this->examples = $this->sieve->script->parse_text(file_get_contents($rcmail->config->get('sieverules_example_file')));
+ elseif ($rcmail->config->get('sieverules_example_file', false) && !is_readable($rcmail->config->get('sieverules_example_file')))
+ rcube::raise_error(array(
+ 'code' => 600,
+ 'type' => 'php',
+ 'file' => __FILE__,
+ 'line' => __LINE__,
+ 'message' => "SieveRules plugin: Unable to open example rule file"
+ ), true, false);
+ }
+ }
+ else {
+ $this->sieve->set_ruleset($this->current_ruleset);
+ $this->script = $this->sieve->script->as_array();
+ }
+ }
+
+ private function _rule_row($ext, $rules_table, $rule, $predefined_rules, $attrib)
+ {
+ $rcmail = rcube::get_instance();
+
+ if (!isset($rule))
+ $rules_table->set_row_attribs(array('style' => 'display: none;'));
+
+ if (in_array('regex', $ext) || in_array('relational', $ext) || in_array('subaddress', $ext))
+ $this->operators['filteradvoptions'] = 'advoptions';
+
+ $header_style = 'visibility: hidden;';
+ $op_style = '';
+ $sizeop_style = 'display: none;';
+ $dateop_style = 'display: none;';
+ $spamtestop_style = 'display: none;';
+ $target_style = '';
+ $units_style = 'display: none;';
+ $bodypart_style = 'display: none;';
+ $datepart_style = 'display: none;';
+ $advcontentpart_style = 'display: none;';
+ $spam_prob_style = 'display: none;';
+ $virus_prob_style = 'display: none;';
+ $weekdays_style = 'display: none;';
+ $advweekdays_style = 'display: none;';
+ $advtarget_style = '';
+
+ $test = 'header';
+ $selheader = 'Subject';
+ $header = 'Subject';
+ $op = 'contains';
+ $sizeop = 'under';
+ $spamtestop = 'ge';
+ $target = '';
+ $target_size = '';
+ $units = 'KB';
+ $bodypart = '';
+ $advcontentpart = '';
+
+ $predefined = -1;
+ foreach($predefined_rules as $idx => $data) {
+ if (($data['type'] == $rule['type'] || $rule['type'] == 'exists')
+ && $data['header'] == $rule['header']
+ && $data['operator'] == ($rule['not'] ? 'not' : '') . $rule['operator']
+ && $data['target'] == $rule['target']) {
+ $predefined = $idx;
+ break;
+ }
+ }
+
+ if ($predefined > -1) {
+ $op_style = 'display: none;';
+ $target_style = 'display: none;';
+ $selheader = $rule['type'] . '::predefined_' . $predefined;
+ $test = $rule['type'];
+
+ if ($rule['type'] == 'size') {
+ $header = 'size';
+ $sizeop = $rule['operator'];
+ preg_match('/^([0-9]+)(K|M|G)*$/', $rule['target'], $matches);
+ $target = $matches[1];
+ $target_size = 'short';
+ $units = $matches[2];
+ }
+ elseif ($rule['type'] == 'spamtest') {
+ $header = 'spamtest';
+ $spamtestop = $rule['operator'];
+ $target = $rule['target'];
+ }
+ elseif ($rule['type'] == 'virustest') {
+ $header = 'virustest';
+ $spamtestop = $rule['operator'];
+ $target = $rule['target'];
+ }
+ elseif ($rule['type'] == 'exists') {
+ $selheader = $predefined_rules[$predefined]['type'] . '::predefined_' . $predefined;
+ $header = $rule['header'];
+ $op = ($rule['not'] ? 'not' : '') . $rule['operator'];
+ }
+ else {
+ $header = $rule['header'];
+ $op = ($rule['not'] ? 'not' : '') . $rule['operator'];
+ $target = $rule['target'];
+ }
+ }
+ elseif ((isset($rule['type']) && $rule['type'] != 'exists') && in_array($rule['type'] . '::' . $rule['header'], $this->headers)) {
+ $target_style = $rule['operator'] == 'exists' ? 'display: none;' : '';
+
+ $selheader = $rule['type'] . '::' . $rule['header'];
+ $test = $rule['type'];
+ $header = $rule['header'];
+ $op = ($rule['not'] ? 'not' : '') . $rule['operator'];
+ $target = $rule['target'];
+ }
+ elseif ((isset($rule['type']) && $rule['type'] == 'exists') && $this->_in_headerarray($rule['header'], $this->headers) != false) {
+ $target_style = $rule['operator'] == 'exists' ? 'display: none;' : '';
+
+ $selheader = $this->_in_headerarray($rule['header'], $this->headers) . '::' . $rule['header'];
+ $test = $rule['type'];
+ $header = $rule['header'];
+ $op = ($rule['not'] ? 'not' : '') . $rule['operator'];
+ }
+ elseif (isset($rule['type']) && $rule['type'] == 'size') {
+ $op_style = 'display: none;';
+ $sizeop_style = '';
+ $units_style = '';
+
+ $selheader = 'size::size';
+ $header = 'size';
+ $test = 'size';
+ $sizeop = $rule['operator'];
+ preg_match('/^([0-9]+)(K|M|G)*$/', $rule['target'], $matches);
+ $target = $matches[1];
+ $target_size = 'short';
+ $units = $matches[2];
+ }
+ elseif (isset($rule['type']) && $rule['type'] == 'body') {
+ $bodypart_style = '';
+ $header_style = 'display: none;';
+
+ $selheader = 'body::body';
+ $header = 'body';
+ $test = 'body';
+ $bodypart = $rule['bodypart'];
+ $op = ($rule['not'] ? 'not' : '') . $rule['operator'];
+ $target = $rule['target'];
+
+ if ($rule['contentpart'] != '') {
+ $advcontentpart = $rule['contentpart'];
+ $advcontentpart_style = '';
+ }
+ }
+ elseif (isset($rule['type']) && $rule['type'] == 'spamtest') {
+ $op_style = 'display: none;';
+ $target_style = 'display: none;';
+ $spamtestop_style = '';
+ $spam_prob_style = '';
+
+ $test = $rule['type'];
+ $selheader = 'spamtest::spamtest';
+ $header = 'spamtest';
+ $spamtestop = $rule['operator'];
+ $target = $rule['target'];
+ $spam_probability = $rule['target'];
+ }
+ elseif (isset($rule['type']) && $rule['type'] == 'virustest') {
+ $op_style = 'display: none;';
+ $target_style = 'display: none;';
+ $spamtestop_style = '';
+ $virus_prob_style = '';
+
+ $test = $rule['type'];
+ $selheader = 'virustest::virustest';
+ $header = 'virustest';
+ $spamtestop = $rule['operator'];
+ $target = $rule['target'];
+ $virus_probability = $rule['target'];
+ }
+ elseif (isset($rule['type']) && $rule['type'] == 'date') {
+ $op_style = 'display: none;';
+ $dateop_style = '';
+ $header_style = 'display: none;';
+ $datepart_style = '';
+
+ if ($rule['datepart'] == 'weekday') {
+ $target_style = 'display: none;';
+ $advtarget_style = 'display: none;';
+ $weekdays_style = '';
+ $advweekdays_style = '';
+ }
+
+ $test = $rule['type'];
+ $selheader = 'date::' . $rule['header'];
+ $header = $rule['header'];
+ $datepart = $rule['datepart'];
+ $dateop = ($rule['not'] ? 'not' : '') . $rule['operator'];
+ $target = $rule['target'];
+ }
+ elseif (isset($rule['type']) && $rule['type'] != 'true') {
+ $header_style = '';
+ $target_style = $rule['operator'] == 'exists' ? 'display: none;' : '';
+
+ $selheader = 'header::other';
+ $test = 'header';
+ $header = is_array($rule['header']) ? join(', ', $rule['header']) : $rule['header'];
+ $op = ($rule['not'] ? 'not' : '') . $rule['operator'];
+ $target = $rule['target'];
+ }
+
+ // check for advanced options
+ $showadvanced = false;
+ if (!in_array($op, $this->operators) || $rule['comparator'] != '' || $rule['contentpart'] != '') {
+ $showadvanced = true;
+ $target_style = 'display: none;';
+ }
+
+ $select_header = new html_select(array('name' => "_selheader[]", 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_header_select(this)'));
+ foreach($this->headers as $name => $val) {
+ if (($val == 'envelope' && in_array('envelope', $ext)) || $val != 'envelope')
+ $select_header->add(rcmail::Q($this->gettext($name)), rcmail::Q($val));
+ }
+
+ if (in_array('body', $ext))
+ $select_header->add(rcmail::Q($this->gettext('body')), rcmail::Q('body::body'));
+
+ if (in_array('spamtest', $ext))
+ $select_header->add(rcmail::Q($this->gettext('spamtest')), rcmail::Q('spamtest::spamtest'));
+
+ if (in_array('virustest', $ext))
+ $select_header->add(rcmail::Q($this->gettext('virustest')), rcmail::Q('virustest::virustest'));
+
+ foreach($predefined_rules as $idx => $data)
+ $select_header->add(rcmail::Q($data['name']), rcmail::Q($data['type'] . '::predefined_' . $idx));
+
+ if (in_array('date', $ext))
+ $select_header->add(rcmail::Q($this->gettext('arrival')), rcmail::Q('date::currentdate'));
+
+ $select_header->add(rcmail::Q($this->gettext('size')), rcmail::Q('size::size'));
+ $select_header->add(rcmail::Q($this->gettext('otherheader')), rcmail::Q('header::other'));
+ $input_test = new html_hiddenfield(array('name' => '_test[]', 'value' => $test));
+ $rules_table->add('selheader', $select_header->show($selheader) . $input_test->show());
+
+ $help_button = html::img(array('src' => $attrib['helpicon'], 'alt' => $this->gettext('sieveruleheaders'), 'border' => 0, 'style' => 'margin-left: 4px;'));
+ $help_button = html::a(array('name' => '_headerhlp', 'href' => "#", 'onclick' => 'return '. rcmail_output::JS_OBJECT_NAME .'.sieverules_xheaders(this);', 'title' => $this->gettext('sieveruleheaders'), 'style' => $header_style), $help_button);
+
+ $input_header = new html_inputfield(array('name' => '_header[]', 'style' => $header_style, 'class' => 'short'));
+ $select_bodypart = new html_select(array('name' => '_bodypart[]', 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_bodypart_select(this)', 'style' => $bodypart_style));
+ $select_bodypart->add(rcmail::Q($this->gettext('auto')), rcmail::Q(''));
+ $select_bodypart->add(rcmail::Q($this->gettext('raw')), rcmail::Q('raw'));
+ $select_bodypart->add(rcmail::Q($this->gettext('text')), rcmail::Q('text'));
+ $select_bodypart->add(rcmail::Q($this->gettext('other')), rcmail::Q('content'));
+ $select_datepart = new html_select(array('name' => '_datepart[]', 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_datepart_select(this)','style' => $datepart_style));
+ $select_datepart->add(rcmail::Q($this->gettext('date')), rcmail::Q('date'));
+ $select_datepart->add(rcmail::Q($this->gettext('time')), rcmail::Q('time'));
+ $select_datepart->add(rcmail::Q($this->gettext('weekday')), rcmail::Q('weekday'));
+ $rules_table->add('header', $input_header->show($header) . $help_button . $select_bodypart->show($bodypart) . $select_datepart->show($datepart));
+
+ $select_op = new html_select(array('name' => "_operator[]", 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_rule_op_select(this)', 'style' => $op_style));
+ foreach($this->operators as $name => $val)
+ $select_op->add(rcmail::Q($this->gettext($name)), $val);
+
+ $select_size_op = new html_select(array('name' => "_size_operator[]", 'style' => $sizeop_style));
+ $select_size_op->add(rcmail::Q($this->gettext('filterunder')), 'under');
+ $select_size_op->add(rcmail::Q($this->gettext('filterover')), 'over');
+
+ $select_date_op = new html_select(array('name' => "_date_operator[]", 'style' => $dateop_style));
+ $select_date_op->add(rcmail::Q($this->gettext('filteris')), 'is');
+ $select_date_op->add(rcmail::Q($this->gettext('filterisnot')), 'notis');
+
+ if (in_array('relational', $ext)) {
+ $select_date_op->add(rcmail::Q($this->gettext('filterbefore')), 'value "lt"');
+ $select_date_op->add(rcmail::Q($this->gettext('filterafter')), 'value "gt"');
+ }
+
+ $select_spamtest_op = new html_select(array('name' => "_spamtest_operator[]", 'style' => $spamtestop_style));
+ $select_spamtest_op->add(rcmail::Q($this->gettext('spamlevelequals')), 'eq');
+ $select_spamtest_op->add(rcmail::Q($this->gettext('spamlevelislessthanequal')), 'le');
+ $select_spamtest_op->add(rcmail::Q($this->gettext('spamlevelisgreaterthanequal')), 'ge');
+
+ if ($showadvanced)
+ $rules_table->add('op', $select_op->show('advoptions') . $select_size_op->show($sizeop) . $select_date_op->show($dateop) . $select_spamtest_op->show($spamtestop));
+ else
+ $rules_table->add('op', $select_op->show($op) . $select_size_op->show($sizeop) . $select_date_op->show($dateop) . $select_spamtest_op->show($spamtestop));
+
+ $input_target = new html_inputfield(array('name' => '_target[]', 'style' => $target_style, 'class' => $target_size));
+
+ $select_units = new html_select(array('name' => "_units[]", 'style' => $units_style, 'class' => 'short'));
+ $select_units->add(rcmail::Q($this->gettext('B')), '');
+ $select_units->add(rcmail::Q($this->gettext('KB')), 'K');
+ $select_units->add(rcmail::Q($this->gettext('MB')), 'M');
+
+ $select_spam_probability = new html_select(array('name' => "_spam_probability[]", 'style' => $spam_prob_style, 'class' => 'long'));
+ $select_spam_probability->add(rcmail::Q($this->gettext('notchecked')), '0');
+ $select_spam_probability->add(rcmail::Q("0%"), '1');
+ $select_spam_probability->add(rcmail::Q("10%"), '2');
+ $select_spam_probability->add(rcmail::Q("20%"), '3');
+ $select_spam_probability->add(rcmail::Q("40%"), '4');
+ $select_spam_probability->add(rcmail::Q("50%"), '5');
+ $select_spam_probability->add(rcmail::Q("60%"), '6');
+ $select_spam_probability->add(rcmail::Q("70%"), '7');
+ $select_spam_probability->add(rcmail::Q("80%"), '8');
+ $select_spam_probability->add(rcmail::Q("90%"), '9');
+ $select_spam_probability->add(rcmail::Q("100%"), '10');
+
+ $select_virus_probability = new html_select(array('name' => "_virus_probability[]", 'style' => $virus_prob_style, 'class' => 'long'));
+ $select_virus_probability->add(rcmail::Q($this->gettext('notchecked')), '0');
+ $select_virus_probability->add(rcmail::Q($this->gettext('novirus')), '1');
+ $select_virus_probability->add(rcmail::Q($this->gettext('virusremoved')), '2');
+ $select_virus_probability->add(rcmail::Q($this->gettext('viruscured')), '3');
+ $select_virus_probability->add(rcmail::Q($this->gettext('possiblevirus')), '4');
+ $select_virus_probability->add(rcmail::Q($this->gettext('definitevirus')), '5');
+
+ $select_weekdays = new html_select(array('name' => "_weekday[]", 'style' => $weekdays_style, 'class' => 'long'));
+ $select_weekdays->add(rcmail::Q($this->gettext('sunday')), '0');
+ $select_weekdays->add(rcmail::Q($this->gettext('monday')), '1');
+ $select_weekdays->add(rcmail::Q($this->gettext('tuesday')), '2');
+ $select_weekdays->add(rcmail::Q($this->gettext('wednesday')), '3');
+ $select_weekdays->add(rcmail::Q($this->gettext('thursday')), '4');
+ $select_weekdays->add(rcmail::Q($this->gettext('friday')), '5');
+ $select_weekdays->add(rcmail::Q($this->gettext('saturday')), '6');
+
+ $rules_table->add('target', $select_weekdays->show($target) . $select_spam_probability->show($spam_probability) . $select_virus_probability->show($virus_probability) . $input_target->show($target) . "&nbsp;" . $select_units->show($units));
+
+ $add_button = $this->api->output->button(array('command' => 'plugin.sieverules.add_rule', 'type' => 'link', 'class' => 'add', 'title' => 'sieverules.addsieverule', 'content' => ' '));
+ $delete_button = $this->api->output->button(array('command' => 'plugin.sieverules.del_rule', 'type' => 'link', 'class' => 'delete', 'classact' => 'delete_act', 'title' => 'sieverules.deletesieverule', 'content' => ' '));
+ $rules_table->add('control', $delete_button . $add_button);
+
+ if (isset($rule))
+ $rowid = $rules_table->size();
+ else
+ $rowid = 'rowid';
+
+ $headers_table = new html_table(array('class' => 'records-table', 'cellspacing' => '0', 'cols' => 4));
+ $headers_table->add(array('colspan' => 4, 'style' => 'white-space: normal;'), rcmail::Q($this->gettext('sieveheadershlp')));
+
+ $col1 = '';
+ $col2 = '';
+ $col3 = '';
+ $col4 = '';
+ $other_headers = $rcmail->config->get('sieverules_other_headers');
+ sort($other_headers);
+ $col_length = sizeof($other_headers) / 4;
+ $col_length = ceil($col_length);
+ foreach ($other_headers as $idx => $xheader) {
+ $input_xheader = new html_radiobutton(array('id' => $xheader . '_' . $rowid, 'name' => '_xheaders_' . $rowid . '[]', 'value' => $xheader, 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_set_xheader(this)', 'class' => 'radio'));
+ $xheader_show = $input_xheader->show($header) . "&nbsp;" . html::label($xheader . '_' . $rowid, rcmail::Q($xheader));
+
+ if ($idx < $col_length)
+ $col1 .= $xheader_show . "<br />";
+ elseif ($idx < $col_length * 2)
+ $col2 .= $xheader_show . "<br />";
+ elseif ($idx < $col_length * 3)
+ $col3 .= $xheader_show . "<br />";
+ elseif ($idx < $col_length * 4)
+ $col4 .= $xheader_show . "<br />";
+ }
+
+ $headers_table->add(array('style' => 'vertical-align: top; width: 25%;'), $col1);
+ $headers_table->add(array('style' => 'vertical-align: top; width: 25%;'), $col2);
+ $headers_table->add(array('style' => 'vertical-align: top; width: 25%;'), $col3);
+ $headers_table->add(array('style' => 'vertical-align: top; width: 25%;'), $col4);
+
+ $rules_table->set_row_attribs(array('style' => 'display: none;'));
+ $rules_table->add(array('colspan' => 5), $headers_table->show());
+
+ $advanced_table = new html_table(array('class' => 'records-table', 'cellspacing' => '0', 'cols' => 2));
+ $advanced_table->add(array('colspan' => 2, 'style' => 'white-space: normal;'), rcmail::Q($this->gettext('advancedoptions')));
+
+ $help_button = html::img(array('src' => $attrib['helpicon'], 'alt' => $this->gettext('contentpart'), 'border' => 0, 'style' => 'margin-left: 4px;'));
+ $help_button = html::a(array('href' => "#", 'onclick' => 'return '. rcmail_output::JS_OBJECT_NAME .'.sieverules_help(this, ' . $advanced_table->size() . ');', 'title' => $this->gettext('contentpart')), $help_button);
+
+ $field_id = 'rcmfd_advcontentpart_'. $rowid;
+ $advanced_table->set_row_attribs(array('style' => $advcontentpart_style));
+ $input_advcontentpart = new html_inputfield(array('id' => $field_id, 'name' => '_body_contentpart[]', 'class' => 'short'));
+ $advanced_table->add(array('style' => 'white-space: normal;', 'class' => 'selheader'), html::label($field_id, rcmail::Q($this->gettext('bodycontentpart'))));
+ $advanced_table->add(array('style' => 'white-space: normal;'), $input_advcontentpart->show($advcontentpart) . $help_button);
+
+ $advanced_table->set_row_attribs(array('class' => 'advhelp', 'style' => 'display: none;'));
+ $advanced_table->add(array('colspan' => 2, 'class' => 'vacdaysexp'), $this->gettext('contentpartexp'));
+
+ $field_id = 'rcmfd_advoperator_'. $rowid;
+ $select_advop = new html_select(array('id' => $field_id, 'name' => "_advoperator[]", 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_rule_advop_select(this)'));
+
+ if (in_array('regex', $ext)) {
+ $select_advop->add(rcmail::Q($this->gettext('filterregex')), 'regex');
+ $select_advop->add(rcmail::Q($this->gettext('filternotregex')), 'notregex');
+ }
+
+ if (in_array('relational', $ext)) {
+ $select_advop->add(rcmail::Q($this->gettext('countisgreaterthan')), 'count "gt"');
+ $select_advop->add(rcmail::Q($this->gettext('countisgreaterthanequal')), 'count "ge"');
+ $select_advop->add(rcmail::Q($this->gettext('countislessthan')), 'count "lt"');
+ $select_advop->add(rcmail::Q($this->gettext('countislessthanequal')), 'count "le"');
+ $select_advop->add(rcmail::Q($this->gettext('countequals')), 'count "eq"');
+ $select_advop->add(rcmail::Q($this->gettext('countnotequals')), 'count "ne"');
+ $select_advop->add(rcmail::Q($this->gettext('valueisgreaterthan')), 'value "gt"');
+ $select_advop->add(rcmail::Q($this->gettext('valueisgreaterthanequal')), 'value "ge"');
+ $select_advop->add(rcmail::Q($this->gettext('valueislessthan')), 'value "lt"');
+ $select_advop->add(rcmail::Q($this->gettext('valueislessthanequal')), 'value "le"');
+ $select_advop->add(rcmail::Q($this->gettext('valueequals')), 'value "eq"');
+ $select_advop->add(rcmail::Q($this->gettext('valuenotequals')), 'value "ne"');
+ }
+
+ if (in_array('subaddress', $ext)) {
+ $select_advop->add(rcmail::Q($this->gettext('userpart')), 'user');
+ $select_advop->add(rcmail::Q($this->gettext('notuserpart')), 'notuser');
+ $select_advop->add(rcmail::Q($this->gettext('detailpart')), 'detail');
+ $select_advop->add(rcmail::Q($this->gettext('notdetailpart')), 'notdetail');
+ $select_advop->add(rcmail::Q($this->gettext('domainpart')), 'domain');
+ $select_advop->add(rcmail::Q($this->gettext('notdomainpart')), 'notdomain');
+ }
+
+ $advanced_table->add(array('style' => 'white-space: normal;', 'class' => 'selheader'), html::label($field_id, rcmail::Q($this->gettext('operator'))));
+ $advanced_table->add(array('style' => 'white-space: normal;'), $select_advop->show($op));
+
+ $field_id = 'rcmfd_comparator_'. $rowid;
+ if (substr($op, 0, 5) == 'count' || substr($op, 0, 5) == 'value')
+ $select_comparator = new html_select(array('id' => $field_id, 'name' => "_comparator[]"));
+ else
+ $select_comparator = new html_select(array('id' => $field_id, 'name' => "_comparator[]", 'disabled' => 'disabled'));
+
+ $select_comparator->add(rcmail::Q($this->gettext('i;ascii-casemap')), '');
+ $select_comparator->add(rcmail::Q($this->gettext('i;octet')), 'i;octet');
+
+ foreach ($ext as $extension) {
+ if (substr($extension, 0, 11) == 'comparator-' && $extension != 'comparator-i;ascii-casemap' && $extension != 'comparator-i;octet')
+ $select_comparator->add(rcmail::Q($this->gettext(substr($extension, 11))), substr($extension, 11));
+ }
+
+ $advanced_table->add(array('style' => 'white-space: normal;', 'class' => 'selheader'), html::label($field_id, rcmail::Q($this->gettext('comparator'))));
+ $advanced_table->add(array('style' => 'white-space: normal;'), $select_comparator->show($rule['comparator']));
+
+ $select_advweekdays = new html_select(array('name' => "_advweekday[]", 'style' => $advweekdays_style));
+ $select_advweekdays->add(rcmail::Q($this->gettext('sunday')), '0');
+ $select_advweekdays->add(rcmail::Q($this->gettext('monday')), '1');
+ $select_advweekdays->add(rcmail::Q($this->gettext('tuesday')), '2');
+ $select_advweekdays->add(rcmail::Q($this->gettext('wednesday')), '3');
+ $select_advweekdays->add(rcmail::Q($this->gettext('thursday')), '4');
+ $select_advweekdays->add(rcmail::Q($this->gettext('friday')), '5');
+ $select_advweekdays->add(rcmail::Q($this->gettext('saturday')), '6');
+
+ $field_id = 'rcmfd_advtarget_'. $rowid;
+ $input_advtarget = new html_inputfield(array('id' => $field_id, 'name' => '_advtarget[]', 'style' => $advtarget_style));
+ $advanced_table->add(array('style' => 'white-space: normal;', 'class' => 'selheader'), html::label($field_id, rcmail::Q($this->gettext('teststring'))));
+ $advanced_table->add(array('style' => 'white-space: normal;'), $input_advtarget->show($target) . $select_advweekdays->show($target));
+
+ if (!($showadvanced && $predefined == -1))
+ $rules_table->set_row_attribs(array('style' => 'display: none;'));
+ $rules_table->add(array('colspan' => 5), $advanced_table->show());
+
+ return $rules_table;
+ }
+
+ private function _action_row($ext, $actions_table, $rowid, $action, $attrib, $example)
+ {
+ $rcmail = rcube::get_instance();
+ static $a_mailboxes;
+
+ if (!isset($action))
+ $actions_table->set_row_attribs(array('style' => 'display: none;'));
+
+ $help_icon = html::img(array('src' => $attrib['helpicon'], 'alt' => $this->gettext('messagehelp'), 'border' => 0));
+
+ $vacadvstyle = ($action['type'] != 'vacation' && $this->force_vacto) ? '' : 'display: none;';
+ $vacadvstyle_from = ($this->show_vacfrom) ? $vacadvstyle : 'display: none;';
+ $vacadvstyle_handle = ($this->show_vachandle) ? $vacadvstyle : 'display: none;';
+ $vacadvclass_from = ($this->show_vacfrom) ? 'advanced' : 'disabled';
+ $vacadvclass_handle = ($this->show_vachandle) ? 'advanced' : 'disabled';
+ $vacshowadv = ($action['type'] != 'vacation' && $this->force_vacto) ? '1' : '';
+ $noteadvstyle = 'display: none;';
+ $noteshowadv = '';
+ $eheadadvstyle = 'display: none;';
+ $eheadshowadv = '';
+
+ // setup allowed actions
+ $allowed_actions = array();
+ $config_actions = $rcmail->config->get('sieverules_allowed_actions', array());
+ if (in_array('fileinto', $ext) && ($config_actions['fileinto'] || $action['type'] == 'fileinto'))
+ $allowed_actions['fileinto'] = $this->gettext('messagemoveto');
+ if (in_array('fileinto', $ext) && in_array('copy', $ext) && ($config_actions['fileinto'] || $action['type'] == 'fileinto'))
+ $allowed_actions['fileinto_copy'] = $this->gettext('messagecopyto');
+ if (in_array('vacation', $ext) && ($config_actions['vacation'] || $action['type'] == 'vacation'))
+ $allowed_actions['vacation'] = $this->gettext('messagevacation');
+ if (in_array('reject', $ext) && ($config_actions['reject'] || $action['type'] == 'reject'))
+ $allowed_actions['reject'] = $this->gettext('messagereject');
+ elseif (in_array('ereject', $ext) && ($config_actions['reject'] || $action['type'] == 'ereject'))
+ $allowed_actions['ereject'] = $this->gettext('messagereject');
+ if (in_array('imap4flags', $ext) && ($config_actions['imapflags'] || $action['type'] == 'imap4flags'))
+ $allowed_actions['imap4flags'] = $this->gettext('messageimapflags');
+ elseif (in_array('imapflags', $ext) && ($config_actions['imapflags'] || $action['type'] == 'imapflags'))
+ $allowed_actions['imapflags'] = $this->gettext('messageimapflags');
+ if (in_array('notify', $ext) && ($config_actions['notify'] || $action['type'] == 'notify'))
+ $allowed_actions['notify'] = $this->gettext('messagenotify');
+ elseif (in_array('enotify', $ext) && ($config_actions['notify'] || $action['type'] == 'enotify'))
+ $allowed_actions['enotify'] = $this->gettext('messagenotify');
+ if (in_array('editheader', $ext) && ($config_actions['editheaderadd'] || $action['type'] == 'editheaderadd'))
+ $allowed_actions['editheaderadd'] = $this->gettext('addheader');
+ if (in_array('editheader', $ext) && ($config_actions['editheaderrem'] || $action['type'] == 'editheaderrem'))
+ $allowed_actions['editheaderrem'] = $this->gettext('removeheader');
+ if ($config_actions['redirect'] || $action['type'] == 'redirect')
+ $allowed_actions['redirect'] = $this->gettext('messageredirect');
+ if (in_array('copy', $ext) && ($config_actions['redirect'] || $action['type'] == 'redirect_copy'))
+ $allowed_actions['redirect_copy'] = $this->gettext('messageredirectcopy');
+ if ($config_actions['keep'] || $action['type'] == 'keep')
+ $allowed_actions['keep'] = $this->gettext('messagekeep');
+ if ($config_actions['discard'] || $action['type'] == 'discard')
+ $allowed_actions['discard'] = $this->gettext('messagediscard');
+ if ($config_actions['stop'] || $action['type'] == 'stop')
+ $allowed_actions['stop'] = $this->gettext('messagestop');
+
+ // set the default action
+ reset($allowed_actions);
+ $method = key($allowed_actions);
+
+ $folder = 'INBOX';
+ $reject = '';
+
+ $identity = $rcmail->user->get_identity();
+ if ($this->show_vacfrom)
+ $vacfrom = (in_array('variables', $ext)) ? 'auto' : $identity['email'];
+ else
+ $vacfrom = null;
+
+ $vacto = null;
+ $address = '';
+ $days = '';
+ $handle = '';
+ $subject = '';
+ $origsubject = '';
+ $msg = '';
+ $charset = RCUBE_CHARSET;
+ $flags = '';
+ $nfrom = '';
+ $nimpt = '';
+ $nmethod = '';
+ $noptions = '';
+ $nmsg = '';
+
+ if ($action['type'] == 'fileinto' || $action['type'] == 'fileinto_copy') {
+ $method = $action['type'];
+ $folder = $rcmail->config->get('sieverules_include_imap_root', true) ? $action['target'] : $rcmail->storage->mod_folder($action['target'], 'IN');
+
+ if ($rcmail->config->get('sieverules_folder_delimiter', false))
+ $folder = str_replace($rcmail->storage->get_hierarchy_delimiter(), $rcmail->config->get('sieverules_folder_delimiter'), $folder);
+ }
+ elseif ($action['type'] == 'reject' || $action['type'] == 'ereject') {
+ $method = $action['type'];
+ $reject = $action['target'];
+ }
+ elseif ($action['type'] == 'vacation') {
+ $method = 'vacation';
+ $days = $action['days'];
+ $vacfrom_default = $vacfrom;
+ $vacfrom = $action['from'];
+ $vacto = $action['addresses'];
+ $handle = $action['handle'];
+ $subject = $action['subject'];
+ $origsubject = $action['origsubject'];
+ $msg = $action['msg'];
+ $htmlmsg = $action['htmlmsg'] ? '1' : '';
+ $charset = $action['charset'];
+
+ if ($htmlmsg == '1' && $rcmail->config->get('htmleditor') == '0') {
+ $h2t = new rcube_html2text($msg, false, true, 0);
+ $msg = $h2t->get_text();
+ $htmlmsg = '';
+ }
+ elseif ($htmlmsg == '' && $rcmail->config->get('htmleditor') == '1') {
+ $msg = $msg;
+ $msg = nl2br($msg);
+ $htmlmsg = '1';
+ }
+
+ if (!$example)
+ $this->force_vacto = false;
+
+ // check advanced enabled
+ if ((!empty($vacfrom) && $vacfrom != $vacfrom_default) || !empty($vacto) || !empty($handle) || !empty($days) || $charset != RCUBE_CHARSET || $this->force_vacto) {
+ $vacadvstyle = '';
+ $vacadvstyle_from = ($this->show_vacfrom) ? '' : 'display: none;';
+ $vacadvstyle_handle = ($this->show_vachandle) ? '' : 'display: none;';
+ $vacshowadv = '1';
+ }
+ }
+ elseif ($action['type'] == 'redirect' || $action['type'] == 'redirect_copy') {
+ $method = $action['type'];
+ $address = $action['target'];
+ }
+ elseif ($action['type'] == 'imapflags' || $action['type'] == 'imap4flags') {
+ $method = $action['type'];
+ $flags = $action['target'];
+ }
+ elseif ($action['type'] == 'notify' || $action['type'] == 'enotify') {
+ $method = $action['type'];
+ $nfrom = $action['from'];
+ $nimpt = $action['importance'];
+ $nmethod = $action['method'];
+ $noptions = $action['options'];
+ $nmsg = $action['msg'];
+
+ // check advanced enabled
+ if (!empty($nfrom) || !empty($nimpt)) {
+ $noteadvstyle = '';
+ $noteshowadv = '1';
+ }
+ }
+ elseif ($action['type'] == 'editheaderadd' || $action['type'] == 'editheaderrem') {
+ $method = $action['type'];
+ $headername = $action['name'];
+ $headerval = $action['value'];
+ $headerindex = $action['index'];
+ $headeropp = $action['operator'];
+
+ if ($action['type'] == 'editheaderrem' && (!empty($headerindex) || !empty($headerval))) {
+ $eheadadvstyle = '';
+ $eheadshowadv = '1';
+ }
+ }
+ elseif ($action['type'] == 'discard' || $action['type'] == 'keep' || $action['type'] == 'stop') {
+ $method = $action['type'];
+ }
+
+ $select_action = new html_select(array('name' => "_act[]", 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_action_select(this)'));
+ foreach ($allowed_actions as $value => $text)
+ $select_action->add(rcmail::Q($text), $value);
+
+ $actions_table->add('action', $select_action->show($method));
+
+ $vacs_table = new html_table(array('class' => 'records-table', 'cellspacing' => '0', 'cols' => 3, 'style' => ($method == 'vacation') ? '' : 'display: none;'));
+
+ $to_addresses = "";
+ $vacto_arr = explode(",", $vacto);
+ $user_identities = $rcmail->user->list_identities();
+ if (count($user_identities)) {
+ $field_id = 'rcmfd_sievevacfrom_'. $rowid;
+ $select_id = new html_select(array('id' => $field_id, 'name' => "_vacfrom[]", 'class' => 'short', 'onchange' => rcmail_output::JS_OBJECT_NAME . '.enable_sig(this);'));
+
+ if ($this->show_vacfrom && in_array('variables', $ext))
+ $select_id->add(rcmail::Q($this->gettext('autodetect')), "auto");
+ elseif (!$this->show_vacfrom)
+ $select_id->add(rcmail::Q($this->gettext('autodetect')), "");
+
+ foreach ($user_identities as $sql_arr) {
+ $from = $this->_rcmail_get_identity($sql_arr['identity_id']);
+
+ // find currently selected from address
+ if ($vacfrom != '' && $vacfrom == rcmail::Q($from['string']))
+ $vacfrom = $sql_arr['identity_id'];
+ elseif ($vacfrom != '' && $vacfrom == $from['mailto'])
+ $vacfrom = $sql_arr['identity_id'];
+
+ $select_id->add($from['disp_string'], $sql_arr['identity_id']);
+
+ $ffield_id = 'rcmfd_vac_' . $rowid . '_' . $sql_arr['identity_id'];
+
+ if ($this->force_vacto) {
+ $curaddress = $sql_arr['email'];
+ $vacto .= (!empty($vacto) ? ',' : '') . $sql_arr['email'];
+ }
+ else {
+ $curaddress = in_array($sql_arr['email'], $vacto_arr) ? $sql_arr['email'] : "";
+ }
+
+ $input_address = new html_checkbox(array('id' => $ffield_id, 'name' => '_vacto_check_' . $rowid . '[]', 'value' => $sql_arr['email'], 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_toggle_vac_to(this, '. $rowid .')', 'class' => 'checkbox'));
+ $to_addresses .= $input_address->show($curaddress) . "&nbsp;" . html::label($ffield_id, rcmail::Q($sql_arr['email'])) . "<br />";
+ }
+ }
+
+ if ($rcmail->config->get('sieverules_limit_vacto', true) && strlen($to_addresses) > 0) {
+ $vacs_table->set_row_attribs(array('class' => $vacadvclass_from, 'style' => $vacadvstyle_from));
+ $vacs_table->add(null, html::label($field_id, rcmail::Q($this->gettext('from'))));
+ $vacs_table->add(null, $select_id->show($vacfrom));
+
+ $sig_button = $this->api->output->button(array('command' => 'plugin.sieverules.vacation_sig', 'prop' => $rowid, 'type' => 'link', 'class' => 'vacsig', 'classact' => 'vacsig_act', 'title' => 'insertsignature', 'content' => ' '));
+ $vacs_table->add(null, $sig_button);
+
+ $field_id = 'rcmfd_sievevacto_'. $rowid;
+ $input_vacto = new html_hiddenfield(array('id' => $field_id, 'name' => '_vacto[]', 'value' => $vacto));
+ $vacs_table->set_row_attribs(array('class' => 'advanced', 'style' => $vacadvstyle));
+ $vacs_table->add(array('style' => 'vertical-align: top;'), rcmail::Q($this->gettext('sieveto')));
+ $vacs_table->add(null, $to_addresses . $input_vacto->show());
+ $help_button = html::a(array('href' => "#", 'onclick' => 'return ' . rcmail_output::JS_OBJECT_NAME . '.sieverules_help(this, ' . $vacs_table->size() . ');', 'title' => $this->gettext('messagehelp')), $help_icon);
+ $vacs_table->add(array('style' => 'vertical-align: top;'), $help_button);
+
+ $vacs_table->set_row_attribs(array('class' => 'advhelp', 'style' => 'display: none;'));
+ $vacs_table->add(array('colspan' => 3, 'class' => 'vacdaysexp'), $this->gettext('vactoexp'));
+ }
+ else {
+ $field_id = 'rcmfd_sievevacfrom_'. $rowid;
+ $input_vacfrom = new html_inputfield(array('id' => $field_id, 'name' => '_vacfrom[]'));
+ $vacs_table->set_row_attribs(array('class' => $vacadvclass_from, 'style' => $vacadvstyle_from));
+ $vacs_table->add(null, html::label($field_id, rcmail::Q($this->gettext('from'))));
+ $vacs_table->add(null, $input_vacfrom->show($vacfrom));
+
+ $sig_button = $this->api->output->button(array('command' => 'plugin.sieverules.vacation_sig', 'prop' => $rowid, 'type' => 'link', 'class' => 'vacsig', 'classact' => 'vacsig_act', 'title' => 'insertsignature', 'content' => ' '));
+ $vacs_table->add(null, $sig_button);
+
+ $field_id = 'rcmfd_sievevacto_'. $rowid;
+ $input_vacto = new html_inputfield(array('id' => $field_id, 'name' => '_vacto[]', 'class' => 'short'));
+ $vacs_table->set_row_attribs(array('class' => 'advanced', 'style' => $vacadvstyle));
+ $vacs_table->add(null, html::label($field_id, rcmail::Q($this->gettext('sieveto'))));
+ $vacs_table->add(null, $input_vacto->show($vacto));
+
+ $help_button = html::a(array('href' => "#", 'onclick' => 'return ' . rcmail_output::JS_OBJECT_NAME . '.sieverules_help(this, ' . $vacs_table->size() . ');', 'title' => $this->gettext('messagehelp')), $help_icon);
+ $vacs_table->add(null, $help_button);
+ $vacs_table->set_row_attribs(array('class' => 'advhelp', 'style' => 'display: none;'));
+ $vacs_table->add(array('colspan' => 3, 'class' => 'vacdaysexp'), $this->gettext('vactoexp') . '<br /><br />' . $this->gettext('vactoexp_adv'));
+ }
+
+ $field_id = 'rcmfd_sievevacdays_'. $rowid;
+ $input_day = new html_inputfield(array('id' => $field_id, 'name' => '_day[]', 'class' => 'short'));
+ $vacs_table->set_row_attribs(array('class' => 'advanced', 'style' => $vacadvstyle));
+ $vacs_table->add(null, html::label($field_id, rcmail::Q($this->gettext('days'))));
+ $vacs_table->add(null, $input_day->show($days));
+ $help_button = html::a(array('href' => "#", 'onclick' => 'return ' . rcmail_output::JS_OBJECT_NAME . '.sieverules_help(this, ' . $vacs_table->size() . ');', 'title' => $this->gettext('messagehelp')), $help_icon);
+ $vacs_table->add(null, $help_button);
+
+ $vacs_table->set_row_attribs(array('style' => 'display: none;'));
+ $vacs_table->add(array('colspan' => 3, 'class' => 'vacdaysexp'), $this->gettext('vacdaysexp'));
+
+ $field_id = 'rcmfd_sievevachandle_'. $rowid;
+ $input_handle = new html_inputfield(array('id' => $field_id, 'name' => '_handle[]', 'class' => 'short'));
+ $vacs_table->set_row_attribs(array('class' => $vacadvclass_handle, 'style' => $vacadvstyle_handle));
+ $vacs_table->add(null, html::label($field_id, rcmail::Q($this->gettext('sievevachandle'))));
+ $vacs_table->add(null, $input_handle->show($handle));
+ $help_button = html::a(array('href' => "#", 'onclick' => 'return ' . rcmail_output::JS_OBJECT_NAME . '.sieverules_help(this, ' . $vacs_table->size() . ');', 'title' => $this->gettext('messagehelp')), $help_icon);
+ $vacs_table->add(null, $help_button);
+
+ $vacs_table->set_row_attribs(array('class' => 'advhelp', 'style' => 'display: none;'));
+ $vacs_table->add(array('colspan' => 3, 'class' => 'vacdaysexp'), $this->gettext('vachandleexp'));
+
+ $field_id = 'rcmfd_sievevacsubject_'. $rowid;
+ $input_subject = new html_inputfield(array('id' => $field_id, 'name' => '_subject[]'));
+ $vacs_table->add(null, html::label($field_id, rcmail::Q($this->gettext('subject'))));
+ $vacs_table->add(array('colspan' => 2), $input_subject->show($subject));
+
+ if (in_array('variables', $ext)) {
+ $field_id = 'rcmfd_sievevacsubject_orig_'. $rowid;
+ $input_origsubject = new html_checkbox(array('id' => $field_id, 'value' => '1', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_toggle_vac_osubj(this, '. $rowid .')', 'class' => 'checkbox'));
+ $input_vacosubj = new html_hiddenfield(array('id' => 'rcmfd_sievevactoh_'. $rowid, 'name' => '_orig_subject[]', 'value' => $origsubject));
+ $vacs_table->add(null, '&nbsp;');
+ $vacs_table->add(array('colspan' => 2), $input_origsubject->show($origsubject) . "&nbsp;" . html::label($field_id, rcmail::Q($this->gettext('sieveorigsubj'))) . $input_vacosubj->show());
+ }
+
+ $field_id = 'rcmfd_sievevacmag_'. $rowid;
+ $input_msg = new html_textarea(array('id' => $field_id, 'name' => '_msg[]', 'rows' => '8', 'cols' => '40', 'class' => $htmlmsg == 1 ? 'mce_editor' : '', 'is_escaped' => $htmlmsg == 1 ? true : null));
+ $input_html = new html_checkbox(array('id' => 'rcmfd_sievevachtmlcb_'. $rowid, 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_toggle_vac_html(this, '. $rowid .', \'' . $field_id .'\');', 'value' => '1', 'class' => 'checkbox'));
+ $input_htmlhd = new html_hiddenfield(array('id' => 'rcmfd_sievevachtmlhd_'. $rowid, 'name' => '_htmlmsg[]', 'value' => $htmlmsg));
+ $vacs_table->add('msg', html::label($field_id, rcmail::Q($this->gettext('message'))));
+ $vacs_table->add(array('colspan' => 2), $input_msg->show($msg) . html::tag('div', in_array('htmleditor', $rcmail->config->get('dont_override')) ? array('style' => 'display: none;') : null, $input_html->show($htmlmsg) . "&nbsp;" . html::label('rcmfd_sievevachtml_' . $rowid, rcmail::Q($this->gettext('htmlmessage')))) . $input_htmlhd->show());
+
+ $field_id = 'rcmfd_sievecharset_'. $rowid;
+ $vacs_table->set_row_attribs(array('class' => 'advanced', 'style' => $vacadvstyle));
+ $vacs_table->add(null, html::label($field_id, rcmail::Q($this->gettext('charset'))));
+ $vacs_table->add(array('colspan' => 2), $rcmail->output->charset_selector(array('id' => $field_id, 'name' => '_vaccharset[]', 'selected' => $charset)));
+
+ $input_advopts = new html_checkbox(array('id' => 'vadvopts' . $rowid, 'name' => '_vadv_opts[]', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_show_adv(this);', 'value' => '1', 'class' => 'checkbox'));
+ $vacs_table->add(array('colspan' => '3', 'style' => 'text-align: right'), html::label('vadvopts' . $rowid, rcmail::Q($this->gettext('advancedoptions'))) . $input_advopts->show($vacshowadv));
+
+ $notify_table = new html_table(array('class' => 'records-table', 'cellspacing' => '0', 'cols' => 3, 'style' => ($method == 'notify' || $method == 'enotify') ? '' : 'display: none;'));
+
+ $user_identities = $rcmail->user->list_identities();
+ if (count($user_identities)) {
+ $field_id = 'rcmfd_sievenotifyfrom_'. $rowid;
+ $select_id = new html_select(array('id' => $field_id, 'name' => "_nfrom[]"));
+ $select_id->add(rcmail::Q($this->gettext('autodetect')), "");
+
+ foreach ($user_identities as $sql_arr) {
+ $from = $this->_rcmail_get_identity($sql_arr['identity_id']);
+
+ // find currently selected from address
+ if ($nfrom != '' && $nfrom == rcmail::Q($from['string']))
+ $nfrom = $sql_arr['identity_id'];
+ elseif ($nfrom != '' && $nfrom == $from['mailto'])
+ $nfrom = $sql_arr['identity_id'];
+
+ $select_id->add($from['disp_string'], $sql_arr['identity_id']);
+ }
+
+ $notify_table->set_row_attribs(array('class' => 'advanced', 'style' => $noteadvstyle));
+ $notify_table->add(null, html::label($field_id, rcmail::Q($this->gettext('sievefrom'))));
+ $notify_table->add(array('colspan' => 2), $select_id->show($nfrom));
+ }
+
+ $field_id = 'rcmfd_nmethod_'. $rowid;
+ $input_method = new html_inputfield(array('id' => $field_id, 'name' => '_nmethod[]'));
+ $notify_table->add(null, html::label($field_id, rcmail::Q($this->gettext('method'))));
+ $notify_table->add(array('colspan' => 2), $input_method->show($nmethod));
+
+ $field_id = 'rcmfd_noption_'. $rowid;
+ $input_method = new html_inputfield(array('id' => $field_id, 'name' => '_noption[]'));
+ $notify_table->add(null, html::label($field_id, rcmail::Q($this->gettext('options'))));
+ $notify_table->add(array('colspan' => 2), $input_method->show($noptions));
+
+ $notify_table->set_row_attribs(array('style' => 'display: none;'));
+ $notify_table->add(array('colspan' => 3, 'class' => 'vacdaysexp'), $this->gettext('nmethodexp'));
+
+ $field_id = 'rcmfd_nimpt_'. $rowid;
+ $input_importance = new html_radiobutton(array('id' => $field_id . '_none', 'name' => '_notify_radio_' . $rowid, 'value' => 'none', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_notify_impt(this, '. $rowid .')', 'class' => 'radio'));
+ $importance_show = $input_importance->show($nimpt) . "&nbsp;" . html::label($field_id . '_none', rcmail::Q($this->gettext('importancen')));
+ $input_importance = new html_radiobutton(array('id' => $field_id . '_1', 'name' => '_notify_radio_' . $rowid, 'value' => '1', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_notify_impt(this, '. $rowid .')', 'class' => 'radio'));
+ $importance_show .= '&nbsp;&nbsp;' . $input_importance->show($nimpt) . "&nbsp;" . html::label($field_id . '_1', rcmail::Q($this->gettext('importance1')));
+ $input_importance = new html_radiobutton(array('id' => $field_id . '_2', 'name' => '_notify_radio_' . $rowid, 'value' => '2', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_notify_impt(this, '. $rowid .')', 'class' => 'radio'));
+ $importance_show .= '&nbsp;&nbsp;' . $input_importance->show($nimpt) . "&nbsp;" . html::label($field_id . '_2', rcmail::Q($this->gettext('importance2')));
+ $input_importance = new html_radiobutton(array('id' => $field_id . '_3', 'name' => '_notify_radio_' . $rowid, 'value' => '3', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_notify_impt(this, '. $rowid .')', 'class' => 'radio'));
+ $importance_show .= '&nbsp;&nbsp;' . $input_importance->show($nimpt) . "&nbsp;" . html::label($field_id . '_3', rcmail::Q($this->gettext('importance3')));
+ $input_importance = new html_hiddenfield(array('id' => 'rcmfd_sievenimpt_'. $rowid, 'name' => '_nimpt[]'));
+
+ $notify_table->set_row_attribs(array('class' => 'advanced', 'style' => $noteadvstyle));
+ $notify_table->add(null, rcmail::Q($this->gettext('flag')));
+ $notify_table->add(array('colspan' => 2), $importance_show . $input_importance->show($nimpt));
+
+ $field_id = 'rcmfd_nmsg_'. $rowid;
+ $input_msg = new html_inputfield(array('id' => $field_id, 'name' => '_nmsg[]'));
+ $notify_table->add(null, html::label($field_id, rcmail::Q($this->gettext('message'))));
+ $notify_table->add(array('colspan' => 2), $input_msg->show($nmsg));
+
+ if (in_array('enotify', $ext)) {
+ $input_advopts = new html_checkbox(array('id' => 'nadvopts' . $rowid, 'name' => '_nadv_opts[]', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_show_adv(this);', 'value' => '1', 'class' => 'checkbox'));
+ $notify_table->add(array('colspan' => '3', 'style' => 'text-align: right'), html::label('nadvopts' . $rowid, rcmail::Q($this->gettext('advancedoptions'))) . $input_advopts->show($noteshowadv));
+ }
+
+ $headers_table = new html_table(array('class' => 'records-table', 'cellspacing' => '0', 'cols' => 2, 'style' => ($method == 'editheaderadd' || $method == 'editheaderrem') ? '' : 'display: none;'));
+
+ $field_id = 'rcmfd_eheadname_'. $rowid;
+ $input_header = new html_inputfield(array('id' => $field_id, 'name' => '_eheadname[]'));
+ $headers_table->add(null, html::label($field_id, rcmail::Q($this->gettext('headername'))));
+ $headers_table->add(null, $input_header->show($headername));
+
+ $field_id = 'rcmfd_eheadindex_'. $rowid;
+ $select_index = new html_select(array('id' => $field_id, 'name' => "_eheadindex[]"));
+ $select_index->add(rcmail::Q($this->gettext('headerdelall')), "");
+ $select_index->add(rcmail::Q("1"), "1");
+ $select_index->add(rcmail::Q("2"), "2");
+ $select_index->add(rcmail::Q("3"), "3");
+ $select_index->add(rcmail::Q("4"), "4");
+ $select_index->add(rcmail::Q("5"), "5");
+ $select_index->add(rcmail::Q($this->gettext('last')), "last");
+
+ $headers_table->set_row_attribs(array('class' => 'advanced', 'style' => $eheadadvstyle));
+ $headers_table->add(null, html::label($field_id, rcmail::Q($this->gettext('headerindex'))));
+ $headers_table->add(null, $select_index->show($headerindex));
+
+ $field_id = 'rcmfd_eheadopp_'. $rowid;
+ $select_match = new html_select(array('id' => $field_id, 'name' => "_eheadopp[]"));
+ $select_match->add(rcmail::Q($this->gettext('filteris')), "");
+ $select_match->add(rcmail::Q($this->gettext('filtercontains')), "contains");
+
+ $headers_table->set_row_attribs(array('class' => 'advanced', 'style' => $eheadadvstyle));
+ $headers_table->add(null, html::label($field_id, rcmail::Q($this->gettext('operator'))));
+ $headers_table->add(null, $select_match->show($headeropp));
+
+ $field_id = 'rcmfd_eheadval_'. $rowid;
+ $input_header = new html_inputfield(array('id' => $field_id, 'name' => '_eheadval[]'));
+
+ if ($method == 'editheaderrem')
+ $headers_table->set_row_attribs(array('class' => 'advanced', 'style' => $eheadadvstyle));
+
+ $headers_table->add(null, html::label($field_id, rcmail::Q($this->gettext('headervalue'))));
+ $headers_table->add(null, $input_header->show($headerval));
+
+ if ($method == 'editheaderrem')
+ $headers_table->set_row_attribs(array('style' => 'display: none;'));
+
+ $field_id = 'rcmfd_eheadaddlast_'. $rowid;
+ $input_index = new html_checkbox(array('id' => $field_id, 'value' => 'last', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_toggle_eheadlast(this);', 'name' => '_eheadaddlast[]', 'class' => 'checkbox'));
+ $headers_table->add(null, '&nbsp;');
+ $headers_table->add(null, $input_index->show($headerindex) . "&nbsp;" . html::label($field_id, rcmail::Q($this->gettext('headerappend'))));
+
+ if ($method == 'editheaderadd')
+ $headers_table->set_row_attribs(array('style' => 'display: none;'));
+
+ $input_advopts = new html_checkbox(array('id' => 'hadvopts' . $rowid, 'name' => '_hadv_opts[]', 'onclick' => rcmail_output::JS_OBJECT_NAME . '.sieverules_show_adv(this);', 'value' => '1', 'class' => 'checkbox'));
+ $headers_table->add(array('colspan' => '3', 'style' => 'text-align: right'), html::label('nadvopts' . $rowid, rcmail::Q($this->gettext('advancedoptions'))) . $input_advopts->show($eheadshowadv));
+
+ // get mailbox list
+ $mbox_name = $rcmail->storage->get_folder();
+
+ // build the folders tree
+ if (empty($a_mailboxes)) {
+ // get mailbox list
+ if ($rcmail->config->get('sieverules_fileinto_options', 0) > 0)
+ $a_folders = $rcmail->storage->list_folders();
+ else
+ $a_folders = $rcmail->storage->list_folders_subscribed();
+
+ $delimiter = $rcmail->storage->get_hierarchy_delimiter();
+ $a_mailboxes = array();
+
+ foreach ($a_folders as $ifolder) {
+ if ($rcmail->config->get('sieverules_folder_encoding'))
+ $ifolder = $this->_mbox_encode($ifolder, $rcmail->config->get('sieverules_folder_encoding'));
+
+ if ($rcmail->config->get('sieverules_folder_delimiter', false))
+ $rcmail->build_folder_tree($a_mailboxes, str_replace($delimiter, $rcmail->config->get('sieverules_folder_delimiter'), $ifolder), $rcmail->config->get('sieverules_folder_delimiter'));
+ else
+ $rcmail->build_folder_tree($a_mailboxes, $ifolder, $delimiter);
+ }
+
+ if ($rcmail->config->get('sieverules_fileinto_options', 0) == 2 && in_array('mailbox', $ext))
+ array_push($a_mailboxes, array('id' => '@@newfolder', 'name' => $this->gettext('createfolder'), 'virtual' => '', 'folders' => array()));
+ }
+
+ $input_folderlist = new html_select(array('name' => '_folder[]', 'onchange' => rcmail_output::JS_OBJECT_NAME . '.sieverules_select_folder(this);', 'style' => ($method == 'fileinto' || $method == 'fileinto_copy') ? '' : 'display: none;', 'is_escaped' => true));
+ $rcmail->render_folder_tree_select($a_mailboxes, $mbox_name, 100, $input_folderlist, false);
+
+ $show_customfolder = 'display: none;';
+ if ($rcmail->config->get('sieverules_fileinto_options', 0) == 2 && !$rcmail->storage->folder_exists($folder)) {
+ $customfolder = $rcmail->storage->mod_folder($folder);
+ $folder = '@@newfolder';
+ $show_customfolder = '';
+ }
+
+ $input_customfolder = new html_inputfield(array('name' => '_customfolder[]'));
+ $otherfolders = html::span(array('id' => 'customfolder_rowid', 'style' => $show_customfolder), '<br />' . $input_customfolder->show($customfolder));
+
+ $input_address = new html_inputfield(array('name' => '_redirect[]', 'style' => ($method == 'redirect' || $method == 'redirect_copy') ? '' : 'display: none;'));
+ $input_reject = new html_textarea(array('name' => '_reject[]', 'rows' => '5', 'cols' => '40', 'style' => ($method == 'reject' || $method == 'ereject') ? '' : 'display: none;'));
+ $input_imapflags = new html_select(array('name' => '_imapflags[]', 'style' => ($method == 'imapflags' || $method == 'imap4flags') ? '' : 'display: none;'));
+ foreach($this->flags as $name => $val)
+ $input_imapflags->add(rcmail::Q($this->gettext($name)), rcmail::Q($val));
+
+ $actions_table->add('folder', $input_folderlist->show($folder) . $otherfolders . $input_address->show($address) . $vacs_table->show() . $notify_table->show() . $input_imapflags->show($flags) . $input_reject->show($reject) . $headers_table->show());
+
+ $add_button = $this->api->output->button(array('command' => 'plugin.sieverules.add_action', 'type' => 'link', 'class' => 'add', 'title' => 'sieverules.addsieveact', 'content' => ' '));
+ $delete_button = $this->api->output->button(array('command' => 'plugin.sieverules.del_action', 'type' => 'link', 'class' => 'delete', 'classact' => 'delete_act', 'title' => 'sieverules.deletesieveact', 'content' => ' '));
+
+ if ($rcmail->config->get('sieverules_multiple_actions'))
+ $actions_table->add('control', $delete_button . $add_button);
+ else
+ $actions_table->add('control', "&nbsp;");
+
+ return $actions_table;
+ }
+
+ private function _in_headerarray($needle, $haystack)
+ {
+ foreach ($haystack as $data) {
+ $args = explode("::", $data);
+ if ($args[1] == $needle)
+ return $args[0];
+ }
+
+ return false;
+ }
+
+ private function _strip_val($str, $allow_html = false, $trim = true)
+ {
+ $str = !$allow_html ? htmlspecialchars_decode($str) : $str;
+ $str = $trim ? trim($str) : $str;
+
+ return $str;
+ }
+
+ private function _mbox_encode($text, $encoding)
+ {
+ return rcube_charset::convert($text, 'UTF7-IMAP', $encoding);
+ }
+
+ // get identity record
+ private function _rcmail_get_identity($id)
+ {
+ $rcmail = rcube::get_instance();
+
+ if ($sql_arr = $rcmail->user->get_identity($id)) {
+ $out = $sql_arr;
+ $out['mailto'] = $sql_arr['email'];
+ $out['string'] = format_email_recipient($sql_arr['email'], rcube_charset::convert($sql_arr['name'], RCUBE_CHARSET, $this->api->output->get_charset()));
+
+ if ($rcmail->config->get('sieverules_from_format', 0) == 1) {
+ $out['disp_string'] = $out['string'];
+ $out['val_string'] = $out['string'];
+ }
+ else {
+ $out['disp_string'] = $out['mailto'];
+ $out['val_string'] = $out['mailto'];
+ }
+
+ return $out;
+ }
+
+ return FALSE;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/plugins/sieverules/skins/classic/cross.gif b/plugins/sieverules/skins/classic/cross.gif
new file mode 100644
index 000000000..327052a23
--- /dev/null
+++ b/plugins/sieverules/skins/classic/cross.gif
Binary files differ
diff --git a/plugins/sieverules/skins/classic/help.gif b/plugins/sieverules/skins/classic/help.gif
new file mode 100644
index 000000000..ea7bbb363
--- /dev/null
+++ b/plugins/sieverules/skins/classic/help.gif
Binary files differ
diff --git a/plugins/sieverules/skins/classic/icons.gif b/plugins/sieverules/skins/classic/icons.gif
new file mode 100644
index 000000000..ba772f2ad
--- /dev/null
+++ b/plugins/sieverules/skins/classic/icons.gif
Binary files differ
diff --git a/plugins/sieverules/skins/classic/icons.png b/plugins/sieverules/skins/classic/icons.png
new file mode 100644
index 000000000..31a26491d
--- /dev/null
+++ b/plugins/sieverules/skins/classic/icons.png
Binary files differ
diff --git a/plugins/sieverules/skins/classic/ie6hacks.css b/plugins/sieverules/skins/classic/ie6hacks.css
new file mode 100644
index 000000000..a6b414034
--- /dev/null
+++ b/plugins/sieverules/skins/classic/ie6hacks.css
@@ -0,0 +1,10 @@
+/**
+ * SieveRules plugin styles (IE6 hacks)
+ */
+
+#sieverules-table tbody td.control a,
+#rules-table tbody td.control a,
+#actions-table tbody td.control a
+{
+ background-image: url(icons.gif);
+} \ No newline at end of file
diff --git a/plugins/sieverules/skins/classic/iehacks.css b/plugins/sieverules/skins/classic/iehacks.css
new file mode 100644
index 000000000..582f452a3
--- /dev/null
+++ b/plugins/sieverules/skins/classic/iehacks.css
@@ -0,0 +1,53 @@
+/**
+ * SieveRules plugin styles (IE hacks)
+ */
+
+#sieverules-list
+{
+ height: expression(parseInt(this.parentNode.offsetHeight)+'px');
+}
+
+.sieverules-boxcontent
+{
+ height: expression(parseInt(this.parentNode.offsetHeight)-25+'px');
+}
+
+#sieverules-list-filters
+{
+ height: expression(parseInt(this.parentNode.offsetHeight)+'px');
+ width: expression(parseInt(this.parentNode.offsetWidth)+'px');
+}
+
+#sieverules-list-examples
+{
+ width: expression(parseInt(this.parentNode.offsetWidth)+'px');
+}
+
+#sieverules-details
+{
+ height: expression(parseInt(this.parentNode.offsetHeight)+'px');
+ width: expression((parseInt(this.parentNode.offsetWidth)-250)+'px');
+}
+
+#sieverules-advanced
+{
+ height: expression((parseInt(document.documentElement.clientHeight)-130)+'px');
+ width: expression((parseInt(document.documentElement.clientWidth)-40)+'px');
+}
+
+table.records-table td.vacdaysexp
+{
+ word-wrap: break-word;
+}
+
+#sieverules-advancedbox
+{
+ height: expression((parseInt(document.documentElement.clientHeight)-177)+'px');
+ width: expression((parseInt(document.documentElement.clientWidth)-48)+'px');
+}
+
+#sieverules-advanced textarea
+{
+ height: expression((parseInt(document.documentElement.clientHeight)-177)+'px');
+ width: expression((parseInt(document.documentElement.clientWidth)-48)+'px');
+} \ No newline at end of file
diff --git a/plugins/sieverules/skins/classic/safari.css b/plugins/sieverules/skins/classic/safari.css
new file mode 100644
index 000000000..0add9e3d2
--- /dev/null
+++ b/plugins/sieverules/skins/classic/safari.css
@@ -0,0 +1,8 @@
+/**
+ * SieveRules plugin styles (safari hacks)
+ */
+
+table.records-table td.vacdaysexp
+{
+ word-wrap: break-word;
+} \ No newline at end of file
diff --git a/plugins/sieverules/skins/classic/sieverules.css b/plugins/sieverules/skins/classic/sieverules.css
new file mode 100644
index 000000000..54a1b0cfa
--- /dev/null
+++ b/plugins/sieverules/skins/classic/sieverules.css
@@ -0,0 +1,406 @@
+/**
+ * SieveRules plugin styles
+ */
+
+#sieverules-list
+{
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: 240px;
+}
+
+.sieverules-boxcontent
+{
+ position: absolute;
+ top: 0;
+ bottom: 23px;
+ width: 100%;
+}
+
+#sieverules-list-filters
+{
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ width: 100%;
+ border: 1px solid #999999;
+ overflow: auto;
+}
+
+#sieverules-list-filters thead td
+{
+ height: 20px;
+}
+
+#sieverules-list-filters thead td span
+{
+ position: absolute;
+ top: 2px;
+ left: 4px;
+ right: 25px;
+ height: 20px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+
+#sieverules-list-filters thead td img
+{
+ position: absolute;
+ top: 2px;
+ right: 2px;
+}
+
+#sieverules-list-examples
+{
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ width: 100%;
+ border: 1px solid #999999;
+ overflow: auto;
+}
+
+#sieverules-list div.boxfooter
+{
+ border: 1px solid #999999;
+ border-top: 0;
+ width: 100%;
+}
+
+#sieverules-details
+{
+ position: absolute;
+ top: 0;
+ left: 250px;
+ right: 0;
+ bottom: 0;
+ border: 1px solid #999999;
+}
+
+#sieverules-advanced
+{
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 25px;
+ right: 0;
+ overflow: hidden;
+ border: 1px solid #999999;
+}
+
+span.disableLink
+{
+ float: right;
+ width: 200px;
+ text-align: right;
+}
+
+#sieverules-table,
+#sieverules-examples
+{
+ width: 100%;
+}
+
+#sieverules-table tbody td
+{
+ cursor: default;
+}
+
+#sieverules-table tbody td.control,
+#rules-table tbody td.control,
+#actions-table tbody td.control
+{
+ text-align: right;
+}
+
+#sieverules-table tbody td.control a,
+#rules-table tbody td.control a,
+#actions-table tbody td.control a
+{
+ display: block;
+ float: right;
+ width: 16px;
+ height: 16px;
+ background-image: url(icons.png);
+}
+
+#sieverules-table tbody td.control a.up_arrow
+{
+ background-position: 0 0;
+}
+
+#sieverules-table tbody td.control a.down_arrow
+{
+ background-position: 0 -18px;
+}
+
+#rules-table tbody td.control,
+#actions-table tbody td.control
+{
+ vertical-align: top;
+}
+
+#rules-table tbody td.control a.add,
+#actions-table tbody td.control a.add
+{
+ margin-left: 5px;
+ background-position: 0 -72px;
+}
+
+#rules-table tbody td.control a.delete,
+#actions-table tbody td.control a.delete
+{
+ background-position: 0 -54px;
+}
+
+#rules-table tbody td.control a.delete_act,
+#actions-table tbody td.control a.delete_act
+{
+ background-position: 0 -36px;
+}
+
+#actions-table tbody a.vacsig
+{
+ display: block;
+ width: 16px;
+ height: 16px;
+ background-image: url(icons.png);
+ background-position: 0 -108px;
+}
+
+#actions-table tbody a.vacsig_act
+{
+ display: block;
+ width: 16px;
+ height: 16px;
+ background-image: url(icons.png);
+ background-position: 0 -90px;
+}
+
+#rules-table,
+#actions-table,
+#rules-table td table.records-table
+{
+ width: 100%;
+}
+
+#rules-table td.selheader,
+#rules-table td.op
+{
+ width: 130px;
+}
+
+#rules-table td.header
+{
+ width: 135px;
+}
+
+#rules-table td.target
+{
+ width: 160px;
+}
+
+#rules-table input
+{
+ width: 150px;
+}
+
+#rules-table input.short
+{
+ width: 100px;
+}
+
+#rules-table select
+{
+ width: 123px;
+}
+
+#rules-table select.short
+{
+ width: 45px;
+}
+
+#rules-table select.long
+{
+ width: 157px;
+}
+
+#rules-table td table.records-table select
+{
+ width: 432px;
+}
+
+#rules-table td table.records-table input
+{
+ width: 426px;
+}
+
+#rules-table td table.records-table input.short
+{
+ width: 406px;
+}
+
+#rules-table td table.records-table input.radio
+{
+ width: auto;
+}
+
+#actions-table td.action
+{
+ width: 165px;
+ vertical-align: top;
+}
+
+#actions-table td.folder
+{
+ width: 420px;
+ vertical-align: top;
+}
+
+#actions-table td.action select
+{
+ width: 160px;
+}
+
+#actions-table td.folder input,
+#actions-table td.folder textarea
+{
+ width: 400px;
+}
+
+#actions-table td.folder select
+{
+ width: 408px;
+}
+
+#actions-table td.folder table.records-table select
+{
+ width: 337px;
+}
+
+#actions-table td.folder table.records-table input,
+#actions-table td.folder table.records-table textarea
+{
+ width: 330px;
+}
+
+#actions-table td.folder table.records-table input.short,
+#actions-table td.folder table.records-table select.short
+{
+ width: 310px;
+}
+
+#actions-table td.folder table.records-table input.checkbox,
+#actions-table td.folder table.records-table input.radio
+{
+ width: auto;
+}
+
+table.records-table td.msg
+{
+ vertical-align: top;
+}
+
+table.records-table td.vacdaysexp
+{
+ width: 398px;
+ white-space: -moz-pre-wrap !important;
+ white-space: pre-wrap !important;
+ white-space: pre;
+}
+
+#listbuttons
+{
+ position: absolute;
+ bottom: 18px;
+ left: 20px;
+}
+
+#advancedmode
+{
+ white-space: nowrap;
+ text-align: right;
+ position: absolute;
+ bottom: 30px;
+ right: 20px;
+ width: 460px;
+}
+
+#sieverules-advancedbox
+{
+ position: absolute;
+ top: 20px;
+ left: 0;
+ bottom: 26px;
+ right: 4px;
+}
+
+#sieverules-advanced textarea
+{
+ position: absolute;
+ top: 0;
+ left: 0;
+ border: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.records-table tbody tr.droptarget td
+{
+ border-top: 2px solid #000000;
+}
+
+.records-table tbody tr.droptargetend td
+{
+ border-bottom: 2px solid #000000;
+}
+
+#sieverulesrsdialog h3
+{
+ color: #333;
+ font-size: normal;
+ margin-top: 0.5em;
+ margin-bottom: 1em;
+}
+
+#sieverulesrsdialog table td.title
+{
+ color: #666;
+ text-align: right;
+ padding-right: 1em;
+ white-space: nowrap;
+}
+
+#sieverulesrsdialog table td input
+{
+ width: 20em;
+}
+
+#sieverulesrsdialog .formbuttons
+{
+ margin-top: 1.5em;
+ text-align: center;
+}
+
+input.inputmask
+{
+ color: #999999;
+}
+
+#sieverulesactionsmenu a.selected
+{
+ font-weight: bold;
+}
+
+#sieverules-advbuttons
+{
+ position: absolute;
+ left: 0;
+ bottom: 0;
+} \ No newline at end of file
diff --git a/plugins/sieverules/skins/classic/tabstyles.css b/plugins/sieverules/skins/classic/tabstyles.css
new file mode 100644
index 000000000..b1b1c3f95
--- /dev/null
+++ b/plugins/sieverules/skins/classic/tabstyles.css
@@ -0,0 +1,3 @@
+/**
+ * SieveRules plugin styles (tab styles)
+ */
diff --git a/plugins/sieverules/skins/classic/templates/advancededitor.html b/plugins/sieverules/skins/classic/templates/advancededitor.html
new file mode 100644
index 000000000..e42e40195
--- /dev/null
+++ b/plugins/sieverules/skins/classic/templates/advancededitor.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<link rel="stylesheet" type="text/css" href="/this/sieverules.css" />
+<roundcube:if condition="browser:ie" />
+<link rel="stylesheet" type="text/css" href="/this/iehacks.css" />
+<roundcube:endif />
+<roundcube:if condition="browser:safari" />
+<link rel="stylesheet" type="text/css" href="/this/safari.css" />
+<roundcube:endif />
+<script type="text/javascript" src="/functions.js"></script>
+</head>
+<body onload="rcube_init_mail_ui(); rcmail_ui.popups.sieverulesmenu = {id: 'sieverulesactionsmenu', obj:$('#sieverulesactionsmenu'), above:1};">
+
+<roundcube:include file="/includes/taskbar.html" />
+<roundcube:include file="/includes/header.html" />
+<roundcube:include file="/includes/settingstabs.html" />
+
+<div id="mainscreen">
+
+<div id="sieverules-advanced">
+<div id="prefs-title" class="boxtitle"><roundcube:object name="steptitle" /></div>
+
+<div id="sieverules-advancedbox">
+<roundcube:object name="advancededitor" />
+</div>
+
+<div class="boxfooter">
+<roundcube:button name="sieverulesactions" id="sieverulesmenulink" type="link" title="sieverules.moreactions" class="button groupactions" onclick="rcmail_ui.show_popupmenu('sieverulesmenu'); return false" content=" " />
+</div>
+</div>
+
+<div id="sieverules-advbuttons">
+<roundcube:button command="plugin.sieverules.save" type="input" label="save" class="button mainaction" />
+</div>
+
+</div>
+
+<div id="sieverulesactionsmenu" class="popupmenu">
+ <ul>
+ <roundcube:if condition="config:sieverules_multiplerules == true" />
+ <li class="separator_below"><roundcube:button command="plugin.sieverules.ruleset_dialog" type="link" label="sieverules.newruleset" classAct="active" /></li>
+ <roundcube:object name="rulelist" type="link" />
+ <li class="separator_above"><roundcube:button command="plugin.sieverules.ruleset_dialog" prop="rename_ruleset" type="link" label="sieverules.renameruleset" classAct="active" /></li>
+ <li><roundcube:button command="plugin.sieverules.del_ruleset" type="link" label="sieverules.delruleset" classAct="active" /></li>
+ <li><roundcube:button command="plugin.sieverules.activate_ruleset" type="link" label="sieverules.activateruleset" classAct="active" /></li>
+ <roundcube:endif />
+ <li<roundcube:exp expression="config:sieverules_multiplerules == true ? ' class=separator_above' : ''" />><roundcube:button command="plugin.sieverules.sieverules_adveditor" prop="0" type="link" label="sieverules.stdeditor" classAct="active" /></li>
+ </ul>
+</div>
+
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/sieverules/skins/classic/templates/editsieverule.html b/plugins/sieverules/skins/classic/templates/editsieverule.html
new file mode 100644
index 000000000..58b4c966a
--- /dev/null
+++ b/plugins/sieverules/skins/classic/templates/editsieverule.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<link rel="stylesheet" type="text/css" href="/this/sieverules.css" />
+<roundcube:if condition="browser:ie" />
+<link rel="stylesheet" type="text/css" href="/this/iehacks.css" />
+<roundcube:endif />
+<roundcube:if condition="browser:safari" />
+<link rel="stylesheet" type="text/css" href="/this/safari.css" />
+<roundcube:endif />
+<!--[if lte IE 6]><link rel="stylesheet" type="text/css" href="/this//ie6hacks.css" /><![endif]-->
+<script type="text/javascript" src="/functions.js"></script>
+</head>
+<body class="iframe">
+<div id="prefs-title" class="boxtitle"><roundcube:object name="steptitle" /></div>
+
+<div class="boxcontent">
+<roundcube:object name="sieveruleform" helpIcon="/this/help.gif" />
+
+<p><br />
+<roundcube:button command="plugin.sieverules.copy_rule" type="input" class="button" label="sieverules.copy" condition="env:action=='plugin.sieverules.edit' && config:sieverules_multiplerules == true" style="margin-right:0.5em" />
+<roundcube:button command="plugin.sieverules.save" type="input" class="button mainaction" label="save" />
+</p>
+</div>
+
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/sieverules/skins/classic/templates/setupsieverules.html b/plugins/sieverules/skins/classic/templates/setupsieverules.html
new file mode 100644
index 000000000..a9e01f565
--- /dev/null
+++ b/plugins/sieverules/skins/classic/templates/setupsieverules.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<link rel="stylesheet" type="text/css" href="/this/sieverules.css" />
+<roundcube:if condition="browser:ie" />
+<link rel="stylesheet" type="text/css" href="/this/iehacks.css" />
+<roundcube:endif />
+<roundcube:if condition="browser:safari" />
+<link rel="stylesheet" type="text/css" href="/this/safari.css" />
+<roundcube:endif />
+<script type="text/javascript" src="/functions.js"></script>
+</head>
+<body onload="parent.rcmail.sieverules_disable_ruleset_options();" class="iframe">
+<roundcube:object name="sieverulessetup" />
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/sieverules/skins/classic/templates/sieverules.html b/plugins/sieverules/skins/classic/templates/sieverules.html
new file mode 100644
index 000000000..66b2c0022
--- /dev/null
+++ b/plugins/sieverules/skins/classic/templates/sieverules.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<link rel="stylesheet" type="text/css" href="/this/sieverules.css" />
+<roundcube:if condition="browser:ie" />
+<link rel="stylesheet" type="text/css" href="/this/iehacks.css" />
+<roundcube:endif />
+<roundcube:if condition="browser:safari" />
+<link rel="stylesheet" type="text/css" href="/this/safari.css" />
+<roundcube:endif />
+<!--[if lte IE 6]><link rel="stylesheet" type="text/css" href="/this//ie6hacks.css" /><![endif]-->
+<script type="text/javascript" src="/functions.js"></script>
+<script type="text/javascript" src="/splitter.js"></script>
+
+<style type="text/css">
+
+#sieverules-list { width: <roundcube:exp expression="!empty(cookie:sieverulesviewsplitter) ? cookie:sieverulesviewsplitter-5 : 240" />px; }
+<roundcube:if condition="env:examples" />
+#sieverules-list-filters {
+ bottom: <roundcube:exp expression="!empty(cookie:sievefiltersviewsplitter) ? cookie:sievefiltersviewsplitter+5 : 0" />px;
+ <roundcube:exp expression="browser:ie ? ('height:expression((parseInt(this.parentNode.offsetHeight)-'.(!empty(cookie:sievefiltersviewsplitter) ? cookie:sievefiltersviewsplitter+5 : 0).')+\\'px\\');') : ''" />
+}
+<roundcube:else />
+#sieverules-list-filters {
+ bottom: 0;
+ <roundcube:exp expression="browser:ie ? 'height:expression(parseInt(this.parentNode.offsetHeight)+\\'px\\');' : ''" />
+}
+<roundcube:endif />
+#sieverules-details {
+ left: <roundcube:exp expression="!empty(cookie:sieverulesviewsplitter) ? cookie:sieverulesviewsplitter+5 : 250" />px;
+ <roundcube:exp expression="browser:ie ? ('width:expression((parseInt(mainscreen.offsetWidth)-'.(!empty(cookie:sieverulesviewsplitter) ? cookie:sieverulesviewsplitter+5 : 250).')+\\'px\\');') : ''" />
+}
+</style>
+
+</head>
+<body onload="rcube_init_mail_ui(); rcmail_ui.popups.sieverulesmenu = {id: 'sieverulesactionsmenu', obj:$('#sieverulesactionsmenu'), above:1};">
+
+<roundcube:include file="/includes/taskbar.html" />
+<roundcube:include file="/includes/header.html" />
+<roundcube:include file="/includes/settingstabs.html" />
+
+<div id="mainscreen">
+
+<div id="sieverules-list">
+<div class="sieverules-boxcontent">
+<roundcube:object name="sieveruleslist" activeicon="/this/tick.gif" inactiveicon="/this/cross.gif" />
+<roundcube:object name="sieverulesexamplelist" />
+</div>
+<div class="boxfooter">
+<roundcube:button command="plugin.sieverules.add" type="link" title="sieverules.newfilter" class="buttonPas addgroup" classAct="button addgroup" content=" " />
+<roundcube:button command="plugin.sieverules.delete" type="link" title="delete" class="buttonPas delgroup" classAct="button delgroup" content=" " />
+<roundcube:if condition="config:sieverules_multiplerules == true || config:sieverules_adveditor == 1 || config:sieverules_adveditor == 2" />
+<roundcube:button name="sieverulesactions" id="sieverulesmenulink" type="link" title="sieverules.moreactions" class="button groupactions" onclick="rcmail_ui.show_popupmenu('sieverulesmenu'); return false" content=" " />
+<roundcube:endif />
+</div>
+</div>
+
+<script type="text/javascript">
+ var rulesviewsplit = new rcube_splitter({id:'sieverulesviewsplitter', p1: 'sieverules-list', p2: 'sieverules-details', orientation: 'v', relative: true, start: 245});
+ rcmail.add_onload('rulesviewsplit.init()');
+
+ if ($('#sieverules-list-examples').length > 0) {
+ var filtersHeight = parseInt($('#sieverules-list').height() - 210);
+ var filtersviewsplit = new rcube_splitter({id:'sievefiltersviewsplitter', p1: 'sieverules-list-filters', p2: 'sieverules-list-examples', orientation: 'h', relative: true, start: filtersHeight});
+ rcmail.add_onload('filtersviewsplit.init()');
+ }
+</script>
+
+<div id="sieverules-details">
+<roundcube:object name="sieverulesframe" id="prefs-frame" width="100%" height="100%" frameborder="0" src="/watermark.html" />
+</div>
+
+</div>
+
+<div id="sieverulesactionsmenu" class="popupmenu">
+ <ul>
+ <roundcube:if condition="config:sieverules_multiplerules == true" />
+ <li class="separator_below"><roundcube:button command="plugin.sieverules.ruleset_dialog" type="link" label="sieverules.newruleset" classAct="active" /></li>
+ <roundcube:object name="rulelist" type="link" />
+ <li class="separator_above"><roundcube:button command="plugin.sieverules.ruleset_dialog" prop="rename_ruleset" type="link" label="sieverules.renameruleset" classAct="active" /></li>
+ <li><roundcube:button command="plugin.sieverules.del_ruleset" type="link" label="sieverules.delruleset" classAct="active" /></li>
+ <li><roundcube:button command="plugin.sieverules.activate_ruleset" type="link" label="sieverules.activateruleset" classAct="active" /></li>
+ <roundcube:endif />
+ <roundcube:if condition="config:sieverules_adveditor == 1 || config:sieverules_adveditor == 2" />
+ <li<roundcube:exp expression="config:sieverules_multiplerules == true ? ' class=separator_above' : ''" />><roundcube:button command="plugin.sieverules.sieverules_adveditor" prop="1" type="link" label="sieverules.adveditor" classAct="active" /></li>
+ <roundcube:endif />
+ </ul>
+</div>
+
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/sieverules/skins/classic/tick.gif b/plugins/sieverules/skins/classic/tick.gif
new file mode 100644
index 000000000..08c3a3a13
--- /dev/null
+++ b/plugins/sieverules/skins/classic/tick.gif
Binary files differ
diff --git a/plugins/sieverules/skins/larry/cross.png b/plugins/sieverules/skins/larry/cross.png
new file mode 100644
index 000000000..8d8a13f47
--- /dev/null
+++ b/plugins/sieverules/skins/larry/cross.png
Binary files differ
diff --git a/plugins/sieverules/skins/larry/help.png b/plugins/sieverules/skins/larry/help.png
new file mode 100644
index 000000000..9f7a6ae44
--- /dev/null
+++ b/plugins/sieverules/skins/larry/help.png
Binary files differ
diff --git a/plugins/sieverules/skins/larry/icons.png b/plugins/sieverules/skins/larry/icons.png
new file mode 100644
index 000000000..db84da896
--- /dev/null
+++ b/plugins/sieverules/skins/larry/icons.png
Binary files differ
diff --git a/plugins/sieverules/skins/larry/iehacks.css b/plugins/sieverules/skins/larry/iehacks.css
new file mode 100644
index 000000000..e370e9300
--- /dev/null
+++ b/plugins/sieverules/skins/larry/iehacks.css
@@ -0,0 +1,53 @@
+/**
+ * SieveRules plugin styles (IE hacks)
+ */
+
+#sieverules-list
+{
+ height: expression(parseInt(this.parentNode.offsetHeight)+'px');
+}
+
+.sieverules-boxcontent
+{
+ height: expression(parseInt(this.parentNode.offsetHeight)-25+'px');
+}
+
+#sieverules-list-filters
+{
+ height: expression(parseInt(this.parentNode.offsetHeight)+'px');
+ width: expression(parseInt(this.parentNode.offsetWidth)+'px');
+}
+
+#sieverules-list-examples
+{
+ width: expression(parseInt(this.parentNode.offsetWidth)+'px');
+}
+
+#sieverules-details
+{
+ height: expression(parseInt(this.parentNode.offsetHeight)+'px');
+ width: expression((parseInt(this.parentNode.offsetWidth)-270)+'px');
+}
+
+#sieverules-advanced
+{
+ height: expression((parseInt(document.documentElement.clientHeight)-130)+'px');
+ width: expression((parseInt(document.documentElement.clientWidth)-40)+'px');
+}
+
+table.records-table td.vacdaysexp
+{
+ word-wrap: break-word;
+}
+
+#sieverules-advancedbox
+{
+ height: expression((parseInt(document.documentElement.clientHeight)-177)+'px');
+ width: expression((parseInt(document.documentElement.clientWidth)-48)+'px');
+}
+
+#sieverules-advanced textarea
+{
+ height: expression((parseInt(document.documentElement.clientHeight)-177)+'px');
+ width: expression((parseInt(document.documentElement.clientWidth)-48)+'px');
+} \ No newline at end of file
diff --git a/plugins/sieverules/skins/larry/listicons.png b/plugins/sieverules/skins/larry/listicons.png
new file mode 100644
index 000000000..f6889c4a0
--- /dev/null
+++ b/plugins/sieverules/skins/larry/listicons.png
Binary files differ
diff --git a/plugins/sieverules/skins/larry/safari.css b/plugins/sieverules/skins/larry/safari.css
new file mode 100644
index 000000000..0add9e3d2
--- /dev/null
+++ b/plugins/sieverules/skins/larry/safari.css
@@ -0,0 +1,8 @@
+/**
+ * SieveRules plugin styles (safari hacks)
+ */
+
+table.records-table td.vacdaysexp
+{
+ word-wrap: break-word;
+} \ No newline at end of file
diff --git a/plugins/sieverules/skins/larry/sieverules.css b/plugins/sieverules/skins/larry/sieverules.css
new file mode 100644
index 000000000..c726acfed
--- /dev/null
+++ b/plugins/sieverules/skins/larry/sieverules.css
@@ -0,0 +1,435 @@
+/**
+ * SieveRules plugin styles
+ */
+
+#sieverules-list
+{
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 260px;
+ bottom: 0;
+}
+
+#sieverules-list-filters
+{
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ width: 100%;
+ overflow: auto;
+}
+
+#sieverules-list-filters thead td
+{
+ height: 15px;
+}
+
+#sieverules-list-filters thead td span
+{
+ position: absolute;
+ top: 10px;
+ left: 8px;
+ right: 30px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+
+#sieverules-list-filters thead td img
+{
+ position: absolute;
+ top: 9px;
+ right: 8px;
+}
+
+#sieverules-list-examples
+{
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ width: 100%;
+ overflow: auto;
+}
+
+#sieverules-details
+{
+ position: absolute;
+ top: 0;
+ left: 270px;
+ right: 0;
+ bottom: 0;
+}
+
+#sieverules-advanced
+{
+ position: absolute;
+ top: 0;
+ left: 232px;
+ right: 0;
+ bottom: 0;
+}
+
+span.disableLink
+{
+ float: right;
+ width: 200px;
+ text-align: right;
+}
+
+#sieverules-table,
+#sieverules-examples
+{
+ width: 100%;
+}
+
+#sieverules-table tbody td
+{
+ cursor: default;
+}
+
+#sieverules-table tbody td.control,
+#rules-table tbody td.control,
+#actions-table tbody td.control
+{
+ text-align: right;
+}
+
+#sieverules-table tbody td.control a,
+#rules-table tbody td.control a,
+#actions-table tbody td.control a
+{
+ display: block;
+ float: right;
+ width: 16px;
+ height: 16px;
+ background-image: url(icons.png);
+}
+
+#sieverules-table tbody td.control a.up_arrow
+{
+ background-position: 0 0;
+}
+
+#sieverules-table tbody td.control a.down_arrow
+{
+ background-position: 0 -18px;
+}
+
+#rules-table tbody td.control,
+#actions-table tbody td.control
+{
+ vertical-align: top;
+}
+
+#rules-table tbody td.control a.add,
+#actions-table tbody td.control a.add
+{
+ margin-left: 5px;
+ background-position: 0 -78px;
+}
+
+#rules-table tbody td.control a.delete,
+#actions-table tbody td.control a.delete
+{
+ background-position: 0 -59px;
+}
+
+#rules-table tbody td.control a.delete_act,
+#actions-table tbody td.control a.delete_act
+{
+ background-position: 0 -39px;
+}
+
+#actions-table tbody a.vacsig
+{
+ display: block;
+ width: 16px;
+ height: 16px;
+ background-image: url(icons.png);
+ background-position: -1px -126px;
+}
+
+#actions-table tbody a.vacsig_act
+{
+ display: block;
+ width: 16px;
+ height: 16px;
+ background-image: url(icons.png);
+ background-position: -1px -102px;
+}
+
+table.records-table
+{
+ width: auto;
+ border: 0;
+}
+
+table.records-table tbody td,
+table.records-table thead td
+{
+ border: 0;
+}
+
+#rules-table,
+#actions-table
+{
+ width: 100%;
+}
+
+#rules-table td table.records-table
+{
+ width: auto;
+}
+
+#rules-table td,
+#actions-table td,
+#rules-table td table.records-table td
+{
+ width: auto;
+}
+
+#rules-table td.selheader,
+#rules-table td.op
+{
+ width: 130px;
+}
+
+#rules-table td.header
+{
+ width: 135px;
+}
+
+#rules-table td.target
+{
+ width: 180px;
+}
+
+#rules-table input
+{
+ width: 150px;
+}
+
+#rules-table input.short
+{
+ width: 100px;
+}
+
+#rules-table select
+{
+ width: 123px;
+}
+
+#rules-table select.short
+{
+ width: 45px;
+}
+
+#rules-table select.long
+{
+ width: 157px;
+}
+
+#rules-table td table.records-table select
+{
+ width: 432px;
+}
+
+#rules-table td table.records-table input
+{
+ width: 426px;
+}
+
+#rules-table td table.records-table input.short
+{
+ width: 406px;
+}
+
+#rules-table td table.records-table input.radio
+{
+ width: auto;
+}
+
+#actions-table td.action
+{
+ width: 165px;
+ vertical-align: top;
+}
+
+#actions-table td.folder
+{
+ width: 420px;
+ vertical-align: top;
+}
+
+#actions-table td.action select
+{
+ width: 160px;
+}
+
+#actions-table td.folder input,
+#actions-table td.folder textarea
+{
+ width: 400px;
+}
+
+#actions-table td.folder select
+{
+ width: 408px;
+}
+
+#actions-table td.folder table.records-table select
+{
+ width: 337px;
+}
+
+#actions-table td.folder table.records-table input,
+#actions-table td.folder table.records-table textarea
+{
+ width: 330px;
+}
+
+#actions-table td.folder table.records-table input.short,
+#actions-table td.folder table.records-table select.short
+{
+ width: 310px;
+}
+
+#actions-table td.folder table.records-table input.checkbox,
+#actions-table td.folder table.records-table input.radio
+{
+ width: auto;
+}
+
+table.records-table td.msg
+{
+ vertical-align: top;
+}
+
+table.records-table td.vacdaysexp
+{
+ width: 398px;
+ white-space: -moz-pre-wrap !important;
+ white-space: pre-wrap !important;
+ white-space: pre;
+}
+
+#advancedmode
+{
+ white-space: nowrap;
+ text-align: right;
+ position: absolute;
+ bottom: 30px;
+ right: 20px;
+ width: 460px;
+}
+
+#sieverules-advancedbox
+{
+ position: absolute;
+ top: 34px;
+ left: 0;
+ bottom: 100px;
+ right: 8px;
+}
+
+#sieverules-advanced textarea
+{
+ position: absolute;
+ top: 0;
+ left: 0;
+ border: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.listing tbody tr.droptarget td
+{
+ border-top: 2px solid #0e5266;
+ background-color: #D9ECF4;
+}
+
+.listing tbody tr.droptargetend td
+{
+ border-bottom: 2px solid #0e5266;
+ background-color: #D9ECF4;
+}
+
+#sieverulesrsdialog h3
+{
+ color: #333;
+ font-size: medium;
+ margin-top: 0.5em;
+ margin-bottom: 1em;
+}
+
+#sieverulesrsdialog table td input
+{
+ width: 20em;
+}
+
+#sieverulesrsdialog .formbuttons
+{
+ margin-top: 1.5em;
+ text-align: center;
+}
+
+input.inputmask
+{
+ color: #999999;
+}
+
+#sieverulesactionsmenu a.selected
+{
+ font-weight: bold;
+}
+
+#sieverules-advbuttons
+{
+ position: absolute;
+ left: 0;
+ bottom: 45px;
+}
+
+#sieverules-advanced .boxfooter
+{
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ height: 27px;
+ padding-left: 1px;
+ border-top: 1px solid #ddd;
+ border-radius: 0 0 4px 4px;
+ background: #eaeaea;
+ background: -moz-linear-gradient(top, #eaeaea 0%, #c8c8c8 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#eaeaea), color-stop(100%,#c8c8c8));
+ background: -o-linear-gradient(top, #eaeaea 0%, #c8c8c8 100%);
+ background: -ms-linear-gradient(top, #eaeaea 0%, #c8c8c8 100%);
+ background: linear-gradient(top, #eaeaea 0%, #c8c8c8 100%);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+#sieverules-advanced .boxfooter .listbutton
+{
+ background: #C4BEBE;
+}
+
+#sieverules-advanced .boxfooter .listbutton .inner
+{
+ height: 20px;
+ background-image: url(listicons.png);
+ background-position: 5px -52px;
+}
+
+#sieverules-advanced .boxfooter #message
+{
+ position: absolute;
+ top: 0;
+ left: 65px;
+} \ No newline at end of file
diff --git a/plugins/sieverules/skins/larry/tabstyles.css b/plugins/sieverules/skins/larry/tabstyles.css
new file mode 100644
index 000000000..a7c988240
--- /dev/null
+++ b/plugins/sieverules/skins/larry/tabstyles.css
@@ -0,0 +1,15 @@
+/**
+ * SieveRules plugin styles (tab styles)
+ */
+
+#settings-sections #settingstabpluginsieverules a
+{
+ background-image: url(listicons.png);
+ background-position: 6px -2px;
+}
+
+#settings-sections #settingstabpluginsieverules.selected a
+{
+ background-image: url(listicons.png);
+ background-position: 6px -25px;
+} \ No newline at end of file
diff --git a/plugins/sieverules/skins/larry/templates/advancededitor.html b/plugins/sieverules/skins/larry/templates/advancededitor.html
new file mode 100644
index 000000000..38186f049
--- /dev/null
+++ b/plugins/sieverules/skins/larry/templates/advancededitor.html
@@ -0,0 +1,60 @@
+<roundcube:object name="doctype" value="html5" />
+<html>
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<link rel="stylesheet" type="text/css" href="/this/sieverules.css" />
+<roundcube:if condition="browser:ie" />
+<link rel="stylesheet" type="text/css" href="/this/iehacks.css" />
+<roundcube:endif />
+<roundcube:if condition="browser:safari" />
+<link rel="stylesheet" type="text/css" href="/this/safari.css" />
+<roundcube:endif />
+</head>
+<body class="noscroll">
+
+<roundcube:include file="/includes/header.html" />
+
+<div id="mainscreen" class="offset">
+
+<roundcube:include file="/includes/settingstabs.html" />
+
+<div id="sieverules-advanced" class="uibox contentbox">
+
+<h1 class="boxtitle"><roundcube:object name="steptitle" /></h1>
+
+<div id="sieverules-advancedbox" class="boxcontent">
+<roundcube:object name="advancededitor" class="propform" />
+</div>
+
+<div id="sieverules-advbuttons">
+<div class="footerleft formbuttons">
+<roundcube:button command="plugin.sieverules.save" type="input" label="save" class="button mainaction" />
+</div>
+</div>
+
+<div class="boxfooter">
+<roundcube:button name="sieverulesactions" id="sieverulesactionsmenulink" type="link" title="sieverules.moreactions" class="listbutton groupactions" onclick="UI.show_popup('sieverulesactionsmenu', true, {id: 'sieverulesactionsmenu', obj:$('#sieverulesactionsmenu'), above:1}); return false" innerClass="inner" content="&#9881;" />
+<roundcube:object name="message" id="message" />
+</div>
+</div>
+
+</div>
+
+<roundcube:include file="/includes/footer.html" />
+
+<div id="sieverulesactionsmenu" class="popupmenu">
+<ul class="toolbarmenu">
+<roundcube:if condition="config:sieverules_multiplerules == true" />
+<li class="separator_below"><roundcube:button command="plugin.sieverules.ruleset_dialog" type="link" label="sieverules.newruleset" classAct="active" /></li>
+<roundcube:object name="rulelist" type="link" />
+<li class="separator_above"><roundcube:button command="plugin.sieverules.ruleset_dialog" prop="rename_ruleset" type="link" label="sieverules.renameruleset" classAct="active" /></li>
+<li><roundcube:button command="plugin.sieverules.del_ruleset" type="link" label="sieverules.delruleset" classAct="active" /></li>
+<li><roundcube:button command="plugin.sieverules.activate_ruleset" type="link" label="sieverules.activateruleset" classAct="active" /></li>
+<roundcube:endif />
+<li<roundcube:exp expression="config:sieverules_multiplerules == true ? ' class=separator_above' : ''" />><roundcube:button command="plugin.sieverules.sieverules_adveditor" prop="0" type="link" label="sieverules.stdeditor" classAct="active" /></li>
+</ul>
+</div>
+
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/sieverules/skins/larry/templates/editsieverule.html b/plugins/sieverules/skins/larry/templates/editsieverule.html
new file mode 100644
index 000000000..5b7fe285c
--- /dev/null
+++ b/plugins/sieverules/skins/larry/templates/editsieverule.html
@@ -0,0 +1,30 @@
+<roundcube:object name="doctype" value="html5" />
+<html>
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<link rel="stylesheet" type="text/css" href="/this/sieverules.css" />
+<roundcube:if condition="browser:ie" />
+<link rel="stylesheet" type="text/css" href="/this/iehacks.css" />
+<roundcube:endif />
+<roundcube:if condition="browser:safari" />
+<link rel="stylesheet" type="text/css" href="/this/safari.css" />
+<roundcube:endif />
+</head>
+<body class="iframe">
+
+<h1 class="boxtitle"><roundcube:object name="steptitle" /></h1>
+
+<div id="preferences-details" class="boxcontent">
+<roundcube:object name="sieveruleform" class="propform" helpIcon="/this/help.png" />
+</div>
+
+<div class="footerleft formbuttons">
+<roundcube:button command="plugin.sieverules.save" type="input" class="button mainaction" label="save" />
+<roundcube:button command="plugin.sieverules.copy_rule" type="input" class="button" label="sieverules.copy" condition="env:action=='plugin.sieverules.edit' && config:sieverules_multiplerules == true" />
+</div>
+
+<roundcube:include file="/includes/footer.html" />
+
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/sieverules/skins/larry/templates/setupsieverules.html b/plugins/sieverules/skins/larry/templates/setupsieverules.html
new file mode 100644
index 000000000..0b11adbdd
--- /dev/null
+++ b/plugins/sieverules/skins/larry/templates/setupsieverules.html
@@ -0,0 +1,27 @@
+<roundcube:object name="doctype" value="html5" />
+<html>
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<link rel="stylesheet" type="text/css" href="/this/sieverules.css" />
+<roundcube:if condition="browser:ie" />
+<link rel="stylesheet" type="text/css" href="/this/iehacks.css" />
+<roundcube:endif />
+<roundcube:if condition="browser:safari" />
+<link rel="stylesheet" type="text/css" href="/this/safari.css" />
+<roundcube:endif />
+</head>
+<body class="iframe">
+
+<h1 class="boxtitle"><roundcube:object name="steptitle" /></h1>
+
+<div id="preferences-details" class="boxcontent">
+<roundcube:object name="sieverulessetup" class="propform" />
+</div>
+
+</div>
+
+<roundcube:include file="/includes/footer.html" />
+
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/sieverules/skins/larry/templates/sieverules.html b/plugins/sieverules/skins/larry/templates/sieverules.html
new file mode 100644
index 000000000..694152076
--- /dev/null
+++ b/plugins/sieverules/skins/larry/templates/sieverules.html
@@ -0,0 +1,78 @@
+<roundcube:object name="doctype" value="html5" />
+<html>
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<link rel="stylesheet" type="text/css" href="/this/sieverules.css" />
+<roundcube:if condition="browser:ie" />
+<link rel="stylesheet" type="text/css" href="/this/iehacks.css" />
+<roundcube:endif />
+<roundcube:if condition="browser:safari" />
+<link rel="stylesheet" type="text/css" href="/this/safari.css" />
+<roundcube:endif />
+</head>
+<body class="noscroll">
+
+<roundcube:include file="/includes/header.html" />
+
+<div id="mainscreen" class="offset">
+
+<roundcube:include file="/includes/settingstabs.html" />
+
+<div id="settings-right">
+
+<div id="sieverules-list" class="uibox listbox">
+<div class="scroller withfooter">
+<roundcube:object name="sieveruleslist" class="listing" cellspacing="0" noheader="true" activeicon="/this/tick.png" inactiveicon="/this/cross.png" />
+<roundcube:object name="sieverulesexamplelist" class="listing" cellspacing="0" noheader="true" />
+</div>
+<div class="boxfooter">
+<roundcube:button command="plugin.sieverules.add" type="link" title="sieverules.newfilter" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" content="+" /><roundcube:button command="plugin.sieverules.delete" type="link" title="delete" class="listbutton delete disabled" classAct="listbutton delete" innerClass="inner" content="-" /><roundcube:if condition="config:sieverules_multiplerules == true || config:sieverules_adveditor == 1 || config:sieverules_adveditor == 2" /><roundcube:button name="sieverulesactions" id="sieverulesactionsmenulink" type="link" title="sieverules.moreactions" class="listbutton groupactions" onclick="UI.show_popup('sieverulesactionsmenu', true, {id: 'sieverulesactionsmenu', obj:$('#sieverulesactionsmenu'), above:1}); return false" innerClass="inner" content="&#9881;" /><roundcube:endif />
+</div>
+</div>
+
+<div id="sieverules-details" class="uibox contentbox">
+<div class="iframebox">
+ <roundcube:object name="sieverulesframe" id="preferences-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" />
+</div>
+<roundcube:object name="message" id="message" class="statusbar" />
+</div>
+
+</div>
+
+</div>
+
+<roundcube:include file="/includes/footer.html" />
+
+<div id="sieverulesactionsmenu" class="popupmenu">
+<ul class="toolbarmenu">
+<roundcube:if condition="config:sieverules_multiplerules == true" />
+<li class="separator_below"><roundcube:button command="plugin.sieverules.ruleset_dialog" type="link" label="sieverules.newruleset" classAct="active" /></li>
+<roundcube:object name="rulelist" type="link" />
+<li class="separator_above"><roundcube:button command="plugin.sieverules.ruleset_dialog" prop="rename_ruleset" type="link" label="sieverules.renameruleset" classAct="active" /></li>
+<li><roundcube:button command="plugin.sieverules.del_ruleset" type="link" label="sieverules.delruleset" classAct="active" /></li>
+<li><roundcube:button command="plugin.sieverules.activate_ruleset" type="link" label="sieverules.activateruleset" classAct="active" /></li>
+<roundcube:endif />
+<roundcube:if condition="config:sieverules_adveditor == 1 || config:sieverules_adveditor == 2" />
+<li<roundcube:exp expression="config:sieverules_multiplerules == true ? ' class=separator_above' : ''" />><roundcube:button command="plugin.sieverules.sieverules_adveditor" prop="1" type="link" label="sieverules.adveditor" classAct="active" /></li>
+<roundcube:endif />
+</ul>
+</div>
+
+<script type="text/javascript">
+/* <![CDATA[ */
+
+$(document).ready(function(){
+ new rcube_splitter({id:'sieverulesviewsplitter', p1: '#sieverules-list', p2: '#sieverules-details', orientation: 'v', relative: true, start: 240}).init();
+
+ if ($('#sieverules-list-examples').length > 0) {
+ var filtersHeight = parseInt($('#sieverules-list').height() - 210);
+ new rcube_splitter({id:'sievefiltersviewsplitter', p1: '#sieverules-list-filters', p2: '#sieverules-list-examples', orientation: 'h', relative: true, start: filtersHeight}).init();
+ }
+});
+
+/* ]]> */
+</script>
+
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/sieverules/skins/larry/tick.png b/plugins/sieverules/skins/larry/tick.png
new file mode 100644
index 000000000..6a26a6a08
--- /dev/null
+++ b/plugins/sieverules/skins/larry/tick.png
Binary files differ