diff options
Diffstat (limited to 'program')
227 files changed, 8413 insertions, 2955 deletions
diff --git a/program/include/bc.php b/program/include/bc.php index a7d7b5ac1..2cb151798 100644 --- a/program/include/bc.php +++ b/program/include/bc.php @@ -22,7 +22,7 @@ /** * Roundcube Webmail deprecated functions * - * @package Core + * @package Webmail * @subpackage Legacy * @author Thomas Bruederli <roundcube@gmail.com> */ diff --git a/program/include/iniset.php b/program/include/iniset.php index f6ad466da..5c3065489 100644 --- a/program/include/iniset.php +++ b/program/include/iniset.php @@ -5,7 +5,7 @@ | program/include/iniset.php | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2008-2013, The Roundcube Dev Team | + | Copyright (C) 2008-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -21,7 +21,7 @@ */ // application constants -define('RCMAIL_VERSION', '1.0-git'); +define('RCMAIL_VERSION', '1.1-git'); define('RCMAIL_START', microtime(true)); if (!defined('INSTALL_PATH')) { @@ -61,7 +61,7 @@ require_once 'Roundcube/bootstrap.php'; spl_autoload_register('rcmail_autoload'); // include composer autoloader (if available) -if (file_exists('vendor/autoload.php')) { +if (@file_exists('vendor/autoload.php')) { require 'vendor/autoload.php'; } diff --git a/program/include/rcmail.php b/program/include/rcmail.php index ef63db9da..7a952cfe3 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -5,8 +5,8 @@ | program/include/rcmail.php | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2008-2013, The Roundcube Dev Team | - | Copyright (C) 2011-2013, Kolab Systems AG | + | Copyright (C) 2008-2014, The Roundcube Dev Team | + | Copyright (C) 2011-2014, Kolab Systems AG | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -25,7 +25,7 @@ * Application class of Roundcube Webmail * implemented as singleton * - * @package Core + * @package Webmail */ class rcmail extends rcube { @@ -139,6 +139,8 @@ class rcmail extends rcube if ($this->user && $this->user->ID) $task = !$task ? 'mail' : $task; + else if (php_sapi_name() == 'cli') + $task = 'cli'; else $task = 'login'; @@ -157,12 +159,7 @@ class rcmail extends rcube */ public function set_user($user) { - if (is_object($user)) { - $this->user = $user; - - // overwrite config with user preferences - $this->config->set_user_prefs((array)$this->user->get_prefs()); - } + parent::set_user($user); $lang = $this->language_prop($this->config->get('language', $_SESSION['language'])); $_SESSION['language'] = $this->user->language = $lang; @@ -431,7 +428,7 @@ class rcmail extends rcube } // add some basic labels to client - $this->output->add_label('loading', 'servererror', 'requesttimedout', 'refreshing'); + $this->output->add_label('loading', 'servererror', 'connerror', 'requesttimedout', 'refreshing'); return $this->output; } @@ -492,32 +489,23 @@ class rcmail extends rcube return false; } - $config = $this->config->all(); - - if (!$host) { - $host = $config['default_host']; - } - - // Validate that selected host is in the list of configured hosts - if (is_array($config['default_host'])) { - $allowed = false; + $default_host = $this->config->get('default_host'); + $default_port = $this->config->get('default_port'); + $username_domain = $this->config->get('username_domain'); + $login_lc = $this->config->get('login_lc', 2); - foreach ($config['default_host'] as $key => $host_allowed) { - if (!is_numeric($key)) { - $host_allowed = $key; - } - if ($host == $host_allowed) { - $allowed = true; - break; - } + // host is validated in rcmail::autoselect_host(), so here + // we'll only handle unset host (if possible) + if (!$host && !empty($default_host)) { + if (is_array($default_host)) { + list($key, $val) = each($default_host); + $host = is_numeric($key) ? $val : $key; } - - if (!$allowed) { - $host = null; + else { + $host = $default_host; } - } - else if (!empty($config['default_host']) && $host != rcube_utils::parse_host($config['default_host'])) { - $host = null; + + $host = rcube_utils::parse_host($host); } if (!$host) { @@ -533,23 +521,23 @@ class rcmail extends rcube if (!empty($a_host['port'])) $port = $a_host['port']; - else if ($ssl && $ssl != 'tls' && (!$config['default_port'] || $config['default_port'] == 143)) + else if ($ssl && $ssl != 'tls' && (!$default_port || $default_port == 143)) $port = 993; } if (!$port) { - $port = $config['default_port']; + $port = $default_port; } // Check if we need to add/force domain to username - if (!empty($config['username_domain'])) { - $domain = is_array($config['username_domain']) ? $config['username_domain'][$host] : $config['username_domain']; + if (!empty($username_domain)) { + $domain = is_array($username_domain) ? $username_domain[$host] : $username_domain; if ($domain = rcube_utils::parse_host((string)$domain, $host)) { $pos = strpos($username, '@'); // force configured domains - if (!empty($config['username_domain_forced']) && $pos !== false) { + if ($pos !== false && $this->config->get('username_domain_forced')) { $username = substr($username, 0, $pos) . '@' . $domain; } // just add domain if not specified @@ -559,14 +547,10 @@ class rcmail extends rcube } } - if (!isset($config['login_lc'])) { - $config['login_lc'] = 2; // default - } - // Convert username to lowercase. If storage backend // is case-insensitive we need to store always the same username (#1487113) - if ($config['login_lc']) { - if ($config['login_lc'] == 2 || $config['login_lc'] === true) { + if ($login_lc) { + if ($login_lc == 2 || $login_lc === true) { $username = mb_strtolower($username); } else if (strpos($username, '@')) { @@ -604,7 +588,7 @@ class rcmail extends rcube $user->touch(); } // create new system user - else if ($config['auto_create_user']) { + else if ($this->config->get('auto_create_user')) { if ($created = rcube_user::create($username, $host)) { $user = $created; } @@ -634,14 +618,6 @@ class rcmail extends rcube $this->set_user($user); $this->set_storage_prop(); - // fix some old settings according to namespace prefix - $this->fix_namespace_settings($user); - - // create default folders on first login - if ($config['create_default_folders'] && (!empty($created) || empty($user->data['last_login']))) { - $storage->create_default_folders(); - } - // set session vars $_SESSION['user_id'] = $user->ID; $_SESSION['username'] = $user->data['username']; @@ -655,7 +631,13 @@ class rcmail extends rcube $_SESSION['timezone'] = rcube_utils::get_input_value('_timezone', rcube_utils::INPUT_GPC); } - // force reloading complete list of subscribed mailboxes + // fix some old settings according to namespace prefix + $this->fix_namespace_settings($user); + + // set/create special folders + $this->set_special_folders(); + + // clear all mailboxes related cache(s) $storage->clear_cache('mailboxes', true); return true; @@ -846,7 +828,10 @@ class rcmail extends rcube } // write performance stats to logs/console - if ($this->config->get('devel_mode')) { + if ($this->config->get('devel_mode') || $this->config->get('performance_stats')) { + // make sure logged numbers use unified format + setlocale(LC_NUMERIC, 'en_US.utf8', 'en_US.UTF-8', 'en_US', 'C'); + if (function_exists('memory_get_usage')) $mem = $this->show_bytes(memory_get_usage()); if (function_exists('memory_get_peak_usage')) @@ -933,14 +918,6 @@ class rcmail extends rcube } } - if (!empty($prefs['default_folders'])) { - foreach ($prefs['default_folders'] as $idx => $name) { - if ($name != 'INBOX' && !preg_match($regexp, $name)) { - $prefs['default_folders'][$idx] = $prefix.$name; - } - } - } - if (!empty($prefs['search_mods'])) { $folders = array(); foreach ($prefs['search_mods'] as $idx => $value) { @@ -1168,11 +1145,11 @@ class rcmail extends rcube $week_limit = mktime(0, 0, 0, $now_date['mon'], $now_date['mday']-6, $now_date['year']); $pretty_date = $this->config->get('prettydate'); - if ($pretty_date && $timestamp > $today_limit && $timestamp < $now) { + if ($pretty_date && $timestamp > $today_limit && $timestamp <= $now) { $format = $this->config->get('date_today', $this->config->get('time_format', 'H:i')); $today = true; } - else if ($pretty_date && $timestamp > $week_limit && $timestamp < $now) { + else if ($pretty_date && $timestamp > $week_limit && $timestamp <= $now) { $format = $this->config->get('date_short', 'D H:i'); } else { @@ -1361,12 +1338,31 @@ class rcmail extends rcube $delimiter = $storage->get_hierarchy_delimiter(); - foreach ($list as $folder) { - if (empty($p['exceptions']) || !in_array($folder, $p['exceptions'])) { - $this->build_folder_tree($a_mailboxes, $folder, $delimiter); + if (!empty($p['exceptions'])) { + $list = array_diff($list, (array) $p['exceptions']); + } + + if (!empty($p['additional'])) { + foreach ($p['additional'] as $add_folder) { + $add_items = explode($delimiter, $add_folder); + $folder = ''; + while (count($add_items)) { + $folder .= array_shift($add_items); + + // @TODO: sorting + if (!in_array($folder, $list)) { + $list[] = $folder; + } + + $folder .= $delimiter; + } } } + foreach ($list as $folder) { + $this->build_folder_tree($a_mailboxes, $folder, $delimiter); + } + $select = new html_select($p); if ($p['noselection']) { @@ -1600,10 +1596,14 @@ class rcmail extends rcube * * @return string Localized folder name in UTF-8 encoding */ - public function localize_foldername($name, $with_path = true) + public function localize_foldername($name, $with_path = false) { $realnames = $this->config->get('show_real_foldernames'); + if (!$realnames && ($folder_class = $this->folder_classname($name))) { + return $this->gettext($folder_class); + } + // try to localize path of the folder if ($with_path && !$realnames) { $storage = $this->get_storage(); @@ -1612,7 +1612,7 @@ class rcmail extends rcube $count = count($path); if ($count > 1) { - for ($i = 0; $i < $count; $i++) { + for ($i = 1; $i < $count; $i++) { $folder = implode($delimiter, array_slice($path, 0, -$i)); if ($folder_class = $this->folder_classname($folder)) { $name = implode($delimiter, array_slice($path, $count - $i)); @@ -1622,10 +1622,6 @@ class rcmail extends rcube } } - if (!$realnames && ($folder_class = $this->folder_classname($name))) { - return $this->gettext($folder_class); - } - return rcube_charset::convert($name, 'UTF7-IMAP'); } @@ -1633,14 +1629,13 @@ class rcmail extends rcube public function localize_folderpath($path) { $protect_folders = $this->config->get('protect_default_folders'); - $default_folders = (array) $this->config->get('default_folders'); $delimiter = $this->storage->get_hierarchy_delimiter(); $path = explode($delimiter, $path); $result = array(); foreach ($path as $idx => $dir) { $directory = implode($delimiter, array_slice($path, 0, $idx+1)); - if ($protect_folders && in_array($directory, $default_folders)) { + if ($protect_folders && $this->storage->is_special_folder($directory)) { unset($result); $result[] = $this->localize_foldername($directory); } @@ -1847,27 +1842,52 @@ class rcmail extends rcube */ public function upload_progress() { - $prefix = ini_get('apc.rfc1867_prefix'); $params = array( 'action' => $this->action, - 'name' => rcube_utils::get_input_value('_progress', rcube_utils::INPUT_GET), + 'name' => rcube_utils::get_input_value('_progress', rcube_utils::INPUT_GET), ); - if (function_exists('apc_fetch')) { + if (function_exists('uploadprogress_get_info')) { + $status = uploadprogress_get_info($params['name']); + + if (!empty($status)) { + $params['current'] = $status['bytes_uploaded']; + $params['total'] = $status['bytes_total']; + } + } + + if (!isset($status) && filter_var(ini_get('apc.rfc1867'), FILTER_VALIDATE_BOOLEAN) + && ini_get('apc.rfc1867_name') + ) { + $prefix = ini_get('apc.rfc1867_prefix'); $status = apc_fetch($prefix . $params['name']); if (!empty($status)) { - $status['percent'] = round($status['current']/$status['total']*100); - $params = array_merge($status, $params); + $params['current'] = $status['current']; + $params['total'] = $status['total']; } } - if (isset($params['percent'])) - $params['text'] = $this->gettext(array('name' => 'uploadprogress', 'vars' => array( - 'percent' => $params['percent'] . '%', - 'current' => $this->show_bytes($params['current']), - 'total' => $this->show_bytes($params['total']) - ))); + if (!isset($status) && filter_var(ini_get('session.upload_progress.enabled'), FILTER_VALIDATE_BOOLEAN) + && ini_get('session.upload_progress.name') + ) { + $key = ini_get('session.upload_progress.prefix') . $params['name']; + + $params['total'] = $_SESSION[$key]['content_length']; + $params['current'] = $_SESSION[$key]['bytes_processed']; + } + + if (!empty($params['total'])) { + $params['percent'] = round($status['current']/$status['total']*100); + $params['text'] = $this->gettext(array( + 'name' => 'uploadprogress', + 'vars' => array( + 'percent' => $params['percent'] . '%', + 'current' => $this->show_bytes($params['current']), + 'total' => $this->show_bytes($params['total']) + ) + )); + } $this->output->command('upload_progress_update', $params); $this->output->send(); @@ -1879,9 +1899,18 @@ class rcmail extends rcube public function upload_init() { // Enable upload progress bar - $rfc1867 = filter_var(ini_get('apc.rfc1867'), FILTER_VALIDATE_BOOLEAN); - if ($rfc1867 && ($seconds = $this->config->get('upload_progress'))) { - if ($field_name = ini_get('apc.rfc1867_name')) { + if ($seconds = $this->config->get('upload_progress')) { + if (function_exists('uploadprogress_get_info')) { + $field_name = 'UPLOAD_IDENTIFIER'; + } + if (!$field_name && filter_var(ini_get('apc.rfc1867'), FILTER_VALIDATE_BOOLEAN)) { + $field_name = ini_get('apc.rfc1867_name'); + } + if (!$field_name && filter_var(ini_get('session.upload_progress.enabled'), FILTER_VALIDATE_BOOLEAN)) { + $field_name = ini_get('session.upload_progress.name'); + } + + if ($field_name) { $this->output->set_env('upload_progress_name', $field_name); $this->output->set_env('upload_progress_time', (int) $seconds); } @@ -2012,6 +2041,55 @@ class rcmail extends rcube return $size; } + /** + * Returns message UID(s) and IMAP folder(s) from GET/POST data + * + * @param string UID value to decode + * @param string Default mailbox value (if not encoded in UIDs) + * @return array List of message UIDs per folder + */ + public static function get_uids($uids = null, $mbox = null) + { + // message UID (or comma-separated list of IDs) is provided in + // the form of <ID>-<MBOX>[,<ID>-<MBOX>]* + + $_uid = $uids ?: rcube_utils::get_input_value('_uid', RCUBE_INPUT_GPC); + $_mbox = $mbox ?: (string)rcube_utils::get_input_value('_mbox', RCUBE_INPUT_GPC); + + // already a hash array + if (is_array($_uid) && !isset($_uid[0])) { + return $_uid; + } + + $result = array(); + + // special case: * + if ($_uid == '*' && is_object($_SESSION['search'][1]) && $_SESSION['search'][1]->multi) { + // extract the full list of UIDs per folder from the search set + foreach ($_SESSION['search'][1]->sets as $subset) { + $mbox = $subset->get_parameters('MAILBOX'); + $result[$mbox] = $subset->get(); + } + } + else { + if (is_string($_uid)) + $_uid = explode(',', $_uid); + + // create a per-folder UIDs array + foreach ((array)$_uid as $uid) { + list($uid, $mbox) = explode('-', $uid, 2); + if (!strlen($mbox)) + $mbox = $_mbox; + if ($uid == '*') + $result[$mbox] = $uid; + else + $result[$mbox][] = $uid; + } + } + + return $result; + } + /************************************************************************ ********* Deprecated methods (to be removed) ********* diff --git a/program/include/rcmail_html_page.php b/program/include/rcmail_html_page.php index d5610ab47..604d756e7 100644 --- a/program/include/rcmail_html_page.php +++ b/program/include/rcmail_html_page.php @@ -23,7 +23,7 @@ /** * Class to create an empty HTML page with some default styles * - * @package Core + * @package Webmail * @subpackage View */ class rcmail_html_page extends rcmail_output_html diff --git a/program/include/rcmail_install.php b/program/include/rcmail_install.php new file mode 100644 index 000000000..eec21ec7e --- /dev/null +++ b/program/include/rcmail_install.php @@ -0,0 +1,776 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | rcmail_install.php | + | | + | This file is part of the Roundcube Webmail package | + | Copyright (C) 2008-2014, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + +-----------------------------------------------------------------------+ +*/ + + +/** + * Class to control the installation process of the Roundcube Webmail package + * + * @category Install + * @package Roundcube + * @author Thomas Bruederli + */ +class rcmail_install +{ + var $step; + var $is_post = false; + var $failures = 0; + var $config = array(); + var $configured = false; + var $legacy_config = false; + var $last_error = null; + var $email_pattern = '([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9]([a-z0-9\-][.]?)*[a-z0-9])'; + var $bool_config_props = array(); + + var $local_config = array('db_dsnw', 'default_host', 'support_url', 'des_key', 'plugins'); + var $obsolete_config = array('db_backend', 'db_max_length', 'double_auth'); + var $replaced_config = array( + 'skin_path' => 'skin', + 'locale_string' => 'language', + 'multiple_identities' => 'identities_level', + 'addrbook_show_images' => 'show_images', + 'imap_root' => 'imap_ns_personal', + 'pagesize' => 'mail_pagesize', + 'top_posting' => 'reply_mode', + 'keep_alive' => 'refresh_interval', + 'min_keep_alive' => 'min_refresh_interval', + ); + + // list of supported database drivers + var $supported_dbs = array( + 'MySQL' => 'pdo_mysql', + 'PostgreSQL' => 'pdo_pgsql', + 'SQLite' => 'pdo_sqlite', + 'SQLite (v2)' => 'pdo_sqlite2', + 'SQL Server (SQLSRV)' => 'pdo_sqlsrv', + 'SQL Server (DBLIB)' => 'pdo_dblib', + ); + + + /** + * Constructor + */ + function __construct() + { + $this->step = intval($_REQUEST['_step']); + $this->is_post = $_SERVER['REQUEST_METHOD'] == 'POST'; + } + + /** + * Singleton getter + */ + static function get_instance() + { + static $inst; + + if (!$inst) + $inst = new rcmail_install(); + + return $inst; + } + + /** + * Read the local config files and store properties + */ + function load_config() + { + // defaults + if ($config = $this->load_config_file(RCUBE_CONFIG_DIR . 'defaults.inc.php')) { + $this->config = (array) $config; + $this->defaults = $this->config; + } + + $config = null; + + // config + if ($config = $this->load_config_file(RCUBE_CONFIG_DIR . 'config.inc.php')) { + $this->config = array_merge($this->config, $config); + } + else { + if ($config = $this->load_config_file(RCUBE_CONFIG_DIR . 'main.inc.php')) { + $this->config = array_merge($this->config, $config); + $this->legacy_config = true; + } + if ($config = $this->load_config_file(RCUBE_CONFIG_DIR . 'db.inc.php')) { + $this->config = array_merge($this->config, $config); + $this->legacy_config = true; + } + } + + $this->configured = !empty($config); + } + + /** + * Read the default config file and store properties + */ + public function load_config_file($file) + { + if (is_readable($file)) { + include $file; + + // read comments from config file + if (function_exists('token_get_all')) { + $tokens = token_get_all(file_get_contents($file)); + $in_config = false; + $buffer = ''; + for ($i=0; $i < count($tokens); $i++) { + $token = $tokens[$i]; + if ($token[0] == T_VARIABLE && $token[1] == '$config' || $token[1] == '$rcmail_config') { + $in_config = true; + if ($buffer && $tokens[$i+1] == '[' && $tokens[$i+2][0] == T_CONSTANT_ENCAPSED_STRING) { + $propname = trim($tokens[$i+2][1], "'\""); + $this->comments[$propname] = $buffer; + $buffer = ''; + $i += 3; + } + } + else if ($in_config && $token[0] == T_COMMENT) { + $buffer .= strtr($token[1], array('\n' => "\n")); + } + } + } + + // deprecated name of config variable + if (is_array($rcmail_config)) { + return $rcmail_config; + } + + return $config; + } + } + + /** + * Getter for a certain config property + * + * @param string Property name + * @param string Default value + * @return string The property value + */ + function getprop($name, $default = '') + { + $value = $this->config[$name]; + + if ($name == 'des_key' && !$this->configured && !isset($_REQUEST["_$name"])) + $value = self::random_key(24); + + return $value !== null && $value !== '' ? $value : $default; + } + + + /** + * Create configuration file that contains parameters + * that differ from default values. + * + * @return string The complete config file content + */ + function create_config() + { + $config = array(); + + foreach ($this->config as $prop => $default) { + $is_default = !isset($_POST["_$prop"]); + $value = !$is_default || $this->bool_config_props[$prop] ? $_POST["_$prop"] : $default; + + // always disable installer + if ($prop == 'enable_installer') + $value = false; + + // reset useragent to default (keeps version up-to-date) + if ($prop == 'useragent' && stripos($value, 'Roundcube Webmail/') !== false) + $value = $this->defaults[$prop]; + + // generate new encryption key, never use the default value + if ($prop == 'des_key' && $value == $this->defaults[$prop]) + $value = $this->random_key(24); + + // convert some form data + if ($prop == 'debug_level' && !$is_default) { + if (is_array($value)) { + $val = 0; + foreach ($value as $dbgval) + $val += intval($dbgval); + $value = $val; + } + } + else if ($prop == 'db_dsnw' && !empty($_POST['_dbtype'])) { + if ($_POST['_dbtype'] == 'sqlite') + $value = sprintf('%s://%s?mode=0646', $_POST['_dbtype'], $_POST['_dbname']{0} == '/' ? '/' . $_POST['_dbname'] : $_POST['_dbname']); + else if ($_POST['_dbtype']) + $value = sprintf('%s://%s:%s@%s/%s', $_POST['_dbtype'], + rawurlencode($_POST['_dbuser']), rawurlencode($_POST['_dbpass']), $_POST['_dbhost'], $_POST['_dbname']); + } + else if ($prop == 'smtp_auth_type' && $value == '0') { + $value = ''; + } + else if ($prop == 'default_host' && is_array($value)) { + $value = self::_clean_array($value); + if (count($value) <= 1) + $value = $value[0]; + } + else if ($prop == 'mail_pagesize' || $prop == 'addressbook_pagesize') { + $value = max(2, intval($value)); + } + else if ($prop == 'smtp_user' && !empty($_POST['_smtp_user_u'])) { + $value = '%u'; + } + else if ($prop == 'smtp_pass' && !empty($_POST['_smtp_user_u'])) { + $value = '%p'; + } + else if (is_bool($default)) { + $value = (bool)$value; + } + else if (is_numeric($value)) { + $value = intval($value); + } + + // skip this property + if (($value == $this->defaults[$prop]) && !in_array($prop, $this->local_config) + || in_array($prop, array_merge($this->obsolete_config, array_keys($this->replaced_config))) + || preg_match('/^db_(table|sequence)_/', $prop)) { + continue; + } + + // save change + $this->config[$prop] = $value; + $config[$prop] = $value; + } + + $out = "<?php\n\n"; + $out .= "/* Local configuration for Roundcube Webmail */\n\n"; + foreach ($config as $prop => $value) { + // copy option descriptions from existing config or defaults.inc.php + $out .= $this->comments[$prop]; + $out .= "\$config['$prop'] = " . self::_dump_var($value, $prop) . ";\n\n"; + } + + return $out; + } + + + /** + * save generated config file in RCUBE_CONFIG_DIR + * + * @return boolean True if the file was saved successfully, false if not + */ + function save_configfile($config) + { + if (is_writable(RCUBE_CONFIG_DIR)) { + return file_put_contents(RCUBE_CONFIG_DIR . 'config.inc.php', $config); + } + + return false; + } + + /** + * Check the current configuration for missing properties + * and deprecated or obsolete settings + * + * @return array List with problems detected + */ + function check_config() + { + $this->load_config(); + + if (!$this->configured) { + return null; + } + + $out = $seen = array(); + + // iterate over the current configuration + foreach ($this->config as $prop => $value) { + if ($replacement = $this->replaced_config[$prop]) { + $out['replaced'][] = array('prop' => $prop, 'replacement' => $replacement); + $seen[$replacement] = true; + } + else if (!$seen[$prop] && in_array($prop, $this->obsolete_config)) { + $out['obsolete'][] = array('prop' => $prop); + $seen[$prop] = true; + } + } + + // the old default mime_magic reference is obsolete + if ($this->config['mime_magic'] == '/usr/share/misc/magic') { + $out['obsolete'][] = array('prop' => 'mime_magic', 'explain' => "Set value to null in order to use system default"); + } + + // check config dependencies and contradictions + if ($this->config['enable_spellcheck'] && $this->config['spellcheck_engine'] == 'pspell') { + if (!extension_loaded('pspell')) { + $out['dependencies'][] = array('prop' => 'spellcheck_engine', + 'explain' => 'This requires the <tt>pspell</tt> extension which could not be loaded.'); + } + else if (!empty($this->config['spellcheck_languages'])) { + foreach ($this->config['spellcheck_languages'] as $lang => $descr) + if (!@pspell_new($lang)) + $out['dependencies'][] = array('prop' => 'spellcheck_languages', + 'explain' => "You are missing pspell support for language $lang ($descr)"); + } + } + + if ($this->config['log_driver'] == 'syslog') { + if (!function_exists('openlog')) { + $out['dependencies'][] = array('prop' => 'log_driver', + 'explain' => 'This requires the <tt>syslog</tt> extension which could not be loaded.'); + } + if (empty($this->config['syslog_id'])) { + $out['dependencies'][] = array('prop' => 'syslog_id', + 'explain' => 'Using <tt>syslog</tt> for logging requires a syslog ID to be configured'); + } + } + + // check ldap_public sources having global_search enabled + if (is_array($this->config['ldap_public']) && !is_array($this->config['autocomplete_addressbooks'])) { + foreach ($this->config['ldap_public'] as $ldap_public) { + if ($ldap_public['global_search']) { + $out['replaced'][] = array('prop' => 'ldap_public::global_search', 'replacement' => 'autocomplete_addressbooks'); + break; + } + } + } + + return $out; + } + + + /** + * Merge the current configuration with the defaults + * and copy replaced values to the new options. + */ + function merge_config() + { + $current = $this->config; + $this->config = array(); + + foreach ($this->replaced_config as $prop => $replacement) { + if (isset($current[$prop])) { + if ($prop == 'skin_path') + $this->config[$replacement] = preg_replace('#skins/(\w+)/?$#', '\\1', $current[$prop]); + else if ($prop == 'multiple_identities') + $this->config[$replacement] = $current[$prop] ? 2 : 0; + else + $this->config[$replacement] = $current[$prop]; + } + unset($current[$prop]); + } + + foreach ($this->obsolete_config as $prop) { + unset($current[$prop]); + } + + // add all ldap_public sources having global_search enabled to autocomplete_addressbooks + if (is_array($current['ldap_public'])) { + foreach ($current['ldap_public'] as $key => $ldap_public) { + if ($ldap_public['global_search']) { + $this->config['autocomplete_addressbooks'][] = $key; + unset($current['ldap_public'][$key]['global_search']); + } + } + } + + $this->config = array_merge($this->config, $current); + + foreach (array_keys((array)$current['ldap_public']) as $key) { + $this->config['ldap_public'][$key] = $current['ldap_public'][$key]; + } + } + + /** + * Compare the local database schema with the reference schema + * required for this version of Roundcube + * + * @param rcube_db Database object + * + * @return boolean True if the schema is up-to-date, false if not or an error occurred + */ + function db_schema_check($DB) + { + if (!$this->configured) + return false; + + // read reference schema from mysql.initial.sql + $db_schema = $this->db_read_schema(INSTALL_PATH . 'SQL/mysql.initial.sql'); + $errors = array(); + + // check list of tables + $existing_tables = $DB->list_tables(); + + foreach ($db_schema as $table => $cols) { + $table = $this->config['db_prefix'] . $table; + if (!in_array($table, $existing_tables)) { + $errors[] = "Missing table '".$table."'"; + } + else { // compare cols + $db_cols = $DB->list_cols($table); + $diff = array_diff(array_keys($cols), $db_cols); + if (!empty($diff)) + $errors[] = "Missing columns in table '$table': " . join(',', $diff); + } + } + + return !empty($errors) ? $errors : false; + } + + /** + * Utility function to read database schema from an .sql file + */ + private function db_read_schema($schemafile) + { + $lines = file($schemafile); + $table_block = false; + $schema = array(); + foreach ($lines as $line) { + if (preg_match('/^\s*create table `?([a-z0-9_]+)`?/i', $line, $m)) { + $table_block = $m[1]; + } + else if ($table_block && preg_match('/^\s*`?([a-z0-9_-]+)`?\s+([a-z]+)/', $line, $m)) { + $col = $m[1]; + if (!in_array(strtoupper($col), array('PRIMARY','KEY','INDEX','UNIQUE','CONSTRAINT','REFERENCES','FOREIGN'))) { + $schema[$table_block][$col] = $m[2]; + } + } + } + + return $schema; + } + + /** + * Try to detect some file's mimetypes to test the correct behavior of fileinfo + */ + function check_mime_detection() + { + $files = array( + 'skins/larry/images/roundcube_logo.png' => 'image/png', + 'program/resources/blank.tif' => 'image/tiff', + 'program/resources/blocked.gif' => 'image/gif', + 'skins/larry/README' => 'text/plain', + ); + + $errors = array(); + foreach ($files as $path => $expected) { + $mimetype = rcube_mime::file_content_type(INSTALL_PATH . $path, basename($path)); + if ($mimetype != $expected) { + $errors[] = array($path, $mimetype, $expected); + } + } + + return $errors; + } + + /** + * Check the correct configuration of the 'mime_types' mapping option + */ + function check_mime_extensions() + { + $types = array( + 'application/zip' => 'zip', + 'application/x-tar' => 'tar', + 'application/java-archive' => 'jar', + 'image/gif' => 'gif', + 'image/svg+xml' => 'svg', + ); + + $errors = array(); + foreach ($types as $mimetype => $expected) { + $ext = rcube_mime::get_mime_extensions($mimetype); + if ($ext[0] != $expected) { + $errors[] = array($mimetype, $ext, $expected); + } + } + + return $errors; + } + + /** + * Getter for the last error message + * + * @return string Error message or null if none exists + */ + function get_error() + { + return $this->last_error['message']; + } + + + /** + * Return a list with all imap hosts configured + * + * @return array Clean list with imap hosts + */ + function get_hostlist() + { + $default_hosts = (array)$this->getprop('default_host'); + $out = array(); + + foreach ($default_hosts as $key => $name) { + if (!empty($name)) + $out[] = rcube_parse_host(is_numeric($key) ? $name : $key); + } + + return $out; + } + + /** + * Create a HTML dropdown to select a previous version of Roundcube + */ + function versions_select($attrib = array()) + { + $select = new html_select($attrib); + $select->add(array( + '0.1-stable', '0.1.1', + '0.2-alpha', '0.2-beta', '0.2-stable', + '0.3-stable', '0.3.1', + '0.4-beta', '0.4.2', + '0.5-beta', '0.5', '0.5.1', '0.5.2', '0.5.3', '0.5.4', + '0.6-beta', '0.6', + '0.7-beta', '0.7', '0.7.1', '0.7.2', '0.7.3', '0.7.4', + '0.8-beta', '0.8-rc', '0.8.0', '0.8.1', '0.8.2', '0.8.3', '0.8.4', '0.8.5', '0.8.6', + '0.9-beta', '0.9-rc', '0.9-rc2', + // Note: Do not add newer versions here + )); + return $select; + } + + /** + * Return a list with available subfolders of the skin directory + */ + function list_skins() + { + $skins = array(); + $skindir = INSTALL_PATH . 'skins/'; + foreach (glob($skindir . '*') as $path) { + if (is_dir($path) && is_readable($path)) { + $skins[] = substr($path, strlen($skindir)); + } + } + return $skins; + } + + /** + * Display OK status + * + * @param string Test name + * @param string Confirm message + */ + function pass($name, $message = '') + { + echo Q($name) . ': <span class="success">OK</span>'; + $this->_showhint($message); + } + + + /** + * Display an error status and increase failure count + * + * @param string Test name + * @param string Error message + * @param string URL for details + * @param bool Do not count this failure + */ + function fail($name, $message = '', $url = '', $optional=false) + { + if (!$optional) { + $this->failures++; + } + + echo Q($name) . ': <span class="fail">NOT OK</span>'; + $this->_showhint($message, $url); + } + + + /** + * Display an error status for optional settings/features + * + * @param string Test name + * @param string Error message + * @param string URL for details + */ + function optfail($name, $message = '', $url = '') + { + echo Q($name) . ': <span class="na">NOT OK</span>'; + $this->_showhint($message, $url); + } + + + /** + * Display warning status + * + * @param string Test name + * @param string Warning message + * @param string URL for details + */ + function na($name, $message = '', $url = '') + { + echo Q($name) . ': <span class="na">NOT AVAILABLE</span>'; + $this->_showhint($message, $url); + } + + + function _showhint($message, $url = '') + { + $hint = Q($message); + + if ($url) + $hint .= ($hint ? '; ' : '') . 'See <a href="' . Q($url) . '" target="_blank">' . Q($url) . '</a>'; + + if ($hint) + echo '<span class="indent">(' . $hint . ')</span>'; + } + + + static function _clean_array($arr) + { + $out = array(); + + foreach (array_unique($arr) as $k => $val) { + if (!empty($val)) { + if (is_numeric($k)) + $out[] = $val; + else + $out[$k] = $val; + } + } + + return $out; + } + + + static function _dump_var($var, $name=null) + { + // special values + switch ($name) { + case 'syslog_facility': + $list = array(32 => 'LOG_AUTH', 80 => 'LOG_AUTHPRIV', 72 => ' LOG_CRON', + 24 => 'LOG_DAEMON', 0 => 'LOG_KERN', 128 => 'LOG_LOCAL0', + 136 => 'LOG_LOCAL1', 144 => 'LOG_LOCAL2', 152 => 'LOG_LOCAL3', + 160 => 'LOG_LOCAL4', 168 => 'LOG_LOCAL5', 176 => 'LOG_LOCAL6', + 184 => 'LOG_LOCAL7', 48 => 'LOG_LPR', 16 => 'LOG_MAIL', + 56 => 'LOG_NEWS', 40 => 'LOG_SYSLOG', 8 => 'LOG_USER', 64 => 'LOG_UUCP'); + if ($val = $list[$var]) + return $val; + break; + + case 'mail_header_delimiter': + $var = str_replace(array("\r", "\n"), array('\r', '\n'), $var); + return '"' . $var. '"'; + break; +/* + // RCMAIL_VERSION is undefined here + case 'useragent': + if (preg_match('|^(.*)/('.preg_quote(RCMAIL_VERSION, '|').')$|i', $var, $m)) { + return '"' . addcslashes($var, '"') . '/" . RCMAIL_VERSION'; + } + break; +*/ + } + + if (is_array($var)) { + if (empty($var)) { + return 'array()'; + } + else { // check if all keys are numeric + $isnum = true; + foreach (array_keys($var) as $key) { + if (!is_numeric($key)) { + $isnum = false; + break; + } + } + + if ($isnum) + return 'array(' . join(', ', array_map(array('rcmail_install', '_dump_var'), $var)) . ')'; + } + } + + return var_export($var, true); + } + + + /** + * Initialize the database with the according schema + * + * @param object rcube_db Database connection + * @return boolen True on success, False on error + */ + function init_db($DB) + { + $engine = $DB->db_provider; + + // read schema file from /SQL/* + $fname = INSTALL_PATH . "SQL/$engine.initial.sql"; + if ($sql = @file_get_contents($fname)) { + $DB->set_option('table_prefix', $this->config['db_prefix']); + $DB->exec_script($sql); + } + else { + $this->fail('DB Schema', "Cannot read the schema file: $fname"); + return false; + } + + if ($err = $this->get_error()) { + $this->fail('DB Schema', "Error creating database schema: $err"); + return false; + } + + return true; + } + + + /** + * Update database schema + * + * @param string Version to update from + * + * @return boolen True on success, False on error + */ + function update_db($version) + { + system(INSTALL_PATH . "bin/updatedb.sh --package=roundcube" + . " --version=" . escapeshellarg($version) + . " --dir=" . INSTALL_PATH . "SQL" + . " 2>&1", $result); + + return !$result; + } + + + /** + * Handler for Roundcube errors + */ + function raise_error($p) + { + $this->last_error = $p; + } + + + /** + * Generarte a ramdom string to be used as encryption key + * + * @param int Key length + * @return string The generated random string + * @static + */ + function random_key($length) + { + $alpha = 'ABCDEFGHIJKLMNOPQERSTUVXYZabcdefghijklmnopqrtsuvwxyz0123456789+*%&?!$-_='; + $out = ''; + + for ($i=0; $i < $length; $i++) + $out .= $alpha{rand(0, strlen($alpha)-1)}; + + return $out; + } + +} + diff --git a/program/include/rcmail_output.php b/program/include/rcmail_output.php index 36512ad48..0f7aaf966 100644 --- a/program/include/rcmail_output.php +++ b/program/include/rcmail_output.php @@ -22,7 +22,7 @@ /** * Class for output generation * - * @package Core + * @package Webmail * @subpackage View */ abstract class rcmail_output extends rcube_output diff --git a/program/include/rcmail_output_html.php b/program/include/rcmail_output_html.php index 4df755985..43d73a6b4 100644 --- a/program/include/rcmail_output_html.php +++ b/program/include/rcmail_output_html.php @@ -5,7 +5,7 @@ | program/include/rcmail_output_html.php | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2006-2013, The Roundcube Dev Team | + | Copyright (C) 2006-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -23,23 +23,23 @@ /** * Class to create HTML page output using a skin template * - * @package Core + * @package Webmail * @subpackage View */ class rcmail_output_html extends rcmail_output { public $type = 'html'; - protected $message = null; - protected $js_env = array(); - protected $js_labels = array(); - protected $js_commands = array(); - protected $skin_paths = array(); + protected $message; protected $template_name; + protected $js_env = array(); + protected $js_labels = array(); + protected $js_commands = array(); + protected $skin_paths = array(); protected $scripts_path = ''; protected $script_files = array(); - protected $css_files = array(); - protected $scripts = array(); + protected $css_files = array(); + protected $scripts = array(); protected $default_template = "<html>\n<head><title></title></head>\n<body></body>\n</html>"; protected $header = ''; protected $footer = ''; @@ -58,8 +58,6 @@ class rcmail_output_html extends rcmail_output /** * Constructor - * - * @todo Replace $this->config with the real rcube_config object */ public function __construct($task = null, $framed = false) { @@ -67,10 +65,10 @@ class rcmail_output_html extends rcmail_output $this->devel_mode = $this->config->get('devel_mode'); - //$this->framed = $framed; $this->set_env('task', $task); $this->set_env('x_frame_options', $this->config->get('x_frame_options', 'sameorigin')); $this->set_env('standard_windows', (bool) $this->config->get('standard_windows')); + $this->set_env('locale', $_SESSION['language']); // add cookie info $this->set_env('cookie_domain', ini_get('session.cookie_domain')); @@ -84,10 +82,31 @@ class rcmail_output_html extends rcmail_output if (!empty($_REQUEST['_extwin'])) $this->set_env('extwin', 1); - if ($this->framed || !empty($_REQUEST['_framed'])) + if ($this->framed || $framed) $this->set_env('framed', 1); + $lic = <<<EOF +/* + @licstart The following is the entire license notice for the + JavaScript code in this page. + + Copyright (C) 2005-2014 The Roundcube Dev Team + + The JavaScript code in this page is free software: you can redistribute + it and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + The code is distributed WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU GPL for more details. + + @licend The above is the entire license notice + for the JavaScript code in this page. +*/ +EOF; // add common javascripts + $this->add_script($lic, 'head_top'); $this->add_script('var '.self::JS_OBJECT_NAME.' = new rcube_webmail();', 'head_top'); // don't wait for page onload. Call init at the bottom of the page (delayed) @@ -188,6 +207,14 @@ class rcmail_output_html extends rcmail_output // read meta file and check for dependecies $meta = @file_get_contents(RCUBE_INSTALL_PATH . $skin_path . '/meta.json'); $meta = @json_decode($meta, true); + + $meta['path'] = $skin_path; + $skin_id = end(explode('/', $skin_path)); + if (!$meta['name']) { + $meta['name'] = $skin_id; + } + $this->skins[$skin_id] = $meta; + if ($meta['extends']) { $path = RCUBE_INSTALL_PATH . 'skins/'; if (is_dir($path . $meta['extends']) && is_readable($path . $meta['extends'])) { @@ -227,8 +254,9 @@ class rcmail_output_html extends rcmail_output public function get_skin_file($file, &$skin_path = null, $add_path = null) { $skin_paths = $this->skin_paths; - if ($add_path) + if ($add_path) { array_unshift($skin_paths, $add_path); + } foreach ($skin_paths as $skin_path) { $path = realpath($skin_path . $file); @@ -262,9 +290,9 @@ class rcmail_output_html extends rcmail_output { $cmd = func_get_args(); if (strpos($cmd[0], 'plugin.') !== false) - $this->js_commands[] = array('triggerEvent', $cmd[0], $cmd[1]); + $this->js_commands[] = array('triggerEvent', $cmd[0], $cmd[1]); else - $this->js_commands[] = $cmd; + $this->js_commands[] = $cmd; } /** @@ -274,7 +302,7 @@ class rcmail_output_html extends rcmail_output { $args = func_get_args(); if (count($args) == 1 && is_array($args[0])) - $args = $args[0]; + $args = $args[0]; foreach ($args as $name) { $this->js_labels[$name] = $this->app->gettext($name); @@ -315,13 +343,13 @@ class rcmail_output_html extends rcmail_output public function reset($all = false) { $framed = $this->framed; - $env = $all ? null : array_intersect_key($this->env, array('extwin'=>1, 'framed'=>1)); + $env = $all ? null : array_intersect_key($this->env, array('extwin'=>1, 'framed'=>1)); parent::reset(); // let some env variables survive - $this->env = $this->js_env = $env; - $this->framed = $framed || $this->env['framed']; + $this->env = $this->js_env = $env; + $this->framed = $framed || $this->env['framed']; $this->js_labels = array(); $this->js_commands = array(); $this->script_files = array(); @@ -400,20 +428,27 @@ class rcmail_output_html extends rcmail_output array_unshift($this->js_commands, array('hide_message', $unlock)); } - if (!empty($this->script_files)) - $this->set_env('request_token', $this->app->get_request_token()); + if (!empty($this->script_files)) { + $this->set_env('request_token', $this->app->get_request_token()); + } + + $commands = $this->get_js_commands($framed); - // write all env variables to client - if ($commands = $this->get_js_commands()) { - $js = $this->framed ? "if (window.parent) {\n" : ''; - $js .= $commands . ($this->framed ? ' }' : ''); - $this->add_script($js, 'head_top'); + // if all js commands go to parent window we can ignore all + // script files and skip rcube_webmail initialization (#1489792) + if ($framed) { + $this->scripts = array(); + $this->script_files = array(); } + // write all javascript commands + $this->add_script($commands, 'head_top'); + // send clickjacking protection headers - $iframe = $this->framed || !empty($_REQUEST['_framed']); - if (!headers_sent() && ($xframe = $this->app->config->get('x_frame_options', 'sameorigin'))) + $iframe = $this->framed || $this->env['framed']; + if (!headers_sent() && ($xframe = $this->app->config->get('x_frame_options', 'sameorigin'))) { header('X-Frame-Options: ' . ($iframe && $xframe == 'deny' ? 'sameorigin' : $xframe)); + } // call super method $this->_write($template, $this->config->get('skin_path')); @@ -430,15 +465,15 @@ class rcmail_output_html extends rcmail_output */ function parse($name = 'main', $exit = true, $write = true) { - $plugin = false; - $realname = $name; + $plugin = false; + $realname = $name; $this->template_name = $realname; $temp = explode('.', $name, 2); if (count($temp) > 1) { - $plugin = $temp[0]; - $name = $temp[1]; - $skin_dir = $plugin . '/skins/' . $this->config->get('skin'); + $plugin = $temp[0]; + $name = $temp[1]; + $skin_dir = $plugin . '/skins/' . $this->config->get('skin'); // apply skin search escalation list to plugin directory $plugin_skin_paths = array(); @@ -519,25 +554,12 @@ class rcmail_output_html extends rcmail_output $output = preg_replace_callback('/<form\s+([^>]+)>/Ui', array($this, 'alter_form_tag'), $output); $this->footer = preg_replace_callback('/<form\s+([^>]+)>/Ui', array($this, 'alter_form_tag'), $this->footer); - if ($write) { - // add debug console - if ($realname != 'error' && ($this->config->get('debug_level') & 8)) { - $this->add_footer('<div id="console" style="position:absolute;top:5px;left:5px;width:405px;padding:2px;background:white;z-index:9000;display:none"> - <a href="#toggle" onclick="con=$(\'#dbgconsole\');con[con.is(\':visible\')?\'hide\':\'show\']();return false">console</a> - <textarea name="console" id="dbgconsole" rows="20" cols="40" style="display:none;width:400px;border:none;font-size:10px" spellcheck="false"></textarea></div>' - ); - $this->add_script( - "if (!window.console || !window.console.log) {\n". - " window.console = new rcube_console();\n". - " $('#console').show();\n". - "}", 'foot'); - } - $this->write(trim($output)); - } - else { + if (!$write) { return $output; } + $this->write(trim($output)); + if ($exit) { exit; } @@ -548,27 +570,47 @@ class rcmail_output_html extends rcmail_output * * @return string $out */ - protected function get_js_commands() + protected function get_js_commands(&$framed = null) { - $out = ''; if (!$this->framed && !empty($this->js_env)) { - $out .= self::JS_OBJECT_NAME . '.set_env('.self::json_serialize($this->js_env).");\n"; + $this->command('set_env', $this->js_env); } + if (!empty($this->js_labels)) { $this->command('add_label', $this->js_labels); } + + $out = ''; + $parent_commands = 0; + foreach ($this->js_commands as $i => $args) { $method = array_shift($args); + $parent = $this->framed || preg_match('/^parent\./', $method); + foreach ($args as $i => $arg) { $args[$i] = self::json_serialize($arg); } - $parent = $this->framed || preg_match('/^parent\./', $method); - $out .= sprintf( - "%s.%s(%s);\n", - ($parent ? 'if(window.parent && parent.'.self::JS_OBJECT_NAME.') parent.' : '') . self::JS_OBJECT_NAME, - preg_replace('/^parent\./', '', $method), - implode(',', $args) - ); + + if ($parent) { + $parent_commands++; + $method = preg_replace('/^parent\./', '', $method); + $parent_prefix = 'if (window.parent && parent.' . self::JS_OBJECT_NAME . ') parent.'; + $method = $parent_prefix . self::JS_OBJECT_NAME . '.' . $method; + } + else { + $method = self::JS_OBJECT_NAME . '.' . $method; + } + + $out .= sprintf("%s(%s);\n", $method, implode(',', $args)); + } + + $framed = $parent_prefix && $parent_commands == count($this->js_commands); + + // make the output more compact if all commands go to parent window + if ($framed) { + $out = "if (window.parent && parent." . self::JS_OBJECT_NAME . ") {\n" + . str_replace($parent_prefix, "\tparent.", $out) + . "}\n"; } return $out; @@ -584,13 +626,14 @@ class rcmail_output_html extends rcmail_output public function abs_url($str, $search_path = false) { if ($str[0] == '/') { - if ($search_path && ($file_url = $this->get_skin_file($str, $skin_path))) + if ($search_path && ($file_url = $this->get_skin_file($str, $skin_path))) { return $file_url; + } return $this->base_path . $str; } - else - return $str; + + return $str; } /** @@ -1306,15 +1349,10 @@ class rcmail_output_html extends rcmail_output $output = trim($templ); if (empty($output)) { - $output = $this->default_template; + $output = html::doctype('html5') . "\n" . $this->default_template; $is_empty = true; } - // set default page title - if (empty($this->pagetitle)) { - $this->pagetitle = 'Roundcube Mail'; - } - // replace specialchars in content $page_title = html::quote($this->pagetitle); $page_header = ''; @@ -1462,7 +1500,7 @@ class rcmail_output_html extends rcmail_output */ public function form_tag($attrib, $content = null) { - if ($this->framed || !empty($_REQUEST['_framed'])) { + if ($this->framed || $this->env['framed']) { $hiddenfield = new html_hiddenfield(array('name' => '_framed', 'value' => '1')); $hidden = $hiddenfield->show(); } @@ -1502,7 +1540,7 @@ class rcmail_output_html extends rcmail_output // we already have a <form> tag if ($attrib['form']) { - if ($this->framed || !empty($_REQUEST['_framed'])) + if ($this->framed || $this->env['framed']) $hidden->add(array('name' => '_framed', 'value' => '1')); return $hidden->show() . $content; } @@ -1629,6 +1667,12 @@ class rcmail_output_html extends rcmail_output $out .= $input_host->show(); } + if (rcube_utils::get_boolean($attrib['submit'])) { + $submit = new html_inputfield(array('type' => 'submit', 'id' => 'rcmloginsubmit', + 'class' => 'button mainaction', 'value' => $this->app->gettext('login'))); + $out .= html::p('formbuttons', $submit->show()); + } + // surround html output with a form tag if (empty($attrib['form'])) { $out = $this->form_tag(array('name' => $form_name, 'method' => 'post'), $out); @@ -1691,9 +1735,9 @@ class rcmail_output_html extends rcmail_output // add form tag around text field if (empty($attrib['form'])) { $out = $this->form_tag(array( - 'name' => "rcmqsearchform", + 'name' => "rcmqsearchform", 'onsubmit' => self::JS_OBJECT_NAME . ".command('search'); return false", - 'style' => "display:inline"), + 'style' => "display:inline"), $out); } diff --git a/program/include/rcmail_output_json.php b/program/include/rcmail_output_json.php index d0e1eec64..fa35824db 100644 --- a/program/include/rcmail_output_json.php +++ b/program/include/rcmail_output_json.php @@ -23,7 +23,7 @@ /** * View class to produce JSON responses * - * @package Core + * @package Webmail * @subpackage View */ class rcmail_output_json extends rcmail_output diff --git a/program/include/rcmail_string_replacer.php b/program/include/rcmail_string_replacer.php index 6771375e1..d3fdc3e7f 100644 --- a/program/include/rcmail_string_replacer.php +++ b/program/include/rcmail_string_replacer.php @@ -23,7 +23,7 @@ * Helper class for turning URLs and email addresses in plaintext content * into clickable links. * - * @package Core + * @package Webmail * @subpackage Utils */ class rcmail_string_replacer extends rcube_string_replacer diff --git a/program/js/app.js b/program/js/app.js index b88ed28c3..2a6b9ef78 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -1,23 +1,37 @@ -/* - +-----------------------------------------------------------------------+ - | Roundcube Webmail Client Script | - | | - | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | - | Copyright (C) 2011-2013, Kolab Systems AG | - | | - | Licensed under the GNU General Public License version 3 or | - | any later version with exceptions for skins & plugins. | - | See the README file for a full license statement. | - | | - +-----------------------------------------------------------------------+ - | Authors: Thomas Bruederli <roundcube@gmail.com> | - | Aleksander 'A.L.E.C' Machniak <alec@alec.pl> | - | Charles McNulty <charles@charlesmcnulty.com> | - +-----------------------------------------------------------------------+ - | Requires: jquery.js, common.js, list.js | - +-----------------------------------------------------------------------+ -*/ +/** + * Roundcube Webmail Client Script + * + * This file is part of the Roundcube Webmail client + * + * @licstart The following is the entire license notice for the + * JavaScript code in this file. + * + * Copyright (C) 2005-2014, The Roundcube Dev Team + * Copyright (C) 2011-2014, Kolab Systems AG + * + * The JavaScript code in this page is free software: you can + * redistribute it and/or modify it under the terms of the GNU + * General Public License (GNU GPL) as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) + * any later version. The code is distributed WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. + * + * As additional permission under GNU GPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * @licend The above is the entire license notice + * for the JavaScript code in this file. + * + * @author Thomas Bruederli <roundcube@gmail.com> + * @author Aleksander 'A.L.E.C' Machniak <alec@alec.pl> + * @author Charles McNulty <charles@charlesmcnulty.com> + * + * @requires jquery.js, common.js, list.js + */ function rcube_webmail() { @@ -31,6 +45,7 @@ function rcube_webmail() this.onloads = []; this.messages = {}; this.group2expand = {}; + this.http_request_jobs = {}; // webmail client settings this.dblclick_time = 500; @@ -62,7 +77,7 @@ function rcube_webmail() }); // unload fix - $(window).bind('beforeunload', function() { rcmail.unload = true; }); + $(window).bind('beforeunload', function() { ref.unload = true; }); // set environment variable(s) this.set_env = function(p, value) @@ -138,11 +153,11 @@ function rcube_webmail() // initialize webmail client this.init = function() { - var n, p = this; + var n; this.task = this.env.task; // check browser - if (!bw.dom || !bw.xmlhttp_test() || (bw.mz && bw.vendver < 1.9)) { + if (this.env.server_error != 409 && (!bw.dom || !bw.xmlhttp_test() || (bw.mz && bw.vendver < 1.9) || (bw.ie && bw.vendver < 7))) { this.goto_url('error', '_code=0x199'); return; } @@ -199,28 +214,34 @@ function rcube_webmail() column_movable:this.env.col_movable, dblclick_time:this.dblclick_time }); this.message_list - .addEventListener('initrow', function(o) { p.init_message_row(o); }) - .addEventListener('dblclick', function(o) { p.msglist_dbl_click(o); }) - .addEventListener('click', function(o) { p.msglist_click(o); }) - .addEventListener('keypress', function(o) { p.msglist_keypress(o); }) - .addEventListener('select', function(o) { p.msglist_select(o); }) - .addEventListener('dragstart', function(o) { p.drag_start(o); }) - .addEventListener('dragmove', function(e) { p.drag_move(e); }) - .addEventListener('dragend', function(e) { p.drag_end(e); }) - .addEventListener('expandcollapse', function(o) { p.msglist_expand(o); }) - .addEventListener('column_replace', function(o) { p.msglist_set_coltypes(o); }) - .addEventListener('listupdate', function(o) { p.triggerEvent('listupdate', o); }) + .addEventListener('initrow', function(o) { ref.init_message_row(o); }) + .addEventListener('dblclick', function(o) { ref.msglist_dbl_click(o); }) + .addEventListener('click', function(o) { ref.msglist_click(o); }) + .addEventListener('keypress', function(o) { ref.msglist_keypress(o); }) + .addEventListener('select', function(o) { ref.msglist_select(o); }) + .addEventListener('dragstart', function(o) { ref.drag_start(o); }) + .addEventListener('dragmove', function(e) { ref.drag_move(e); }) + .addEventListener('dragend', function(e) { ref.drag_end(e); }) + .addEventListener('expandcollapse', function(o) { ref.msglist_expand(o); }) + .addEventListener('column_replace', function(o) { ref.msglist_set_coltypes(o); }) + .addEventListener('listupdate', function(o) { ref.triggerEvent('listupdate', o); }) .init(); - document.onmouseup = function(e){ return p.doc_mouse_up(e); }; - this.gui_objects.messagelist.parentNode.onmousedown = function(e){ return p.click_on_list(e); }; + // TODO: this should go into the list-widget code + $(this.message_list.thead).on('click', 'a.sortcol', function(e){ + return ref.command('sort', $(this).attr('rel'), this); + }); + + document.onmouseup = function(e){ return ref.doc_mouse_up(e); }; + this.gui_objects.messagelist.parentNode.onmousedown = function(e){ return ref.click_on_list(e); }; this.enable_command('toggle_status', 'toggle_flag', 'sort', true); + this.enable_command('set-listmode', this.env.threads && !this.is_multifolder_listing()); // load messages this.command('list'); - $(this.gui_objects.qsearchbox).val(this.env.search_text).focusin(function() { rcmail.message_list.blur(); }); + $(this.gui_objects.qsearchbox).val(this.env.search_text).focusin(function() { ref.message_list.blur(); }); } this.set_button_titles(); @@ -288,7 +309,7 @@ function rcube_webmail() } } - document.onmouseup = function(e){ return p.doc_mouse_up(e); }; + document.onmouseup = function(e){ return ref.doc_mouse_up(e); }; // init message compose form this.init_messageform(); @@ -315,7 +336,7 @@ function rcube_webmail() this.contact_list = new rcube_list_widget(this.gui_objects.contactslist, { multiselect:true, draggable:false, keyboard:false }); this.contact_list - .addEventListener('initrow', function(o) { p.triggerEvent('insertrow', { cid:o.uid, row:o }); }) + .addEventListener('initrow', function(o) { ref.triggerEvent('insertrow', { cid:o.uid, row:o }); }) .addEventListener('select', function(o) { ref.compose_recipient_select(o); }) .addEventListener('dblclick', function(o) { ref.compose_add_recipient('to'); }) .init(); @@ -356,21 +377,21 @@ function rcube_webmail() this.contact_list = new rcube_list_widget(this.gui_objects.contactslist, {multiselect:true, draggable:this.gui_objects.folderlist?true:false, keyboard:true}); this.contact_list - .addEventListener('initrow', function(o) { p.triggerEvent('insertrow', { cid:o.uid, row:o }); }) - .addEventListener('keypress', function(o) { p.contactlist_keypress(o); }) - .addEventListener('select', function(o) { p.contactlist_select(o); }) - .addEventListener('dragstart', function(o) { p.drag_start(o); }) - .addEventListener('dragmove', function(e) { p.drag_move(e); }) - .addEventListener('dragend', function(e) { p.drag_end(e); }) + .addEventListener('initrow', function(o) { ref.triggerEvent('insertrow', { cid:o.uid, row:o }); }) + .addEventListener('keypress', function(o) { ref.contactlist_keypress(o); }) + .addEventListener('select', function(o) { ref.contactlist_select(o); }) + .addEventListener('dragstart', function(o) { ref.drag_start(o); }) + .addEventListener('dragmove', function(e) { ref.drag_move(e); }) + .addEventListener('dragend', function(e) { ref.drag_end(e); }) .init(); if (this.env.cid) this.contact_list.highlight_row(this.env.cid); - this.gui_objects.contactslist.parentNode.onmousedown = function(e){ return p.click_on_list(e); }; - document.onmouseup = function(e){ return p.doc_mouse_up(e); }; + this.gui_objects.contactslist.parentNode.onmousedown = function(e){ return ref.click_on_list(e); }; + document.onmouseup = function(e){ return ref.doc_mouse_up(e); }; - $(this.gui_objects.qsearchbox).focusin(function() { rcmail.contact_list.blur(); }); + $(this.gui_objects.qsearchbox).focusin(function() { ref.contact_list.blur(); }); this.update_group_commands(); this.command('list'); @@ -422,7 +443,7 @@ function rcube_webmail() this.identity_list = new rcube_list_widget(this.gui_objects.identitieslist, {multiselect:false, draggable:false, keyboard:false}); this.identity_list - .addEventListener('select', function(o) { p.identity_select(o); }) + .addEventListener('select', function(o) { ref.identity_select(o); }) .init() .focus(); @@ -432,7 +453,7 @@ function rcube_webmail() else if (this.gui_objects.sectionslist) { this.sections_list = new rcube_list_widget(this.gui_objects.sectionslist, {multiselect:false, draggable:false, keyboard:false}); this.sections_list - .addEventListener('select', function(o) { p.section_select(o); }) + .addEventListener('select', function(o) { ref.section_select(o); }) .init() .focus(); } @@ -444,10 +465,10 @@ function rcube_webmail() this.responses_list .addEventListener('select', function(list) { var win, id = list.get_single_selection(); - p.enable_command('delete', !!id && $.inArray(id, p.env.readonly_responses) < 0); - if (id && (win = p.get_frame_window(p.env.contentframe))) { - p.set_busy(true); - p.location_href({ _action:'edit-response', _key:id, _framed:1 }, win); + ref.enable_command('delete', !!id && $.inArray(id, ref.env.readonly_responses) < 0); + if (id && (win = ref.get_frame_window(ref.env.contentframe))) { + ref.set_busy(true); + ref.location_href({ _action:'edit-response', _key:id, _framed:1 }, win); } }) .init() @@ -458,7 +479,7 @@ function rcube_webmail() case 'login': var input_user = $('#rcmloginuser'); - input_user.bind('keyup', function(e){ return rcmail.login_user_keyup(e); }); + input_user.bind('keyup', function(e){ return ref.login_user_keyup(e); }); if (input_user.val() == '') input_user.focus(); @@ -466,7 +487,7 @@ function rcube_webmail() $('#rcmloginpwd').focus(); // detect client timezone - if (window.jstz && !bw.ie6) { + if (window.jstz) { var timezone = jstz.determine(); if (timezone.name()) $('#rcmlogintz').val(timezone.name()); @@ -478,8 +499,8 @@ function rcube_webmail() // display 'loading' message on form submit, lock submit button $('form').submit(function () { $('input[type=submit]', this).prop('disabled', true); - rcmail.clear_messages(); - rcmail.display_message('', 'loading'); + ref.clear_messages(); + ref.display_message('', 'loading'); }); this.enable_command('login', true); @@ -507,23 +528,19 @@ function rcube_webmail() if (this.pending_message) this.display_message(this.pending_message[0], this.pending_message[1], this.pending_message[2]); - // map implicit containers - if (this.gui_objects.folderlist) { - this.gui_containers.foldertray = $(this.gui_objects.folderlist); - - // init treelist widget - if (window.rcube_treelist_widget) { - this.treelist = new rcube_treelist_widget(this.gui_objects.folderlist, { + // init treelist widget + if (this.gui_objects.folderlist && window.rcube_treelist_widget) { + this.treelist = new rcube_treelist_widget(this.gui_objects.folderlist, { id_prefix: 'rcmli', id_encode: this.html_identifier_encode, id_decode: this.html_identifier_decode, check_droptarget: function(node) { return !node.virtual && ref.check_droptarget(node.id) } - }); - this.treelist - .addEventListener('collapse', function(node) { ref.folder_collapsed(node) }) - .addEventListener('expand', function(node) { ref.folder_collapsed(node) }) - .addEventListener('select', function(node) { ref.triggerEvent('selectfolder', { folder:node.id, prefix:'rcmli' }) }); - } + }); + + this.treelist + .addEventListener('collapse', function(node) { ref.folder_collapsed(node) }) + .addEventListener('expand', function(node) { ref.folder_collapsed(node) }) + .addEventListener('select', function(node) { ref.triggerEvent('selectfolder', { folder:node.id, prefix:'rcmli' }) }); } // activate html5 file drop feature (if browser supports it and if configured) @@ -564,12 +581,13 @@ function rcube_webmail() // execute a specific command on the web client this.command = function(command, props, obj, event) { - var ret, uid, cid, url, flag; + var ret, uid, cid, url, flag, aborted = false; if (obj && obj.blur) obj.blur(); - if (this.busy) + // do nothing if interface is locked by other command (with exception for searching reset) + if (this.busy && !(command == 'reset-search' && this.last_command == 'search')) return false; // let the browser handle this click (shift/ctrl usually opens the link in a new window/tab) @@ -595,6 +613,8 @@ function rcube_webmail() this.remove_compose_data(this.env.compose_id); } + this.last_command = command; + // process external commands if (typeof this.command_handlers[command] === 'function') { ret = this.command_handlers[command](props, obj); @@ -650,11 +670,16 @@ function rcube_webmail() var form = this.gui_objects.messageform, win = this.open_window(''); - this.save_compose_form_local(); - $("input[name='_action']", form).val('compose'); - form.action = this.url('mail/compose', { _id: this.env.compose_id, _extwin: 1 }); - form.target = win.name; - form.submit(); + if (win) { + this.save_compose_form_local(); + $("input[name='_action']", form).val('compose'); + form.action = this.url('mail/compose', { _id: this.env.compose_id, _extwin: 1 }); + form.target = win.name; + form.submit(); + } + else { + // this.display_message(this.get_label('windowopenerror'), 'error'); + } } else { this.open_window(this.env.permaurl, true); @@ -684,7 +709,7 @@ function rcube_webmail() case 'open': if (uid = this.get_single_uid()) { - obj.href = this.url('show', {_mbox: this.env.mailbox, _uid: uid}); + obj.href = this.url('show', {_mbox: this.get_message_mailbox(uid), _uid: uid}); return true; } break; @@ -695,10 +720,12 @@ function rcube_webmail() break; case 'list': - if (props && props != '') + if (props && props != '') { this.reset_qsearch(); - if (this.env.action == 'compose' && this.env.extwin) + } + if (this.env.action == 'compose' && this.env.extwin) { window.close(); + } else if (this.task == 'mail') { this.list_mailbox(props); this.set_button_titles(); @@ -707,6 +734,10 @@ function rcube_webmail() this.list_contacts(props); break; + case 'set-listmode': + this.set_list_options(null, undefined, undefined, props == 'threads' ? 1 : 0); + break; + case 'sort': var sort_order = this.env.sort_order, sort_col = !this.env.disabled_sort_col ? props : this.env.sort_col; @@ -787,9 +818,9 @@ function rcube_webmail() this.load_contact(cid, 'edit'); else if (this.task == 'settings' && props) this.load_identity(props, 'edit-identity'); - else if (this.task == 'mail' && (cid = this.get_single_uid())) { - url = { _mbox: this.env.mailbox }; - url[this.env.mailbox == this.env.drafts_mailbox && props != 'new' ? '_draft_uid' : '_uid'] = cid; + else if (this.task == 'mail' && (uid = this.get_single_uid())) { + url = { _mbox: this.get_message_mailbox(uid) }; + url[this.env.mailbox == this.env.drafts_mailbox && props != 'new' ? '_draft_uid' : '_uid'] = uid; this.open_compose_step(url); } break; @@ -1049,7 +1080,11 @@ function rcube_webmail() // Reset the auto-save timer clearTimeout(this.save_timer); - this.upload_file(props || this.gui_objects.uploadform, 'upload'); + if (!(flag = this.upload_file(props || this.gui_objects.uploadform, 'upload'))) { + if (flag !== false) + alert(this.get_label('selectimportfile')); + aborted = true; + } break; case 'insert-sig': @@ -1069,7 +1104,7 @@ function rcube_webmail() case 'reply-list': case 'reply': if (uid = this.get_single_uid()) { - url = {_reply_uid: uid, _mbox: this.env.mailbox}; + url = {_reply_uid: uid, _mbox: this.get_message_mailbox(uid)}; if (command == 'reply-all') // do reply-list, when list is detected and popup menu wasn't used url._all = (!props && this.env.reply_all_mode == 1 && this.commands['reply-list'] ? 'list' : 'all'); @@ -1085,7 +1120,7 @@ function rcube_webmail() case 'forward': var uids = this.env.uid ? [this.env.uid] : (this.message_list ? this.message_list.get_selection() : []); if (uids.length) { - url = { _forward_uid: this.uids_to_list(uids), _mbox: this.env.mailbox }; + url = { _forward_uid: this.uids_to_list(uids), _mbox: this.env.mailbox, _search: this.env.search_request }; if (command == 'forward-attachment' || (!props && this.env.forward_attachment) || uids.length > 1) url._attachment = 1; this.open_compose_step(url); @@ -1097,7 +1132,7 @@ function rcube_webmail() this.gui_objects.messagepartframe.contentWindow.print(); } else if (uid = this.get_single_uid()) { - ref.printwin = this.open_window(this.env.comm_path+'&_action=print&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)+(this.env.safemode ? '&_safe=1' : ''), true, true); + this.printwin = this.open_window(this.env.comm_path+'&_action=print&_uid='+uid+'&_mbox='+urlencode(this.get_message_mailbox(uid))+(this.env.safemode ? '&_safe=1' : ''), true, true); if (this.printwin) { if (this.env.action != 'show') this.mark_message('read', uid); @@ -1114,8 +1149,9 @@ function rcube_webmail() if (this.env.action == 'get') { location.href = location.href.replace(/_frame=/, '_download='); } - else if (uid = this.get_single_uid()) - this.goto_url('viewsource', { _uid: uid, _mbox: this.env.mailbox, _save: 1 }); + else if (uid = this.get_single_uid()) { + this.goto_url('viewsource', { _uid: uid, _mbox: this.get_message_mailbox(uid), _save: 1 }); + } break; // quicksearch @@ -1171,9 +1207,17 @@ function rcube_webmail() break; case 'import-messages': - var form = props || this.gui_objects.importform; - $('input[name="_unlock"]', form).val(this.set_busy(true, 'importwait')); - this.upload_file(form, 'import'); + var form = props || this.gui_objects.importform, + importlock = this.set_busy(true, 'importwait'); + + $('input[name="_unlock"]', form).val(importlock); + + if (!(flag = this.upload_file(form, 'import'))) { + this.set_busy(false, null, importlock); + if (flag !== false) + alert(this.get_label('selectimportfile')); + aborted = true; + } break; case 'import': @@ -1181,6 +1225,7 @@ function rcube_webmail() var file = document.getElementById('rcmimportfile'); if (file && !file.value) { alert(this.get_label('selectimportfile')); + aborted = true; break; } this.gui_objects.importform.submit(); @@ -1232,9 +1277,9 @@ function rcube_webmail() break; } - if (this.triggerEvent('after'+command, props) === false) + if (!aborted && this.triggerEvent('after'+command, props) === false) ret = false; - this.triggerEvent('actionafter', {props:props, action:command}); + this.triggerEvent('actionafter', { props:props, action:command, aborted:aborted }); return ret === false ? false : obj ? false : true; }; @@ -1261,6 +1306,11 @@ function rcube_webmail() } }; + this.command_enabled = function(cmd) + { + return this.commands[cmd]; + } + // lock/unlock interface this.set_busy = function(a, message, id) { @@ -1326,7 +1376,7 @@ function rcube_webmail() if (this.is_framed()) parent.rcmail.reload(delay); else if (delay) - setTimeout(function(){ rcmail.reload(); }, delay); + setTimeout(function() { ref.reload(); }, delay); else if (window.location) location.href = this.env.comm_path + (this.env.action ? '&_action='+this.env.action : ''); }; @@ -1434,11 +1484,31 @@ function rcube_webmail() this.drag_end = function(e) { - this.drag_active = false; - this.env.last_folder_target = null; + var list, model; if (this.treelist) this.treelist.drag_end(); + + // execute drag & drop action when mouse was released + if (list = this.message_list) + model = this.env.mailboxes; + else if (list = this.contact_list) + model = this.env.contactfolders; + + if (this.drag_active && model && this.env.last_folder_target) { + var target = model[this.env.last_folder_target]; + list.draglayer.hide(); + + if (this.contact_list) { + if (!this.contacts_drag_menu(e, target)) + this.command('move', target); + } + else if (!this.drag_menu(e, target)) + this.command('move', target); + } + + this.drag_active = false; + this.env.last_folder_target = null; }; this.drag_move = function(e) @@ -1499,38 +1569,16 @@ function rcube_webmail() this.doc_mouse_up = function(e) { - var model, list, id; + var list, id; // ignore event if jquery UI dialog is open if ($(rcube_event.get_target(e)).closest('.ui-dialog, .ui-widget-overlay').length) return; - if (list = this.message_list) - model = this.env.mailboxes; - else if (list = this.contact_list) - model = this.env.contactfolders; - else if (this.ksearch_value) - this.ksearch_blur(); - + list = this.message_list || this.contact_list; if (list && !rcube_mouse_is_over(e, list.list.parentNode)) list.blur(); - // handle mouse release when dragging - if (this.drag_active && model && this.env.last_folder_target) { - var target = model[this.env.last_folder_target]; - - this.env.last_folder_target = null; - list.draglayer.hide(); - this.drag_end(e); - - if (this.contact_list) { - if (!this.contacts_drag_menu(e, target)) - this.command('move', target); - } - else if (!this.drag_menu(e, target)) - this.command('move', target); - } - // reset 'pressed' buttons if (this.buttons_sel) { for (id in this.buttons_sel) @@ -1618,7 +1666,7 @@ function rcube_webmail() var uid = list.get_single_selection(); - if (uid && this.env.mailbox == this.env.drafts_mailbox) + if (uid && (this.env.messages[uid].mbox || this.env.mailbox) == this.env.drafts_mailbox) this.open_compose_step({ _draft_uid: uid, _mbox: this.env.mailbox }); else if (uid) this.show_message(uid, false, false); @@ -1659,28 +1707,30 @@ function rcube_webmail() { var i, found, name, cols = list.thead.rows[0].cells; - this.env.coltypes = []; + this.env.listcols = []; for (i=0; i<cols.length; i++) if (cols[i].id && cols[i].id.startsWith('rcm')) { name = cols[i].id.slice(3); - this.env.coltypes.push(name); + this.env.listcols.push(name); } - if ((found = $.inArray('flag', this.env.coltypes)) >= 0) + if ((found = $.inArray('flag', this.env.listcols)) >= 0) this.env.flagged_col = found; - if ((found = $.inArray('subject', this.env.coltypes)) >= 0) + if ((found = $.inArray('subject', this.env.listcols)) >= 0) this.env.subject_col = found; - this.command('save-pref', { name: 'list_cols', value: this.env.coltypes, session: 'list_attrib/columns' }); + this.command('save-pref', { name: 'list_cols', value: this.env.listcols, session: 'list_attrib/columns' }); }; this.check_droptarget = function(id) { switch (this.task) { case 'mail': - return (this.env.mailboxes[id] && this.env.mailboxes[id].id != this.env.mailbox && !this.env.mailboxes[id].virtual) ? 1 : 0; + return (this.env.mailboxes[id] + && !this.env.mailboxes[id].virtual + && (this.env.mailboxes[id].id != this.env.mailbox || this.is_multifolder_listing())) ? 1 : 0; case 'settings': return id != this.env.mailbox ? 1 : 0; @@ -1737,7 +1787,7 @@ function rcube_webmail() this.triggerEvent('openwindow', { url:url, handle:extwin }); // focus window, delayed to bring to front - window.setTimeout(function() { extwin && extwin.focus(); }, 10); + setTimeout(function() { extwin && extwin.focus(); }, 10); return extwin; }; @@ -1749,31 +1799,31 @@ function rcube_webmail() this.init_message_row = function(row) { - var i, fn = {}, self = this, uid = row.uid, - status_icon = (this.env.status_col != null ? 'status' : 'msg') + 'icn' + row.uid; + var i, fn = {}, uid = row.uid, + status_icon = (this.env.status_col != null ? 'status' : 'msg') + 'icn' + row.id; if (uid && this.env.messages[uid]) $.extend(row, this.env.messages[uid]); // set eventhandler to status icon if (row.icon = document.getElementById(status_icon)) { - fn.icon = function(e) { self.command('toggle_status', uid); }; + fn.icon = function(e) { ref.command('toggle_status', uid); }; } // save message icon position too if (this.env.status_col != null) - row.msgicon = document.getElementById('msgicn'+row.uid); + row.msgicon = document.getElementById('msgicn'+row.id); else row.msgicon = row.icon; // set eventhandler to flag icon - if (this.env.flagged_col != null && (row.flagicon = document.getElementById('flagicn'+row.uid))) { - fn.flagicon = function(e) { self.command('toggle_flag', uid); }; + if (this.env.flagged_col != null && (row.flagicon = document.getElementById('flagicn'+row.id))) { + fn.flagicon = function(e) { ref.command('toggle_flag', uid); }; } // set event handler to thread expand/collapse icon - if (!row.depth && row.has_children && (row.expando = document.getElementById('rcmexpando'+row.uid))) { - fn.expando = function(e) { self.expand_message_row(e, uid); }; + if (!row.depth && row.has_children && (row.expando = document.getElementById('rcmexpando'+row.id))) { + fn.expando = function(e) { ref.expand_message_row(e, uid); }; } // attach events @@ -1819,6 +1869,7 @@ function rcube_webmail() selected: this.select_all_mode || this.message_list.in_selection(uid), ml: flags.ml?1:0, ctype: flags.ctype, + mbox: flags.mbox, // flags from plugins flags: flags.extra_flags }); @@ -1828,12 +1879,13 @@ function rcube_webmail() list = this.message_list, rows = list.rows, message = this.env.messages[uid], + msg_id = this.html_identifier(uid,true), row_class = 'message' + (!flags.seen ? ' unread' : '') + (flags.deleted ? ' deleted' : '') + (flags.flagged ? ' flagged' : '') + (message.selected ? ' selected' : ''), - row = { cols:[], style:{}, id:'rcmrow'+uid }; + row = { cols:[], style:{}, id:'rcmrow'+msg_id, uid:uid }; // message status icons css_class = 'msgicon'; @@ -1859,7 +1911,7 @@ function rcube_webmail() if (this.env.threading) { if (message.depth) { // This assumes that div width is hardcoded to 15px, - tree += '<span id="rcmtab' + uid + '" class="branch" style="width:' + (message.depth * 15) + 'px;"> </span>'; + tree += '<span id="rcmtab' + msg_id + '" class="branch" style="width:' + (message.depth * 15) + 'px;"> </span>'; if ((rows[message.parent_uid] && rows[message.parent_uid].expanded === false) || ((this.env.autoexpand_threads == 0 || this.env.autoexpand_threads == 2) && @@ -1878,7 +1930,7 @@ function rcube_webmail() message.expanded = true; } - expando = '<div id="rcmexpando' + uid + '" class="' + (message.expanded ? 'expanded' : 'collapsed') + '"> </div>'; + expando = '<div id="rcmexpando' + row.id + '" class="' + (message.expanded ? 'expanded' : 'collapsed') + '"> </div>'; row_class += ' thread' + (message.expanded? ' expanded' : ''); } @@ -1886,28 +1938,34 @@ function rcube_webmail() row_class += ' unroot'; } - tree += '<span id="msgicn'+uid+'" class="'+css_class+'"> </span>'; + tree += '<span id="msgicn'+row.id+'" class="'+css_class+'"> </span>'; row.className = row_class; - // build subject link - if (!bw.ie && cols.subject) { + // build subject link + if (cols.subject) { var action = flags.mbox == this.env.drafts_mailbox ? 'compose' : 'show'; var uid_param = flags.mbox == this.env.drafts_mailbox ? '_draft_uid' : '_uid'; - cols.subject = '<a href="./?_task=mail&_action='+action+'&_mbox='+urlencode(flags.mbox)+'&'+uid_param+'='+uid+'"'+ - ' onclick="return rcube_event.cancel(event)" onmouseover="rcube_webmail.long_subject_title(this,'+(message.depth+1)+')">'+cols.subject+'</a>'; + cols.subject = '<a href="./?_task=mail&_action='+action+'&_mbox='+urlencode(flags.mbox)+'&'+uid_param+'='+urlencode(uid)+'"'+ + ' onclick="return rcube_event.cancel(event)" onmouseover="rcube_webmail.long_subject_title(this,'+(message.depth+1)+')"><span>'+cols.subject+'</span></a>'; } // add each submitted col - for (n in this.env.coltypes) { - c = this.env.coltypes[n]; - col = { className: String(c).toLowerCase() }; + for (n in this.env.listcols) { + c = this.env.listcols[n]; + col = {className: String(c).toLowerCase(), events:{}}; + + if (this.env.coltypes[c] && this.env.coltypes[c].hidden) { + col.className += ' hidden'; + } if (c == 'flag') { css_class = (flags.flagged ? 'flagged' : 'unflagged'); - html = '<span id="flagicn'+uid+'" class="'+css_class+'"> </span>'; + html = '<span id="flagicn'+row.id+'" class="'+css_class+'"> </span>'; } else if (c == 'attachment') { - if (/application\/|multipart\/(m|signed)/.test(flags.ctype)) + if (flags.attachmentClass) + html = '<span class="'+flags.attachmentClass+'"> </span>'; + else if (/application\/|multipart\/(m|signed)/.test(flags.ctype)) html = '<span class="attachment"> </span>'; else if (/multipart\/report/.test(flags.ctype)) html = '<span class="report"> </span>'; @@ -1923,16 +1981,13 @@ function rcube_webmail() css_class = 'unreadchildren'; else css_class = 'msgicon'; - html = '<span id="statusicn'+uid+'" class="'+css_class+'"> </span>'; + html = '<span id="statusicn'+row.id+'" class="'+css_class+'"> </span>'; } else if (c == 'threads') html = expando; else if (c == 'subject') { - if (bw.ie) { - col.onmouseover = function() { rcube_webmail.long_subject_title_ex(this, message.depth+1); }; - if (bw.ie8) - tree = '<span></span>' + tree; // #1487821 - } + if (bw.ie) + col.events.mouseover = function() { rcube_webmail.long_subject_title_ex(this); }; html = tree + cols[c]; } else if (c == 'priority') { @@ -1941,6 +1996,9 @@ function rcube_webmail() else html = ' '; } + else if (c == 'folder') { + html = '<span onmouseover="rcube_webmail.long_subject_title(this)">' + cols[c] + '<span>'; + } else html = cols[c]; @@ -1990,7 +2048,7 @@ function rcube_webmail() if (cols && cols.length) { // make sure new columns are added at the end of the list - var i, idx, name, newcols = [], oldcols = this.env.coltypes; + var i, idx, name, newcols = [], oldcols = this.env.listcols; for (i=0; i<oldcols.length; i++) { name = oldcols[i]; idx = $.inArray(name, cols); @@ -2021,7 +2079,7 @@ function rcube_webmail() var win, target = window, action = preview ? 'preview': 'show', - url = '&_action='+action+'&_uid='+id+'&_mbox='+urlencode(this.env.mailbox); + url = '&_action='+action+'&_uid='+id+'&_mbox='+urlencode(this.get_message_mailbox(id)); if (preview && (win = this.get_frame_window(this.env.contentframe))) { target = win; @@ -2138,7 +2196,7 @@ function rcube_webmail() var lock = this.set_busy(true, 'checkingmail'), params = this.check_recent_params(); - this.http_request('check-recent', params, lock); + this.http_post('check-recent', params, lock); }; // list messages of a specific mailbox using filter @@ -2150,11 +2208,20 @@ function rcube_webmail() // reset vars this.env.current_page = 1; + this.env.search_filter = filter; this.http_request('search', this.search_params(false, filter), lock); }; + // reload the current message listing + this.refresh_list = function() + { + this.list_mailbox(this.env.mailbox, this.env.current_page || 1, null, { _clear:1 }, true); + if (this.message_list) + this.message_list.clear_selection(); + }; + // list messages of a specific mailbox - this.list_mailbox = function(mbox, page, sort, url) + this.list_mailbox = function(mbox, page, sort, url, update_only) { var win, target = window; @@ -2179,15 +2246,17 @@ function rcube_webmail() this.select_all_mode = false; } - // unselect selected messages and clear the list and message data - this.clear_message_list(); + if (!update_only) { + // unselect selected messages and clear the list and message data + this.clear_message_list(); - if (mbox != this.env.mailbox || (mbox == this.env.mailbox && !page && !sort)) - url._refresh = 1; + if (mbox != this.env.mailbox || (mbox == this.env.mailbox && !page && !sort)) + url._refresh = 1; - this.select_folder(mbox, '', true); - this.unmark_folder(mbox, 'recent', '', true); - this.env.mailbox = mbox; + this.select_folder(mbox, '', true); + this.unmark_folder(mbox, 'recent', '', true); + this.env.mailbox = mbox; + } // load message list remotely if (this.gui_objects.messagelist) { @@ -2221,20 +2290,17 @@ function rcube_webmail() }; // send remote request to load message list - this.list_mailbox_remote = function(mbox, page, post_data) + this.list_mailbox_remote = function(mbox, page, url) { - // clear message list first - this.message_list.clear(); - var lock = this.set_busy(true, 'loading'); - if (typeof post_data != 'object') - post_data = {}; - post_data._mbox = mbox; + if (typeof url != 'object') + url = {}; + url._mbox = mbox; if (page) - post_data._page = page; + url._page = page; - this.http_request('list', post_data, lock); + this.http_request('list', url, lock); }; // removes messages that doesn't exists from list selection array @@ -2386,7 +2452,7 @@ function rcube_webmail() } if (html) - $('#rcmtab'+uid).html(html); + $('#rcmtab'+this.html_identifier(uid, true)).html(html); }; // update parent in a thread @@ -2450,17 +2516,17 @@ function rcube_webmail() r.depth--; // move left // reset width and clear the content of a tab, icons will be added later - $('#rcmtab'+r.uid).width(r.depth * 15).html(''); + $('#rcmtab'+r.id).width(r.depth * 15).html(''); if (!r.depth) { // a new root count++; // increase roots count r.parent_uid = 0; if (r.has_children) { // replace 'leaf' with 'collapsed' - $('#rcmrow'+r.uid+' '+'.leaf:first') - .attr('id', 'rcmexpando' + r.uid) + $('#'+r.id+' .leaf:first') + .attr('id', 'rcmexpando' + r.id) .attr('class', (r.obj.style.display != 'none' ? 'expanded' : 'collapsed')) - .bind('mousedown', {uid:r.uid, p:this}, - function(e) { return e.data.p.expand_message_row(e, e.data.uid); }); + .bind('mousedown', {uid: r.uid}, + function(e) { return ref.expand_message_row(e, e.data.uid); }); r.unread_children = 0; roots.push(r); @@ -2651,7 +2717,7 @@ function rcube_webmail() return this.folder_selector(obj, function(folder) { ref.command('move', folder); }); // exit if current or no mailbox specified - if (!mbox || mbox == this.env.mailbox) + if (!mbox || (mbox == this.env.mailbox && !this.is_multifolder_listing())) return; var lock = false, post_data = this.selection_post_data({_target_mbox: mbox}); @@ -2719,7 +2785,8 @@ function rcube_webmail() // @private this._with_selected_messages = function(action, post_data, lock) { - var count = 0, msg; + var count = 0, msg, + remove = (action == 'delete' || !this.is_multifolder_listing()); // update the list (remove rows, clear selection) if (this.message_list) { @@ -2736,10 +2803,11 @@ function rcube_webmail() roots.push(root); } } - this.message_list.remove_row(id, (this.env.display_next && n == selection.length-1)); + if (remove) + this.message_list.remove_row(id, (this.env.display_next && n == selection.length-1)); } // make sure there are no selected rows - if (!this.env.display_next) + if (!this.env.display_next && remove) this.message_list.clear_selection(); // update thread tree icons for (n=0, len=roots.length; n<len; n++) { @@ -2750,9 +2818,12 @@ function rcube_webmail() if (count < 0) post_data._count = (count*-1); // remove threads from the end of the list - else if (count > 0) + else if (count > 0 && remove) this.delete_excessive_thread_rows(); + if (!remove) + post_data._refresh = 1; + if (!lock) { msg = action == 'move' ? 'movingmessage' : 'deletingmessage'; lock = this.display_message(this.get_label(msg), 'loading'); @@ -2962,7 +3033,8 @@ function rcube_webmail() var icn_src, uid, i, len, rows = this.message_list ? this.message_list.rows : {}; - uids = String(uids).split(','); + if (typeof uids == 'string') + uids = uids.split(','); for (i=0, len=uids.length; i<len; i++) { uid = uids[i]; @@ -2975,7 +3047,7 @@ function rcube_webmail() // with select_all mode checking this.uids_to_list = function(uids) { - return this.select_all_mode ? '*' : uids.join(','); + return this.select_all_mode ? '*' : (uids.length <= 1 ? uids.join(',') : uids); }; // Sets title of the delete button @@ -3048,8 +3120,8 @@ function rcube_webmail() // handler for keyboard events on the _user field this.login_user_keyup = function(e) { - var key = rcube_event.get_keycode(e); - var passwd = $('#rcmloginpwd'); + var key = rcube_event.get_keycode(e), + passwd = $('#rcmloginpwd'); // enter if (key == 13 && passwd.length && !passwd.val()) { @@ -3096,7 +3168,12 @@ function rcube_webmail() // close compose step in opener if (opener_rc && opener_rc.env.action == 'compose') { - setTimeout(function(){ opener.history.back(); }, 100); + setTimeout(function(){ + if (opener.history.length > 1) + opener.history.back(); + else + opener_rc.redirect(opener_rc.get_task_url('mail')); + }, 100); this.env.opened_extwin = true; } @@ -3141,6 +3218,10 @@ function rcube_webmail() if (this.env.draft_id && formdata.draft_id && formdata.draft_id != this.env.draft_id) { continue; } + // skip records on reply + if (this.env.reply_msgid && formdata.reply_msgid != this.env.reply_msgid) { + continue; + } // show dialog asking to restore the message if (formdata.changed && formdata.session != this.env.session_id) { this.show_popup_dialog( @@ -3358,33 +3439,72 @@ function rcube_webmail() { this.stop_spellchecking(); - var flag = $('[name="_is_html"]'); + var ed, curr, content, result, + // these non-printable chars are not removed on text2html and html2text + // we can use them as temp signature replacement + sig_mark = "\u0002\u0003", + input = $('#' + props.id), + signature = this.env.identity ? this.env.signatures[this.env.identity] : null, + is_sig = signature && signature.text && signature.text.length > 1; if (props.mode == 'html') { - this.plain2html($('#'+props.id).val(), props.id); - flag.val(1); - tinymce.execCommand('mceAddEditor', false, props.id); + content = input.val(); + + // replace current text signature with temp mark + if (is_sig) + content = content.replace(signature.text, sig_mark); - if (this.env.default_font) - setTimeout(function() { - $(tinymce.get(props.id).getBody()).css('font-family', rcmail.env.default_font); - }, 500); + // convert to html + result = this.plain2html(content, function(data) { + // replace signature mark with html version of the signature + if (is_sig) + data = data.replace(sig_mark, '<div id="_rc_sig">' + signature.html + '</div>'); + + input.val(data); + tinyMCE.execCommand('mceAddEditor', false, props.id); + + if (ref.env.default_font) + setTimeout(function() { + $(tinyMCE.get(props.id).getBody()).css('font-family', ref.env.default_font); + }, 500); + }); } else { - var thisMCE = tinymce.get(props.id), existingHtml; - - if (existingHtml = thisMCE.getContent()) { - if (!confirm(this.get_label('editorwarning'))) { - return false; - } - this.html2plain(existingHtml, props.id); + ed = tinyMCE.get(props.id); + + if (is_sig) { + // get current version of signature, we'll need it in + // case of html2text conversion abort + if (curr = ed.dom.get('_rc_sig')) + curr = curr.innerHTML; + + // replace current signature with some non-printable characters + // we use non-printable characters, because this replacement + // is visible to the user + // doing this after getContent() would be hard + ed.dom.setHTML('_rc_sig', sig_mark); } - flag.val(0); - tinymce.execCommand('mceRemoveEditor', false, props.id); + // get html content + content = ed.getContent(); + + // convert html to text + result = this.html2plain(content, function(data) { + tinyMCE.execCommand('mceRemoveEditor', false, props.id); + + // replace signture mark with text version of the signature + if (is_sig) + data = data.replace(sig_mark, "\n" + signature.text); + + input.val(data); + }); + + // bring back current signature + if (!result && curr) + ed.dom.setHTML('_rc_sig', curr); } - return true; + return result; }; this.insert_response = function(key) @@ -3397,7 +3517,7 @@ function rcube_webmail() if ($("input[name='_is_html']").val() == '1') { var editor = tinymce.get(this.env.composebody); editor.getWin().focus(); // correct focus in IE & Chrome - editor.selection.setContent(insert, { format:'text' }); + editor.selection.setContent(this.quote_html(insert).replace(/\r?\n/g, '<br/>'), { format:'text' }); } // replace selection in compose textarea else { @@ -3560,8 +3680,8 @@ function rcube_webmail() else if ((ed = this.env.spellcheck) && ed.state) active = ed.state != 'ready' && ed.state != 'no_error_found'; - if (rcmail.buttons.spellcheck) - $('#'+rcmail.buttons.spellcheck[0].id)[active ? 'addClass' : 'removeClass']('selected'); + if (this.buttons.spellcheck) + $('#'+this.buttons.spellcheck[0].id)[active ? 'addClass' : 'removeClass']('selected'); return active; }; @@ -3619,14 +3739,28 @@ function rcube_webmail() this.env.draft_id = id; $("input[name='_draft_saveid']").val(id); - this.remove_compose_data(this.env.compose_id); + // reset history of hidden iframe used for saving draft (#1489643) + // but don't do this on timer-triggered draft-autosaving (#1489789) + if (window.frames['savetarget'] && window.frames['savetarget'].history && !this.draft_autosave_submit) { + window.frames['savetarget'].history.back(); + } + + this.draft_autosave_submit = false; } + + // always remove local copy upon saving as draft + this.remove_compose_data(this.env.compose_id); }; this.auto_save_start = function() { - if (this.env.draft_autosave) - this.save_timer = setTimeout(function(){ ref.command("savedraft"); }, this.env.draft_autosave * 1000); + if (this.env.draft_autosave) { + this.draft_autosave_submit = false; + this.save_timer = setTimeout(function(){ + ref.draft_autosave_submit = true; // set auto-saved flag (#1489789) + ref.command("savedraft"); + }, this.env.draft_autosave * 1000); + } // save compose form content to local storage every 5 seconds if (!this.local_save_timer && window.localStorage) { @@ -3649,7 +3783,7 @@ function rcube_webmail() this.compose_field_hash = function(save) { // check input fields - var ed, i, val, str = '', hash_fields = ['to', 'cc', 'bcc', 'subject']; + var ed, i, id, val, str = '', hash_fields = ['to', 'cc', 'bcc', 'subject']; for (i=0; i<hash_fields.length; i++) if (val = $('[name="_' + hash_fields[i] + '"]').val()) @@ -3661,8 +3795,8 @@ function rcube_webmail() str += $("[name='_message']").val(); if (this.env.attachments) - for (var upload_id in this.env.attachments) - str += upload_id; + for (id in this.env.attachments) + str += id; if (save) this.cmp_hash = str; @@ -3684,6 +3818,9 @@ function rcube_webmail() if (this.env.draft_id) { formdata.draft_id = this.env.draft_id; } + if (this.env.reply_msgid) { + formdata.reply_msgid = this.env.reply_msgid; + } $('input, select, textarea', this.gui_objects.messageform).each(function(i, elem) { switch (elem.tagName.toLowerCase()) { @@ -3769,9 +3906,9 @@ function rcube_webmail() this.clear_compose_data = function() { if (window.localStorage) { - var index = this.local_storage_get_item('compose.index', []); + var i, index = this.local_storage_get_item('compose.index', []); - for (var i=0; i < index.length; i++) { + for (i=0; i < index.length; i++) { this.local_storage_remove_item('compose.' + index[i]); } this.local_storage_remove_item('compose.index'); @@ -3942,7 +4079,7 @@ function rcube_webmail() this.upload_file = function(form, action) { if (!form) - return false; + return; // count files and size on capable browser var size = 0, numfiles = 0; @@ -3963,7 +4100,7 @@ function rcube_webmail() if (numfiles) { if (this.env.max_filesize && this.env.filesizeerror && size > this.env.max_filesize) { this.display_message(this.env.filesizeerror, 'error'); - return; + return false; } var frame_name = this.async_upload_form(form, action || 'upload', function(e) { @@ -3974,17 +4111,17 @@ function rcube_webmail() } else if (this.contentWindow) { d = this.contentWindow.document; } - content = d.childNodes[0].innerHTML; + content = d.childNodes[1].innerHTML; } catch (err) {} - if (!content.match(/add2attachment/) && (!bw.opera || (rcmail.env.uploadframe && rcmail.env.uploadframe == e.data.ts))) { + if (!content.match(/add2attachment/) && (!bw.opera || (ref.env.uploadframe && ref.env.uploadframe == e.data.ts))) { if (!content.match(/display_message/)) - rcmail.display_message(rcmail.get_label('fileuploaderror'), 'error'); - rcmail.remove_from_attachment_list(e.data.ts); + ref.display_message(ref.get_label('fileuploaderror'), 'error'); + ref.remove_from_attachment_list(e.data.ts); } // Opera hack: handle double onload if (bw.opera) - rcmail.env.uploadframe = e.data.ts; + ref.env.uploadframe = e.data.ts; }); // display upload indicator and cancel button @@ -3997,11 +4134,11 @@ function rcube_webmail() if (this.env.upload_progress_time) { this.upload_progress_start('upload', ts); } - } - // set reference to the form object - this.gui_objects.attachmentform = form; - return true; + // set reference to the form object + this.gui_objects.attachmentform = form; + return true; + } }; // add file name to attachment list @@ -4014,8 +4151,8 @@ function rcube_webmail() if (!this.gui_objects.attachmentlist) return false; - if (!att.complete && ref.env.loadingicon) - att.html = '<img src="'+ref.env.loadingicon+'" alt="" class="uploading" />' + att.html; + if (!att.complete && this.env.loadingicon) + att.html = '<img src="'+this.env.loadingicon+'" alt="" class="uploading" />' + att.html; if (!att.complete && att.frame) att.html = '<a title="'+this.get_label('cancel')+'" onclick="return rcmail.cancel_attachment_upload(\''+name+'\', \''+att.frame+'\');" href="#cancelupload" class="cancelupload">' @@ -4026,7 +4163,7 @@ function rcube_webmail() li.attr('id', name) .addClass(att.classname) .html(att.html) - .on('mouseover', function() { rcube_webmail.long_subject_title_ex(this, 0); }); + .on('mouseover', function() { rcube_webmail.long_subject_title_ex(this); }); // replace indicator's li if (upload_id && (indicator = document.getElementById(upload_id))) { @@ -4046,8 +4183,10 @@ function rcube_webmail() this.remove_from_attachment_list = function(name) { - delete this.env.attachments[name]; - $('#'+name).remove(); + if (this.env.attachments) { + delete this.env.attachments[name]; + $('#'+name).remove(); + } }; this.remove_attachment = function(name) @@ -4070,7 +4209,7 @@ function rcube_webmail() this.upload_progress_start = function(action, name) { - setTimeout(function() { rcmail.http_request(action, {_progress: name}); }, + setTimeout(function() { ref.http_request(action, {_progress: name}); }, this.env.upload_progress_time * 1000); }; @@ -4101,7 +4240,8 @@ function rcube_webmail() { if (value != '') { var r, lock = this.set_busy(true, 'searching'), - url = this.search_params(value); + url = this.search_params(value), + action = this.env.action == 'compose' && this.contact_list ? 'search-contacts' : 'search'; if (this.message_list) this.clear_message_list(); @@ -4116,11 +4256,26 @@ function rcube_webmail() // reset vars this.env.current_page = 1; - var action = this.env.action == 'compose' && this.contact_list ? 'search-contacts' : 'search'; r = this.http_request(action, url, lock); this.env.qsearch = {lock: lock, request: r}; + this.enable_command('set-listmode', this.env.threads && (this.env.search_scope || 'base') == 'base'); + + return true; } + + return false; + }; + + this.continue_search = function(request_id) + { + var lock = this.set_busy(true, 'stillsearching'); + + setTimeout(function() { + var url = ref.search_params(); + url._continue = request_id; + ref.env.qsearch = { lock: lock, request: ref.http_request('search', url, lock) }; + }, 100); }; // build URL params for search @@ -4128,7 +4283,8 @@ function rcube_webmail() { var n, url = {}, mods_arr = [], mods = this.env.search_mods, - mbox = this.env.mailbox; + scope = this.env.search_scope || 'base', + mbox = scope == 'all' ? '*' : this.env.mailbox; if (!filter && this.gui_objects.search_filter) filter = this.gui_objects.search_filter.value; @@ -4143,7 +4299,7 @@ function rcube_webmail() url._q = search; if (mods && this.message_list) - mods = mods[mbox] ? mods[mbox] : mods['*']; + mods = mods[mbox] || mods['*']; if (mods) { for (n in mods) @@ -4152,7 +4308,9 @@ function rcube_webmail() } } - if (mbox) + if (scope) + url._scope = scope; + if (mbox && scope != 'all') url._mbox = mbox; return url; @@ -4170,6 +4328,43 @@ function rcube_webmail() this.env.qsearch = null; this.env.search_request = null; this.env.search_id = null; + + this.enable_command('set-listmode', this.env.threads); + }; + + this.set_searchscope = function(scope) + { + var old = this.env.search_scope; + this.env.search_scope = scope; + + // re-send search query with new scope + if (scope != old && this.env.search_request) { + if (!this.qsearch(this.gui_objects.qsearchbox.value) && this.env.search_filter && this.env.search_filter != 'ALL') + this.filter_mailbox(this.env.search_filter); + if (scope != 'all') + this.select_folder(this.env.mailbox, '', true); + } + }; + + this.set_searchmods = function(mods) + { + var mbox = this.env.mailbox, + scope = this.env.search_scope || 'base'; + + if (scope == 'all') + mbox = '*'; + + if (!this.env.search_mods) + this.env.search_mods = {}; + + if (mbox) + this.env.search_mods[mbox] = mods; + }; + + this.is_multifolder_listing = function() + { + return this.env.multifolder_listing !== undefined ? this.env.multifolder_listing : + (this.env.search_request && (this.env.search_scope || 'base') != 'base'); }; this.sent_successfully = function(type, msg, folders) @@ -4261,7 +4456,7 @@ function rcube_webmail() this.ksearch_visible = function() { - return (this.ksearch_selected !== null && this.ksearch_selected !== undefined && this.ksearch_value); + return this.ksearch_selected !== null && this.ksearch_selected !== undefined && this.ksearch_value; }; this.ksearch_select = function(node) @@ -4295,11 +4490,15 @@ function rcube_webmail() this.ksearch_destroy(); // insert all members of a group - if (typeof this.env.contacts[id] === 'object' && this.env.contacts[id].id) { + if (typeof this.env.contacts[id] === 'object' && this.env.contacts[id].type == 'group') { insert += this.env.contacts[id].name + this.env.recipients_delimiter; this.group2expand[this.env.contacts[id].id] = $.extend({ input: this.ksearch_input }, this.env.contacts[id]); this.http_request('mail/group-expand', {_source: this.env.contacts[id].source, _gid: this.env.contacts[id].id}, false); } + else if (typeof this.env.contacts[id] === 'object' && this.env.contacts[id].name) { + insert = this.env.contacts[id].name + this.env.recipients_delimiter; + trigger = true; + } else if (typeof this.env.contacts[id] === 'string') { insert = this.env.contacts[id] + this.env.recipients_delimiter; trigger = true; @@ -4308,12 +4507,10 @@ function rcube_webmail() this.ksearch_input.value = pre + insert + end; // set caret to insert pos - cpos = p+insert.length; - if (this.ksearch_input.setSelectionRange) - this.ksearch_input.setSelectionRange(cpos, cpos); + this.set_caret_pos(this.ksearch_input, p + insert.length); if (trigger) { - this.triggerEvent('autocomplete_insert', { field:this.ksearch_input, insert:insert }); + this.triggerEvent('autocomplete_insert', { field:this.ksearch_input, insert:insert, data:this.env.contacts[id] }); this.compose_type_activity++; } }; @@ -4344,7 +4541,7 @@ function rcube_webmail() p = inp_value.lastIndexOf(this.env.recipients_separator, cpos-1), q = inp_value.substring(p+1, cpos), min = this.env.autocomplete_min_length, - ac = this.ksearch_data; + data = this.ksearch_data; // trim query string q = $.trim(q); @@ -4371,34 +4568,26 @@ function rcube_webmail() return; // ...new search value contains old one and previous search was not finished or its result was empty - if (old_value && old_value.length && q.startsWith(old_value) && (!ac || ac.num <= 0) && this.env.contacts && !this.env.contacts.length) + if (old_value && old_value.length && q.startsWith(old_value) && (!data || data.num <= 0) && this.env.contacts && !this.env.contacts.length) return; - var i, lock, source, xhr, reqid = new Date().getTime(), - post_data = {_search: q, _id: reqid}, - threads = props && props.threads ? props.threads : 1, - sources = props && props.sources ? props.sources : [], - action = props && props.action ? props.action : 'mail/autocomplete'; - - this.ksearch_data = {id: reqid, sources: sources.slice(), action: action, - locks: [], requests: [], num: sources.length}; - - for (i=0; i<threads; i++) { - source = this.ksearch_data.sources.shift(); - if (threads > 1 && source === undefined) - break; - - post_data._source = source ? source : ''; - lock = this.display_message(this.get_label('searching'), 'loading'); - xhr = this.http_post(action, post_data, lock); + var sources = props && props.sources ? props.sources : ['']; + var reqid = this.multi_thread_http_request({ + items: sources, + threads: props && props.threads ? props.threads : 1, + action: props && props.action ? props.action : 'mail/autocomplete', + postdata: { _search:q, _source:'%s' }, + lock: this.display_message(this.get_label('searching'), 'loading') + }); - this.ksearch_data.locks.push(lock); - this.ksearch_data.requests.push(xhr); - } + this.ksearch_data = { id:reqid, sources:sources.slice(), num:sources.length }; }; this.ksearch_query_results = function(results, search, reqid) { + // trigger multi-thread http response callback + this.multi_thread_http_response(results, reqid); + // search stopped in meantime? if (!this.ksearch_value) return; @@ -4408,9 +4597,8 @@ function rcube_webmail() return; // display search results - var i, len, ul, li, text, init, + var i, len, ul, li, text, type, init, value = this.ksearch_value, - data = this.ksearch_data, maxlen = this.env.autocomplete_max ? this.env.autocomplete_max : 15; // create results pane if not present @@ -4442,11 +4630,13 @@ function rcube_webmail() if (results && (len = results.length)) { for (i=0; i < len && maxlen > 0; i++) { text = typeof results[i] === 'object' ? results[i].name : results[i]; + type = typeof results[i] === 'object' ? results[i].type : ''; li = document.createElement('LI'); li.innerHTML = text.replace(new RegExp('('+RegExp.escape(value)+')', 'ig'), '##$1%%').replace(/</g, '<').replace(/>/g, '>').replace(/##([^%]+)%%/g, '<b>$1</b>'); li.onmouseover = function(){ ref.ksearch_select(this); }; li.onmouseup = function(){ ref.ksearch_click(this) }; li._rcm_id = this.env.contacts.length + i; + if (type) li.className = type; ul.appendChild(li); maxlen -= 1; } @@ -4464,27 +4654,8 @@ function rcube_webmail() if (len) this.env.contacts = this.env.contacts.concat(results); - // run next parallel search - if (data.id == reqid) { - data.num--; - if (maxlen > 0 && data.sources.length) { - var lock, xhr, source = data.sources.shift(), post_data; - if (source) { - post_data = {_search: value, _id: reqid, _source: source}; - lock = this.display_message(this.get_label('searching'), 'loading'); - xhr = this.http_post(data.action, post_data, lock); - - this.ksearch_data.locks.push(lock); - this.ksearch_data.requests.push(xhr); - } - } - else if (!maxlen) { - if (!this.ksearch_msg) - this.ksearch_msg = this.display_message(this.get_label('autocompletemore')); - // abort pending searches - this.ksearch_abort(); - } - } + if (this.ksearch_data.id == reqid) + this.ksearch_data.num--; }; this.ksearch_click = function(node) @@ -4519,7 +4690,8 @@ function rcube_webmail() // Clears autocomplete data/requests this.ksearch_destroy = function() { - this.ksearch_abort(); + if (this.ksearch_data) + this.multi_thread_request_abort(this.ksearch_data.id); if (this.ksearch_info) this.hide_message(this.ksearch_info); @@ -4530,18 +4702,6 @@ function rcube_webmail() this.ksearch_data = null; this.ksearch_info = null; this.ksearch_msg = null; - } - - // Aborts pending autocomplete requests - this.ksearch_abort = function() - { - var i, len, ac = this.ksearch_data; - - if (!ac) - return; - - for (i=0, len=ac.locks.length; i<len; i++) - this.abort_request({request: ac.requests[i], lock: ac.locks[i]}); }; @@ -4560,7 +4720,7 @@ function rcube_webmail() if (this.preview_timer) clearTimeout(this.preview_timer); - var n, id, sid, contact, ref = this, writable = false, + var n, id, sid, contact, writable = false, source = this.env.source ? this.env.address_sources[this.env.source] : null; // we don't have dblclick handler here, so use 200 instead of this.dblclick_time @@ -4977,7 +5137,7 @@ function rcube_webmail() this.init_contact_form = function() { - var ref = this, col; + var col; if (this.env.coltypes) { this.set_photo_actions($('#ff_photo').val()); @@ -5028,7 +5188,7 @@ function rcube_webmail() if (!this.name_input) { this.enable_command('list', 'listgroup', false); this.name_input = $('<input>').attr('type', 'text').val(this.env.contactgroups['G'+this.env.source+this.env.group].name); - this.name_input.bind('keydown', function(e){ return rcmail.add_input_keydown(e); }); + this.name_input.bind('keydown', function(e) { return ref.add_input_keydown(e); }); this.env.group_renaming = true; var link, li = this.get_folder_li('G'+this.env.source+this.env.group,'',true); @@ -5069,7 +5229,7 @@ function rcube_webmail() if (!this.name_input) { this.name_input = $('<input>').attr('type', 'text').data('tt', type); - this.name_input.bind('keydown', function(e){ return rcmail.add_input_keydown(e); }); + this.name_input.bind('keydown', function(e) { return ref.add_input_keydown(e); }); this.name_input_li = $('<li>').addClass(type).append(this.name_input); var ul, li; @@ -5096,21 +5256,21 @@ function rcube_webmail() //remove selected contacts from current active group this.group_remove_selected = function() { - ref.http_post('group-delmembers', {_cid: this.contact_list.selection, + this.http_post('group-delmembers', {_cid: this.contact_list.selection, _source: this.env.source, _gid: this.env.group}); }; //callback after deleting contact(s) from current group this.remove_group_contacts = function(props) { - if('undefined' != typeof this.env.group && (this.env.group === props.gid)){ + if (this.env.group !== undefined && (this.env.group === props.gid)) { var n, selection = this.contact_list.get_selection(); for (n=0; n<selection.length; n++) { id = selection[n]; this.contact_list.remove_row(id, (n == selection.length-1)); } } - } + }; // handler for keyboard events on the input field this.add_input_keydown = function(e) @@ -5172,7 +5332,7 @@ function rcube_webmail() var key = 'G'+prop.source+prop.id, link = $('<a>').attr('href', '#') .attr('rel', prop.source+':'+prop.id) - .click(function() { return rcmail.command('listgroup', prop, this); }) + .click(function() { return ref.command('listgroup', prop, this); }) .html(prop.name); this.env.contactfolders[key] = this.env.contactgroups[key] = prop; @@ -5207,7 +5367,7 @@ function rcube_webmail() newnode.id = newkey; newnode.html = $('<a>').attr('href', '#') .attr('rel', prop.source+':'+prop.newid) - .click(function() { return rcmail.command('listgroup', newprop, this); }) + .click(function() { return ref.command('listgroup', newprop, this); }) .html(prop.name); } // update displayed group name @@ -5384,7 +5544,7 @@ function rcube_webmail() { if (form && form.elements._photo.value) { this.async_upload_form(form, 'upload-photo', function(e) { - rcmail.set_busy(false, null, rcmail.file_upload_id); + ref.set_busy(false, null, ref.file_upload_id); }); // display upload indicator @@ -5449,7 +5609,7 @@ function rcube_webmail() var key = 'S'+id, link = $('<a>').attr('href', '#') .attr('rel', id) - .click(function() { return rcmail.command('listsearch', id, this); }) + .click(function() { return ref.command('listsearch', id, this); }) .html(name), prop = { name:name, id:id }; @@ -5625,25 +5785,25 @@ function rcube_webmail() this.init_subscription_list = function() { - var p = this, delim = RegExp.escape(this.env.delimiter); + var delim = RegExp.escape(this.env.delimiter); this.last_sub_rx = RegExp('['+delim+']?[^'+delim+']+$'); this.subscription_list = new rcube_list_widget(this.gui_objects.subscriptionlist, {multiselect:false, draggable:true, keyboard:false, toggleselect:true}); this.subscription_list - .addEventListener('select', function(o){ p.subscription_select(o); }) - .addEventListener('dragstart', function(o){ p.drag_active = true; }) - .addEventListener('dragend', function(o){ p.subscription_move_folder(o); }) + .addEventListener('select', function(o){ ref.subscription_select(o); }) + .addEventListener('dragstart', function(o){ ref.drag_active = true; }) + .addEventListener('dragend', function(o){ ref.subscription_move_folder(o); }) .addEventListener('initrow', function (row) { - row.obj.onmouseover = function() { p.focus_subscription(row.id); }; - row.obj.onmouseout = function() { p.unfocus_subscription(row.id); }; + row.obj.onmouseover = function() { ref.focus_subscription(row.id); }; + row.obj.onmouseout = function() { ref.unfocus_subscription(row.id); }; }) .init(); $('#mailboxroot') - .mouseover(function(){ p.focus_subscription(this.id); }) - .mouseout(function(){ p.unfocus_subscription(this.id); }) + .mouseover(function(){ ref.focus_subscription(this.id); }) + .mouseout(function(){ ref.unfocus_subscription(this.id); }) }; this.focus_subscription = function(id) @@ -5739,7 +5899,8 @@ function rcube_webmail() if (!this.gui_objects.subscriptionlist) return false; - var row, n, i, tmp, tmp_name, rowid, folders = [], list = [], slist = [], + var row, n, i, tmp, tmp_name, rowid, collator, + folders = [], list = [], slist = [], tbody = this.gui_objects.subscriptionlist.tBodies[0], refrow = $('tr', tbody).get(1), id = 'rcmrow'+((new Date).getTime()); @@ -5766,24 +5927,32 @@ function rcube_webmail() // add to folder/row-ID map this.env.subscriptionrows[id] = [name, display_name, false]; - // sort folders (to find a place where to insert the row) - // replace delimiter with \0 character to fix sorting - // issue where 'Abc Abc' would be placed before 'Abc/def' - var replace_from = RegExp(RegExp.escape(this.env.delimiter), 'g'), - replace_to = String.fromCharCode(0); - - $.each(this.env.subscriptionrows, function(k,v) { - if (v.length < 4) { - var n = v[0]; - n = n.replace(replace_from, replace_to); - v.push(n); - } - folders.push(v); - }); + // copy folders data to an array for sorting + $.each(this.env.subscriptionrows, function(k, v) { folders.push(v); }); + + try { + // use collator if supported (FF29, IE11, Opera15, Chrome24) + collator = new Intl.Collator(this.env.locale.replace('_', '-')); + } + catch (e) {}; + // sort folders folders.sort(function(a, b) { - var len = a.length - 1; n1 = a[len], n2 = b[len]; - return n1 < n2 ? -1 : 1; + var i, f1, f2, + path1 = a[0].split(ref.env.delimiter), + path2 = b[0].split(ref.env.delimiter); + + for (i=0; i<path1.length; i++) { + f1 = path1[i]; + f2 = path2[i]; + + if (f1 !== f2) { + if (collator) + return collator.compare(f1, f2); + else + return f1 < f2 ? -1 : 1; + } + } }); for (n in folders) { @@ -6033,14 +6202,14 @@ function rcube_webmail() elm._command = cmd; elm._id = prop.id; if (prop.sel) { - elm.onmousedown = function(e){ return rcmail.button_sel(this._command, this._id); }; - elm.onmouseup = function(e){ return rcmail.button_out(this._command, this._id); }; + elm.onmousedown = function(e) { return ref.button_sel(this._command, this._id); }; + elm.onmouseup = function(e) { return ref.button_out(this._command, this._id); }; if (preload) new Image().src = prop.sel; } if (prop.over) { - elm.onmouseover = function(e){ return rcmail.button_over(this._command, this._id); }; - elm.onmouseout = function(e){ return rcmail.button_out(this._command, this._id); }; + elm.onmouseover = function(e) { return ref.button_over(this._command, this._id); }; + elm.onmouseout = function(e) { return ref.button_out(this._command, this._id); }; if (preload) new Image().src = prop.over; } @@ -6072,7 +6241,7 @@ function rcube_webmail() button = a_buttons[n]; obj = document.getElementById(button.id); - if (!obj) + if (!obj || button.status === state) continue; // get default/passive setting of the button @@ -6085,20 +6254,22 @@ function rcube_webmail() else if (!button.status) button.pas = String(obj.className); + button.status = state; + // set image according to button state if (button.type == 'image' && button[state]) { - button.status = state; obj.src = button[state]; } // set class name according to button state else if (button[state] !== undefined) { - button.status = state; obj.className = button[state]; } // disable/enable input buttons if (button.type == 'input') { - button.status = state; - obj.disabled = !state; + obj.disabled = state == 'pas'; + } + else if (button.type == 'uibutton') { + $(obj).button('option', 'disabled', state == 'pas'); } } }; @@ -6184,8 +6355,7 @@ function rcube_webmail() type = type ? type : 'notice'; - var ref = this, - key = this.html_identifier(msg), + var key = this.html_identifier(msg), date = new Date(), id = type + date.getTime(); @@ -6314,7 +6484,7 @@ function rcube_webmail() { // forward call to parent window if (this.is_framed()) { - return parent.rcmail.show_popup_dialog(html, title, buttons); + return parent.rcmail.show_popup_dialog(html, title, buttons, options); } var popup = $('<div class="popup">') @@ -6334,7 +6504,7 @@ function rcube_webmail() popup.dialog('option', { height: Math.min(h - 40, height + 75 + (buttons ? 50 : 0)), - width: Math.min(w - 20, width + 20) + width: Math.min(w - 20, width + 36) }); return popup; @@ -6368,12 +6538,14 @@ function rcube_webmail() this.mark_folder = function(name, class_name, prefix, encode) { $(this.get_folder_li(name, prefix, encode)).addClass(class_name); + this.triggerEvent('markfolder', {folder: name, mark: class_name, status: true}); }; // adds a class to selected folder this.unmark_folder = function(name, class_name, prefix, encode) { $(this.get_folder_li(name, prefix, encode)).removeClass(class_name); + this.triggerEvent('markfolder', {folder: name, mark: class_name, status: false}); }; // helper method to find a folder list item @@ -6390,18 +6562,18 @@ function rcube_webmail() // for reordering column array (Konqueror workaround) // and for setting some message list global variables - this.set_message_coltypes = function(coltypes, repl, smart_col) + this.set_message_coltypes = function(listcols, repl, smart_col) { var list = this.message_list, thead = list ? list.thead : null, - cell, col, n, len, th, tr; + repl, cell, col, n, len, tr; - this.env.coltypes = coltypes; + this.env.listcols = listcols; // replace old column headers if (thead) { if (repl) { - th = document.createElement('thead'); + thead.innerHTML = ''; tr = document.createElement('tr'); for (c=0, len=repl.length; c < len; c++) { @@ -6411,20 +6583,13 @@ function rcube_webmail() if (repl[c].className) cell.className = repl[c].className; tr.appendChild(cell); } - th.appendChild(tr); - thead.parentNode.replaceChild(th, thead); - list.thead = thead = th; + thead.appendChild(tr); } - for (n=0, len=this.env.coltypes.length; n<len; n++) { - col = this.env.coltypes[n]; + for (n=0, len=this.env.listcols.length; n<len; n++) { + col = this.env.listcols[n]; if ((cell = thead.rows[0].cells[n]) && (col == 'from' || col == 'to' || col == 'fromto')) { - cell.id = 'rcm'+col; - $('span,a', cell).text(this.get_label(col == 'fromto' ? smart_col : col)); - // if we have links for sorting, it's a bit more complicated... - $('a', cell).click(function(){ - return rcmail.command('sort', this.id.replace(/^rcm/, ''), this); - }); + $(cell).attr('rel', col).find('span,a').text(this.get_label(col == 'fromto' ? smart_col : col)); } } } @@ -6433,18 +6598,23 @@ function rcube_webmail() this.env.flagged_col = null; this.env.status_col = null; - if ((n = $.inArray('subject', this.env.coltypes)) >= 0) { + if (this.env.coltypes.folder) + this.env.coltypes.folder.hidden = !(this.env.search_request || this.env.search_id) || this.env.search_scope == 'base'; + + if ((n = $.inArray('subject', this.env.listcols)) >= 0) { this.env.subject_col = n; if (list) list.subject_col = n; } - if ((n = $.inArray('flag', this.env.coltypes)) >= 0) + if ((n = $.inArray('flag', this.env.listcols)) >= 0) this.env.flagged_col = n; - if ((n = $.inArray('status', this.env.coltypes)) >= 0) + if ((n = $.inArray('status', this.env.listcols)) >= 0) this.env.status_col = n; - if (list) + if (list) { + list.hide_column('folder', (this.env.coltypes.folder && this.env.coltypes.folder.hidden) || $.inArray('folder', this.env.listcols) < 0); list.init_header(); + } }; // replace content of row count display @@ -6569,12 +6739,13 @@ function rcube_webmail() $(elem).removeClass('show-headers').addClass('hide-headers'); $(this.gui_objects.all_headers_row).show(); - elem.onclick = function() { rcmail.command('hide-headers', '', elem); }; + elem.onclick = function() { ref.command('hide-headers', '', elem); }; // fetch headers only once if (!this.gui_objects.all_headers_box.innerHTML) { - var lock = this.display_message(this.get_label('loading'), 'loading'); - this.http_post('headers', {_uid: this.env.uid}, lock); + this.http_post('headers', {_uid: this.env.uid, _mbox: this.env.mailbox}, + this.display_message(this.get_label('loading'), 'loading') + ); } }; @@ -6586,7 +6757,7 @@ function rcube_webmail() $(elem).removeClass('hide-headers').addClass('show-headers'); $(this.gui_objects.all_headers_row).hide(); - elem.onclick = function() { rcmail.command('show-headers', '', elem); }; + elem.onclick = function() { ref.command('show-headers', '', elem); }; }; // create folder selector popup, position and display it @@ -6667,8 +6838,9 @@ function rcube_webmail() this.element_position = function(element, obj) { var obj = $(obj), win = $(window), - width = obj.width(), - height = obj.height(), + width = obj.outerWidth(), + height = obj.outerHeight(), + menu_pos = obj.data('menu-pos'), win_height = win.height(), elem_height = $(element).height(), elem_width = $(element).width(), @@ -6676,6 +6848,13 @@ function rcube_webmail() top = pos.top, left = pos.left + width; + if (menu_pos == 'bottom') { + top += height; + left -= width; + } + else + left -= 5; + if (top + elem_height > win_height) { top -= elem_height - height; if (top < 0) @@ -6693,28 +6872,50 @@ function rcube_webmail() /********* html to text conversion functions *********/ /********************************************************/ - this.html2plain = function(htmlText, id) + this.html2plain = function(html, func) { - var rcmail = this, - url = '?_task=utils&_action=html2text', - lock = this.set_busy(true, 'converting'); - - this.log('HTTP POST: ' + url); + return this.format_converter(html, 'html', func); + }; - $.ajax({ type: 'POST', url: url, data: htmlText, contentType: 'application/octet-stream', - error: function(o, status, err) { rcmail.http_error(o, status, err, lock); }, - success: function(data) { rcmail.set_busy(false, null, lock); $('#'+id).val(data); rcmail.log(data); } - }); + this.plain2html = function(plain, func) + { + return this.format_converter(plain, 'plain', func); }; - this.plain2html = function(plain, id) + this.format_converter = function(text, format, func) { - var lock = this.set_busy(true, 'converting'); + // warn the user (if converted content is not empty) + if (!text + || (format == 'html' && !(text.replace(/<[^>]+>| |\xC2\xA0|\s/g, '')).length) + || (format != 'html' && !(text.replace(/\xC2\xA0|\s/g, '')).length) + ) { + // without setTimeout() here, textarea is filled with initial (onload) content + if (func) + setTimeout(function() { func(''); }, 50); + return true; + } - plain = plain.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); - $('#'+id).val(plain ? '<pre>'+plain+'</pre>' : ''); + var confirmed = this.env.editor_warned || confirm(this.get_label('editorwarning')); - this.set_busy(false, null, lock); + this.env.editor_warned = true; + + if (!confirmed) + return false; + + var url = '?_task=utils&_action=' + (format == 'html' ? 'html2text' : 'text2html'), + lock = this.set_busy(true, 'converting'); + + this.log('HTTP POST: ' + url); + + $.ajax({ type: 'POST', url: url, data: text, contentType: 'application/octet-stream', + error: function(o, status, err) { ref.http_error(o, status, err, lock); }, + success: function(data) { + ref.set_busy(false, null, lock); + if (func) func(data); + } + }); + + return true; }; @@ -6734,13 +6935,13 @@ function rcube_webmail() if (action) query._action = action; - else + else if (this.env.action) query._action = this.env.action; var base = this.env.comm_path, k, param = {}; // overwrite task name - if (query._action.match(/([a-z0-9_-]+)\/([a-z0-9-_.]+)/)) { + if (action && action.match(/([a-z0-9_-]+)\/([a-z0-9-_.]+)/)) { query._action = RegExp.$2; base = base.replace(/\_task=[a-z0-9_-]+/, '_task='+RegExp.$1); } @@ -6751,7 +6952,7 @@ function rcube_webmail() param[k] = query[k]; } - return base + '&' + $.param(param) + querystring; + return base + (base.indexOf('?') > -1 ? '&' : '?') + $.param(param) + querystring; }; this.redirect = function(url, lock) @@ -6775,7 +6976,7 @@ function rcube_webmail() this.goto_url = function(action, query, lock) { - this.redirect(this.url(action, query)); + this.redirect(this.url(action, query), lock); }; this.location_href = function(url, target, frame) @@ -6972,12 +7173,15 @@ function rcube_webmail() this.env.qsearch = null; case 'list': if (this.task == 'mail') { + var is_multifolder = this.is_multifolder_listing(); this.enable_command('show', 'select-all', 'select-none', this.env.messagecount > 0); - this.enable_command('expunge', this.env.exists); - this.enable_command('purge', this.purge_mailbox_test()); - this.enable_command('expand-all', 'expand-unread', 'collapse-all', this.env.threading && this.env.messagecount); + this.enable_command('expunge', this.env.exists && !is_multifolder); + this.enable_command('purge', this.purge_mailbox_test() && !is_multifolder); + this.enable_command('import-messages', !is_multifolder); + this.enable_command('expand-all', 'expand-unread', 'collapse-all', this.env.threading && this.env.messagecount && !is_multifolder); if ((response.action == 'list' || response.action == 'search') && this.message_list) { + this.enable_command('set-listmode', this.env.threads && !is_multifolder); this.msglist_select(this.message_list); this.triggerEvent('listupdate', { folder:this.env.mailbox, rowcount:this.message_list.rowcount }); } @@ -7022,7 +7226,7 @@ function rcube_webmail() else if (status == 'timeout') this.display_message(this.get_label('requesttimedout'), 'error'); else if (request.status == 0 && status != 'abort') - this.display_message(this.get_label('servererror') + ' (No connection)', 'error'); + this.display_message(this.get_label('connerror'), 'error'); // redirect to url specified in location header if not empty var location_url = request.getResponseHeader("Location"); @@ -7052,7 +7256,7 @@ function rcube_webmail() this.save_compose_form_local(); } else if (redirect_url) { - window.setTimeout(function(){ ref.redirect(redirect_url, true); }, 2000); + setTimeout(function(){ ref.redirect(redirect_url, true); }, 2000); } }; @@ -7065,6 +7269,130 @@ function rcube_webmail() clearTimeout(this.submit_timer); }; + /** + Send multi-threaded parallel HTTP requests to the server for a list if items. + The string '%' in either a GET query or POST parameters will be replaced with the respective item value. + This is the argument object expected: { + items: ['foo','bar','gna'], // list of items to send requests for + action: 'task/some-action', // Roudncube action to call + query: { q:'%s' }, // GET query parameters + postdata: { source:'%s' }, // POST data (sends a POST request if present) + threads: 3, // max. number of concurrent requests + onresponse: function(data){ }, // Callback function called for every response received from server + whendone: function(alldata){ } // Callback function called when all requests have been sent + } + */ + this.multi_thread_http_request = function(prop) + { + var i, item, reqid = new Date().getTime(), + threads = prop.threads || 1; + + prop.reqid = reqid; + prop.running = 0; + prop.requests = []; + prop.result = []; + prop._items = $.extend([], prop.items); // copy items + + if (!prop.lock) + prop.lock = this.display_message(this.get_label('loading'), 'loading'); + + // add the request arguments to the jobs pool + this.http_request_jobs[reqid] = prop; + + // start n threads + for (i=0; i < threads; i++) { + item = prop._items.shift(); + if (item === undefined) + break; + + prop.running++; + prop.requests.push(this.multi_thread_send_request(prop, item)); + } + + return reqid; + }; + + // helper method to send an HTTP request with the given iterator value + this.multi_thread_send_request = function(prop, item) + { + var k, postdata, query; + + // replace %s in post data + if (prop.postdata) { + postdata = {}; + for (k in prop.postdata) { + postdata[k] = String(prop.postdata[k]).replace('%s', item); + } + postdata._reqid = prop.reqid; + } + // replace %s in query + else if (typeof prop.query == 'string') { + query = prop.query.replace('%s', item); + query += '&_reqid=' + prop.reqid; + } + else if (typeof prop.query == 'object' && prop.query) { + query = {}; + for (k in prop.query) { + query[k] = String(prop.query[k]).replace('%s', item); + } + query._reqid = prop.reqid; + } + + // send HTTP GET or POST request + return postdata ? this.http_post(prop.action, postdata) : this.http_request(prop.action, query); + }; + + // callback function for multi-threaded http responses + this.multi_thread_http_response = function(data, reqid) + { + var prop = this.http_request_jobs[reqid]; + if (!prop || prop.running <= 0 || prop.cancelled) + return; + + prop.running--; + + // trigger response callback + if (prop.onresponse && typeof prop.onresponse == 'function') { + prop.onresponse(data); + } + + prop.result = $.extend(prop.result, data); + + // send next request if prop.items is not yet empty + var item = prop._items.shift(); + if (item !== undefined) { + prop.running++; + prop.requests.push(this.multi_thread_send_request(prop, item)); + } + // trigger whendone callback and mark this request as done + else if (prop.running == 0) { + if (prop.whendone && typeof prop.whendone == 'function') { + prop.whendone(prop.result); + } + + this.set_busy(false, '', prop.lock); + + // remove from this.http_request_jobs pool + delete this.http_request_jobs[reqid]; + } + }; + + // abort a running multi-thread request with the given identifier + this.multi_thread_request_abort = function(reqid) + { + var prop = this.http_request_jobs[reqid]; + if (prop) { + for (var i=0; prop.running > 0 && i < prop.requests.length; i++) { + if (prop.requests[i].abort) + prop.requests[i].abort(); + } + + prop.running = 0; + prop.cancelled = true; + this.set_busy(false, '', prop.lock); + } + }; + // post the given form to a hidden iframe this.async_upload_form = function(form, action, onload) { @@ -7115,14 +7443,14 @@ function rcube_webmail() this.document_drag_hover = function(e, over) { e.preventDefault(); - $(ref.gui_objects.filedrop)[(over?'addClass':'removeClass')]('active'); + $(this.gui_objects.filedrop)[(over?'addClass':'removeClass')]('active'); }; this.file_drag_hover = function(e, over) { e.preventDefault(); e.stopPropagation(); - $(ref.gui_objects.filedrop)[(over?'addClass':'removeClass')]('hover'); + $(this.gui_objects.filedrop)[(over?'addClass':'removeClass')]('hover'); }; // handler when files are dropped to a designated area. @@ -7280,7 +7608,7 @@ function rcube_webmail() this.env.lastrefresh = new Date(); // plugins should bind to 'requestrefresh' event to add own params - this.http_request('refresh', params, lock); + this.http_post('refresh', params, lock); }; // returns check-recent request parameters @@ -7342,95 +7670,44 @@ function rcube_webmail() return this.env.cid ? this.env.cid : (this.contact_list ? this.contact_list.get_single_selection() : null); }; + // get the IMP mailbox of the message with the given UID + this.get_message_mailbox = function(uid) + { + var msg = this.env.messages ? this.env.messages[uid] : {}; + return msg.mbox || this.env.mailbox; + }; + // gets cursor position this.get_caret_pos = function(obj) { if (obj.selectionEnd !== undefined) return obj.selectionEnd; - if (document.selection && document.selection.createRange) { - var range = document.selection.createRange(); - if (range.parentElement() != obj) - return 0; - - var gm = range.duplicate(); - if (obj.tagName == 'TEXTAREA') - gm.moveToElementText(obj); - else - gm.expand('textedit'); - - gm.setEndPoint('EndToStart', range); - var p = gm.text.length; - - return p <= obj.value.length ? p : -1; - } - return obj.value.length; }; // moves cursor to specified position this.set_caret_pos = function(obj, pos) { - if (obj.setSelectionRange) - obj.setSelectionRange(pos, pos); - else if (obj.createTextRange) { - var range = obj.createTextRange(); - range.collapse(true); - range.moveEnd('character', pos); - range.moveStart('character', pos); - range.select(); + try { + if (obj.setSelectionRange) + obj.setSelectionRange(pos, pos); } + catch(e) {} // catch Firefox exception if obj is hidden }; // get selected text from an input field - // http://stackoverflow.com/questions/7186586/how-to-get-the-selected-text-in-textarea-using-jquery-in-internet-explorer-7 this.get_input_selection = function(obj) { - var start = 0, end = 0, - normalizedValue, range, - textInputRange, len, endRange; + var start = 0, end = 0, normalizedValue = ''; if (typeof obj.selectionStart == "number" && typeof obj.selectionEnd == "number") { normalizedValue = obj.value; start = obj.selectionStart; end = obj.selectionEnd; } - else { - range = document.selection.createRange(); - - if (range && range.parentElement() == obj) { - len = obj.value.length; - normalizedValue = obj.value; //.replace(/\r\n/g, "\n"); - - // create a working TextRange that lives only in the input - textInputRange = obj.createTextRange(); - textInputRange.moveToBookmark(range.getBookmark()); - - // Check if the start and end of the selection are at the very end - // of the input, since moveStart/moveEnd doesn't return what we want - // in those cases - endRange = obj.createTextRange(); - endRange.collapse(false); - - if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) { - start = end = len; - } - else { - start = -textInputRange.moveStart("character", -len); - start += normalizedValue.slice(0, start).split("\n").length - 1; - - if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) { - end = len; - } - else { - end = -textInputRange.moveEnd("character", -len); - end += normalizedValue.slice(0, end).split("\n").length - 1; - } - } - } - } - return { start:start, end:end, text:normalizedValue.substr(start, end-start) }; + return {start: start, end: end, text: normalizedValue.substr(start, end-start)}; }; // disable/enable all fields of a form @@ -7452,9 +7729,7 @@ function rcube_webmail() // remember which elem was disabled before lock if (lock && elm.disabled) this.disabled_form_elements.push(elm); - // check this.disabled_form_elements before inArray() as a workaround for FF5 bug - // http://bugs.jquery.com/ticket/9873 - else if (lock || (this.disabled_form_elements && $.inArray(elm, this.disabled_form_elements)<0)) + else if (lock || $.inArray(elm, this.disabled_form_elements) < 0) elm.disabled = lock; } }; @@ -7469,20 +7744,26 @@ function rcube_webmail() try { window.navigator.registerProtocolHandler('mailto', this.mailto_handler_uri(), name); } - catch(e) {}; + catch(e) { + this.display_message(String(e), 'error'); + } }; this.check_protocol_handler = function(name, elem) { var nav = window.navigator; - if (!nav - || (typeof nav.registerProtocolHandler != 'function') - || ((typeof nav.isProtocolHandlerRegistered == 'function') - && nav.isProtocolHandlerRegistered('mailto', this.mailto_handler_uri()) == 'registered') - ) - $(elem).addClass('disabled'); - else - $(elem).click(function() { rcmail.register_protocol_handler(name); return false; }); + + if (!nav || (typeof nav.registerProtocolHandler != 'function')) { + $(elem).addClass('disabled').click(function(){ return false; }); + } + else if (typeof nav.isProtocolHandlerRegistered == 'function') { + var status = nav.isProtocolHandlerRegistered('mailto', this.mailto_handler_uri()); + if (status) + $(elem).parent().find('.mailtoprotohandler-status').html(status); + } + else { + $(elem).click(function() { ref.register_protocol_handler(name); return false; }); + } }; // Checks browser capabilities eg. PDF support, TIF support @@ -7519,8 +7800,8 @@ function rcube_webmail() { var img = new Image(); - img.onload = function() { rcmail.env.browser_capabilities.tif = 1; }; - img.onerror = function() { rcmail.env.browser_capabilities.tif = 0; }; + img.onload = function() { ref.env.browser_capabilities.tif = 1; }; + img.onerror = function() { ref.env.browser_capabilities.tif = 0; }; img.src = 'program/resources/blank.tif'; }; @@ -7536,12 +7817,12 @@ function rcube_webmail() if (window.ActiveXObject) { try { - if (axObj = new ActiveXObject("AcroPDF.PDF")) + if (plugin = new ActiveXObject("AcroPDF.PDF")) return 1; } catch (e) {} try { - if (axObj = new ActiveXObject("PDF.PdfCtrl")) + if (plugin = new ActiveXObject("PDF.PdfCtrl")) return 1; } catch (e) {} @@ -7569,7 +7850,7 @@ function rcube_webmail() if (window.ActiveXObject) { try { - if (axObj = new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) + if (plugin = new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) return 1; } catch (e) {} @@ -7595,7 +7876,6 @@ function rcube_webmail() // wrapper for localStorage.getItem(key) this.local_storage_get_item = function(key, deflt, encrypted) { - // TODO: add encryption var item = localStorage.getItem(this.get_local_storage_prefix() + key); return item !== null ? JSON.parse(item) : (deflt || null); @@ -7622,12 +7902,12 @@ rcube_webmail.long_subject_title = function(elem, indent) { if (!elem.title) { var $elem = $(elem); - if ($elem.width() + indent * 15 > $elem.parent().width()) + if ($elem.width() + (indent || 0) * 15 > $elem.parent().width()) elem.title = $elem.text(); } }; -rcube_webmail.long_subject_title_ex = function(elem, indent) +rcube_webmail.long_subject_title_ex = function(elem) { if (!elem.title) { var $elem = $(elem), @@ -7639,7 +7919,7 @@ rcube_webmail.long_subject_title_ex = function(elem, indent) w = tmp.width(); tmp.remove(); - if (w + indent * 15 > $elem.width()) + if (w + $('span.branch', $elem).width() * 15 > $elem.width()) elem.title = txt; } }; diff --git a/program/js/common.js b/program/js/common.js index 9c0bb9db3..48e85558f 100644 --- a/program/js/common.js +++ b/program/js/common.js @@ -1,18 +1,30 @@ -/* - +-----------------------------------------------------------------------+ - | Roundcube common js library | - | | - | This file is part of the Roundcube web development suite | - | Copyright (C) 2005-2012, The Roundcube Dev Team | - | | - | Licensed under the GNU General Public License version 3 or | - | any later version with exceptions for skins & plugins. | - | See the README file for a full license statement. | - | | - +-----------------------------------------------------------------------+ - | Author: Thomas Bruederli <roundcube@gmail.com> | - +-----------------------------------------------------------------------+ -*/ +/** + * Roundcube common js library + * + * This file is part of the Roundcube Webmail client + * + * @licstart The following is the entire license notice for the + * JavaScript code in this file. + * + * Copyright (c) 2005-2014, The Roundcube Dev Team + * + * The JavaScript code in this page is free software: you can + * redistribute it and/or modify it under the terms of the GNU + * General Public License (GNU GPL) as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) + * any later version. The code is distributed WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. + * + * As additional permission under GNU GPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * @licend The above is the entire license notice + * for the JavaScript code in this file. + */ // Constants var CONTROL_KEY = 1; @@ -49,27 +61,30 @@ function roundcube_browser() this.dom = document.getElementById ? true : false; this.dom2 = document.addEventListener && document.removeEventListener; + this.webkit = this.agent_lc.indexOf('applewebkit') > 0; this.ie = (document.all && !window.opera) || (this.win && this.agent_lc.indexOf('trident/') > 0); if (this.ie) { - this.ie6 = this.appver.indexOf('MSIE 6') > 0; this.ie7 = this.appver.indexOf('MSIE 7') > 0; this.ie8 = this.appver.indexOf('MSIE 8') > 0; this.ie9 = this.appver.indexOf('MSIE 9') > 0; } + else if (window.opera) { + this.opera = true; + this.vendver = opera.version(); + } else { this.chrome = this.agent_lc.indexOf('chrome') > 0; - this.safari = !this.chrome && (this.agent_lc.indexOf('safari') > 0 || this.agent_lc.indexOf('applewebkit') > 0); + this.safari = !this.chrome && (this.webkit || this.agent_lc.indexOf('safari') > 0); this.konq = this.agent_lc.indexOf('konqueror') > 0; this.mz = this.dom && !this.chrome && !this.safari && !this.konq && this.agent.indexOf('Mozilla') >= 0; this.iphone = this.safari && (this.agent_lc.indexOf('iphone') > 0 || this.agent_lc.indexOf('ipod') > 0); this.ipad = this.safari && this.agent_lc.indexOf('ipad') > 0; - this.opera = window.opera ? true : false; } if (!this.vendver) { // common version strings - this.vendver = /(khtml|chrome|safari|applewebkit|opera|msie)(\s|\/)([0-9\.]+)/.test(this.agent_lc) ? parseFloat(RegExp.$3) : 0; + this.vendver = /(opera|opr|khtml|chrome|safari|applewebkit|msie)(\s|\/)([0-9\.]+)/.test(this.agent_lc) ? parseFloat(RegExp.$3) : 0; // any other (Mozilla, Camino, IE>=11) if (!this.vendver) @@ -116,7 +131,7 @@ function roundcube_browser() classname += ' iphone'; else if (this.ipad) classname += ' ipad'; - else if (this.safari || this.chrome) + else if (this.webkit) classname += ' webkit'; if (this.mobile) @@ -209,7 +224,7 @@ add_listener: function(p) p.element = document; if (!p.object._rc_events) - p.object._rc_events = []; + p.object._rc_events = {}; var key = p.event + '*' + p.method; if (!p.object._rc_events[key]) @@ -252,13 +267,17 @@ remove_listener: function(p) cancel: function(evt) { var e = evt ? evt : window.event; + if (e.preventDefault) e.preventDefault(); + else + e.returnValue = false; + if (e.stopPropagation) e.stopPropagation(); e.cancelBubble = true; - e.returnValue = false; + return false; }, @@ -323,13 +342,17 @@ removeEventListener: function(evt, func, obj) triggerEvent: function(evt, e) { var ret, h; + if (e === undefined) e = this; else if (typeof e === 'object') e.event = evt; - if (this._events && this._events[evt] && !this._event_exec) { - this._event_exec = true; + if (!this._event_exec) + this._event_exec = {}; + + if (this._events && this._events[evt] && !this._event_exec[evt]) { + this._event_exec[evt] = true; for (var i=0; i < this._events[evt].length; i++) { if ((h = this._events[evt][i])) { if (typeof h.func === 'function') @@ -352,7 +375,8 @@ triggerEvent: function(evt, e) } } - this._event_exec = false; + delete this._event_exec[evt]; + if (e.event) { try { delete e.event; @@ -448,21 +472,25 @@ function urlencode(str) function rcube_find_object(id, d) { var n, f, obj, e; - if(!d) d = document; - if(d.getElementsByName && (e = d.getElementsByName(id))) + if (!d) d = document; + + if (d.getElementById) + if (obj = d.getElementById(id)) + return obj; + + if (!obj && d.getElementsByName && (e = d.getElementsByName(id))) obj = e[0]; - if(!obj && d.getElementById) - obj = d.getElementById(id); - if(!obj && d.all) + + if (!obj && d.all) obj = d.all[id]; - if(!obj && d.images.length) + if (!obj && d.images.length) obj = d.images[id]; if (!obj && d.forms.length) { for (f=0; f<d.forms.length; f++) { - if(d.forms[f].name == id) + if (d.forms[f].name == id) obj = d.forms[f]; else if(d.forms[f].elements[id]) obj = d.forms[f].elements[id]; @@ -470,7 +498,8 @@ function rcube_find_object(id, d) } if (!obj && d.layers) { - if (d.layers[id]) obj = d.layers[id]; + if (d.layers[id]) + obj = d.layers[id]; for (n=0; !obj && n<d.layers.length; n++) obj = rcube_find_object(id, d.layers[n].document); } @@ -484,8 +513,8 @@ function rcube_mouse_is_over(ev, obj) var mouse = rcube_event.get_mouse_pos(ev), pos = $(obj).offset(); - return ((mouse.x >= pos.left) && (mouse.x < (pos.left + obj.offsetWidth)) && - (mouse.y >= pos.top) && (mouse.y < (pos.top + obj.offsetHeight))); + return (mouse.x >= pos.left) && (mouse.x < (pos.left + obj.offsetWidth)) && + (mouse.y >= pos.top) && (mouse.y < (pos.top + obj.offsetHeight)); }; @@ -497,6 +526,7 @@ function setCookie(name, value, expires, path, domain, secure) (path ? "; path=" + path : "") + (domain ? "; domain=" + domain : "") + (secure ? "; secure" : ""); + document.cookie = curCookie; }; @@ -526,36 +556,6 @@ function getCookie(name) roundcube_browser.prototype.set_cookie = setCookie; roundcube_browser.prototype.get_cookie = getCookie; -// tiny replacement for Firebox functionality -function rcube_console() -{ - this.log = function(msg) - { - var box = rcube_find_object('dbgconsole'); - - if (box) { - if (msg.charAt(msg.length-1)=='\n') - msg += '--------------------------------------\n'; - else - msg += '\n--------------------------------------\n'; - - // Konqueror doesn't allow to just change the value of hidden element - if (bw.konq) { - box.innerText += msg; - box.value = box.innerText; - } else - box.value += msg; - } - }; - - this.reset = function() - { - var box = rcube_find_object('dbgconsole'); - if (box) - box.innerText = box.value = ''; - }; -}; - var bw = new roundcube_browser(); bw.set_html_class(); @@ -593,20 +593,6 @@ if (!String.prototype.startsWith) { }; } -// Make getElementById() case-sensitive on IE -if (bw.ie) { - document._getElementById = document.getElementById; - document.getElementById = function(id) { - var i = 0, obj = document._getElementById(id); - - if (obj && obj.id != id) - while ((obj = document.all[i]) && obj.id != id) - i++; - - return obj; - } -} - // jQuery plugin to emulate HTML5 placeholder attributes on input elements jQuery.fn.placeholder = function(text) { return this.each(function() { diff --git a/program/js/editor.js b/program/js/editor.js index 6cd68ccaf..deef8c8d1 100644 --- a/program/js/editor.js +++ b/program/js/editor.js @@ -1,18 +1,32 @@ -/* - +-----------------------------------------------------------------------+ - | Roundcube editor js library | - | | - | This file is part of the Roundcube web development suite | - | Copyright (C) 2006-2012, The Roundcube Dev Team | - | | - | Licensed under the GNU General Public License version 3 or | - | any later version with exceptions for skins & plugins. | - | See the README file for a full license statement. | - | | - +-----------------------------------------------------------------------+ - | Author: Eric Stadtherr <estadtherr@gmail.com> | - +-----------------------------------------------------------------------+ -*/ +/** + * Roundcube editor js library + * + * This file is part of the Roundcube Webmail client + * + * @licstart The following is the entire license notice for the + * JavaScript code in this file. + * + * Copyright (c) 2006-2014, The Roundcube Dev Team + * + * The JavaScript code in this page is free software: you can + * redistribute it and/or modify it under the terms of the GNU + * General Public License (GNU GPL) as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) + * any later version. The code is distributed WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. + * + * As additional permission under GNU GPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * @licend The above is the entire license notice + * for the JavaScript code in this file. + * + * @author Eric Stadtherr <estadtherr@gmail.com> + */ // Initialize HTML editor function rcmail_editor_init(config) @@ -21,7 +35,7 @@ function rcmail_editor_init(config) selector: '.mce_editor', theme: 'modern', language: config.lang, - content_css: config.skin_path + '/editor_content.css', + content_css: config.skin_path + '/editor_content.css?v2', menubar: false, statusbar: false, toolbar_items_size: 'small', diff --git a/program/js/googiespell.js b/program/js/googiespell.js index 9832116dd..707efd165 100644 --- a/program/js/googiespell.js +++ b/program/js/googiespell.js @@ -1,23 +1,36 @@ -/* - +-----------------------------------------------------------------------+ - | Roundcube SpellCheck script | - | jQuery'fied spell checker based on GoogieSpell 4.0 | - | (which was published under GPL "version 2 or any later version") | - | | - | This file is part of the Roundcube Webmail client | - | Copyright (C) 2006 Amir Salihefendic | - | Copyright (C) 2009 The Roundcube Dev Team | - | Copyright (C) 2011 Kolab Systems AG | - | | - | Licensed under the GNU General Public License version 3 or | - | any later version with exceptions for skins & plugins. | - | See the README file for a full license statement. | - | | - +-----------------------------------------------------------------------+ - | Authors: 4mir Salihefendic <amix@amix.dk> | - | Aleksander Machniak - <alec [at] alec.pl> | - +-----------------------------------------------------------------------+ -*/ +/** + * Roundcube SpellCheck script + * + * jQuery'fied spell checker based on GoogieSpell 4.0 + * (which was published under GPL "version 2 or any later version") + * + * @licstart The following is the entire license notice for the + * JavaScript code in this file. + * + * Copyright (C) 2006 Amir Salihefendic + * Copyright (C) 2009 The Roundcube Dev Team + * Copyright (C) 2011 Kolab Systems AG + * + * The JavaScript code in this page is free software: you can + * redistribute it and/or modify it under the terms of the GNU + * General Public License (GNU GPL) as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) + * any later version. The code is distributed WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. + * + * As additional permission under GNU GPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * @licend The above is the entire license notice + * for the JavaScript code in this file. + * + * @author 4mir Salihefendic <amix@amix.dk> + * @author Aleksander Machniak - <alec [at] alec.pl> + */ var GOOGIE_CUR_LANG, GOOGIE_DEFAULT_LANG = 'en'; @@ -289,6 +302,7 @@ this.prepare = function(ignore, no_indicator) this.cnt_errors_fixed = 0; this.cnt_errors = 0; this.setStateChanged('checking_spell'); + this.orginal_text = ''; if (!no_indicator && this.main_controller) this.appendIndicator(this.spell_span); @@ -524,7 +538,7 @@ this.showErrorWindow = function(elm, id) $(dummy).html(suggestions[i]); $(item).mouseover(this.item_onmouseover).mouseout(this.item_onmouseout) - .click(function(e) { ref.correctError(id, elm, e.target.firstChild) }); + .click(function(e) { ref.correctError(id, elm, e.target.firstChild) }); item.appendChild(dummy); row.appendChild(item); @@ -565,14 +579,15 @@ this.showErrorWindow = function(elm, id) ref.saveOldValue(elm, elm.innerHTML); ref.updateOrginalText(offset, elm.innerHTML, edit_input.value, id); - $(elm).attr('is_corrected', true).css('color', 'green').html(edit_input.value); + $(elm).attr('is_corrected', true).css('color', 'green').text(edit_input.value); ref.hideErrorWindow(); } return false; }; - $(edit_input).width(120).css({'margin': 0, 'padding': 0}); - $(edit_input).val(elm.innerHTML).attr('googie_action_btn', '1'); + $(edit_input).width(120) + .css({'margin': 0, 'padding': 0}) + .val($(elm).text()).attr('googie_action_btn', '1'); $(edit).css('cursor', 'default').attr('googie_action_btn', '1'); $(ok_pic).attr('src', this.img_dir + 'ok.gif') diff --git a/program/js/jquery.min.js b/program/js/jquery.min.js index 83589daa7..d8d4556b6 100644 --- a/program/js/jquery.min.js +++ b/program/js/jquery.min.js @@ -1,2 +1,36 @@ -/*! jQuery v1.8.3 jquery.com | jquery.org/license */
-(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window);
\ No newline at end of file +/*! + * jQuery JavaScript Library v2.1.1 + * http://jquery.com/ + * + * @licstart The following is the entire license notice for the + * JavaScript code in this file. + * + * Copyright 2005, 2014 jQuery Foundation and other contributors + * + * Licensed under the MIT licenses + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * @licend The above is the entire license notice + * for the JavaScript code in this file. + */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+Math.random()}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b) +},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ab=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ib={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qb[0].contentDocument,b.write(),b.close(),c=sb(a,b),qb.detach()),rb[a]=c),c}var ub=/^margin/,vb=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)};function xb(a,b,c){var d,e,f,g,h=a.style;return c=c||wb(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),vb.test(g)&&ub.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function yb(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var zb=/^(none|table(?!-c[ea]).+)/,Ab=new RegExp("^("+Q+")(.*)$","i"),Bb=new RegExp("^([+-])=("+Q+")","i"),Cb={position:"absolute",visibility:"hidden",display:"block"},Db={letterSpacing:"0",fontWeight:"400"},Eb=["Webkit","O","Moz","ms"];function Fb(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Eb.length;while(e--)if(b=Eb[e]+c,b in a)return b;return d}function Gb(a,b,c){var d=Ab.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Hb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ib(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wb(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xb(a,b,f),(0>e||null==e)&&(e=a.style[b]),vb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Hb(a,b,c||(g?"border":"content"),d,f)+"px"}function Jb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",tb(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Bb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xb(a,b,d)),"normal"===e&&b in Db&&(e=Db[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?zb.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Cb,function(){return Ib(a,b,d)}):Ib(a,b,d):void 0},set:function(a,c,d){var e=d&&wb(a);return Gb(a,c,d?Hb(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=yb(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ub.test(a)||(n.cssHooks[a+b].set=Gb)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Jb(this,!0)},hide:function(){return Jb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Kb(a,b,c,d,e){return new Kb.prototype.init(a,b,c,d,e)}n.Tween=Kb,Kb.prototype={constructor:Kb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Kb.propHooks[this.prop];return a&&a.get?a.get(this):Kb.propHooks._default.get(this)},run:function(a){var b,c=Kb.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Kb.propHooks._default.set(this),this}},Kb.prototype.init.prototype=Kb.prototype,Kb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Kb.propHooks.scrollTop=Kb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Kb.prototype.init,n.fx.step={};var Lb,Mb,Nb=/^(?:toggle|show|hide)$/,Ob=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pb=/queueHooks$/,Qb=[Vb],Rb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Ob.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Ob.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sb(){return setTimeout(function(){Lb=void 0}),Lb=n.now()}function Tb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ub(a,b,c){for(var d,e=(Rb[b]||[]).concat(Rb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Vb(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||tb(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Nb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?tb(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ub(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xb(a,b,c){var d,e,f=0,g=Qb.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Lb||Sb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:Lb||Sb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wb(k,j.opts.specialEasing);g>f;f++)if(d=Qb[f].call(j,a,k,j.opts))return d;return n.map(k,Ub,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xb,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Rb[c]=Rb[c]||[],Rb[c].unshift(b)},prefilter:function(a,b){b?Qb.unshift(a):Qb.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xb(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Tb(b,!0),a,d,e)}}),n.each({slideDown:Tb("show"),slideUp:Tb("hide"),slideToggle:Tb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Lb=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Lb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Mb||(Mb=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Mb),Mb=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Yb,Zb,$b=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Zb:Yb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b)) +},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||n.find.attr;$b[b]=function(a,b,d){var e,f;return d||(f=$b[b],$b[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$b[b]=f),e}});var _b=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_b.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ac=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ac," ").indexOf(b)>=0)return!0;return!1}});var bc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cc=n.now(),dc=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var ec,fc,gc=/#.*$/,hc=/([?&])_=[^&]*/,ic=/^(.*?):[ \t]*([^\r\n]*)$/gm,jc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,kc=/^(?:GET|HEAD)$/,lc=/^\/\//,mc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,nc={},oc={},pc="*/".concat("*");try{fc=location.href}catch(qc){fc=l.createElement("a"),fc.href="",fc=fc.href}ec=mc.exec(fc.toLowerCase())||[];function rc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function sc(a,b,c,d){var e={},f=a===oc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function tc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function uc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function vc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:fc,type:"GET",isLocal:jc.test(ec[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":pc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?tc(tc(a,n.ajaxSettings),b):tc(n.ajaxSettings,a)},ajaxPrefilter:rc(nc),ajaxTransport:rc(oc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=ic.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||fc)+"").replace(gc,"").replace(lc,ec[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=mc.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===ec[1]&&h[2]===ec[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(ec[3]||("http:"===ec[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),sc(nc,k,b,v),2===t)return v;i=k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!kc.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(dc.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=hc.test(d)?d.replace(hc,"$1_="+cc++):d+(dc.test(d)?"&":"?")+"_="+cc++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+pc+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=sc(oc,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=uc(k,v,f)),u=vc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var wc=/%20/g,xc=/\[\]$/,yc=/\r?\n/g,zc=/^(?:submit|button|image|reset|file)$/i,Ac=/^(?:input|select|textarea|keygen)/i;function Bc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||xc.test(a)?d(a,e):Bc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Bc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Bc(c,a[c],b,e);return d.join("&").replace(wc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Ac.test(this.nodeName)&&!zc.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(yc,"\r\n")}}):{name:b.name,value:c.replace(yc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Cc=0,Dc={},Ec={0:200,1223:204},Fc=n.ajaxSettings.xhr();a.ActiveXObject&&n(a).on("unload",function(){for(var a in Dc)Dc[a]()}),k.cors=!!Fc&&"withCredentials"in Fc,k.ajax=Fc=!!Fc,n.ajaxTransport(function(a){var b;return k.cors||Fc&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Cc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Dc[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Ec[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Dc[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Gc=[],Hc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Gc.pop()||n.expando+"_"+cc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Hc.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Hc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Hc,"$1"+e):b.jsonp!==!1&&(b.url+=(dc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Gc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Ic=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Ic)return Ic.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Jc=a.document.documentElement;function Kc(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Kc(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Jc;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Jc})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Kc(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=yb(k.pixelPosition,function(a,c){return c?(c=xb(a,b),vb.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Lc=a.jQuery,Mc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Mc),b&&a.jQuery===n&&(a.jQuery=Lc),n},typeof b===U&&(a.jQuery=a.$=n),n}); diff --git a/program/js/jstz.min.js b/program/js/jstz.min.js index d5f888cac..e8b81f2f2 100644 --- a/program/js/jstz.min.js +++ b/program/js/jstz.min.js @@ -1,2 +1,35 @@ -/*! jsTimezoneDetect - v1.0.5 - 2013-04-01 */ +/** + * jsTimezoneDetect - v1.0.5 - 2013-04-01 + * + * @source https://bitbucket.org/pellepim/jstimezonedetect/src/f9e3e30e1e1f53dd27cd0f73eb51a7e7caf7b378/jstz.js + * + * @licstart The following is the entire license notice for the + * JavaScript code in this file. + * + * Copyright (c) Copyright (c) Jon Nylander + * + * Licensed under the MIT licenses + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * @licend The above is the entire license notice + * for the JavaScript code in this file. + */ (function(e){var t=function(){"use strict";var e="s",n=2011,r=function(e){var t=-e.getTimezoneOffset();return t!==null?t:0},i=function(e,t,n){var r=new Date;return e!==undefined&&r.setFullYear(e),r.setDate(n),r.setMonth(t),r},s=function(e){return r(i(e,0,2))},o=function(e){return r(i(e,5,2))},u=function(e){var t=e.getMonth()>7?o(e.getFullYear()):s(e.getFullYear()),n=r(e);return t-n!==0},a=function(){var t=s(n),r=o(n),i=t-r;return i<0?t+",1":i>0?r+",1,"+e:t+",0"},f=function(){var e=a();return new t.TimeZone(t.olson.timezones[e])},l=function(e){var t=new Date(2010,6,15,1,0,0,0),n={"America/Denver":new Date(2011,2,13,3,0,0,0),"America/Mazatlan":new Date(2011,3,3,3,0,0,0),"America/Chicago":new Date(2011,2,13,3,0,0,0),"America/Mexico_City":new Date(2011,3,3,3,0,0,0),"America/Asuncion":new Date(2012,9,7,3,0,0,0),"America/Santiago":new Date(2012,9,3,3,0,0,0),"America/Campo_Grande":new Date(2012,9,21,5,0,0,0),"America/Montevideo":new Date(2011,9,2,3,0,0,0),"America/Sao_Paulo":new Date(2011,9,16,5,0,0,0),"America/Los_Angeles":new Date(2011,2,13,8,0,0,0),"America/Santa_Isabel":new Date(2011,3,5,8,0,0,0),"America/Havana":new Date(2012,2,10,2,0,0,0),"America/New_York":new Date(2012,2,10,7,0,0,0),"Asia/Beirut":new Date(2011,2,27,1,0,0,0),"Europe/Helsinki":new Date(2011,2,27,4,0,0,0),"Europe/Istanbul":new Date(2011,2,28,5,0,0,0),"Asia/Damascus":new Date(2011,3,1,2,0,0,0),"Asia/Jerusalem":new Date(2011,3,1,6,0,0,0),"Asia/Gaza":new Date(2009,2,28,0,30,0,0),"Africa/Cairo":new Date(2009,3,25,0,30,0,0),"Pacific/Auckland":new Date(2011,8,26,7,0,0,0),"Pacific/Fiji":new Date(2010,10,29,23,0,0,0),"America/Halifax":new Date(2011,2,13,6,0,0,0),"America/Goose_Bay":new Date(2011,2,13,2,1,0,0),"America/Miquelon":new Date(2011,2,13,5,0,0,0),"America/Godthab":new Date(2011,2,27,1,0,0,0),"Europe/Moscow":t,"Asia/Yekaterinburg":t,"Asia/Omsk":t,"Asia/Krasnoyarsk":t,"Asia/Irkutsk":t,"Asia/Yakutsk":t,"Asia/Vladivostok":t,"Asia/Kamchatka":t,"Europe/Minsk":t,"Pacific/Apia":new Date(2010,10,1,1,0,0,0),"Australia/Perth":new Date(2008,10,1,1,0,0,0)};return n[e]};return{determine:f,date_is_dst:u,dst_start_for:l}}();t.TimeZone=function(e){"use strict";var n={"America/Denver":["America/Denver","America/Mazatlan"],"America/Chicago":["America/Chicago","America/Mexico_City"],"America/Santiago":["America/Santiago","America/Asuncion","America/Campo_Grande"],"America/Montevideo":["America/Montevideo","America/Sao_Paulo"],"Asia/Beirut":["Asia/Beirut","Europe/Helsinki","Europe/Istanbul","Asia/Damascus","Asia/Jerusalem","Asia/Gaza"],"Pacific/Auckland":["Pacific/Auckland","Pacific/Fiji"],"America/Los_Angeles":["America/Los_Angeles","America/Santa_Isabel"],"America/New_York":["America/Havana","America/New_York"],"America/Halifax":["America/Goose_Bay","America/Halifax"],"America/Godthab":["America/Miquelon","America/Godthab"],"Asia/Dubai":["Europe/Moscow"],"Asia/Dhaka":["Asia/Yekaterinburg"],"Asia/Jakarta":["Asia/Omsk"],"Asia/Shanghai":["Asia/Krasnoyarsk","Australia/Perth"],"Asia/Tokyo":["Asia/Irkutsk"],"Australia/Brisbane":["Asia/Yakutsk"],"Pacific/Noumea":["Asia/Vladivostok"],"Pacific/Tarawa":["Asia/Kamchatka"],"Pacific/Tongatapu":["Pacific/Apia"],"Africa/Johannesburg":["Asia/Gaza","Africa/Cairo"],"Asia/Baghdad":["Europe/Minsk"]},r=e,i=function(){var e=n[r],i=e.length,s=0,o=e[0];for(;s<i;s+=1){o=e[s];if(t.date_is_dst(t.dst_start_for(o))){r=o;return}}},s=function(){return typeof n[r]!="undefined"};return s()&&i(),{name:function(){return r}}},t.olson={},t.olson.timezones={"-720,0":"Pacific/Majuro","-660,0":"Pacific/Pago_Pago","-600,1":"America/Adak","-600,0":"Pacific/Honolulu","-570,0":"Pacific/Marquesas","-540,0":"Pacific/Gambier","-540,1":"America/Anchorage","-480,1":"America/Los_Angeles","-480,0":"Pacific/Pitcairn","-420,0":"America/Phoenix","-420,1":"America/Denver","-360,0":"America/Guatemala","-360,1":"America/Chicago","-360,1,s":"Pacific/Easter","-300,0":"America/Bogota","-300,1":"America/New_York","-270,0":"America/Caracas","-240,1":"America/Halifax","-240,0":"America/Santo_Domingo","-240,1,s":"America/Santiago","-210,1":"America/St_Johns","-180,1":"America/Godthab","-180,0":"America/Argentina/Buenos_Aires","-180,1,s":"America/Montevideo","-120,0":"America/Noronha","-120,1":"America/Noronha","-60,1":"Atlantic/Azores","-60,0":"Atlantic/Cape_Verde","0,0":"UTC","0,1":"Europe/London","60,1":"Europe/Berlin","60,0":"Africa/Lagos","60,1,s":"Africa/Windhoek","120,1":"Asia/Beirut","120,0":"Africa/Johannesburg","180,0":"Asia/Baghdad","180,1":"Europe/Moscow","210,1":"Asia/Tehran","240,0":"Asia/Dubai","240,1":"Asia/Baku","270,0":"Asia/Kabul","300,1":"Asia/Yekaterinburg","300,0":"Asia/Karachi","330,0":"Asia/Kolkata","345,0":"Asia/Kathmandu","360,0":"Asia/Dhaka","360,1":"Asia/Omsk","390,0":"Asia/Rangoon","420,1":"Asia/Krasnoyarsk","420,0":"Asia/Jakarta","480,0":"Asia/Shanghai","480,1":"Asia/Irkutsk","525,0":"Australia/Eucla","525,1,s":"Australia/Eucla","540,1":"Asia/Yakutsk","540,0":"Asia/Tokyo","570,0":"Australia/Darwin","570,1,s":"Australia/Adelaide","600,0":"Australia/Brisbane","600,1":"Asia/Vladivostok","600,1,s":"Australia/Sydney","630,1,s":"Australia/Lord_Howe","660,1":"Asia/Kamchatka","660,0":"Pacific/Noumea","690,0":"Pacific/Norfolk","720,1,s":"Pacific/Auckland","720,0":"Pacific/Tarawa","765,1,s":"Pacific/Chatham","780,0":"Pacific/Tongatapu","780,1,s":"Pacific/Apia","840,0":"Pacific/Kiritimati"},typeof exports!="undefined"?exports.jstz=t:e.jstz=t})(this);
\ No newline at end of file diff --git a/program/js/list.js b/program/js/list.js index 022ed3180..04aec1c99 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -1,21 +1,35 @@ -/* - +-----------------------------------------------------------------------+ - | Roundcube List Widget | - | | - | This file is part of the Roundcube Webmail client | - | Copyright (C) 2006-2013, The Roundcube Dev Team | - | | - | Licensed under the GNU General Public License version 3 or | - | any later version with exceptions for skins & plugins. | - | See the README file for a full license statement. | - | | - +-----------------------------------------------------------------------+ - | Authors: Thomas Bruederli <roundcube@gmail.com> | - | Charles McNulty <charles@charlesmcnulty.com> | - +-----------------------------------------------------------------------+ - | Requires: common.js | - +-----------------------------------------------------------------------+ -*/ +/** + * Roundcube List Widget + * + * This file is part of the Roundcube Webmail client + * + * @licstart The following is the entire license notice for the + * JavaScript code in this file. + * + * Copyright (c) 2005-2014, The Roundcube Dev Team + * + * The JavaScript code in this page is free software: you can + * redistribute it and/or modify it under the terms of the GNU + * General Public License (GNU GPL) as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) + * any later version. The code is distributed WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. + * + * As additional permission under GNU GPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * @licend The above is the entire license notice + * for the JavaScript code in this file. + * + * @author Thomas Bruederli <roundcube@gmail.com> + * @author Charles McNulty <charles@charlesmcnulty.com> + * + * @requires jquery.js, common.js + */ /** @@ -107,11 +121,11 @@ init: function() */ init_row: function(row) { + row.uid = this.get_row_uid(row); + // make references in internal array and set event handlers - if (row && String(row.id).match(this.id_regexp)) { - var self = this, - uid = RegExp.$1; - row.uid = uid; + if (row && row.uid) { + var self = this, uid = row.uid; this.rows[uid] = {uid:uid, id:row.id, obj:row}; // set eventhandlers to table row @@ -195,6 +209,12 @@ init_fixed_header: function() var me = this; $(window).resize(function(){ me.resize() }); + $(window).scroll(function(){ + var w = $(window); + me.fixed_header.css('marginLeft', (-w.scrollLeft()) + 'px'); + if (!bw.webkit) + me.fixed_header.css('marginTop', (-w.scrollTop()) + 'px'); + }); } else { $(this.fixed_header).find('thead').replaceWith(clone); @@ -221,6 +241,8 @@ resize: function() $(this.thead).find('tr td').each(function(index) { $(this).css('width', column_widths[index]); }); + + $(window).scroll(); }, /** @@ -291,12 +313,15 @@ insert_row: function(row, before) if (row.id) domrow.id = row.id; if (row.className) domrow.className = row.className; if (row.style) $.extend(domrow.style, row.style); + if (row.uid) $(domrow).data('uid', String(row.uid)); // #1489906 - for (var domcell, col, i=0; row.cols && i < row.cols.length; i++) { + for (var e, domcell, col, i=0; row.cols && i < row.cols.length; i++) { col = row.cols[i]; domcell = document.createElement(this.col_tagname()); if (col.className) domcell.className = col.className; if (col.innerHTML) domcell.innerHTML = col.innerHTML; + for (e in col.events) + domcell['on' + e] = col.events[e]; domrow.appendChild(domcell); } @@ -357,7 +382,7 @@ focus: function(e) // Un-focus already focused elements (#1487123, #1487316, #1488600, #1488620) // It looks that window.focus() does the job for all browsers, but not Firefox (#1489058) - $(':focus:not(body)').blur(); + $('iframe,:focus:not(body)').blur(); window.focus(); if (e || (e = window.event)) @@ -382,6 +407,20 @@ blur: function() /** + * Set/unset the given column as hidden + */ +hide_column: function(col, hide) +{ + var method = hide ? 'addClass' : 'removeClass'; + + if (this.fixed_header) + $(this.row_tagname()+' '+this.col_tagname()+'.'+col, this.fixed_header)[method]('hidden'); + + $(this.row_tagname()+' '+this.col_tagname()+'.'+col, this.list)[method]('hidden'); +}, + + +/** * onmousedown-handler of message list column */ drag_column: function(e, col) @@ -575,7 +614,7 @@ expand: function(row) row.expanded = true; depth = row.depth; new_row = row.obj.nextSibling; - this.update_expando(row.uid, true); + this.update_expando(row.id, true); this.triggerEvent('expandcollapse', { uid:row.uid, expanded:row.expanded, obj:row.obj }); } else { @@ -625,7 +664,7 @@ collapse_all: function(row) row.expanded = false; depth = row.depth; new_row = row.obj.nextSibling; - this.update_expando(row.uid); + this.update_expando(row.id); this.triggerEvent('expandcollapse', { uid:row.uid, expanded:row.expanded, obj:row.obj }); // don't collapse sub-root tree in multiexpand mode @@ -647,7 +686,7 @@ collapse_all: function(row) $(new_row).css('display', 'none'); if (r.has_children && r.expanded) { r.expanded = false; - this.update_expando(r.uid, false); + this.update_expando(r.id, false); this.triggerEvent('expandcollapse', { uid:r.uid, expanded:r.expanded, obj:new_row }); } } @@ -669,7 +708,7 @@ expand_all: function(row) row.expanded = true; depth = row.depth; new_row = row.obj.nextSibling; - this.update_expando(row.uid, true); + this.update_expando(row.id, true); this.triggerEvent('expandcollapse', { uid:row.uid, expanded:row.expanded, obj:row.obj }); } else { @@ -686,7 +725,7 @@ expand_all: function(row) $(new_row).css('display', ''); if (r.has_children && !r.expanded) { r.expanded = true; - this.update_expando(r.uid, true); + this.update_expando(r.id, true); this.triggerEvent('expandcollapse', { uid:r.uid, expanded:r.expanded, obj:new_row }); } } @@ -700,13 +739,26 @@ expand_all: function(row) }, -update_expando: function(uid, expanded) +update_expando: function(id, expanded) { - var expando = document.getElementById('rcmexpando' + uid); + var expando = document.getElementById('rcmexpando' + id); if (expando) expando.className = expanded ? 'expanded' : 'collapsed'; }, +get_row_uid: function(row) +{ + if (row && row.uid) + return row.uid; + + var uid; + if (row && (uid = $(row).data('uid'))) + row.uid = uid; + else if (row && String(row.id).match(this.id_regexp)) + row.uid = RegExp.$1; + + return row.uid; +}, /** * get first/next/previous/last rows that are not hidden @@ -742,11 +794,11 @@ get_prev_row: function() get_first_row: function() { if (this.rowcount) { - var i, len, rows = this.tbody.childNodes; + var i, len, uid, rows = this.tbody.childNodes; for (i=0, len=rows.length-1; i<len; i++) - if (rows[i].id && String(rows[i].id).match(this.id_regexp) && this.rows[RegExp.$1] != null) - return RegExp.$1; + if (rows[i].id && (uid = this.get_row_uid(rows[i]))) + return uid; } return null; @@ -755,11 +807,11 @@ get_first_row: function() get_last_row: function() { if (this.rowcount) { - var i, rows = this.tbody.childNodes; + var i, uid, rows = this.tbody.childNodes; for (i=rows.length-1; i>=0; i--) - if (rows[i].id && String(rows[i].id).match(this.id_regexp) && this.rows[RegExp.$1] != null) - return RegExp.$1; + if (rows[i].id && (uid = this.get_row_uid(rows[i]))) + return uid; } return null; @@ -1027,7 +1079,7 @@ invert_selection: function() /** * Unselect selected row(s) */ -clear_selection: function(id) +clear_selection: function(id, no_event) { var n, num_select = this.selection.length; @@ -1049,7 +1101,7 @@ clear_selection: function(id) this.selection = []; } - if (num_select && !this.selection.length) + if (num_select && !this.selection.length && !no_event) this.triggerEvent('select'); }, @@ -1102,7 +1154,7 @@ highlight_row: function(id, multiple, norecur) if (!multiple) { if (this.selection.length > 1 || !this.in_selection(id)) { - this.clear_selection(); + this.clear_selection(null, true); this.selection[0] = id; $(this.rows[id].obj).addClass('selected'); } @@ -1253,7 +1305,7 @@ use_arrow_key: function(keyCode, mod_key) this.collapse(selected_row); } - this.update_expando(selected_row.uid, selected_row.expanded); + this.update_expando(selected_row.id, selected_row.expanded); return false; } @@ -1332,12 +1384,9 @@ drag_mouse_move: function(e) // get selected rows (in display order), don't use this.selection here $(this.row_tagname() + '.selected', this.tbody).each(function() { - if (!String(this.id).match(self.id_regexp)) - return; - - var uid = RegExp.$1, row = self.rows[uid]; + var uid = self.get_row_uid(this), row = self.rows[uid]; - if ($.inArray(uid, selection) > -1) + if (!row || $.inArray(uid, selection) > -1) return; selection.push(uid); diff --git a/program/js/treelist.js b/program/js/treelist.js index d940e396c..90eeeeae7 100644 --- a/program/js/treelist.js +++ b/program/js/treelist.js @@ -1,20 +1,33 @@ -/* - +-----------------------------------------------------------------------+ - | Roundcube Treelist widget | - | | - | This file is part of the Roundcube Webmail client | - | Copyright (C) 2013, The Roundcube Dev Team | - | | - | Licensed under the GNU General Public License version 3 or | - | any later version with exceptions for skins & plugins. | - | See the README file for a full license statement. | - | | - +-----------------------------------------------------------------------+ - | Authors: Thomas Bruederli <roundcube@gmail.com> | - +-----------------------------------------------------------------------+ - | Requires: common.js | - +-----------------------------------------------------------------------+ -*/ +/** + * Roundcube Treelist Widget + * + * This file is part of the Roundcube Webmail client + * + * @licstart The following is the entire license notice for the + * JavaScript code in this file. + * + * Copyright (c) 2013-2014, The Roundcube Dev Team + * + * The JavaScript code in this page is free software: you can + * redistribute it and/or modify it under the terms of the GNU + * General Public License (GNU GPL) as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) + * any later version. The code is distributed WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. + * + * As additional permission under GNU GPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * @licend The above is the entire license notice + * for the JavaScript code in this file. + * + * @author Thomas Bruederli <roundcube@gmail.com> + * @requires jquery.js, common.js + */ /** @@ -31,6 +44,7 @@ function rcube_treelist_widget(node, p) scroll_delay: 500, scroll_step: 5, scroll_speed: 20, + save_state: false, check_droptarget: function(node){ return !node.virtual } }, p || {}); @@ -39,6 +53,8 @@ function rcube_treelist_widget(node, p) indexbyid = {}, selection = null, drag_active = false, + search_active = false, + last_search = '', box_coords = {}, item_coords = [], autoexpand_timer, @@ -46,6 +62,10 @@ function rcube_treelist_widget(node, p) body_scroll_top = 0, list_scroll_top = 0, scroll_timer, + searchfield, + tree_state, + ui_droppable, + list_id = (container.attr('id') || p.id_prefix || '0'), me = this; @@ -56,13 +76,16 @@ function rcube_treelist_widget(node, p) this.collapse = collapse; this.select = select; this.render = render; + this.reset = reset; this.drag_start = drag_start; this.drag_end = drag_end; this.intersects = intersects; + this.droppable = droppable; this.update = update_node; this.insert = insert; this.remove = remove; this.get_item = get_item; + this.get_node = get_node; this.get_selection = get_selection; /////// startup code (constructor) @@ -80,6 +103,7 @@ function rcube_treelist_widget(node, p) // register click handlers on list container.on('click', 'div.treetoggle', function(e){ toggle(dom2id($(this).parent())); + e.stopPropagation(); }); container.on('click', 'li', function(e){ @@ -90,6 +114,43 @@ function rcube_treelist_widget(node, p) } }); + // activate search function + if (p.searchbox) { + searchfield = $(p.searchbox).on('keyup', function(e) { + var key = rcube_event.get_keycode(e), + mod = rcube_event.get_modifier(e); + + switch (key) { + case 9: // tab + break; + + case 13: // enter + search(this.value, true); + return rcube_event.cancel(e); + + case 27: // escape + reset_search(); + break; + + case 38: // arrow up + case 37: // left + case 39: // right + case 40: // arrow down + return; // ignore arrow keys + + default: + search(this.value, false); + break; + } + }).attr('autocomplete', 'off'); + + // find the reset button for this search field + searchfield.parent().find('a.reset').click(function(e) { + reset_search(); + return false; + }) + } + /////// private methods @@ -104,11 +165,6 @@ function rcube_treelist_widget(node, p) node.collapsed = typeof set == 'undefined' || set; update_dom(node); - // Work around a bug in IE6 and IE7, see #1485309 - if (window.bw && (bw.ie6 || bw.ie7) && node.collapsed) { - id2dom(node.id).next().children('ul:visible').hide().show(); - } - if (recursive && node.children) { for (var i=0; i < node.children.length; i++) { collapse(node.children[i].id, recursive, set); @@ -116,6 +172,7 @@ function rcube_treelist_widget(node, p) } me.triggerEvent(node.collapsed ? 'collapse' : 'expand', node); + save_state(id, node.collapsed); } } @@ -170,9 +227,17 @@ function rcube_treelist_widget(node, p) /** * Return the DOM element of the list item with the given ID */ - function get_item(id) + function get_node(id) { - return id2dom(id).get(0); + return indexbyid[id]; + } + + /** + * Return the DOM element of the list item with the given ID + */ + function get_item(id, real) + { + return id2dom(id, real).get(0); } /** @@ -181,13 +246,26 @@ function rcube_treelist_widget(node, p) function insert(node, parent_id, sort) { var li, parent_li, - parent_node = parent_id ? indexbyid[parent_id] : null; + parent_node = parent_id ? indexbyid[parent_id] : null + search_ = search_active; + + // ignore, already exists + if (indexbyid[node.id]) { + return; + } + + // apply saved state + state = get_state(node.id, node.collapsed); + if (state !== undefined) { + node.collapsed = state; + } // insert as child of an existing node if (parent_node) { if (!parent_node.children) parent_node.children = []; + search_active = false; parent_node.children.push(node); parent_li = id2dom(parent_id); @@ -200,6 +278,21 @@ function rcube_treelist_widget(node, p) // append new node to parent's child list li = render_node(node, parent_li.children('ul').first()); } + + // list is in search mode + if (search_) { + search_active = search_; + + // add clone to current search results (top level) + if (!li.is(':visible')) { + $('<li>') + .attr('id', li.attr('id') + '--xsR') + .attr('class', li.attr('class')) + .addClass('searchresult__') + .append(li.children().first().clone(true, true)) + .appendTo(container); + } + } } // insert at top level else { @@ -266,7 +359,7 @@ function rcube_treelist_widget(node, p) if (sibling) { li.insertAfter(sibling); } - else if (first.id != myid) { + else if (first && first.id != myid) { li.insertBefore(first); } @@ -282,7 +375,7 @@ function rcube_treelist_widget(node, p) var node, li; if (node = indexbyid[id]) { - li = id2dom(id); + li = id2dom(id, true); li.remove(); node.deleted = true; @@ -314,6 +407,94 @@ function rcube_treelist_widget(node, p) } /** + * + */ + function reset() + { + select(''); + + data = []; + indexbyid = {}; + drag_active = false; + + container.html(''); + + reset_search(); + } + + /** + * + */ + function search(q, enter) + { + q = String(q).toLowerCase(); + + if (!q.length) + return reset_search(); + else if (q == last_search && !enter) + return 0; + + var hits = []; + var search_tree = function(items) { + $.each(items, function(i, node) { + var li, sli; + if (!node.virtual && !node.deleted && String(node.text).toLowerCase().indexOf(q) >= 0 && hits.indexOf(node.id) < 0) { + li = id2dom(node.id); + sli = $('<li>') + .attr('id', li.attr('id') + '--xsR') + .attr('class', li.attr('class')) + .addClass('searchresult__') + .append(li.children().first().clone(true, true)) + .appendTo(container); + hits.push(node.id); + } + + if (node.children && node.children.length) { + search_tree(node.children); + } + }); + }; + + // reset old search results + if (search_active) { + $(container).children('li.searchresult__').remove(); + search_active = false; + } + + // hide all list items + $(container).children('li').hide().removeClass('selected'); + + // search recursively in tree (to keep sorting order) + search_tree(data); + search_active = true; + last_search = q; + + me.triggerEvent('search', { query: q, last: last_search, count: hits.length, ids: hits, execute: enter||false }); + + return hits.count; + } + + /** + * + */ + function reset_search() + { + if (searchfield) + searchfield.val(''); + + $(container).children('li.searchresult__').remove(); + $(container).children('li').show(); + + search_active = false; + + me.triggerEvent('search', { query: false, last: last_search }); + last_search = ''; + + if (selection) + select(selection); + } + + /** * Render the tree list from the internal data structure */ function render() @@ -342,7 +523,8 @@ function rcube_treelist_widget(node, p) var li = $('<li>') .attr('id', p.id_prefix + (p.id_encode ? p.id_encode(node.id) : node.id)) - .addClass((node.classes || []).join(' ')); + .addClass((node.classes || []).join(' ')) + .data('id', node.id); if (replace) replace.replaceWith(li); @@ -354,6 +536,9 @@ function rcube_treelist_widget(node, p) else if (typeof node.html == 'object') li.append(node.html); + if (!node.text) + node.text = li.children().first().text(); + if (node.virtual) li.addClass('virtual'); if (node.id == selection) @@ -382,12 +567,13 @@ function rcube_treelist_widget(node, p) { var result = []; ul.children('li').each(function(i,e){ - var li = $(e), sublist = li.children('ul'); + var state, li = $(e), sublist = li.children('ul'); var node = { id: dom2id(li), - classes: li.attr('class').split(' '), + classes: String(li.attr('class')).split(' '), virtual: li.hasClass('virtual'), html: li.children().first().get(0).outerHTML, + text: li.children().first().text(), children: walk_list(sublist) } @@ -396,11 +582,22 @@ function rcube_treelist_widget(node, p) } if (node.children.length) { node.collapsed = sublist.css('display') == 'none'; + + // apply saved state + state = get_state(node.id, node.collapsed); + if (state !== undefined) { + node.collapsed = state; + sublist[(state?'hide':'show')](); + } + + if (!li.children('div.treetoggle').length) + $('<div class="treetoggle '+(node.collapsed ? 'collapsed' : 'expanded') + '"> </div>').appendTo(li); } if (li.hasClass('selected')) { selection = node.id; } + li.data('id', node.id); result.push(node); indexbyid[node.id] = node; }) @@ -426,17 +623,18 @@ function rcube_treelist_widget(node, p) */ function dom2id(li) { - var domid = li.attr('id').replace(new RegExp('^' + (p.id_prefix) || '%'), ''); + var domid = li.attr('id').replace(new RegExp('^' + (p.id_prefix) || '%'), '').replace(/--xsR$/, ''); return p.id_decode ? p.id_decode(domid) : domid; } /** * Get the <li> element for the given node ID */ - function id2dom(id) + function id2dom(id, real) { - var domid = p.id_encode ? p.id_encode(id) : id; - return $('#' + p.id_prefix + domid); + var domid = p.id_encode ? p.id_encode(id) : id, + suffix = search_active && !real ? '--xsR' : ''; + return $('#' + p.id_prefix + domid + suffix, container); } /** @@ -452,6 +650,40 @@ function rcube_treelist_widget(node, p) scroller.scrollTop(rel_offset + current_offset); } + /** + * Save node collapse state to localStorage + */ + function save_state(id, collapsed) + { + if (p.save_state && window.rcmail) { + var key = 'treelist-' + list_id; + if (!tree_state) { + tree_state = rcmail.local_storage_get_item(key, {}); + } + + if (tree_state[id] != collapsed) { + tree_state[id] = collapsed; + rcmail.local_storage_set_item(key, tree_state); + } + } + } + + /** + * Read node collapse state from localStorage + */ + function get_state(id) + { + if (p.save_state && window.rcmail) { + if (!tree_state) { + tree_state = rcmail.local_storage_get_item('treelist-' + list_id, {}); + } + return tree_state[id]; + } + + return undefined; + } + + ///// drag & drop support /** @@ -574,7 +806,8 @@ function rcube_treelist_widget(node, p) // no intersection with list bounding box if (mouse.x < box_coords.x1 || mouse.x >= box_coords.x2 || mouse.top < box_coords.y1 || mouse.top >= box_coords.y2) { // TODO: optimize performance for this operation - $('li.droptarget', container).removeClass('droptarget'); + if (highlight) + $('li.droptarget', container).removeClass('droptarget'); return result; } @@ -595,6 +828,8 @@ function rcube_treelist_widget(node, p) expand(autoexpand_item); drag_start(); // re-calculate item coords autoexpand_item = null; + if (ui_droppable) + $.ui.ddmanager.prepareOffsets($.ui.ddmanager.current, null); }, p.autoexpand); } else if (autoexpand_timer && autoexpand_item != id) { @@ -623,6 +858,38 @@ function rcube_treelist_widget(node, p) return result; } + + /** + * Wrapper for jQuery.UI.droppable() activation on this widget + * + * @param object Options as passed to regular .droppable() function + */ + function droppable(opts) + { + var my_opts = $.extend({ greedy: true, hoverClass: 'droptarget', addClasses:false }, opts); + + my_opts.activate = function(e, ui) { + drag_start(); + ui_droppable = ui; + if (opts.activate) + opts.activate(e, ui); + }; + + my_opts.deactivate = function(e, ui) { + drag_end(); + ui_droppable = null; + if (opts.deactivate) + opts.deactivate(e, ui); + }; + + my_opts.over = function(e, ui) { + intersects(rcube_event.get_mouse_pos(e), false); + if (opts.over) + opts.over(e, ui); + }; + + $('li:not(.virtual)', container).droppable(my_opts); + } } // use event processing functions from Roundcube's rcube_event_engine diff --git a/program/lib/Mail/mime.php b/program/lib/Mail/mime.php index e079af7e9..50297dd3e 100644 --- a/program/lib/Mail/mime.php +++ b/program/lib/Mail/mime.php @@ -491,13 +491,13 @@ class Mail_mime * returns it during the build process. * * @param mixed &$obj The object to add the part to, or - * null if a new object is to be created. + * anything else if a new object is to be created. * @param string $text The text to add. * * @return object The text mimePart object * @access private */ - function &_addTextPart(&$obj = null, $text = '') + function &_addTextPart(&$obj, $text = '') { $params['content_type'] = 'text/plain'; $params['encoding'] = $this->_build_params['text_encoding']; @@ -518,12 +518,12 @@ class Mail_mime * returns it during the build process. * * @param mixed &$obj The object to add the part to, or - * null if a new object is to be created. + * anything else if a new object is to be created. * * @return object The html mimePart object * @access private */ - function &_addHtmlPart(&$obj = null) + function &_addHtmlPart(&$obj) { $params['content_type'] = 'text/html'; $params['encoding'] = $this->_build_params['html_encoding']; @@ -563,12 +563,12 @@ class Mail_mime * the build process. * * @param mixed &$obj The object to add the part to, or - * null if a new object is to be created. + * anything else if a new object is to be created. * * @return object The multipart/mixed mimePart object * @access private */ - function &_addAlternativePart(&$obj = null) + function &_addAlternativePart(&$obj) { $params['content_type'] = 'multipart/alternative'; $params['eol'] = $this->_build_params['eol']; @@ -588,12 +588,12 @@ class Mail_mime * the build process. * * @param mixed &$obj The object to add the part to, or - * null if a new object is to be created + * anything else if a new object is to be created * * @return object The multipart/mixed mimePart object * @access private */ - function &_addRelatedPart(&$obj = null) + function &_addRelatedPart(&$obj) { $params['content_type'] = 'multipart/related'; $params['eol'] = $this->_build_params['eol']; @@ -878,11 +878,11 @@ class Mail_mime $this->_checkParams(); - $null = null; - $attachments = count($this->_parts) ? true : false; - $html_images = count($this->_html_images) ? true : false; - $html = strlen($this->_htmlbody) ? true : false; - $text = (!$html && strlen($this->_txtbody)) ? true : false; + $null = -1; + $attachments = count($this->_parts) > 0; + $html_images = count($this->_html_images) > 0; + $html = strlen($this->_htmlbody) > 0; + $text = !$html && strlen($this->_txtbody); switch (true) { case $text && !$attachments: @@ -991,7 +991,6 @@ class Mail_mime $this->_addAttachmentPart($message, $this->_parts[$i]); } break; - } if (!isset($message)) { diff --git a/program/lib/Mail/mimePart.php b/program/lib/Mail/mimePart.php index c6e9f4aa8..93e891bc6 100644 --- a/program/lib/Mail/mimePart.php +++ b/program/lib/Mail/mimePart.php @@ -839,7 +839,7 @@ class Mail_mimePart // Simple e-mail address regexp $email_regexp = '([^\s<]+|("[^\r\n"]+"))@\S+'; - $parts = Mail_mimePart::_explodeQuotedString($separator, $value); + $parts = Mail_mimePart::_explodeQuotedString("[\t$separator]", $value); $value = ''; foreach ($parts as $part) { @@ -850,7 +850,7 @@ class Mail_mimePart continue; } if ($value) { - $value .= $separator==',' ? $separator.' ' : ' '; + $value .= $separator == ',' ? $separator . ' ' : ' '; } else { $value = $name . ': '; } @@ -869,7 +869,7 @@ class Mail_mimePart // check if phrase requires quoting if ($word) { // non-ASCII: require encoding - if (preg_match('#([\x80-\xFF]){1}#', $word)) { + if (preg_match('#([^\s\x21-\x7E]){1}#', $word)) { if ($word[0] == '"' && $word[strlen($word)-1] == '"') { // de-quote quoted-string, encoding changes // string to atom @@ -908,11 +908,10 @@ class Mail_mimePart $value = preg_replace( '/^'.$name.':('.preg_quote($eol, '/').')* /', '', $value ); - } else { // Unstructured header // non-ASCII: require encoding - if (preg_match('#([\x80-\xFF]){1}#', $value)) { + if (preg_match('#([^\s\x21-\x7E]){1}#', $value)) { if ($value[0] == '"' && $value[strlen($value)-1] == '"') { // de-quote quoted-string, encoding changes // string to atom diff --git a/program/lib/Roundcube/bootstrap.php b/program/lib/Roundcube/bootstrap.php index 6e5143382..65ef98ebd 100644 --- a/program/lib/Roundcube/bootstrap.php +++ b/program/lib/Roundcube/bootstrap.php @@ -3,7 +3,7 @@ /* +-----------------------------------------------------------------------+ | This file is part of the Roundcube PHP suite | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -54,7 +54,7 @@ foreach ($config as $optname => $optval) { } // framework constants -define('RCUBE_VERSION', '1.0-git'); +define('RCUBE_VERSION', '1.1-git'); define('RCUBE_CHARSET', 'UTF-8'); if (!defined('RCUBE_LIB_DIR')) { diff --git a/program/lib/Roundcube/html.php b/program/lib/Roundcube/html.php index 33517fbcd..a88570d75 100644 --- a/program/lib/Roundcube/html.php +++ b/program/lib/Roundcube/html.php @@ -269,19 +269,27 @@ class html return ''; } - $allowed_f = array_flip((array)$allowed); + $allowed_f = array_flip((array)$allowed); $attrib_arr = array(); + foreach ($attrib as $key => $value) { // skip size if not numeric if ($key == 'size' && !is_numeric($value)) { continue; } - // ignore "internal" or not allowed attributes - if ($key == 'nl' || ($allowed && !isset($allowed_f[$key])) || $value === null) { + // ignore "internal" or empty attributes + if ($key == 'nl' || $value === null) { continue; } + // ignore not allowed attributes, except data-* + if (!empty($allowed)) { + if (!isset($allowed_f[$key]) && @substr_compare($key, 'data-', 0, 5) !== 0) { + continue; + } + } + // skip empty eventhandlers if (preg_match('/^on[a-z]+/', $key) && !$value) { continue; diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php index d58eb087b..d618fb64d 100644 --- a/program/lib/Roundcube/rcube.php +++ b/program/lib/Roundcube/rcube.php @@ -3,8 +3,8 @@ /* +-----------------------------------------------------------------------+ | This file is part of the Roundcube Webmail client | - | Copyright (C) 2008-2012, The Roundcube Dev Team | - | Copyright (C) 2011-2012, Kolab Systems AG | + | Copyright (C) 2008-2014, The Roundcube Dev Team | + | Copyright (C) 2011-2014, Kolab Systems AG | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -94,6 +94,13 @@ class rcube */ public $plugins; + /** + * Instance of rcube_user class. + * + * @var rcube_user + */ + public $user; + /* private/protected vars */ protected $texts; @@ -348,29 +355,6 @@ class rcube // for backward compat. (deprecated, will be removed) $this->imap = $this->storage; - // enable caching of mail data - $storage_cache = $this->config->get("{$driver}_cache"); - $messages_cache = $this->config->get('messages_cache'); - // for backward compatybility - if ($storage_cache === null && $messages_cache === null && $this->config->get('enable_caching')) { - $storage_cache = 'db'; - $messages_cache = true; - } - - if ($storage_cache) { - $this->storage->set_caching($storage_cache); - } - if ($messages_cache) { - $this->storage->set_messages_caching(true); - } - - // set pagesize from config - $pagesize = $this->config->get('mail_pagesize'); - if (!$pagesize) { - $pagesize = $this->config->get('pagesize', 50); - } - $this->storage->set_pagesize($pagesize); - // set class options $options = array( 'auth_type' => $this->config->get("{$driver}_auth_type", 'check'), @@ -405,22 +389,65 @@ class rcube /** * Set storage parameters. - * This must be done AFTER connecting to the server! */ protected function set_storage_prop() { $storage = $this->get_storage(); + // set pagesize from config + $pagesize = $this->config->get('mail_pagesize'); + if (!$pagesize) { + $pagesize = $this->config->get('pagesize', 50); + } + + $storage->set_pagesize($pagesize); $storage->set_charset($this->config->get('default_charset', RCUBE_CHARSET)); - if ($default_folders = $this->config->get('default_folders')) { - $storage->set_default_folders($default_folders); + // enable caching of mail data + $driver = $this->config->get('storage_driver', 'imap'); + $storage_cache = $this->config->get("{$driver}_cache"); + $messages_cache = $this->config->get('messages_cache'); + // for backward compatybility + if ($storage_cache === null && $messages_cache === null && $this->config->get('enable_caching')) { + $storage_cache = 'db'; + $messages_cache = true; } - if (isset($_SESSION['mbox'])) { - $storage->set_folder($_SESSION['mbox']); + + if ($storage_cache) { + $storage->set_caching($storage_cache); } - if (isset($_SESSION['page'])) { - $storage->set_page($_SESSION['page']); + if ($messages_cache) { + $storage->set_messages_caching(true); + } + } + + + /** + * Set special folders type association. + * This must be done AFTER connecting to the server! + */ + protected function set_special_folders() + { + $storage = $this->get_storage(); + $folders = $storage->get_special_folders(true); + $prefs = array(); + + // check SPECIAL-USE flags on IMAP folders + foreach ($folders as $type => $folder) { + $idx = $type . '_mbox'; + if ($folder !== $this->config->get($idx)) { + $prefs[$idx] = $folder; + } + } + + // Some special folders differ, update user preferences + if (!empty($prefs) && $this->user) { + $this->user->save_prefs($prefs); + } + + // create default folders (on login) + if ($this->config->get('create_default_folders')) { + $storage->create_default_folders(); } } @@ -1105,6 +1132,11 @@ class rcube return true; } + // add session ID to the log + if ($sess = session_id()) { + $line = '<' . substr($sess, 0, 8) . '> ' . $line; + } + if ($log_driver == 'syslog') { $prio = $name == 'errors' ? LOG_ERR : LOG_INFO; syslog($prio, $line); @@ -1180,8 +1212,8 @@ class rcube } // installer - if (class_exists('rcube_install', false)) { - $rci = rcube_install::get_instance(); + if (class_exists('rcmail_install', false)) { + $rci = rcmail_install::get_instance(); $rci->raise_error($arg); return; } @@ -1302,6 +1334,20 @@ class rcube self::write_log($dest, sprintf("%s: %0.4f sec", $label, $diff)); } + /** + * Setter for system user object + * + * @param rcube_user Current user instance + */ + public function set_user($user) + { + if (is_object($user)) { + $this->user = $user; + + // overwrite config with user preferences + $this->config->set_user_prefs((array)$this->user->get_prefs()); + } + } /** * Getter for logged user ID. @@ -1438,6 +1484,13 @@ class rcube )); if ($plugin['abort']) { + if (!empty($plugin['error'])) { + $error = $plugin['error']; + } + if (!empty($plugin['body_file'])) { + $body_file = $plugin['body_file']; + } + return isset($plugin['result']) ? $plugin['result'] : false; } diff --git a/program/lib/Roundcube/rcube_browser.php b/program/lib/Roundcube/rcube_browser.php index e53e31200..b9642d8f9 100644 --- a/program/lib/Roundcube/rcube_browser.php +++ b/program/lib/Roundcube/rcube_browser.php @@ -34,14 +34,20 @@ class rcube_browser $this->linux = strpos($HTTP_USER_AGENT, 'linux') != false; $this->unix = strpos($HTTP_USER_AGENT, 'unix') != false; - $this->opera = strpos($HTTP_USER_AGENT, 'opera') !== false; + $this->webkit = strpos($HTTP_USER_AGENT, 'applewebkit') !== false; + $this->opera = strpos($HTTP_USER_AGENT, 'opera') !== false || ($this->webkit && strpos($HTTP_USER_AGENT, 'opr/') !== false); $this->ns = strpos($HTTP_USER_AGENT, 'netscape') !== false; - $this->chrome = strpos($HTTP_USER_AGENT, 'chrome') !== false; + $this->chrome = !$this->opera && strpos($HTTP_USER_AGENT, 'chrome') !== false; $this->ie = !$this->opera && (strpos($HTTP_USER_AGENT, 'compatible; msie') !== false || strpos($HTTP_USER_AGENT, 'trident/') !== false); - $this->safari = !$this->chrome && (strpos($HTTP_USER_AGENT, 'safari') !== false || strpos($HTTP_USER_AGENT, 'applewebkit') !== false); - $this->mz = !$this->ie && !$this->safari && !$this->chrome && !$this->ns && strpos($HTTP_USER_AGENT, 'mozilla') !== false; + $this->safari = !$this->opera && !$this->chrome && ($this->webkit || strpos($HTTP_USER_AGENT, 'safari') !== false); + $this->mz = !$this->ie && !$this->safari && !$this->chrome && !$this->ns && !$this->opera && strpos($HTTP_USER_AGENT, 'mozilla') !== false; - if (preg_match('/(chrome|msie|opera|version|khtml)(\s*|\/)([0-9.]+)/', $HTTP_USER_AGENT, $regs)) { + if ($this->opera) { + if (preg_match('/(opera|opr)\/([0-9.]+)/', $HTTP_USER_AGENT, $regs)) { + $this->ver = (float) $regs[2]; + } + } + else if (preg_match('/(chrome|msie|version|khtml)(\s*|\/)([0-9.]+)/', $HTTP_USER_AGENT, $regs)) { $this->ver = (float) $regs[3]; } else if (preg_match('/rv:([0-9.]+)/', $HTTP_USER_AGENT, $regs)) { diff --git a/program/lib/Roundcube/rcube_cache.php b/program/lib/Roundcube/rcube_cache.php index a708cb292..0017dcacc 100644 --- a/program/lib/Roundcube/rcube_cache.php +++ b/program/lib/Roundcube/rcube_cache.php @@ -45,6 +45,7 @@ class rcube_cache private $cache = array(); private $cache_changes = array(); private $cache_sums = array(); + private $max_packet = -1; /** @@ -319,7 +320,7 @@ class rcube_cache * Writes single cache record into DB. * * @param string $key Cache key name - * @param mxied $data Serialized cache data + * @param mixed $data Serialized cache data * * @param boolean True on success, False on failure */ @@ -329,6 +330,12 @@ class rcube_cache return false; } + // don't attempt to write too big data sets + if (strlen($data) > $this->max_packet_size()) { + trigger_error("rcube_cache: max_packet_size ($this->max_packet) exceeded for key $key. Tried to write " . strlen($data) . " bytes", E_USER_WARNING); + return false; + } + if ($this->type == 'memcache' || $this->type == 'apc') { return $this->add_record($this->ckey($key), $data); } @@ -591,4 +598,30 @@ class rcube_cache return $this->packed ? @unserialize($data) : $data; } + + /** + * Determine the maximum size for cache data to be written + */ + private function max_packet_size() + { + if ($this->max_packet < 0) { + $this->max_packet = 2097152; // default/max is 2 MB + + if ($this->type == 'db') { + $value = $this->db->get_variable('max_allowed_packet', 1048500); + $this->max_packet = min($value, $this->max_packet) - 2000; + } + else if ($this->type == 'memcache') { + $stats = $this->db->getStats(); + $remaining = $stats['limit_maxbytes'] - $stats['bytes']; + $this->max_packet = min($remaining / 5, $this->max_packet); + } + else if ($this->type == 'apc' && function_exists('apc_sma_info')) { + $stats = apc_sma_info(); + $this->max_packet = min($stats['avail_mem'] / 5, $this->max_packet); + } + } + + return $this->max_packet; + } } diff --git a/program/lib/Roundcube/rcube_charset.php b/program/lib/Roundcube/rcube_charset.php index 8612e7fca..ffec67376 100644 --- a/program/lib/Roundcube/rcube_charset.php +++ b/program/lib/Roundcube/rcube_charset.php @@ -759,7 +759,12 @@ class rcube_charset // iconv/mbstring are much faster (especially with long strings) if (function_exists('mb_convert_encoding')) { - if (($res = mb_convert_encoding($input, 'UTF-8', 'UTF-8')) !== false) { + $msch = mb_substitute_character('none'); + mb_substitute_character('none'); + $res = mb_convert_encoding($input, 'UTF-8', 'UTF-8'); + mb_substitute_character($msch); + + if ($res !== false) { return $res; } } @@ -795,8 +800,8 @@ class rcube_charset } $seq = ''; $out .= $chr; - // first (or second) byte of multibyte sequence } + // first (or second) byte of multibyte sequence else if ($ord >= 0xC0) { if (strlen($seq) > 1) { $out .= preg_match($regexp, $seq) ? $seq : ''; @@ -806,8 +811,8 @@ class rcube_charset $seq = ''; } $seq .= $chr; - // next byte of multibyte sequence } + // next byte of multibyte sequence else if ($seq) { $seq .= $chr; } diff --git a/program/lib/Roundcube/rcube_config.php b/program/lib/Roundcube/rcube_config.php index 0352e4772..afe13e879 100644 --- a/program/lib/Roundcube/rcube_config.php +++ b/program/lib/Roundcube/rcube_config.php @@ -63,7 +63,7 @@ class rcube_config $this->paths = explode(PATH_SEPARATOR, $paths); // make all paths absolute foreach ($this->paths as $i => $path) { - if (!$this->_is_absolute($path)) { + if (!rcube_utils::is_absolute_path($path)) { if ($realpath = realpath(RCUBE_INSTALL_PATH . $path)) { $this->paths[$i] = unslashify($realpath) . '/'; } @@ -243,8 +243,8 @@ class rcube_config */ public function resolve_paths($file, $use_env = true) { - $files = array(); - $abs_path = $this->_is_absolute($file); + $files = array(); + $abs_path = rcube_utils::is_absolute_path($file); foreach ($this->paths as $basepath) { $realpath = $abs_path ? $file : realpath($basepath . '/' . $file); @@ -270,14 +270,6 @@ class rcube_config } /** - * Determine whether the given file path is absolute or relative - */ - private function _is_absolute($path) - { - return $path[0] == DIRECTORY_SEPARATOR || preg_match('!^[a-z]:[\\\\/]!i', $path); - } - - /** * Getter for a specific config parameter * * @param string $name Parameter name diff --git a/program/lib/Roundcube/rcube_csv2vcard.php b/program/lib/Roundcube/rcube_csv2vcard.php index aa385dce4..06bc387d5 100644 --- a/program/lib/Roundcube/rcube_csv2vcard.php +++ b/program/lib/Roundcube/rcube_csv2vcard.php @@ -56,7 +56,7 @@ class rcube_csv2vcard //'email_2_type' => '', //'email_3_address' => '', //@TODO //'email_3_type' => '', - 'email_address' => 'email:main', + 'email_address' => 'email:pref', //'email_type' => '', 'first_name' => 'firstname', 'gender' => 'gender', diff --git a/program/lib/Roundcube/rcube_db.php b/program/lib/Roundcube/rcube_db.php index 2828f26ee..a46df97d3 100644 --- a/program/lib/Roundcube/rcube_db.php +++ b/program/lib/Roundcube/rcube_db.php @@ -31,7 +31,6 @@ class rcube_db protected $db_dsnr; // DSN for read operations protected $db_connected = false; // Already connected ? protected $db_mode; // Connection mode - protected $db_table_dsn_map = array(); protected $dbh; // Connection handle protected $dbhs = array(); protected $table_connections = array(); @@ -100,12 +99,15 @@ class rcube_db $this->db_dsnw = $db_dsnw; $this->db_dsnr = $db_dsnr; $this->db_pconn = $pconn; - $this->db_dsnw_noread = rcube::get_instance()->config->get('db_dsnw_noread', false); $this->db_dsnw_array = self::parse_dsn($db_dsnw); $this->db_dsnr_array = self::parse_dsn($db_dsnr); - $this->db_table_dsn_map = array_map(array($this, 'table_name'), rcube::get_instance()->config->get('db_table_dsn', array())); + $config = rcube::get_instance()->config; + + $this->options['table_prefix'] = $config->get('db_prefix'); + $this->options['dsnw_noread'] = $config->get('db_dsnw_noread', false); + $this->options['table_dsn_map'] = array_map(array($this, 'table_name'), $config->get('db_table_dsn', array())); } /** @@ -206,7 +208,7 @@ class rcube_db // Already connected if ($this->db_connected) { // connected to db with the same or "higher" mode (if allowed) - if ($this->db_mode == $mode || $this->db_mode == 'w' && !$force && !$this->db_dsnw_noread) { + if ($this->db_mode == $mode || $this->db_mode == 'w' && !$force && !$this->options['dsnw_noread']) { return; } } @@ -241,14 +243,14 @@ class rcube_db $table = $m[2]; // always use direct mapping - if ($this->db_table_dsn_map[$table]) { - $mode = $this->db_table_dsn_map[$table]; + if ($this->options['table_dsn_map'][$table]) { + $mode = $this->options['table_dsn_map'][$table]; break; // primary table rules } else if ($mode == 'r') { // connected to db with the same or "higher" mode for this table $db_mode = $this->table_connections[$table]; - if ($db_mode == 'w' && !$this->db_dsnw_noread) { + if ($db_mode == 'w' && !$this->options['dsnw_noread']) { $mode = $db_mode; } } @@ -920,14 +922,8 @@ class rcube_db */ public function table_name($table) { - static $rcube; - - if (!$rcube) { - $rcube = rcube::get_instance(); - } - // add prefix to the table name if configured - if (($prefix = $rcube->config->get('db_prefix')) && strpos($table, $prefix) !== 0) { + if (($prefix = $this->options['table_prefix']) && strpos($table, $prefix) !== 0) { return $prefix . $table; } @@ -953,7 +949,7 @@ class rcube_db */ public function set_table_dsn($table, $mode) { - $this->db_table_dsn_map[$this->table_name($table)] = $mode; + $this->options['table_dsn_map'][$this->table_name($table)] = $mode; } /** @@ -1129,4 +1125,61 @@ class rcube_db return $result; } + + /** + * Execute the given SQL script + * + * @param string SQL queries to execute + * + * @return boolen True on success, False on error + */ + public function exec_script($sql) + { + $sql = $this->fix_table_names($sql); + $buff = ''; + + foreach (explode("\n", $sql) as $line) { + if (preg_match('/^--/', $line) || trim($line) == '') + continue; + + $buff .= $line . "\n"; + if (preg_match('/(;|^GO)$/', trim($line))) { + $this->query($buff); + $buff = ''; + if ($this->db_error) { + break; + } + } + } + + return !$this->db_error; + } + + /** + * Parse SQL file and fix table names according to table prefix + */ + protected function fix_table_names($sql) + { + if (!$this->options['table_prefix']) { + return $sql; + } + + $sql = preg_replace_callback( + '/((TABLE|TRUNCATE|(?<!ON )UPDATE|INSERT INTO|FROM' + . '| ON(?! (DELETE|UPDATE))|REFERENCES|CONSTRAINT|FOREIGN KEY|INDEX)' + . '\s+(IF (NOT )?EXISTS )?[`"]*)([^`"\( \r\n]+)/', + array($this, 'fix_table_names_callback'), + $sql + ); + + return $sql; + } + + /** + * Preg_replace callback for fix_table_names() + */ + protected function fix_table_names_callback($matches) + { + return $matches[1] . $this->options['table_prefix'] . $matches[count($matches)-1]; + } } diff --git a/program/lib/Roundcube/rcube_db_mssql.php b/program/lib/Roundcube/rcube_db_mssql.php index 726e4b421..4138b1489 100644 --- a/program/lib/Roundcube/rcube_db_mssql.php +++ b/program/lib/Roundcube/rcube_db_mssql.php @@ -167,4 +167,24 @@ class rcube_db_mssql extends rcube_db return $result; } + + /** + * Parse SQL file and fix table names according to table prefix + */ + protected function fix_table_names($sql) + { + if (!$this->options['table_prefix']) { + return $sql; + } + + // replace sequence names, and other postgres-specific commands + $sql = preg_replace_callback( + '/((TABLE|(?<!ON )UPDATE|INSERT INTO|FROM(?! deleted)| ON(?! (DELETE|UPDATE|\[PRIMARY\]))' + . '|REFERENCES|CONSTRAINT|TRIGGER|INDEX)\s+(\[dbo\]\.)?[\[\]]*)([^\[\]\( \r\n]+)/', + array($this, 'fix_table_names_callback'), + $sql + ); + + return $sql; + } } diff --git a/program/lib/Roundcube/rcube_db_mysql.php b/program/lib/Roundcube/rcube_db_mysql.php index d3d0ac5c8..400813dcc 100644 --- a/program/lib/Roundcube/rcube_db_mysql.php +++ b/program/lib/Roundcube/rcube_db_mysql.php @@ -38,13 +38,6 @@ class rcube_db_mysql extends rcube_db */ public function __construct($db_dsnw, $db_dsnr = '', $pconn = false) { - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - rcube::raise_error(array('code' => 600, 'type' => 'db', - 'line' => __LINE__, 'file' => __FILE__, - 'message' => "MySQL driver requires PHP >= 5.3, current version is " . PHP_VERSION), - true, true); - } - parent::__construct($db_dsnw, $db_dsnr, $pconn); // SQL identifiers quoting @@ -128,11 +121,11 @@ class rcube_db_mysql extends rcube_db $result = array(); if (!empty($dsn['key'])) { - $result[PDO::MYSQL_ATTR_KEY] = $dsn['key']; + $result[PDO::MYSQL_ATTR_SSL_KEY] = $dsn['key']; } if (!empty($dsn['cipher'])) { - $result[PDO::MYSQL_ATTR_CIPHER] = $dsn['cipher']; + $result[PDO::MYSQL_ATTR_SSL_CIPHER] = $dsn['cipher']; } if (!empty($dsn['cert'])) { diff --git a/program/lib/Roundcube/rcube_db_pgsql.php b/program/lib/Roundcube/rcube_db_pgsql.php index 68bf6d85d..a92d3cf36 100644 --- a/program/lib/Roundcube/rcube_db_pgsql.php +++ b/program/lib/Roundcube/rcube_db_pgsql.php @@ -73,10 +73,9 @@ class rcube_db_pgsql extends rcube_db // Note: we support only one sequence per table // Note: The sequence name must be <table_name>_seq $sequence = $table . '_seq'; - $rcube = rcube::get_instance(); - // return sequence name if configured - if ($prefix = $rcube->config->get('db_prefix')) { + // modify sequence name if prefix is configured + if ($prefix = $this->options['table_prefix']) { return $prefix . $sequence; } @@ -190,4 +189,24 @@ class rcube_db_pgsql extends rcube_db return $result; } + /** + * Parse SQL file and fix table names according to table prefix + */ + protected function fix_table_names($sql) + { + if (!$this->options['table_prefix']) { + return $sql; + } + + $sql = parent::fix_table_names($sql); + + // replace sequence names, and other postgres-specific commands + $sql = preg_replace_callback( + '/((SEQUENCE |RENAME TO |nextval\()["\']*)([^"\' \r\n]+)/', + array($this, 'fix_table_names_callback'), + $sql + ); + + return $sql; + } } diff --git a/program/lib/Roundcube/rcube_db_sqlsrv.php b/program/lib/Roundcube/rcube_db_sqlsrv.php index 4339f3dfd..7b64ccea2 100644 --- a/program/lib/Roundcube/rcube_db_sqlsrv.php +++ b/program/lib/Roundcube/rcube_db_sqlsrv.php @@ -24,126 +24,8 @@ * @package Framework * @subpackage Database */ -class rcube_db_sqlsrv extends rcube_db +class rcube_db_sqlsrv extends rcube_db_mssql { - public $db_provider = 'mssql'; - - /** - * Object constructor - * - * @param string $db_dsnw DSN for read/write operations - * @param string $db_dsnr Optional DSN for read only operations - * @param bool $pconn Enables persistent connections - */ - public function __construct($db_dsnw, $db_dsnr = '', $pconn = false) - { - parent::__construct($db_dsnw, $db_dsnr, $pconn); - - $this->options['identifier_start'] = '['; - $this->options['identifier_end'] = ']'; - } - - /** - * Driver-specific configuration of database connection - * - * @param array $dsn DSN for DB connections - * @param PDO $dbh Connection handler - */ - protected function conn_configure($dsn, $dbh) - { - // Set date format in case of non-default language (#1488918) - $dbh->query("SET DATEFORMAT ymd"); - } - - /** - * Return SQL function for current time and date - * - * @param int $interval Optional interval (in seconds) to add/subtract - * - * @return string SQL function to use in query - */ - public function now($interval = 0) - { - if ($interval) { - $interval = intval($interval); - return "dateadd(second, $interval, getdate())"; - } - - return "getdate()"; - } - - /** - * Return SQL statement to convert a field value into a unix timestamp - * - * This method is deprecated and should not be used anymore due to limitations - * of timestamp functions in Mysql (year 2038 problem) - * - * @param string $field Field name - * - * @return string SQL statement to use in query - * @deprecated - */ - public function unixtimestamp($field) - { - return "DATEDIFF(second, '19700101', $field) + DATEDIFF(second, GETDATE(), GETUTCDATE())"; - } - - /** - * Abstract SQL statement for value concatenation - * - * @return string SQL statement to be used in query - */ - public function concat(/* col1, col2, ... */) - { - $args = func_get_args(); - - if (is_array($args[0])) { - $args = $args[0]; - } - - return '(' . join('+', $args) . ')'; - } - - /** - * Adds TOP (LIMIT,OFFSET) clause to the query - * - * @param string $query SQL query - * @param int $limit Number of rows - * @param int $offset Offset - * - * @return string SQL query - */ - protected function set_limit($query, $limit = 0, $offset = 0) - { - $limit = intval($limit); - $offset = intval($offset); - $end = $offset + $limit; - - // query without OFFSET - if (!$offset) { - $query = preg_replace('/^SELECT\s/i', "SELECT TOP $limit ", $query); - return $query; - } - - $orderby = stristr($query, 'ORDER BY'); - $offset += 1; - - if ($orderby !== false) { - $query = trim(substr($query, 0, -1 * strlen($orderby))); - } - else { - // it shouldn't happen, paging without sorting has not much sense - // @FIXME: I don't know how to build paging query without ORDER BY - $orderby = "ORDER BY 1"; - } - - $query = preg_replace('/^SELECT\s/i', '', $query); - $query = "WITH paging AS (SELECT ROW_NUMBER() OVER ($orderby) AS [RowNumber], $query)" - . " SELECT * FROM paging WHERE [RowNumber] BETWEEN $offset AND $end ORDER BY [RowNumber]"; - - return $query; - } - /** * Returns PDO DSN string from DSN array */ @@ -158,6 +40,7 @@ class rcube_db_sqlsrv extends rcube_db if ($dsn['port']) { $host .= ',' . $dsn['port']; } + $params[] = 'Server=' . $host; } diff --git a/program/lib/Roundcube/rcube_html2text.php b/program/lib/Roundcube/rcube_html2text.php index 01362e6fb..499c4b05c 100644 --- a/program/lib/Roundcube/rcube_html2text.php +++ b/program/lib/Roundcube/rcube_html2text.php @@ -423,7 +423,7 @@ class rcube_html2text // Variables used for building the link list $this->_link_list = array(); - $text = trim(stripslashes($this->html)); + $text = $this->html; // Convert HTML to TXT $this->_converter($text); @@ -473,6 +473,9 @@ class rcube_html2text // Replace known html entities $text = html_entity_decode($text, ENT_QUOTES, $this->charset); + // Replace unicode nbsp to regular spaces + $text = preg_replace('/\xC2\xA0/', ' ', $text); + // Remove unknown/unhandled entities (this cannot be done in search-and-replace block) $text = preg_replace('/&([a-zA-Z0-9]{2,6}|#[0-9]{2,4});/', '', $text); @@ -616,6 +619,10 @@ class rcube_html2text break; } + // abort on invalid tag structure (e.g. no closing tag found) + else { + break; + } } while ($end || $next); } diff --git a/program/lib/Roundcube/rcube_image.php b/program/lib/Roundcube/rcube_image.php index 4e4caae93..a15368a7e 100644 --- a/program/lib/Roundcube/rcube_image.php +++ b/program/lib/Roundcube/rcube_image.php @@ -102,10 +102,10 @@ class rcube_image } // use Imagemagick - if ($convert) { - $p['out'] = $filename; - $p['in'] = $this->image_file; - $type = $props['type']; + if ($convert || class_exists('Imagick', false)) { + $p['out'] = $filename; + $p['in'] = $this->image_file; + $type = $props['type']; if (!$type && ($data = $this->identify())) { $type = $data[0]; @@ -129,26 +129,49 @@ class rcube_image $result = ($this->image_file == $filename || copy($this->image_file, $filename)) ? '' : false; } else { - if ($scale >= 1) { - $width = $props['width']; - $height = $props['height']; - } - else { - $width = intval($props['width'] * $scale); - $height = intval($props['height'] * $scale); - } - $valid_types = "bmp,eps,gif,jp2,jpg,png,svg,tif"; - $p += array( - 'type' => $type, - 'quality' => 75, - 'size' => $width . 'x' . $height, - ); - if (in_array($type, explode(',', $valid_types))) { // Valid type? - $result = rcube::exec($convert . ' 2>&1 -flatten -auto-orient -colorspace sRGB -strip' - . ' -quality {quality} -resize {size} {intype}:{in} {type}:{out}', $p); + if ($scale >= 1) { + $width = $props['width']; + $height = $props['height']; + } + else { + $width = intval($props['width'] * $scale); + $height = intval($props['height'] * $scale); + } + + // use ImageMagick in command line + if ($convert) { + $p += array( + 'type' => $type, + 'quality' => 75, + 'size' => $width . 'x' . $height, + ); + + $result = rcube::exec($convert . ' 2>&1 -flatten -auto-orient -colorspace sRGB -strip' + . ' -quality {quality} -resize {size} {intype}:{in} {type}:{out}', $p); + } + // use PHP's Imagick class + else { + try { + $image = new Imagick($this->image_file); + $image = $image->flattenImages(); + + $image->setImageColorspace(Imagick::COLORSPACE_SRGB); + $image->setImageCompressionQuality(75); + $image->setImageFormat($type); + $image->stripImage(); + $image->scaleImage($width, $height); + + if ($image->writeImage($filename)) { + $result = ''; + } + } + catch (Exception $e) { + rcube::raise_error($e, true, false); + } + } } } @@ -249,7 +272,7 @@ class rcube_image } } - // use ImageMagick + // use ImageMagick in command line if ($convert) { $p['in'] = $this->image_file; $p['out'] = $filename; @@ -258,11 +281,31 @@ class rcube_image $result = rcube::exec($convert . ' 2>&1 -colorspace sRGB -strip -quality 75 {in} {type}:{out}', $p); if ($result === '') { - @chmod($filename, 0600); + chmod($filename, 0600); return true; } } + // use PHP's Imagick class + if (class_exists('Imagick', false)) { + try { + $image = new Imagick($this->image_file); + + $image->setImageColorspace(Imagick::COLORSPACE_SRGB); + $image->setImageCompressionQuality(75); + $image->setImageFormat(self::$extensions[$type]); + $image->stripImage(); + + if ($image->writeImage($filename)) { + @chmod($filename, 0600); + return true; + } + } + catch (Exception $e) { + rcube::raise_error($e, true, false); + } + } + // use GD extension (TIFF isn't supported) $props = $this->props(); @@ -302,12 +345,26 @@ class rcube_image } /** - * Identify command handler. + * Checks if image format conversion is supported + * + * @return boolean True if specified format can be converted to another format + */ + public static function is_convertable($mimetype = null) + { + $rcube = rcube::get_instance(); + + // @TODO: check if specified mimetype is really supported + return class_exists('Imagick', false) || $rcube->config->get('im_convert_path'); + } + + /** + * ImageMagick based image properties read. */ private function identify() { $rcube = rcube::get_instance(); + // use ImageMagick in command line if ($cmd = $rcube->config->get('im_identify_path')) { $args = array('in' => $this->image_file, 'format' => "%m %[fx:w] %[fx:h]"); $id = rcube::exec($cmd. ' 2>/dev/null -format {format} {in}', $args); @@ -316,6 +373,19 @@ class rcube_image return explode(' ', strtolower($id)); } } - } + // use PHP's Imagick class + if (class_exists('Imagick', false)) { + try { + $image = new Imagick($this->image_file); + + return array( + strtolower($image->getImageFormat()), + $image->getImageWidth(), + $image->getImageHeight(), + ); + } + catch (Exception $e) {} + } + } } diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 432227091..78073abd6 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -332,6 +332,10 @@ class rcube_imap extends rcube_storage $this->search_sort_field = $set[3]; $this->search_sorted = $set[4]; $this->search_threads = is_a($this->search_set, 'rcube_result_thread'); + + if (is_a($this->search_set, 'rcube_result_multifolder')) { + $this->set_threading(false); + } } @@ -945,6 +949,75 @@ class rcube_imap extends rcube_storage return array(); } + // gather messages from a multi-folder search + if ($this->search_set->multi) { + $page_size = $this->page_size; + $sort_field = $this->sort_field; + $search_set = $this->search_set; + + // prepare paging + $cnt = $search_set->count(); + $from = ($page-1) * $page_size; + $to = $from + $page_size; + $slice_length = min($page_size, $cnt - $from); + + // fetch resultset headers, sort and slice them + if (!empty($sort_field)) { + $this->sort_field = null; + $this->page_size = 1000; // fetch up to 1000 matching messages per folder + $this->threading = false; + + $a_msg_headers = array(); + foreach ($search_set->sets as $resultset) { + if (!$resultset->is_empty()) { + $this->search_set = $resultset; + $this->search_threads = $resultset instanceof rcube_result_thread; + $a_msg_headers = array_merge($a_msg_headers, $this->list_search_messages($resultset->get_parameters('MAILBOX'), 1)); + } + } + + // sort headers + if (!empty($a_msg_headers)) { + $a_msg_headers = $this->conn->sortHeaders($a_msg_headers, $sort_field, $this->sort_order); + } + + // store (sorted) message index + $search_set->set_message_index($a_msg_headers, $sort_field, $this->sort_order); + + // only return the requested part of the set + $a_msg_headers = array_slice(array_values($a_msg_headers), $from, $slice_length); + } + else { + if ($this->sort_order != $search_set->get_parameters('ORDER')) { + $search_set->revert(); + } + + // slice resultset first... + $fetch = array(); + foreach (array_slice($search_set->get(), $from, $slice_length) as $msg_id) { + list($uid, $folder) = explode('-', $msg_id, 2); + $fetch[$folder][] = $uid; + } + + // ... and fetch the requested set of headers + $a_msg_headers = array(); + foreach ($fetch as $folder => $a_index) { + $a_msg_headers = array_merge($a_msg_headers, array_values($this->fetch_headers($folder, $a_index))); + } + } + + if ($slice) { + $a_msg_headers = array_slice($a_msg_headers, -$slice, $slice); + } + + // restore members + $this->sort_field = $sort_field; + $this->page_size = $page_size; + $this->search_set = $search_set; + + return $a_msg_headers; + } + // use saved messages from searching if ($this->threading) { return $this->list_search_thread_messages($folder, $page, $slice); @@ -1111,6 +1184,7 @@ class rcube_imap extends rcube_storage } foreach ($headers as $h) { + $h->folder = $folder; $a_msg_headers[$h->uid] = $h; } @@ -1234,8 +1308,13 @@ class rcube_imap extends rcube_storage return new rcube_result_index($folder, '* SORT'); } + if ($this->search_set instanceof rcube_result_multifolder) { + $index = $this->search_set; + $index->folder = $folder; + // TODO: handle changed sorting + } // search result is an index with the same sorting? - if (($this->search_set instanceof rcube_result_index) + else if (($this->search_set instanceof rcube_result_index) && ((!$this->sort_field && !$this->search_sorted) || ($this->search_sorted && $this->search_sort_field == $this->sort_field)) ) { @@ -1410,26 +1489,75 @@ class rcube_imap extends rcube_storage * Invoke search request to IMAP server * * @param string $folder Folder name to search in - * @param string $str Search criteria + * @param string $search Search criteria * @param string $charset Search charset * @param string $sort_field Header field to sort by * + * @return rcube_result_index Search result object * @todo: Search criteria should be provided in non-IMAP format, eg. array */ - public function search($folder='', $str='ALL', $charset=NULL, $sort_field=NULL) + public function search($folder = '', $search = 'ALL', $charset = null, $sort_field = null) { - if (!$str) { - $str = 'ALL'; + if (!$search) { + $search = 'ALL'; } - if (!strlen($folder)) { + if ((is_array($folder) && empty($folder)) || (!is_array($folder) && !strlen($folder))) { $folder = $this->folder; } - $results = $this->search_index($folder, $str, $charset, $sort_field); + $plugin = rcube::get_instance()->plugins->exec_hook('imap_search_before', array( + 'folder' => $folder, + 'search' => $search, + 'charset' => $charset, + 'sort_field' => $sort_field, + 'threading' => $this->threading, + )); + + $folder = $plugin['folder']; + $search = $plugin['search']; + $charset = $plugin['charset']; + $sort_field = $plugin['sort_field']; + $results = $plugin['result']; + + // multi-folder search + if (!$results && is_array($folder) && count($folder) > 1 && $search != 'ALL') { + // connect IMAP to have all the required classes and settings loaded + $this->check_connection(); + + // disable threading + $this->threading = false; + + $searcher = new rcube_imap_search($this->options, $this->conn); + + // set limit to not exceed the client's request timeout + $searcher->set_timelimit(60); + + // continue existing incomplete search + if (!empty($this->search_set) && $this->search_set->incomplete && $search == $this->search_string) { + $searcher->set_results($this->search_set); + } + + // execute the search + $results = $searcher->exec( + $folder, + $search, + $charset ? $charset : $this->default_charset, + $sort_field && $this->get_capability('SORT') ? $sort_field : null, + $this->threading + ); + } + else if (!$results) { + $folder = is_array($folder) ? $folder[0] : $folder; + $search = is_array($search) ? $search[$folder] : $search; + $results = $this->search_index($folder, $search, $charset, $sort_field); + } + + $sorted = $this->threading || $this->search_sorted || $plugin['search_sorted'] ? true : false; - $this->set_search_set(array($str, $results, $charset, $sort_field, - $this->threading || $this->search_sorted ? true : false)); + $this->set_search_set(array($search, $results, $charset, $sort_field, $sorted)); + + return $results; } @@ -1443,20 +1571,27 @@ class rcube_imap extends rcube_storage */ public function search_once($folder = null, $str = 'ALL') { + if (!$this->check_connection()) { + return new rcube_result_index(); + } + if (!$str) { $str = 'ALL'; } - if (!strlen($folder)) { - $folder = $this->folder; + // multi-folder search + if (is_array($folder) && count($folder) > 1) { + $searcher = new rcube_imap_search($this->options, $this->conn); + $index = $searcher->exec($folder, $str, $this->default_charset); } - - if (!$this->check_connection()) { - return new rcube_result_index(); + else { + $folder = is_array($folder) ? $folder[0] : $folder; + if (!strlen($folder)) { + $folder = $this->folder; + } + $index = $this->conn->search($folder, $str, true); } - $index = $this->conn->search($folder, $str, true); - return $index; } @@ -1500,7 +1635,7 @@ class rcube_imap extends rcube_storage // but I've seen that Courier doesn't support UTF-8) if ($threads->is_error() && $charset && $charset != 'US-ASCII') { $threads = $this->conn->thread($folder, $this->threading, - $this->convert_criteria($criteria, $charset), true, 'US-ASCII'); + self::convert_criteria($criteria, $charset), true, 'US-ASCII'); } return $threads; @@ -1514,7 +1649,7 @@ class rcube_imap extends rcube_storage // but I've seen Courier with disabled UTF-8 support) if ($messages->is_error() && $charset && $charset != 'US-ASCII') { $messages = $this->conn->sort($folder, $sort_field, - $this->convert_criteria($criteria, $charset), true, 'US-ASCII'); + self::convert_criteria($criteria, $charset), true, 'US-ASCII'); } if (!$messages->is_error()) { @@ -1529,7 +1664,7 @@ class rcube_imap extends rcube_storage // Error, try with US-ASCII (some servers may support only US-ASCII) if ($messages->is_error() && $charset && $charset != 'US-ASCII') { $messages = $this->conn->search($folder, - $this->convert_criteria($criteria, $charset), true); + self::convert_criteria($criteria, $charset), true); } $this->search_sorted = false; @@ -1547,7 +1682,7 @@ class rcube_imap extends rcube_storage * * @return string Search string */ - protected function convert_criteria($str, $charset, $dest_charset='US-ASCII') + public static function convert_criteria($str, $charset, $dest_charset='US-ASCII') { // convert strings to US_ASCII if (preg_match_all('/\{([0-9]+)\}\r\n/', $str, $matches, PREG_OFFSET_CAPTURE)) { @@ -1556,12 +1691,15 @@ class rcube_imap extends rcube_storage $string_offset = $m[1] + strlen($m[0]) + 4; // {}\r\n $string = substr($str, $string_offset - 1, $m[0]); $string = rcube_charset::convert($string, $charset, $dest_charset); - if ($string === false) { + + if ($string === false || !strlen($string)) { continue; } + $res .= substr($str, $last, $m[1] - $last - 1) . rcube_imap_generic::escape($string); $last = $m[0] + $string_offset - 1; } + if ($last < strlen($str)) { $res .= substr($str, $last, strlen($str)-$last); } @@ -1583,12 +1721,30 @@ class rcube_imap extends rcube_storage public function refresh_search() { if (!empty($this->search_string)) { - $this->search('', $this->search_string, $this->search_charset, $this->search_sort_field); + $this->search( + is_object($this->search_set) ? $this->search_set->get_parameters('MAILBOX') : '', + $this->search_string, + $this->search_charset, + $this->search_sort_field + ); } return $this->get_search_set(); } + /** + * Flag certain result subsets as 'incomplete'. + * For subsequent refresh_search() calls to only refresh the updated parts. + */ + protected function set_search_dirty($folder) + { + if ($this->search_set && is_a($this->search_set, 'rcube_result_multifolder')) { + if ($subset = $this->search_set->get_set($folder)) { + $subset->incomplete = $this->search_set->incomplete = true; + } + } + } + /** * Return message headers object of a specific message @@ -1601,6 +1757,11 @@ class rcube_imap extends rcube_storage */ public function get_message_headers($uid, $folder = null, $force = false) { + // decode combined UID-folder identifier + if (preg_match('/^\d+-.+/', $uid)) { + list($uid, $folder) = explode('-', $uid, 2); + } + if (!strlen($folder)) { $folder = $this->folder; } @@ -1615,6 +1776,9 @@ class rcube_imap extends rcube_storage else { $headers = $this->conn->fetchHeader( $folder, $uid, true, true, $this->get_fetch_headers()); + + if (is_object($headers)) + $headers->folder = $folder; } return $headers; @@ -1636,6 +1800,11 @@ class rcube_imap extends rcube_storage $folder = $this->folder; } + // decode combined UID-folder identifier + if (preg_match('/^\d+-.+/', $uid)) { + list($uid, $folder) = explode('-', $uid, 2); + } + // Check internal cache if (!empty($this->icache['message'])) { if (($headers = $this->icache['message']) && $headers->uid == $uid) { @@ -1679,7 +1848,7 @@ class rcube_imap extends rcube_storage $this->struct_charset = $this->structure_charset($structure); } - $headers->ctype = strtolower($headers->ctype); + $headers->ctype = @strtolower($headers->ctype); // Here we can recognize malformed BODYSTRUCTURE and // 1. [@TODO] parse the message in other way to create our own message structure @@ -2282,6 +2451,8 @@ class rcube_imap extends rcube_storage $this->clear_message_cache($folder, $all_mode ? null : explode(',', $uids)); } } + + $this->set_search_dirty($folder); } return $result; @@ -2329,6 +2500,17 @@ class rcube_imap extends rcube_storage if ($saved) { // increase messagecount of the target folder $this->set_messagecount($folder, 'ALL', 1); + + rcube::get_instance()->plugins->exec_hook('message_saved', array( + 'folder' => $folder, + 'message' => $message, + 'headers' => $headers, + 'is_file' => $is_file, + 'flags' => $flags, + 'date' => $date, + 'binary' => $binary, + 'result' => $saved, + )); } return $saved; @@ -2365,19 +2547,7 @@ class rcube_imap extends rcube_storage return false; } - // make sure folder exists - if ($to_mbox != 'INBOX' && !$this->folder_exists($to_mbox)) { - if (in_array($to_mbox, $this->default_folders)) { - if (!$this->create_folder($to_mbox, true)) { - return false; - } - } - else { - return false; - } - } - - $config = rcube::get_instance()->config; + $config = rcube::get_instance()->config; $to_trash = $to_mbox == $config->get('trash_mbox'); // flag messages as read before moving them @@ -2392,6 +2562,9 @@ class rcube_imap extends rcube_storage if ($moved) { $this->clear_messagecount($from_mbox); $this->clear_messagecount($to_mbox); + + $this->set_search_dirty($from_mbox); + $this->set_search_dirty($to_mbox); } // moving failed else if ($to_trash && $config->get('delete_always', false)) { @@ -2408,8 +2581,8 @@ class rcube_imap extends rcube_storage if ($this->search_threads || $all_mode) { $this->refresh_search(); } - else { - $this->search_set->filter(explode(',', $uids)); + else if (!$this->search_set->incomplete) { + $this->search_set->filter(explode(',', $uids), $this->folder); } } @@ -2448,18 +2621,6 @@ class rcube_imap extends rcube_storage return false; } - // make sure folder exists - if ($to_mbox != 'INBOX' && !$this->folder_exists($to_mbox)) { - if (in_array($to_mbox, $this->default_folders)) { - if (!$this->create_folder($to_mbox, true)) { - return false; - } - } - else { - return false; - } - } - // copy messages $copied = $this->conn->copy($uids, $from_mbox, $to_mbox); @@ -2508,13 +2669,15 @@ class rcube_imap extends rcube_storage // unset threads internal cache unset($this->icache['threads']); + $this->set_search_dirty($folder); + // remove message ids from search set if ($this->search_set && $folder == $this->folder) { // threads are too complicated to just remove messages from set if ($this->search_threads || $all_mode) { $this->refresh_search(); } - else { + else if (!$this->search_set->incomplete) { $this->search_set->filter(explode(',', $uids)); } } @@ -2975,16 +3138,17 @@ class rcube_imap extends rcube_storage * * @param string $folder New folder name * @param boolean $subscribe True if the new folder should be subscribed + * @param string $type Optional folder type (junk, trash, drafts, sent, archive) * * @return boolean True on success */ - public function create_folder($folder, $subscribe=false) + public function create_folder($folder, $subscribe = false, $type = null) { if (!$this->check_connection()) { return false; } - $result = $this->conn->createFolder($folder); + $result = $this->conn->createFolder($folder, $type ? array("\\" . ucfirst($type)) : null); // try to subscribe it if ($result) { @@ -3109,19 +3273,84 @@ class rcube_imap extends rcube_storage /** - * Create all folders specified as default + * Detect special folder associations stored in storage backend */ - public function create_default_folders() + public function get_special_folders($forced = false) { - // create default folders if they do not exist - foreach ($this->default_folders as $folder) { - if (!$this->folder_exists($folder)) { - $this->create_folder($folder, true); + $result = parent::get_special_folders(); + + if (isset($this->icache['special-use'])) { + return array_merge($result, $this->icache['special-use']); + } + + if (!$forced || !$this->get_capability('SPECIAL-USE')) { + return $result; + } + + if (!$this->check_connection()) { + return $result; + } + + $types = array_map(function($value) { return "\\" . ucfirst($value); }, rcube_storage::$folder_types); + $special = array(); + + // request \Subscribed flag in LIST response as performance improvement for folder_exists() + $folders = $this->conn->listMailboxes('', '*', array('SUBSCRIBED'), array('SPECIAL-USE')); + + foreach ($folders as $folder) { + if ($flags = $this->conn->data['LIST'][$folder]) { + foreach ($types as $type) { + if (in_array($type, $flags)) { + $type = strtolower(substr($type, 1)); + $special[$type] = $folder; + } + } } - else if (!$this->folder_exists($folder, true)) { - $this->subscribe($folder); + } + + $this->icache['special-use'] = $special; + unset($this->icache['special-folders']); + + return array_merge($result, $special); + } + + + /** + * Set special folder associations stored in storage backend + */ + public function set_special_folders($specials) + { + if (!$this->get_capability('SPECIAL-USE') || !$this->get_capability('METADATA')) { + return false; + } + + if (!$this->check_connection()) { + return false; + } + + $folders = $this->get_special_folders(true); + $old = (array) $this->icache['special-use']; + + foreach ($specials as $type => $folder) { + if (in_array($type, rcube_storage::$folder_types)) { + $old_folder = $old[$type]; + if ($old_folder !== $folder) { + // unset old-folder metadata + if ($old_folder !== null) { + $this->delete_metadata($old_folder, array('/private/specialuse')); + } + // set new folder metadata + if ($folder) { + $this->set_metadata($folder, array('/private/specialuse' => "\\" . ucfirst($type))); + } + } } } + + $this->icache['special-use'] = $specials; + unset($this->icache['special-folders']); + + return true; } @@ -3133,13 +3362,13 @@ class rcube_imap extends rcube_storage * * @return boolean TRUE or FALSE */ - public function folder_exists($folder, $subscription=false) + public function folder_exists($folder, $subscription = false) { if ($folder == 'INBOX') { return true; } - $key = $subscription ? 'subscribed' : 'existing'; + $key = $subscription ? 'subscribed' : 'existing'; if (is_array($this->icache[$key]) && in_array($folder, $this->icache[$key])) { return true; @@ -3150,10 +3379,24 @@ class rcube_imap extends rcube_storage } if ($subscription) { - $a_folders = $this->conn->listSubscribed('', $folder); + // It's possible we already called LIST command, check LIST data + if (!empty($this->conn->data['LIST']) && !empty($this->conn->data['LIST'][$folder]) + && in_array('\\Subscribed', $this->conn->data['LIST'][$folder]) + ) { + $a_folders = array($folder); + } + else { + $a_folders = $this->conn->listSubscribed('', $folder); + } } else { - $a_folders = $this->conn->listMailboxes('', $folder); + // It's possible we already called LIST command, check LIST data + if (!empty($this->conn->data['LIST']) && isset($this->conn->data['LIST'][$folder])) { + $a_folders = array($folder); + } + else { + $a_folders = $this->conn->listMailboxes('', $folder); + } } if (is_array($a_folders) && in_array($folder, $a_folders)) { @@ -3364,7 +3607,7 @@ class rcube_imap extends rcube_storage $options['name'] = $folder; $options['attributes'] = $this->folder_attributes($folder, true); $options['namespace'] = $this->folder_namespace($folder); - $options['special'] = in_array($folder, $this->default_folders); + $options['special'] = $this->is_special_folder($folder); // Set 'noselect' flag if (is_array($options['attributes'])) { @@ -3899,58 +4142,72 @@ class rcube_imap extends rcube_storage */ public function sort_folder_list($a_folders, $skip_default = false) { - $a_out = $a_defaults = $folders = array(); + $specials = array_merge(array('INBOX'), array_values($this->get_special_folders())); + $folders = array(); - $delimiter = $this->get_hierarchy_delimiter(); - - // find default folders and skip folders starting with '.' + // convert names to UTF-8 and skip folders starting with '.' foreach ($a_folders as $folder) { - if ($folder[0] == '.') { - continue; + if ($folder[0] != '.') { + // for better performance skip encoding conversion + // if the string does not look like UTF7-IMAP + $folders[$folder] = strpos($folder, '&') === false ? $folder : rcube_charset::convert($folder, 'UTF7-IMAP'); } + } - if (!$skip_default && ($p = array_search($folder, $this->default_folders)) !== false && !$a_defaults[$p]) { - $a_defaults[$p] = $folder; - } - else { - $folders[$folder] = rcube_charset::convert($folder, 'UTF7-IMAP'); - } + // sort folders + // asort($folders, SORT_LOCALE_STRING) is not properly sorting case sensitive names + uasort($folders, array($this, 'sort_folder_comparator')); + + $folders = array_keys($folders); + + if ($skip_default) { + return $folders; } - // sort folders and place defaults on the top - asort($folders, SORT_LOCALE_STRING); - ksort($a_defaults); - $folders = array_merge($a_defaults, array_keys($folders)); + // force the type of folder name variable (#1485527) + $folders = array_map('strval', $folders); + $specials = array_unique(array_intersect($specials, $folders)); + $head = array(); + + // place default folders on top + foreach ($specials as $special) { + $prefix = $special . $this->delimiter; - // finally we must rebuild the list to move - // subfolders of default folders to their place... - // ...also do this for the rest of folders because - // asort() is not properly sorting case sensitive names - while (list($key, $folder) = each($folders)) { - // set the type of folder name variable (#1485527) - $a_out[] = (string) $folder; - unset($folders[$key]); - $this->rsort($folder, $delimiter, $folders, $a_out); + foreach ($folders as $idx => $folder) { + if ($folder === $special) { + $head[] = $special; + unset($folders[$idx]); + } + // put subfolders of default folders on their place... + else if (strpos($folder, $prefix) === 0) { + $head[] = $folder; + unset($folders[$idx]); + } + } } - return $a_out; + return array_merge($head, $folders); } /** - * Recursive method for sorting folders + * Callback for uasort() that implements correct + * locale-aware case-sensitive sorting */ - protected function rsort($folder, $delimiter, &$list, &$out) + protected function sort_folder_comparator($str1, $str2) { - while (list($key, $name) = each($list)) { - if (strpos($name, $folder.$delimiter) === 0) { - // set the type of folder name variable (#1485527) - $out[] = (string) $name; - unset($list[$key]); - $this->rsort($name, $delimiter, $list, $out); + $path1 = explode($this->delimiter, $str1); + $path2 = explode($this->delimiter, $str2); + + foreach ($path1 as $idx => $folder1) { + $folder2 = $path2[$idx]; + + if ($folder1 === $folder2) { + continue; } + + return strcoll($folder1, $folder2); } - reset($list); } diff --git a/program/lib/Roundcube/rcube_imap_cache.php b/program/lib/Roundcube/rcube_imap_cache.php index 0c3edeaad..e49e77803 100644 --- a/program/lib/Roundcube/rcube_imap_cache.php +++ b/program/lib/Roundcube/rcube_imap_cache.php @@ -171,7 +171,7 @@ class rcube_imap_cache // Seek in internal cache if (array_key_exists('index', $this->icache[$mailbox])) { // The index was fetched from database already, but not validated yet - if (!array_key_exists('object', $this->icache[$mailbox]['index'])) { + if (empty($this->icache[$mailbox]['index']['validated'])) { $index = $this->icache[$mailbox]['index']; } // We've got a valid index @@ -248,6 +248,7 @@ class rcube_imap_cache } $this->icache[$mailbox]['index'] = array( + 'validated' => true, 'object' => $data, 'sort_field' => $sort_field, 'modseq' => !empty($index['modseq']) ? $index['modseq'] : $mbox_data['HIGHESTMODSEQ'] @@ -890,6 +891,8 @@ class rcube_imap_cache return false; } + $index['validated'] = true; + // Get mailbox data (UIDVALIDITY, counters, etc.) for status check $mbox_data = $this->imap->folder_data($mailbox); diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index f9a62f010..3b5be15db 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -73,6 +73,7 @@ class rcube_imap_generic const COMMAND_NORESPONSE = 1; const COMMAND_CAPABILITY = 2; const COMMAND_LASTLINE = 4; + const COMMAND_ANONYMIZED = 8; const DEBUG_LINE_LENGTH = 4098; // 4KB + 2B for \r\n @@ -88,16 +89,28 @@ class rcube_imap_generic * * @param string $string Command string * @param bool $endln True if CRLF need to be added at the end of command + * @param bool $anonymized Don't write the given data to log but a placeholder * * @param int Number of bytes sent, False on error */ - function putLine($string, $endln=true) + function putLine($string, $endln=true, $anonymized=false) { if (!$this->fp) return false; if ($this->_debug) { - $this->debug('C: '. rtrim($string)); + // anonymize the sent command for logging + $cut = $endln ? 2 : 0; + if ($anonymized && preg_match('/^(A\d+ (?:[A-Z]+ )+)(.+)/', $string, $m)) { + $log = $m[1] . sprintf('****** [%d]', strlen($m[2]) - $cut); + } + else if ($anonymized) { + $log = sprintf('****** [%d]', strlen($string) - $cut); + } + else { + $log = rtrim($string); + } + $this->debug('C: ' . $log); } $res = fwrite($this->fp, $string . ($endln ? "\r\n" : '')); @@ -116,10 +129,11 @@ class rcube_imap_generic * * @param string $string Command string * @param bool $endln True if CRLF need to be added at the end of command + * @param bool $anonymized Don't write the given data to log but a placeholder * * @return int|bool Number of bytes sent, False on error */ - function putLineC($string, $endln=true) + function putLineC($string, $endln=true, $anonymized=false) { if (!$this->fp) { return false; @@ -138,7 +152,7 @@ class rcube_imap_generic $parts[$i+1] = sprintf("{%d+}\r\n", $matches[1]); } - $bytes = $this->putLine($parts[$i].$parts[$i+1], false); + $bytes = $this->putLine($parts[$i].$parts[$i+1], false, $anonymized); if ($bytes === false) return false; $res += $bytes; @@ -153,7 +167,7 @@ class rcube_imap_generic $i++; } else { - $bytes = $this->putLine($parts[$i], false); + $bytes = $this->putLine($parts[$i], false, $anonymized); if ($bytes === false) return false; $res += $bytes; @@ -519,7 +533,7 @@ class rcube_imap_generic $reply = base64_encode($user . ' ' . $hash); // send result - $this->putLine($reply); + $this->putLine($reply, true, true); } else { // RFC2831: DIGEST-MD5 @@ -537,7 +551,7 @@ class rcube_imap_generic base64_decode($challenge), $this->host, 'imap', $user)); // send result - $this->putLine($reply); + $this->putLine($reply, true, true); $line = trim($this->readReply()); if ($line[0] == '+') { @@ -577,7 +591,7 @@ class rcube_imap_generic // RFC 4959 (SASL-IR): save one round trip if ($this->getCapability('SASL-IR')) { list($result, $line) = $this->execute("AUTHENTICATE PLAIN", array($reply), - self::COMMAND_LASTLINE | self::COMMAND_CAPABILITY); + self::COMMAND_LASTLINE | self::COMMAND_CAPABILITY | self::COMMAND_ANONYMIZED); } else { $this->putLine($this->nextTag() . " AUTHENTICATE PLAIN"); @@ -588,7 +602,7 @@ class rcube_imap_generic } // send result, get reply and process it - $this->putLine($reply); + $this->putLine($reply, true, true); $line = $this->readReply(); $result = $this->parseResult($line); } @@ -619,7 +633,7 @@ class rcube_imap_generic function login($user, $password) { list($code, $response) = $this->execute('LOGIN', array( - $this->escape($user), $this->escape($password)), self::COMMAND_CAPABILITY); + $this->escape($user), $this->escape($password)), self::COMMAND_CAPABILITY | self::COMMAND_ANONYMIZED); // re-set capabilities list if untagged CAPABILITY response provided if (preg_match('/\* CAPABILITY (.+)/i', $response, $matches)) { @@ -1177,13 +1191,20 @@ class rcube_imap_generic * Folder creation (CREATE) * * @param string $mailbox Mailbox name + * @param array $types Optional folder types (RFC 6154) * * @return bool True on success, False on error */ - function createFolder($mailbox) + function createFolder($mailbox, $types = null) { - $result = $this->execute('CREATE', array($this->escape($mailbox)), - self::COMMAND_NORESPONSE); + $args = array($this->escape($mailbox)); + + // RFC 6154: CREATE-SPECIAL-USE + if (!empty($types) && $this->getCapability('CREATE-SPECIAL-USE')) { + $args[] = '(USE (' . implode(' ', $types) . '))'; + } + + $result = $this->execute('CREATE', $args, self::COMMAND_NORESPONSE); return ($result == self::ERROR_OK); } @@ -1279,10 +1300,12 @@ class rcube_imap_generic * @param string $ref Reference name * @param string $mailbox Mailbox name * @param bool $subscribed Enables returning subscribed mailboxes only - * @param array $status_opts List of STATUS options (RFC5819: LIST-STATUS) - * Possible: MESSAGES, RECENT, UIDNEXT, UIDVALIDITY, UNSEEN + * @param array $status_opts List of STATUS options + * (RFC5819: LIST-STATUS: MESSAGES, RECENT, UIDNEXT, UIDVALIDITY, UNSEEN) + * or RETURN options (RFC5258: LIST_EXTENDED: SUBSCRIBED, CHILDREN) * @param array $select_opts List of selection options (RFC5258: LIST-EXTENDED) - * Possible: SUBSCRIBED, RECURSIVEMATCH, REMOTE + * Possible: SUBSCRIBED, RECURSIVEMATCH, REMOTE, + * SPECIAL-USE (RFC6154) * * @return array List of mailboxes or hash of options if $status_ops argument * is non-empty. @@ -1295,6 +1318,7 @@ class rcube_imap_generic } $args = array(); + $rets = array(); if (!empty($select_opts) && $this->getCapability('LIST-EXTENDED')) { $select_opts = (array) $select_opts; @@ -1305,11 +1329,21 @@ class rcube_imap_generic $args[] = $this->escape($ref); $args[] = $this->escape($mailbox); + if (!empty($status_opts) && $this->getCapability('LIST-EXTENDED')) { + $rets = array_intersect($status_opts, array('SUBSCRIBED', 'CHILDREN')); + } + if (!empty($status_opts) && $this->getCapability('LIST-STATUS')) { - $status_opts = (array) $status_opts; - $lstatus = true; + $status_opts = array_intersect($status_opts, array('MESSAGES', 'RECENT', 'UIDNEXT', 'UIDVALIDITY', 'UNSEEN')); + + if (!empty($status_opts)) { + $lstatus = true; + $rets[] = 'STATUS (' . implode(' ', $status_opts) . ')'; + } + } - $args[] = 'RETURN (STATUS (' . implode(' ', $status_opts) . '))'; + if (!empty($rets)) { + $args[] = 'RETURN (' . implode(' ', $rets) . ')'; } list($code, $response) = $this->execute($subscribed ? 'LSUB' : 'LIST', $args); @@ -1555,23 +1589,23 @@ class rcube_imap_generic * * @param string $mailbox Mailbox name * @param string $field Field to sort by (ARRIVAL, CC, DATE, FROM, SIZE, SUBJECT, TO) - * @param string $add Searching criteria + * @param string $criteria Searching criteria * @param bool $return_uid Enables UID SORT usage * @param string $encoding Character set * * @return rcube_result_index Response data */ - function sort($mailbox, $field, $add='', $return_uid=false, $encoding = 'US-ASCII') + function sort($mailbox, $field = 'ARRIVAL', $criteria = '', $return_uid = false, $encoding = 'US-ASCII') { - $field = strtoupper($field); + $old_sel = $this->selected; + $supported = array('ARRIVAL', 'CC', 'DATE', 'FROM', 'SIZE', 'SUBJECT', 'TO'); + $field = strtoupper($field); + if ($field == 'INTERNALDATE') { $field = 'ARRIVAL'; } - $fields = array('ARRIVAL' => 1,'CC' => 1,'DATE' => 1, - 'FROM' => 1, 'SIZE' => 1, 'SUBJECT' => 1, 'TO' => 1); - - if (!$fields[$field]) { + if (!in_array($field, $supported)) { return new rcube_result_index($mailbox); } @@ -1579,18 +1613,21 @@ class rcube_imap_generic return new rcube_result_index($mailbox); } + // return empty result when folder is empty and we're just after SELECT + if ($old_sel != $mailbox && !$this->data['EXISTS']) { + return new rcube_result_index($mailbox, '* SORT'); + } + // RFC 5957: SORT=DISPLAY if (($field == 'FROM' || $field == 'TO') && $this->getCapability('SORT=DISPLAY')) { $field = 'DISPLAY' . $field; } - // message IDs - if (!empty($add)) { - $add = $this->compressMessageSet($add); - } + $encoding = $encoding ? trim($encoding) : 'US-ASCII'; + $criteria = $criteria ? 'ALL ' . trim($criteria) : 'ALL'; list($code, $response) = $this->execute($return_uid ? 'UID SORT' : 'SORT', - array("($field)", $encoding, !empty($add) ? $add : 'ALL')); + array("($field)", $encoding, $criteria)); if ($code != self::ERROR_OK) { $response = null; @@ -1620,7 +1657,7 @@ class rcube_imap_generic // return empty result when folder is empty and we're just after SELECT if ($old_sel != $mailbox && !$this->data['EXISTS']) { - return new rcube_result_thread($mailbox); + return new rcube_result_thread($mailbox, '* THREAD'); } $encoding = $encoding ? trim($encoding) : 'US-ASCII'; @@ -3106,7 +3143,8 @@ class rcube_imap_generic if (isset($mbox) && is_array($data[$i])) { $size_sub = count($data[$i]); for ($x=0; $x<$size_sub; $x++) { - $result[$mbox][$data[$i][$x]] = $data[$i][++$x]; + if ($data[$i][$x+1] !== null) + $result[$mbox][$data[$i][$x]] = $data[$i][++$x]; } unset($data[$i]); } @@ -3124,7 +3162,8 @@ class rcube_imap_generic } } else if (isset($mbox)) { - $result[$mbox][$data[$i]] = $data[++$i]; + if ($data[$i+1] !== null) + $result[$mbox][$data[$i]] = $data[++$i]; unset($data[$i]); unset($data[$i-1]); } @@ -3269,10 +3308,10 @@ class rcube_imap_generic for ($x=0, $len=count($attribs); $x<$len;) { $attr = $attribs[$x++]; $value = $attribs[$x++]; - if ($attr == 'value.priv') { + if ($attr == 'value.priv' && $value !== null) { $result[$mbox]['/private' . $entry] = $value; } - else if ($attr == 'value.shared') { + else if ($attr == 'value.shared' && $value !== null) { $result[$mbox]['/shared' . $entry] = $value; } } @@ -3419,7 +3458,7 @@ class rcube_imap_generic } // Send command - if (!$this->putLineC($query)) { + if (!$this->putLineC($query, true, ($options & self::COMMAND_ANONYMIZED))) { $this->setError(self::ERROR_COMMAND, "Unable to send command: $query"); return $noresp ? self::ERROR_COMMAND : array(self::ERROR_COMMAND, ''); } diff --git a/program/lib/Roundcube/rcube_imap_search.php b/program/lib/Roundcube/rcube_imap_search.php new file mode 100644 index 000000000..365d78f76 --- /dev/null +++ b/program/lib/Roundcube/rcube_imap_search.php @@ -0,0 +1,231 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | This file is part of the Roundcube Webmail client | + | | + | Copyright (C) 2013, The Roundcube Dev Team | + | Copyright (C) 2014, Kolab Systems AG | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + | PURPOSE: | + | Execute (multi-threaded) searches in multiple IMAP folders | + +-----------------------------------------------------------------------+ + | Author: Thomas Bruederli <roundcube@gmail.com> | + +-----------------------------------------------------------------------+ +*/ + +/** + * Class to control search jobs on multiple IMAP folders. + * + * @package Framework + * @subpackage Storage + * @author Thomas Bruederli <roundcube@gmail.com> + */ +class rcube_imap_search +{ + public $options = array(); + + protected $jobs = array(); + protected $timelimit = 0; + protected $results; + protected $conn; + + /** + * Default constructor + */ + public function __construct($options, $conn) + { + $this->options = $options; + $this->conn = $conn; + } + + /** + * Invoke search request to IMAP server + * + * @param array $folders List of IMAP folders to search in + * @param string $str Search criteria + * @param string $charset Search charset + * @param string $sort_field Header field to sort by + * @param boolean $threading True if threaded listing is active + */ + public function exec($folders, $str, $charset = null, $sort_field = null, $threading=null) + { + $start = floor(microtime(true)); + $results = new rcube_result_multifolder($folders); + + // start a search job for every folder to search in + foreach ($folders as $folder) { + // a complete result for this folder already exists + $result = $this->results ? $this->results->get_set($folder) : false; + if ($result && !$result->incomplete) { + $results->add($result); + } + else { + $search = is_array($str) && $str[$folder] ? $str[$folder] : $str; + $job = new rcube_imap_search_job($folder, $search, $charset, $sort_field, $threading); + $job->worker = $this; + $this->jobs[] = $job; + } + } + + // execute jobs and gather results + foreach ($this->jobs as $job) { + // only run search if within the configured time limit + // TODO: try to estimate the required time based on folder size and previous search performance + if (!$this->timelimit || floor(microtime(true)) - $start < $this->timelimit) { + $job->run(); + } + + // add result (may have ->incomplete flag set) + $results->add($job->get_result()); + } + + return $results; + } + + /** + * Setter for timelimt property + */ + public function set_timelimit($seconds) + { + $this->timelimit = $seconds; + } + + /** + * Setter for previous (potentially incomplete) search results + */ + public function set_results($res) + { + $this->results = $res; + } + + /** + * Get connection to the IMAP server + * (used for single-thread mode) + */ + public function get_imap() + { + return $this->conn; + } +} + + +/** + * Stackable item to run the search on a specific IMAP folder + */ +class rcube_imap_search_job /* extends Stackable */ +{ + private $folder; + private $search; + private $charset; + private $sort_field; + private $threading; + private $searchset; + private $result; + private $pagesize = 100; + + public function __construct($folder, $str, $charset = null, $sort_field = null, $threading=false) + { + $this->folder = $folder; + $this->search = $str; + $this->charset = $charset; + $this->sort_field = $sort_field; + $this->threading = $threading; + + $this->result = new rcube_result_index($folder); + $this->result->incomplete = true; + } + + public function run() + { + $this->result = $this->search_index(); + } + + /** + * Copy of rcube_imap::search_index() + */ + protected function search_index() + { + $criteria = $this->search; + $charset = $this->charset; + $imap = $this->worker->get_imap(); + + if (!$imap->connected()) { + trigger_error("No IMAP connection for $this->folder", E_USER_WARNING); + + if ($this->threading) { + return new rcube_result_thread($this->folder); + } + else { + return new rcube_result_index($this->folder); + } + } + + if ($this->worker->options['skip_deleted'] && !preg_match('/UNDELETED/', $criteria)) { + $criteria = 'UNDELETED '.$criteria; + } + + // unset CHARSET if criteria string is ASCII, this way + // SEARCH won't be re-sent after "unsupported charset" response + if ($charset && $charset != 'US-ASCII' && is_ascii($criteria)) { + $charset = 'US-ASCII'; + } + + if ($this->threading) { + $threads = $imap->thread($this->folder, $this->threading, $criteria, true, $charset); + + // Error, try with US-ASCII (RFC5256: SORT/THREAD must support US-ASCII and UTF-8, + // but I've seen that Courier doesn't support UTF-8) + if ($threads->is_error() && $charset && $charset != 'US-ASCII') { + $threads = $imap->thread($this->folder, $this->threading, + rcube_imap::convert_criteria($criteria, $charset), true, 'US-ASCII'); + } + + return $threads; + } + + if ($this->sort_field) { + $messages = $imap->sort($this->folder, $this->sort_field, $criteria, true, $charset); + + // Error, try with US-ASCII (RFC5256: SORT/THREAD must support US-ASCII and UTF-8, + // but I've seen Courier with disabled UTF-8 support) + if ($messages->is_error() && $charset && $charset != 'US-ASCII') { + $messages = $imap->sort($this->folder, $this->sort_field, + rcube_imap::convert_criteria($criteria, $charset), true, 'US-ASCII'); + } + } + + if (!$messages || $messages->is_error()) { + $messages = $imap->search($this->folder, + ($charset && $charset != 'US-ASCII' ? "CHARSET $charset " : '') . $criteria, true); + + // Error, try with US-ASCII (some servers may support only US-ASCII) + if ($messages->is_error() && $charset && $charset != 'US-ASCII') { + $messages = $imap->search($this->folder, + rcube_imap::convert_criteria($criteria, $charset), true); + } + } + + return $messages; + } + + public function get_search_set() + { + return array( + $this->search, + $this->result, + $this->charset, + $this->sort_field, + $this->threading, + ); + } + + public function get_result() + { + return $this->result; + } +} diff --git a/program/lib/Roundcube/rcube_ldap.php b/program/lib/Roundcube/rcube_ldap.php index de3790e5c..5a4b9dd61 100644 --- a/program/lib/Roundcube/rcube_ldap.php +++ b/program/lib/Roundcube/rcube_ldap.php @@ -377,10 +377,11 @@ class rcube_ldap extends rcube_addressbook // replace placeholders in filter settings if (!empty($this->prop['filter'])) $this->prop['filter'] = strtr($this->prop['filter'], $replaces); - if (!empty($this->prop['groups']['filter'])) - $this->prop['groups']['filter'] = strtr($this->prop['groups']['filter'], $replaces); - if (!empty($this->prop['groups']['member_filter'])) - $this->prop['groups']['member_filter'] = strtr($this->prop['groups']['member_filter'], $replaces); + + foreach (array('base_dn','filter','member_filter') as $k) { + if (!empty($this->prop['groups'][$k])) + $this->prop['groups'][$k] = strtr($this->prop['groups'][$k], $replaces); + } if (!empty($this->prop['group_filters'])) { foreach ($this->prop['group_filters'] as $i => $gf) { @@ -1409,6 +1410,16 @@ class rcube_ldap extends rcube_addressbook $fieldmap['name'] = $this->group_data['name_attr'] ? $this->group_data['name_attr'] : $this->prop['groups']['name_attr']; } + // assign object type from object class mapping + if (!empty($this->prop['class_type_map'])) { + foreach (array_map('strtolower', (array)$rec['objectclass']) as $objcls) { + if (!empty($this->prop['class_type_map'][$objcls])) { + $out['_type'] = $this->prop['class_type_map'][$objcls]; + break; + } + } + } + foreach ($fieldmap as $rf => $lf) { for ($i=0; $i < $rec[$lf]['count']; $i++) { diff --git a/program/lib/Roundcube/rcube_ldap_generic.php b/program/lib/Roundcube/rcube_ldap_generic.php index 923a12a41..252eafabe 100644 --- a/program/lib/Roundcube/rcube_ldap_generic.php +++ b/program/lib/Roundcube/rcube_ldap_generic.php @@ -160,7 +160,7 @@ class rcube_ldap_generic $this->config['hosts'] = array($this->config['hosts']); foreach ($this->config['hosts'] as $host) { - if ($this->connect($host)) { + if (!empty($host) && $this->connect($host)) { return true; } } @@ -190,6 +190,9 @@ class rcube_ldap_generic if (isset($this->config['referrals'])) ldap_set_option($lc, LDAP_OPT_REFERRALS, $this->config['referrals']); + + if (isset($this->config['dereference'])) + ldap_set_option($lc, LDAP_OPT_DEREF, $this->config['dereference']); } else { $this->_debug("S: NOT OK"); @@ -240,7 +243,7 @@ class rcube_ldap_generic $method = 'DIGEST-MD5'; } - $this->_debug("C: SASL Bind [mech: $method, authc: $authc, authz: $authz, pass: $pass]"); + $this->_debug("C: SASL Bind [mech: $method, authc: $authc, authz: $authz, pass: **** [" . strlen($pass) . "]"); if (ldap_sasl_bind($this->conn, NULL, $pass, $method, NULL, $authc, $authz)) { $this->_debug("S: OK"); @@ -271,7 +274,7 @@ class rcube_ldap_generic return false; } - $this->_debug("C: Bind $dn [pass: $pass]"); + $this->_debug("C: Bind $dn, pass: **** [" . strlen($pass) . "]"); if (@ldap_bind($this->conn, $dn, $pass)) { $this->_debug("S: OK"); @@ -886,9 +889,10 @@ class rcube_ldap_generic } $this->vlv_config = array(); + $config_root_dn = $this->config['config_root_dn']; - $ldap_result = ldap_search($this->conn, $this->config['config_root_dn'], '(objectclass=vlvsearch)', array('*'), 0, 0, 0); - $vlv_searches = new rcube_ldap_result($this->conn, $ldap_result, $this->config['config_root_dn'], '(objectclass=vlvsearch)'); + $ldap_result = ldap_search($this->conn, $config_root_dn, '(objectclass=vlvsearch)', array('*'), 0, 0, 0); + $vlv_searches = new rcube_ldap_result($this->conn, $ldap_result, $config_root_dn, '(objectclass=vlvsearch)'); if ($vlv_searches->count() < 1) { $this->_debug("D: Empty result from search for '(objectclass=vlvsearch)' on '$config_root_dn'"); diff --git a/program/lib/Roundcube/rcube_message.php b/program/lib/Roundcube/rcube_message.php index f24ec3ed8..a648ae722 100644 --- a/program/lib/Roundcube/rcube_message.php +++ b/program/lib/Roundcube/rcube_message.php @@ -74,6 +74,11 @@ class rcube_message */ function __construct($uid, $folder = null) { + // decode combined UID-folder identifier + if (preg_match('/^\d+-.+/', $uid)) { + list($uid, $folder) = explode('-', $uid, 2); + } + $this->uid = $uid; $this->app = rcube::get_instance(); $this->storage = $this->app->get_storage(); diff --git a/program/lib/Roundcube/rcube_message_header.php b/program/lib/Roundcube/rcube_message_header.php index 2c5e2b6c8..2bda930eb 100644 --- a/program/lib/Roundcube/rcube_message_header.php +++ b/program/lib/Roundcube/rcube_message_header.php @@ -167,6 +167,13 @@ class rcube_message_header public $mdn_to; /** + * IMAP folder this message is stored in + * + * @var string + */ + public $folder; + + /** * Other message headers * * @var array @@ -189,6 +196,8 @@ class rcube_message_header 'reply-to' => 'replyto', 'cc' => 'cc', 'bcc' => 'bcc', + 'mbox' => 'folder', + 'folder' => 'folder', 'content-transfer-encoding' => 'encoding', 'in-reply-to' => 'in_reply_to', 'content-type' => 'ctype', diff --git a/program/lib/Roundcube/rcube_mime.php b/program/lib/Roundcube/rcube_mime.php index a931c27c1..370d5a8d5 100644 --- a/program/lib/Roundcube/rcube_mime.php +++ b/program/lib/Roundcube/rcube_mime.php @@ -366,6 +366,9 @@ class rcube_mime $address = 'MAILER-DAEMON'; $name = substr($val, 0, -strlen($m[1])); } + else if (preg_match('/('.$email_rx.')/', $val, $m)) { + $name = $m[1]; + } else { $name = $val; } @@ -378,11 +381,16 @@ class rcube_mime } if ($decode) { $name = self::decode_header($name, $fallback); + // some clients encode addressee name with quotes around it + if ($name[0] == '"' && $name[strlen($name)-1] == '"') { + $name = substr($name, 1, -1); + } } } if (!$address && $name) { $address = $name; + $name = ''; } if ($address) { @@ -472,15 +480,17 @@ class rcube_mime /** * Interpret a format=flowed message body according to RFC 2646 * - * @param string $text Raw body formatted as flowed text + * @param string $text Raw body formatted as flowed text + * @param string $mark Mark each flowed line with specified character * * @return string Interpreted text with unwrapped lines and stuffed space removed */ - public static function unfold_flowed($text) + public static function unfold_flowed($text, $mark = null) { $text = preg_split('/\r?\n/', $text); $last = -1; $q_level = 0; + $marks = array(); foreach ($text as $idx => $line) { if (preg_match('/^(>+)/', $line, $m)) { @@ -500,6 +510,10 @@ class rcube_mime ) { $text[$last] .= $line; unset($text[$idx]); + + if ($mark) { + $marks[$last] = true; + } } else { $last = $idx; @@ -512,7 +526,7 @@ class rcube_mime } else { // remove space-stuffing - $line = preg_replace('/^\s/', '', $line); + $line = preg_replace('/^ /', '', $line); if (isset($text[$last]) && $line && $text[$last] != '-- ' @@ -520,6 +534,10 @@ class rcube_mime ) { $text[$last] .= $line; unset($text[$idx]); + + if ($mark) { + $marks[$last] = true; + } } else { $text[$idx] = $line; @@ -530,6 +548,12 @@ class rcube_mime $q_level = $q; } + if (!empty($marks)) { + foreach (array_keys($marks) as $mk) { + $text[$mk] = $mark . $text[$mk]; + } + } + return implode("\r\n", $text); } diff --git a/program/lib/Roundcube/rcube_output.php b/program/lib/Roundcube/rcube_output.php index 7ccf9a02e..1907645b0 100644 --- a/program/lib/Roundcube/rcube_output.php +++ b/program/lib/Roundcube/rcube_output.php @@ -3,7 +3,7 @@ /* +-----------------------------------------------------------------------+ | This file is part of the Roundcube PHP suite | - | Copyright (C) 2005-2012 The Roundcube Dev Team | + | Copyright (C) 2005-2014 The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -31,6 +31,7 @@ abstract class rcube_output protected $config; protected $charset = RCUBE_CHARSET; protected $env = array(); + protected $skins = array(); /** @@ -49,9 +50,12 @@ abstract class rcube_output */ public function __get($var) { - // allow read-only access to $env - if ($var == 'env') - return $this->env; + // allow read-only access to some members + switch ($var) { + case 'env': return $this->env; + case 'skins': return $this->skins; + case 'charset': return $this->charset; + } return null; } diff --git a/program/lib/Roundcube/rcube_plugin.php b/program/lib/Roundcube/rcube_plugin.php index f0af95332..01c340deb 100644 --- a/program/lib/Roundcube/rcube_plugin.php +++ b/program/lib/Roundcube/rcube_plugin.php @@ -3,7 +3,7 @@ /* +-----------------------------------------------------------------------+ | This file is part of the Roundcube Webmail client | - | Copyright (C) 2008-2012, The Roundcube Dev Team | + | Copyright (C) 2008-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -394,7 +394,11 @@ abstract class rcube_plugin public function local_skin_path() { $rcube = rcube::get_instance(); - foreach (array($rcube->config->get('skin'), 'larry') as $skin) { + $skins = array_keys((array)$rcube->output->skins); + if (empty($skins)) { + $skins = array($rcube->config->get('skin')); + } + foreach ($skins as $skin) { $skin_path = 'skins/' . $skin; if (is_dir(realpath(slashify($this->home) . $skin_path))) { break; diff --git a/program/lib/Roundcube/rcube_plugin_api.php b/program/lib/Roundcube/rcube_plugin_api.php index 461c3cc07..feeeb192e 100644 --- a/program/lib/Roundcube/rcube_plugin_api.php +++ b/program/lib/Roundcube/rcube_plugin_api.php @@ -182,7 +182,7 @@ class rcube_plugin_api } // plugin already loaded - if ($this->plugins[$plugin_name] || class_exists($plugin_name, false)) { + if ($this->plugins[$plugin_name]) { return true; } @@ -190,7 +190,9 @@ class rcube_plugin_api . DIRECTORY_SEPARATOR . $plugin_name . '.php'; if (file_exists($fn)) { - include $fn; + if (!class_exists($plugin_name, false)) { + include $fn; + } // instantiate class if exists if (class_exists($plugin_name, false)) { diff --git a/program/lib/Roundcube/rcube_result_index.php b/program/lib/Roundcube/rcube_result_index.php index 5f592c54f..ffc1ad78a 100644 --- a/program/lib/Roundcube/rcube_result_index.php +++ b/program/lib/Roundcube/rcube_result_index.php @@ -26,6 +26,8 @@ */ class rcube_result_index { + public $incomplete = false; + protected $raw_data; protected $mailbox; protected $meta = array(); @@ -231,29 +233,13 @@ class rcube_result_index /** - * Filters data set. Removes elements listed in $ids list. + * Filters data set. Removes elements not listed in $ids list. * * @param array $ids List of IDs to remove. */ public function filter($ids = array()) { $data = $this->get(); - $data = array_diff($data, $ids); - - $this->meta = array(); - $this->meta['count'] = count($data); - $this->raw_data = implode(self::SEPARATOR_ELEMENT, $data); - } - - - /** - * Filters data set. Removes elements not listed in $ids list. - * - * @param array $ids List of IDs to keep. - */ - public function intersect($ids = array()) - { - $data = $this->get(); $data = array_intersect($data, $ids); $this->meta = array(); @@ -332,6 +318,7 @@ class rcube_result_index if (empty($this->raw_data)) { return array(); } + return explode(self::SEPARATOR_ELEMENT, $this->raw_data); } diff --git a/program/lib/Roundcube/rcube_result_multifolder.php b/program/lib/Roundcube/rcube_result_multifolder.php new file mode 100644 index 000000000..786ee85f6 --- /dev/null +++ b/program/lib/Roundcube/rcube_result_multifolder.php @@ -0,0 +1,337 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | This file is part of the Roundcube Webmail client | + | Copyright (C) 2005-2011, The Roundcube Dev Team | + | Copyright (C) 2011, Kolab Systems AG | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + | PURPOSE: | + | SORT/SEARCH/ESEARCH response handler | + +-----------------------------------------------------------------------+ + | Author: Thomas Bruederli <roundcube@gmail.com> | + +-----------------------------------------------------------------------+ +*/ + +/** + * Class holding a set of rcube_result_index instances that together form a + * result set of a multi-folder search + * + * @package Framework + * @subpackage Storage + */ +class rcube_result_multifolder +{ + public $multi = true; + public $sets = array(); + public $incomplete = false; + public $folder; + + protected $meta = array(); + protected $index = array(); + protected $folders = array(); + protected $order = 'ASC'; + protected $sorting; + + + /** + * Object constructor. + */ + public function __construct($folders = array()) + { + $this->folders = $folders; + $this->meta = array('count' => 0); + } + + + /** + * Initializes object with SORT command response + * + * @param string $data IMAP response string + */ + public function add($result) + { + $this->sets[] = $result; + + if ($result->count()) { + $this->append_result($result); + } + else if ($result->incomplete) { + $this->incomplete = true; + } + } + + /** + * Append message UIDs from the given result to our index + */ + protected function append_result($result) + { + $this->meta['count'] += $result->count(); + + // append UIDs to global index + $folder = $result->get_parameters('MAILBOX'); + $index = array_map(function($uid) use ($folder) { return $uid . '-' . $folder; }, $result->get()); + + $this->index = array_merge($this->index, $index); + } + + /** + * Store a global index of (sorted) message UIDs + */ + public function set_message_index($headers, $sort_field, $sort_order) + { + $this->index = array(); + foreach ($headers as $header) { + $this->index[] = $header->uid . '-' . $header->folder; + } + + $this->sorting = $sort_field; + $this->order = $sort_order; + } + + /** + * Checks the result from IMAP command + * + * @return bool True if the result is an error, False otherwise + */ + public function is_error() + { + return false; + } + + + /** + * Checks if the result is empty + * + * @return bool True if the result is empty, False otherwise + */ + public function is_empty() + { + return empty($this->sets) || $this->meta['count'] == 0; + } + + + /** + * Returns number of elements in the result + * + * @return int Number of elements + */ + public function count() + { + return $this->meta['count']; + } + + + /** + * Returns number of elements in the result. + * Alias for count() for compatibility with rcube_result_thread + * + * @return int Number of elements + */ + public function count_messages() + { + return $this->count(); + } + + + /** + * Reverts order of elements in the result + */ + public function revert() + { + $this->order = $this->order == 'ASC' ? 'DESC' : 'ASC'; + $this->index = array(); + + // revert order in all sub-sets + foreach ($this->sets as $set) { + if ($this->order != $set->get_parameters('ORDER')) { + $set->revert(); + } + + $folder = $set->get_parameters('MAILBOX'); + $index = array_map(function($uid) use ($folder) { return $uid . '-' . $folder; }, $set->get()); + + $this->index = array_merge($this->index, $index); + } + } + + + /** + * Check if the given message ID exists in the object + * + * @param int $msgid Message ID + * @param bool $get_index When enabled element's index will be returned. + * Elements are indexed starting with 0 + * @return mixed False if message ID doesn't exist, True if exists or + * index of the element if $get_index=true + */ + public function exists($msgid, $get_index = false) + { + if (!empty($this->folder)) { + $msgid .= '-' . $this->folder; + } + + return array_search($msgid, $this->index); + } + + + /** + * Filters data set. Removes elements listed in $ids list. + * + * @param array $ids List of IDs to remove. + * @param string $folder IMAP folder + */ + public function filter($ids = array(), $folder = null) + { + $this->meta['count'] = 0; + foreach ($this->sets as $set) { + if ($set->get_parameters('MAILBOX') == $folder) { + $set->filter($ids); + } + + $this->meta['count'] += $set->count(); + } + } + + /** + * Slices data set. + * + * @param $offset Offset (as for PHP's array_slice()) + * @param $length Number of elements (as for PHP's array_slice()) + * + */ + public function slice($offset, $length) + { + $data = array_slice($this->get(), $offset, $length); + + $this->index = $data; + $this->meta['count'] = count($data); + } + + /** + * Filters data set. Removes elements not listed in $ids list. + * + * @param array $ids List of IDs to keep. + */ + public function intersect($ids = array()) + { + // not implemented + } + + /** + * Return all messages in the result. + * + * @return array List of message IDs + */ + public function get() + { + return $this->index; + } + + + /** + * Return all messages in the result. + * + * @return array List of message IDs + */ + public function get_compressed() + { + return ''; + } + + + /** + * Return result element at specified index + * + * @param int|string $index Element's index or "FIRST" or "LAST" + * + * @return int Element value + */ + public function get_element($idx) + { + switch ($idx) { + case 'FIRST': return $this->index[0]; + case 'LAST': return end($this->index); + default: return $this->index[$idx]; + } + } + + + /** + * Returns response parameters, e.g. ESEARCH's MIN/MAX/COUNT/ALL/MODSEQ + * or internal data e.g. MAILBOX, ORDER + * + * @param string $param Parameter name + * + * @return array|string Response parameters or parameter value + */ + public function get_parameters($param=null) + { + $params = array( + 'SORT' => $this->sorting, + 'ORDER' => $this->order, + 'MAILBOX' => $this->folders, + ); + + if ($param !== null) { + return $params[$param]; + } + + return $params; + } + + /** + * Returns the stored result object for a particular folder + * + * @param string $folder Folder name + * @return false|obejct rcube_result_* instance of false if none found + */ + public function get_set($folder) + { + foreach ($this->sets as $set) { + if ($set->get_parameters('MAILBOX') == $folder) { + return $set; + } + } + + return false; + } + + /** + * Returns length of internal data representation + * + * @return int Data length + */ + protected function length() + { + return $this->count(); + } + + + /* Serialize magic methods */ + + public function __sleep() + { + return array('sets','folders','sorting','order'); + } + + public function __wakeup() + { + // restore index from saved result sets + $this->meta = array('count' => 0); + + foreach ($this->sets as $result) { + if ($result->count()) { + $this->append_result($result); + } + else if ($result->incomplete) { + $this->incomplete = true; + } + } + } + +} diff --git a/program/lib/Roundcube/rcube_result_set.php b/program/lib/Roundcube/rcube_result_set.php index a4b070e28..82502ce5f 100644 --- a/program/lib/Roundcube/rcube_result_set.php +++ b/program/lib/Roundcube/rcube_result_set.php @@ -25,7 +25,7 @@ * @package Framework * @subpackage Addressbook */ -class rcube_result_set implements Iterator +class rcube_result_set implements Iterator, ArrayAccess { public $count = 0; public $first = 0; @@ -61,6 +61,34 @@ class rcube_result_set implements Iterator $this->current = $i; } + /*** Implement PHP ArrayAccess interface ***/ + + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $offset = count($this->records); + $this->records[] = $value; + } + else { + $this->records[$offset] = $value; + } + } + + public function offsetExists($offset) + { + return isset($this->records[$offset]); + } + + public function offsetUnset($offset) + { + unset($this->records[$offset]); + } + + public function offsetGet($offset) + { + return $this->records[$offset]; + } + /*** PHP 5 Iterator interface ***/ function rewind() diff --git a/program/lib/Roundcube/rcube_result_thread.php b/program/lib/Roundcube/rcube_result_thread.php index c7f21db53..168761696 100644 --- a/program/lib/Roundcube/rcube_result_thread.php +++ b/program/lib/Roundcube/rcube_result_thread.php @@ -26,6 +26,8 @@ */ class rcube_result_thread { + public $incomplete = false; + protected $raw_data; protected $mailbox; protected $meta = array(); @@ -453,7 +455,7 @@ class rcube_result_thread // when sorting search result it's good to make the index smaller if ($index->count() != $this->count_messages()) { - $index->intersect($this->get()); + $index->filter($this->get()); } $result = array_fill_keys($index->get(), null); diff --git a/program/lib/Roundcube/rcube_session.php b/program/lib/Roundcube/rcube_session.php index caca262c6..26f78433a 100644 --- a/program/lib/Roundcube/rcube_session.php +++ b/program/lib/Roundcube/rcube_session.php @@ -3,7 +3,7 @@ /* +-----------------------------------------------------------------------+ | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2012, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | Copyright (C) 2011, Kolab Systems AG | | | | Licensed under the GNU General Public License version 3 or | @@ -47,6 +47,13 @@ class rcube_session private $storage; private $memcache; + /** + * Blocks session data from being written to database. + * Can be used if write-race conditions are to be expected + * @var boolean + */ + public $nowrite = false; + /** * Default constructor @@ -201,6 +208,9 @@ class rcube_session $table = $this->db->table_name('session'); $ts = microtime(true); + if ($this->nowrite) + return true; + // no session row in DB (db_read() returns false) if (!$this->key) { $oldvars = null; diff --git a/program/lib/Roundcube/rcube_smtp.php b/program/lib/Roundcube/rcube_smtp.php index 60b1389ea..70f15dc7b 100644 --- a/program/lib/Roundcube/rcube_smtp.php +++ b/program/lib/Roundcube/rcube_smtp.php @@ -29,6 +29,7 @@ class rcube_smtp private $conn = null; private $response; private $error; + private $anonymize_log = 0; // define headers delimiter const SMTP_MIME_CRLF = "\r\n"; @@ -67,6 +68,7 @@ class rcube_smtp 'smtp_auth_type' => $rcube->config->get('smtp_auth_type'), 'smtp_helo_host' => $rcube->config->get('smtp_helo_host'), 'smtp_timeout' => $rcube->config->get('smtp_timeout'), + 'smtp_conn_options' => $rcube->config->get('smtp_conn_options'), 'smtp_auth_callbacks' => array(), )); @@ -106,10 +108,11 @@ class rcube_smtp // IDNA Support $smtp_host = rcube_utils::idn_to_ascii($smtp_host); - $this->conn = new Net_SMTP($smtp_host, $smtp_port, $helo_host); + $this->conn = new Net_SMTP($smtp_host, $smtp_port, $helo_host, false, 0, $CONFIG['smtp_conn_options']); if ($rcube->config->get('smtp_debug')) { $this->conn->setDebug(true, array($this, 'debug_handler')); + $this->anonymize_log = 0; } // register authentication methods @@ -329,6 +332,15 @@ class rcube_smtp */ public function debug_handler(&$smtp, $message) { + // catch AUTH commands and set anonymization flag for subsequent sends + if (preg_match('/^Send: AUTH ([A-Z]+)/', $message, $m)) { + $this->anonymize_log = $m[1] == 'LOGIN' ? 2 : 1; + } + // anonymize this log entry + else if ($this->anonymize_log > 0 && strpos($message, 'Send:') === 0 && --$this->anonymize_log == 0) { + $message = sprintf('Send: ****** [%d]', strlen($message) - 8); + } + if (($len = strlen($message)) > self::DEBUG_LINE_LENGTH) { $diff = $len - self::DEBUG_LINE_LENGTH; $message = substr($message, 0, self::DEBUG_LINE_LENGTH) diff --git a/program/lib/Roundcube/rcube_spellcheck_googie.php b/program/lib/Roundcube/rcube_spellcheck_googie.php index 3777942a6..f9e450fdd 100644 --- a/program/lib/Roundcube/rcube_spellcheck_googie.php +++ b/program/lib/Roundcube/rcube_spellcheck_googie.php @@ -56,6 +56,10 @@ class rcube_spellcheck_googie extends rcube_spellcheck_engine { $this->content = $text; + if (empty($text)) { + return $this->matches = array(); + } + // spell check uri is configured $url = rcube::get_instance()->config->get('spellcheck_uri'); diff --git a/program/lib/Roundcube/rcube_spellchecker.php b/program/lib/Roundcube/rcube_spellchecker.php index 3d15eb660..43bab08c4 100644 --- a/program/lib/Roundcube/rcube_spellchecker.php +++ b/program/lib/Roundcube/rcube_spellchecker.php @@ -273,7 +273,7 @@ class rcube_spellchecker public function is_exception($word) { // Contain only symbols (e.g. "+9,0", "2:2") - if (!$word || preg_match('/^[0-9@#$%^&_+~*=:;?!,.-]+$/', $word)) + if (!$word || preg_match('/^[0-9@#$%^&_+~*<>=:;?!,.-]+$/', $word)) return true; // Contain symbols (e.g. "g@@gle"), all symbols excluding separators diff --git a/program/lib/Roundcube/rcube_storage.php b/program/lib/Roundcube/rcube_storage.php index ca65af1cb..c1293961c 100644 --- a/program/lib/Roundcube/rcube_storage.php +++ b/program/lib/Roundcube/rcube_storage.php @@ -35,9 +35,15 @@ abstract class rcube_storage */ public $conn; + /** + * List of supported special folder types + * + * @var array + */ + public static $folder_types = array('drafts', 'sent', 'junk', 'trash'); + protected $folder = 'INBOX'; protected $default_charset = 'ISO-8859-1'; - protected $default_folders = array('INBOX'); protected $search_set; protected $options = array('auth_type' => 'check'); protected $page_size = 10; @@ -146,6 +152,19 @@ abstract class rcube_storage /** + * Get connection/class option + * + * @param string $name Option name + * + * @param mixed Option value + */ + public function get_option($name) + { + return $this->options[$name]; + } + + + /** * Activate/deactivate debug mode. * * @param boolean $dbg True if conversation with the server should be logged @@ -167,24 +186,6 @@ abstract class rcube_storage /** - * This list of folders will be listed above all other folders - * - * @param array $arr Indexed list of folder names - */ - public function set_default_folders($arr) - { - if (is_array($arr)) { - $this->default_folders = $arr; - - // add inbox if not included - if (!in_array('INBOX', $this->default_folders)) { - array_unshift($this->default_folders, 'INBOX'); - } - } - } - - - /** * Set internal folder reference. * All operations will be perfomed on this folder. * @@ -613,7 +614,7 @@ abstract class rcube_storage /** * Parse message UIDs input * - * @param mixed $uids UIDs array or comma-separated list or '*' or '1:*' + * @param mixed $uids UIDs array or comma-separated list or '*' or '1:*' * * @return array Two elements array with UIDs converted to list and ALL flag */ @@ -633,6 +634,9 @@ abstract class rcube_storage if (is_array($uids)) { $uids = join(',', $uids); } + else if (strpos($uids, ':')) { + $uids = join(',', rcube_imap_generic::uncompressMessageSet($uids)); + } if (preg_match('/[^0-9,]/', $uids)) { $uids = ''; @@ -855,15 +859,59 @@ abstract class rcube_storage */ public function create_default_folders() { + $rcube = rcube::get_instance(); + // create default folders if they do not exist - foreach ($this->default_folders as $folder) { - if (!$this->folder_exists($folder)) { - $this->create_folder($folder, true); + foreach (self::$folder_types as $type) { + if ($folder = $rcube->config->get($type . '_mbox')) { + if (!$this->folder_exists($folder)) { + $this->create_folder($folder, true, $type); + } + else if (!$this->folder_exists($folder, true)) { + $this->subscribe($folder); + } } - else if (!$this->folder_exists($folder, true)) { - $this->subscribe($folder); + } + } + + + /** + * Check if specified folder is a special folder + */ + public function is_special_folder($name) + { + return $name == 'INBOX' || in_array($name, $this->get_special_folders()); + } + + + /** + * Return configured special folders + */ + public function get_special_folders($forced = false) + { + // getting config might be expensive, store special folders in memory + if (!isset($this->icache['special-folders'])) { + $rcube = rcube::get_instance(); + $this->icache['special-folders'] = array(); + + foreach (self::$folder_types as $type) { + if ($folder = $rcube->config->get($type . '_mbox')) { + $this->icache['special-folders'][$type] = $folder; + } } } + + return $this->icache['special-folders']; + } + + + /** + * Set special folder associations stored in backend + */ + public function set_special_folders($specials) + { + // should be overriden by storage class if backend supports special folders (SPECIAL-USE) + unset($this->icache['special-folders']); } diff --git a/program/lib/Roundcube/rcube_string_replacer.php b/program/lib/Roundcube/rcube_string_replacer.php index 77b91d18b..ce61e5367 100644 --- a/program/lib/Roundcube/rcube_string_replacer.php +++ b/program/lib/Roundcube/rcube_string_replacer.php @@ -42,7 +42,7 @@ class rcube_string_replacer // Support unicode/punycode in top-level domain part $utf_domain = '[^?&@"\'\\/()<>\s\r\t\n]+\\.?([^\\x00-\\x2f\\x3b-\\x40\\x5b-\\x60\\x7b-\\x7f]{2,}|xn--[a-zA-Z0-9]{2,})'; $url1 = '.:;,'; - $url2 = 'a-zA-Z0-9%=#$@+?|!&\\/_~\\[\\]\\(\\){}\*-'; + $url2 = 'a-zA-Z0-9%=#$@+?|!&\\/_~\\[\\]\\(\\){}\*\x80-\xFE-'; $this->link_pattern = "/([\w]+:\/\/|\W[Ww][Ww][Ww]\.|^[Ww][Ww][Ww]\.)($utf_domain([$url1]*[$url2]+)*)/"; $this->mailto_pattern = "/(" diff --git a/program/lib/Roundcube/rcube_text2html.php b/program/lib/Roundcube/rcube_text2html.php new file mode 100644 index 000000000..46c2b7e9a --- /dev/null +++ b/program/lib/Roundcube/rcube_text2html.php @@ -0,0 +1,307 @@ +<?php + +/** + +-----------------------------------------------------------------------+ + | This file is part of the Roundcube Webmail client | + | Copyright (C) 2008-2014, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + | PURPOSE: | + | Converts plain text to HTML | + +-----------------------------------------------------------------------+ + | Author: Aleksander Machniak <alec@alec.pl> | + +-----------------------------------------------------------------------+ + */ + +/** + * Converts plain text to HTML + * + * @package Framework + * @subpackage Utils + */ +class rcube_text2html +{ + /** + * Contains the HTML content after conversion. + * + * @var string $html + */ + protected $html; + + /** + * Contains the plain text. + * + * @var string $text + */ + protected $text; + + /** + * Configuration + * + * @var array $config + */ + protected $config = array( + // non-breaking space + 'space' => "\xC2\xA0", + // enables format=flowed parser + 'flowed' => false, + // enables wrapping for non-flowed text + 'wrap' => true, + // line-break tag + 'break' => "<br>\n", + // prefix and suffix (wrapper element) + 'begin' => '<div class="pre">', + 'end' => '</div>', + // enables links replacement + 'links' => true, + ); + + + /** + * Constructor. + * + * If the plain text source string (or file) is supplied, the class + * will instantiate with that source propagated, all that has + * to be done it to call get_html(). + * + * @param string $source Plain text + * @param boolean $from_file Indicates $source is a file to pull content from + * @param array $config Class configuration + */ + function __construct($source = '', $from_file = false, $config = array()) + { + if (!empty($source)) { + $this->set_text($source, $from_file); + } + + if (!empty($config) && is_array($config)) { + $this->config = array_merge($this->config, $config); + } + } + + /** + * Loads source text into memory, either from $source string or a file. + * + * @param string $source Plain text + * @param boolean $from_file Indicates $source is a file to pull content from + */ + function set_text($source, $from_file = false) + { + if ($from_file && file_exists($source)) { + $this->text = file_get_contents($source); + } + else { + $this->text = $source; + } + + $this->_converted = false; + } + + /** + * Returns the HTML content. + * + * @return string HTML content + */ + function get_html() + { + if (!$this->_converted) { + $this->_convert(); + } + + return $this->html; + } + + /** + * Prints the HTML. + */ + function print_html() + { + print $this->get_html(); + } + + /** + * Workhorse function that does actual conversion (calls _converter() method). + */ + protected function _convert() + { + // Convert TXT to HTML + $this->html = $this->_converter($this->text); + $this->_converted = true; + } + + /** + * Workhorse function that does actual conversion. + * + * @param string Plain text + */ + protected function _converter($text) + { + // make links and email-addresses clickable + $attribs = array('link_attribs' => array('rel' => 'noreferrer', 'target' => '_blank')); + $replacer = new rcmail_string_replacer($attribs); + + if ($this->config['flowed']) { + $flowed_char = 0x01; + $text = rcube_mime::unfold_flowed($text, chr($flowed_char)); + } + + // search for patterns like links and e-mail addresses and replace with tokens + if ($this->config['links']) { + $text = $replacer->replace($text); + } + + // split body into single lines + $text = preg_split('/\r?\n/', $text); + $quote_level = 0; + $last = null; + + // wrap quoted lines with <blockquote> + for ($n = 0, $cnt = count($text); $n < $cnt; $n++) { + $flowed = false; + if ($this->config['flowed'] && ord($text[$n][0]) == $flowed_char) { + $flowed = true; + $text[$n] = substr($text[$n], 1); + } + + if ($text[$n][0] == '>' && preg_match('/^(>+ {0,1})+/', $text[$n], $regs)) { + $q = substr_count($regs[0], '>'); + $text[$n] = substr($text[$n], strlen($regs[0])); + $text[$n] = $this->_convert_line($text[$n], $flowed || $this->config['wrap']); + $_length = strlen(str_replace(' ', '', $text[$n])); + + if ($q > $quote_level) { + if ($last !== null) { + $text[$last] .= (!$length ? "\n" : '') + . $replacer->get_replacement($replacer->add( + str_repeat('<blockquote>', $q - $quote_level))) + . $text[$n]; + + unset($text[$n]); + } + else { + $text[$n] = $replacer->get_replacement($replacer->add( + str_repeat('<blockquote>', $q - $quote_level))) . $text[$n]; + + $last = $n; + } + } + else if ($q < $quote_level) { + $text[$last] .= (!$length ? "\n" : '') + . $replacer->get_replacement($replacer->add( + str_repeat('</blockquote>', $quote_level - $q))) + . $text[$n]; + + unset($text[$n]); + } + else { + $last = $n; + } + } + else { + $text[$n] = $this->_convert_line($text[$n], $flowed || $this->config['wrap']); + $q = 0; + $_length = strlen(str_replace(' ', '', $text[$n])); + + if ($quote_level > 0) { + $text[$last] .= (!$length ? "\n" : '') + . $replacer->get_replacement($replacer->add( + str_repeat('</blockquote>', $quote_level))) + . $text[$n]; + + unset($text[$n]); + } + else { + $last = $n; + } + } + + $quote_level = $q; + $length = $_length; + } + + if ($quote_level > 0) { + $text[$last] .= $replacer->get_replacement($replacer->add( + str_repeat('</blockquote>', $quote_level))); + } + + $text = join("\n", $text); + + // colorize signature (up to <sig_max_lines> lines) + $len = strlen($text); + $sig_sep = "--" . $this->config['space'] . "\n"; + $sig_max_lines = rcube::get_instance()->config->get('sig_max_lines', 15); + + while (($sp = strrpos($text, $sig_sep, $sp ? -$len+$sp-1 : 0)) !== false) { + if ($sp == 0 || $text[$sp-1] == "\n") { + // do not touch blocks with more that X lines + if (substr_count($text, "\n", $sp) < $sig_max_lines) { + $text = substr($text, 0, max(0, $sp)) + .'<span class="sig">'.substr($text, $sp).'</span>'; + } + + break; + } + } + + // insert url/mailto links and citation tags + $text = $replacer->resolve($text); + + // replace line breaks + $text = str_replace("\n", $this->config['break'], $text); + + return $this->config['begin'] . $text . $this->config['end']; + } + + /** + * Converts spaces in line of text + */ + protected function _convert_line($text, $is_flowed) + { + static $table; + + if (empty($table)) { + $table = get_html_translation_table(HTML_SPECIALCHARS); + unset($table['?']); + } + + // skip signature separator + if ($text == '-- ') { + return '--' . $this->config['space']; + } + + // replace HTML special characters + $text = strtr($text, $table); + + $nbsp = $this->config['space']; + + // replace some whitespace characters + $text = str_replace(array("\r", "\t"), array('', ' '), $text); + + // replace spaces with non-breaking spaces + if ($is_flowed) { + $pos = 0; + $diff = 0; + $len = strlen($nbsp); + $copy = $text; + + while (($pos = strpos($text, ' ', $pos)) !== false) { + if ($pos == 0 || $text[$pos-1] == ' ') { + $copy = substr_replace($copy, $nbsp, $pos + $diff, 1); + $diff += $len - 1; + } + $pos++; + } + + $text = $copy; + } + else { + // make the whole line non-breakable + $text = str_replace(array(' ', '-', '/'), array($nbsp, '-⁠', '/⁠'), $text); + } + + return $text; + } +} diff --git a/program/lib/Roundcube/rcube_user.php b/program/lib/Roundcube/rcube_user.php index e232736c9..739b6f2a0 100644 --- a/program/lib/Roundcube/rcube_user.php +++ b/program/lib/Roundcube/rcube_user.php @@ -267,7 +267,10 @@ class rcube_user "SELECT * FROM ".$this->db->table_name('identities'). " WHERE del <> 1 AND user_id = ?". ($sql_add ? " ".$sql_add : ""). - " ORDER BY ".$this->db->quote_identifier('standard')." DESC, name ASC, identity_id ASC", + " ORDER BY ". $this->db->quote_identifier('standard') . " DESC, " + . $this->db->quote_identifier('name') . " ASC, " + . $this->db->quote_identifier('email') . " ASC, " + . $this->db->quote_identifier('identity_id') . " ASC", $this->ID); while ($sql_arr = $this->db->fetch_assoc($sql_result)) { diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php index c48cd80e8..00999ba50 100644 --- a/program/lib/Roundcube/rcube_utils.php +++ b/program/lib/Roundcube/rcube_utils.php @@ -593,18 +593,18 @@ class rcube_utils */ public static function https_check($port=null, $use_https=true) { - global $RCMAIL; - if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off') { return true; } - if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https') { + if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) + && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https' + && in_array($_SERVER['REMOTE_ADDR'], rcube::get_instance()->config->get('proxy_whitelist', array()))) { return true; } if ($port && $_SERVER['SERVER_PORT'] == $port) { return true; } - if ($use_https && isset($RCMAIL) && $RCMAIL->config->get('use_https')) { + if ($use_https && rcube::get_instance()->config->get('use_https')) { return true; } @@ -683,13 +683,22 @@ class rcube_utils */ public static function remote_addr() { - if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { - $hosts = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'], 2); - return $hosts[0]; - } + // Check if any of the headers are set first to improve performance + if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']) || !empty($_SERVER['HTTP_X_REAL_IP'])) { + $proxy_whitelist = rcube::get_instance()->config->get('proxy_whitelist', array()); + if (in_array($_SERVER['REMOTE_ADDR'], $proxy_whitelist)) { + if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { + foreach(array_reverse(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])) as $forwarded_ip) { + if (!in_array($forwarded_ip, $proxy_whitelist)) { + return $forwarded_ip; + } + } + } - if (!empty($_SERVER['HTTP_X_REAL_IP'])) { - return $_SERVER['HTTP_X_REAL_IP']; + if (!empty($_SERVER['HTTP_X_REAL_IP'])) { + return $_SERVER['HTTP_X_REAL_IP']; + } + } } if (!empty($_SERVER['REMOTE_ADDR'])) { @@ -919,7 +928,7 @@ class rcube_utils /** * Normalize the given string for fulltext search. - * Currently only optimized for Latin-1 characters; to be extended + * Currently only optimized for ISO-8859-1 and ISO-8859-2 characters; to be extended * * @param string Input string (UTF-8) * @param boolean True to return list of words as array @@ -940,15 +949,32 @@ class rcube_utils // split by words $arr = self::tokenize_string($str); + // detect character set + if (utf8_encode(utf8_decode($str)) == $str) { + // ISO-8859-1 (or ASCII) + preg_match_all('/./u', 'äâà åáãæçéêëèïîìÃñöôòøõóüûùúýÿ', $keys); + preg_match_all('/./', 'aaaaaaaceeeeiiiinoooooouuuuyy', $values); + + $mapping = array_combine($keys[0], $values[0]); + $mapping = array_merge($mapping, array('ß' => 'ss', 'ae' => 'a', 'oe' => 'o', 'ue' => 'u')); + } + else if (rcube_charset::convert(rcube_charset::convert($str, 'UTF-8', 'ISO-8859-2'), 'ISO-8859-2', 'UTF-8') == $str) { + // ISO-8859-2 + preg_match_all('/./u', 'ąáâäćçÄéęëěÃîłľĺńňóôöŕřśšşťţůúűüźžżý', $keys); + preg_match_all('/./', 'aaaaccceeeeiilllnnooorrsssttuuuuzzzy', $values); + + $mapping = array_combine($keys[0], $values[0]); + $mapping = array_merge($mapping, array('ß' => 'ss', 'ae' => 'a', 'oe' => 'o', 'ue' => 'u')); + } + foreach ($arr as $i => $part) { - if (utf8_encode(utf8_decode($part)) == $part) { // is latin-1 ? - $arr[$i] = utf8_encode(strtr(strtolower(strtr(utf8_decode($part), - 'Ççäâà åéêëèïîìÅÉöôòüûùÿøØáÃóúñÑÃÂÀãÃÊËÈÃÃŽÃÓÔõÕÚÛÙýÃ', - 'ccaaaaeeeeiiiaeooouuuyooaiounnaaaaaeeeiiioooouuuyy')), - array('ß' => 'ss', 'ae' => 'a', 'oe' => 'o', 'ue' => 'u'))); + $part = mb_strtolower($part); + + if (!empty($mapping)) { + $part = strtr($part, $mapping); } - else - $arr[$i] = mb_strtolower($part); + + $arr[$i] = $part; } return $as_array ? $arr : join(" ", $arr); @@ -1030,7 +1056,6 @@ class rcube_utils } } - /** * Find out if the string content means true or false * @@ -1045,4 +1070,16 @@ class rcube_utils return !in_array($str, array('false', '0', 'no', 'off', 'nein', ''), true); } + /** + * OS-dependent absolute path detection + */ + public static function is_absolute_path($path) + { + if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { + return (bool) preg_match('!^[a-z]:[\\\\/]!i', $path); + } + else { + return $path[0] == DIRECTORY_SEPARATOR; + } + } } diff --git a/program/lib/Roundcube/rcube_vcard.php b/program/lib/Roundcube/rcube_vcard.php index a54ee7e11..fb8fdd525 100644 --- a/program/lib/Roundcube/rcube_vcard.php +++ b/program/lib/Roundcube/rcube_vcard.php @@ -149,6 +149,11 @@ class rcube_vcard $this->email[0] = $this->email[$pref_index]; $this->email[$pref_index] = $tmp; } + + // fix broken vcards from Outlook that only supply ORG but not the required N or FN properties + if (!strlen(trim($this->displayname . $this->surname . $this->firstname)) && strlen($this->organization)) { + $this->displayname = $this->organization; + } } /** diff --git a/program/lib/Roundcube/rcube_washtml.php b/program/lib/Roundcube/rcube_washtml.php index 5a5b3dc55..984294376 100644 --- a/program/lib/Roundcube/rcube_washtml.php +++ b/program/lib/Roundcube/rcube_washtml.php @@ -171,7 +171,7 @@ class rcube_washtml */ private function wash_style($style) { - $s = ''; + $result = array(); foreach (explode(';', $style) as $declaration) { if (preg_match('/^\s*([a-z\-]+)\s*:\s*(.*)\s*$/i', $declaration, $match)) { @@ -179,54 +179,48 @@ class rcube_washtml $str = $match[2]; $value = ''; - while (sizeof($str) > 0 && - preg_match('/^(url\(\s*[\'"]?([^\'"\)]*)[\'"]?\s*\)'./*1,2*/ - '|rgb\(\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[0-9]+\s*\)'. - '|-?[0-9.]+\s*(em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)?'. - '|#[0-9a-f]{3,6}'. - '|[a-z0-9", -]+'. - ')\s*/i', $str, $match) - ) { - if ($match[2]) { - if (($src = $this->config['cid_map'][$match[2]]) - || ($src = $this->config['cid_map'][$this->config['base_url'].$match[2]]) - ) { - $value .= ' url('.htmlspecialchars($src, ENT_QUOTES) . ')'; - } - else if (preg_match('!^(https?:)?//[a-z0-9/._+-]+$!i', $match[2], $url)) { - if ($this->config['allow_remote']) { - $value .= ' url('.htmlspecialchars($url[0], ENT_QUOTES).')'; + foreach ($this->explode_style($str) as $val) { + if (preg_match('/^url\(/i', $val)) { + if (preg_match('/^url\(\s*[\'"]?([^\'"\)]*)[\'"]?\s*\)/iu', $val, $match)) { + $url = $match[1]; + if (($src = $this->config['cid_map'][$url]) + || ($src = $this->config['cid_map'][$this->config['base_url'].$url]) + ) { + $value .= ' url('.htmlspecialchars($src, ENT_QUOTES) . ')'; } - else { - $this->extlinks = true; + else if (preg_match('!^(https?:)?//[a-z0-9/._+-]+$!i', $url, $m)) { + if ($this->config['allow_remote']) { + $value .= ' url('.htmlspecialchars($m[0], ENT_QUOTES).')'; + } + else { + $this->extlinks = true; + } + } + else if (preg_match('/^data:.+/i', $url)) { // RFC2397 + $value .= ' url('.htmlspecialchars($url, ENT_QUOTES).')'; } - } - else if (preg_match('/^data:.+/i', $match[2])) { // RFC2397 - $value .= ' url('.htmlspecialchars($match[2], ENT_QUOTES).')'; } } - else { + else if (!preg_match('/^(behavior|expression)/i', $val)) { // whitelist ? - $value .= ' ' . $match[0]; + $value .= ' ' . $val; // #1488535: Fix size units, so width:800 would be changed to width:800px - if (preg_match('/(left|right|top|bottom|width|height)/i', $cssid) - && preg_match('/^[0-9]+$/', $match[0]) + if (preg_match('/^(left|right|top|bottom|width|height)/i', $cssid) + && preg_match('/^[0-9]+$/', $val) ) { $value .= 'px'; } } - - $str = substr($str, strlen($match[0])); } if (isset($value[0])) { - $s .= ($s?' ':'') . $cssid . ':' . $value . ';'; + $result[] = $cssid . ':' . $value; } } } - return $s; + return implode('; ', $result); } /** @@ -283,10 +277,12 @@ class rcube_washtml /** * The main loop that recurse on a node tree. - * It output only allowed tags with allowed attributes - * and allowed inline styles + * It output only allowed tags with allowed attributes and allowed inline styles + * + * @param DOMNode $node HTML element + * @param int $level Recurrence level (safe initial value found empirically) */ - private function dumpHtml($node, $level = 0) + private function dumpHtml($node, $level = 20) { if (!$node->hasChildNodes()) { return ''; @@ -460,7 +456,7 @@ class rcube_washtml // Remove invalid HTML comments (#1487759) // Don't remove valid conditional comments // Don't remove MSOutlook (<!-->) conditional comments (#1489004) - $html = preg_replace('/<!--[^->\[\n]+>/', '', $html); + $html = preg_replace('/<!--[^-<>\[\n]+>/', '', $html); // fix broken nested lists self::fix_broken_lists($html); @@ -576,4 +572,49 @@ class rcube_washtml } } } + + /** + * Explode css style value + */ + protected function explode_style($style) + { + $style = trim($style); + + // first remove comments + $pos = 0; + while (($pos = strpos($style, '/*', $pos)) !== false) { + $end = strpos($style, '*/', $pos+2); + + if ($end === false) { + $style = substr($style, 0, $pos); + } + else { + $style = substr_replace($style, '', $pos, $end - $pos + 2); + } + } + + $strlen = strlen($style); + $result = array(); + + // explode value + for ($p=$i=0; $i < $strlen; $i++) { + if (($style[$i] == "\"" || $style[$i] == "'") && $style[$i-1] != "\\") { + if ($q == $style[$i]) { + $q = false; + } + else if (!$q) { + $q = $style[$i]; + } + } + + if (!$q && $style[$i] == ' ' && !preg_match('/[,\(]/', $style[$i-1])) { + $result[] = substr($style, $p, $i - $p); + $p = $i + 1; + } + } + + $result[] = (string) substr($style, $p); + + return $result; + } } diff --git a/program/localization/ar/labels.inc b/program/localization/ar/labels.inc new file mode 100644 index 000000000..6fd922ad9 --- /dev/null +++ b/program/localization/ar/labels.inc @@ -0,0 +1,123 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | localization/<lang>/labels.inc | + | | + | Localization file of the Roundcube Webmail client | + | Copyright (C) 2005-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/labels/ +*/ +$labels['welcome'] = 'مرØباً بكم ÙÙŠ $product'; +$labels['username'] = 'اسم المستخدم'; +$labels['password'] = 'كلمة المرور'; +$labels['server'] = 'الخادم'; +$labels['login'] = 'تسجيل الدخول'; +$labels['logout'] = 'تسجيل الخروج'; +$labels['mail'] = 'البريد'; +$labels['settings'] = 'الإعدادات'; +$labels['addressbook'] = 'دÙتر العناوين'; +$labels['inbox'] = 'البريد الوارد'; +$labels['drafts'] = 'المسودات'; +$labels['sent'] = 'البريد المرسل'; +$labels['trash'] = 'المهملات'; +$labels['junk'] = 'الرسائل غير المرغوب Ùيها'; +$labels['subject'] = 'الموضوع'; +$labels['from'] = 'المرسل'; +$labels['cc'] = 'نسخة إلي'; +$labels['bcc'] = 'نسخة مخÙية الوجهة'; +$labels['date'] = 'التاريخ'; +$labels['size'] = 'الØجم'; +$labels['priority'] = 'الأولوية'; +$labels['mailboxlist'] = 'مجلدات'; +$labels['copy'] = 'نسخ'; +$labels['move'] = 'نقل'; +$labels['moveto'] = 'نقل إلى...'; +$labels['download'] = 'تنزيل'; +$labels['showattachment'] = 'إظهار'; +$labels['showanyway'] = 'إظهار ذلك على أي Øال'; +$labels['filename'] = 'اسم الملÙ'; +$labels['filesize'] = 'Øجم الملÙ'; +$labels['addtoaddressbook'] = 'إضاÙØ© إلى دÙتر العناوين'; +$labels['sun'] = 'Ø£Øد'; +$labels['mon'] = 'إثنين'; +$labels['tue'] = 'ثلاثاء'; +$labels['wed'] = 'أربعاء'; +$labels['thu'] = 'خميس'; +$labels['fri'] = 'جمعة'; +$labels['sat'] = 'سبت'; +$labels['sunday'] = 'الأØد'; +$labels['monday'] = 'الإثنين'; +$labels['tuesday'] = 'الثلاثاء'; +$labels['wednesday'] = 'الأربعاء'; +$labels['thursday'] = 'الخميس'; +$labels['friday'] = 'الجمعة'; +$labels['saturday'] = 'السبت'; +$labels['jan'] = 'يناير'; +$labels['feb'] = 'Ùبراير'; +$labels['mar'] = 'مارس'; +$labels['apr'] = 'أبريل'; +$labels['may'] = 'مايو'; +$labels['jun'] = 'يونيو'; +$labels['jul'] = 'يوليو'; +$labels['aug'] = 'أغسطس'; +$labels['sep'] = 'سبتمبر'; +$labels['oct'] = 'أكتوبر'; +$labels['nov'] = 'نوÙمبر'; +$labels['dec'] = 'ديسمبر'; +$labels['longjan'] = 'يناير'; +$labels['longfeb'] = 'Ùبراير'; +$labels['longmar'] = 'مارس'; +$labels['longapr'] = 'أبريل'; +$labels['longmay'] = 'مايو'; +$labels['longjun'] = 'يونيو'; +$labels['longjul'] = 'يوليو'; +$labels['longaug'] = 'أغسطس'; +$labels['longsep'] = 'سبتمبر'; +$labels['longoct'] = 'أكتوبر'; +$labels['longnov'] = 'نوÙمبر'; +$labels['longdec'] = 'ديسمبر'; +$labels['today'] = 'اليوم'; +$labels['refresh'] = 'تØديث'; +$labels['checkmail'] = 'التØقق من وجود رسائل جديدة'; +$labels['compose'] = 'إنشاء'; +$labels['writenewmessage'] = 'إنشاء رسالة جديدة'; +$labels['reply'] = 'رد'; +$labels['replytomessage'] = 'الرد على المرسل'; +$labels['replytoallmessage'] = 'الرد على قائمة أو إلى المرسل وجميع المستلمين'; +$labels['replyall'] = 'الرد على الجميع'; +$labels['replylist'] = 'الرد على القائمة'; +$labels['forward'] = 'إعادة توجيه'; +$labels['deletemessage'] = 'Øذ٠الرسالة'; +$labels['movemessagetotrash'] = 'انقل الرسالة إلى سلة المهملات'; +$labels['printmessage'] = 'أطبع هذه الرسالة'; +$labels['previousmessage'] = 'عرض الرسالة السابقة'; +$labels['firstmessage'] = 'عرض الرسالة الأولى'; +$labels['nextmessage'] = 'عرض الرسالة التالية'; +$labels['lastmessage'] = 'عرض الرسالة الأخيرة'; +$labels['backtolist'] = 'العودة إلى قائمة الرسائل'; +$labels['viewsource'] = 'إظهار المصدر'; +$labels['mark'] = 'علامة'; +$labels['markread'] = 'مقروءة'; +$labels['markunread'] = 'غير مقروءة'; +$labels['moreactions'] = 'إجراءات إضاÙية...'; +$labels['more'] = 'المزيد'; +$labels['back'] = 'العودة'; +$labels['options'] = 'خيارات'; +$labels['select'] = 'تØديد'; +$labels['all'] = 'الكل'; +$labels['none'] = 'لاشيء'; +$labels['currpage'] = 'الصÙØØ© الØالية'; +$labels['unread'] = 'غير مقروءة'; +$labels['flagged'] = 'موسوم'; +$labels['unanswered'] = 'بلا رد'; +$labels['deleted'] = 'Ù…ØذوÙ'; +$labels['undeleted'] = 'غير Ù…ØذوÙØ©'; +?> diff --git a/program/localization/ar_SA/labels.inc b/program/localization/ar_SA/labels.inc index 4100f7c4a..28fb22dbf 100644 --- a/program/localization/ar_SA/labels.inc +++ b/program/localization/ar_SA/labels.inc @@ -29,8 +29,10 @@ $labels['drafts'] = 'المسودات'; $labels['sent'] = 'المرسل'; $labels['trash'] = 'المهملات'; $labels['junk'] = 'غير المرغوب'; +$labels['show_real_foldernames'] = 'عرض الاسم الØقيقي لـ المجلدات المميزة '; $labels['subject'] = 'الموضوع'; $labels['from'] = 'المرسل'; +$labels['sender'] = 'المرسل'; $labels['to'] = 'المستقبل'; $labels['cc'] = 'نسخة'; $labels['bcc'] = 'نسخة مخÙية'; @@ -41,15 +43,20 @@ $labels['size'] = 'الØجم'; $labels['priority'] = 'الأولوية'; $labels['organization'] = 'المنظمة'; $labels['readstatus'] = 'Øالة القراءة'; +$labels['listoptions'] = 'قائمة الخيارات...'; $labels['mailboxlist'] = 'مجلدات'; $labels['messagesfromto'] = 'الرسالة $from إلى $to من مجموع $count'; $labels['threadsfromto'] = 'جهات الإتصال $from إلى $to من مجموع $count'; $labels['messagenrof'] = 'الرسالة $nr من $count'; +$labels['fromtoshort'] = '$from – $to من $count'; $labels['copy'] = 'نسخ'; $labels['move'] = 'نقل'; $labels['moveto'] = 'نقل إلى...'; +$labels['copyto'] = 'نسخ الى '; $labels['download'] = 'تنزيل'; $labels['open'] = 'ÙتØ'; +$labels['showattachment'] = 'إظهار'; +$labels['showanyway'] = 'عرض على أي Øال'; $labels['filename'] = 'اسم الملÙ'; $labels['filesize'] = 'Øجم الملÙ'; $labels['addtoaddressbook'] = 'إضاÙØ© إلى دÙتر العناوين'; @@ -160,6 +167,7 @@ $labels['listmode'] = 'وضع طريقة السرد'; $labels['folderactions'] = 'إجراءات المجلد...'; $labels['compact'] = 'ضغط'; $labels['empty'] = 'تÙريغ'; +$labels['importmessages'] = 'استيراد الرسائل'; $labels['quota'] = 'المساØØ© المستخدمة'; $labels['unknown'] = 'مجهول'; $labels['unlimited'] = 'غير Ù…Øدود'; @@ -167,8 +175,13 @@ $labels['quicksearch'] = 'البØØ« السريع'; $labels['resetsearch'] = 'استعادة البØØ« للاÙتراضي'; $labels['searchmod'] = 'أماكن البØØ«'; $labels['msgtext'] = 'كامل الرسالة'; +$labels['body'] = 'Ù…Øتوى '; +$labels['type'] = 'نوع '; +$labels['namex'] = 'الاسم '; $labels['openinextwin'] = 'اÙØªØ ÙÙŠ ناÙذة جديدة'; $labels['emlsave'] = 'تنزيل (.eml)'; +$labels['changeformattext'] = 'عرض بتنسيق النص العادي'; +$labels['changeformathtml'] = 'عرض بتنسيق HTML'; $labels['editasnew'] = 'تعديل كجديد'; $labels['send'] = 'ارسل'; $labels['sendmessage'] = 'إرسال الرسالة الآن'; @@ -185,6 +198,16 @@ $labels['spellcheck'] = 'التدقيق اﻹملائى'; $labels['checkspelling'] = 'التدقيق الإملائي'; $labels['resumeediting'] = 'متابعة التØرير'; $labels['revertto'] = 'استعادة إلى'; +$labels['restore'] = 'استعادة'; +$labels['restoremessage'] = 'استعادة الرسائل؟'; +$labels['responses'] = 'ردود'; +$labels['insertresponse'] = 'اضاÙØ© رد '; +$labels['manageresponses'] = 'ادارة الردود'; +$labels['savenewresponse'] = 'ØÙظ الرد الجديد'; +$labels['editresponses'] = 'تعديل الردود'; +$labels['editresponse'] = 'تعديل الرد '; +$labels['responsename'] = 'الاسم'; +$labels['responsetext'] = 'نص الرد'; $labels['attach'] = 'إرÙاق'; $labels['attachments'] = 'مرÙقات'; $labels['upload'] = 'تØميل'; @@ -201,6 +224,7 @@ $labels['showimages'] = 'إظهار الصور'; $labels['alwaysshow'] = 'دائماً أظهر الصّور القادمة من $sender'; $labels['isdraft'] = 'هذه مسودّة رسالة'; $labels['andnmore'] = '$nr المزيد ...'; +$labels['togglemoreheaders'] = 'عرض المزيد من رؤوس الرسائل'; $labels['htmltoggle'] = 'HTML'; $labels['plaintoggle'] = 'نص مجرد'; $labels['savesentmessagein'] = 'اØÙظ الرسالة المÙرسلة ÙÙŠ'; @@ -283,6 +307,7 @@ $labels['contactsfromto'] = 'المراسلون $from إلى $to من $count'; $labels['print'] = 'طباعة'; $labels['export'] = 'تصدير'; $labels['exportall'] = 'تصدير الكل'; +$labels['exportsel'] = 'تصدير المختارات'; $labels['exportvcards'] = 'صدّر المراسلين بنسق vCard'; $labels['newcontactgroup'] = 'إنشاء مجموعة مراسلين جديدة'; $labels['grouprename'] = 'تغيير اسم المجموعة'; @@ -294,13 +319,19 @@ $labels['nextpage'] = 'عرض المجموعة التالية'; $labels['lastpage'] = 'عرض المجموعة الأخيرة'; $labels['group'] = 'مجموعة'; $labels['groups'] = 'المجموعات'; +$labels['listgroup'] = 'قائمة اعضاء المجموعة '; $labels['personaladrbook'] = 'العناوين الشخصية'; $labels['searchsave'] = 'ØÙظ البØØ«'; $labels['searchdelete'] = 'Øذ٠البØØ«'; $labels['import'] = 'استورد'; $labels['importcontacts'] = 'استورد المراسلين'; $labels['importfromfile'] = 'استورد من ملÙ:'; +$labels['importtarget'] = 'اضاÙØ© جهة الاتصال الى '; $labels['importreplace'] = 'استبدل دÙتر العناوين بأكمله'; +$labels['importgroups'] = 'استيراد مهام المجموعة '; +$labels['importgroupsall'] = 'الكل (انشاء مجموعة ÙÙŠ Øال الØاجة)'; +$labels['importgroupsexisting'] = 'Ùقط للمجموعات الموجودة '; +$labels['importdesc'] = 'يمكنك رÙع جهات الاتصال من دÙاتر العناوين الموجودة. <br/> Ù†ØÙ† الان ندعم استيراد العناوين من <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> او CSV (comma-separated) data format.'; $labels['done'] = 'تم'; $labels['settingsfor'] = 'إعدادات'; $labels['about'] = 'نبذة'; @@ -315,6 +346,7 @@ $labels['edititem'] = 'تØرير عنصر'; $labels['preferhtml'] = 'تÙضيل صيغة HTML'; $labels['defaultcharset'] = 'ترميز المØار٠الاÙتراضي'; $labels['htmlmessage'] = 'رسالة بنسق HTML'; +$labels['messagepart'] = 'جزء'; $labels['digitalsig'] = 'التوقيع الالكتروني'; $labels['dateformat'] = 'نسق التاريخ'; $labels['timeformat'] = 'نسق الوقت'; @@ -330,7 +362,9 @@ $labels['showinextwin'] = 'ÙØªØ Ø§Ù„Ø±Ø³Ø§Ù„Ø© ÙÙ‰ ناÙذة جديدة'; $labels['composeextwin'] = 'أرسال عن طريق ناÙذة جديدة'; $labels['htmleditor'] = 'إنشاء رسائل بنسق HTML'; $labels['htmlonreply'] = 'Øال الرد على الرسائل بصيغة HTML Ùقط'; +$labels['htmlonreplyandforward'] = 'على التوجية او الرد على رسائل HTML'; $labels['htmlsignature'] = 'توقيع HTML'; +$labels['showemail'] = 'عرض عنوان البريد الالكتروني مع الاسم '; $labels['previewpane'] = 'إظهار قسم المعاينة'; $labels['skin'] = 'شكل الواجهة'; $labels['logoutclear'] = 'Ø¥Ùراغ سلة المØذوÙات عند الخروج'; @@ -348,12 +382,14 @@ $labels['readwhendeleted'] = 'تØديد الرسالة كمقروءة عند Ø $labels['flagfordeletion'] = 'وضع علامة على الرسالة Ù„ØØ°Ùها بدلاً منØØ°Ùها'; $labels['skipdeleted'] = 'لا تظهر الرسائل المØذوÙØ©'; $labels['deletealways'] = 'Øذ٠الرسائل مباشرة، إن تعذر نقلها إلىالمهملات'; +$labels['deletejunk'] = 'مباشرة اØذ٠الرسائل الموجودة ÙÙŠ غير المرغوب Ùيه'; $labels['showremoteimages'] = 'إظهار الصور الخارجية المدمجة'; $labels['fromknownsenders'] = 'للمرسلين المعلومين'; $labels['always'] = 'دائماً'; $labels['showinlineimages'] = 'إظهار الصّور المرÙقة أسÙÙ„ الرسالة'; $labels['autosavedraft'] = 'ØÙظ المسودة تلقائياً'; $labels['everynminutes'] = 'كل $n دقيقة'; +$labels['refreshinterval'] = 'تØديث (التاكد من الرسائل الجديدة, الخ.)'; $labels['never'] = 'أبداً'; $labels['immediately'] = 'Øالاً'; $labels['messagesdisplaying'] = 'إظهار الرسائل'; @@ -367,12 +403,15 @@ $labels['advancedoptions'] = 'خيارات متقدّمة'; $labels['focusonnewmessage'] = 'التركيز على ناÙذة المتصÙØ Ø¹Ù†Ø¯ وجود رسالةجديدة'; $labels['checkallfolders'] = 'التØقق من وجود رسائل جديدة ÙÙŠ جميعالمجلدات'; $labels['displaynext'] = 'إظهار الرسالة التالية بعد ØØ°Ù/نقلالرسالة الØالية'; +$labels['defaultfont'] = 'الخط الاÙتراضي لـ رسائل HTML'; $labels['mainoptions'] = 'الخيارات الأساسية'; +$labels['browseroptions'] = 'خيارات المتصÙØ'; $labels['section'] = 'قسم'; $labels['maintenance'] = 'الصيانة'; $labels['newmessage'] = 'رسالة جديدة'; $labels['signatureoptions'] = 'خيارات التوقيع'; $labels['whenreplying'] = 'عند الرد'; +$labels['replyempty'] = 'لا تقتبس رسالة الاصل'; $labels['replytopposting'] = 'بدء رسالة جديدة ووضع النص أعلى الأصلية'; $labels['replybottomposting'] = 'بدء رسالة جديدة ووضع النص أسÙÙ„ الأصلية'; $labels['replyremovesignature'] = 'إزالة التوقيع من الرسالة عند الرد'; @@ -385,13 +424,23 @@ $labels['afternseconds'] = 'بعد $n ثواني'; $labels['reqmdn'] = 'طلب إشعار استلام دائماً'; $labels['reqdsn'] = 'طلب تنويه Ù„Øالة التوصيل دائماً'; $labels['replysamefolder'] = 'وضع الردود ÙÙŠ المجلد الذي ÙŠØوي الرسالةالمردود عليها'; +$labels['defaultabook'] = 'دÙتر العناوين الاÙتراضي'; $labels['autocompletesingle'] = 'تجاهل عنوان البريد الإلكتروني البديل Ùيالتكملة التلقائية'; +$labels['listnamedisplay'] = 'عرض جهات الاتصال كـ '; $labels['spellcheckbeforesend'] = 'تØقق من الإملاء قبل إرسال الرسائل'; $labels['spellcheckoptions'] = 'خيارات التدقيق الإملاءي'; $labels['spellcheckignoresyms'] = 'تجاهل الكلمات التي تØتوي رموز'; $labels['spellcheckignorenums'] = 'تجاهل الكلمات التي تØتوي أرقام'; $labels['spellcheckignorecaps'] = 'تجاهل الكلمات التي بها Ø£Øر٠كبيرة'; $labels['addtodict'] = 'إضاÙØ© إلى القامس'; +$labels['mailtoprotohandler'] = 'تسجيل متØكم بروتوكول mailto: رابط'; +$labels['standardwindows'] = 'التعامل مع النواÙØ° المنبثقة كـ نواÙØ° قياسية'; +$labels['forwardmode'] = 'اعادة توجية الرسائل'; +$labels['inline'] = 'مضمن'; +$labels['asattachment'] = 'كـ مرÙÙ‚ '; +$labels['replyallmode'] = 'الاجراء الاÙتراضي لـ زر [الرد على الجميع]'; +$labels['replyalldefault'] = 'الرد على الجميع'; +$labels['replyalllist'] = 'الرد Ùقط على القائمة البريدية (اذا كانت موجودة)'; $labels['folder'] = 'مجلد'; $labels['folders'] = 'مجلدات'; $labels['foldername'] = 'اسم المجلد'; @@ -416,6 +465,7 @@ $labels['sortby'] = 'ترتيب بØسب'; $labels['sortasc'] = 'ترتيب تصاعدي'; $labels['sortdesc'] = 'ترتيب تنازلي'; $labels['undo'] = 'تراجع'; +$labels['installedplugins'] = 'اضاÙات مثبتة'; $labels['plugin'] = 'إضاÙØ©'; $labels['version'] = 'النسخة'; $labels['source'] = 'المصدر'; diff --git a/program/localization/ar_SA/messages.inc b/program/localization/ar_SA/messages.inc index 7d9a7ac62..a518fb012 100644 --- a/program/localization/ar_SA/messages.inc +++ b/program/localization/ar_SA/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -15,6 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/messages/ */ +$messages['errortitle'] = 'Øدث خطأ!'; $messages['loginfailed'] = 'Ùشل تسجيل الدخول'; $messages['cookiesdisabled'] = 'المتصÙØ Ø§Ù„Ø®Ø§Øµ بك لا يقبل الكوكيز'; $messages['sessionerror'] = 'انتهت صلاØية الجلسة الØالية أو أنها غيرصالØØ©'; @@ -22,12 +23,18 @@ $messages['storageerror'] = 'Ùشل الاتصال بخادم IMAP'; $messages['servererror'] = 'خطأ ÙÙŠ الخادم!'; $messages['servererrormsg'] = 'خطأ خادم: $msg'; $messages['dberror'] = 'خطأ ÙÙŠ قاعدة البيانات!'; +$messages['requesttimedout'] = 'انتهت مهلة الطلب '; $messages['errorreadonly'] = 'تعذر تنÙيذ العملية. المجلد للقراءة Ùقط.'; $messages['errornoperm'] = 'تعذر تنÙيذ العملية. ليست لديك الصلاØية.'; +$messages['erroroverquota'] = 'تعذر تنÙيذ العملية. لايوجد مساØØ© كاÙية.'; +$messages['erroroverquotadelete'] = 'لا يوجد مساØØ© كاÙية. استخدم SHIFT+DEL Ù„Øذ٠الرسالة.'; $messages['invalidrequest'] = 'طلب غير صالØ! لم تØÙظ أية بيانات.'; +$messages['invalidhost'] = 'اسم الملقم غير صالØ.'; $messages['nomessagesfound'] = 'لم يعثر على أية رسائل ÙÙŠ صندوق البريد هذا'; $messages['loggedout'] = 'قمت بإنهاء هذه الجلسة بنجاØ. إلى اللقاء!'; $messages['mailboxempty'] = 'صندوق البريد Ùارغ'; +$messages['nomessages'] = 'لا يوجد رسائل'; +$messages['refreshing'] = 'جاري التØديث...'; $messages['loading'] = 'جاري العمل...'; $messages['uploading'] = 'جاري رÙع الملÙ...'; $messages['uploadingmany'] = 'جاري تØميل الملÙات...'; @@ -38,6 +45,8 @@ $messages['messagesent'] = 'تم إرسال الرسالة بنجاØ'; $messages['savingmessage'] = 'ØÙظ الرسالة...'; $messages['messagesaved'] = 'تم ØÙظ الرسالة ÙÙŠ المسودات'; $messages['successfullysaved'] = 'تم الØÙظ بنجاØ'; +$messages['savingresponse'] = 'جاري ØÙظ نص الرد...'; +$messages['deleteresponseconfirm'] = 'هل تريد Ùعلاً Øذ٠نص الرد هذا؟'; $messages['addedsuccessfully'] = 'تمت إضاÙØ© المراسل إلى دÙتر العناوينبنجاØ'; $messages['contactexists'] = 'هناك مراسل له Ù†Ùس هذا البريد الالكترونيموجود مسبقاً'; $messages['contactnameexists'] = 'هناك Ù…Ùرسال له Ù†Ùس الإسم موجود مسبقاً.'; @@ -48,6 +57,8 @@ $messages['contactnotfound'] = 'تعذر العثور على المراسل ال $messages['contactsearchonly'] = 'اكتب بعض كلمات البØØ« للعثور علىالمÙراسلين'; $messages['sendingfailed'] = 'Ùشل إرسال الرسالة'; $messages['senttooquickly'] = 'رجاء انتظر $sec ثوان قبل إرسال هذه الرسالة'; +$messages['errorsavingsent'] = 'Øدث خطأ أثناء ØÙظ الرسالة المÙرسلة.'; +$messages['errorsaving'] = 'Øدث خطأ أثناء الØÙظ.'; $messages['errormoving'] = 'تعذر نقل هذه الرسالة'; $messages['errorcopying'] = 'تعذر نسخ الرسائل'; $messages['errordeleting'] = 'تعذر Øذ٠هذه الرسالة'; @@ -72,6 +83,7 @@ $messages['norecipientwarning'] = 'الرجاء إدخال اسم مستقبل Ù $messages['nosubjectwarning'] = 'Øقل "الموضوع" Ùارغ. هل تريد كتابة موضوعللرسالة؟'; $messages['nobodywarning'] = 'إرسال هذه الرسالة دون نص؟'; $messages['notsentwarning'] = 'لم يتم إرسال الرسالة. هل تريد تجاهلالرسالة؟'; +$messages['restoresavedcomposedata'] = 'يوجد رسالة سابقة ولاكن غير مرسلة.\n\nالموضوع: $subject\nØÙظ: $date\n\n هل تريد بالÙعل استعادة هذة الرسالة ØŸ'; $messages['noldapserver'] = 'الرجاء اختيار خادم ldap للبØØ« Ùيه'; $messages['nosearchname'] = 'الرجاء إدخال اسم مراسل أو عنوان بريدإلكتروني'; $messages['notuploadedwarning'] = 'لم يتم رÙع جميع المرÙقات بعد. رجاءً الانتظار أو إلغاء عملية الرÙع.'; @@ -91,26 +103,36 @@ $messages['converting'] = 'إزالة التنسيق من الرسالة...'; $messages['messageopenerror'] = 'تعذرت قراءة الرسالة من الخادم'; $messages['fileuploaderror'] = 'Ùشل رÙع الملÙ'; $messages['filesizeerror'] = 'Øجم المل٠الذي تØاول رÙعه أكبر من الØجمالأقصى $size'; +$messages['copysuccess'] = 'تم نسخ $nr جهة اتصال بنجاØ.'; +$messages['movesuccess'] = 'تم نقل $nr جهة اتصال بنجاØ.'; +$messages['copyerror'] = 'لا يمكن نسخ أية جهة اتصال.'; +$messages['moveerror'] = 'لا يمكن نقل أية جهة اتصال.'; $messages['sourceisreadonly'] = 'لا يمكن تعديل مصدر العنوان هذا'; $messages['errorsavingcontact'] = 'تعذر ØÙظ عنوان المراسل'; $messages['movingmessage'] = 'جاري نقل الرسالة...'; $messages['copyingmessage'] = 'جاري نسخ الرسالة...'; $messages['copyingcontact'] = 'جاري نسخ المÙراسلين...'; +$messages['movingcontact'] = 'جاري نقل جهات الاتصال...'; $messages['deletingmessage'] = 'جاري Øذ٠الرسائل...'; $messages['markingmessage'] = 'جاري تØديد الرسائل...'; $messages['addingmember'] = 'جاري إضاÙØ© المÙراسلين إلى المجموعة...'; $messages['removingmember'] = 'جاري إزالة المراسلين من المجموعة...'; $messages['receiptsent'] = 'أرسل إيصال الاستلام بنجاØ'; $messages['errorsendingreceipt'] = 'تعذر إرسال إيصال الاستلام'; +$messages['deleteidentityconfirm'] = 'هل تريد Ùعلاً Øذ٠هذا المعرÙØŸ'; $messages['nodeletelastidentity'] = 'لا يمكن Øذ٠هذا السجل Øيث أنه الوØيدالمتبقي.'; $messages['forbiddencharacter'] = 'اسم المجلّد ÙŠØتوي ØروÙاً ممنوعة'; $messages['selectimportfile'] = 'رجاء اختر ملÙاً لرÙعه'; $messages['addresswriterror'] = 'دÙتر العناوين المØدد غير قابل للكتابة'; $messages['contactaddedtogroup'] = 'تمت إضاÙØ© المراسلين إلى هذه المجموعةبنجاØ'; $messages['contactremovedfromgroup'] = 'تمت إزالة المراسلين من هذه المجموعةبنجاØ'; +$messages['nogroupassignmentschanged'] = 'لم يتم تغيير مهام المجموعة.'; $messages['importwait'] = 'جاري الاستيراد، رجاء انتظر...'; +$messages['importformaterror'] = 'Ùشل ÙÙŠ الاستيراد! المل٠الذي تØاول رÙعة ليس مل٠استيراد صالØ. '; $messages['importconfirm'] = '<b>تم استيراد $inserted مراسلين بنجاØØŒ وتجاهل$skipped موجودين مسبقاً</b>:<p><em>$names</em></p>'; $messages['importconfirmskipped'] = '<b>تم تجاهل $skipped عناصر موجودة</b>'; +$messages['importmessagesuccess'] = 'تم استرداد $nr رسالة بنجاØ'; +$messages['importmessageerror'] = 'Ùشل ÙÙŠ الاستيراد! المل٠الذي تØاول رÙعة ليس رسالة او صندوق بريد صالØ. '; $messages['opnotpermitted'] = 'العملية ممنوعة!'; $messages['nofromaddress'] = 'عنوان البريد الالكتروني غير Ù…Øدد Ùيالهويّة المنتقاة'; $messages['editorwarning'] = 'يتسبب الانتقال إلى Ù…Øرر النص البسيط بضياع جميع التنسيق. هل تريد الاستمرار؟'; @@ -124,6 +146,7 @@ $messages['smtperror'] = 'خطأ SMTP: $msg'; $messages['emailformaterror'] = 'عنوان بريد إلكتروني غير صالØ: $email'; $messages['toomanyrecipients'] = 'عدد المرسل إليهم كبير. قلص العدد إلى $max.'; $messages['maxgroupmembersreached'] = 'عدد أعضاء المجموعة أكثر من $max'; +$messages['internalerror'] = 'Øدث خطأ داخلي. الرجاء المØاولة مرة أخرى.'; $messages['contactdelerror'] = 'تعذر Øذ٠أسماء جهات الإتصال'; $messages['contactdeleted'] = 'تم Øذ٠أسماء جهات الإتصال بنجاØ'; $messages['contactrestoreerror'] = 'تعذر استعادة المÙراسل المØذوÙ.'; @@ -149,4 +172,6 @@ $messages['invalidimageformat'] = 'ليست صيغة صورة صØÙŠØØ©'; $messages['mispellingsfound'] = 'عÙثر على أخطاء إملائية ÙÙŠ الرسالة'; $messages['parentnotwritable'] = 'تعذر إنشاء/نقل المجلد إلى المجلد المØدد.ليست لديك الصلاØية.'; $messages['messagetoobig'] = 'جزء الرسالة أكبر بكثير مما يمكن معالجته.'; +$messages['attachmentvalidationerror'] = 'تØذير! المرÙÙ‚ ادناة مشكوك ÙÙŠ امره بسبب ان نوع المرÙÙ‚ لا يتناسب مع نوع المرÙÙ‚ Ø§Ù„Ù…ØµØ±Ø Ø¨Ø© ÙÙŠ هذه الرسالة.اذا كنت لا تثق ÙÙŠ المرسل, يجب عليك ان لا تÙتØØ© ÙÙŠ المتصÙØ Ù„Ø£Ù†Ù‡Ø§ قد تØتوي على Ù…Øتويات ضارة.<br/><br/><em>متوقع : $expected; موجود : $detected</em>'; +$messages['noscriptwarning'] = 'تØذير: خادم البريد الالكتروني هذا يتطلب جاÙاسكربت , يرجى تÙعيل الـ جاÙاسكربت ÙÙŠ اعدادت المتصÙØ Ø§Ù„Ø®Ø§Øµ بك لتتمكن من استخدامة.'; ?> diff --git a/program/localization/ast/messages.inc b/program/localization/ast/messages.inc index 35a850e57..6abf990ae 100644 --- a/program/localization/ast/messages.inc +++ b/program/localization/ast/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,6 @@ $messages['invalidrequest'] = 'Fallu de la solicitú. Nun se guardaron datos.'; $messages['invalidhost'] = 'Nome de sirvidor inválidu.'; $messages['nomessagesfound'] = 'Nun s\'atoparon mensaxes na bandexa'; $messages['loggedout'] = 'Zarraste la sesión. ¡Talluéu!'; -$messages['mailboxempty'] = 'La to cuenta nun tien mensaxes'; $messages['refreshing'] = 'Anovando...'; $messages['loading'] = 'Cargando...'; $messages['uploading'] = 'Xubiendo ficheru'; diff --git a/program/localization/az_AZ/labels.inc b/program/localization/az_AZ/labels.inc index 47c00ed08..1e4a5e2f5 100644 --- a/program/localization/az_AZ/labels.inc +++ b/program/localization/az_AZ/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to-dan $count'; $labels['copy'] = 'Kopyala'; $labels['move'] = 'Köçür'; $labels['moveto'] = 'Burada köçür...'; +$labels['copyto'] = 'Bura kopyala...'; $labels['download'] = 'Endir'; $labels['open'] = 'Aç'; $labels['showattachment'] = 'GöstÉ™r'; diff --git a/program/localization/az_AZ/messages.inc b/program/localization/az_AZ/messages.inc index ddf70378d..28e5f57d2 100644 --- a/program/localization/az_AZ/messages.inc +++ b/program/localization/az_AZ/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,8 @@ $messages['invalidrequest'] = 'SÉ™hv sorÄŸu! MÉ™lumat yaddaÅŸda qalmadı.'; $messages['invalidhost'] = 'SÉ™hv server adı.'; $messages['nomessagesfound'] = 'Poçt qutusunda mÉ™ktub tapılmadı.'; $messages['loggedout'] = 'Çıxış uÄŸurlu oldu. SaÄŸ olun!'; -$messages['mailboxempty'] = 'Poçt qutusu boÅŸdur'; +$messages['mailboxempty'] = 'Poçt boÅŸdur'; +$messages['nomessages'] = 'MÉ™ktub yoxdur'; $messages['refreshing'] = 'YenilÉ™nmÉ™...'; $messages['loading'] = 'YüklÉ™nir...'; $messages['uploading'] = 'Fayl yüklÉ™nir...'; diff --git a/program/localization/be_BE/labels.inc b/program/localization/be_BE/labels.inc index 9180b92d7..c08b9c866 100644 --- a/program/localization/be_BE/labels.inc +++ b/program/localization/be_BE/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from—$to з $count'; $labels['copy'] = 'КапіÑваць'; $labels['move'] = 'ПерамÑÑціць'; $labels['moveto'] = 'ПерамÑÑціць у...'; +$labels['copyto'] = 'СкапіÑваць у...'; $labels['download'] = 'СцÑгнуць'; $labels['open'] = 'Ðдкрыць'; $labels['showattachment'] = 'Паказаць'; diff --git a/program/localization/be_BE/messages.inc b/program/localization/be_BE/messages.inc index 6afc34b23..5d17249d6 100644 --- a/program/localization/be_BE/messages.inc +++ b/program/localization/be_BE/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,8 @@ $messages['invalidrequest'] = 'Ðевалідны запроÑ! Ð”Ð°Ð´Ð·ÐµÐ½Ñ‹Ñ $messages['invalidhost'] = 'ÐÑÑлушнае Ñ–Ð¼Ñ Ñервера.'; $messages['nomessagesfound'] = 'ПаведамленнÑÑž у гÑтай Ñкрынцы не знойдзена'; $messages['loggedout'] = 'СеÑÑ–Ñ ÑкаÑавана. Да пабачÑннÑ!'; -$messages['mailboxempty'] = 'У Ñкрынцы пуÑта.'; +$messages['mailboxempty'] = 'У паштовай Ñкрынцы пуÑта'; +$messages['nomessages'] = 'ÐÑма паведамленнÑÑž'; $messages['refreshing'] = 'ÐбнаўлÑецца...'; $messages['loading'] = 'Загружаецца...'; $messages['uploading'] = 'Файл зацÑгваецца...'; diff --git a/program/localization/bg_BG/labels.inc b/program/localization/bg_BG/labels.inc index ecedae739..e7f2f3712 100644 --- a/program/localization/bg_BG/labels.inc +++ b/program/localization/bg_BG/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to от $count'; $labels['copy'] = 'Копиране'; $labels['move'] = 'ПремеÑтване'; $labels['moveto'] = 'ПремеÑти във...'; +$labels['copyto'] = 'Копирай във...'; $labels['download'] = 'Изтегли'; $labels['open'] = 'Отвори'; $labels['showattachment'] = 'Показване'; @@ -234,7 +235,7 @@ $labels['addcc'] = 'Копие до'; $labels['addbcc'] = 'Скрито копие до'; $labels['addreplyto'] = 'Отговор до'; $labels['addfollowupto'] = 'Препращане към'; -$labels['mdnrequest'] = 'ПодателÑÑ‚ е поиÑкал да бъде уведомен, че Ñте го прочели това пиÑмо. Желаете ли да изпратите обратна разпиÑка?'; +$labels['mdnrequest'] = 'ПодателÑÑ‚ е поиÑкал да бъде уведомен, че Ñте прочели това пиÑмо. Желаете ли да изпратите обратна разпиÑка?'; $labels['receiptread'] = 'Обратна разпиÑка (прочетено)'; $labels['yourmessage'] = 'Това е обратна разпиÑка отноÑно пиÑмото Ви'; $labels['receiptnote'] = 'Забележка: Тази разпиÑка потвърждава Ñамо, че пиÑмото е било визуализирано на екрана на получателÑÑ‚. ÐÑма никаква гаранциÑ, че той е разбрал и/или дори прочел неговото Ñъдържание.'; @@ -248,8 +249,8 @@ $labels['nickname'] = 'ПÑевдоним'; $labels['jobtitle'] = 'ДлъжноÑÑ‚'; $labels['department'] = 'Отдел'; $labels['gender'] = 'Пол'; -$labels['maidenname'] = 'Бащино име'; -$labels['email'] = 'E-mail'; +$labels['maidenname'] = 'МоминÑко име'; +$labels['email'] = 'Ел. поща'; $labels['phone'] = 'Телефон'; $labels['address'] = 'ÐдреÑ'; $labels['street'] = 'Улица'; @@ -364,7 +365,7 @@ $labels['htmleditor'] = 'ПиÑане на ново пиÑмо като HTML'; $labels['htmlonreply'] = 'Ñамо при отговор на HTML пиÑмо'; $labels['htmlonreplyandforward'] = 'Ñамо при препращане или отговор на HTML пиÑмо'; $labels['htmlsignature'] = 'HTML подпиÑ'; -$labels['showemail'] = 'Показва email Ð°Ð´Ñ€ÐµÑ Ñ ÐµÐºÑ€Ð°Ð½Ð½Ð¾Ñ‚Ð¾ име'; +$labels['showemail'] = 'Показва Ð°Ð´Ñ€ÐµÑ Ð½Ð° ел. поща Ñ ÐµÐºÑ€Ð°Ð½Ð½Ð¾Ñ‚Ð¾ име'; $labels['previewpane'] = 'Показване на панел за преглед'; $labels['skin'] = 'Изглед на потребителÑки интерфейÑ'; $labels['logoutclear'] = 'При изход изтрий вÑичко от Кошче'; @@ -425,7 +426,7 @@ $labels['reqmdn'] = 'Винаги изиÑквай обратна разпиÑк $labels['reqdsn'] = 'Винаги изиÑквай ÑÑ‚Ð°Ñ‚ÑƒÑ Ð´Ð¾Ñтавка на пиÑмото'; $labels['replysamefolder'] = 'ПоÑтави отговор в папка на пиÑмото, на което Ñе отговарÑ'; $labels['defaultabook'] = 'ÐдреÑна книга по подразбиране'; -$labels['autocompletesingle'] = 'ПропуÑни алтернативни e-mail адреÑи при автоматично попълване'; +$labels['autocompletesingle'] = 'ПропуÑни алтернативни адреÑи на ел. поща при автоматично попълване'; $labels['listnamedisplay'] = 'Форматирай ÑпиÑък Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸ като'; $labels['spellcheckbeforesend'] = 'Провери за правопиÑни грешки преди изпращане на пиÑмото'; $labels['spellcheckoptions'] = 'ÐаÑтройки на проверката за правопиÑ'; diff --git a/program/localization/bg_BG/messages.inc b/program/localization/bg_BG/messages.inc index 4363417d2..df9620b30 100644 --- a/program/localization/bg_BG/messages.inc +++ b/program/localization/bg_BG/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -30,9 +30,10 @@ $messages['erroroverquota'] = 'Ðевъзможно извършване на о $messages['erroroverquotadelete'] = 'ÐÑма доÑтатъчно Ñвободно диÑково проÑтранÑтво. Ползвайте Shift+Del за да изтриете пиÑма.'; $messages['invalidrequest'] = 'Ðевалидна заÑвка! Данните не Ñа Ñъхранени.'; $messages['invalidhost'] = 'Ðевалидно име на Ñървър.'; -$messages['nomessagesfound'] = 'ÐÑма пиÑма.'; +$messages['nomessagesfound'] = 'ÐÑма пиÑма в тази пощенÑка кутиÑ.'; $messages['loggedout'] = 'СеÑиÑта е прекратена уÑпешно. Довиждане до ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Ð¿ÑŠÑ‚!'; -$messages['mailboxempty'] = 'ПощенÑката ÐºÑƒÑ‚Ð¸Ñ Ðµ празна.'; +$messages['mailboxempty'] = 'ПощенÑката ÐºÑƒÑ‚Ð¸Ñ Ðµ празна'; +$messages['nomessages'] = 'ÐÑма пиÑма'; $messages['refreshing'] = 'ОбновÑване...'; $messages['loading'] = 'Зареждане...'; $messages['uploading'] = 'Качване на файл...'; diff --git a/program/localization/bn_BD/messages.inc b/program/localization/bn_BD/messages.inc index ac744edee..d8fd08b4f 100644 --- a/program/localization/bn_BD/messages.inc +++ b/program/localization/bn_BD/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -21,7 +21,6 @@ $messages['sessionerror'] = 'আপনার সেশন শেষ'; $messages['storageerror'] = 'মেইল সারà¦à¦¾à¦° à¦à¦° সাথে যোগাযোগ করা গেল না'; $messages['nomessagesfound'] = 'à¦à¦‡ মেইলবকà§à¦¸à§‡ কোনো চিঠি নাই'; $messages['loggedout'] = 'আপনের সেশন ঠিকঠাক মতো শেষ হইছে। শà§à¦à¦¬à¦¿à¦¦à¦¾à§Ÿà¥¤'; -$messages['mailboxempty'] = 'মেইলবকà§à¦¸ খালি'; $messages['loading'] = 'কমà§à¦ªà§à¦Ÿà¦¾à¦° কাজ করতেছে . .'; $messages['loadingdata'] = 'কমà§à¦ªà§à¦Ÿà¦¾à¦° তথà§à¦¯ আনছে আপনার জনà§à¦¯..'; $messages['checkingmail'] = 'নতà§à¦¨ চিঠি আসছে কিনা তা দেখা হচà§à¦›à§‡'; diff --git a/program/localization/br/labels.inc b/program/localization/br/labels.inc index d503d1f4c..c239fe718 100644 --- a/program/localization/br/labels.inc +++ b/program/localization/br/labels.inc @@ -31,10 +31,12 @@ $labels['trash'] = 'Pod-lastez'; $labels['junk'] = 'Stroboù'; $labels['subject'] = 'Sujed'; $labels['from'] = 'Eus'; +$labels['sender'] = 'Kaser'; $labels['to'] = 'Da'; $labels['cc'] = 'Cc'; $labels['bcc'] = 'Cci'; $labels['replyto'] = 'Respont-da'; +$labels['followupto'] = 'Treuskas da'; $labels['date'] = 'Deiz'; $labels['size'] = 'Ment'; $labels['priority'] = 'Kentwir'; @@ -103,8 +105,10 @@ $labels['replytomessage'] = 'Respont d\'ar kaser'; $labels['replytoallmessage'] = 'Respont d\'an holl'; $labels['replyall'] = 'Respont d\'an holl'; $labels['replylist'] = 'Respont d\'ar roll'; +$labels['forwardattachment'] = 'Treuskas evel pezh stag'; $labels['forwardmessage'] = 'Treuzkas ar c\'hemennad'; $labels['deletemessage'] = 'Dilec\'hiañ ar c\'hemennad er pod-lastez'; +$labels['movemessagetotrash'] = 'lakit er pod lastez'; $labels['printmessage'] = 'Moulañ ar c\'hemennad-se'; $labels['previousmessage'] = 'Gwelout ar c"hemennad a-raok'; $labels['firstmessage'] = 'Gwelout ar c\'hemennad kentañ'; @@ -112,9 +116,18 @@ $labels['nextmessage'] = 'Gwelout ar c\'hemennad da heul'; $labels['lastmessage'] = 'Gwelout ar c\'hemennad diwezhañ'; $labels['backtolist'] = 'Distreiñ el listenn kemennadoù'; $labels['viewsource'] = 'Gwelout an tarzh'; +$labels['mark'] = 'merkañ'; +$labels['markmessages'] = 'Merkañ ar c\'hemennad'; +$labels['markflagged'] = 'spilhennet'; +$labels['markunflagged'] = 'n\'eo ket bet spilhennet'; +$labels['moreactions'] = 'muioc\'h a dibab'; +$labels['more'] = 'muioc\'h'; +$labels['back'] = 'distro'; +$labels['options'] = 'Dibarzhioù'; $labels['select'] = 'Diuzañ'; $labels['all'] = 'An holl'; $labels['none'] = 'Ebet'; +$labels['currpage'] = 'Pajenn'; $labels['unread'] = 'Na lennet'; $labels['nonesort'] = 'Ebet'; $labels['compact'] = 'Stummaat'; @@ -151,10 +164,13 @@ $labels['surname'] = 'Anv'; $labels['email'] = 'Postel elektronek'; $labels['addcontact'] = 'Ouzhpennañ an darempred diuzet en hor c\'harned chomlec\'hioù'; $labels['editcontact'] = 'Cheñch an darempred'; +$labels['contacts'] = 'darempred'; $labels['edit'] = 'Cheñch'; $labels['cancel'] = 'Nullañ'; $labels['save'] = 'Gwarediñ'; $labels['delete'] = 'Dilemel'; +$labels['rename'] = 'chench anv'; +$labels['replacephoto'] = 'chench'; $labels['newcontact'] = 'Krouiñ un darempred nevez'; $labels['deletecontact'] = 'Dilemel an darempredoù diuzet'; $labels['composeto'] = 'Skrivañ ur c\'hemennad ouzh'; @@ -167,7 +183,14 @@ $labels['nextpage'] = 'Diskouez pajenn da heul'; $labels['lastpage'] = 'Gwelout ar bajenn diwezhañ'; $labels['groups'] = 'Strolladoù'; $labels['personaladrbook'] = 'Chomlec\'h personel'; +$labels['searchsave'] = 'enrollane an enklask'; +$labels['searchdelete'] = 'dilemel an enklask'; +$labels['import'] = 'enporzhiañ'; +$labels['importcontacts'] = 'Enporzhiañ darempredoù'; +$labels['importfromfile'] = 'enporzhiañ eus an teuliad :'; +$labels['done'] = 'Graet eo'; $labels['settingsfor'] = 'Arventennoù evit'; +$labels['about'] = 'Diwar-benn'; $labels['preferences'] = 'Dibarzhioù'; $labels['userpreferences'] = 'Dibarzhioù implijer'; $labels['editpreferences'] = 'Cheñch dibarzhioù implijer'; diff --git a/program/localization/br/messages.inc b/program/localization/br/messages.inc index 7f724a24d..bd266d0d4 100644 --- a/program/localization/br/messages.inc +++ b/program/localization/br/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -25,7 +25,6 @@ $messages['servererrormsg'] = 'Fazi dafariad : $msg'; $messages['dberror'] = 'Fazi stlennvon !'; $messages['nomessagesfound'] = 'Kemennadoù ebet er voest lizhiri'; $messages['loggedout'] = 'Digevreet hoc\'h eus mat. Kenavo !'; -$messages['mailboxempty'] = 'Boest lizhiri dileun'; $messages['loading'] = 'O kargañ...'; $messages['loadingdata'] = 'O kargañ roadennoù...'; $messages['checkingmail'] = 'O Gwiriañ kemennadoù nevez...'; diff --git a/program/localization/bs_BA/labels.inc b/program/localization/bs_BA/labels.inc index adc65e069..c79cf4ecc 100644 --- a/program/localization/bs_BA/labels.inc +++ b/program/localization/bs_BA/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to od ukupno $count'; $labels['copy'] = 'Kopiraj'; $labels['move'] = 'Premjesti'; $labels['moveto'] = 'Premjesti u...'; +$labels['copyto'] = 'Kopiraj u...'; $labels['download'] = 'Preuzmi'; $labels['open'] = 'Otvori'; $labels['showattachment'] = 'Prikaži'; diff --git a/program/localization/bs_BA/messages.inc b/program/localization/bs_BA/messages.inc index 52f865f1e..42f2517b2 100644 --- a/program/localization/bs_BA/messages.inc +++ b/program/localization/bs_BA/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,8 @@ $messages['invalidrequest'] = 'Neispravan zahtjev! Podaci nisu saÄuvani.'; $messages['invalidhost'] = 'Neispravno ime servera.'; $messages['nomessagesfound'] = 'Nema poruka u ovom sanduÄetu.'; $messages['loggedout'] = 'UspjeÅ¡no ste se odjavili. DoviÄ‘enja!'; -$messages['mailboxempty'] = 'SanduÄe je prazno.'; +$messages['mailboxempty'] = 'SanduÄe je prazno'; +$messages['nomessages'] = 'Nema poruka'; $messages['refreshing'] = 'Osvježavam...'; $messages['loading'] = 'UÄitavanje...'; $messages['uploading'] = 'Dodajem datoteku...'; diff --git a/program/localization/ca_ES/labels.inc b/program/localization/ca_ES/labels.inc index 427abf142..15d879bc1 100644 --- a/program/localization/ca_ES/labels.inc +++ b/program/localization/ca_ES/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from - $to de $count'; $labels['copy'] = 'Copia'; $labels['move'] = 'Mou'; $labels['moveto'] = 'Mou a...'; +$labels['copyto'] = 'Copia a...'; $labels['download'] = 'Descarrega'; $labels['open'] = 'Obre'; $labels['showattachment'] = 'Mostra'; @@ -59,13 +60,13 @@ $labels['showanyway'] = 'Mostra-ho de totes maneres'; $labels['filename'] = 'Nom del fitxer'; $labels['filesize'] = 'Mida del fitxer'; $labels['addtoaddressbook'] = 'Afegeix a contactes'; -$labels['sun'] = 'Diu'; -$labels['mon'] = 'Dll'; -$labels['tue'] = 'Dmt'; -$labels['wed'] = 'Dmc'; -$labels['thu'] = 'Dij'; -$labels['fri'] = 'Div'; -$labels['sat'] = 'Dis'; +$labels['sun'] = 'dg'; +$labels['mon'] = 'dl'; +$labels['tue'] = 'dm'; +$labels['wed'] = 'dc'; +$labels['thu'] = 'dj'; +$labels['fri'] = 'dv'; +$labels['sat'] = 'ds'; $labels['sunday'] = 'Diumenge'; $labels['monday'] = 'Dilluns'; $labels['tuesday'] = 'Dimarts'; diff --git a/program/localization/ca_ES/messages.inc b/program/localization/ca_ES/messages.inc index 66c4a6d42..c71677b44 100644 --- a/program/localization/ca_ES/messages.inc +++ b/program/localization/ca_ES/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,8 @@ $messages['invalidrequest'] = 'Petició no và lida! No s\'han desat les dades.'; $messages['invalidhost'] = 'Nom de servidor no và lid.'; $messages['nomessagesfound'] = 'No s\'han trobat missatges en aquesta bústia.'; $messages['loggedout'] = 'Heu tancat la sessió correctament. A reveure!'; -$messages['mailboxempty'] = 'La bústia és buida.'; +$messages['mailboxempty'] = 'La bústia és buida'; +$messages['nomessages'] = 'No hi ha missatges'; $messages['refreshing'] = 'S\'està actualitzant...'; $messages['loading'] = 'S\'està carregant…'; $messages['uploading'] = 'S\'està pujant el fitxer...'; diff --git a/program/localization/cs_CZ/labels.inc b/program/localization/cs_CZ/labels.inc index a0f0828fd..2c94306e5 100644 --- a/program/localization/cs_CZ/labels.inc +++ b/program/localization/cs_CZ/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from - $to z $count'; $labels['copy'] = 'KopÃrovat'; $labels['move'] = 'PÅ™esunout'; $labels['moveto'] = 'pÅ™esunout do...'; +$labels['copyto'] = 'KopÃrovat do...'; $labels['download'] = 'stáhnout'; $labels['open'] = 'OtevÅ™Ãt'; $labels['showattachment'] = 'Zobrazit'; diff --git a/program/localization/cs_CZ/messages.inc b/program/localization/cs_CZ/messages.inc index a4c63b0e0..37f5280e8 100644 --- a/program/localization/cs_CZ/messages.inc +++ b/program/localization/cs_CZ/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -33,6 +33,7 @@ $messages['invalidhost'] = 'Å patné jméno serveru.'; $messages['nomessagesfound'] = 'Ve schránce nebyla nalezena žádná zpráva'; $messages['loggedout'] = 'Byli jste úspěšnÄ› odhlášeni. Na shledanou!'; $messages['mailboxempty'] = 'Schránka je prázdná'; +$messages['nomessages'] = 'Žádné zprávy'; $messages['refreshing'] = 'Obnovuji...'; $messages['loading'] = 'NaÄÃtám...'; $messages['uploading'] = 'Nahrávám soubor...'; diff --git a/program/localization/cy_GB/labels.inc b/program/localization/cy_GB/labels.inc index 37ee5bbc1..770df3bff 100644 --- a/program/localization/cy_GB/labels.inc +++ b/program/localization/cy_GB/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from - $to o $count'; $labels['copy'] = 'Copio'; $labels['move'] = 'Symud'; $labels['moveto'] = 'Symud i...'; +$labels['copyto'] = 'Copio i...'; $labels['download'] = 'Llwytho lawr'; $labels['open'] = 'Agor'; $labels['showattachment'] = 'Dangos'; @@ -197,6 +198,16 @@ $labels['spellcheck'] = 'Sillafu'; $labels['checkspelling'] = 'Gwirio sillafu'; $labels['resumeediting'] = 'Ail-ddechrau golygu'; $labels['revertto'] = 'Dychwelyd i'; +$labels['restore'] = 'Adfer'; +$labels['restoremessage'] = 'Adfer neges?'; +$labels['responses'] = 'Ymatebion'; +$labels['insertresponse'] = 'Mewnosod ymateb'; +$labels['manageresponses'] = 'Rheoli ymatebion'; +$labels['savenewresponse'] = 'Cadw ymateb newydd'; +$labels['editresponses'] = 'Golygu ymatebion'; +$labels['editresponse'] = 'Golygu ymateb'; +$labels['responsename'] = 'Enw'; +$labels['responsetext'] = 'Testun Ymateb'; $labels['attach'] = 'Atodi'; $labels['attachments'] = 'Atodiadau'; $labels['upload'] = 'Llwytho fyny'; @@ -428,6 +439,9 @@ $labels['standardwindows'] = 'Trin ffenestri naid fel ffenestri arferol'; $labels['forwardmode'] = 'Danfon neges ymlaen'; $labels['inline'] = 'mewnlin'; $labels['asattachment'] = 'fel atodiad'; +$labels['replyallmode'] = 'Gweithred diofyn botwm [Ymateb i bawb]'; +$labels['replyalldefault'] = 'ymateb i bawb'; +$labels['replyalllist'] = 'ymateb i\'r rhestr trafod yn unig (os canfuwyd)'; $labels['folder'] = 'Ffolder'; $labels['folders'] = 'Ffolderi'; $labels['foldername'] = 'Enw ffolder'; diff --git a/program/localization/cy_GB/messages.inc b/program/localization/cy_GB/messages.inc index be6c4dac6..8e0c1c276 100644 --- a/program/localization/cy_GB/messages.inc +++ b/program/localization/cy_GB/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -16,10 +16,10 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/messages/ */ $messages['errortitle'] = 'Fe gafwyd gwall!'; -$messages['loginfailed'] = 'Methwyd a\'ch mewngofnodi'; -$messages['cookiesdisabled'] = 'Nid yw eich porwr yn derbyn cwcis'; -$messages['sessionerror'] = 'Mae\'r sesiwn yn anghywir neu wedi dod i ben'; -$messages['storageerror'] = 'Methwyd cysylltu a\'r gweinydd IMAP'; +$messages['loginfailed'] = 'Methwyd mewngofnodi.'; +$messages['cookiesdisabled'] = 'Nid yw eich porwr yn derbyn cwcis.'; +$messages['sessionerror'] = 'Mae\'r sesiwn yn anghywir neu wedi dod i ben.'; +$messages['storageerror'] = 'Methwyd cysylltu a\'r gweinydd storfa.'; $messages['servererror'] = 'Gwall Gweinydd!'; $messages['servererrormsg'] = 'Gwall Gweinydd: $msg'; $messages['dberror'] = 'Gwall Cronfa Ddata!'; @@ -32,7 +32,8 @@ $messages['invalidrequest'] = 'Cais annilys! Ni chadwyd unrhyw wybodaeth.'; $messages['invalidhost'] = 'Enw gweinydd annilys.'; $messages['nomessagesfound'] = 'Dim negeseuon wedi eu canfod yn y blwch hwn'; $messages['loggedout'] = 'Rydych wedi gorffen y sesiwn yn llwyddianus. Hwyl fawr!'; -$messages['mailboxempty'] = 'Blwch yn wag'; +$messages['mailboxempty'] = 'Mae\'r blwch yn wag'; +$messages['nomessages'] = 'Dim negeseuon'; $messages['refreshing'] = 'Yn adnewyddu...'; $messages['loading'] = 'Yn llwytho...'; $messages['uploading'] = 'Yn llwytho ffeil i fyny...'; @@ -44,6 +45,8 @@ $messages['messagesent'] = 'Danfonwyd y neges yn llwyddiannus'; $messages['savingmessage'] = 'Yn cadw neges...'; $messages['messagesaved'] = 'Cadwyd neges i\'r Drafftiau'; $messages['successfullysaved'] = 'Cadwyd yn llwyddiannus'; +$messages['savingresponse'] = 'Yn cadw testun ymateb...'; +$messages['deleteresponseconfirm'] = 'Ydych chi wir am ddileu y testun ymateb hwn?'; $messages['addedsuccessfully'] = 'Cyswllt wedi ei ychwanegu i\'r llyfr cyfeiriadau yn llwyddiannus'; $messages['contactexists'] = 'Mae cyswllt gyda\'r cyfeiriad e-bost yma yn bodoli\'n barod'; $messages['contactnameexists'] = 'Mae cyswllt gyda\'r un enw yn bodoli yn barod.'; @@ -80,6 +83,7 @@ $messages['norecipientwarning'] = 'Rhowch o leiaf un derbynnydd'; $messages['nosubjectwarning'] = 'Mae\'r pennawd "Pwnc" yn wag. Hoffech chi roi un fewn nawr?'; $messages['nobodywarning'] = 'Danfon y neges hwn heb destun?'; $messages['notsentwarning'] = 'Ni ddanfonwyd y neges. Hoffech chi gael gwared a\'r neges?'; +$messages['restoresavedcomposedata'] = 'Cafwyd hyd i neges wedi ei ysgrifennu o\'r blaen ond heb ei ddanfon.\n\nPwnc: $subject\nCadwyd: $date\n\nYdych chi am adfer y neges?'; $messages['noldapserver'] = 'Dewiswch weinydd ldap i chwilio'; $messages['nosearchname'] = 'Rhowch enw cyswllt neu gyfeiriad e-bost'; $messages['notuploadedwarning'] = 'Nid yw pob atodiad wedi eu llwytho i fyny eto. Triwch eto neu canslo.'; diff --git a/program/localization/da_DK/labels.inc b/program/localization/da_DK/labels.inc index a452a348c..66103ad63 100644 --- a/program/localization/da_DK/labels.inc +++ b/program/localization/da_DK/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to af $count'; $labels['copy'] = 'Kopiér'; $labels['move'] = 'Flyt'; $labels['moveto'] = 'Flyt til...'; +$labels['copyto'] = 'Kopier til...'; $labels['download'] = 'Download'; $labels['open'] = 'Ã…ben'; $labels['showattachment'] = 'Vis'; diff --git a/program/localization/da_DK/messages.inc b/program/localization/da_DK/messages.inc index 1328ed288..4a567aed8 100644 --- a/program/localization/da_DK/messages.inc +++ b/program/localization/da_DK/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -33,6 +33,7 @@ $messages['invalidhost'] = 'Ugyldigt servernavn.'; $messages['nomessagesfound'] = 'Der blev ikke fundet nogen beskeder i denne postkasse.'; $messages['loggedout'] = 'Du er nu logget af webmail. Farvel sÃ¥ længe!'; $messages['mailboxempty'] = 'Postkassen er tom.'; +$messages['nomessages'] = 'Ingen beskeder'; $messages['refreshing'] = 'Opdaterer...'; $messages['loading'] = 'Indlæser...'; $messages['uploading'] = 'Uploader fil...'; diff --git a/program/localization/de_CH/csv2vcard.inc b/program/localization/de_CH/csv2vcard.inc new file mode 100644 index 000000000..c6c2c5924 --- /dev/null +++ b/program/localization/de_CH/csv2vcard.inc @@ -0,0 +1,110 @@ +<?php + +/* ++-----------------------------------------------------------------------+ +| localization/de_CH/csv2vcard.inc | +| | +| Localization file of the Roundcube Webmail client | +| Copyright (C) 2005-2014, The Roundcube Dev Team | +| | +| Licensed under the GNU General Public License version 3 or | +| any later version with exceptions for skins & plugins. | +| See the README file for a full license statement. | +| | ++-----------------------------------------------------------------------+ +| Author: Aleksander Machniak <alec@alec.pl> | ++-----------------------------------------------------------------------+ +*/ + +// This is a list of CSV column names specified in CSV file header +// These must be original texts used in Outlook/Thunderbird exported csv files +// Encoding UTF-8 + +$map = array(); + +// MS Outlook 2010 +$map['anniversary'] = "Jahrestag"; +$map['assistants_name'] = "Name Assistent"; +$map['assistants_phone'] = "Telefon Assistent"; +$map['birthday'] = "Geburtstag"; +$map['business_city'] = "Ort geschäftlich"; +$map['business_countryregion'] = "Region geschäftlich"; +$map['business_fax'] = "Fax geschäftlich"; +$map['business_phone'] = "Telefon geschäftlich"; +$map['business_phone_2'] = "Telefon geschäftlich 2"; +$map['business_postal_code'] = "Postleitzahl geschäftlich"; +$map['business_state'] = "Land geschäftlich"; +$map['business_street'] = "Straße geschäftlich"; +$map['car_phone'] = "Autotelefon"; +$map['categories'] = "Kategorien"; +$map['company'] = "Firma"; +$map['department'] = "Abteilung"; +$map['email_address'] = "E-Mail-Adresse"; +$map['first_name'] = "Vorname"; +$map['gender'] = "Geschlecht"; +$map['home_city'] = "Ort privat"; +$map['home_countryregion'] = "Region privat"; +$map['home_fax'] = "Fax privat"; +$map['home_phone'] = "Telefon privat"; +$map['home_phone_2'] = "Telefon privat 2"; +$map['home_postal_code'] = "Postleitzahl privat"; +$map['home_state'] = "Land privat"; +$map['home_street'] = "Straße privat"; +$map['job_title'] = "Position"; +$map['last_name'] = "Nachname"; +$map['managers_name'] = "Manager's Name"; +$map['middle_name'] = "Weitere Vornamen"; +$map['mobile_phone'] = "Mobiltelefon"; +$map['notes'] = "Notizen"; +$map['other_city'] = "Weiterer Ort"; +$map['other_countryregion'] = "Weitere Region"; +$map['other_fax'] = "Weiteres Fax"; +$map['other_phone'] = "Weiteres Telefon"; +$map['other_postal_code'] = "Weitere Postleitzahl"; +$map['other_state'] = "Weiteres Land"; +$map['other_street'] = "Weitere Straße"; +$map['pager'] = "Pager"; +$map['primary_phone'] = "Haupttelefon"; +$map['spouse'] = "Spouse"; +$map['suffix'] = "Suffix"; +$map['title'] = "Title"; +$map['web_page'] = "Webseite"; + +// Thunderbird +$map['birth_day'] = "Geburtstag"; +$map['birth_month'] = "Geburtsmonat"; +$map['birth_year'] = "Geburtsjahr"; +$map['display_name'] = "Anzeigename"; +$map['fax_number'] = "Fax-Nummer"; +$map['home_address'] = "Privat: Adresse"; +$map['home_country'] = "Privat: Land"; +$map['home_zipcode'] = "Privat: PLZ"; +$map['mobile_number'] = "Mobil-Tel.-Nr."; +$map['nickname'] = "Spitzname"; +$map['organization'] = "Organisation"; +$map['pager_number'] = "Pager-Nummer"; +$map['primary_email'] = "Primäre E-Mail-Adresse"; +$map['secondary_email'] = "Sekundäre E-Mail-Adresse"; +$map['web_page_1'] = "Webseite 1"; +$map['web_page_2'] = "Webseite 2"; +$map['work_phone'] = "Tel. dienstlich"; +$map['work_address'] = "Dienstlich: Adresse"; +$map['work_country'] = "Dienstlich: Land"; +$map['work_zipcode'] = "Dienstlich: PLZ"; + +// Atmail +$map['date_of_birth'] = "Date of Birth"; +$map['email'] = "Email"; +$map['home_mobile'] = "Home Mobile"; +$map['home_zip'] = "Home Zip"; +$map['info'] = "Info"; +$map['user_photo'] = "User Photo"; +$map['url'] = "URL"; +$map['work_city'] = "Work City"; +$map['work_company'] = "Work Company"; +$map['work_dept'] = "Work Dept"; +$map['work_fax'] = "Work Fax"; +$map['work_mobile'] = "Work Mobile"; +$map['work_state'] = "Work State"; +$map['work_title'] = "Work Title"; +$map['work_zip'] = "Work Zip"; diff --git a/program/localization/de_CH/labels.inc b/program/localization/de_CH/labels.inc index bfcbcf1e5..f53640ab5 100644 --- a/program/localization/de_CH/labels.inc +++ b/program/localization/de_CH/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to von $count'; $labels['copy'] = 'Kopieren'; $labels['move'] = 'Verschieben'; $labels['moveto'] = 'Verschieben nach...'; +$labels['copyto'] = 'Kopieren nach...'; $labels['download'] = 'Download'; $labels['open'] = 'Öffnen'; $labels['showattachment'] = 'Anzeigen'; diff --git a/program/localization/de_CH/messages.inc b/program/localization/de_CH/messages.inc index 1b021a360..63a1411d0 100644 --- a/program/localization/de_CH/messages.inc +++ b/program/localization/de_CH/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -33,6 +33,7 @@ $messages['invalidhost'] = 'Ungültiger Servername'; $messages['nomessagesfound'] = 'Keine Nachrichten in diesem Ordner'; $messages['loggedout'] = 'Sie haben Ihre Session erfolgreich beendet. Auf Wiedersehen!'; $messages['mailboxempty'] = 'Ordner ist leer'; +$messages['nomessages'] = 'Keine Nachrichten'; $messages['refreshing'] = 'Aktualisiere...'; $messages['loading'] = 'Daten werden geladen...'; $messages['uploading'] = 'Datei wird hochgeladen...'; diff --git a/program/localization/de_DE/csv2vcard.inc b/program/localization/de_DE/csv2vcard.inc new file mode 100644 index 000000000..116349d28 --- /dev/null +++ b/program/localization/de_DE/csv2vcard.inc @@ -0,0 +1,110 @@ +<?php + +/* ++-----------------------------------------------------------------------+ +| localization/de_DE/csv2vcard.inc | +| | +| Localization file of the Roundcube Webmail client | +| Copyright (C) 2005-2014, The Roundcube Dev Team | +| | +| Licensed under the GNU General Public License version 3 or | +| any later version with exceptions for skins & plugins. | +| See the README file for a full license statement. | +| | ++-----------------------------------------------------------------------+ +| Author: Aleksander Machniak <alec@alec.pl> | ++-----------------------------------------------------------------------+ +*/ + +// This is a list of CSV column names specified in CSV file header +// These must be original texts used in Outlook/Thunderbird exported csv files +// Encoding UTF-8 + +$map = array(); + +// MS Outlook 2010 +$map['anniversary'] = "Jahrestag"; +$map['assistants_name'] = "Name Assistent"; +$map['assistants_phone'] = "Telefon Assistent"; +$map['birthday'] = "Geburtstag"; +$map['business_city'] = "Ort geschäftlich"; +$map['business_countryregion'] = "Region geschäftlich"; +$map['business_fax'] = "Fax geschäftlich"; +$map['business_phone'] = "Telefon geschäftlich"; +$map['business_phone_2'] = "Telefon geschäftlich 2"; +$map['business_postal_code'] = "Postleitzahl geschäftlich"; +$map['business_state'] = "Land geschäftlich"; +$map['business_street'] = "Straße geschäftlich"; +$map['car_phone'] = "Autotelefon"; +$map['categories'] = "Kategorien"; +$map['company'] = "Firma"; +$map['department'] = "Abteilung"; +$map['email_address'] = "E-Mail-Adresse"; +$map['first_name'] = "Vorname"; +$map['gender'] = "Geschlecht"; +$map['home_city'] = "Ort privat"; +$map['home_countryregion'] = "Region privat"; +$map['home_fax'] = "Fax privat"; +$map['home_phone'] = "Telefon privat"; +$map['home_phone_2'] = "Telefon privat 2"; +$map['home_postal_code'] = "Postleitzahl privat"; +$map['home_state'] = "Land privat"; +$map['home_street'] = "Straße privat"; +$map['job_title'] = "Position"; +$map['last_name'] = "Nachname"; +$map['managers_name'] = "Manager's Name"; +$map['middle_name'] = "Weitere Vornamen"; +$map['mobile_phone'] = "Mobiltelefon"; +$map['notes'] = "Notizen"; +$map['other_city'] = "Weiterer Ort"; +$map['other_countryregion'] = "Weitere Region"; +$map['other_fax'] = "Weiteres Fax"; +$map['other_phone'] = "Weiteres Telefon"; +$map['other_postal_code'] = "Weitere Postleitzahl"; +$map['other_state'] = "Weiteres Land"; +$map['other_street'] = "Weitere Straße"; +$map['pager'] = "Pager"; +$map['primary_phone'] = "Haupttelefon"; +$map['spouse'] = "Spouse"; +$map['suffix'] = "Suffix"; +$map['title'] = "Title"; +$map['web_page'] = "Webseite"; + +// Thunderbird +$map['birth_day'] = "Geburtstag"; +$map['birth_month'] = "Geburtsmonat"; +$map['birth_year'] = "Geburtsjahr"; +$map['display_name'] = "Anzeigename"; +$map['fax_number'] = "Fax-Nummer"; +$map['home_address'] = "Privat: Adresse"; +$map['home_country'] = "Privat: Land"; +$map['home_zipcode'] = "Privat: PLZ"; +$map['mobile_number'] = "Mobil-Tel.-Nr."; +$map['nickname'] = "Spitzname"; +$map['organization'] = "Organisation"; +$map['pager_number'] = "Pager-Nummer"; +$map['primary_email'] = "Primäre E-Mail-Adresse"; +$map['secondary_email'] = "Sekundäre E-Mail-Adresse"; +$map['web_page_1'] = "Webseite 1"; +$map['web_page_2'] = "Webseite 2"; +$map['work_phone'] = "Tel. dienstlich"; +$map['work_address'] = "Dienstlich: Adresse"; +$map['work_country'] = "Dienstlich: Land"; +$map['work_zipcode'] = "Dienstlich: PLZ"; + +// Atmail +$map['date_of_birth'] = "Date of Birth"; +$map['email'] = "Email"; +$map['home_mobile'] = "Home Mobile"; +$map['home_zip'] = "Home Zip"; +$map['info'] = "Info"; +$map['user_photo'] = "User Photo"; +$map['url'] = "URL"; +$map['work_city'] = "Work City"; +$map['work_company'] = "Work Company"; +$map['work_dept'] = "Work Dept"; +$map['work_fax'] = "Work Fax"; +$map['work_mobile'] = "Work Mobile"; +$map['work_state'] = "Work State"; +$map['work_title'] = "Work Title"; +$map['work_zip'] = "Work Zip"; diff --git a/program/localization/de_DE/labels.inc b/program/localization/de_DE/labels.inc index e3f4652cc..e0a347e42 100644 --- a/program/localization/de_DE/labels.inc +++ b/program/localization/de_DE/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to von $count'; $labels['copy'] = 'Kopieren'; $labels['move'] = 'Verschieben'; $labels['moveto'] = 'Verschieben nach...'; +$labels['copyto'] = 'Kopieren nach...'; $labels['download'] = 'Herunterladen'; $labels['open'] = 'Offen'; $labels['showattachment'] = 'Anzeigen'; @@ -197,6 +198,16 @@ $labels['spellcheck'] = 'Rechtschreibung'; $labels['checkspelling'] = 'Rechtschreibung prüfen'; $labels['resumeediting'] = 'Bearbeitung fortsetzen'; $labels['revertto'] = 'Zurück zu'; +$labels['restore'] = 'Wiederherstellen'; +$labels['restoremessage'] = 'Nachricht wiederherstellen?'; +$labels['responses'] = 'Schnellantworten'; +$labels['insertresponse'] = 'Schnellantwort hinzufügen'; +$labels['manageresponses'] = 'Schnellantworten verwalten'; +$labels['savenewresponse'] = 'Neue Schnellantwort speichern'; +$labels['editresponses'] = 'Schnellantworten bearbeiten'; +$labels['editresponse'] = 'Schnellantwort bearbeiten'; +$labels['responsename'] = 'Name'; +$labels['responsetext'] = 'Text der Antwort'; $labels['attach'] = 'Anhängen'; $labels['attachments'] = 'Anhänge'; $labels['upload'] = 'Hochladen'; @@ -318,6 +329,8 @@ $labels['importcontacts'] = 'Kontakte importieren'; $labels['importfromfile'] = 'Import aus Datei:'; $labels['importtarget'] = 'Kontakte hinzufügen zu'; $labels['importreplace'] = 'Bestehendes Adressbuch komplett ersetzen'; +$labels['importgroups'] = 'Gruppenzuordnungen importieren'; +$labels['importgroupsall'] = 'Alle (Gruppen erstellen wenn nötig)'; $labels['importgroupsexisting'] = 'Nur für existierende Gruppen'; $labels['importdesc'] = 'Sie können Kontakte von einem vorhandenen Adressbuch hochladen.<br/>Zur Zeit wird der Import von Adressen im <a href="http://de.wikipedia.org/wiki/VCard">vCard</a> oder <a href="http://de.wikipedia.org/wiki/CSV_(Dateiformat)">CSV</a>Format unterstützt.'; $labels['done'] = 'Fertig'; @@ -426,6 +439,9 @@ $labels['standardwindows'] = 'Popups als Standard Windows behandeln'; $labels['forwardmode'] = 'Nachrichtenweiterleitung'; $labels['inline'] = 'eingebettet'; $labels['asattachment'] = 'als Anhang'; +$labels['replyallmode'] = 'Standardaktion des "Allen antworten" Button'; +$labels['replyalldefault'] = 'Allen antworten'; +$labels['replyalllist'] = 'Nur der Mailingliste antworten (wenn gefunden)'; $labels['folder'] = 'Ordner'; $labels['folders'] = 'Ordner'; $labels['foldername'] = 'Ordnername'; diff --git a/program/localization/de_DE/messages.inc b/program/localization/de_DE/messages.inc index fbc21521a..d9e6d9687 100644 --- a/program/localization/de_DE/messages.inc +++ b/program/localization/de_DE/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,8 @@ $messages['invalidrequest'] = 'Ungültige Anfrage! Es wurden keine Daten gespeic $messages['invalidhost'] = 'Ungültiger Server Name'; $messages['nomessagesfound'] = 'Keine Nachrichten in diesem Ordner.'; $messages['loggedout'] = 'Sie haben Ihre Sitzung erfolgreich beendet. Auf Wiedersehen!'; -$messages['mailboxempty'] = 'Mailbox ist leer.'; +$messages['mailboxempty'] = 'Mailbox ist leer'; +$messages['nomessages'] = 'Keine Nachrichten'; $messages['refreshing'] = 'Aktualisieren…'; $messages['loading'] = 'Wird geladen...'; $messages['uploading'] = 'Datei wird hochgeladen...'; @@ -44,6 +45,8 @@ $messages['messagesent'] = 'Nachricht erfolgreich gesendet.'; $messages['savingmessage'] = 'Nachricht wird gespeichert...'; $messages['messagesaved'] = 'Nachricht als Entwurf gespeichert.'; $messages['successfullysaved'] = 'Erfolgreich gespeichert.'; +$messages['savingresponse'] = 'Antwortvorlage wird gespeichert...'; +$messages['deleteresponseconfirm'] = 'Möchten Sie diese Vorlage wirklich löschen?'; $messages['addedsuccessfully'] = 'Kontakt zum Adressbuch hinzugefügt.'; $messages['contactexists'] = 'Es existiert bereits ein Kontakt mit dieser E-Mail-Adresse.'; $messages['contactnameexists'] = 'Ein Kontakt mit dem gleichen Namen existiert bereits.'; @@ -54,6 +57,8 @@ $messages['contactnotfound'] = 'Der angeforderte Kontakt wurde nicht gefunden.'; $messages['contactsearchonly'] = 'Geben Sie einen Suchbegriff ein, um Kontakte zu finden.'; $messages['sendingfailed'] = 'Versenden der Nachricht fehlgeschlagen.'; $messages['senttooquickly'] = 'Bitte warten Sie $sec Sekunde(n) vor dem Senden dieser Nachricht.'; +$messages['errorsavingsent'] = 'Ein Fehler ist beim Speichern der gesendeten Nachricht aufgetreten.'; +$messages['errorsaving'] = 'Beim Speichern ist ein Fehler aufgetreten.'; $messages['errormoving'] = 'Nachricht(en) konnte(n) nicht verschoben werden.'; $messages['errorcopying'] = 'Nachticht(en) konnte(n) nicht kopiert werden.'; $messages['errordeleting'] = 'Nachricht(en) konnte(n) nicht gelöscht werden.'; @@ -78,6 +83,7 @@ $messages['norecipientwarning'] = 'Bitte geben Sie mindestens einen Empfänger a $messages['nosubjectwarning'] = 'Die Betreffzeile ist leer. Möchten Sie jetzt einen Betreff eingeben?'; $messages['nobodywarning'] = 'Diese Nachricht ohne Inhalt senden?'; $messages['notsentwarning'] = 'Ihre Nachricht wurde nicht gesendet. Wollen Sie die Nachricht verwerfen?'; +$messages['restoresavedcomposedata'] = 'Es wurde ein nicht versandter Entwurf einer Nachricht gefunden.\n\nBetreff: $subject\nGespeichert am: $date\n\nMöchten Sie diese Nachricht wiederherstellen?'; $messages['noldapserver'] = 'Bitte wählen Sie einen LDAP-Server aus.'; $messages['nosearchname'] = 'Bitte geben Sie einen Namen oder eine E-Mail-Adresse ein.'; $messages['notuploadedwarning'] = 'Es wurden noch nicht alle Dateien hochgeladen. Bitte warten oder Upload abbrechen.'; @@ -140,6 +146,7 @@ $messages['smtperror'] = 'SMTP Fehler: $msg'; $messages['emailformaterror'] = 'Ungültige E-Mail-Adresse: $email'; $messages['toomanyrecipients'] = 'Zuviele Empfänger. Reduzieren Sie die Anzahl Empfängeradressen auf $max.'; $messages['maxgroupmembersreached'] = 'Die Anzahl Adressen in dieser Gruppe überschreitet das Maximum von $max.'; +$messages['internalerror'] = 'Ein interner Fehler ist aufgetreten. Bitte versuchen es erneut.'; $messages['contactdelerror'] = 'Fehler beim Löschen.'; $messages['contactdeleted'] = 'Kontakt(e) erfolgreich gelöscht.'; $messages['contactrestoreerror'] = 'Konnte die gelöschten Kontakte nicht wiederherstellen.'; diff --git a/program/localization/el_GR/labels.inc b/program/localization/el_GR/labels.inc index 2e3ab405c..b22b3f3d5 100644 --- a/program/localization/el_GR/labels.inc +++ b/program/localization/el_GR/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to από $count'; $labels['copy'] = 'ΑντιγÏαφή'; $labels['move'] = 'Μετακίνηση'; $labels['moveto'] = 'Μετακίνηση σε...'; +$labels['copyto'] = 'ΑντιγÏαφή σε...'; $labels['download'] = 'Λήψη'; $labels['open'] = 'Ανοιγμα'; $labels['showattachment'] = 'Εμφάνιση'; @@ -197,6 +198,16 @@ $labels['spellcheck'] = 'Συλλαβισμός'; $labels['checkspelling'] = 'Έλεγχος οÏθογÏαφίας'; $labels['resumeediting'] = 'ΣυνÎχεια επεξεÏγασίας'; $labels['revertto'] = 'ΕπαναφοÏά στο'; +$labels['restore'] = 'ΕπαναφοÏά'; +$labels['restoremessage'] = 'ΕπαναφοÏά μηνÏματος;'; +$labels['responses'] = 'Απαντήσεις'; +$labels['insertresponse'] = 'Εισάγετε μια απάντηση'; +$labels['manageresponses'] = 'ΔιαχείÏιση απαντήσεων'; +$labels['savenewresponse'] = 'Αποθήκευση νÎας απάντησης'; +$labels['editresponses'] = 'Μεταβολή απαντήσεων'; +$labels['editresponse'] = 'Μεταβολή απάντησης'; +$labels['responsename'] = 'Όνομα'; +$labels['responsetext'] = 'Κείμενο απάντησης'; $labels['attach'] = 'ΕπισÏναψη'; $labels['attachments'] = 'ΣυνημμÎνα'; $labels['upload'] = 'ΦόÏτωση'; @@ -316,7 +327,11 @@ $labels['searchdelete'] = 'ΔιαγÏαφή αποθηκευμÎνης αναζΠ$labels['import'] = 'Εισαγωγή'; $labels['importcontacts'] = 'Εισαγωγή επαφών'; $labels['importfromfile'] = 'Εισαγωγή από το αÏχείο:'; +$labels['importtarget'] = 'Î Ïοσθήκη επαφών σε'; $labels['importreplace'] = 'Αντικατάσταση όλου του βιβλίου διευθÏνσεων'; +$labels['importgroups'] = 'Εισαγωγή αναθÎσεων ομάδων'; +$labels['importgroupsall'] = 'Όλα (δημιουÏγία ομάδων αν είναι απαÏαίτητο)'; +$labels['importgroupsexisting'] = 'Μόνο για υπάÏχουσες ομάδες'; $labels['importdesc'] = 'ΜποÏείτε να ανεβάσετε επαφÎÏ‚ από Îνα υπάÏχον βιβλίο διευθÏνσεων.<br/>ΥποστηÏίζεται η εισαγωγή διευθÏνσεων από αÏχεία Ï„Ïπου <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> ή CSV (διαχωÏισμÎνα με κόμμα).'; $labels['done'] = 'ΟλοκληÏώθηκε'; $labels['settingsfor'] = 'Ρυθμίσεις για'; @@ -424,6 +439,9 @@ $labels['standardwindows'] = 'ΧειÏιστείτε τα αναδυόμενα Ï $labels['forwardmode'] = 'Î Ïοώθηση μηνυμάτων'; $labels['inline'] = 'με εσνωμάτωση'; $labels['asattachment'] = 'σαν επισÏναψη'; +$labels['replyallmode'] = 'Î ÏοεπιλεγμÎνη ενÎÏγεια του ÎºÎ¿Ï…Î¼Ï€Î¹Î¿Ï [Απάντηση σε όλους]'; +$labels['replyalldefault'] = 'απάντηση σε όλους'; +$labels['replyalllist'] = 'Απάντηση μόνο σε λίστα e-mail (αν υπάÏχει)'; $labels['folder'] = 'Φάκελος'; $labels['folders'] = 'Φάκελοι'; $labels['foldername'] = 'Όνομα φακÎλου'; diff --git a/program/localization/el_GR/messages.inc b/program/localization/el_GR/messages.inc index 9947c715e..2c38f5fff 100644 --- a/program/localization/el_GR/messages.inc +++ b/program/localization/el_GR/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -16,23 +16,24 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/messages/ */ $messages['errortitle'] = 'Έχει Ï€ÏοκÏψει κάποιο σφάλμα!'; -$messages['loginfailed'] = 'Είσοδος απÎτυχε.'; -$messages['cookiesdisabled'] = 'Ο πεÏιηγητής σας (browser) δεν αποδÎχεται cookies'; +$messages['loginfailed'] = 'Η είσοδος απÎτυχε.'; +$messages['cookiesdisabled'] = 'Ο πεÏιηγητής σας (browser) δεν αποδÎχεται cookies.'; $messages['sessionerror'] = 'Η συνεδÏία σας είναι άκυÏη ή Îχει λήξει'; -$messages['storageerror'] = 'Η σÏνδεση με το διακομιστή IMAP απÎτυχε'; +$messages['storageerror'] = 'Η σÏνδεση με το διακομιστή αποθήκευσης απÎτυχε.'; $messages['servererror'] = 'Σφάλμα του εξυπηÏετητή!'; $messages['servererrormsg'] = 'Σφάλμα εξυπηÏετητή: $msg'; $messages['dberror'] = 'Σφάλμα βάσης δεδομÎνων!'; $messages['requesttimedout'] = 'Το αίτημα εξÎπνευσε χÏονικά'; $messages['errorreadonly'] = 'Η διαδικασία δεν μποÏεί να ολοκληÏωθεί. Ο φάκελος είναι μόνο για ανάγνωση.'; -$messages['errornoperm'] = 'Η διαδικασία δεν μποÏεί να ολοκληÏωθεί. ΆÏνηση άδειας'; -$messages['erroroverquota'] = 'Δεν είναι δυνατή η εκτÎλεση της λειτουÏγίας. Δεν υπάÏχει ελεÏθεÏος χώÏος στο δίσκο. '; -$messages['erroroverquotadelete'] = 'Δεν υπάÏχει ελεÏθεÏος χώÏος στο δίσκο. ΧÏησιμοποιήστε το συνδυασμό πλήκτÏων SHIFT DEL για να διαγÏάψετε Îνα μήνυμα.'; +$messages['errornoperm'] = 'Η διαδικασία δεν μποÏεί να ολοκληÏωθεί. ΆÏνηση Ï€Ïόσβασης.'; +$messages['erroroverquota'] = 'Δεν είναι δυνατή η εκτÎλεση της λειτουÏγίας. Δεν υπάÏχει ελεÏθεÏος χώÏος στο δίσκο.'; +$messages['erroroverquotadelete'] = 'Δεν υπάÏχει ελεÏθεÏος χώÏος στο δίσκο. ΧÏησιμοποιήστε το συνδυασμό πλήκτÏων SHIFT+DEL για να διαγÏάψετε μηνÏματα.'; $messages['invalidrequest'] = 'ΛανθασμÎνο αίτημα! Δεν αποθηκεÏτηκαν δεδομÎνα.'; $messages['invalidhost'] = 'ΆκυÏο όνομα εξυπηÏετητή.'; -$messages['nomessagesfound'] = 'Δε βÏÎθηκαν μηνÏματα σε αυτή τη θυÏίδα'; +$messages['nomessagesfound'] = 'Δεν βÏÎθηκαν μηνÏματα σε αυτή τη θυÏίδα.'; $messages['loggedout'] = 'Έχετε τεÏματίσει επιτυχώς τη συνεδÏία. Αντίο!'; $messages['mailboxempty'] = 'Η θυÏίδα είναι άδεια'; +$messages['nomessages'] = 'Δεν υπάÏχουν μηνÏματα'; $messages['refreshing'] = 'ΑνανÎωση....'; $messages['loading'] = 'ΦόÏτωση...'; $messages['uploading'] = 'Το αÏχείο φοÏτώνεται...'; @@ -40,136 +41,137 @@ $messages['uploadingmany'] = 'ΦόÏτωση αÏχείων...'; $messages['loadingdata'] = 'ΦόÏτωση δεδομÎνων...'; $messages['checkingmail'] = 'Έλεγχος για νÎα μηνÏματα...'; $messages['sendingmessage'] = 'Αποστολή μηνÏματος...'; -$messages['messagesent'] = 'Μήνυμα εστάλη επιτυχώς'; +$messages['messagesent'] = 'Μήνυμα εστάλη επιτυχώς.'; $messages['savingmessage'] = 'Αποθήκευση μηνÏματος...'; -$messages['messagesaved'] = 'Μήνυμα αποθηκεÏτηκε στα Î ÏόχειÏα'; -$messages['successfullysaved'] = 'ΑποθηκεÏτηκε επιτυχώς'; -$messages['savingresponse'] = 'ΑποθηκεÏετε το κείμενο απάντησης...'; -$messages['deleteresponseconfirm'] = 'ΣίγουÏα θÎλετε να διαγÏάψετε αυτό το κείμενο απάντησης;'; -$messages['addedsuccessfully'] = 'Η επαφή Ï€ÏοστÎθηκε επιτυχώς στις ΕπαφÎÏ‚'; -$messages['contactexists'] = 'ΥπάÏχει ήδη επαφή με αυτή τη διεÏθυνση e-mail'; -$messages['contactnameexists'] = 'Μια επαφή με το ίδιο όνομα υπάÏχει ήδη.'; +$messages['messagesaved'] = 'Το μήνυμα αποθηκεÏτηκε στα Î ÏόχειÏα.'; +$messages['successfullysaved'] = 'ΑποθηκεÏτηκε επιτυχώς.'; +$messages['savingresponse'] = 'Αποθήκευση του κειμÎνου απάντησης...'; +$messages['deleteresponseconfirm'] = 'Είστε βÎβαιοι ότι θÎλετε να διαγÏάψετε αυτό το κείμενο απάντησης;'; +$messages['addedsuccessfully'] = 'Η επαφή Ï€ÏοστÎθηκε επιτυχώς στο βιβλίο επαφών.'; +$messages['contactexists'] = 'ΥπάÏχει ήδη επαφή με αυτή τη διεÏθυνση e-mail.'; +$messages['contactnameexists'] = 'ΥπάÏχει ήδη μια επαφή με το ίδιο όνομα.'; $messages['blockedimages'] = 'Για να Ï€Ïοστατευτεί το απόÏÏητο σας, οι απομακÏυσμÎνες εικόνες Îχουν απενεÏγοποιηθεί σε αυτό το μήνυμα.'; -$messages['encryptedmessage'] = 'Αυτό το μήνυμα είναι κÏυπτογÏαφημÎνο και δε μποÏεί να Ï€Ïοβληθεί. Συγνώμη!'; -$messages['nocontactsfound'] = 'Δε βÏÎθηκαν επαφÎÏ‚'; -$messages['contactnotfound'] = 'Η ζητοÏμενη επαφή δεν βÏÎθηκε'; -$messages['contactsearchonly'] = 'Εισάγετε κάποιους ÏŒÏους Ï€Ïος αναζήτηση'; -$messages['sendingfailed'] = 'Αποστολή μηνÏματος απÎτυχε'; -$messages['senttooquickly'] = 'ΠαÏακαλώ πεÏιμÎνετε $sec δευτεÏόλεπτα, Ï€Ïιν στείλετε το μήνυμα'; -$messages['errorsavingsent'] = 'Î ÏοÎκυψε σφάλμα κατά την αποθήκευση σταλμÎνου μηνÏματος.'; +$messages['encryptedmessage'] = 'Αυτό το μήνυμα είναι κÏυπτογÏαφημÎνο και δε μποÏεί να Ï€Ïοβληθεί. Συγγνώμη!'; +$messages['nocontactsfound'] = 'Δε βÏÎθηκαν επαφÎÏ‚.'; +$messages['contactnotfound'] = 'Η ζητοÏμενη επαφή δεν βÏÎθηκε.'; +$messages['contactsearchonly'] = 'Εισάγετε κάποιους ÏŒÏους Ï€Ïος αναζήτηση επαφών'; +$messages['sendingfailed'] = 'Η αποστολή του μηνÏματος απÎτυχε.'; +$messages['senttooquickly'] = 'ΠαÏακαλώ πεÏιμÎνετε $sec δευτεÏόλεπτα Ï€Ïιν στείλετε το μήνυμα.'; +$messages['errorsavingsent'] = 'Î ÏοÎκυψε σφάλμα κατά την αποθήκευση αποσταλμÎνου μηνÏματος.'; $messages['errorsaving'] = 'Î ÏοÎκυψε σφάλμα κατά την αποθήκευση.'; -$messages['errormoving'] = 'Το μήνυμα δε μποÏοÏσε να μετακινηθεί'; -$messages['errorcopying'] = 'Δεν είναι δυνατή η αντιγÏαφή του μηνÏματος/των'; -$messages['errordeleting'] = 'Το μήνυμα δε μποÏοÏσε να διαγÏαφεί'; -$messages['errormarking'] = 'Δεν Îγινε επισήμανση στο μÏνημα'; +$messages['errormoving'] = 'Τα μηνÏματα δεν ήταν δυνατό να μετακινηθοÏν.'; +$messages['errorcopying'] = 'Δεν ήταν δυνατή η αντιγÏαφή του μηνÏματος/των.'; +$messages['errordeleting'] = 'Το μήνυμα δεν ήταν δυνατό να διαγÏαφεί.'; +$messages['errormarking'] = 'Δεν Îγινε επισήμανση στο μήνυμα.'; $messages['deletecontactconfirm'] = 'ΘÎλετε να διαγÏάψετε τη συγκεκÏιμÎνη επαφή/ÎÏ‚;'; $messages['deletegroupconfirm'] = 'Είστε βÎβαιοι πως θÎλετε να διαγÏάψετε την επιλεγμÎνη ομάδα;'; $messages['deletemessagesconfirm'] = 'ΘÎλετε να διαγÏάψετε το συγκεκÏιμÎνο μήνυμα/τα;'; -$messages['deletefolderconfirm'] = 'ΘÎλετε να διαγÏάψετε το συγκεκÏιμÎνο φάκελο;'; -$messages['purgefolderconfirm'] = 'ΘÎλετε να διαγÏάψετε όλα τα μηνÏματα στο συγκεκÏιμÎνο φάκελο;'; +$messages['deletefolderconfirm'] = 'ΘÎλετε να διαγÏάψετε τον συγκεκÏιμÎνο φάκελο;'; +$messages['purgefolderconfirm'] = 'ΘÎλετε να διαγÏάψετε όλα τα μηνÏματα στον συγκεκÏιμÎνο φάκελο;'; $messages['contactdeleting'] = 'ΔιαγÏαφή επαφών...'; $messages['groupdeleting'] = 'ΔιαγÏαφή ομάδας...'; -$messages['folderdeleting'] = 'ΔιαγÏαφή φακÎλου'; -$messages['foldermoving'] = 'ΜεταφοÏά φακÎλου'; +$messages['folderdeleting'] = 'ΔιαγÏαφή φακÎλου...'; +$messages['foldermoving'] = 'ΜεταφοÏά φακÎλου...'; $messages['foldersubscribing'] = 'ΕγγÏαφή φακÎλου...'; $messages['folderunsubscribing'] = 'ΑπεγγÏαφή φακÎλου...'; -$messages['formincomplete'] = 'Η φόÏμα δεν Îχει συμπληÏωθεί πλήÏως'; -$messages['noemailwarning'] = 'ΠαÏακαλώ εισάγετε ÎγκυÏη διεÏθυνση email'; -$messages['nonamewarning'] = 'ΠαÏακαλώ εισάγετε όνομα'; -$messages['nopagesizewarning'] = 'ΠαÏακαλώ εισάγετε μÎγεθος σελίδας'; -$messages['nosenderwarning'] = 'ΠαÏακαλώ εισάγετε την email διεÏθυνση αποστολÎα'; -$messages['norecipientwarning'] = 'ΠαÏακαλώ εισάγεται τουλάχιστον Îναν παÏαλήπτη'; -$messages['nosubjectwarning'] = 'Το πεδίο "ΘÎμα" είναι άδειο. ΘÎλετε να εισάγεται Îνα Ï„ÏŽÏα;'; +$messages['formincomplete'] = 'Η φόÏμα δεν Îχει συμπληÏωθεί πλήÏως.'; +$messages['noemailwarning'] = 'ΠαÏακαλώ εισάγετε ÎγκυÏη διεÏθυνση email.'; +$messages['nonamewarning'] = 'ΠαÏακαλώ εισάγετε όνομα.'; +$messages['nopagesizewarning'] = 'ΠαÏακαλώ εισάγετε μÎγεθος σελίδας.'; +$messages['nosenderwarning'] = 'ΠαÏακαλώ εισάγετε την e-mail διεÏθυνση αποστολÎα.'; +$messages['norecipientwarning'] = 'ΠαÏακαλώ εισάγετε τουλάχιστο Îναν παÏαλήπτη.'; +$messages['nosubjectwarning'] = 'Το πεδίο "ΘÎμα" είναι άδειο. ΘÎλετε να εισάγετε Îνα Ï„ÏŽÏα;'; $messages['nobodywarning'] = 'Αποστολή μηνÏματος χωÏίς κείμενο;'; $messages['notsentwarning'] = 'Το μήνυμα δεν Îχει σταλεί. ΘÎλετε να το αποÏÏίψετε;'; -$messages['noldapserver'] = 'ΠαÏακαλώ επιλÎξτε Îναν LDAP διακομιστή για αναζήτηση'; -$messages['nosearchname'] = 'ΠαÏακαλώ εισάγεται όνομα επαφής ή διεÏθυνση email'; -$messages['notuploadedwarning'] = 'Δεν Îχουν φοÏτωθεί όλα τα συνημμÎνα. ΠαÏακαλώ πεÏιμÎνετε ή ακυÏώστε το ανÎβασμα.'; -$messages['searchsuccessful'] = '$nr μηνÏματα βÏÎθηκαν'; -$messages['contactsearchsuccessful'] = '$nr επαφÎÏ‚ βÏÎθηκαν.'; -$messages['searchnomatch'] = 'Η αναζήτηση δεν επÎστÏεψε αποτελÎσματα'; +$messages['restoresavedcomposedata'] = 'ΥπάÏχει Îνα Ï€ÏοηγοÏμενο Ï€ÏόχειÏο μήνυμα το οποίο δεν Îχει σταλεί.\n\nΘÎμα: $subject\ΑποθηκεÏτηκε: $date\n\nΘÎλετε να το ανακτήσετε;'; +$messages['noldapserver'] = 'ΠαÏακαλώ επιλÎξτε Îναν διακομιστή LDAP για αναζήτηση.'; +$messages['nosearchname'] = 'ΠαÏακαλώ εισάγετε όνομα επαφής ή διεÏθυνση e-mail.'; +$messages['notuploadedwarning'] = 'Δεν Îχουν φοÏτωθεί ακόμα όλα τα συνημμÎνα. ΠαÏακαλώ πεÏιμÎνετε ή ακυÏώστε το ανÎβασμα.'; +$messages['searchsuccessful'] = 'Î’ÏÎθηκαν $nr μηνÏματα.'; +$messages['contactsearchsuccessful'] = 'Î’ÏÎθηκαν $nr επαφÎÏ‚.'; +$messages['searchnomatch'] = 'Η αναζήτηση δεν επÎστÏεψε αποτελÎσματα.'; $messages['searching'] = 'Αναζήτηση...'; $messages['checking'] = 'Έλεγχος...'; -$messages['nospellerrors'] = 'Δε βÏÎθηκαν οÏθογÏαφικά λάθη'; -$messages['folderdeleted'] = 'Ο φάκελος διαγÏάφηκε επιτυχώς'; +$messages['nospellerrors'] = 'Δεν βÏÎθηκαν οÏθογÏαφικά λάθη.'; +$messages['folderdeleted'] = 'Ο φάκελος διαγÏάφηκε επιτυχώς.'; $messages['foldersubscribed'] = 'Ο φάκελος εχει εγγÏαφεί με επιτυχία.'; -$messages['folderunsubscribed'] = 'Ο φάκελος διαγÏάφηκε επιτυχώς'; +$messages['folderunsubscribed'] = 'Ο φάκελος απεγγÏάφηκε επιτυχώς.'; $messages['folderpurged'] = 'Ο φάκελος καθαÏίστηκε με επιτυχία.'; $messages['folderexpunged'] = 'Ο φάκελος συμπιÎστηκε με επιτυχία.'; -$messages['deletedsuccessfully'] = 'ΔιαγÏαφή Επιτυχώς'; -$messages['converting'] = 'Μετακίνηση διαμοÏφώσεων κειμÎνου...'; -$messages['messageopenerror'] = 'Η φόÏτωση μηνυμάτων από τον διακομιστή απÎτυχε'; -$messages['fileuploaderror'] = 'ΑνÎβασμα αÏχείου απÎτυχε'; -$messages['filesizeerror'] = 'Το ανεβασμÎνο αÏχείο ξεπεÏνάει το μÎγιστο μÎγεθος των $size'; -$messages['copysuccess'] = 'Επιτυχής αντιγÏαφή $ επαφών αÏιθ..'; -$messages['movesuccess'] = 'Με επιτυχία μεταφÎÏθηκαν $ αÏιθ. επαφÎÏ‚.'; +$messages['deletedsuccessfully'] = 'ΔιαγÏαφή επιτυχώς.'; +$messages['converting'] = 'ΚατάÏγηση διαμοÏφώσεων κειμÎνου...'; +$messages['messageopenerror'] = 'Η φόÏτωση μηνυμάτων από τον διακομιστή απÎτυχε.'; +$messages['fileuploaderror'] = 'Το ανÎβασμα του αÏχείου απÎτυχε.'; +$messages['filesizeerror'] = 'Το ανεβασμÎνο αÏχείο ξεπεÏνάει το μÎγιστο μÎγεθος των $size.'; +$messages['copysuccess'] = 'Επιτυχής αντιγÏαφή $nr επαφών.'; +$messages['movesuccess'] = 'ΜεταφÎÏθηκαν με επιτυχία $nr επαφÎÏ‚.'; $messages['copyerror'] = 'Αποτυχία αντιγÏαφής επαφών.'; -$messages['moveerror'] = 'Δεν μποÏοÏσε να κινηθεί καμία επαφή.'; -$messages['sourceisreadonly'] = 'Η διεÏθυνση Îχει μόνο δικαίωμα ανάγνωσης'; -$messages['errorsavingcontact'] = 'Αποθήκευση επαφής απÎτυχε'; -$messages['movingmessage'] = 'Μετακίνηση μηνÏματος...'; +$messages['moveerror'] = 'Η μετακίνηση επαφών ήταν αδÏνατη.'; +$messages['sourceisreadonly'] = 'Το πεδίο διεÏθυνσης είναι μόνο για ανάγνωση.'; +$messages['errorsavingcontact'] = 'Η αποθήκευση της διεÏθυνσης επαφής απÎτυχε.'; +$messages['movingmessage'] = 'Μετακίνηση μηνÏματος/των...'; $messages['copyingmessage'] = 'ΑντιγÏαφή μηνυμάτων...'; $messages['copyingcontact'] = 'ΑντιγÏαφή επαφών...'; -$messages['movingcontact'] = 'Μετακίνηση επαφής(ων)...'; +$messages['movingcontact'] = 'Μετακίνηση επαφής(ών)...'; $messages['deletingmessage'] = 'ΔιαγÏαφή μηνυμάτων...'; $messages['markingmessage'] = 'Σήμανση μηνυμάτων...'; $messages['addingmember'] = 'Î Ïοσθήκη επαφών στην ομάδα...'; $messages['removingmember'] = 'ΑφαίÏεση επαφών από την ομάδα...'; -$messages['receiptsent'] = 'Επιτυχής αποστολή αναφοÏάς ανάγνωσης'; -$messages['errorsendingreceipt'] = 'Αποστολή αναφοÏάς απÎτυχε'; -$messages['deleteidentityconfirm'] = 'Είστε βÎβαιοι πως θÎλετε να διαγÏάψετε την ταυτότητα;'; +$messages['receiptsent'] = 'Επιτυχής αποστολή αναφοÏάς ανάγνωσης.'; +$messages['errorsendingreceipt'] = 'Αποστολή αναφοÏάς απÎτυχε.'; +$messages['deleteidentityconfirm'] = 'Είστε βÎβαιοι πως θÎλετε να διαγÏάψετε αυτή την ταυτότητα;'; $messages['nodeletelastidentity'] = 'Δε μποÏείτε να διαγÏάψετε αυτήν την ταυτότητα, είναι η τελευταία.'; -$messages['forbiddencharacter'] = 'Η ονομασία φακÎλου πεÏιÎχει μη επιτÏεπτό χαÏακτήÏα'; -$messages['selectimportfile'] = 'ΕπιλÎξτε αÏχείο για ανÎβασμα'; -$messages['addresswriterror'] = 'Η επιλεγμÎνη ατζÎντα διευθÏνσεων δεν είνα εγγÏάψιμη'; +$messages['forbiddencharacter'] = 'Η ονομασία φακÎλου πεÏιÎχει μη επιτÏεπτό χαÏακτήÏα.'; +$messages['selectimportfile'] = 'ΕπιλÎξτε αÏχείο για ανÎβασμα.'; +$messages['addresswriterror'] = 'Το επιλεγμÎνο βιβλίο διευθÏνσεων δεν είναι εγγÏάψιμο.'; $messages['contactaddedtogroup'] = 'Οι επαφÎÏ‚ Ï€ÏοστÎθηκαν στην ομάδα με επιτυχία.'; $messages['contactremovedfromgroup'] = 'Οι επαφÎÏ‚ αφαιÏÎθηκαν από την ομάδα με επιτυχία.'; -$messages['nogroupassignmentschanged'] = 'Οι αναθεσεις της ομαδας δεν αλλαξαν.'; +$messages['nogroupassignmentschanged'] = 'Δεν αλλαξαν οι αναθεσεις της ομαδας.'; $messages['importwait'] = 'Εισαγωγή, παÏακαλώ πεÏιμÎνετε...'; -$messages['importformaterror'] = 'Η εισαγωγή απÎτυχε! Το αÏχείο δεν είναι ÎγκυÏο εισαγωγής δεδομÎνων.'; +$messages['importformaterror'] = 'Η εισαγωγή απÎτυχε! Το ανεβασμÎνο αÏχείο δεν είναι ÎγκυÏο αÏχείο εισαγωγής δεδομÎνων.'; $messages['importconfirm'] = '<b>Εισήχθησαν $inserted επαφÎÏ‚ με επιτυχία</b>'; -$messages['importconfirmskipped'] = '<b>ΠαÏαλήφθηκαν $skipped υπάÏχοντα αντικείμενα</b>'; +$messages['importconfirmskipped'] = '<b>ΠαÏαλείφθηκαν $skipped υπάÏχουσες καταχωÏήσεις</b>'; $messages['importmessagesuccess'] = 'Επιτυχής εισαγωγή $nr μηνυμάτων'; -$messages['importmessageerror'] = 'Η εισαγωγή απÎτυχε! Το αÏχείο δεν είναι ÎγκυÏο εισαγωγής δεδομÎνων.'; +$messages['importmessageerror'] = 'Η εισαγωγή απÎτυχε! Το ανεβασμÎνο αÏχείο δεν είναι ÎγκυÏο αÏχείο μηνÏματος ή φακÎλου μηνυμάτων.'; $messages['opnotpermitted'] = 'Η λειτουÏγία δεν επιτÏÎπεται!'; -$messages['nofromaddress'] = 'Στην επιλεγμÎνη ταυτότητα, λείπει η email διεÏθυνση'; +$messages['nofromaddress'] = 'Άδεια διεÏθυνση e-mail στην επιλεγμÎνη ταυτότητα.'; $messages['editorwarning'] = 'Η μετάβαση στην επεξεÏγασία Î±Ï€Î»Î¿Ï ÎºÎµÎ¹Î¼Îνου θα Ï€ÏοκαλÎσει κατάÏγηση της μοÏφοποίησης. Είστε βÎβαιοι πως θÎλετε να συνεχίσετε;'; -$messages['httpreceivedencrypterror'] = 'ΟÏπς! Ανεπανόθωτο σφάλμα. Επικοινωνήστε με το διαχειÏιστή του εξυπηÏετητή. <b>Το μηνυμά σας δεν στάλθηκε.</b>'; -$messages['smtpconnerror'] = 'Σφάλμα SMTP ($code): ΑπÎτυχε η σÏνδεση με τον εξυπηÏετητή'; -$messages['smtpautherror'] = 'Σφάλμα SMTP ($code): Σφάλμα ταυτοποίησης'; -$messages['smtpfromerror'] = 'Σφάλμα SMTP ($code): Αποτυχία οÏÎ¹ÏƒÎ¼Î¿Ï Î±Ï€Î¿ÏƒÏ„Î¿Î»Îα "$from" ($msg)'; -$messages['smtptoerror'] = 'Σφάλμα SMTP ($code): Αποτυχία Ï€Ïοσθήκης παÏαλήπτη "$to" ($msg)'; -$messages['smtprecipientserror'] = 'Σφάλμα SMTP: ΑδÏνατο να Ï€Ïοσπελαστεί η λίστα παÏαληπτών'; +$messages['httpreceivedencrypterror'] = 'ΑνεπανόÏθωτο σφάλμα. Επικοινωνήστε με το διαχειÏιστή του εξυπηÏετητή. <b>Το μήνυμά σας δεν στάλθηκε.</b>'; +$messages['smtpconnerror'] = 'Σφάλμα SMTP ($code): ΑπÎτυχε η σÏνδεση με τον εξυπηÏετητή.'; +$messages['smtpautherror'] = 'Σφάλμα SMTP ($code): Σφάλμα ταυτοποίησης.'; +$messages['smtpfromerror'] = 'Σφάλμα SMTP ($code): Αποτυχία οÏÎ¹ÏƒÎ¼Î¿Ï Î±Ï€Î¿ÏƒÏ„Î¿Î»Îα "$from" ($msg).'; +$messages['smtptoerror'] = 'Σφάλμα SMTP ($code): Αποτυχία Ï€Ïοσθήκης παÏαλήπτη "$to" ($msg).'; +$messages['smtprecipientserror'] = 'Σφάλμα SMTP: ΑδÏνατο να Ï€Ïοσπελαστεί η λίστα παÏαληπτών.'; $messages['smtperror'] = 'Σφάλμα SMTP: $msg'; -$messages['emailformaterror'] = 'ΛανθασμÎνη διεÏθνση email: $email'; -$messages['toomanyrecipients'] = 'Μεγάλο πλήθος αποδεκτών. Μειώστε τον αÏιθμό των αποδεκτών σε $max.'; +$messages['emailformaterror'] = 'ΛανθασμÎνη διεÏθνση e-mail: $email'; +$messages['toomanyrecipients'] = 'ΥπεÏβολικά μεγάλο πλήθος αποδεκτών. Μειώστε τον αÏιθμό των αποδεκτών σε $max.'; $messages['maxgroupmembersreached'] = 'Ο αÏιθμός των μελών της ομάδας υπεÏβαίνει τον μÎγιστο των $max μελών.'; $messages['internalerror'] = 'Î ÏοÎκυψε εσωτεÏικό σφάλμα. ΠαÏακαλώ δοκιμάστε ξανά.'; -$messages['contactdelerror'] = 'Δεν είναι δυνατή η διαγÏαφή της επαφής/ων'; +$messages['contactdelerror'] = 'Δεν είναι δυνατή η διαγÏαφή της επαφής/ων.'; $messages['contactdeleted'] = 'Η επαφή/ÎÏ‚ διαγÏάφηκαν με επιτυχία.'; -$messages['contactrestoreerror'] = 'Οι διαγÏαφημενη επαφη(ες) δεν μποÏουν να επαναφεÏθουν.'; -$messages['contactrestored'] = 'Η επαφη(ες) επαναφεÏθηκαν.'; +$messages['contactrestoreerror'] = 'Η διαγÏαμμÎνη επαφή(ÎÏ‚) δεν είναι δυνατό να επαναφεÏθεί.'; +$messages['contactrestored'] = 'Η επαφή(ÎÏ‚) επαναφÎÏθηκε.'; $messages['groupdeleted'] = 'Η ομαδα διαγÏάφηκε επιτυχώς.'; -$messages['grouprenamed'] = 'Η ομαδα μετονομαστηκε επιτυχως.'; -$messages['groupcreated'] = 'Η ομαδα δημιουÏγηθηκε επιτυχως.'; -$messages['savedsearchdeleted'] = 'Η αποθηκευμÎνη αναζήτηση διαγÏάφηκε επιτυχως. '; +$messages['grouprenamed'] = 'Η ομάδα μετονομάστηκε επιτυχώς.'; +$messages['groupcreated'] = 'Η ομάδα δημιουÏγήθηκε επιτυχώς.'; +$messages['savedsearchdeleted'] = 'Η αποθηκευμÎνη αναζήτηση διαγÏάφηκε επιτυχώς. '; $messages['savedsearchdeleteerror'] = 'Δεν ήταν δυνατή η διαγÏαφή της αποθηκευμÎνης αναζήτησης.'; -$messages['savedsearchcreated'] = 'Η αποθηκευμÎνη αναζητήση δημιουÏγήθηκε με επιτυχία. '; -$messages['savedsearchcreateerror'] = 'Η αποθηκευμενη αναζητηση δεν μποÏεσε να δημιουÏγηθει.'; -$messages['messagedeleted'] = 'Το μυνημα(τα) διαγÏαφηκαν επιτυχως.'; -$messages['messagemoved'] = 'Το μυνημα(τα) μετακινηθηκαν επιτυχως.'; -$messages['messagecopied'] = 'Το μυνημα(τα) αντιγÏαφθηκαν επιτυχως.'; -$messages['messagemarked'] = 'Το μυνημα(τα) μαÏκαÏισθηκαν επιτυχως.'; +$messages['savedsearchcreated'] = 'Η αποθηκευμÎνη αναζητήση δημιουÏγήθηκε με επιτυχία.'; +$messages['savedsearchcreateerror'] = 'Δεν ήταν δυνατό να δημιουÏγηθεί η αποθηκευμÎνη αναζήτηση.'; +$messages['messagedeleted'] = 'Το μήνυμα(τα) διαγÏάφηκε επιτυχώς.'; +$messages['messagemoved'] = 'Το μήνυμα(τα) μετακινήθηκε επιτυχώς.'; +$messages['messagecopied'] = 'Το μήνυμα(τα) αντιγÏάφηκε επιτυχώς.'; +$messages['messagemarked'] = 'Το μήνημα(τα) σημάνθηκε επιτυχώς.'; $messages['autocompletechars'] = 'Εισάγετε τουλάχιστον $min χαÏακτήÏες για αυτόματη συμπλήÏωση.'; -$messages['autocompletemore'] = 'ΠεÏισσότεÏες ταιÏιάστες καταχωÏήσεις βÏÎθηκαν. ΠληκτÏολογείστε πεÏισσότεÏους χαÏακτήÏες.'; -$messages['namecannotbeempty'] = 'Το ονομα δεν μποÏεί να είναι κενό.'; +$messages['autocompletemore'] = 'Î’ÏÎθηκαν πεÏισσότεÏες καταχωÏήσεις που ταιÏιάζουν. ΠαÏακαλώ πληκτÏολογήστε πεÏισσότεÏους χαÏακτήÏες.'; +$messages['namecannotbeempty'] = 'Το όνομα δεν μποÏεί να είναι κενό.'; $messages['nametoolong'] = 'Το όνομα είναι Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿.'; -$messages['folderupdated'] = 'Ο φάκελος ανανεωθηκε επιτυχώς.'; -$messages['foldercreated'] = 'Ο φάκελος δημιουÏγηθηκε επιτυχώς.'; -$messages['invalidimageformat'] = 'Μη ÎγκυÏη μοÏφή εικόνας. '; -$messages['mispellingsfound'] = 'ΟÏθογÏαφικά λάθη εντοπίστηκαν στο μήνυμα. '; -$messages['parentnotwritable'] = 'Δεν είναι δυνατή η δημιουÏγία/μετακινήση φάκελου σε επιλεγμÎνο φάκελο γονÎα. ΚανÎνα δικαίωμα Ï€Ïόσβασης. '; -$messages['messagetoobig'] = 'Το τμήμα μήνυματος είναι Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿ για επεξεÏγασια. '; -$messages['attachmentvalidationerror'] = 'ΠΡΟΕΙΔΟΠΟΊΗΣΗ! Αυτή η κατάσχεση είναι Ïποπτη, επειδή ο Ï„Ïπος δεν ταιÏιάζει με τον Ï„Ïπο που δηλώνεται στο μήνυμα. Εάν δεν εμπιστεÏεστε τον αποστολÎα, δεν θα Ï€ÏÎπει να το ανοίγετε στο Ï€ÏόγÏαμμα πεÏιήγησης επειδή μποÏεί να πεÏιÎχει κακόβουλο πεÏιεχόμενο.<br/><br/><em>Expected: $expected; found: $detected</em> '; -$messages['noscriptwarning'] = 'Î Ïοειδοποίηση : Αυτή η υπηÏεσία webmail απαιτεί Javascript! Για να ΤΟ χÏησιμοποιήσετε ενεÏγοποιήστε τΟ JavaScript στις Ïυθμίσεις του browser σας. '; +$messages['folderupdated'] = 'Ο φάκελος ανανεώθηκε επιτυχώς.'; +$messages['foldercreated'] = 'Ο φάκελος δημιουÏγήθηκε επιτυχώς.'; +$messages['invalidimageformat'] = 'Μη ÎγκυÏη μοÏφή εικόνας.'; +$messages['mispellingsfound'] = 'Εντοπίστηκαν οÏθογÏαφικά λάθη στο μήνυμα. '; +$messages['parentnotwritable'] = 'Δεν είναι δυνατή η δημιουÏγία/μετακινήση φάκελου στον επιλεγμÎνο φάκελο γονÎα. Δεν υπάÏχει δικαίωμα Ï€Ïόσβασης. '; +$messages['messagetoobig'] = 'Το τμήμα μηνÏματος είναι Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿ για επεξεÏγασία.'; +$messages['attachmentvalidationerror'] = 'ΠΡΟΕΙΔΟΠΟΊΗΣΗ! Αυτό το συνημμÎνο είναι Ïποπτο, επειδή ο Ï„Ïπος του δεν ταιÏιάζει με τον Ï„Ïπο που δηλώνεται στο μήνυμα. Εάν δεν εμπιστεÏεστε τον αποστολÎα, δεν θα Ï€ÏÎπει να το ανοίξετε στο Ï€ÏόγÏαμμα πεÏιήγησης επειδή μποÏεί να πεÏιÎχει κακόβουλο πεÏιεχόμενο.<br/><br/><em>Αναμενόμενο: $expected, εντοπίστηκε: $detected</em> '; +$messages['noscriptwarning'] = 'Î Ïοσοχή: Αυτή η υπηÏεσία webmail απαιτεί Javascript! Για να την χÏησιμοποιήσετε ενεÏγοποιήστε το JavaScript στις Ïυθμίσεις του πεÏιηγητή σας. '; ?> diff --git a/program/localization/en_CA/messages.inc b/program/localization/en_CA/messages.inc index 169c1c9b1..171e9afb3 100644 --- a/program/localization/en_CA/messages.inc +++ b/program/localization/en_CA/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,6 @@ $messages['invalidrequest'] = 'Invalid request! No data was saved.'; $messages['invalidhost'] = 'Invalid server name.'; $messages['nomessagesfound'] = 'No messages found in this mailbox.'; $messages['loggedout'] = 'You have successfully terminated the session. Good bye!'; -$messages['mailboxempty'] = 'Mailbox is empty.'; $messages['refreshing'] = 'Refreshing...'; $messages['loading'] = 'Loading...'; $messages['uploading'] = 'Uploading file...'; diff --git a/program/localization/en_GB/labels.inc b/program/localization/en_GB/labels.inc index c7778e955..628b41bde 100644 --- a/program/localization/en_GB/labels.inc +++ b/program/localization/en_GB/labels.inc @@ -29,8 +29,10 @@ $labels['drafts'] = 'Drafts'; $labels['sent'] = 'Sent'; $labels['trash'] = 'Deleted Items'; $labels['junk'] = 'Junk'; +$labels['show_real_foldernames'] = 'Show real names for special folders'; $labels['subject'] = 'Subject'; $labels['from'] = 'From'; +$labels['sender'] = 'Sender'; $labels['to'] = 'To'; $labels['cc'] = 'Copy'; $labels['bcc'] = 'Bcc'; @@ -50,7 +52,9 @@ $labels['fromtoshort'] = '$from – $to of $count'; $labels['copy'] = 'Copy'; $labels['move'] = 'Move'; $labels['moveto'] = 'Move to...'; +$labels['copyto'] = 'Copy to...'; $labels['download'] = 'Download'; +$labels['open'] = 'Open'; $labels['showattachment'] = 'Show'; $labels['showanyway'] = 'Show it anyway'; $labels['filename'] = 'File name'; @@ -134,6 +138,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'Unread'; $labels['flagged'] = 'Flagged'; $labels['unanswered'] = 'Unanswered'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -162,6 +167,7 @@ $labels['listmode'] = 'List view mode'; $labels['folderactions'] = 'Folder actions...'; $labels['compact'] = 'Compact'; $labels['empty'] = 'Empty'; +$labels['importmessages'] = 'Import messages'; $labels['quota'] = 'Disk usage'; $labels['unknown'] = 'unknown'; $labels['unlimited'] = 'unlimited'; @@ -169,8 +175,13 @@ $labels['quicksearch'] = 'Quick search'; $labels['resetsearch'] = 'Reset search'; $labels['searchmod'] = 'Search modifiers'; $labels['msgtext'] = 'Entire message'; +$labels['body'] = 'Body'; +$labels['type'] = 'Type'; +$labels['namex'] = 'Name'; $labels['openinextwin'] = 'Open in new window'; $labels['emlsave'] = 'Download (.eml)'; +$labels['changeformattext'] = 'Display in plain text format'; +$labels['changeformathtml'] = 'Display in HTML format'; $labels['editasnew'] = 'Edit as new'; $labels['send'] = 'Send'; $labels['sendmessage'] = 'Send now'; @@ -187,6 +198,16 @@ $labels['spellcheck'] = 'Spell'; $labels['checkspelling'] = 'Check spelling'; $labels['resumeediting'] = 'Resume editing'; $labels['revertto'] = 'Revert to'; +$labels['restore'] = 'Restore'; +$labels['restoremessage'] = 'Restore message?'; +$labels['responses'] = 'Responses'; +$labels['insertresponse'] = 'Insert a response'; +$labels['manageresponses'] = 'Manage responses'; +$labels['savenewresponse'] = 'Save new response'; +$labels['editresponses'] = 'Edit responses'; +$labels['editresponse'] = 'Edit response'; +$labels['responsename'] = 'Name'; +$labels['responsetext'] = 'Response Text'; $labels['attach'] = 'Attach'; $labels['attachments'] = 'Attachments'; $labels['upload'] = 'Upload'; @@ -286,6 +307,8 @@ $labels['composeto'] = 'Compose mail to'; $labels['contactsfromto'] = 'Contacts $from to $to of $count'; $labels['print'] = 'Print'; $labels['export'] = 'Export'; +$labels['exportall'] = 'Export all'; +$labels['exportsel'] = 'Export selected'; $labels['exportvcards'] = 'Export contacts in vCard format'; $labels['newcontactgroup'] = 'Create new contact group'; $labels['grouprename'] = 'Rename group'; @@ -297,13 +320,18 @@ $labels['nextpage'] = 'Show next set'; $labels['lastpage'] = 'Show last set'; $labels['group'] = 'Group'; $labels['groups'] = 'Groups'; +$labels['listgroup'] = 'List group members'; $labels['personaladrbook'] = 'Personal Addresses'; $labels['searchsave'] = 'Save search'; $labels['searchdelete'] = 'Delete search'; $labels['import'] = 'Import'; $labels['importcontacts'] = 'Import contacts'; $labels['importfromfile'] = 'Import from file:'; +$labels['importtarget'] = 'Add contacts to'; $labels['importreplace'] = 'Replace the entire address book'; +$labels['importgroups'] = 'Import group assignments'; +$labels['importgroupsall'] = 'All (create groups if necessary)'; +$labels['importgroupsexisting'] = 'Only for existing groups'; $labels['importdesc'] = 'You can upload contacts from an existing address book.<br/>We currently support importing addresses from the <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> or CSV (comma-separated) data format.'; $labels['done'] = 'Done'; $labels['settingsfor'] = 'Settings for'; @@ -319,6 +347,8 @@ $labels['edititem'] = 'Edit item'; $labels['preferhtml'] = 'Display HTML'; $labels['defaultcharset'] = 'Default Character Set'; $labels['htmlmessage'] = 'HTML Message'; +$labels['messagepart'] = 'Part'; +$labels['digitalsig'] = 'Digital Signature'; $labels['dateformat'] = 'Date format'; $labels['timeformat'] = 'Time format'; $labels['prettydate'] = 'Pretty dates'; @@ -335,6 +365,7 @@ $labels['htmleditor'] = 'Compose HTML messages'; $labels['htmlonreply'] = 'on reply to HTML message only'; $labels['htmlonreplyandforward'] = 'on forward or reply to HTML message'; $labels['htmlsignature'] = 'HTML signature'; +$labels['showemail'] = 'Show email address with display name'; $labels['previewpane'] = 'Show preview pane'; $labels['skin'] = 'Interface skin'; $labels['logoutclear'] = 'Clear Trash on logout'; @@ -404,9 +435,13 @@ $labels['spellcheckignorenums'] = 'Ignore words with numbers'; $labels['spellcheckignorecaps'] = 'Ignore words with all letters capitalised'; $labels['addtodict'] = 'Add to dictionary'; $labels['mailtoprotohandler'] = 'Register protocol handler for mailto: links'; +$labels['standardwindows'] = 'Handle popups as standard windows'; $labels['forwardmode'] = 'Messages forwarding'; $labels['inline'] = 'inline'; $labels['asattachment'] = 'as attachment'; +$labels['replyallmode'] = 'Default action of [Reply all] button'; +$labels['replyalldefault'] = 'reply to all'; +$labels['replyalllist'] = 'reply to mailing list only (if found)'; $labels['folder'] = 'Folder'; $labels['folders'] = 'Folders'; $labels['foldername'] = 'Folder name'; diff --git a/program/localization/en_GB/messages.inc b/program/localization/en_GB/messages.inc index 5b6a8f7f2..8ee7aef5a 100644 --- a/program/localization/en_GB/messages.inc +++ b/program/localization/en_GB/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -26,11 +26,14 @@ $messages['dberror'] = 'Database Error!'; $messages['requesttimedout'] = 'Request timed out'; $messages['errorreadonly'] = 'Unable to perform operation. Folder is read-only.'; $messages['errornoperm'] = 'Unable to perform operation. Permission denied.'; +$messages['erroroverquota'] = 'Unable to perform operation. No free disk space.'; +$messages['erroroverquotadelete'] = 'No free disk space. Use SHIFT+DEL to delete a message.'; $messages['invalidrequest'] = 'Invalid request! No data was saved.'; $messages['invalidhost'] = 'Invalid server name.'; $messages['nomessagesfound'] = 'No messages found in this mailbox.'; $messages['loggedout'] = 'You have successfully terminated the session. Good bye!'; -$messages['mailboxempty'] = 'Mailbox is empty.'; +$messages['mailboxempty'] = 'Mailbox is empty'; +$messages['nomessages'] = 'No messages'; $messages['refreshing'] = 'Refreshing...'; $messages['loading'] = 'Loading...'; $messages['uploading'] = 'Uploading file...'; @@ -42,6 +45,8 @@ $messages['messagesent'] = 'Message sent successfully.'; $messages['savingmessage'] = 'Saving message...'; $messages['messagesaved'] = 'Message saved to Drafts.'; $messages['successfullysaved'] = 'Successfully saved.'; +$messages['savingresponse'] = 'Saving response text...'; +$messages['deleteresponseconfirm'] = 'Do you really want to delete this response text?'; $messages['addedsuccessfully'] = 'Contact successfully added to address book.'; $messages['contactexists'] = 'A contact with this e-mail address already exists.'; $messages['contactnameexists'] = 'A contact with the same name already exists.'; @@ -52,6 +57,8 @@ $messages['contactnotfound'] = 'The requested contact was not found.'; $messages['contactsearchonly'] = 'Enter some search terms to find contacts'; $messages['sendingfailed'] = 'Failed to send message.'; $messages['senttooquickly'] = 'Please wait $sec sec(s). before sending this message.'; +$messages['errorsavingsent'] = 'An error occurred while saving sent message.'; +$messages['errorsaving'] = 'An error occurred while saving.'; $messages['errormoving'] = 'Could not move the message(s).'; $messages['errorcopying'] = 'Could not copy the message(s).'; $messages['errordeleting'] = 'Could not delete the message(s).'; @@ -76,6 +83,7 @@ $messages['norecipientwarning'] = 'Please enter at least one recipient.'; $messages['nosubjectwarning'] = 'The "Subject" field is empty. Would you like to enter one now?'; $messages['nobodywarning'] = 'Send this message without any text?'; $messages['notsentwarning'] = 'Your message has not been sent. Do you want to discard it?'; +$messages['restoresavedcomposedata'] = 'A previously composed but unsent message was found.\n\nSubject: $subject\nSaved: $date\n\nDo you want to restore this message?'; $messages['noldapserver'] = 'Please select an LDAP server to search.'; $messages['nosearchname'] = 'Please enter a contact name or email address.'; $messages['notuploadedwarning'] = 'Not all attachments have been uploaded yet. Please wait or cancel the upload.'; @@ -95,11 +103,16 @@ $messages['converting'] = 'Removing formatting...'; $messages['messageopenerror'] = 'Could not load message from server.'; $messages['fileuploaderror'] = 'File upload failed.'; $messages['filesizeerror'] = 'The uploaded file exceeds the maximum size of $size.'; +$messages['copysuccess'] = 'Successfully copied $nr contacts.'; +$messages['movesuccess'] = 'Successfully moved $nr contacts.'; +$messages['copyerror'] = 'Could not copy any contacts.'; +$messages['moveerror'] = 'Could not move any contacts.'; $messages['sourceisreadonly'] = 'This address book is read-only.'; $messages['errorsavingcontact'] = 'Could not save the contact address.'; $messages['movingmessage'] = 'Moving message(s)...'; $messages['copyingmessage'] = 'Copying message(s)...'; $messages['copyingcontact'] = 'Copying contact(s)...'; +$messages['movingcontact'] = 'Moving contact(s)...'; $messages['deletingmessage'] = 'Deleting message(s)...'; $messages['markingmessage'] = 'Marking message(s)...'; $messages['addingmember'] = 'Adding contact(s) to the group...'; @@ -118,6 +131,8 @@ $messages['importwait'] = 'Importing, please wait...'; $messages['importformaterror'] = 'Import failed! The uploaded file is not a valid import data file.'; $messages['importconfirm'] = '<b>Successfully imported $inserted contacts</b>'; $messages['importconfirmskipped'] = '<b>Skipped $skipped existing entries</b>'; +$messages['importmessagesuccess'] = 'Successfully imported $nr messages'; +$messages['importmessageerror'] = 'Import failed! The uploaded file is not a valid message or mailbox file'; $messages['opnotpermitted'] = 'Operation not permitted!'; $messages['nofromaddress'] = 'Missing e-mail address in selected identity.'; $messages['editorwarning'] = 'Switching to the plain text editor will cause all text formatting to be lost. Do you wish to continue?'; @@ -131,6 +146,7 @@ $messages['smtperror'] = 'SMTP Error: $msg'; $messages['emailformaterror'] = 'Incorrect e-mail address: $email'; $messages['toomanyrecipients'] = 'Too many recipients. Reduce the number of recipients to $max.'; $messages['maxgroupmembersreached'] = 'The number of group members exceeds the maximum of $max.'; +$messages['internalerror'] = 'An internal error occurred. Please try again.'; $messages['contactdelerror'] = 'Could not delete contact(s).'; $messages['contactdeleted'] = 'Contact(s) deleted successfully.'; $messages['contactrestoreerror'] = 'Could not restore deleted contact(s).'; diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc index 4b1efb5eb..20992e50e 100644 --- a/program/localization/en_US/labels.inc +++ b/program/localization/en_US/labels.inc @@ -208,6 +208,10 @@ $labels['msgtext'] = 'Entire message'; $labels['body'] = 'Body'; $labels['type'] = 'Type'; $labels['namex'] = 'Name'; +$labels['searchscope'] = 'Scope'; +$labels['currentfolder'] = 'Current folder'; +$labels['subfolders'] = 'This and subfolders'; +$labels['allfolders'] = 'All folders'; $labels['openinextwin'] = 'Open in new window'; $labels['emlsave'] = 'Download (.eml)'; @@ -317,6 +321,7 @@ $labels['assistant'] = 'Assistant'; $labels['spouse'] = 'Spouse'; $labels['allfields'] = 'All fields'; $labels['search'] = 'Search'; +$labels['searchfor'] = 'Search for "$q"'; $labels['advsearch'] = 'Advanced Search'; $labels['advanced'] = 'Advanced'; $labels['other'] = 'Other'; diff --git a/program/localization/en_US/messages.inc b/program/localization/en_US/messages.inc index a36d9ab62..0d0a6916c 100644 --- a/program/localization/en_US/messages.inc +++ b/program/localization/en_US/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -24,6 +24,7 @@ $messages['sessionerror'] = 'Your session is invalid or expired.'; $messages['storageerror'] = 'Connection to storage server failed.'; $messages['servererror'] = 'Server Error!'; $messages['servererrormsg'] = 'Server Error: $msg'; +$messages['connerror'] = 'Connection Error (Failed to reach the server)!'; $messages['dberror'] = 'Database Error!'; $messages['requesttimedout'] = 'Request timed out'; $messages['errorreadonly'] = 'Unable to perform operation. Folder is read-only.'; @@ -34,7 +35,8 @@ $messages['invalidrequest'] = 'Invalid request! No data was saved.'; $messages['invalidhost'] = 'Invalid server name.'; $messages['nomessagesfound'] = 'No messages found in this mailbox.'; $messages['loggedout'] = 'You have successfully terminated the session. Good bye!'; -$messages['mailboxempty'] = 'Mailbox is empty.'; +$messages['mailboxempty'] = 'Mailbox is empty'; +$messages['nomessages'] = 'No messages'; $messages['refreshing'] = 'Refreshing...'; $messages['loading'] = 'Loading...'; $messages['uploading'] = 'Uploading file...'; @@ -93,6 +95,7 @@ $messages['contactsearchsuccessful'] = '$nr contacts found.'; $messages['searchnomatch'] = 'Search returned no matches.'; $messages['searching'] = 'Searching...'; $messages['checking'] = 'Checking...'; +$messages['stillsearching'] = 'Still searching...'; $messages['nospellerrors'] = 'No spelling errors found.'; $messages['folderdeleted'] = 'Folder successfully deleted.'; $messages['foldersubscribed'] = 'Folder successfully subscribed.'; @@ -136,7 +139,7 @@ $messages['importmessagesuccess'] = 'Successfully imported $nr messages'; $messages['importmessageerror'] = 'Import failed! The uploaded file is not a valid message or mailbox file'; $messages['opnotpermitted'] = 'Operation not permitted!'; $messages['nofromaddress'] = 'Missing e-mail address in selected identity.'; -$messages['editorwarning'] = 'Switching to the plain text editor will cause all text formatting to be lost. Do you wish to continue?'; +$messages['editorwarning'] = 'Switching editor type may cause text formatting to be lost. Do you wish to continue?'; $messages['httpreceivedencrypterror'] = 'A fatal configuration error occurred. Contact your administrator immediately. <b>Your message can not be sent.</b>'; $messages['smtpconnerror'] = 'SMTP Error ($code): Connection to server failed.'; $messages['smtpautherror'] = 'SMTP Error ($code): Authentication failed.'; diff --git a/program/localization/eo/messages.inc b/program/localization/eo/messages.inc index 17e3f1719..a1d8b3779 100644 --- a/program/localization/eo/messages.inc +++ b/program/localization/eo/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -28,7 +28,6 @@ $messages['errornoperm'] = 'Ne povis fari agon. Ne havas permeson.'; $messages['invalidrequest'] = 'Nevalida peto'; $messages['nomessagesfound'] = 'Neniu mesaÄo en ĉi tiu dosierujo'; $messages['loggedout'] = 'Vi sukcese finis la seancon. Äœis!'; -$messages['mailboxempty'] = 'Dosierujo estas malplena'; $messages['loading'] = 'Åœarganta...'; $messages['loadingdata'] = 'Åœarganta datumojn...'; $messages['checkingmail'] = 'Kontrolanta, ĉu novaj mesaÄoj...'; diff --git a/program/localization/es_419/messages.inc b/program/localization/es_419/messages.inc index f9f243422..a22c53da8 100644 --- a/program/localization/es_419/messages.inc +++ b/program/localization/es_419/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | diff --git a/program/localization/es_AR/messages.inc b/program/localization/es_AR/messages.inc index 1c442c189..6f1cd1cb5 100644 --- a/program/localization/es_AR/messages.inc +++ b/program/localization/es_AR/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -30,7 +30,6 @@ $messages['invalidrequest'] = 'Peteción invalida! No se guardó nada.'; $messages['invalidhost'] = 'Nombre de servidor inválido.'; $messages['nomessagesfound'] = 'No se han encontrado mensajes en esta casilla'; $messages['loggedout'] = 'Ha cerrado la sesión. ¡Hasta pronto!'; -$messages['mailboxempty'] = 'La casilla está vacÃa'; $messages['refreshing'] = 'Actualizando...'; $messages['loading'] = 'Cargando...'; $messages['uploading'] = 'Subiendo archivo...'; diff --git a/program/localization/es_ES/labels.inc b/program/localization/es_ES/labels.inc index 11cf6174d..ba17a4dff 100644 --- a/program/localization/es_ES/labels.inc +++ b/program/localization/es_ES/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to de $count'; $labels['copy'] = 'Copiar'; $labels['move'] = 'Mover'; $labels['moveto'] = 'Mover a…'; +$labels['copyto'] = 'Copiar a...'; $labels['download'] = 'Descargar'; $labels['open'] = 'Abrir'; $labels['showattachment'] = 'Mostrar'; @@ -197,6 +198,8 @@ $labels['spellcheck'] = 'Corrector ortográfico'; $labels['checkspelling'] = 'Revisar ortografÃa'; $labels['resumeediting'] = 'Continuar edición'; $labels['revertto'] = 'Revertir a'; +$labels['restore'] = 'Restaurar'; +$labels['restoremessage'] = '¿Restaurar el mensaje?'; $labels['responses'] = 'Respuestas'; $labels['insertresponse'] = 'Insertar una respuesta'; $labels['manageresponses'] = 'Gestionar respuestas'; diff --git a/program/localization/es_ES/messages.inc b/program/localization/es_ES/messages.inc index 4daa7a97a..53a136b0f 100644 --- a/program/localization/es_ES/messages.inc +++ b/program/localization/es_ES/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,8 @@ $messages['invalidrequest'] = '¡Petición no válida! No se han guardado los da $messages['invalidhost'] = 'Nombre de servidor inválido.'; $messages['nomessagesfound'] = 'No se han encontrado mensajes en esta casilla.'; $messages['loggedout'] = 'Ha cerrado bien la sesión. ¡Hasta pronto!'; -$messages['mailboxempty'] = 'La casilla está vacÃa.'; +$messages['mailboxempty'] = 'El buzón está vacÃo'; +$messages['nomessages'] = 'No hay mensajes'; $messages['refreshing'] = 'Actualizando…'; $messages['loading'] = 'Cargando...'; $messages['uploading'] = 'Subiendo archivo...'; @@ -82,6 +83,7 @@ $messages['norecipientwarning'] = 'Por favor, introduzca al menos un destinatari $messages['nosubjectwarning'] = 'El campo "Asunto" está vacÃo. ¿Desea completarlo en este momento?'; $messages['nobodywarning'] = '¿Quiere enviar este mensaje sin texto?'; $messages['notsentwarning'] = 'El mensaje no ha sido enviado. ¿Desea descartar su mensaje?'; +$messages['restoresavedcomposedata'] = 'Se ha encontrado un mensaje redactado previamente y no enviado.\n\nAsunto: $subject\nGuardado: $date\n\n¿Desea restaurar este mensaje?'; $messages['noldapserver'] = 'Por favor, seleccione un servidor LDAP para buscar.'; $messages['nosearchname'] = 'Por favor, introduzca un nombre o la dirección de e-mail.'; $messages['notuploadedwarning'] = 'No se han subido aún todos los adjuntos. Por favor espere o cancele la subida.'; diff --git a/program/localization/et_EE/messages.inc b/program/localization/et_EE/messages.inc index 0d2c79b5a..07443d426 100644 --- a/program/localization/et_EE/messages.inc +++ b/program/localization/et_EE/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,6 @@ $messages['invalidrequest'] = 'Lubamatu päring! Andmeid ei salvestatud.'; $messages['invalidhost'] = 'Lubamatu serveri nimi.'; $messages['nomessagesfound'] = 'Postkast paistab tühi olevat'; $messages['loggedout'] = 'Sinu seanss on edukalt lõpetatud. Nägemiseni!'; -$messages['mailboxempty'] = 'Postkast on tühi'; $messages['refreshing'] = 'Värskendamine…'; $messages['loading'] = 'Laadin...'; $messages['uploading'] = 'Laadin faili üles...'; diff --git a/program/localization/eu_ES/labels.inc b/program/localization/eu_ES/labels.inc index bbfd0c6ac..8bf6e2fef 100644 --- a/program/localization/eu_ES/labels.inc +++ b/program/localization/eu_ES/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from - $to , guztira $count'; $labels['copy'] = 'Kopia'; $labels['move'] = 'Mugitu'; $labels['moveto'] = 'mugitu hona...'; +$labels['copyto'] = 'Kopiatu hona...'; $labels['download'] = 'deskargatu'; $labels['open'] = 'Ireki'; $labels['showattachment'] = 'Erakutsi'; @@ -197,6 +198,16 @@ $labels['spellcheck'] = 'Ortografia-egiaztatu'; $labels['checkspelling'] = 'Egiaztaketa ortografikoa'; $labels['resumeediting'] = 'Editatzen jarraitu'; $labels['revertto'] = 'Itzuli hona'; +$labels['restore'] = 'Berrezarri'; +$labels['restoremessage'] = 'Leheneratu mezua?'; +$labels['responses'] = 'Erantzunak'; +$labels['insertresponse'] = 'Txertatu erantzun bat'; +$labels['manageresponses'] = 'Kudeatu erantzunak'; +$labels['savenewresponse'] = 'Gorde erantzun berria'; +$labels['editresponses'] = 'Editatu erantzunak'; +$labels['editresponse'] = 'Editatu erantzuna'; +$labels['responsename'] = 'Izena'; +$labels['responsetext'] = 'Erantzun testua'; $labels['attach'] = 'Erantsi'; $labels['attachments'] = 'Eranskinak'; $labels['upload'] = 'Igo'; @@ -316,7 +327,11 @@ $labels['searchdelete'] = 'Ezabatu bilaketa'; $labels['import'] = 'Inportatu'; $labels['importcontacts'] = 'Inportatu kontaktoak'; $labels['importfromfile'] = 'Inportatu fitxategi honetatik:'; +$labels['importtarget'] = 'Gehitu kontaktuak hona:'; $labels['importreplace'] = 'Ordezkatu helbide-liburu osoa'; +$labels['importgroups'] = 'Inportatu talde-esleipenak'; +$labels['importgroupsall'] = 'Dena (sortu taldeak behar izatekotan)'; +$labels['importgroupsexisting'] = 'Existitzen diren taldeentzat soilik'; $labels['importdesc'] = 'Gehitzen ahal duzu kontaktuak dagoen helbide-liburu batetik.<br/>Inportatzeko onartzen diren formatuak: <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> eta CSV (komaz banandutakoak).'; $labels['done'] = 'Egina'; $labels['settingsfor'] = 'Honen ezarpenak:'; @@ -425,6 +440,9 @@ $labels['standardwindows'] = 'Tratatu laster-leihoak leiho estandar bezala'; $labels['forwardmode'] = 'Mezuak birbidaltzen'; $labels['inline'] = 'Konektatua'; $labels['asattachment'] = 'eranskin moduan'; +$labels['replyallmode'] = '[Erantzun denei] botoiaren lehenetsitako ekintza'; +$labels['replyalldefault'] = 'erantzun denei'; +$labels['replyalllist'] = 'erantzun posta zerrendara soilik (aurkitzekotan)'; $labels['folder'] = 'Karpeta'; $labels['folders'] = 'Karpetak'; $labels['foldername'] = 'Karpeta izena'; diff --git a/program/localization/eu_ES/messages.inc b/program/localization/eu_ES/messages.inc index 7d2025804..2352be1f0 100644 --- a/program/localization/eu_ES/messages.inc +++ b/program/localization/eu_ES/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,6 @@ $messages['invalidrequest'] = 'Eskaera ez da baliozkoa! Datuak ez dira gorde.'; $messages['invalidhost'] = 'Zerbitzari-izena ez da baliozkoa.'; $messages['nomessagesfound'] = 'Ez da mezurik aurkitu posta kutxa honetan'; $messages['loggedout'] = 'Saioa behar bezala amaitu duzu. Agur!'; -$messages['mailboxempty'] = 'Posta kutxa hutsik dago'; $messages['refreshing'] = 'Freskatzen...'; $messages['loading'] = 'Kargatzen...'; $messages['uploading'] = 'Fitxategia kargatzen...'; @@ -44,6 +43,8 @@ $messages['messagesent'] = 'Mezua behar bezala bidali da'; $messages['savingmessage'] = 'Mezua gordetzen...'; $messages['messagesaved'] = 'Mezua zirriborroetan gordea'; $messages['successfullysaved'] = 'Behar bezala gorde da'; +$messages['savingresponse'] = 'Erantzun-testua gordetzen...'; +$messages['deleteresponseconfirm'] = 'Seguru zaude erantzun-testu hau ezabatu nahi duzula?'; $messages['addedsuccessfully'] = 'Txartela behar bezala gehitu da helbide liburura'; $messages['contactexists'] = 'ePosta honetako txartel bat badago dagoeneko'; $messages['contactnameexists'] = 'Lehendik badago izen hori duen kontaktua.'; @@ -54,6 +55,8 @@ $messages['contactnotfound'] = 'Eskatutako txartela ez da aurkitu'; $messages['contactsearchonly'] = 'Sartu kontaktua aurkitzeko bilaketa daturen bat.'; $messages['sendingfailed'] = 'Huts mezua bidaltzerakoan'; $messages['senttooquickly'] = 'Itxaron $sec segundo mezua bidali aurretik, mesedez.'; +$messages['errorsavingsent'] = 'Errore bat gertatu da bidalitako mezua gordetzean.'; +$messages['errorsaving'] = 'Errore bat gertatu da gordetzean.'; $messages['errormoving'] = 'Ezin da mezua mugitu'; $messages['errorcopying'] = 'Ezin d(ir)a kopiatu mezua(k).'; $messages['errordeleting'] = 'Ezin da mezua ezabatu'; @@ -78,6 +81,7 @@ $messages['norecipientwarning'] = 'Mesedez behintzat hartzaile bat idatzi'; $messages['nosubjectwarning'] = '"Gaia" eremua hutsik dago. Bat idatzi nahi al duzu?'; $messages['nobodywarning'] = 'Testu gabeko mezu hau bidali?'; $messages['notsentwarning'] = 'Mezua ez da bidali. Mezua ezeztatu nahi al duzu?'; +$messages['restoresavedcomposedata'] = 'Lehendik idatzitako baina bidali gabeko mezu bat aurkitu da.\n\nGaia:$subject\nGordeta:$date\n\nBerreskuratu nahi duzu mezu hau?'; $messages['noldapserver'] = 'Mesedez hautatu bilaketa egiteko LDAP zerbitzari bat'; $messages['nosearchname'] = 'Mesedez idatzi kontaktu izen bat edo eposta helbide bat'; $messages['notuploadedwarning'] = 'Oraindik ez dira kargatu eranskin guztiak. Itxaron edo ezeztatu karga.'; @@ -140,6 +144,7 @@ $messages['smtperror'] = 'SMTP errorea: $msg'; $messages['emailformaterror'] = 'Helbide elektronikoa ez da baliozkoa: $email'; $messages['toomanyrecipients'] = 'Hartzaile gehiegi. Txikitu hartzaile kopura hona $max.'; $messages['maxgroupmembersreached'] = 'Taldeko partaideen kopurua $max -ko maximoa gainditzen du:'; +$messages['internalerror'] = 'Barne akatsa. Saiatu berriz, mesedez.'; $messages['contactdelerror'] = 'Ezin d(ir)a kontaktua(k) ezabatu.'; $messages['contactdeleted'] = 'Kontaktua(k) ongi ezabatu dira.'; $messages['contactrestoreerror'] = 'Ezin d(ir)a ezabatutako kontaktua(k) leheneratu.'; diff --git a/program/localization/fa_AF/messages.inc b/program/localization/fa_AF/messages.inc index 643a9f7db..10bd8f4fe 100644 --- a/program/localization/fa_AF/messages.inc +++ b/program/localization/fa_AF/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -26,7 +26,6 @@ $messages['requesttimedout'] = 'عدم پاسخگویی در زمان مقرر'; $messages['invalidhost'] = 'نام سرور نامعتبر است'; $messages['nomessagesfound'] = 'هيچ پيغامی در اين صندوق پستي درياÙت نه شد'; $messages['loggedout'] = 'جلسه شما بصورت مکمل Ùسخ شده است خدا ØاÙظ'; -$messages['mailboxempty'] = 'صندوق پستي خالي است'; $messages['refreshing'] = 'دوباره سازی....'; $messages['loading'] = 'در Øال بارگزاری...'; $messages['uploading'] = 'در Øال بارگزاری Ùایل...'; diff --git a/program/localization/fa_IR/labels.inc b/program/localization/fa_IR/labels.inc index 14f6f8621..a6b978f6e 100644 --- a/program/localization/fa_IR/labels.inc +++ b/program/localization/fa_IR/labels.inc @@ -16,17 +16,17 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/labels/ */ $labels['welcome'] = 'به $product خوش آمدید'; -$labels['username'] = 'نام کاربری'; +$labels['username'] = 'نام‌کاربری'; $labels['password'] = 'گذرواژه'; $labels['server'] = 'سرور'; $labels['login'] = 'ورود'; $labels['logout'] = 'خروج'; -$labels['mail'] = 'نامه'; +$labels['mail'] = 'پست'; $labels['settings'] = 'تنظیمات'; $labels['addressbook'] = 'دÙتر نشانی'; $labels['inbox'] = 'صندوق ورودی'; $labels['drafts'] = 'پیش‌نویس‌ها'; -$labels['sent'] = 'Ùرستاده شده'; +$labels['sent'] = 'ارسال شده'; $labels['trash'] = 'زباله‌دان'; $labels['junk'] = 'بنجل'; $labels['show_real_foldernames'] = 'نمایش نام واقعی برای پوشه‌های ویژه'; @@ -45,13 +45,14 @@ $labels['organization'] = 'سازمان'; $labels['readstatus'] = 'وضعیت خوانده شدن'; $labels['listoptions'] = 'Ùهرست گزینه‌ها...'; $labels['mailboxlist'] = 'پوشه‌ها'; -$labels['messagesfromto'] = 'پیغام‌ها $from تا $to از $count'; -$labels['threadsfromto'] = 'رشته‌ها $from تا $to از $count'; +$labels['messagesfromto'] = 'پیغام‌های $from تا $to از $count'; +$labels['threadsfromto'] = 'رشته‌های $from تا $to از $count'; $labels['messagenrof'] = 'پیغام $nr از $count'; $labels['fromtoshort'] = '$from - $to از $count'; $labels['copy'] = 'رونوشت'; $labels['move'] = 'انتقال'; $labels['moveto'] = 'انتقال به...'; +$labels['copyto'] = 'رونوشت به...'; $labels['download'] = 'بارگیری'; $labels['open'] = 'باز کردن'; $labels['showattachment'] = 'نمایش'; @@ -71,7 +72,7 @@ $labels['monday'] = 'دوشنبه'; $labels['tuesday'] = 'سه‌شنبه'; $labels['wednesday'] = 'چهارشنبه'; $labels['thursday'] = 'پنج‌شنبه'; -$labels['friday'] = 'آدینه'; +$labels['friday'] = 'جمعه'; $labels['saturday'] = 'شنبه'; $labels['jan'] = 'ژان'; $labels['feb'] = 'Ùور'; @@ -89,7 +90,7 @@ $labels['longjan'] = 'ژانویه'; $labels['longfeb'] = 'Ùوریه'; $labels['longmar'] = 'مارس'; $labels['longapr'] = 'آوریل'; -$labels['longmay'] = 'مه'; +$labels['longmay'] = 'Ù…ÛŒ'; $labels['longjun'] = 'ژوئن'; $labels['longjul'] = 'جولای'; $labels['longaug'] = 'آگوست'; @@ -98,34 +99,34 @@ $labels['longoct'] = 'اکتبر'; $labels['longnov'] = 'نوامبر'; $labels['longdec'] = 'دسامبر'; $labels['today'] = 'امروز'; -$labels['refresh'] = 'بازخوانی'; -$labels['checkmail'] = 'بررسی پیغام‌های جدید'; -$labels['compose'] = 'نوشتن'; +$labels['refresh'] = 'نوسازی'; +$labels['checkmail'] = 'بررسی برای پیغام‌های جدید'; +$labels['compose'] = 'نوشتن پیغام'; $labels['writenewmessage'] = 'ایجاد پیغام جدید'; $labels['reply'] = 'پاسخ'; $labels['replytomessage'] = 'پاسخ به Ùرستنده'; $labels['replytoallmessage'] = 'پاسخ به Ùهرست یا به Ùرستنده Ùˆ تمام گیرنده‌ها'; $labels['replyall'] = 'پاسخ به همه'; $labels['replylist'] = 'پاسخ به Ùهرست'; -$labels['forward'] = 'باز ارسال'; -$labels['forwardinline'] = 'باز ارسال خطی'; -$labels['forwardattachment'] = 'باز ارسال به صورت پیوست'; -$labels['forwardmessage'] = 'باز ارسال پیغام'; +$labels['forward'] = 'ارجاع'; +$labels['forwardinline'] = 'ارجاع خطی'; +$labels['forwardattachment'] = 'ارجاع به صورت پیوست'; +$labels['forwardmessage'] = 'ارجاع پیغام'; $labels['deletemessage'] = 'Øذ٠پیغام'; $labels['movemessagetotrash'] = 'انتقال پیغام به زباله‌دان'; $labels['printmessage'] = 'چاپ این پیغام'; $labels['previousmessage'] = 'نمایش پیغام قبلی'; -$labels['firstmessage'] = 'نمایش اولین پیغام'; +$labels['firstmessage'] = 'نمایش پیغام اول'; $labels['nextmessage'] = 'نمایش پیغام بعدی'; -$labels['lastmessage'] = 'نمایش آخرین پیغام'; +$labels['lastmessage'] = 'نمایش پیغام آخر'; $labels['backtolist'] = 'بازگشت به Ùهرست پیغام'; $labels['viewsource'] = 'نمایش منبع'; $labels['mark'] = 'نشانه‌گذاری'; $labels['markmessages'] = 'نشانه‌گذاری پیغام‌ها'; $labels['markread'] = 'به عنوان خوانده‌شده'; $labels['markunread'] = 'به عنوان خوانده‌نشده'; -$labels['markflagged'] = 'به عنوان نشانه‌گذاری شده'; -$labels['markunflagged'] = 'به عنوان نشانه‌گذاری نشده'; +$labels['markflagged'] = 'به عنوان پرچم‌دار'; +$labels['markunflagged'] = 'به عنوان بدون پرچم'; $labels['moreactions'] = 'کارهای دیگر...'; $labels['more'] = 'بيشتر'; $labels['back'] = 'بازگشت'; @@ -184,7 +185,7 @@ $labels['changeformathtml'] = 'نمایش در قالب اچ‌تی‌ام‌ا٠$labels['editasnew'] = 'ویرایش به عنوان جدید'; $labels['send'] = 'ارسال'; $labels['sendmessage'] = 'ارسال پیغام'; -$labels['savemessage'] = 'ذخیره به عنوان پیش‌نویس'; +$labels['savemessage'] = 'ذخیره پیش‌نویس'; $labels['addattachment'] = 'پیوست کردن یک پرونده'; $labels['charset'] = 'مجموعه‌نمایه'; $labels['editortype'] = 'نوع ویرایش‌گر'; @@ -197,6 +198,8 @@ $labels['spellcheck'] = 'املاء'; $labels['checkspelling'] = 'بررسی املایی'; $labels['resumeediting'] = 'ادامه‌ی ویرایش'; $labels['revertto'] = 'برگرداندن به'; +$labels['restore'] = 'بازیابی'; +$labels['restoremessage'] = 'بازیابی پیغام؟'; $labels['responses'] = 'پاسخ‌ها'; $labels['insertresponse'] = 'درج پاسخ'; $labels['manageresponses'] = 'مدیریت پاسخ‌ها'; @@ -223,7 +226,7 @@ $labels['isdraft'] = 'این یک پیغام پیش‌نویس است.'; $labels['andnmore'] = '$nr بیشتر...'; $labels['togglemoreheaders'] = 'نمایش سربرگ‌های بیشتر پیغام'; $labels['togglefullheaders'] = 'تعویض سربرگ‌های پیغام خام'; -$labels['htmltoggle'] = 'HTML'; +$labels['htmltoggle'] = 'اچ‌تی‌ام‌ال'; $labels['plaintoggle'] = 'متن ساده'; $labels['savesentmessagein'] = 'ذخیره پیغام ارسالی در'; $labels['dontsave'] = 'ذخیره Ù†Ú©Ù†'; @@ -247,7 +250,7 @@ $labels['jobtitle'] = 'عنوان شغل'; $labels['department'] = 'بخش'; $labels['gender'] = 'جنسیت'; $labels['maidenname'] = 'نام خانوادگی زن قبل از ازدواج'; -$labels['email'] = 'پست‌الکترونیکی'; +$labels['email'] = 'پست‌الکترونیک'; $labels['phone'] = 'تلÙÙ†'; $labels['address'] = 'نشانی'; $labels['street'] = 'خیابان'; @@ -270,7 +273,7 @@ $labels['search'] = 'جستجو'; $labels['advsearch'] = 'جستجوی پیشرÙته'; $labels['advanced'] = 'پیشرÙته'; $labels['other'] = 'سایر'; -$labels['typehome'] = 'منزل'; +$labels['typehome'] = 'خانه'; $labels['typework'] = 'کار'; $labels['typeother'] = 'سایر'; $labels['typemobile'] = 'تلÙÙ† همراه'; @@ -300,7 +303,7 @@ $labels['replacephoto'] = 'جایگزینی'; $labels['uploadphoto'] = 'بارگذاری تصویر'; $labels['newcontact'] = 'ایجاد کارت تماس جدید'; $labels['deletecontact'] = 'Øذ٠تماس‌های انتخاب شده'; -$labels['composeto'] = 'نوشتن پیغام به'; +$labels['composeto'] = 'نوشتن پست به'; $labels['contactsfromto'] = 'تماس‌های $from تا $to از $count'; $labels['print'] = 'چاپ'; $labels['export'] = 'صدور'; @@ -362,14 +365,14 @@ $labels['htmleditor'] = 'HTML ‌نوشتن پیغام‌های'; $labels['htmlonreply'] = 'Ùقط در پاسخ به پیغام HTML'; $labels['htmlonreplyandforward'] = 'در بازگردانی یا پاسخ به پیغام‌های HTML'; $labels['htmlsignature'] = 'HTML امضای'; -$labels['showemail'] = 'نمایش آدرس ایمیل با نام نمایشی'; +$labels['showemail'] = 'نمایش آدرس پست الکترونیک با نام نمایشی'; $labels['previewpane'] = 'نمایش قاب پیش‌نمایش'; $labels['skin'] = 'پوسته ظاهری'; $labels['logoutclear'] = 'تمیز کردن زباله دان هنگام برون‌رÙت'; $labels['logoutcompact'] = 'Ùشرده‌سازی صندوق در هنگام خروچ'; $labels['uisettings'] = 'Ù…Øیط کاربری'; $labels['serversettings'] = 'تنظیمات سرور'; -$labels['mailboxview'] = 'نمایش صندوق‌پستی'; +$labels['mailboxview'] = 'دیدن صندوق‌پستی'; $labels['mdnrequests'] = 'تاییدهای Ùرستنده'; $labels['askuser'] = 'پرسش از کاربر'; $labels['autosend'] = 'ارسال رسید'; @@ -436,6 +439,9 @@ $labels['standardwindows'] = 'بکار بردن پاپ‌آپ‌ها به صور $labels['forwardmode'] = 'بازگردانی پیغام'; $labels['inline'] = 'خطی'; $labels['asattachment'] = 'به عنوان پیوست'; +$labels['replyallmode'] = 'عمل پیش‌Ùرض برای دکمه [پاسخ به همه]'; +$labels['replyalldefault'] = 'پاسخ به همه'; +$labels['replyalllist'] = 'پاسخ به Ùقط لیست پستی (در صورت یاÙتن)'; $labels['folder'] = 'پوشه'; $labels['folders'] = 'پوشه‌ها'; $labels['foldername'] = 'نام پوشه'; diff --git a/program/localization/fa_IR/messages.inc b/program/localization/fa_IR/messages.inc index 502b0445a..e5d5667cf 100644 --- a/program/localization/fa_IR/messages.inc +++ b/program/localization/fa_IR/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -22,7 +22,7 @@ $messages['sessionerror'] = 'نشست شما معتبر نیست، یا منقض $messages['storageerror'] = 'اتصال به سرور مخزن ناموÙÙ‚ بود.'; $messages['servererror'] = 'خطای سرور!'; $messages['servererrormsg'] = 'خطای سرور: $msg'; -$messages['dberror'] = 'خطای پایگاه داده'; +$messages['dberror'] = 'خطای پایگاه داده!'; $messages['requesttimedout'] = 'زمان درخواست تمام شد'; $messages['errorreadonly'] = ' عمل مورد نظر انجام نشد. پوشه Ùقط خواندنی است.'; $messages['errornoperm'] = ' عمل مورد نظر انجام نشد. دسترسی وجود ندارد.'; @@ -32,26 +32,29 @@ $messages['invalidrequest'] = 'درخواست نامعتبر! هیچ داده‌ $messages['invalidhost'] = 'نام سرور غیرمعتبر.'; $messages['nomessagesfound'] = 'هیچ پیغامی در این صندوق‌پستی پیدا نشد.'; $messages['loggedout'] = 'شما با موÙقیت نشست را پایان دادید. خدانگهدار!'; -$messages['mailboxempty'] = 'صندوق‌پستی خالی است.'; +$messages['mailboxempty'] = 'صندوق پستی خالی است'; +$messages['nomessages'] = 'بدون پیغام'; $messages['refreshing'] = 'نوسازی...'; -$messages['loading'] = 'در Øال بارگذاری...'; +$messages['loading'] = 'بارگذاری...'; $messages['uploading'] = 'بارگذاری پرونده...'; -$messages['uploadingmany'] = 'بارگذاری پرونده ها...'; -$messages['loadingdata'] = 'در Øال بارگذاری داده‌ها...'; -$messages['checkingmail'] = 'بررسی برای پیغام جدید...'; -$messages['sendingmessage'] = 'در Øال ارسال پیغام...'; +$messages['uploadingmany'] = 'بارگذاری پرونده‌ها...'; +$messages['loadingdata'] = 'بارگذاری داده‌ها...'; +$messages['checkingmail'] = 'بررسی برای پیغام‌های جدید...'; +$messages['sendingmessage'] = 'ارسال پیغام...'; $messages['messagesent'] = 'پیغام با موÙقیت Ùرستاده شد.'; -$messages['savingmessage'] = 'درØال ذخیره‌ی پیغام...'; -$messages['messagesaved'] = 'پیغام در پیش‌نویس‌ها ذخیره شد'; +$messages['savingmessage'] = 'ذخیره‌ی پیغام...'; +$messages['messagesaved'] = 'پیغام در پیش‌نویس‌ها ذخیره شد.'; $messages['successfullysaved'] = 'با موÙقیت ذخیره شد.'; +$messages['savingresponse'] = 'ذخیره متن پاسخ...'; +$messages['deleteresponseconfirm'] = 'آیا واقعا می‌خواهید این متن پاسخ را Øذ٠نمایید؟'; $messages['addedsuccessfully'] = 'مخاطب با موÙقیت به دÙتر نشانی‌ها اضاÙÙ‡ شد.'; -$messages['contactexists'] = 'یک مخاطب با این ایمیل از قبل وجود دارد.'; -$messages['contactnameexists'] = 'یک مخاطب با این نام از قبل وجود دارد.'; -$messages['blockedimages'] = 'برای ØÙاظت از Øریم شخصی شما، عکس‌های با آدرس خارجی در این پیغام مسدود شده‌اند.'; -$messages['encryptedmessage'] = '!این یک پیغام رمزنگاری شده است Ùˆ قابل نمایش نیست. ببخشید'; -$messages['nocontactsfound'] = 'هیج مخاطبی پیدا نشد.'; +$messages['contactexists'] = 'هم اکنون یک مخاطب با ایمیل یکسان وجود دارد.'; +$messages['contactnameexists'] = 'در Øال Øاضر مخاطبی با نام یکسان وجود دارد.'; +$messages['blockedimages'] = 'برای ØÙاظت از Øریم شخصی شما، عکس‌های خارجی در این پیغام مسدود شده‌اند.'; +$messages['encryptedmessage'] = 'این یک پیغام رمزنگاری شده است Ùˆ قابل نمایش نیست. با عرض پوزش!'; +$messages['nocontactsfound'] = 'مخاطبی پیدا نشد.'; $messages['contactnotfound'] = 'مخاطب درخواست شده پیدا نشد.'; -$messages['contactsearchonly'] = 'برای یاÙتن مخاطب عبارتی را جستجو کنید'; +$messages['contactsearchonly'] = 'برای یاÙتن مخاطب‌ها، عبارت جستجو را وارد کنید'; $messages['sendingfailed'] = 'ارسال پیغام ناموÙÙ‚ بود.'; $messages['senttooquickly'] = 'لطÙا قبل از ارسال این پیغام $sec ثانیه صبر کنید.'; $messages['errorsavingsent'] = 'خطایی رخ داده است پیام ارسالی ذخیره Ù…ÛŒ گردد.'; @@ -80,6 +83,8 @@ $messages['norecipientwarning'] = 'لطÙاً Øداقل یک گیرنده ÙˆØ§Ø $messages['nosubjectwarning'] = 'قسمت "موضوع" خالی است. می‌خواهید اکنون وارد کنید؟'; $messages['nobodywarning'] = 'این پیغام بدون متن ارسال شود؟'; $messages['notsentwarning'] = 'پیغام ارسال نشده است. آیا می‌خواهید پیغام را از بین ببرید؟'; +$messages['restoresavedcomposedata'] = 'نامه قبلا نوشته Ùˆ Ù†Ùرستاده یاÙت شد.\n\nموضوع: $subject\n +ذخیره شده: $date\n\nآیا می‌خواهید این پیغام را بازیابی نمایید؟'; $messages['noldapserver'] = 'لطÙا یک سرور LDAP برای جست‌و‌جو انتخاب کنید.'; $messages['nosearchname'] = 'لطÙا نام یک مخاطب یا یک نشانی ایمیل وارد کنید.'; $messages['notuploadedwarning'] = 'همه پیوست ها هنوز بارگذاری نشده‌اند. لطÙا صبر کرده یا بارگذاری را لغو کنید.'; diff --git a/program/localization/fi_FI/labels.inc b/program/localization/fi_FI/labels.inc index 2638bd093..f9d6e5481 100644 --- a/program/localization/fi_FI/labels.inc +++ b/program/localization/fi_FI/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from - $to (yhteensä $count)'; $labels['copy'] = 'Kopioi'; $labels['move'] = 'Siirrä'; $labels['moveto'] = 'siirrä kansioon...'; +$labels['copyto'] = 'Kopioi...'; $labels['download'] = 'lataa'; $labels['open'] = 'Avaa'; $labels['showattachment'] = 'Näytä'; diff --git a/program/localization/fi_FI/messages.inc b/program/localization/fi_FI/messages.inc index 25dc0dc0d..77a165860 100644 --- a/program/localization/fi_FI/messages.inc +++ b/program/localization/fi_FI/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,8 @@ $messages['invalidrequest'] = 'Virheellinen pyyntö! Tietoa ei tallennettu.'; $messages['invalidhost'] = 'Virheellinen palvelinnimi.'; $messages['nomessagesfound'] = 'Kansiossa ei ole sähköpostiviestejä'; $messages['loggedout'] = 'Sinut on kirjattu ulos järjestelmästä.'; -$messages['mailboxempty'] = 'Kansio on tyhjä'; +$messages['mailboxempty'] = 'Postilaatikko on tyhjä'; +$messages['nomessages'] = 'Ei viestejä'; $messages['refreshing'] = 'Päivitetään...'; $messages['loading'] = 'Ladataan...'; $messages['uploading'] = 'Ladataan tiedostoa palvelimelle...'; diff --git a/program/localization/fo_FO/labels.inc b/program/localization/fo_FO/labels.inc new file mode 100644 index 000000000..f44854a96 --- /dev/null +++ b/program/localization/fo_FO/labels.inc @@ -0,0 +1,497 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | localization/<lang>/labels.inc | + | | + | Localization file of the Roundcube Webmail client | + | Copyright (C) 2005-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/labels/ +*/ +$labels['welcome'] = 'Vælkomin til $product'; +$labels['username'] = 'Brúkaranavn'; +$labels['password'] = 'Loyniorð'; +$labels['server'] = 'Ambætari'; +$labels['login'] = 'Rita inn'; +$labels['logout'] = 'Rita út'; +$labels['mail'] = 'Teldupostur'; +$labels['settings'] = 'Stillingar'; +$labels['addressbook'] = 'Búðstaðarsavn'; +$labels['inbox'] = 'Postur'; +$labels['drafts'] = 'Skitsur'; +$labels['sent'] = 'Sent'; +$labels['trash'] = 'Skrell'; +$labels['junk'] = 'Møsn'; +$labels['show_real_foldernames'] = 'VÃs verulig nøvn til serligar mappur'; +$labels['subject'] = 'Evni'; +$labels['from'] = 'Frá'; +$labels['sender'] = 'Sendari'; +$labels['to'] = 'Til'; +$labels['cc'] = 'Cc'; +$labels['bcc'] = 'Bcc'; +$labels['replyto'] = 'Svara-til'; +$labels['followupto'] = 'Fylg við-til'; +$labels['date'] = 'Dato'; +$labels['size'] = 'Stødd'; +$labels['priority'] = 'Raðfesting'; +$labels['organization'] = 'Fyritøka'; +$labels['readstatus'] = 'Les støðu'; +$labels['listoptions'] = 'Lýs valmøguleikar...'; +$labels['mailboxlist'] = 'Mappur'; +$labels['messagesfromto'] = 'Boðini frá $from til $to ið eru $count'; +$labels['threadsfromto'] = 'Tráðirnir frá $from til $to ið eru $count'; +$labels['messagenrof'] = 'Boðini ið eru $count'; +$labels['fromtoshort'] = '$from - $to ið eru $count'; +$labels['copy'] = 'Avrita'; +$labels['move'] = 'Flyt'; +$labels['moveto'] = 'Flyt til...'; +$labels['copyto'] = 'Avrita til...'; +$labels['download'] = 'Heinta'; +$labels['open'] = 'Opna'; +$labels['showattachment'] = 'VÃs'; +$labels['showanyway'] = 'VÃs tað avlÃkavæl'; +$labels['filename'] = 'FÃlu navn'; +$labels['filesize'] = 'FÃlu stødd'; +$labels['addtoaddressbook'] = 'Legg aftrat búðstaðar bók'; +$labels['sun'] = 'Sun'; +$labels['mon'] = 'Mán'; +$labels['tue'] = 'Týs'; +$labels['wed'] = 'Mik'; +$labels['thu'] = 'Hós'; +$labels['fri'] = 'FrÃ'; +$labels['sat'] = 'Ley'; +$labels['sunday'] = 'Sunnudagur'; +$labels['monday'] = 'Mánadagur'; +$labels['tuesday'] = 'Týsdagur'; +$labels['wednesday'] = 'Mikudagur'; +$labels['thursday'] = 'Hósdagur'; +$labels['friday'] = 'FrÃggjardagur'; +$labels['saturday'] = 'Leygardagur'; +$labels['jan'] = 'Jan'; +$labels['feb'] = 'Feb'; +$labels['mar'] = 'Mar'; +$labels['apr'] = 'Apr'; +$labels['may'] = 'Maj'; +$labels['jun'] = 'Jun'; +$labels['jul'] = 'Jul'; +$labels['aug'] = 'Aug'; +$labels['sep'] = 'Sep'; +$labels['oct'] = 'Okt'; +$labels['nov'] = 'Nov'; +$labels['dec'] = 'Des'; +$labels['longjan'] = 'Januar'; +$labels['longfeb'] = 'Februar'; +$labels['longmar'] = 'Mars'; +$labels['longapr'] = 'AprÃl'; +$labels['longmay'] = 'Maj'; +$labels['longjun'] = 'Juni'; +$labels['longjul'] = 'July'; +$labels['longaug'] = 'August'; +$labels['longsep'] = 'Septembur'; +$labels['longoct'] = 'Oktobur'; +$labels['longnov'] = 'Novembur'; +$labels['longdec'] = 'Desembur'; +$labels['today'] = 'à dag'; +$labels['refresh'] = 'Endur innles'; +$labels['checkmail'] = 'Kann fyri nýggj boð.'; +$labels['compose'] = 'Stovna'; +$labels['writenewmessage'] = 'Stovna nýggj boð'; +$labels['reply'] = 'Svara'; +$labels['replytomessage'] = 'Svara til sendara'; +$labels['replytoallmessage'] = 'Svara til listan ella til sendara og allir móttakarir'; +$labels['replyall'] = 'Svara øllum'; +$labels['replylist'] = 'Svara lista'; +$labels['forward'] = 'Send vÃðari'; +$labels['forwardinline'] = 'Svara vÃðari, við gomlum teksti'; +$labels['forwardattachment'] = 'Send vÃðari sum viðhefting'; +$labels['forwardmessage'] = 'Send hesi boð vÃðari'; +$labels['deletemessage'] = 'Strika boð'; +$labels['movemessagetotrash'] = 'Koyr boð à skrell'; +$labels['printmessage'] = 'Útskriva hesi boð'; +$labels['previousmessage'] = 'VÃs seinastu boð'; +$labels['firstmessage'] = 'VÃs fyrstu boð'; +$labels['nextmessage'] = 'VÃs næstu boð'; +$labels['lastmessage'] = 'VÃs seinastu boð'; +$labels['backtolist'] = 'Aftur til boð lista'; +$labels['viewsource'] = 'VÃs keldu'; +$labels['mark'] = 'Merk'; +$labels['markmessages'] = 'Merk boð'; +$labels['markread'] = 'Sum lisin'; +$labels['markunread'] = 'Sum ólisin'; +$labels['markflagged'] = 'Sum viðmerkt'; +$labels['markunflagged'] = 'Sum óviðmerkt'; +$labels['moreactions'] = 'Fleiri gerir...'; +$labels['more'] = 'Meira'; +$labels['back'] = 'Aftur'; +$labels['options'] = 'Valmøguleikar'; +$labels['select'] = 'Vel'; +$labels['all'] = 'Alt'; +$labels['none'] = 'Einki'; +$labels['currpage'] = 'Hesa sÃðu'; +$labels['unread'] = 'Ólisið'; +$labels['flagged'] = 'Viðmerkt'; +$labels['unanswered'] = 'Ikki svara'; +$labels['withattachment'] = 'Við viðhefting'; +$labels['deleted'] = 'Strika'; +$labels['undeleted'] = 'Ikki strika'; +$labels['invert'] = 'Vend við'; +$labels['filter'] = 'SÃla'; +$labels['list'] = 'Listið'; +$labels['threads'] = 'Tráðir'; +$labels['expand-all'] = 'Spreið alt'; +$labels['expand-unread'] = 'Spreið ólisið'; +$labels['collapse-all'] = 'Sett saman alt'; +$labels['threaded'] = 'Tráða'; +$labels['autoexpand_threads'] = 'Spreið boð tráðir'; +$labels['do_expand'] = 'Allir tráðir'; +$labels['expand_only_unread'] = 'einans við ólisin boð'; +$labels['fromto'] = 'Frá/Til'; +$labels['flag'] = 'Viðmerk'; +$labels['attachment'] = 'Viðhefting'; +$labels['nonesort'] = 'Einki'; +$labels['sentdate'] = 'Sent dato'; +$labels['arrival'] = 'Móttikið dato'; +$labels['asc'] = 'hækkandi'; +$labels['desc'] = 'lækkandi'; +$labels['listcolumns'] = 'List teigar'; +$labels['listsorting'] = 'Sorterar teiga'; +$labels['listorder'] = 'Sorterar rekkjufylgju'; +$labels['listmode'] = 'Lista vÃsing'; +$labels['folderactions'] = 'Mappu gerir...'; +$labels['compact'] = 'Trýst saman'; +$labels['empty'] = 'Tøm'; +$labels['importmessages'] = 'Innflyt boð'; +$labels['quota'] = 'Disk nýtsla'; +$labels['unknown'] = 'ókent'; +$labels['unlimited'] = 'óavmarka'; +$labels['quicksearch'] = 'Skjót leiting'; +$labels['resetsearch'] = 'Nulstilla leiting'; +$labels['searchmod'] = 'Leiti minkarir'; +$labels['msgtext'] = 'Øll boðini'; +$labels['body'] = 'Kroppur'; +$labels['type'] = 'Slag'; +$labels['namex'] = 'Navn'; +$labels['openinextwin'] = 'Opna à nýggjum vindeyga'; +$labels['emlsave'] = 'Heinta (.eml)'; +$labels['changeformattext'] = 'VÃs à reinun teksti formati'; +$labels['changeformathtml'] = 'VÃs à HTML formati'; +$labels['editasnew'] = 'Broyt sum nýtt'; +$labels['send'] = 'Send'; +$labels['sendmessage'] = 'Send boð'; +$labels['savemessage'] = 'Goym sum skitsa'; +$labels['addattachment'] = 'Viðheft fÃl'; +$labels['charset'] = 'Stavusett'; +$labels['editortype'] = 'Útgevara slag'; +$labels['returnreceipt'] = 'Lat aftur kvittan'; +$labels['dsn'] = 'Útflýggja støðu kunngerð'; +$labels['mailreplyintro'] = 'Tann $date, skrivaði $sender:'; +$labels['originalmessage'] = 'Uppruna boð'; +$labels['editidents'] = 'Broyt samleikar'; +$labels['spellcheck'] = 'Stava'; +$labels['checkspelling'] = 'Kanna staving'; +$labels['resumeediting'] = 'Taka uppaftur skriving'; +$labels['revertto'] = 'Vend aftur til'; +$labels['restore'] = 'Endurstovna'; +$labels['restoremessage'] = 'Endurstovna boð?'; +$labels['responses'] = 'Svør'; +$labels['insertresponse'] = 'Innset eitt svar'; +$labels['manageresponses'] = 'Umsit svør'; +$labels['savenewresponse'] = 'Goym nýtt svar'; +$labels['editresponses'] = 'Broyt svør'; +$labels['editresponse'] = 'Broyt svar'; +$labels['responsename'] = 'Navn'; +$labels['responsetext'] = 'Svar tekstur'; +$labels['attach'] = 'Viðheft'; +$labels['attachments'] = 'Viðheftingar'; +$labels['upload'] = 'Uppsend'; +$labels['uploadprogress'] = '$percent ($currently av $total)'; +$labels['close'] = 'Lat aftur'; +$labels['messageoptions'] = 'Boð valmøguleikar...'; +$labels['low'] = 'Lágt'; +$labels['lowest'] = 'Lágst'; +$labels['normal'] = 'Vanligt'; +$labels['high'] = 'Høgt'; +$labels['highest'] = 'Hagst'; +$labels['nosubject'] = '(einki evni)'; +$labels['showimages'] = 'VÃs myndir'; +$labels['alwaysshow'] = 'VÃs altÃð myndir frá $sender'; +$labels['isdraft'] = 'Hetta er eini skitsu boð.'; +$labels['andnmore'] = '$nr meir...'; +$labels['togglemoreheaders'] = 'VÃs meiri boð teksthøvd '; +$labels['togglefullheaders'] = 'Vel ráðan boð teksthøvd'; +$labels['htmltoggle'] = 'HTML'; +$labels['plaintoggle'] = 'Reiður tekstur'; +$labels['savesentmessagein'] = 'Goym boð à '; +$labels['dontsave'] = 'goym ikki'; +$labels['maxuploadsize'] = 'Stórsta fÃlu stødd loyvd er $size'; +$labels['addcc'] = 'Legg aftrat Cc'; +$labels['addbcc'] = 'Legg aftrat Bcc'; +$labels['addreplyto'] = 'Legg aftrat Svara-til'; +$labels['addfollowupto'] = 'Legg aftrat Fylg við-til'; +$labels['mdnrequest'] = 'Sendarin av hesi boð biður um at verða kunngjørdur tá ið tú lesur hesið boð. Vilt tú kunngerða sendaran?'; +$labels['receiptread'] = 'Svara móttakara (les)'; +$labels['yourmessage'] = 'Hetta er ein afturvend kvittan av tÃni boð'; +$labels['receiptnote'] = 'Gevið gætur: Hendan kvittan vÃsir einans á um boðini vóru sýnd á teldu mótakarans. Har er eingin trygging fyri at móttakarin hevur lisið ella skilt tað ið er à boðunum'; +$labels['name'] = 'Fult navn'; +$labels['firstname'] = 'Fornavn'; +$labels['surname'] = 'Eftirnavn'; +$labels['middlename'] = 'Millunnavn'; +$labels['nameprefix'] = 'Forskoyti'; +$labels['namesuffix'] = 'Eftirskoyti'; +$labels['nickname'] = 'Eyknevni'; +$labels['jobtitle'] = 'Starvsheiti'; +$labels['department'] = 'Deild'; +$labels['gender'] = 'Kyn'; +$labels['maidenname'] = 'Gentunavn'; +$labels['email'] = 'Teldupostur'; +$labels['phone'] = 'Telefon'; +$labels['address'] = 'Búðstaður'; +$labels['street'] = 'Gøta'; +$labels['locality'] = 'Býur'; +$labels['zipcode'] = 'Post kota'; +$labels['region'] = 'Kommuna'; +$labels['country'] = 'Land'; +$labels['birthday'] = 'Føðingardagur'; +$labels['anniversary'] = 'Ãrsdagur'; +$labels['website'] = 'HeimasÃða'; +$labels['instantmessenger'] = 'IM'; +$labels['notes'] = 'Notatir'; +$labels['male'] = 'maður'; +$labels['female'] = 'kona'; +$labels['manager'] = 'Leiðari'; +$labels['assistant'] = 'Hjálparfólk'; +$labels['spouse'] = 'Hjúnafelagi'; +$labels['allfields'] = 'Allir teigar'; +$labels['search'] = 'Leita'; +$labels['advsearch'] = 'Framkomin leiting'; +$labels['advanced'] = 'Framkomin'; +$labels['other'] = 'Annað'; +$labels['typehome'] = 'Heim'; +$labels['typework'] = 'Arbeiði'; +$labels['typeother'] = 'Annað'; +$labels['typemobile'] = 'Fartelefon'; +$labels['typemain'] = 'Høvuðs'; +$labels['typehomefax'] = 'Heima faks'; +$labels['typeworkfax'] = 'Arbeiðis faks'; +$labels['typecar'] = 'Bilur'; +$labels['typepager'] = 'Persónleitari'; +$labels['typevideo'] = 'Sjónband'; +$labels['typeassistant'] = 'Hjálparfólk'; +$labels['typehomepage'] = 'HeimasÃða'; +$labels['typeblog'] = 'Bloggur'; +$labels['typeprofile'] = 'Umhvarv '; +$labels['addfield'] = 'Legg aftrat teiga...'; +$labels['addcontact'] = 'Legg aftrat nýggjan persón'; +$labels['editcontact'] = 'Broyt persón'; +$labels['contacts'] = 'Persónar'; +$labels['contactproperties'] = 'Persóna eginleikar'; +$labels['personalinfo'] = 'Persónligar upplýsingar'; +$labels['edit'] = 'Broyt'; +$labels['cancel'] = 'Ógilda'; +$labels['save'] = 'Goym'; +$labels['delete'] = 'Strika'; +$labels['rename'] = 'Umdoyp'; +$labels['addphoto'] = 'Legg aftrat'; +$labels['replacephoto'] = 'Skift út'; +$labels['uploadphoto'] = 'Uppsend mynd'; +$labels['newcontact'] = 'Ger nýtt persón kort'; +$labels['deletecontact'] = 'Strika valdir persónar'; +$labels['composeto'] = 'Skriva boð til'; +$labels['contactsfromto'] = 'Persónar frá $from til $to ið eru $count'; +$labels['print'] = 'Skriva út'; +$labels['export'] = 'Flyt út'; +$labels['exportall'] = 'Flyt út alt'; +$labels['exportsel'] = 'Flyt út valt'; +$labels['exportvcards'] = 'Út flyt persónar við vCard slagið'; +$labels['newcontactgroup'] = 'Ger nýggja persóns bólk'; +$labels['grouprename'] = 'Umdoyp bólk'; +$labels['groupdelete'] = 'Strika bólk'; +$labels['groupremoveselected'] = 'Strika valdar persónar frá bólki'; +$labels['previouspage'] = 'VÃs fyrrverandi sÃðu'; +$labels['firstpage'] = 'VÃs fyrstu sÃðu'; +$labels['nextpage'] = 'VÃs næstu sÃðu'; +$labels['lastpage'] = 'VÃs seinastu sÃðu'; +$labels['group'] = 'Bólkur'; +$labels['groups'] = 'Bólkar'; +$labels['listgroup'] = 'VÃs bólka limir'; +$labels['personaladrbook'] = 'Persónligir búðstaðir'; +$labels['searchsave'] = 'Goym leiting'; +$labels['searchdelete'] = 'Strika leiting'; +$labels['import'] = 'Innflyt'; +$labels['importcontacts'] = 'Innflyt persónar'; +$labels['importfromfile'] = 'Innflyt frá fÃlu'; +$labels['importtarget'] = 'Legg persón til'; +$labels['importreplace'] = 'Skift út alt búðstaðarsavni'; +$labels['importgroups'] = 'Innflyt bólka ásetan'; +$labels['importgroupsall'] = 'Øll (stovna bólkar um neyðugt)'; +$labels['importgroupsexisting'] = 'Einans fyri bólkar ið longu eru til'; +$labels['importdesc'] = 'Tú kanst uppsenda persónar frá einari aðrari búðstaðar bók.<br/>Vit veita vit møguleika at innflyta búðstaðir frá<a href="http://en.wikipedia.org/wiki/VCard">vCard</a> ella CSV (komma uppdeilt) dáta slag.'; +$labels['done'] = 'Liðugt'; +$labels['settingsfor'] = 'Stillingar til'; +$labels['about'] = 'Um'; +$labels['preferences'] = 'Vælmøguleikar'; +$labels['userpreferences'] = 'Brúkara vælmøguleikar'; +$labels['editpreferences'] = 'Broyt brúkara framÃhjárættindi'; +$labels['identities'] = 'Samleikar'; +$labels['manageidentities'] = 'Umsit samleikar fyri hesa kontu'; +$labels['newidentity'] = 'Nýtt samleiki'; +$labels['newitem'] = 'Nýtt ting'; +$labels['edititem'] = 'Broyt ting'; +$labels['preferhtml'] = 'VÃs HTML'; +$labels['defaultcharset'] = 'Sjálvset tekin set'; +$labels['htmlmessage'] = 'HTML boð'; +$labels['messagepart'] = 'Deilur'; +$labels['digitalsig'] = 'Dalgylt Undirskrift'; +$labels['dateformat'] = 'Dato format'; +$labels['timeformat'] = 'TÃðs format'; +$labels['prettydate'] = 'Pen dato'; +$labels['setdefault'] = 'Set vanligt'; +$labels['autodetect'] = 'Sjálvirki'; +$labels['language'] = 'Mál'; +$labels['timezone'] = 'TÃðarsona'; +$labels['pagesize'] = 'Rekkjur per sÃðu'; +$labels['signature'] = 'Undirskrift'; +$labels['dstactive'] = 'SummartÃð'; +$labels['showinextwin'] = 'Opna boðà nýggjun vindeyga'; +$labels['composeextwin'] = 'Stovna à nýggjum vindeyga'; +$labels['htmleditor'] = 'Stovna HTML boð'; +$labels['htmlonreply'] = 'til svar til HTML boð'; +$labels['htmlonreplyandforward'] = 'til vÃðari sending ella svar til HTML boð'; +$labels['htmlsignature'] = 'HTML undirskrift'; +$labels['showemail'] = 'VÃs teldupostar búðstað við fullum navni'; +$labels['previewpane'] = 'VÃs undansýningar rút'; +$labels['skin'] = 'Markamóts skinn'; +$labels['logoutclear'] = 'Strika Skrell tá ið tú út ritar'; +$labels['logoutcompact'] = 'Trýst saman postkassa tá ið tú ritar út'; +$labels['uisettings'] = 'Brúkaraøki'; +$labels['serversettings'] = 'Ambætara stillingar'; +$labels['mailboxview'] = 'Postkassa sjón'; +$labels['mdnrequests'] = 'Bið um kvittan'; +$labels['askuser'] = 'spyr me'; +$labels['autosend'] = 'send kvittan'; +$labels['autosendknown'] = 'send kvittan til mÃnir persónar, annars spyr me'; +$labels['autosendknownignore'] = 'send kvittan til mÃnir persónar, annars skúgv til vigs'; +$labels['ignore'] = 'skúgv til vigs'; +$labels['readwhendeleted'] = 'Merk boði sum lisið á striking'; +$labels['flagfordeletion'] = 'Viðmerk boði til strikingar Ãstaðin fyri at strika'; +$labels['skipdeleted'] = 'VÃs ikki strika boð'; +$labels['deletealways'] = 'Um flyting av boðum til Skrell ikki riggar, strika tey so'; +$labels['deletejunk'] = 'Strika boð beinleiðis à Møsn'; +$labels['showremoteimages'] = 'VÃs regluligar fjarmyndir'; +$labels['fromknownsenders'] = 'frá ókendum sendarum'; +$labels['always'] = 'altÃð'; +$labels['showinlineimages'] = 'VÃs viðheftar myndir niðanfyri boðini'; +$labels['autosavedraft'] = 'Goym skitsu sjálvirkandi'; +$labels['everynminutes'] = 'hvønn $n minutt(ir)'; +$labels['refreshinterval'] = 'Endur innles (kannað fyri nýggjum boðum, o.s.fv.)'; +$labels['never'] = 'aldrin'; +$labels['immediately'] = 'à stundini'; +$labels['messagesdisplaying'] = 'VÃsir boð'; +$labels['messagescomposition'] = 'Stovnar boð'; +$labels['mimeparamfolding'] = 'Viðheftingar nøvn'; +$labels['2231folding'] = 'Fult RFC 2231 (Thunderbird)'; +$labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)'; +$labels['2047folding'] = 'Fult RFC 2047 (other)'; +$labels['force7bit'] = 'Nýt MIME kodingar til 8-bit tekin'; +$labels['advancedoptions'] = 'VÃðkaðir valmøguleikar'; +$labels['focusonnewmessage'] = 'Legg dent á kaga vindeyga tá ið nýtt boð verður stovna'; +$labels['checkallfolders'] = 'Kannað allar mappur fyri nýggj boð'; +$labels['displaynext'] = 'Eftir striking/flyting av boði, vÃs so næsta boð'; +$labels['defaultfont'] = 'Vanligi stavsnið av HTML boði'; +$labels['mainoptions'] = 'Høvuðs Vælmøguleikar'; +$labels['browseroptions'] = 'Kaga Valmøguleikar'; +$labels['section'] = 'Partur'; +$labels['maintenance'] = 'Umsiting'; +$labels['newmessage'] = 'Nýggj boð'; +$labels['signatureoptions'] = 'Undirskrift vælmøguleikar'; +$labels['whenreplying'] = 'Tá ið skriving verður framd'; +$labels['replyempty'] = 'sitera ikki uppruna boðini'; +$labels['replytopposting'] = 'byrja eini nýggj boð uppiyvir sitatinum'; +$labels['replybottomposting'] = 'byrja eini nýggj boð undir sitatinum'; +$labels['replyremovesignature'] = 'Tá ið svaring verðurframd, strika so uppruna sitati frá boðinum'; +$labels['autoaddsignature'] = 'Legg undirskrift á sjálvirkandi'; +$labels['newmessageonly'] = 'Nýggj boð einans'; +$labels['replyandforwardonly'] = 'svar og vÃðarsendingar einans'; +$labels['insertsignature'] = 'Innset undirskrift'; +$labels['previewpanemarkread'] = 'Merk undansýnd boð sum lisin'; +$labels['afternseconds'] = 'eftir $n sekund'; +$labels['reqmdn'] = 'Bið altÃð um eina kvittan'; +$labels['reqdsn'] = 'Bið altÃð um status kunngerð'; +$labels['replysamefolder'] = 'Koyr svar à somu mappuna ið boðini komu frá'; +$labels['defaultabook'] = 'Sjálvset búðstaðar bók'; +$labels['autocompletesingle'] = 'Leyp um aðrar teldupost búðstaðar à sjálvirkandi skrivingini'; +$labels['listnamedisplay'] = 'VÃs persónar sum '; +$labels['spellcheckbeforesend'] = 'Kannað stavuvillur áðrenn boðini verða send'; +$labels['spellcheckoptions'] = 'Stavuvilli kanningar vælmøguleikar'; +$labels['spellcheckignoresyms'] = 'Leyp um orð við teknum'; +$labels['spellcheckignorenums'] = 'Leyp um orð við tølum'; +$labels['spellcheckignorecaps'] = 'Leyp um øll orð við øll bókstavum à stórum'; +$labels['addtodict'] = 'Legg aftrat orðabók'; +$labels['mailtoprotohandler'] = 'Skráset samskiftisreglur handfara til mailto: leinki'; +$labels['standardwindows'] = 'Handfar upplatingarvindeygu sum vanlig vindeygu'; +$labels['forwardmode'] = 'VÃðarsending av boðum'; +$labels['inline'] = 'innanreglis'; +$labels['asattachment'] = 'sum viðhefting'; +$labels['replyallmode'] = 'Sjálvset gerð til [Reply all] knap'; +$labels['replyalldefault'] = 'Svara øllum'; +$labels['replyalllist'] = 'svara til teldupostalista einans (um funnin)'; +$labels['folder'] = 'Mappa'; +$labels['folders'] = 'Mappur'; +$labels['foldername'] = 'Mappu navn'; +$labels['subscribed'] = 'Teknaður til'; +$labels['messagecount'] = 'Boð'; +$labels['create'] = 'Stovna'; +$labels['createfolder'] = 'Stovna nýggja mappu'; +$labels['managefolders'] = 'Umsit mappur'; +$labels['specialfolders'] = 'Serligar Mappur'; +$labels['properties'] = 'Vælmøguleikar'; +$labels['folderproperties'] = 'Mappu vælmøguleikar'; +$labels['parentfolder'] = 'Foreldra mappu'; +$labels['location'] = 'Stað'; +$labels['info'] = 'Upplýsing'; +$labels['getfoldersize'] = 'Trýst fyri at seta mappu stødd'; +$labels['changesubscription'] = 'Trýst fyri at broyta tekning'; +$labels['foldertype'] = 'Mappu slag'; +$labels['personalfolder'] = 'Einskild Mappa'; +$labels['otherfolder'] = 'Mappur hjá ørðum brúkarum'; +$labels['sharedfolder'] = 'Almennar mappur'; +$labels['sortby'] = 'Sortera eftir'; +$labels['sortasc'] = 'Sortera hækkandi'; +$labels['sortdesc'] = 'Sortera lækkandi'; +$labels['undo'] = 'Angra'; +$labels['installedplugins'] = 'Innløgd Ãskoyti'; +$labels['plugin'] = 'Ãskoyti'; +$labels['version'] = 'Útgáva'; +$labels['source'] = 'Kelda'; +$labels['license'] = 'Heimildarskjal'; +$labels['support'] = 'Fá hjálp'; +$labels['B'] = 'B'; +$labels['KB'] = 'KB'; +$labels['MB'] = 'MB'; +$labels['GB'] = 'GB'; +$labels['unicode'] = 'Unicode'; +$labels['english'] = 'Eingilst'; +$labels['westerneuropean'] = 'Vestur Evoropeist'; +$labels['easterneuropean'] = 'Estur Everopeist'; +$labels['southeasterneuropean'] = 'Útsynnings Everopeist'; +$labels['baltic'] = 'Eystursjógvurin'; +$labels['cyrillic'] = 'Cyrillic'; +$labels['arabic'] = 'Arabist'; +$labels['greek'] = 'Grekst'; +$labels['hebrew'] = 'Hebraiskt'; +$labels['turkish'] = 'Turkist'; +$labels['nordic'] = 'Norðurlengst'; +$labels['thai'] = 'Tailenskt'; +$labels['celtic'] = 'Keltiskt'; +$labels['vietnamese'] = 'Vietmanesiskt'; +$labels['japanese'] = 'Japanskt'; +$labels['korean'] = 'Koreanskt'; +$labels['chinese'] = 'Kinesiskt'; +?> diff --git a/program/localization/fo_FO/messages.inc b/program/localization/fo_FO/messages.inc new file mode 100644 index 000000000..7bec7c974 --- /dev/null +++ b/program/localization/fo_FO/messages.inc @@ -0,0 +1,177 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | localization/<lang>/messages.inc | + | | + | Localization file of the Roundcube Webmail client | + | Copyright (C) 2005-2014, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/messages/ +*/ +$messages['errortitle'] = 'Ein feilur kom fyri!'; +$messages['loginfailed'] = 'Feilur à innriting.'; +$messages['cookiesdisabled'] = 'Kagi tÃn noktar cookies.'; +$messages['sessionerror'] = 'Seta tÃn er ógyldig ella útgingin.'; +$messages['storageerror'] = 'Feilur à samand til goymslu ambatara.'; +$messages['servererror'] = 'Ambatara Feilur!'; +$messages['servererrormsg'] = 'Ambatara Feilur: $msg'; +$messages['dberror'] = 'Dátugrun Feilur'; +$messages['requesttimedout'] = 'Umbøn gekk út'; +$messages['errorreadonly'] = 'Kann ikki fremja ger. Mappan kann einans lesast.'; +$messages['errornoperm'] = 'Kann ikki fremja ger. Atgongd nokta.'; +$messages['erroroverquota'] = 'Kann ikki fremja ger. Einki pláss á diski.'; +$messages['erroroverquotadelete'] = 'Einki pláss á diski. Brúka SHIFT+DEL fyri at strika boð.'; +$messages['invalidrequest'] = 'Ógyldig umbøn! Einki dáta varð goymt.'; +$messages['invalidhost'] = 'Ógyldigt ambatara navn.'; +$messages['nomessagesfound'] = 'Eingi boð à funnin hesum postkassa,'; +$messages['loggedout'] = 'Tú hevur strika tÃna setu. Farvæl!'; +$messages['mailboxempty'] = 'Postkassi er tómur'; +$messages['nomessages'] = 'Eingin boð'; +$messages['refreshing'] = 'Endur-innlesur...'; +$messages['loading'] = 'Innlesur...'; +$messages['uploading'] = 'Leggur fÃlu út...'; +$messages['uploadingmany'] = 'Leggur fÃlur út...'; +$messages['loadingdata'] = 'Innlesur dáta...'; +$messages['checkingmail'] = 'Kannar fyri nýggj boð...'; +$messages['sendingmessage'] = 'Sendur boð...'; +$messages['messagesent'] = 'Boðini vóru send.'; +$messages['savingmessage'] = 'Goymur boðini.'; +$messages['messagesaved'] = 'Boðini goymd til Skitsur'; +$messages['successfullysaved'] = 'Goymt.'; +$messages['savingresponse'] = 'Goymur svar tekst...'; +$messages['deleteresponseconfirm'] = 'Vilt tú veruliga strika hendan svar tekst?'; +$messages['addedsuccessfully'] = 'Persónur lagdur aftrat búðstaðar savn.'; +$messages['contactexists'] = 'Ein persónur við sama telduposti er longu til.'; +$messages['contactnameexists'] = 'Ein persónur við sama navn er longu til.'; +$messages['blockedimages'] = 'Fyri at verja tÃn privatlÃv so eru fjarmyndir sperraðar à hesum boði.'; +$messages['encryptedmessage'] = 'Hetta er eini brogla boð og kann ikki sýnast. TÃverri!'; +$messages['nocontactsfound'] = 'Eingir persónar funnir.'; +$messages['contactnotfound'] = 'Umbindni persónurin varð ikki funnin.'; +$messages['contactsearchonly'] = 'Skriva onkur leiti orð fyri at finna persónar'; +$messages['sendingfailed'] = 'Riggaði ikki at senda boð.'; +$messages['senttooquickly'] = 'Vinarliga bÃða $sec sekund(ir) áðrenn tú sendur hetta boð.'; +$messages['errorsavingsent'] = 'Ein feilur kom fyri tá ið roynt var at goyma send boð.'; +$messages['errorsaving'] = 'Ein feilur kom fyri tá ið goymt var.'; +$messages['errormoving'] = 'Kundi ikki flyta boð(ini).'; +$messages['errorcopying'] = 'Kundi ikki avrita boð(ini).'; +$messages['errordeleting'] = 'Kundi ikki strika boð(ini).'; +$messages['errormarking'] = 'Kundi ikki merkja boð(ini).'; +$messages['deletecontactconfirm'] = 'Ert tú vÃsur à at tú vilt strika merkt(ar) persónar?'; +$messages['deletegroupconfirm'] = 'Ert tú vÃsur à at tú vilt strika valda bólk?'; +$messages['deletemessagesconfirm'] = 'Ert tú vÃsur à at tú vilt strika vald boð()?'; +$messages['deletefolderconfirm'] = 'Ert tú vÃsur à at tú vilt strika hesa mappu?'; +$messages['purgefolderconfirm'] = 'Ert tú vÃsur à at tú vilt strika øll boð à hesu mappu?'; +$messages['contactdeleting'] = 'Strikar persón(ar)...'; +$messages['groupdeleting'] = 'Strikar bólk...'; +$messages['folderdeleting'] = 'Strikar mappu...'; +$messages['foldermoving'] = 'Flytur mappu...'; +$messages['foldersubscribing'] = 'Tegnar til mappu...'; +$messages['folderunsubscribing'] = 'Ógyldar tekning til mappu...'; +$messages['formincomplete'] = 'Allir teigirnir vóru ikki fyltir út.'; +$messages['noemailwarning'] = 'Vinarliga skriva ein galdandi teldupost.'; +$messages['nonamewarning'] = 'Vinarliga skriva eitt navn.'; +$messages['nopagesizewarning'] = 'Vinarliga skriva sÃðu stødd.'; +$messages['nosenderwarning'] = 'Vinarliga skriva sendara teldupost búðstað.'; +$messages['norecipientwarning'] = 'Vinarliga skriva minst ein móttakara.'; +$messages['nosubjectwarning'] = 'Evna teigurin er tómur. Vilt tú skriva nakað à hann?'; +$messages['nobodywarning'] = 'Send hesi boð uttan tekst?'; +$messages['notsentwarning'] = 'Boðini vóru ikki send. Ynskir tú strika hetta boð?'; +$messages['restoresavedcomposedata'] = 'Eitt fyrrverandi skriva boð, men ósent, boð var funni.\n\nEvni: $subject\nGoymt: $date\n\nVilt tú endur stovna hetta boð?'; +$messages['noldapserver'] = 'Vinarliga vel ein ldap ambatara fyri at leita.'; +$messages['nosearchname'] = 'Vinarliga skriva eitt persón navn ella teldupost búðstað,'; +$messages['notuploadedwarning'] = 'Ikki allar viðheftingar eru uppsendar enn. Vinarliga bÃða ella angra uppsendingina.'; +$messages['searchsuccessful'] = '$nr boð funnin.'; +$messages['contactsearchsuccessful'] = '$nr persónar funnir.'; +$messages['searchnomatch'] = 'Leiting gav eingin úrslit.'; +$messages['searching'] = 'Leitar...'; +$messages['checking'] = 'Kannar...'; +$messages['nospellerrors'] = 'Eingin stavifeilur funnin.'; +$messages['folderdeleted'] = 'Mappa sletta.'; +$messages['foldersubscribed'] = 'Mappa tekna til.'; +$messages['folderunsubscribed'] = 'Ógylt tekning til mappu.'; +$messages['folderpurged'] = 'Mappan er tómd.'; +$messages['folderexpunged'] = 'Mappan var samantrongd.'; +$messages['deletedsuccessfully'] = 'Strika uftan feilir.'; +$messages['converting'] = 'Tekur burt forsniðing...'; +$messages['messageopenerror'] = 'Kundi ikki lesa inn boð frá servara.'; +$messages['fileuploaderror'] = 'FÃla uppsending riggaði ikk.'; +$messages['filesizeerror'] = 'Uppsendi fÃlur er stórri enn grensan ið er $size.'; +$messages['copysuccess'] = 'Avrita $nr persónar.'; +$messages['movesuccess'] = 'Flutt $nr persónar.'; +$messages['copyerror'] = 'Kundi ikki avrita persónar.'; +$messages['moveerror'] = 'Kundi ikki flyta persónar.'; +$messages['sourceisreadonly'] = 'Hendan búðstaðar keldan er einans lesandi.'; +$messages['errorsavingcontact'] = 'Kann ikki goyma addressuna hjá persóni.'; +$messages['movingmessage'] = 'Flytur hetta(hesi) boð...'; +$messages['copyingmessage'] = 'Flytur hetta(hesi) boð...'; +$messages['copyingcontact'] = 'Avritar persón(ar)...'; +$messages['movingcontact'] = 'Flytur persón(ar)...'; +$messages['deletingmessage'] = 'Strikar boð(ini)...'; +$messages['markingmessage'] = 'Merkjur boð(ini)...'; +$messages['addingmember'] = 'Leggur persón(ar) aftrat bólk...'; +$messages['removingmember'] = 'Strikar persón(ar) frá bólkið...'; +$messages['receiptsent'] = 'Kvittan er sent.'; +$messages['errorsendingreceipt'] = 'Kundi ikki senda kvittan.'; +$messages['deleteidentityconfirm'] = 'Ert tú vÃsur à at tú vilt strika hendan samleika?'; +$messages['nodeletelastidentity'] = 'Tú kanst ikki strika hendan samleika, hetta er tann seinasti.'; +$messages['forbiddencharacter'] = 'Mappu navn inniheldur óloyvd tekin.'; +$messages['selectimportfile'] = 'Vinarliga vel eina fÃlu'; +$messages['addresswriterror'] = 'Valda búðstaðar bók kann ikki skrivast Ã.'; +$messages['contactaddedtogroup'] = 'Persónar vóru lagdir aftrat bólki.'; +$messages['contactremovedfromgroup'] = 'Persónar vóru strikaðir frá bólki'; +$messages['nogroupassignmentschanged'] = 'Eingin bólka tilluting broytt.'; +$messages['importwait'] = 'Flytur inn, vinarliga bÃða...'; +$messages['importformaterror'] = 'Innflyting riggaði ikki! Tann uppsendi fÃlurin var ikki gyldigur dátu fÃlur.'; +$messages['importconfirm'] = '<b>$inserted Persónar innfluttir</b>'; +$messages['importconfirmskipped'] = '<b>Leyp um $skipped innsetanir</b>'; +$messages['importmessagesuccess'] = 'Innflutt $nr boð.'; +$messages['importmessageerror'] = 'Innflyting bar ikki til! Tann uppsendi fÃlurin er ikki gyldigur boð ella postkassa fÃlur'; +$messages['opnotpermitted'] = 'Ger ikki loyvd!'; +$messages['nofromaddress'] = 'Manglar teldupostur à valda samleika.'; +$messages['editorwarning'] = 'Um tú skiftur til reinan tekst verður øll forsniðing mist. Ynskir tú at halda fram?'; +$messages['httpreceivedencrypterror'] = 'Ein oyðandi samansetings feilur uppstóð. Vinarliga set teg à samband við umsitaran beinanvegin. <b>TÃni boð kundu ikki sendast.</b>'; +$messages['smtpconnerror'] = 'SMTP Feilur ($code): Samband til ambatara riggaði ikki.'; +$messages['smtpautherror'] = 'SMTP Feilur ($code): Atgongd nokta.'; +$messages['smtpfromerror'] = 'SMTP feilur ($code): Til bar ikki at seta sendarin til "$from" ($msg).'; +$messages['smtptoerror'] = 'SMTP feilur ($code): Til bar ikki at nýta móttakarin "$to" ($msg)'; +$messages['smtprecipientserror'] = 'SMTP feilur: Til bar ikki at greina móttakara listan.'; +$messages['smtperror'] = 'SMTP feilur: $msg'; +$messages['emailformaterror'] = 'Ógyldig teldupost búðstaður: $email'; +$messages['toomanyrecipients'] = 'Ov nógvir móttakarir. Minka um móttakarum til $max.'; +$messages['maxgroupmembersreached'] = 'Nummarið av limum à bólkinum gongur framvið hægsta mark ið er $max.'; +$messages['internalerror'] = 'Ein innanhýsis feilur kom fyri. Vinarliga royn aftur.'; +$messages['contactdelerror'] = 'Kann ikki strika persón(ar).'; +$messages['contactdeleted'] = 'Persón(ar) strikaðir.'; +$messages['contactrestoreerror'] = 'Kann ikki endurstovna persón(ar).'; +$messages['contactrestored'] = 'Persónur(ar) endurstovnaðir.'; +$messages['groupdeleted'] = 'Bólkur strikaður.'; +$messages['grouprenamed'] = 'Bólkur umdoyptur.'; +$messages['groupcreated'] = 'Bólkur stovnaður'; +$messages['savedsearchdeleted'] = 'Goymdar leitingar strikaðar'; +$messages['savedsearchdeleteerror'] = 'Kundi ikki strika goymdar leitingar.'; +$messages['savedsearchcreated'] = 'Goymdar leitingar stovnaðar.'; +$messages['savedsearchcreateerror'] = 'Kundi ikki stovna goymdar leitingar.'; +$messages['messagedeleted'] = 'Boð(ini) strika.'; +$messages['messagemoved'] = 'Boð(ini) flutt.'; +$messages['messagecopied'] = 'Boð(ini) avrita.'; +$messages['messagemarked'] = 'Boð(ini) merkt.'; +$messages['autocompletechars'] = 'Skriva minst $min tekin fyri sjálvvirkin útfylling riggar.'; +$messages['autocompletemore'] = 'Fleiri úrslit funnin. Vinarliga skriva fleiri tekin.'; +$messages['namecannotbeempty'] = 'Navn kann ikki verða tómt.'; +$messages['nametoolong'] = 'Navnið er ov langt.'; +$messages['folderupdated'] = 'Mappa dagført.'; +$messages['foldercreated'] = 'Mappa stovna.'; +$messages['invalidimageformat'] = 'Ikki eitt gyldigt mynda slag.'; +$messages['mispellingsfound'] = 'Stavuvillur funnar à tÃni boð.'; +$messages['parentnotwritable'] = 'Kann ikki flyta/avrita mappu til valda mappu. Eingin atgongu-rættindi.'; +$messages['messagetoobig'] = 'Boðini eru ov stór til at handfara.'; +$messages['attachmentvalidationerror'] = 'ÃVARING! Hendan viðheftingin er undir illgruna av tà at viðheftingar slagið ikki samsvarar við slagið ið var nevnt à boðunum. Um tú ikki stólar uppá sendaran so burdi tú ikki opna viðheftingina à tÃnum kaga, tà at tað kann innihalda illviljað tilfar.<br/><br/><em>Væntað: $expected; Fann $detected</em>'; +$messages['noscriptwarning'] = 'Ãvaring: Hendan webmail tænastan krevur Javascript! Um tú vilt nýta hana, so vinarliga tendra Javascript à tÃnum kaga.'; +?> diff --git a/program/localization/fr_FR/labels.inc b/program/localization/fr_FR/labels.inc index f846471c2..41e642875 100644 --- a/program/localization/fr_FR/labels.inc +++ b/program/localization/fr_FR/labels.inc @@ -16,7 +16,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/labels/ */ $labels['welcome'] = 'Bienvenue sur $product'; -$labels['username'] = 'Utilisateur'; +$labels['username'] = 'Nom d\'utilisateur'; $labels['password'] = 'Mot de passe'; $labels['server'] = 'Serveur'; $labels['login'] = 'Connexion'; @@ -24,12 +24,12 @@ $labels['logout'] = 'Déconnexion'; $labels['mail'] = 'Courriel'; $labels['settings'] = 'Paramètres'; $labels['addressbook'] = 'Carnet d\'adresses'; -$labels['inbox'] = 'Messages reçus'; +$labels['inbox'] = 'Boîte de réception'; $labels['drafts'] = 'Brouillons'; -$labels['sent'] = 'Messages envoyés'; +$labels['sent'] = 'Envoyés'; $labels['trash'] = 'Corbeille'; -$labels['junk'] = 'Indésirables'; -$labels['show_real_foldernames'] = 'Montrer les noms réels pour les dossiers spéciaux'; +$labels['junk'] = 'Pourriels'; +$labels['show_real_foldernames'] = 'Montrer les noms réels des dossiers spéciaux'; $labels['subject'] = 'Objet'; $labels['from'] = 'De'; $labels['sender'] = 'Expéditeur'; @@ -42,16 +42,17 @@ $labels['date'] = 'Date'; $labels['size'] = 'Taille'; $labels['priority'] = 'Priorité'; $labels['organization'] = 'Organisation'; -$labels['readstatus'] = 'Statut de lecture'; +$labels['readstatus'] = 'État de lecture'; $labels['listoptions'] = 'Lister les options...'; $labels['mailboxlist'] = 'Dossiers'; $labels['messagesfromto'] = 'Messages de $from à $to sur $count'; -$labels['threadsfromto'] = 'Fil de $from à $to sur $count'; +$labels['threadsfromto'] = 'Fils de $from à $to sur $count'; $labels['messagenrof'] = 'Message $nr sur $count'; $labels['fromtoshort'] = '$from – $to de $count'; $labels['copy'] = 'Copier'; $labels['move'] = 'Déplacer'; $labels['moveto'] = 'Déplacer vers...'; +$labels['copyto'] = 'Copier vers...'; $labels['download'] = 'Télécharger'; $labels['open'] = 'Ouvrir'; $labels['showattachment'] = 'Afficher'; @@ -98,154 +99,154 @@ $labels['longoct'] = 'Octobre'; $labels['longnov'] = 'Novembre'; $labels['longdec'] = 'Décembre'; $labels['today'] = 'Aujourd\'hui'; -$labels['refresh'] = 'Actualiser'; -$labels['checkmail'] = 'Vérification des nouveaux messages'; -$labels['compose'] = 'Composer un nouveau message'; -$labels['writenewmessage'] = 'Écrire un nouveau message'; +$labels['refresh'] = 'Rafraîchir'; +$labels['checkmail'] = 'Vérifier les nouveaux messages'; +$labels['compose'] = 'Rédiger'; +$labels['writenewmessage'] = 'Créer un nouveau message'; $labels['reply'] = 'Répondre'; $labels['replytomessage'] = 'Répondre à l\'expéditeur'; -$labels['replytoallmessage'] = 'Répondre à tous'; +$labels['replytoallmessage'] = 'Répondre à la liste, ou à l\'expéditeur et à tous les destinataires'; $labels['replyall'] = 'Répondre à tous'; $labels['replylist'] = 'Répondre à la liste'; $labels['forward'] = 'Transférer'; -$labels['forwardinline'] = 'Transférer dans le corps du message'; -$labels['forwardattachment'] = 'Transférer en pièce-jointe'; -$labels['forwardmessage'] = 'Transmettre le message'; +$labels['forwardinline'] = 'Transférer dans le message'; +$labels['forwardattachment'] = 'Transférer en fichier joint'; +$labels['forwardmessage'] = 'Transférer le message'; $labels['deletemessage'] = 'Supprimer le message'; $labels['movemessagetotrash'] = 'Déplacer le message dans la corbeille'; $labels['printmessage'] = 'Imprimer ce message'; -$labels['previousmessage'] = 'Voir le message précédent'; -$labels['firstmessage'] = 'Voir le premier message'; -$labels['nextmessage'] = 'Voir le message suivant'; -$labels['lastmessage'] = 'Voir le dernier message'; +$labels['previousmessage'] = 'Afficher le message précédent'; +$labels['firstmessage'] = 'Afficher le premier message'; +$labels['nextmessage'] = 'Afficher le message suivant'; +$labels['lastmessage'] = 'Afficher le dernier message'; $labels['backtolist'] = 'Retourner à la liste des messages'; -$labels['viewsource'] = 'Voir la source'; +$labels['viewsource'] = 'Afficher la source'; $labels['mark'] = 'Marquer'; $labels['markmessages'] = 'Marquer les messages'; -$labels['markread'] = 'Comme lu(s)'; -$labels['markunread'] = 'Comme non lu(s)'; -$labels['markflagged'] = 'Comme suivi(s)'; -$labels['markunflagged'] = 'Comme non-suivi(s)'; +$labels['markread'] = 'Comme lu'; +$labels['markunread'] = 'Comme non lu'; +$labels['markflagged'] = 'Comme signalé'; +$labels['markunflagged'] = 'Comme non signalé'; $labels['moreactions'] = 'Plus d\'actions...'; $labels['more'] = 'Plus'; $labels['back'] = 'Retour'; -$labels['options'] = 'Paramètres'; -$labels['select'] = 'Sélectionner'; +$labels['options'] = 'Options'; +$labels['select'] = 'Choisir'; $labels['all'] = 'Tous'; $labels['none'] = 'Aucun'; $labels['currpage'] = 'Page courante'; -$labels['unread'] = 'Non lu(s)'; -$labels['flagged'] = 'Marqué(s)'; -$labels['unanswered'] = 'Non répondu(s)'; -$labels['withattachment'] = 'Avec pièce jointe'; -$labels['deleted'] = 'Supprimé(s)'; -$labels['undeleted'] = 'Non supprimé(s)'; +$labels['unread'] = 'Non lu'; +$labels['flagged'] = 'Signalé'; +$labels['unanswered'] = 'Non répondu'; +$labels['withattachment'] = 'Avec fichier joint'; +$labels['deleted'] = 'Supprimé'; +$labels['undeleted'] = 'Non supprimé'; $labels['invert'] = 'Inverser'; -$labels['filter'] = 'Filtre'; +$labels['filter'] = 'Filtrer'; $labels['list'] = 'Lister'; $labels['threads'] = 'Sujets'; $labels['expand-all'] = 'Tout afficher'; $labels['expand-unread'] = 'Afficher non-lu(s)'; $labels['collapse-all'] = 'Fermer tous'; -$labels['threaded'] = 'Par sujet'; -$labels['autoexpand_threads'] = 'Développer les sujets'; -$labels['do_expand'] = 'Tous les sujets'; -$labels['expand_only_unread'] = 'uniquement avec des messages non-lus'; -$labels['fromto'] = 'Expéditeur/Destinataire'; -$labels['flag'] = 'Drapeau'; -$labels['attachment'] = 'Pièce jointe'; +$labels['threaded'] = 'Par fil'; +$labels['autoexpand_threads'] = 'Développer les fils de message'; +$labels['do_expand'] = 'Tous les fils'; +$labels['expand_only_unread'] = 'seulement avec des messages non lus'; +$labels['fromto'] = 'De/à '; +$labels['flag'] = 'Signaler'; +$labels['attachment'] = 'Fichier joint'; $labels['nonesort'] = 'Aucun'; $labels['sentdate'] = 'Date d\'envoi'; $labels['arrival'] = 'Date d\'arrivée'; -$labels['asc'] = 'Ascendant'; -$labels['desc'] = 'Descendant'; +$labels['asc'] = 'ascendant'; +$labels['desc'] = 'descendant'; $labels['listcolumns'] = 'Lister les colonnes'; $labels['listsorting'] = 'Colonne de tri'; $labels['listorder'] = 'Ordre de tri'; -$labels['listmode'] = 'Mode d\'affichage de la liste'; +$labels['listmode'] = 'Mode d\'affichage en liste'; $labels['folderactions'] = 'Actions du dossier...'; $labels['compact'] = 'Compacter'; $labels['empty'] = 'Vider'; $labels['importmessages'] = 'Importer des messages'; -$labels['quota'] = 'Occupation disque'; +$labels['quota'] = 'Utilisation du disque'; $labels['unknown'] = 'inconnue'; $labels['unlimited'] = 'illimitée'; $labels['quicksearch'] = 'Recherche rapide'; $labels['resetsearch'] = 'Réinitialiser la recherche'; -$labels['searchmod'] = 'Portée de la recherche'; +$labels['searchmod'] = 'Modificateurs de recherche'; $labels['msgtext'] = 'Message entier'; $labels['body'] = 'Corps'; $labels['type'] = 'Type'; $labels['namex'] = 'Nom'; $labels['openinextwin'] = 'Ouvrir dans une nouvelle fenêtre'; $labels['emlsave'] = 'Télécharger (.eml)'; -$labels['changeformattext'] = 'Afficher au format texte'; +$labels['changeformattext'] = 'Afficher au format texte en clair'; $labels['changeformathtml'] = 'Afficher au format HTML'; -$labels['editasnew'] = 'Éditer en tant que nouveau message'; +$labels['editasnew'] = 'Éditer comme nouveau'; $labels['send'] = 'Envoyer'; $labels['sendmessage'] = 'Envoyer un message'; -$labels['savemessage'] = 'Sauvegarder comme brouillon'; +$labels['savemessage'] = 'Enregistrer comme brouillon'; $labels['addattachment'] = 'Joindre un fichier'; -$labels['charset'] = 'Encodage'; +$labels['charset'] = 'Jeu de caractères'; $labels['editortype'] = 'Type d\'éditeur'; $labels['returnreceipt'] = 'Accusé de réception'; $labels['dsn'] = 'Notification d\'état de distribution'; $labels['mailreplyintro'] = 'Le $date, $sender a écrit :'; $labels['originalmessage'] = 'Message original'; -$labels['editidents'] = 'Modifier les identités'; +$labels['editidents'] = 'Éditer les identités'; $labels['spellcheck'] = 'Orthographe'; -$labels['checkspelling'] = 'Vérifier l\'orthographe'; +$labels['checkspelling'] = 'Vérification de l\'orthographe'; $labels['resumeediting'] = 'Retourner à l\'édition'; $labels['revertto'] = 'Revenir à '; $labels['restore'] = 'Restaurer'; -$labels['restoremessage'] = 'Restaurer le message ?'; +$labels['restoremessage'] = 'Restaurer le message?'; $labels['responses'] = 'Réponses'; $labels['insertresponse'] = 'Insérer une réponse'; $labels['manageresponses'] = 'Gérer les réponses'; -$labels['savenewresponse'] = 'Sauvegarder une nouvelle réponse'; -$labels['editresponses'] = 'Editer les réponses'; -$labels['editresponse'] = 'Editer la réponse'; +$labels['savenewresponse'] = 'Enregistrer une nouvelle réponse'; +$labels['editresponses'] = 'Éditer les réponses'; +$labels['editresponse'] = 'Éditer la réponse'; $labels['responsename'] = 'Nom'; $labels['responsetext'] = 'Texte de la réponse'; $labels['attach'] = 'Joindre'; $labels['attachments'] = 'Fichiers joints'; -$labels['upload'] = 'Transférer'; +$labels['upload'] = 'Téléverser'; $labels['uploadprogress'] = '$percent ($current sur $total)'; $labels['close'] = 'Fermer'; -$labels['messageoptions'] = 'Options du message'; +$labels['messageoptions'] = 'Options du message...'; $labels['low'] = 'Basse'; $labels['lowest'] = 'La plus basse'; $labels['normal'] = 'Normale'; $labels['high'] = 'Élevée'; $labels['highest'] = 'La plus élevée'; -$labels['nosubject'] = '(pas de sujet)'; +$labels['nosubject'] = '(pas d\'objet)'; $labels['showimages'] = 'Afficher les images'; $labels['alwaysshow'] = 'Toujours afficher les images de $sender'; $labels['isdraft'] = 'Ceci est un brouillon.'; -$labels['andnmore'] = 'Plus de $nr...'; -$labels['togglemoreheaders'] = 'Afficher plus d\'en-têtes du message'; -$labels['togglefullheaders'] = 'Afficher/Cacher l\'entête du message'; +$labels['andnmore'] = '$nr de plus...'; +$labels['togglemoreheaders'] = 'Afficher plus d\'en-têtes de messages'; +$labels['togglefullheaders'] = 'Afficher/masquer les en-têtes brutes de messages'; $labels['htmltoggle'] = 'HTML'; -$labels['plaintoggle'] = 'Texte brut'; +$labels['plaintoggle'] = 'Texte en clair'; $labels['savesentmessagein'] = 'Enregistrer le message envoyé dans'; $labels['dontsave'] = 'ne pas enregistrer'; -$labels['maxuploadsize'] = 'La taille maximum autorisée pour un fichier est $size'; +$labels['maxuploadsize'] = 'La taille de fichier maximum autorisée est $size'; $labels['addcc'] = 'Ajouter Cc'; $labels['addbcc'] = 'Ajouter Cci'; $labels['addreplyto'] = 'Ajouter Répondre à '; -$labels['addfollowupto'] = 'Ajouter Faire suivre à '; -$labels['mdnrequest'] = 'L\'expéditeur de ce message a demandé d\'être prévenu quand vous lirez ce message. Souhaitez-vous prévenir l\'expéditeur ?'; +$labels['addfollowupto'] = 'Ajouter Transférer à '; +$labels['mdnrequest'] = 'L\'expéditeur de ce message a demandé d\'être prévenu quand vous lirez ce message. Souhaitez-vous prévenir l\'expéditeur?'; $labels['receiptread'] = 'Accusé de réception (lu)'; $labels['yourmessage'] = 'Ceci est un accusé de réception pour votre message'; -$labels['receiptnote'] = 'Note : Cet accusé de réception indique seulement que le message a été affiché sur l\'ordinateur du destinataire. Il n\'y a aucune garantie que le destinataire ait lu ou compris le contenu du message.'; +$labels['receiptnote'] = 'Note : cet accusé indique seulement que le message a été affiché sur l\'ordinateur du destinataire. Il n\'y a aucune garantie que le destinataire ait lu ou compris le contenu du message.'; $labels['name'] = 'Nom à afficher'; $labels['firstname'] = 'Prénom'; -$labels['surname'] = 'Nom'; -$labels['middlename'] = 'Nom du milieu (US)'; +$labels['surname'] = 'Nom de famille'; +$labels['middlename'] = 'Second prénom'; $labels['nameprefix'] = 'Préfixe'; $labels['namesuffix'] = 'Suffixe'; $labels['nickname'] = 'Surnom'; -$labels['jobtitle'] = 'Fonction'; +$labels['jobtitle'] = 'Appellation d\'emploi'; $labels['department'] = 'Service'; $labels['gender'] = 'Sexe'; $labels['maidenname'] = 'Nom de jeune fille'; @@ -255,39 +256,39 @@ $labels['address'] = 'Adresse'; $labels['street'] = 'Rue'; $labels['locality'] = 'Ville'; $labels['zipcode'] = 'Code postal'; -$labels['region'] = 'Région'; +$labels['region'] = 'État/province/région'; $labels['country'] = 'Pays'; $labels['birthday'] = 'Date de naissance'; $labels['anniversary'] = 'Anniversaire'; $labels['website'] = 'Site Web'; -$labels['instantmessenger'] = 'Messagerie instantanée'; +$labels['instantmessenger'] = 'MI'; $labels['notes'] = 'Notes'; -$labels['male'] = 'Homme'; -$labels['female'] = 'Femme'; -$labels['manager'] = 'Manager'; -$labels['assistant'] = 'Assistante'; -$labels['spouse'] = 'Épouse'; +$labels['male'] = 'homme'; +$labels['female'] = 'femme'; +$labels['manager'] = 'Gestionnaire'; +$labels['assistant'] = 'Assistant'; +$labels['spouse'] = 'Époux/épouse'; $labels['allfields'] = 'Tous les champs'; -$labels['search'] = 'Rechercher'; +$labels['search'] = 'Recherche'; $labels['advsearch'] = 'Recherche avancée'; $labels['advanced'] = 'Détails'; $labels['other'] = 'Autre'; $labels['typehome'] = 'Domicile'; $labels['typework'] = 'Travail'; $labels['typeother'] = 'Autre'; -$labels['typemobile'] = 'Mobile'; +$labels['typemobile'] = 'Téléphone mobile'; $labels['typemain'] = 'Principale'; $labels['typehomefax'] = 'Fax personnel'; $labels['typeworkfax'] = 'Fax professionnel'; $labels['typecar'] = 'Voiture'; -$labels['typepager'] = 'Pager'; +$labels['typepager'] = 'Téléavertisseur'; $labels['typevideo'] = 'Vidéo'; -$labels['typeassistant'] = 'Assistante'; -$labels['typehomepage'] = 'Accueil'; -$labels['typeblog'] = 'Blog'; +$labels['typeassistant'] = 'Assistant'; +$labels['typehomepage'] = 'Page d\'accueil'; +$labels['typeblog'] = 'Blogue'; $labels['typeprofile'] = 'Profil'; $labels['addfield'] = 'Ajouter un champ...'; -$labels['addcontact'] = 'Ajouter le contact sélectionné à votre carnet d\'adresses'; +$labels['addcontact'] = 'Ajouter comme nouveau contact'; $labels['editcontact'] = 'Modifier le contact'; $labels['contacts'] = 'Contacts'; $labels['contactproperties'] = 'Propriétés du contact'; @@ -299,27 +300,27 @@ $labels['delete'] = 'Supprimer'; $labels['rename'] = 'Renommer'; $labels['addphoto'] = 'Ajouter'; $labels['replacephoto'] = 'Remplacer'; -$labels['uploadphoto'] = 'Transférer une photo'; -$labels['newcontact'] = 'Créer un nouveau contact'; +$labels['uploadphoto'] = 'Téléverser une photo'; +$labels['newcontact'] = 'Créer une nouvelle carte de contact'; $labels['deletecontact'] = 'Supprimer les contacts sélectionnés'; -$labels['composeto'] = 'Écrire un message à '; +$labels['composeto'] = 'Rédiger un message à '; $labels['contactsfromto'] = 'Contacts de $from à $to sur $count'; $labels['print'] = 'Imprimer'; $labels['export'] = 'Exporter'; -$labels['exportall'] = 'Exporter tout'; +$labels['exportall'] = 'Tout exporter'; $labels['exportsel'] = 'Exporter la sélection'; $labels['exportvcards'] = 'Exporter les contacts au format vCard'; $labels['newcontactgroup'] = 'Créer un nouveau groupe de contacts'; $labels['grouprename'] = 'Renommer le groupe'; $labels['groupdelete'] = 'Supprimer le groupe'; $labels['groupremoveselected'] = 'Retirer les contacts sélectionnés du groupe'; -$labels['previouspage'] = 'Montrer page précédente'; -$labels['firstpage'] = 'Voir la première page'; -$labels['nextpage'] = 'Montrer page suivante'; -$labels['lastpage'] = 'Voir la dernière page'; +$labels['previouspage'] = 'Afficher page précédente'; +$labels['firstpage'] = 'Afficher la première page'; +$labels['nextpage'] = 'Afficher la page suivante'; +$labels['lastpage'] = 'Afficher la dernière page'; $labels['group'] = 'Groupe'; $labels['groups'] = 'Groupes'; -$labels['listgroup'] = 'Liste des membres du groupe'; +$labels['listgroup'] = 'Lister les membres du groupe'; $labels['personaladrbook'] = 'Adresses personnelles'; $labels['searchsave'] = 'Enregistrer la recherche'; $labels['searchdelete'] = 'Supprimer la recherche'; @@ -328,13 +329,13 @@ $labels['importcontacts'] = 'Importer les contacts'; $labels['importfromfile'] = 'Importer depuis un fichier :'; $labels['importtarget'] = 'Ajouter les contacts à '; $labels['importreplace'] = 'Remplacer le carnet d\'adresses entier'; -$labels['importgroups'] = 'Importer les affectations de groupe'; +$labels['importgroups'] = 'Importer les affectations de groupes'; $labels['importgroupsall'] = 'Tous (créer les groupes si nécessaire)'; -$labels['importgroupsexisting'] = 'Uniquement pour les groupes existants'; -$labels['importdesc'] = 'Vous pouvez transférer des contacts à partir d\'un carnet d\'adresses existant.<br/>Nous supportons actuellement l\'importation d\'adresses à partir des format de données <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> ou CSV (champs séparés par une virgule).'; +$labels['importgroupsexisting'] = 'Seulement pour les groupes existants'; +$labels['importdesc'] = 'Vous pouvez téléverser des contacts à partir d\'un carnet d\'adresses existant.<br/>Nous prenons en charge présentement l\'importation d\'adresses à partir des format de données <a href="http://fr.wikipedia.org/wiki/VCard">vCard</a> ou CSV (séparé par une virgule).'; $labels['done'] = 'Terminé'; $labels['settingsfor'] = 'Paramètres pour'; -$labels['about'] = 'A propos'; +$labels['about'] = 'À propos de'; $labels['preferences'] = 'Préférences'; $labels['userpreferences'] = 'Préférences utilisateur'; $labels['editpreferences'] = 'Modifier les préférences utilisateur'; @@ -344,102 +345,103 @@ $labels['newidentity'] = 'Nouvelle identité'; $labels['newitem'] = 'Nouvel élément'; $labels['edititem'] = 'Modifier l\'élément'; $labels['preferhtml'] = 'Afficher en HTML'; -$labels['defaultcharset'] = 'Encodage par défaut'; +$labels['defaultcharset'] = 'Jeu de caractère par défaut'; $labels['htmlmessage'] = 'Message en HTML'; $labels['messagepart'] = 'Partie'; $labels['digitalsig'] = 'Signature numérique'; $labels['dateformat'] = 'Format de la date'; $labels['timeformat'] = 'Format de l\'heure'; $labels['prettydate'] = 'Affichage court des dates'; -$labels['setdefault'] = 'Paramètres par défaut'; +$labels['setdefault'] = 'Définir les paramètres par défaut'; $labels['autodetect'] = 'Automatique'; $labels['language'] = 'Langue'; $labels['timezone'] = 'Fuseau horaire'; -$labels['pagesize'] = 'Nombre de lignes par page'; +$labels['pagesize'] = 'Lignes par page'; $labels['signature'] = 'Signature'; -$labels['dstactive'] = 'Heure d\'été'; +$labels['dstactive'] = 'Heure avancée'; $labels['showinextwin'] = 'Ouvrir le message dans une nouvelle fenêtre'; -$labels['composeextwin'] = 'Écrire dans une nouvelle fenêtre'; -$labels['htmleditor'] = 'Composer un message au format HTML'; -$labels['htmlonreply'] = 'en réponse aux messages HTML uniquement'; -$labels['htmlonreplyandforward'] = 'Transférer ou répondre au message HTML'; +$labels['composeextwin'] = 'Rédiger dans une nouvelle fenêtre'; +$labels['htmleditor'] = 'Rédiger un message au format HTML'; +$labels['htmlonreply'] = 'en réponse à un message en HTML'; +$labels['htmlonreplyandforward'] = 'lors d\'un transfert ou en réponse à un message en HTML'; $labels['htmlsignature'] = 'Signature HTML'; -$labels['showemail'] = 'Montrer l\'adresse de courriel avec le nom complet'; +$labels['showemail'] = 'Montrer l\'adresse courriel avec le nom d\'affichage'; $labels['previewpane'] = 'Afficher le panneau d\'aperçu'; -$labels['skin'] = 'Thème de l\'interface'; +$labels['skin'] = 'Habillage de l\'interface'; $labels['logoutclear'] = 'Vider la corbeille à la déconnexion'; $labels['logoutcompact'] = 'Compacter la boite de réception à la déconnexion'; $labels['uisettings'] = 'Interface utilisateur'; $labels['serversettings'] = 'Paramètres du serveur'; -$labels['mailboxview'] = 'Vue du courrier'; -$labels['mdnrequests'] = 'Notifications à l\'expéditeur'; -$labels['askuser'] = 'demander à l\'utilisateur'; -$labels['autosend'] = 'envoyer automatiquement'; -$labels['autosendknown'] = 'Envoyer un avis de réception uniquement à mes contacts'; -$labels['autosendknownignore'] = 'envoie un accusé à mes contacts, sinon ignorer'; +$labels['mailboxview'] = 'Affichage de la boîte de courrier'; +$labels['mdnrequests'] = 'À la demande d\'un accusé de réception'; +$labels['askuser'] = 'me demander'; +$labels['autosend'] = 'envoyer l\'accusé'; +$labels['autosendknown'] = 'envoyer un accusé de réception à mes contacts, autrement me demander'; +$labels['autosendknownignore'] = 'envoyer un accusé à mes contacts, sinon ignorer'; $labels['ignore'] = 'ignorer'; $labels['readwhendeleted'] = 'Marquer le message comme lu à la suppression'; -$labels['flagfordeletion'] = 'Mettre le drapeau de suppression au lieu de supprimer'; +$labels['flagfordeletion'] = 'Signaler le message pour la suppression au lieu de le supprimer'; $labels['skipdeleted'] = 'Ne pas montrer les messages supprimés'; -$labels['deletealways'] = 'Lorsque le déplacement des messages à la corbeille échoue, supprimez-les'; +$labels['deletealways'] = 'Si le déplacement des messages à la corbeille échoue, les supprimer'; $labels['deletejunk'] = 'Supprimer directement les pourriels'; -$labels['showremoteimages'] = 'Afficher les images distantes'; -$labels['fromknownsenders'] = 'venant d\'expéditeurs connus'; +$labels['showremoteimages'] = 'Afficher les images distantes des messages'; +$labels['fromknownsenders'] = 'provenant d\'expéditeurs connus'; $labels['always'] = 'toujours'; -$labels['showinlineimages'] = 'Afficher les images attachées après le message'; -$labels['autosavedraft'] = 'Enregistrement automatique des brouillons'; +$labels['showinlineimages'] = 'Afficher les images jointes sous le message'; +$labels['autosavedraft'] = 'Enregistrer automatiquement le brouillon'; $labels['everynminutes'] = 'toutes les $n minute(s)'; -$labels['refreshinterval'] = 'Rafraîchir (Vérifier les nouveaux messages, etc.)'; +$labels['refreshinterval'] = 'Rafraîchir (vérifier les nouveaux messages, etc...)'; $labels['never'] = 'jamais'; $labels['immediately'] = 'Immédiatement'; $labels['messagesdisplaying'] = 'Affichage des messages'; -$labels['messagescomposition'] = 'Écriture des messages'; -$labels['mimeparamfolding'] = 'Nom du fichier attaché'; -$labels['2231folding'] = 'RFC 2231 complète (Thunderbird)'; +$labels['messagescomposition'] = 'Rédaction des messages'; +$labels['mimeparamfolding'] = 'Noms des fichiers joints'; +$labels['2231folding'] = 'RFC 2231 complet (Thunderbird)'; $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)'; -$labels['2047folding'] = 'RFC 2047 complète (autre)'; -$labels['force7bit'] = 'Encoder les caractères 8 bits au format MIME'; +$labels['2047folding'] = 'RFC 2047 complet (autre)'; +$labels['force7bit'] = 'Utiliser l\'encodage MIME pour les caractères 8 bits'; $labels['advancedoptions'] = 'Options avancées'; -$labels['focusonnewmessage'] = 'Placer le focus sur la fenêtre quand un nouveau message arrive'; -$labels['checkallfolders'] = 'Vérifier tous les dossiers pour les nouveaux messages'; -$labels['displaynext'] = 'Après suppression/déplacement du message, afficher le message suivant'; +$labels['focusonnewmessage'] = 'Cibler la fenêtre du navigateur quand un nouveau message arrive'; +$labels['checkallfolders'] = 'Vérifier les nouveaux messages dans tous les dossiers'; +$labels['displaynext'] = 'Après avoir supprimé/déplacé un message, afficher le suivant'; $labels['defaultfont'] = 'Police par défaut des messages en HTML'; $labels['mainoptions'] = 'Options principales'; $labels['browseroptions'] = 'Options du navigateur'; $labels['section'] = 'Section'; $labels['maintenance'] = 'Maintenance'; -$labels['newmessage'] = 'Nouveau Message'; -$labels['signatureoptions'] = 'Options pour la signature'; -$labels['whenreplying'] = 'En répondant'; -$labels['replyempty'] = 'Ne pas citer le message original'; -$labels['replytopposting'] = 'commencer le nouveau message au-dessus de l\'original'; -$labels['replybottomposting'] = 'commencer le nouveau message en-dessous de l\'original'; -$labels['replyremovesignature'] = 'Supprimer la signature d\'origine du message lors de la réponse'; -$labels['autoaddsignature'] = 'Ajouter la signature automatiquement'; -$labels['newmessageonly'] = 'nouveau message uniquement'; -$labels['replyandforwardonly'] = 'réponses et transferts uniquement'; +$labels['newmessage'] = 'Nouveau message'; +$labels['signatureoptions'] = 'Options de signature'; +$labels['whenreplying'] = 'Lors d\'une réponse'; +$labels['replyempty'] = 'ne pas citer le message original'; +$labels['replytopposting'] = 'commencer le nouveau message au-dessus de la citation'; +$labels['replybottomposting'] = 'commencer le nouveau message en-dessous de la citation'; +$labels['replyremovesignature'] = 'Lors de la réponse, supprimer la signature originale du message '; +$labels['autoaddsignature'] = 'Ajouter automatiquement la signature'; +$labels['newmessageonly'] = 'nouveau message seulement'; +$labels['replyandforwardonly'] = 'réponses et transferts seulement'; $labels['insertsignature'] = 'Insérer la signature'; $labels['previewpanemarkread'] = 'Marquer les messages prévisualisés comme lus'; $labels['afternseconds'] = 'après $n secondes'; -$labels['reqmdn'] = 'Toujours demander un avis de réception'; +$labels['reqmdn'] = 'Toujours demander un accusé de réception'; $labels['reqdsn'] = 'Toujours demander une notification d\'état de distribution'; $labels['replysamefolder'] = 'Placer les réponses dans le dossier du message auquel il est répondu'; $labels['defaultabook'] = 'Carnet d\'adresses par défaut'; -$labels['autocompletesingle'] = 'Ne pas tenir compte des adresses de courriel alternatives dans l\'autoremplissage'; +$labels['autocompletesingle'] = 'Ignorer les adresses de courriel alternatives du remplissage automatique'; $labels['listnamedisplay'] = 'Lister les contacts comme'; -$labels['spellcheckbeforesend'] = 'Vérifier l’orthographe avant l’envoi d’un message'; +$labels['spellcheckbeforesend'] = 'Vérifier l’orthographe avant d\'envoyer un message'; $labels['spellcheckoptions'] = 'Options du vérificateur d\'orthographe'; $labels['spellcheckignoresyms'] = 'Ignorer les mots avec des symboles'; $labels['spellcheckignorenums'] = 'Ignorer les mots avec des nombres'; $labels['spellcheckignorecaps'] = 'Ignorer les mots entièrement en majuscule'; $labels['addtodict'] = 'Ajouter au dictionnaire'; $labels['mailtoprotohandler'] = 'Enregistrer le gestionnaire de protocole pour les liens mailto:'; -$labels['standardwindows'] = 'Manipuler les menus surgissants comme des fenêtres standards'; +$labels['standardwindows'] = 'Considérer les fenêtres intempestives comme des fenêtres habituelles'; $labels['forwardmode'] = 'Transfert des messages'; -$labels['inline'] = 'dans le corps'; -$labels['asattachment'] = 'en pièce jointe'; -$labels['replyalldefault'] = 'Répondre à tous'; -$labels['replyalllist'] = 'Répondre uniquement à la liste de diffusion (si trouvée)'; +$labels['inline'] = 'dans le message'; +$labels['asattachment'] = 'en fichier joint'; +$labels['replyallmode'] = 'Action par défaut du bouton [Répondre à tous]'; +$labels['replyalldefault'] = 'répondre à tous'; +$labels['replyalllist'] = 'répondre seulement à la liste de diffusion (si trouvée)'; $labels['folder'] = 'Dossier'; $labels['folders'] = 'Dossiers'; $labels['foldername'] = 'Nom du dossier'; @@ -447,29 +449,29 @@ $labels['subscribed'] = 'Abonné'; $labels['messagecount'] = 'Messages'; $labels['create'] = 'Créer'; $labels['createfolder'] = 'Créer un nouveau dossier'; -$labels['managefolders'] = 'Organiser les dossiers'; +$labels['managefolders'] = 'Gérer les dossiers'; $labels['specialfolders'] = 'Dossiers spéciaux'; $labels['properties'] = 'Propriétés'; $labels['folderproperties'] = 'Propriétés du dossier'; $labels['parentfolder'] = 'Dossier parent'; -$labels['location'] = 'Localisation'; -$labels['info'] = 'Information'; +$labels['location'] = 'Emplacement'; +$labels['info'] = 'Informations'; $labels['getfoldersize'] = 'Cliquer pour obtenir la taille de dossier'; -$labels['changesubscription'] = 'Cliquer pour modifier l\'inscription'; -$labels['foldertype'] = 'Type de répertoire'; -$labels['personalfolder'] = 'Répertoire privé'; -$labels['otherfolder'] = 'Répertoire d\'autres utilisateurs'; -$labels['sharedfolder'] = 'Répertoire public'; +$labels['changesubscription'] = 'Cliquer pour modifier l\'abonnement'; +$labels['foldertype'] = 'Type de dossier'; +$labels['personalfolder'] = 'Dossier privé'; +$labels['otherfolder'] = 'Dossier d\'autres utilisateurs'; +$labels['sharedfolder'] = 'Dossier public'; $labels['sortby'] = 'Trier par'; $labels['sortasc'] = 'Tri ascendant'; $labels['sortdesc'] = 'Tri descendant'; $labels['undo'] = 'Annuler'; -$labels['installedplugins'] = 'Extensions installées'; -$labels['plugin'] = 'Plugin'; +$labels['installedplugins'] = 'Plugiciels installés'; +$labels['plugin'] = 'Plugiciel'; $labels['version'] = 'Version'; $labels['source'] = 'Source'; $labels['license'] = 'Licence'; -$labels['support'] = 'Obtenir un support technique'; +$labels['support'] = 'Obtenir du soutien'; $labels['B'] = 'o'; $labels['KB'] = 'ko'; $labels['MB'] = 'Mo'; @@ -478,15 +480,15 @@ $labels['unicode'] = 'Unicode'; $labels['english'] = 'Anglais'; $labels['westerneuropean'] = 'Europe de l\'Ouest'; $labels['easterneuropean'] = 'Europe de l\'Est'; -$labels['southeasterneuropean'] = 'Europe du Sud Est'; +$labels['southeasterneuropean'] = 'Europe du Sud-Est'; $labels['baltic'] = 'Baltique'; $labels['cyrillic'] = 'Cyrillique'; $labels['arabic'] = 'Arabe'; $labels['greek'] = 'Grec'; $labels['hebrew'] = 'Hébreu'; -$labels['turkish'] = 'Turque'; +$labels['turkish'] = 'Turc'; $labels['nordic'] = 'Nordique'; -$labels['thai'] = 'Thaïlandais'; +$labels['thai'] = 'Thaï'; $labels['celtic'] = 'Celtique'; $labels['vietnamese'] = 'Vietnamien'; $labels['japanese'] = 'Japonais'; diff --git a/program/localization/fr_FR/messages.inc b/program/localization/fr_FR/messages.inc index fcf9eaf92..82d883c34 100644 --- a/program/localization/fr_FR/messages.inc +++ b/program/localization/fr_FR/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -15,159 +15,163 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/messages/ */ -$messages['errortitle'] = 'Une erreur est survenue !'; -$messages['loginfailed'] = 'L\'authentification a échoué.'; -$messages['cookiesdisabled'] = 'Votre navigateur n\'accepte pas les cookies.'; +$messages['errortitle'] = 'Une erreur est survenue!'; +$messages['loginfailed'] = 'La connexion a échoué.'; +$messages['cookiesdisabled'] = 'Votre navigateur n\'accepte pas les fichiers témoins.'; $messages['sessionerror'] = 'Votre session est invalide ou a expiré.'; -$messages['storageerror'] = 'Erreur de connexion au serveur IMAP.'; -$messages['servererror'] = 'Erreur Serveur !'; -$messages['servererrormsg'] = 'Erreur du serveur : $msg'; -$messages['dberror'] = 'Erreur avec la base de données !'; +$messages['storageerror'] = 'Erreur de connexion au serveur de stockage.'; +$messages['servererror'] = 'Erreur de serveur!'; +$messages['servererrormsg'] = 'Erreur de serveur : $msg'; +$messages['dberror'] = 'Erreur de base de données!'; $messages['requesttimedout'] = 'Délai de la requête expiré'; -$messages['errorreadonly'] = 'Impossible d\'effectuer cette opération. Le dossier est en lecture seule.'; -$messages['errornoperm'] = 'Impossible d\'effectuer cette opération. Permission refusée.'; -$messages['erroroverquota'] = 'Impossible d\'effectuer cette opération. Plus d\'espace libre.'; -$messages['erroroverquotadelete'] = 'Plus d\'espace libre. Utilisez SHIFT+DEL pour supprimer un message.'; -$messages['invalidrequest'] = 'Requête invalide ! Aucune donnée n\'a été sauvegardée.'; +$messages['errorreadonly'] = 'Impossible d\'effectuer l\'opération. Le dossier est en lecture seule.'; +$messages['errornoperm'] = 'Impossible d\'effectuer l\'opération. Permission refusée.'; +$messages['erroroverquota'] = 'Impossible d\'effectuer l\'opération. Aucun espace disque libre.'; +$messages['erroroverquotadelete'] = 'Aucun espace disque libre. Utiliser Maj+Suppr pour supprimer un message.'; +$messages['invalidrequest'] = 'Requête invalide! Aucune donnée n\'a été enregistrée.'; $messages['invalidhost'] = 'Nom du serveur invalide.'; -$messages['nomessagesfound'] = 'Cette boîte aux lettres ne contient aucun message.'; -$messages['loggedout'] = 'Vous vous êtes correctement déconnecté. Au revoir !'; -$messages['mailboxempty'] = 'La boîte aux lettres est vide.'; -$messages['refreshing'] = 'Rafraîchissement en cours...'; -$messages['loading'] = 'Chargement en cours...'; -$messages['uploading'] = 'Transfert du fichier en cours...'; -$messages['uploadingmany'] = 'Transfert des fichiers en cours...'; -$messages['loadingdata'] = 'Chargement des données en cours...'; +$messages['nomessagesfound'] = 'Aucun message trouvé dans cette boîte de coourriel'; +$messages['loggedout'] = 'Vous avez correctement terminé cette session. Au revoir!'; +$messages['mailboxempty'] = 'La boîte de courriel est vide'; +$messages['nomessages'] = 'Aucun message'; +$messages['refreshing'] = 'Rafraîchissement...'; +$messages['loading'] = 'Chargement...'; +$messages['uploading'] = 'Téléversement du fichier...'; +$messages['uploadingmany'] = 'Téléversement des fichiers...'; +$messages['loadingdata'] = 'Chargement des données...'; $messages['checkingmail'] = 'Vérification des nouveaux messages...'; -$messages['sendingmessage'] = 'Envoi du message en cours...'; -$messages['messagesent'] = 'Le message a bien été expédié.'; -$messages['savingmessage'] = 'Sauvegarde du message en cours...'; +$messages['sendingmessage'] = 'Envoi du message...'; +$messages['messagesent'] = 'Le message a été envoyé avec succès.'; +$messages['savingmessage'] = 'Enregistrement du message...'; $messages['messagesaved'] = 'Message sauvegardé dans Brouillons.'; -$messages['successfullysaved'] = 'La sauvegarde a bien été effectuée.'; -$messages['addedsuccessfully'] = 'Le contact a bien été ajouté dans le carnet d\'adresses.'; -$messages['contactexists'] = 'Cette adresse courriel est utilisée par un autre contact.'; -$messages['contactnameexists'] = 'Il existe déjà un contact nommé ainsi.'; -$messages['blockedimages'] = 'Les images distantes sont bloquées pour protéger votre vie privée.'; -$messages['encryptedmessage'] = 'Désolé, ce message est chiffré et ne peut être affiché.'; -$messages['nocontactsfound'] = 'Aucun contact n\'a pu être trouvé.'; +$messages['successfullysaved'] = 'Enregistré avec succès.'; +$messages['savingresponse'] = 'Enregistrement du texte de réponse...'; +$messages['deleteresponseconfirm'] = 'Voulez-vous vraiment supprimer ce texte de réponse?'; +$messages['addedsuccessfully'] = 'Le contact a été ajouté avec succès au carnet d\'adresses.'; +$messages['contactexists'] = 'Un contact avec la même adresse courriel existe déjà .'; +$messages['contactnameexists'] = 'Un contact avec le même nom existe déjà .'; +$messages['blockedimages'] = 'Pour protéger votre confidentialité, les images distantes sont bloquées dans ce message.'; +$messages['encryptedmessage'] = 'Ce message est chiffré et ne peut pas être affiché. Désolé!'; +$messages['nocontactsfound'] = 'Aucun contact n\'a été trouvé.'; $messages['contactnotfound'] = 'Le contact demandé n\'a pas été trouvé.'; -$messages['contactsearchonly'] = 'Entrez un ou plusieurs mots clés pour trouver des contacts.'; -$messages['sendingfailed'] = 'L\'envoi du message a échoué.'; -$messages['senttooquickly'] = 'Veuillez patienter $sec s. pour envoyer ce message.'; -$messages['errorsavingsent'] = 'Une erreur est apparue durant l\'enregistrement du message envoyé.'; -$messages['errorsaving'] = 'Une erreur est apparue durant l\'enregistrement.'; +$messages['contactsearchonly'] = 'Saisir des termes d\'interrogation pour trouver des contacts.'; +$messages['sendingfailed'] = 'Échec lors de l\'envoi du message.'; +$messages['senttooquickly'] = 'Veuillez patienter $sec s avant d\'envoyer ce message.'; +$messages['errorsavingsent'] = 'Une erreur est survenue durant l\'enregistrement du message envoyé.'; +$messages['errorsaving'] = 'Une erreur est survenue durant l\'enregistrement.'; $messages['errormoving'] = 'Impossible de déplacer le(s) message(s).'; $messages['errorcopying'] = 'Impossible de copier le(s) message(s).'; $messages['errordeleting'] = 'Impossible de supprimer le(s) message(s).'; $messages['errormarking'] = 'Impossible de marquer le(s) message(s).'; -$messages['deletecontactconfirm'] = 'Êtes-vous sûr de vouloir supprimer le(s) contact(s) sélectionné(s) ?'; -$messages['deletegroupconfirm'] = 'Êtes-vous sûr de vouloir supprimer le groupe sélectionné ?'; -$messages['deletemessagesconfirm'] = 'Êtes-vous sûr de vouloir supprimer le(s) message(s) sélectionné(s) ?'; -$messages['deletefolderconfirm'] = 'Êtes-vous sûr de vouloir supprimer ce dossier ?'; -$messages['purgefolderconfirm'] = 'Êtes-vous sûr de vouloir supprimer tous les messages de ce dossier ?'; -$messages['contactdeleting'] = 'Suppression de contact(s) en cours...'; +$messages['deletecontactconfirm'] = 'Vouiez-vous vraiment supprimer le(s) contact(s) sélectionné(s)?'; +$messages['deletegroupconfirm'] = 'Vouiez-vous vraiment supprimer le groupe sélectionné?'; +$messages['deletemessagesconfirm'] = 'Vouiez-vous vraiment supprimer le(s) message(s) sélectionné(s)?'; +$messages['deletefolderconfirm'] = 'Vouiez-vous vraiment supprimer ce dossier?'; +$messages['purgefolderconfirm'] = 'Vouiez-vous vraiment supprimer tous les messages dans ce dossier?'; +$messages['contactdeleting'] = 'Suppression des contacts...'; $messages['groupdeleting'] = 'Suppression du groupe...'; $messages['folderdeleting'] = 'Suppression du dossier...'; $messages['foldermoving'] = 'Déplacement du dossier...'; -$messages['foldersubscribing'] = 'Inscription du dossier...'; -$messages['folderunsubscribing'] = 'Désinscription du dossier...'; +$messages['foldersubscribing'] = 'Abonnement au dossier...'; +$messages['folderunsubscribing'] = 'Désabonnement au dossier...'; $messages['formincomplete'] = 'Le formulaire n\'a pas été entièrement rempli.'; -$messages['noemailwarning'] = 'Veuillez spécifier un courriel valide.'; -$messages['nonamewarning'] = 'Veuillez fournir un nom.'; -$messages['nopagesizewarning'] = 'Veuillez indiquer une taille de page.'; -$messages['nosenderwarning'] = 'Veuillez renseigner l\'adresse d\'expéditeur.'; -$messages['norecipientwarning'] = 'Veuillez ajouter au moins un destinataire.'; -$messages['nosubjectwarning'] = 'Le champ «Objet» est vide. Souhaitez-vous le renseigner maintenant ?'; -$messages['nobodywarning'] = 'Envoyer ce message sans texte ?'; -$messages['notsentwarning'] = 'Le message n\'a pas été envoyé. Voulez-vous abandonner ce message ?'; -$messages['noldapserver'] = 'Choisissez un serveur LDAP pour la recherche.'; -$messages['nosearchname'] = 'Entrez un nom de contact ou un courriel.'; -$messages['notuploadedwarning'] = 'Toutes les pièces jointes n\'ont pas encore été transférées. Veuillez patienter ou annuler cette opération.'; -$messages['searchsuccessful'] = '$nr message(s) trouvé(s).'; -$messages['contactsearchsuccessful'] = '$nr contact(s) trouvé(s).'; -$messages['searchnomatch'] = 'La recherche n\'a donné aucun résultat.'; -$messages['searching'] = 'Recherche en cours...'; -$messages['checking'] = 'Vérification en cours...'; +$messages['noemailwarning'] = 'Veuillez saisir une adresse courriel valide.'; +$messages['nonamewarning'] = 'Veuillez saisir un nom.'; +$messages['nopagesizewarning'] = 'Veuillez sasisir une taille de page.'; +$messages['nosenderwarning'] = 'Veuillez saisir l\'adresse courriel de l\'expéditeur.'; +$messages['norecipientwarning'] = 'Veuillez saisir au moins un destinataire.'; +$messages['nosubjectwarning'] = 'Le champ « Objet » est vide. Voudriez-vous le saisir maintenant?'; +$messages['nobodywarning'] = 'Envoyer ce message sans texte?'; +$messages['notsentwarning'] = 'Le message n\'a pas été envoyé. Voulez-vous abandonner ce message?'; +$messages['restoresavedcomposedata'] = 'Un message précédemment rédigé mais non envoyé a été trouvé.\n\nObjet : $subject\nEnregistré le : $date\n\nVoulez-vous restaurer ce message?'; +$messages['noldapserver'] = 'Veuillez choisir un serveur ldap à rechercher.'; +$messages['nosearchname'] = 'Veuillez saisir un nom de contact ou une adresse de courriel.'; +$messages['notuploadedwarning'] = 'Toutes les fichiers joints n\'ont pas encore été téléversés. Veuillez patienter ou annuler le téléversement.'; +$messages['searchsuccessful'] = '$nr messages trouvés.'; +$messages['contactsearchsuccessful'] = '$nr contacts trouvés.'; +$messages['searchnomatch'] = 'La recherche n\'a retourné aucune concordance.'; +$messages['searching'] = 'Recherche...'; +$messages['checking'] = 'Vérification...'; $messages['nospellerrors'] = 'Aucune faute d\'orthographe trouvée.'; -$messages['folderdeleted'] = 'Le dossier a bien été effacé.'; -$messages['foldersubscribed'] = 'Le dossier a bien été inscrit.'; -$messages['folderunsubscribed'] = 'Le dossier a bien été désinscrit.'; -$messages['folderpurged'] = 'Le dossier a bien été vidé.'; -$messages['folderexpunged'] = 'Le dossier a bien été compacté.'; -$messages['deletedsuccessfully'] = 'Correctement supprimé(s).'; +$messages['folderdeleted'] = 'Le dossier a été effacé avec succès.'; +$messages['foldersubscribed'] = 'L\'abonnement au dossier a réussi.'; +$messages['folderunsubscribed'] = 'Le désabonnement au dossier a réussi.'; +$messages['folderpurged'] = 'Le dossier a été vidé avec succès.'; +$messages['folderexpunged'] = 'Le dossier a été compacté avec succès.'; +$messages['deletedsuccessfully'] = 'Supprimé avec succès.'; $messages['converting'] = 'Suppression de la mise en forme...'; -$messages['messageopenerror'] = 'Impossible de charger le message depuis serveur.'; -$messages['fileuploaderror'] = 'Transfert du fichier échoué'; -$messages['filesizeerror'] = 'Le fichier transféré dépasse la taille maximale de $size.'; -$messages['copysuccess'] = '$nr contacts correctement copiés.'; -$messages['movesuccess'] = '$nr contacts correctement déplacés.'; +$messages['messageopenerror'] = 'Impossible de charger le message depuis le serveur.'; +$messages['fileuploaderror'] = 'Échec lors du téléversement du fichier'; +$messages['filesizeerror'] = 'Le fichier téléversé dépasse la taille maximale de $size.'; +$messages['copysuccess'] = '$nr contacts copiés avec succès.'; +$messages['movesuccess'] = '$nr contacts déplacés avec succès.'; $messages['copyerror'] = 'Aucun contact n\'a pu être copié.'; $messages['moveerror'] = 'Aucun contact n\'a pu être déplacé.'; $messages['sourceisreadonly'] = 'Cette source d\'adresse est en lecture seule.'; -$messages['errorsavingcontact'] = 'Impossible de sauvegarder l\'adresse du contact.'; -$messages['movingmessage'] = 'Message(s) en cours de déplacement...'; -$messages['copyingmessage'] = 'Message(s) en cours de copie...'; -$messages['copyingcontact'] = 'Contact(s) en cours de copie...'; -$messages['movingcontact'] = 'Contact(s) en cours de déplacement...'; -$messages['deletingmessage'] = 'Message(s) en cours de suppression...'; -$messages['markingmessage'] = 'Message(s) en cours de marquage...'; -$messages['addingmember'] = 'Contact(s) en cours d\'ajout dans le groupe...'; -$messages['removingmember'] = 'Contact(s) en cours de suppression du groupe...'; -$messages['receiptsent'] = 'L\'accusé de réception a bien été envoyé.'; -$messages['errorsendingreceipt'] = 'Impossible d\'envoyer l\'accusé de réception.'; -$messages['deleteidentityconfirm'] = 'Voulez vous vraiment supprimer cette identité ?'; -$messages['nodeletelastidentity'] = 'Vous ne pouvez pas effacer votre seule identité.'; +$messages['errorsavingcontact'] = 'Impossible de enregistrer l\'adresse du contact.'; +$messages['movingmessage'] = 'Déplacement des messages...'; +$messages['copyingmessage'] = 'Copie des messages...'; +$messages['copyingcontact'] = 'Copie des contacts...'; +$messages['movingcontact'] = 'Déplacement des contacts...'; +$messages['deletingmessage'] = 'Suppression des messages...'; +$messages['markingmessage'] = 'Marquage des messages...'; +$messages['addingmember'] = 'Ajout des contacts au groupe...'; +$messages['removingmember'] = 'Suppression des contacts du groupe...'; +$messages['receiptsent'] = 'L\'accusé de lecture a été avec succès.'; +$messages['errorsendingreceipt'] = 'Impossible d\'envoyer l\'accusé de lecture.'; +$messages['deleteidentityconfirm'] = 'Voulez-vous vraiment supprimer cette identité?'; +$messages['nodeletelastidentity'] = 'Vous ne pouvez pas effacer cette identité, c\'est votre dernière.'; $messages['forbiddencharacter'] = 'Le nom du dossier contient un caractère interdit.'; -$messages['selectimportfile'] = 'Veuillez sélectionner un fichier à transférer.'; -$messages['addresswriterror'] = 'Impossible d\'écrire dans le carnet d\'adresse sélectionné.'; -$messages['contactaddedtogroup'] = 'Les contacts ont bien été ajoutés à ce groupe.'; -$messages['contactremovedfromgroup'] = 'Les contacts ont bien été supprimés de ce groupe.'; -$messages['nogroupassignmentschanged'] = 'Appartenance aux groupes inchangée.'; -$messages['importwait'] = 'Import en cours, veuillez patienter...'; -$messages['importformaterror'] = 'L\'import a échoué ! Le fichier transféré n\'est pas un fichier d\'import de données valide.'; -$messages['importconfirm'] = '<b>Les $inserted contacts ont bien été importés</b>'; -$messages['importconfirmskipped'] = '<b>$skipped entrée(s) déjà existante(s)</b>'; -$messages['importmessagesuccess'] = 'Importation de $nr messages avec succès'; -$messages['importmessageerror'] = 'L\'importation a échoué! Le fichier envoyé n\'est pas un message valide ou un fichier au format mailbox'; -$messages['opnotpermitted'] = 'Cette opération n\'est pas permise !'; -$messages['nofromaddress'] = 'Courriel manquant dans l\'identité sélectionnée.'; -$messages['editorwarning'] = 'Passer à l\'éditeur de texte brut causera la perte du formatage du texte. Souhaitez-vous continuer ?'; -$messages['httpreceivedencrypterror'] = 'Une erreur fatale de configuration est survenue. Veuillez contacter votre administrateur immédiatement. <b>Votre message n\'a pas pu être envoyé.</b>'; -$messages['smtpconnerror'] = 'Erreur SMTP ($code) : Échec de la connexion au serveur.'; -$messages['smtpautherror'] = 'Erreur SMTP ($code) : Échec de l\'authentification.'; -$messages['smtpfromerror'] = 'Erreur SMTP ($code) : Impossible de définir l\'expéditeur "$from" ($msg)'; -$messages['smtptoerror'] = 'Erreur SMTP ($code) : Impossible d\'ajouter le destinataire "$to" ($msg)'; -$messages['smtprecipientserror'] = 'Erreur SMTP : Impossible de lire la liste des destinataires.'; +$messages['selectimportfile'] = 'Veuillez choisir un fichier à téléverser.'; +$messages['addresswriterror'] = 'Impossible d\'écrire dans le carnet d\'adresse choisi.'; +$messages['contactaddedtogroup'] = 'Les contacts ont été ajoutés à ce groupe avec succès.'; +$messages['contactremovedfromgroup'] = 'Les contacts ont été supprimés de ce groupe avec succès.'; +$messages['nogroupassignmentschanged'] = 'Aucune affection de groupes n\'a été changée.'; +$messages['importwait'] = 'Importation, veuillez patienter...'; +$messages['importformaterror'] = 'Échec lors de l\'importation! Le fichier téléversé n\'est pas un fichier d\'importation de données valide.'; +$messages['importconfirm'] = '<b>Les $inserted contacts ont été importés avec succès</b>'; +$messages['importconfirmskipped'] = '<b>Les $skipped entrées existantes ont été ignorées</b>'; +$messages['importmessagesuccess'] = '$nr messages importés avec succès'; +$messages['importmessageerror'] = 'L\'importation a échoué! Le fichier téléversé n\'est pas un message valide ou un fichier de boîte de courriel.'; +$messages['opnotpermitted'] = 'Opération non permise!'; +$messages['nofromaddress'] = 'Adresse courriel manquante dans l\'identité choisie.'; +$messages['editorwarning'] = 'Passer à l\'éditeur de texte en clair causera la perte de toute la mise en forme du texte. Souhaitez-vous continuer?'; +$messages['httpreceivedencrypterror'] = 'Une erreur fatale de configuration est survenue. Contactez votre administrateur immédiatement. <b>Votre message ne peut pas être envoyé.</b>'; +$messages['smtpconnerror'] = 'Erreur SMTP ($code) : échec lors de la connexion au serveur.'; +$messages['smtpautherror'] = 'Erreur SMTP ($code) : échec lors de l\'authentification.'; +$messages['smtpfromerror'] = 'Erreur SMTP ($code) : impossible de définir l\'expéditeur « $from » ($msg)'; +$messages['smtptoerror'] = 'Erreur SMTP ($code) : échec lors de l\'ajout du destinataire « $to » ($msg)'; +$messages['smtprecipientserror'] = 'Erreur SMTP : impossible d\'analyser la liste des destinataires.'; $messages['smtperror'] = 'Erreur SMTP : $msg'; -$messages['emailformaterror'] = 'Courriel incorrect : $email'; -$messages['toomanyrecipients'] = 'Trop de destinataires. Réduisez leur nombre à $max maximum.'; +$messages['emailformaterror'] = 'Adresse courriel invalide : $email'; +$messages['toomanyrecipients'] = 'Trop de destinataires. Réduire leur nombre à $max.'; $messages['maxgroupmembersreached'] = 'Le nombre de membres du groupe dépasse le maximum de $max.'; -$messages['internalerror'] = 'Une erreur interne est apparue. Merci de ré-essayer.'; -$messages['contactdelerror'] = 'Impossible de supprimer le(s) contact(s).'; -$messages['contactdeleted'] = 'Contact(s) correctement supprimé(s).'; -$messages['contactrestoreerror'] = 'Impossible de restaurer le(s) contact(s) supprimé(s).'; -$messages['contactrestored'] = 'Contact(s) correctement restauré(s).'; -$messages['groupdeleted'] = 'Le groupe a bien été supprimé.'; -$messages['grouprenamed'] = 'Le groupe a bien été renommé.'; -$messages['groupcreated'] = 'Le groupe a bien été créé.'; -$messages['savedsearchdeleted'] = 'La recherche enregistrée a bien été supprimée.'; +$messages['internalerror'] = 'Une erreur interne est survenue. Veuillez ressayer.'; +$messages['contactdelerror'] = 'Impossible de supprimer les contacts.'; +$messages['contactdeleted'] = 'Contacts supprimés avec succès.'; +$messages['contactrestoreerror'] = 'Impossible de restaurer les contacts supprimés.'; +$messages['contactrestored'] = 'Contacts restaurés avec succès.'; +$messages['groupdeleted'] = 'Groupe supprimé avec succès.'; +$messages['grouprenamed'] = 'Groupe renommé avec succès.'; +$messages['groupcreated'] = 'Groupe créé avec succès.'; +$messages['savedsearchdeleted'] = 'Recherche enregistrée supprimée avec succès.'; $messages['savedsearchdeleteerror'] = 'Impossible de supprimer la recherche enregistrée.'; -$messages['savedsearchcreated'] = 'La recherche enregistrée a bien été créée.'; +$messages['savedsearchcreated'] = 'Recherche enregistrée créée avec succès.'; $messages['savedsearchcreateerror'] = 'Impossible de créer la recherche enregistrée.'; -$messages['messagedeleted'] = 'Message(s) correctement supprimé(s).'; -$messages['messagemoved'] = 'Message(s) correctement déplacé(s).'; -$messages['messagecopied'] = 'Message(s) correctement copié(s).'; -$messages['messagemarked'] = 'Message(s) correctement marqué(s).'; -$messages['autocompletechars'] = 'Entrez au moins $min caractères pour l\'auto-complétion.'; -$messages['autocompletemore'] = 'Plusieurs entrées trouvées. Veuillez taper plus de caractères.'; +$messages['messagedeleted'] = 'Messages supprimés avec succès.'; +$messages['messagemoved'] = 'Messages déplacés avec succès.'; +$messages['messagecopied'] = 'Messages copiés avec succès.'; +$messages['messagemarked'] = 'Messages marqués avec succès.'; +$messages['autocompletechars'] = 'Saisir au moins $min caractères pour le remplissage automatique.'; +$messages['autocompletemore'] = 'Plusieurs entrées concordantes trouvées. Veuillez taper plus de caractères.'; $messages['namecannotbeempty'] = 'Le nom ne peut pas être vide.'; $messages['nametoolong'] = 'Le nom est trop long.'; -$messages['folderupdated'] = 'Le dossier a bien été mis à jour.'; -$messages['foldercreated'] = 'Le dossier a bien été créé.'; -$messages['invalidimageformat'] = 'Format d\'image invalide.'; -$messages['mispellingsfound'] = 'Des fautes d\'orthographe ont été détectées dans le message.'; -$messages['parentnotwritable'] = 'Impossible de créer/déplacer le dossier dans le dossier parent sélectionné. Aucun droit d\'accès.'; -$messages['messagetoobig'] = 'Le message est trop gros pour être traité.'; -$messages['attachmentvalidationerror'] = 'ATTENTION ! Cette pièce jointe est suspecte car son type ne correspond pas au type déclaré dans ce message. Si vous ne faites pas confiance à l\'expéditeur, vous ne devriez pas l\'ouvrir dans le navigateur, car il peut contenir des contenus malveillants.<br/><br/><em>Attendu : $expected; trouvé : $detected</em>'; -$messages['noscriptwarning'] = 'Atention : Ce service de webmail nécessite Javascript ! Pour pouvoir l\'utiliser, merci d\'activer Javascript dans les préférences de votre navigateur.'; +$messages['folderupdated'] = 'Dossier mis à jour avec succès.'; +$messages['foldercreated'] = 'Dossier créé avec succès.'; +$messages['invalidimageformat'] = 'N\'est pas un format d\'image valide.'; +$messages['mispellingsfound'] = 'Fautes d\'orthographe détectées dans le message.'; +$messages['parentnotwritable'] = 'Impossible de créer/déplacer le dossier dans le dossier parent choisi. Aucun droit d\'accès.'; +$messages['messagetoobig'] = 'La partie message est trop grosse pour être traité.'; +$messages['attachmentvalidationerror'] = 'AVERTISSEMENT! Ce fichier joint est suspect parce que son type ne correspond pas au type déclaré dans le message. Si vous ne faites pas confiance à l\'expéditeur, vous ne devriez pas l\'ouvrir dans le navigateur, car son contenu peut être malveillant.<br/><br/><em>Attendu : $expected; trouvé : $detected</em>'; +$messages['noscriptwarning'] = 'Avertissement : Ce service de courriel Web exige Javascript! Afin de l\'utiliser, veuillez activer Javascript dans les paramètres de votre navigateur.'; ?> diff --git a/program/localization/ga_IE/messages.inc b/program/localization/ga_IE/messages.inc index b52fbe657..3ae5cae57 100644 --- a/program/localization/ga_IE/messages.inc +++ b/program/localization/ga_IE/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -21,7 +21,6 @@ $messages['sessionerror'] = 'Tá an seisiúin neamhbhailà nó as feidhm'; $messages['storageerror'] = 'Theip an iarraidh chun nasc go dtà an freastalaà Prótacal Rochtana Teachtaireachtaà IdirlÃn (IMAP)'; $messages['nomessagesfound'] = 'Nà bhfuair mé aon teachtaireacht i bosca postas seo'; $messages['loggedout'] = 'D\'éirigh tú logáil amach. Slán Leat!'; -$messages['mailboxempty'] = 'Tá an bosca postas folamh'; $messages['loading'] = 'Fan nóiméad, ag lódáil...'; $messages['loadingdata'] = 'Ag lódáil sonraÃ...'; $messages['checkingmail'] = 'Ag seiceáil chun teachtaireacht nua...'; diff --git a/program/localization/gl_ES/messages.inc b/program/localization/gl_ES/messages.inc index 069ff5d42..2e9fc338d 100644 --- a/program/localization/gl_ES/messages.inc +++ b/program/localization/gl_ES/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,6 @@ $messages['invalidrequest'] = 'Petición non válida! Non se gardou ningún dato $messages['invalidhost'] = 'O nome do servidor non é válido.'; $messages['nomessagesfound'] = 'Non se atoparon mensaxes nesta caixa de correo.'; $messages['loggedout'] = 'Rematou correctamente a tú sesión. Até logo!'; -$messages['mailboxempty'] = 'A caixa de correo está baleira.'; $messages['refreshing'] = 'A refrescar...'; $messages['loading'] = 'Cargando...'; $messages['uploading'] = 'Cargando ficheiro...'; diff --git a/program/localization/he_IL/labels.inc b/program/localization/he_IL/labels.inc index ad9a91adc..66c4a26b3 100644 --- a/program/localization/he_IL/labels.inc +++ b/program/localization/he_IL/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to מתוך $count'; $labels['copy'] = 'העתק'; $labels['move'] = 'העבר'; $labels['moveto'] = 'תיוק ב...'; +$labels['copyto'] = 'העתקה ×ל...'; $labels['download'] = 'הורדה'; $labels['open'] = 'לפתוח'; $labels['showattachment'] = 'הצגה'; @@ -197,6 +198,16 @@ $labels['spellcheck'] = '×יות'; $labels['checkspelling'] = 'בדיקת ×יות'; $labels['resumeediting'] = 'המשך עריכה'; $labels['revertto'] = 'חזור למצב קוד×'; +$labels['restore'] = 'שיחזור'; +$labels['restoremessage'] = 'לשחזר הודעה?'; +$labels['responses'] = 'תגובות'; +$labels['insertresponse'] = '×”×›× ×¡×ª תגובה'; +$labels['manageresponses'] = '× ×™×”×•×œ תגובות'; +$labels['savenewresponse'] = 'שמירת תגובה חדשה'; +$labels['editresponses'] = 'עריכת תגובות'; +$labels['editresponse'] = 'עריכת תגובה'; +$labels['responsename'] = 'ש×'; +$labels['responsetext'] = 'גוף התגובה'; $labels['attach'] = 'צירוף'; $labels['attachments'] = 'צרופות'; $labels['upload'] = 'העל××”'; @@ -316,7 +327,11 @@ $labels['searchdelete'] = 'מחיקת החיפוש'; $labels['import'] = 'ייבו×'; $labels['importcontacts'] = '×™×™×‘×•× ×× ×©×™ קשר'; $labels['importfromfile'] = '×™×™×‘×•× ×ž×§×•×‘×¥'; +$labels['importtarget'] = 'הוספת ×× ×©×™ קשר ×ל '; $labels['importreplace'] = 'החלפת כל ×¤× ×§×¡ הכתובות'; +$labels['importgroups'] = '×™×™×‘×•× ×”×’×“×¨×•×ª קבוצה'; +$labels['importgroupsall'] = 'הכל (יש ×œ×”×§×™× ×§×‘×•×¦×•×ª ×× ×¦×¨×™×š)'; +$labels['importgroupsexisting'] = 'רק עבור קבוצות קיימות'; $labels['importdesc'] = '× ×™×ª×Ÿ לטעון ×× ×©×™ קשר מקובץ ×—×™×¦×•× ×™. ×× ×• ×ª×•×ž×›×™× ×‘×§×‘×¦×™× ×”×¢×¨×•×›×™× ×‘×¦×•×¨×” של <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> ×ו CSV המופרד על ידי פסיקי×.'; @@ -426,6 +441,9 @@ $labels['standardwindows'] = '×—×œ×•× ×•×ª ×§×•×¤×¦×™× ×™×˜×•×¤×œ×• ×›×—×œ×•× × $labels['forwardmode'] = '×”×¤× ×™×ª הודעות'; $labels['inline'] = 'חלק מההודעה'; $labels['asattachment'] = 'כצרופה'; +$labels['replyallmode'] = 'ברירת המחדל של כפתור [×ž×¢× ×” לכול×]'; +$labels['replyalldefault'] = '×ž×¢× ×” לכול×'; +$labels['replyalllist'] = '×ž×¢× ×” לרשימת תפוצה בלבד (×× ×§×™×™×ž×ª)'; $labels['folder'] = 'תיק'; $labels['folders'] = 'תיקיות'; $labels['foldername'] = '×©× ×ª×™×§'; diff --git a/program/localization/he_IL/messages.inc b/program/localization/he_IL/messages.inc index b7e7d1ae8..e6d95aa6d 100644 --- a/program/localization/he_IL/messages.inc +++ b/program/localization/he_IL/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -33,6 +33,7 @@ $messages['invalidhost'] = '×©× ×©×¨×ª ×œ× ×—×•×§×™'; $messages['nomessagesfound'] = '×œ× × ×ž×¦×ו הודעות בתיבה זו'; $messages['loggedout'] = 'הקשר הסתיי×. להתר×ות!'; $messages['mailboxempty'] = 'רשימת ההודעות ריקה'; +$messages['nomessages'] = '×ין הודעות'; $messages['refreshing'] = '×ž×¨×¢× ×Ÿ...'; $messages['loading'] = '×˜×¢×™× ×”...'; $messages['uploading'] = 'קובץ עולה...'; @@ -44,6 +45,8 @@ $messages['messagesent'] = 'ההודעה × ×ž×¡×¨×” בהצלחה'; $messages['savingmessage'] = 'שמירת הודעה...'; $messages['messagesaved'] = 'ההודעה × ×©×ž×¨×” כטיוטה'; $messages['successfullysaved'] = '× ×©×ž×¨×” בהצלחה'; +$messages['savingresponse'] = 'שמירת תגובה...'; +$messages['deleteresponseconfirm'] = '×”×× ×œ×ž×—×•×§ ×ת התגובה?'; $messages['addedsuccessfully'] = '×יש הקשר × ×•×¡×£ ×œ×¤× ×§×¡ בהצלחה'; $messages['contactexists'] = '×§×™×™× ×›×‘×¨ ×יש קשר ×¢× ×›×ª×•×‘×ª דו×"ל זו'; $messages['contactnameexists'] = '×§×™×™× ×›×‘×¨ ×יש קשר בעל ×ותו ש×'; @@ -54,6 +57,8 @@ $messages['contactnotfound'] = '×יש הקשר המבוקש ×œ× × ×ž×¦×'; $messages['contactsearchonly'] = 'יש להקיש מפתחות חיפוש כדי ×œ×ž×¦×•× ×× ×©×™ קשר'; $messages['sendingfailed'] = 'שליחת ההודעה × ×›×©×œ×”'; $messages['senttooquickly'] = '× × ×œ×”×ž×ª×™×Ÿ $sec ×©× ×™×•×ª ×œ×¤× ×™ מסירת הודעה זו'; +$messages['errorsavingsent'] = '×ירעה שגי××” בזמן שמירת ההודעה ×©× ×©×œ×—×”'; +$messages['errorsaving'] = '×ירעה שגי××” בזמן השמירה'; $messages['errormoving'] = '×œ× × ×™×ª×Ÿ לתייק ×ת ההודעה'; $messages['errorcopying'] = 'העתקת ההודעות × ×›×©×œ×”'; $messages['errordeleting'] = '×œ× × ×™×ª×Ÿ למחוק ×ת ההודעה'; @@ -78,6 +83,7 @@ $messages['norecipientwarning'] = '× × ×œ×”×•×¡×™×£ לפחות × ×ž×¢×Ÿ ×חד' $messages['nosubjectwarning'] = 'שורת ×”× ×•×©× ×¨×™×§×”. ×”×× ×‘×¨×¦×•× ×š להוסיף × ×•×©× ×›×¢×ª?'; $messages['nobodywarning'] = '×”×× ×œ×©×œ×•×— הודעה ×œ×œ× ×ª×•×›×Ÿ?'; $messages['notsentwarning'] = 'ההודעה ×œ× × ×©×œ×—×”. ×”×× ×œ×‘×˜×œ?'; +$messages['restoresavedcomposedata'] = '× ×ž×¦××” הודעה ×©× ×¢×¨×›×” ×ך ×œ× × ×©×œ×—×”. \n\nSubject: $subject\n× ×©×ž×¨×”: $date\n\n×”×× ×œ×©×—×–×¨ ×ת ההודעה?'; $messages['noldapserver'] = '× × ×œ×‘×—×•×¨ שרת כתובות לחיפוש'; $messages['nosearchname'] = '× × ×œ×”×•×¡×™×£ ×יש קשר ×ו כתובת דו×"ל'; $messages['notuploadedwarning'] = 'עדיין ×œ× ×”×•×¢×œ×• כל הקבצי×. × × ×œ×—×›×•×ª ×ו לבטל הפעולה.'; @@ -140,6 +146,7 @@ $messages['smtperror'] = 'SMTP: $msg'; $messages['emailformaterror'] = '$email כתובת דו×"ל שגויה'; $messages['toomanyrecipients'] = 'יותר מדי × ×ž×¢× ×™×. יש להקטין ×ž×¡×¤×¨× ×œ - $max'; $messages['maxgroupmembersreached'] = '×ž×¡×¤×¨× ×©×œ חברי הקבוצה ××™× ×• יכול לעבור $max'; +$messages['internalerror'] = 'שגי×ת מערכת. × × ×œ× ×¡×•×ª ×©× ×™×ª.'; $messages['contactdelerror'] = '×œ× × ×™×ª×Ÿ למחוק ×יש קשר'; $messages['contactdeleted'] = '×יש הקשר × ×ž×—×§'; $messages['contactrestoreerror'] = '×œ× × ×™×ª×Ÿ לשחזר ×יש קשר ×©× ×ž×—×§'; diff --git a/program/localization/hi_IN/messages.inc b/program/localization/hi_IN/messages.inc index 9cf02696a..801909b06 100644 --- a/program/localization/hi_IN/messages.inc +++ b/program/localization/hi_IN/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -21,7 +21,6 @@ $messages['sessionerror'] = 'सतà¥à¤° समापà¥à¤¤ या अवैद $messages['storageerror'] = 'आईमैप (IMAP) सरà¥à¤µà¤° से समà¥à¤ªà¤°à¥à¤• नहीं हो पाया'; $messages['nomessagesfound'] = 'इस मेलबॉकà¥à¤¸ में कोई मेल नहीं है'; $messages['loggedout'] = 'सतà¥à¤° समापà¥à¤¤. टा टा!'; -$messages['mailboxempty'] = 'मेलबॉकà¥à¤¸ खाली है'; $messages['loading'] = 'लोड हो रहा है'; $messages['loadingdata'] = 'डाटा लोड हो रहा है...'; $messages['checkingmail'] = 'कà¥à¤¯à¤¾ नया मेल है?...'; diff --git a/program/localization/hr_HR/labels.inc b/program/localization/hr_HR/labels.inc index 70d1c1316..cfa0ff8dd 100644 --- a/program/localization/hr_HR/labels.inc +++ b/program/localization/hr_HR/labels.inc @@ -29,8 +29,10 @@ $labels['drafts'] = 'PredloÅ¡ci'; $labels['sent'] = 'Poslano'; $labels['trash'] = 'Smeće'; $labels['junk'] = 'Spam'; +$labels['show_real_foldernames'] = 'Prikaži prava imena specijalnih mapa'; $labels['subject'] = 'Naslov'; $labels['from'] = 'Od'; +$labels['sender'] = 'PoÅ¡iljatelj'; $labels['to'] = 'Za'; $labels['cc'] = 'Cc'; $labels['bcc'] = 'Bcc'; @@ -41,6 +43,7 @@ $labels['size'] = 'VeliÄina'; $labels['priority'] = 'Prioritet'; $labels['organization'] = 'Organizacija'; $labels['readstatus'] = 'ProÄitano'; +$labels['listoptions'] = 'Opcije lista...'; $labels['mailboxlist'] = 'Mape'; $labels['messagesfromto'] = 'Poruke od $from do $to od ukupno $count'; $labels['threadsfromto'] = 'Teme od $from do $to od ukupno $count'; @@ -50,6 +53,9 @@ $labels['copy'] = 'Kopiraj'; $labels['move'] = 'Premjesti'; $labels['moveto'] = 'Premjesti u...'; $labels['download'] = 'Preuzmi (download)'; +$labels['open'] = 'Otvori'; +$labels['showattachment'] = 'Prikaži'; +$labels['showanyway'] = 'Prikaži svejedno'; $labels['filename'] = 'Ime datoteke'; $labels['filesize'] = 'VeliÄina datoteke'; $labels['addtoaddressbook'] = 'Dodaj u imenik'; @@ -97,14 +103,14 @@ $labels['checkmail'] = 'Provjera novih poruka'; $labels['compose'] = 'Nova poruka'; $labels['writenewmessage'] = 'Stvori novu poruku'; $labels['reply'] = 'Odgovori'; -$labels['replytomessage'] = 'Odgovori na poruku'; -$labels['replytoallmessage'] = 'Odgovori poÅ¡iljaocu i svim primateljima'; +$labels['replytomessage'] = 'Odgovori poÅ¡iljatelju'; +$labels['replytoallmessage'] = 'Odgovori listi ili poÅ¡iljatelju i svim primateljima'; $labels['replyall'] = 'Odgovori svima'; $labels['replylist'] = 'Odgovori listi'; $labels['forward'] = 'Proslijedi'; -$labels['forwardinline'] = 'Proslijedi citirano'; +$labels['forwardinline'] = 'Proslijedi umetnuto'; $labels['forwardattachment'] = 'Proslijedi kao privitak'; -$labels['forwardmessage'] = 'Prosljedi poruku'; +$labels['forwardmessage'] = 'Proslijedi poruku'; $labels['deletemessage'] = 'ObriÅ¡i poruku'; $labels['movemessagetotrash'] = 'Preseli poruke u smeće'; $labels['printmessage'] = 'IspiÅ¡i ovu poruku'; @@ -118,9 +124,9 @@ $labels['mark'] = 'OznaÄi'; $labels['markmessages'] = 'OznaÄi poruke'; $labels['markread'] = 'Kao proÄitano'; $labels['markunread'] = 'Kao neproÄitano'; -$labels['markflagged'] = 'Kao oznaÄenu'; -$labels['markunflagged'] = 'Kao neoznaÄenu'; -$labels['moreactions'] = 'ViÅ¡e akcija'; +$labels['markflagged'] = 'Kao oznaÄeno'; +$labels['markunflagged'] = 'Kao neoznaÄeno'; +$labels['moreactions'] = 'ViÅ¡e akcija...'; $labels['more'] = 'ViÅ¡e'; $labels['back'] = 'Natrag'; $labels['options'] = 'Postavke'; @@ -128,66 +134,85 @@ $labels['select'] = 'Odaberi'; $labels['all'] = 'Sve'; $labels['none'] = 'NiÅ¡ta'; $labels['currpage'] = 'Trenutna stranica'; -$labels['unread'] = 'NeproÄitane'; -$labels['flagged'] = 'OznaÄene'; -$labels['unanswered'] = 'Neodgovrene'; +$labels['unread'] = 'NeproÄitano'; +$labels['flagged'] = 'OznaÄeno'; +$labels['unanswered'] = 'Neodgovoreno'; +$labels['withattachment'] = 'S privitkom'; $labels['deleted'] = 'Obrisano'; +$labels['undeleted'] = 'Neobrisano'; $labels['invert'] = 'Obrni'; $labels['filter'] = 'Filtriraj'; $labels['list'] = 'Lista'; $labels['threads'] = 'Teme'; $labels['expand-all'] = 'ProÅ¡iri sve'; -$labels['expand-unread'] = 'ProÅ¡iri neproÄitane'; +$labels['expand-unread'] = 'ProÅ¡iri neproÄitano'; $labels['collapse-all'] = 'Zatvori sve'; $labels['threaded'] = 'Tematski prikaz'; $labels['autoexpand_threads'] = 'ProÅ¡iri teme poruka'; -$labels['do_expand'] = 'Sve teme'; +$labels['do_expand'] = 'sve teme'; $labels['expand_only_unread'] = 'samo s neproÄitanim porukama'; $labels['fromto'] = 'PoÅ¡iljatelj/Primatelj'; $labels['flag'] = 'Oznaka'; $labels['attachment'] = 'Privitak'; $labels['nonesort'] = 'NiÅ¡ta'; $labels['sentdate'] = 'Datum slanja'; -$labels['arrival'] = 'Datum primanja'; +$labels['arrival'] = 'Datum primitka'; $labels['asc'] = 'uzlazno'; $labels['desc'] = 'silazno'; -$labels['listcolumns'] = 'Kolone'; -$labels['listsorting'] = 'Sortirajuća kolona'; -$labels['listorder'] = 'Sortirajući redoslijed'; +$labels['listcolumns'] = 'Stupci'; +$labels['listsorting'] = 'Sortirajući stupac'; +$labels['listorder'] = 'Redoslijed sortiranja'; $labels['listmode'] = 'Model pregleda listi'; -$labels['folderactions'] = 'Akcije mapa'; -$labels['compact'] = 'Kompresiranje'; +$labels['folderactions'] = 'Akcije mapa...'; +$labels['compact'] = 'Kompresiraj (sažmi)'; $labels['empty'] = 'Isprazni'; -$labels['quota'] = 'Kvota'; +$labels['importmessages'] = 'Uvoz poruka'; +$labels['quota'] = 'IskoriÅ¡tenost diska'; $labels['unknown'] = 'nepoznato'; -$labels['unlimited'] = 'beskonaÄna'; +$labels['unlimited'] = 'neograniÄeno'; $labels['quicksearch'] = 'Brza pretraga'; -$labels['resetsearch'] = 'Prikaži sve poruke'; +$labels['resetsearch'] = 'Vrati pretragu u poÄetno stanje'; $labels['searchmod'] = 'Postavke pretrage'; $labels['msgtext'] = 'Cijela poruka'; +$labels['body'] = 'Tijelo poruke'; +$labels['type'] = 'Tip'; +$labels['namex'] = 'Ime'; $labels['openinextwin'] = 'Otvori u novom prozoru'; -$labels['emlsave'] = 'Download (.eml)'; +$labels['emlsave'] = 'Preuzmi (.eml)'; +$labels['changeformattext'] = 'Prikaži kao obiÄan tekst'; +$labels['changeformathtml'] = 'Prikaži kao HTML'; $labels['editasnew'] = 'Uredi kao novo'; +$labels['send'] = 'PoÅ¡alji'; $labels['sendmessage'] = 'PoÅ¡alji poruku'; -$labels['savemessage'] = 'Spremi u \'PredloÅ¡ci\''; +$labels['savemessage'] = 'Spremi kao predložak'; $labels['addattachment'] = 'Priloži datoteku'; -$labels['charset'] = 'Charset'; -$labels['editortype'] = 'Tip editora'; +$labels['charset'] = 'Kodna stranica'; +$labels['editortype'] = 'Tip ureÄ‘ivaÄa teksta'; $labels['returnreceipt'] = 'Potvrda o primitku poruke'; -$labels['dsn'] = 'Potvrda o poslanoj poruci'; +$labels['dsn'] = 'Obavijest o statusu isporuke'; $labels['mailreplyintro'] = 'Dana $date, $sender je napisao(la):'; -$labels['originalmessage'] = 'Izvorna Poruka'; -$labels['editidents'] = 'Promijeni identitete'; -$labels['spellcheck'] = 'PiÅ¡i'; +$labels['originalmessage'] = 'Izvorna poruka'; +$labels['editidents'] = 'Uredi identitete'; +$labels['spellcheck'] = 'Pravopis'; $labels['checkspelling'] = 'Provjera pravopisa'; -$labels['resumeediting'] = 'Povratak u pisanje'; +$labels['resumeediting'] = 'Nastavi ureÄ‘ivanje'; $labels['revertto'] = 'Vrati na'; +$labels['restore'] = 'Povrat'; +$labels['restoremessage'] = 'Povrat poruke?'; +$labels['responses'] = 'Odgovori'; +$labels['insertresponse'] = 'Umetni odgovor'; +$labels['manageresponses'] = 'Upravljanje odgovorima'; +$labels['savenewresponse'] = 'Pohrani novi odgovor'; +$labels['editresponses'] = 'Uredi odgovore'; +$labels['editresponse'] = 'Uredi odgovor'; +$labels['responsename'] = 'Naziv'; +$labels['responsetext'] = 'Tekst odgovora'; $labels['attach'] = 'Priloži'; $labels['attachments'] = 'Privitci (Attachments)'; $labels['upload'] = 'Dodaj'; $labels['uploadprogress'] = '$percent ($current od $total)'; $labels['close'] = 'Zatvori'; -$labels['messageoptions'] = 'Opcije poruka...'; +$labels['messageoptions'] = 'Postavke poruka...'; $labels['low'] = 'Nizak'; $labels['lowest'] = 'Najniži'; $labels['normal'] = 'Srednji'; @@ -196,20 +221,23 @@ $labels['highest'] = 'NajviÅ¡i'; $labels['nosubject'] = '(bez naslova)'; $labels['showimages'] = 'Prikaži slike'; $labels['alwaysshow'] = 'Uvijek prikaži slike od $sender'; -$labels['isdraft'] = 'Ova poruka je skica (draft)'; +$labels['isdraft'] = 'Ova poruka je predložak.'; +$labels['andnmore'] = '$nr viÅ¡e...'; +$labels['togglemoreheaders'] = 'Prikaži joÅ¡ zaglavlja poruke'; +$labels['togglefullheaders'] = 'Prikaži neureÄ‘ena zaglavlja poruke'; $labels['htmltoggle'] = 'HTML'; $labels['plaintoggle'] = 'Samo tekst'; $labels['savesentmessagein'] = 'Spremi poslane poruke u'; $labels['dontsave'] = 'ne spremaj'; -$labels['maxuploadsize'] = 'Maksimalna dozvoljena velicina datoteke je $size'; +$labels['maxuploadsize'] = 'Maksimalna dozvoljena veliÄina datoteke je $size'; $labels['addcc'] = 'Dodaj Cc'; $labels['addbcc'] = 'Dodaj Bcc'; $labels['addreplyto'] = 'Dodaj Odgovori-na'; $labels['addfollowupto'] = 'Dodaj Nastavak-na'; -$labels['mdnrequest'] = 'PoÅ¡iljaoc ove poruke je tražio da bude obavijeÅ¡ten o njenom primitku. Želite li obavijestiti poÅ¡iljaoca?'; -$labels['receiptread'] = 'Vrati potvrdu (proÄitano)'; -$labels['yourmessage'] = 'Ovo je vraćena potvrda vaÅ¡e poruke'; -$labels['receiptnote'] = 'Info: Ova poruka samo potvrÄ‘uje da se poruka prikazala na raÄunalu primaoca. Nema garancije da je primaoc proÄitao ili razumio sadržaj poruke.'; +$labels['mdnrequest'] = 'PoÅ¡iljatelj ove poruke je tražio da bude obavijeÅ¡ten o njenom primitku. Želite li obavijestiti poÅ¡iljatelja?'; +$labels['receiptread'] = 'Potvrda o primitku (proÄitano)'; +$labels['yourmessage'] = 'Ovo je potvrda o primitku vaÅ¡e poruke'; +$labels['receiptnote'] = 'Info: Ova poruka o primitku samo potvrÄ‘uje da se poruka prikazala na raÄunalu primatelja. Nema garancije da je primatelj proÄitao ili razumio sadržaj poruke.'; $labels['name'] = 'Puno ime'; $labels['firstname'] = 'Ime'; $labels['surname'] = 'Prezime'; @@ -219,18 +247,18 @@ $labels['namesuffix'] = 'Sufiks'; $labels['nickname'] = 'Nadimak'; $labels['jobtitle'] = 'Titula'; $labels['department'] = 'Odjel'; -$labels['gender'] = 'Rod'; -$labels['maidenname'] = 'DjevojaÄko ime'; -$labels['email'] = 'E-Mail'; +$labels['gender'] = 'Spol'; +$labels['maidenname'] = 'DjevojaÄko prezime'; +$labels['email'] = 'E-mail'; $labels['phone'] = 'Telefon'; $labels['address'] = 'Adresa'; $labels['street'] = 'Ulica'; $labels['locality'] = 'Grad'; $labels['zipcode'] = 'PoÅ¡tanski broj'; $labels['region'] = 'Oblast'; -$labels['country'] = 'Zemlja'; +$labels['country'] = 'Država'; $labels['birthday'] = 'RoÄ‘endan'; -$labels['anniversary'] = 'Jubilej'; +$labels['anniversary'] = 'GodiÅ¡njica'; $labels['website'] = 'Web stranica'; $labels['instantmessenger'] = 'IM'; $labels['notes'] = 'BiljeÅ¡ke'; @@ -241,14 +269,14 @@ $labels['assistant'] = 'Asistent'; $labels['spouse'] = 'Suprug/a'; $labels['allfields'] = 'Sva polja'; $labels['search'] = 'Pretraga'; -$labels['advsearch'] = 'Napredna Pretraga'; +$labels['advsearch'] = 'Napredna pretraga'; $labels['advanced'] = 'Napredno'; $labels['other'] = 'Ostalo'; -$labels['typehome'] = 'Kućni broj'; -$labels['typework'] = 'Poslovni broj'; +$labels['typehome'] = 'Kuća'; +$labels['typework'] = 'Posao'; $labels['typeother'] = 'Ostalo'; $labels['typemobile'] = 'Mobitel'; -$labels['typemain'] = 'Glavni broj'; +$labels['typemain'] = 'Glavni'; $labels['typehomefax'] = 'Fax kuća'; $labels['typeworkfax'] = 'Fax posao'; $labels['typecar'] = 'Auto'; @@ -260,156 +288,187 @@ $labels['typeblog'] = 'Blog'; $labels['typeprofile'] = 'Profil'; $labels['addfield'] = 'Dodaj polje...'; $labels['addcontact'] = 'Dodaj novi kontakt'; -$labels['editcontact'] = 'Izmjeni kontakt'; +$labels['editcontact'] = 'Uredi kontakt'; $labels['contacts'] = 'Kontakti'; $labels['contactproperties'] = 'Svojstva kontakta'; $labels['personalinfo'] = 'Osobni podaci'; -$labels['edit'] = 'Izmjeni'; +$labels['edit'] = 'Uredi'; $labels['cancel'] = 'Odustani'; $labels['save'] = 'Spremi'; $labels['delete'] = 'ObriÅ¡i'; $labels['rename'] = 'Preimenuj'; $labels['addphoto'] = 'Dodaj'; -$labels['replacephoto'] = 'Smijeniti'; -$labels['newcontact'] = 'Dodaj novi kontakt'; +$labels['replacephoto'] = 'Zamijeni'; +$labels['uploadphoto'] = 'Postavi fotografiju'; +$labels['newcontact'] = 'Dodaj novu karticu kontakta'; $labels['deletecontact'] = 'ObriÅ¡i odabrane kontakte'; -$labels['composeto'] = 'NapiÅ¡i mail...'; +$labels['composeto'] = 'NapiÅ¡i mail za'; $labels['contactsfromto'] = 'Kontakti od $from do $to od ukupno $count'; -$labels['print'] = 'Print'; -$labels['export'] = 'Export'; +$labels['print'] = 'Ispis'; +$labels['export'] = 'Izvoz'; +$labels['exportall'] = 'Izvezi sve'; +$labels['exportsel'] = 'Izvezi odabrano'; $labels['exportvcards'] = 'Izvezi kontakte u vCard formatu'; -$labels['newcontactgroup'] = 'Napravi novu kontaktnu grupu'; -$labels['grouprename'] = 'Promijeni ime grupe'; -$labels['groupdelete'] = 'IzbriÅ¡i grupu'; +$labels['newcontactgroup'] = 'Napravi novu grupu kontakata'; +$labels['grouprename'] = 'Preimenuj grupu'; +$labels['groupdelete'] = 'ObriÅ¡i grupu'; +$labels['groupremoveselected'] = 'ObriÅ¡i odabrane kontakte iz grupe '; $labels['previouspage'] = 'Prethodna strana'; $labels['firstpage'] = 'Prva strana'; $labels['nextpage'] = 'Slijedeća strana'; $labels['lastpage'] = 'Zadnja strana'; $labels['group'] = 'Grupa'; $labels['groups'] = 'Grupe'; +$labels['listgroup'] = 'Prikaži Älanove grupe'; $labels['personaladrbook'] = 'Privatna adresa'; -$labels['searchsave'] = 'Pohrani pretragu'; +$labels['searchsave'] = 'Spremi pretragu'; $labels['searchdelete'] = 'ObriÅ¡i pretragu'; $labels['import'] = 'Uvoz'; $labels['importcontacts'] = 'Uvoz kontakta'; $labels['importfromfile'] = 'Uvezi iz datoteke:'; -$labels['importreplace'] = 'PrepiÅ¡i cijeli adresar'; +$labels['importtarget'] = 'Dodaj kontakte u'; +$labels['importreplace'] = 'PrepiÅ¡i cijeli imenik'; +$labels['importgroups'] = 'Uvezi zadatke grupe'; +$labels['importgroupsall'] = 'Sve (stvori grupe ako je potrebno)'; +$labels['importgroupsexisting'] = 'Samo za postojeće grupe'; +$labels['importdesc'] = 'Možete poslati kontakte iz postojećeg imenika.<br/>Trenutno je podržan uvoz adresa iz <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> ili CSV (comma-separated) formata.'; $labels['done'] = 'ZavrÅ¡eno'; $labels['settingsfor'] = 'Postavke za'; $labels['about'] = 'O programu'; $labels['preferences'] = 'Postavke'; $labels['userpreferences'] = 'KorisniÄke postavke'; -$labels['editpreferences'] = 'Izmjena postavki'; +$labels['editpreferences'] = 'Uredi korisniÄke postavke'; $labels['identities'] = 'Identiteti'; -$labels['manageidentities'] = 'Podesi identitete za ovaj nalog'; -$labels['newidentity'] = 'Dodaj identitet'; -$labels['newitem'] = 'Novo'; -$labels['edititem'] = 'Uredi'; -$labels['preferhtml'] = 'HTML format u prednosti'; -$labels['defaultcharset'] = 'Zadani skup znakova'; +$labels['manageidentities'] = 'Upravljanje identitetima za ovaj korisniÄki raÄun'; +$labels['newidentity'] = 'Novi identitet'; +$labels['newitem'] = 'Nova stavka'; +$labels['edititem'] = 'Uredi stavku'; +$labels['preferhtml'] = 'Prikaži HTML'; +$labels['defaultcharset'] = 'Zadana kodna stranica'; $labels['htmlmessage'] = 'HTML format poruke'; +$labels['messagepart'] = 'Dio'; +$labels['digitalsig'] = 'Digitalni potpis'; $labels['dateformat'] = 'Format datuma'; $labels['timeformat'] = 'Format vremena'; -$labels['prettydate'] = 'Formatiran datum'; -$labels['setdefault'] = 'Postavi predodreÄ‘eno'; +$labels['prettydate'] = 'Formatirani datum'; +$labels['setdefault'] = 'Postavi zadano'; $labels['autodetect'] = 'Auto'; $labels['language'] = 'Jezik'; $labels['timezone'] = 'Vremenska zona'; -$labels['pagesize'] = 'Redova po stranici'; +$labels['pagesize'] = 'Redaka po stranici'; $labels['signature'] = 'Potpis'; -$labels['dstactive'] = 'Automatska promjena vremena'; -$labels['htmleditor'] = 'Sastavi HTML poruke'; -$labels['htmlonreply'] = 'odgovor samo na HTML poruke'; +$labels['dstactive'] = 'Ljetno/zimsko raÄunanje vremena'; +$labels['showinextwin'] = 'Otvori poruku u novom prozoru'; +$labels['composeextwin'] = 'Sastavi poruku u novom prozoru'; +$labels['htmleditor'] = 'Sastavi poruke u HTML formatu'; +$labels['htmlonreply'] = 'pri odgovaranju na HTML poruku'; +$labels['htmlonreplyandforward'] = 'pri prosljeÄ‘ivanju ili odgovaranju na HTML poruku'; $labels['htmlsignature'] = 'HTML potpis'; +$labels['showemail'] = 'Prikaži e-mail adresu s imenom'; $labels['previewpane'] = 'Prikaži podruÄje pregleda'; -$labels['skin'] = 'Tema izgleda'; -$labels['logoutclear'] = 'OÄisti smeće pri izlazu'; -$labels['logoutcompact'] = 'Komprimiraj Inbox pri izlazu'; -$labels['uisettings'] = 'KorisniÄki interfejs'; -$labels['serversettings'] = 'Postavke servera'; -$labels['mailboxview'] = 'Pregled Mailboxa'; -$labels['mdnrequests'] = 'Obavijest poÅ¡iljatelja'; -$labels['askuser'] = 'pitaj korisnika'; -$labels['autosend'] = 'Å¡alji automatski'; -$labels['autosendknown'] = 'Dodaj primatelja u moje kontakte, u suprotnom me pitaj'; -$labels['autosendknownignore'] = 'Dodaj primatelja u moje kontakte, u suprotnom zanemari'; +$labels['skin'] = 'Tema suÄelja'; +$labels['logoutclear'] = 'OÄisti smeće pri odjavi'; +$labels['logoutcompact'] = 'Sažmi Inbox pri odjavi'; +$labels['uisettings'] = 'KorisniÄko suÄelje'; +$labels['serversettings'] = 'Postavke poslužitelja'; +$labels['mailboxview'] = 'Pregled sanduÄića'; +$labels['mdnrequests'] = 'na zahtjev za potvrdom primitka'; +$labels['askuser'] = 'pitaj me'; +$labels['autosend'] = 'poÅ¡alji potvrdu'; +$labels['autosendknown'] = 'poÅ¡alji potvrdu ako je poÅ¡iljatelj u mom imeniku, u suprotnom me pitaj'; +$labels['autosendknownignore'] = 'poÅ¡alji potvrdu ako je poÅ¡iljatelj u mom imeniku, u suprotnom zanemari'; $labels['ignore'] = 'zanemari'; $labels['readwhendeleted'] = 'OznaÄi poruku kao proÄitanu pri brisanju'; $labels['flagfordeletion'] = 'OznaÄi poruku za brisanje umjesto brisanja'; -$labels['skipdeleted'] = 'Ne prikazivaj pobrisane poruke'; -$labels['deletealways'] = 'Ukoliko premjeÅ¡tanje poruka u mapu otpad ne uspije, izbrÅ¡i poruku'; -$labels['showremoteimages'] = 'Prikaži slike s interneta'; +$labels['skipdeleted'] = 'Ne prikazuj obrisane poruke'; +$labels['deletealways'] = 'Ukoliko premjeÅ¡tanje poruka u mapu smeće ne uspije, izbriÅ¡i poruku'; +$labels['deletejunk'] = 'Odmah obriÅ¡i poruke u mapi Smeće'; +$labels['showremoteimages'] = 'Prikaži umetnute slike s interneta'; $labels['fromknownsenders'] = 'od poznatih poÅ¡iljatelja'; $labels['always'] = 'uvijek'; -$labels['showinlineimages'] = 'Prikaži slike ispod poruke'; -$labels['autosavedraft'] = 'Automatski spremi draft'; +$labels['showinlineimages'] = 'Prikaži slike iz privitka ispod poruke'; +$labels['autosavedraft'] = 'Automatski spremi predložak'; $labels['everynminutes'] = 'svakih $n minuta'; -$labels['never'] = 'nikada'; +$labels['refreshinterval'] = 'Osvježi (provjeri nove poruke, itd.)'; +$labels['never'] = 'nikad'; $labels['immediately'] = 'odmah'; -$labels['messagesdisplaying'] = 'Prikazujem poruke'; -$labels['messagescomposition'] = 'Komponiram poruke'; +$labels['messagesdisplaying'] = 'Prikaz poruka'; +$labels['messagescomposition'] = 'Sastavljanje poruka'; $labels['mimeparamfolding'] = 'Nazivi privitaka'; -$labels['2231folding'] = 'Full RFC 2231 (Thunderbird)'; +$labels['2231folding'] = 'Prema RFC 2231 (Thunderbird)'; $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)'; -$labels['2047folding'] = 'Full RFC 2047 (ostali)'; -$labels['force7bit'] = 'Koristi MIME postavke za 8-bitne znakove'; +$labels['2047folding'] = 'Prema RFC 2047 (ostali)'; +$labels['force7bit'] = 'Koristi MIME kodiranje za 8-bitne znakove'; $labels['advancedoptions'] = 'Napredne postavke'; -$labels['focusonnewmessage'] = 'Fokusiraj browser pri novoj poruci'; +$labels['focusonnewmessage'] = 'Fokusiraj prozor preglednika pri primitku nove poruke'; $labels['checkallfolders'] = 'Provjeri nove poruke u svim mapama'; $labels['displaynext'] = 'Nakon brisanja/micanja poruke, prikaži slijedeću'; -$labels['defaultfont'] = 'PredodreÄ‘eni font HTML poruke'; +$labels['defaultfont'] = 'Zadani font HTML poruke'; $labels['mainoptions'] = 'Glavne postavke'; -$labels['section'] = 'Sekcija'; +$labels['browseroptions'] = 'Postavke preglednika'; +$labels['section'] = 'Odjeljak'; $labels['maintenance'] = 'Održavanje'; $labels['newmessage'] = 'Nova poruka'; $labels['signatureoptions'] = 'Postavke potpisa'; $labels['whenreplying'] = 'Prilikom odgovora'; -$labels['replytopposting'] = 'zapoÄni novu poruku iznad originala'; -$labels['replybottomposting'] = 'zapoÄni novu poruku ispod originala'; +$labels['replyempty'] = 'ne citiraj originalnu poruku'; +$labels['replytopposting'] = 'zapoÄni novu poruku iznad originalne'; +$labels['replybottomposting'] = 'zapoÄni novu poruku ispod originalne'; $labels['replyremovesignature'] = 'Kod odgovaranja, makni originalni potpis iz poruke'; $labels['autoaddsignature'] = 'Automatski dodaj potpis'; -$labels['newmessageonly'] = 'samo nova poruka'; -$labels['replyandforwardonly'] = 'samo odgovori i proslijeÄ‘ivanja'; +$labels['newmessageonly'] = 'samo za nove poruke'; +$labels['replyandforwardonly'] = 'samo pri odgovaranju i proslijeÄ‘ivanju'; $labels['insertsignature'] = 'Umetni potpis'; $labels['previewpanemarkread'] = 'Obilježi pregledane poruke kao proÄitane'; $labels['afternseconds'] = 'nakon $n sekundi'; -$labels['reqmdn'] = 'Uvijek zatraži potvrdu o primitku poruke'; -$labels['reqdsn'] = 'Uvijek zatraži potvrdu o slanju poruke'; -$labels['replysamefolder'] = 'Spremi odgovore u mapu gdje se nalazi poruka'; +$labels['reqmdn'] = 'Uvijek zatraži potvrdu o primitku'; +$labels['reqdsn'] = 'Uvijek zatraži obavijest o stanju isporuke'; +$labels['replysamefolder'] = 'Spremi odgovore u mapu gdje se nalazi originalna poruka'; +$labels['defaultabook'] = 'Zadani imenik'; $labels['autocompletesingle'] = 'PreskoÄi alternativne email adrese u autocomplete prijedlozima'; +$labels['listnamedisplay'] = 'Prikaži kontakte kao'; $labels['spellcheckbeforesend'] = 'Provjeri pravopis prije slanja poruke'; $labels['spellcheckoptions'] = 'Postavke provjere pravopisa'; -$labels['spellcheckignoresyms'] = 'Ignoriraj rijeÄi koje sadrže simbole'; -$labels['spellcheckignorenums'] = 'Ignoriraj rijeÄi koje sadrže brojeve'; -$labels['spellcheckignorecaps'] = 'Ignoriraj rijeÄi sa sa svim velikim slovima'; +$labels['spellcheckignoresyms'] = 'Zanemari rijeÄi koje sadrže simbole'; +$labels['spellcheckignorenums'] = 'Zanemari rijeÄi koje sadrže brojeve'; +$labels['spellcheckignorecaps'] = 'Zanemari rijeÄi sa svim velikim slovima'; $labels['addtodict'] = 'Dodaj u rjeÄnik'; +$labels['mailtoprotohandler'] = 'Registriraj upravitelj protokola za mailto: linkove'; +$labels['standardwindows'] = 'Tretiraj skoÄne prozore kao standardne'; +$labels['forwardmode'] = 'ProsljeÄ‘ivanje poruka'; +$labels['inline'] = 'umetnuto'; +$labels['asattachment'] = 'kao privitak'; +$labels['replyallmode'] = 'Zadana akcija [Reply all] gumba'; +$labels['replyalldefault'] = 'odgovori svima'; +$labels['replyalllist'] = 'odgovori samo listi (ako postoji)'; $labels['folder'] = 'Mapa'; $labels['folders'] = 'Mape'; -$labels['foldername'] = 'Ime mape'; -$labels['subscribed'] = 'Pretplata'; +$labels['foldername'] = 'Naziv mape'; +$labels['subscribed'] = 'Pretplaćen'; $labels['messagecount'] = 'Poruke'; -$labels['create'] = 'Napravi'; -$labels['createfolder'] = 'Napravi novu mapu'; -$labels['managefolders'] = 'Podesi mapu'; -$labels['specialfolders'] = 'Specijalna mapa'; +$labels['create'] = 'Stvori'; +$labels['createfolder'] = 'Stvori novu mapu'; +$labels['managefolders'] = 'Upravljanje mapama'; +$labels['specialfolders'] = 'Specijalne mape'; $labels['properties'] = 'Svojstva'; $labels['folderproperties'] = 'Svojstva mape'; -$labels['parentfolder'] = 'Glavna fascikla'; +$labels['parentfolder'] = 'Glavna mapa'; $labels['location'] = 'Lokacija'; -$labels['info'] = 'Informacija'; -$labels['getfoldersize'] = 'Kliknite da biste dobili veliÄinu mape'; -$labels['changesubscription'] = 'Kliknite da biste promjenili pretplatu'; +$labels['info'] = 'Informacije'; +$labels['getfoldersize'] = 'Kliknite za prikaz veliÄine mape'; +$labels['changesubscription'] = 'Kliknite da biste promijenili pretplatu'; $labels['foldertype'] = 'Vrsta mape'; $labels['personalfolder'] = 'Privatna mapa'; -$labels['otherfolder'] = 'Mapa drugih korisnika'; +$labels['otherfolder'] = 'Mapa drugog korisnika'; $labels['sharedfolder'] = 'Javna mapa'; $labels['sortby'] = 'Sortiraj po'; -$labels['sortasc'] = 'Sortiraj rastućim nizom'; -$labels['sortdesc'] = 'Sortiraj opadajućim nizom'; +$labels['sortasc'] = 'Sortiraj uzlaznim nizom'; +$labels['sortdesc'] = 'Sortiraj silaznim nizom'; $labels['undo'] = 'PoniÅ¡ti'; -$labels['plugin'] = 'Plugin'; +$labels['installedplugins'] = 'Instalirani dodaci'; +$labels['plugin'] = 'Dodatak'; $labels['version'] = 'InaÄica'; -$labels['source'] = 'Izvor'; +$labels['source'] = 'Izvorni kod'; $labels['license'] = 'Licenca'; $labels['support'] = 'PodrÅ¡ka'; $labels['B'] = 'B'; @@ -418,16 +477,16 @@ $labels['MB'] = 'MB'; $labels['GB'] = 'GB'; $labels['unicode'] = 'Unicode'; $labels['english'] = 'Engleski'; -$labels['westerneuropean'] = 'Zapadno Evropski'; -$labels['easterneuropean'] = 'IstoÄno Evropski'; -$labels['southeasterneuropean'] = 'Južno-IstoÄni Evropski'; -$labels['baltic'] = 'BalitÄki'; -$labels['cyrillic'] = 'ÄŒirilÄni'; +$labels['westerneuropean'] = 'Zapadnoeuropski'; +$labels['easterneuropean'] = 'IstoÄnoeuropski'; +$labels['southeasterneuropean'] = 'JugoistoÄnoeuropski'; +$labels['baltic'] = 'BaltiÄki'; +$labels['cyrillic'] = 'ÄŒirilićni'; $labels['arabic'] = 'Arapski'; $labels['greek'] = 'GrÄki'; -$labels['hebrew'] = 'Hibru'; +$labels['hebrew'] = 'Hebrejski'; $labels['turkish'] = 'Turski'; -$labels['nordic'] = 'Nordski'; +$labels['nordic'] = 'Nordijski'; $labels['thai'] = 'Tajlandski'; $labels['celtic'] = 'Keltski'; $labels['vietnamese'] = 'Vijetnamski'; diff --git a/program/localization/hr_HR/messages.inc b/program/localization/hr_HR/messages.inc index 2e51848eb..0baeb2908 100644 --- a/program/localization/hr_HR/messages.inc +++ b/program/localization/hr_HR/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -15,139 +15,161 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/messages/ */ -$messages['loginfailed'] = 'Prijava neuspjeÅ¡na'; -$messages['cookiesdisabled'] = 'VaÅ¡ Web preglednik ne podržava kolaÄiće (cookies)'; -$messages['sessionerror'] = 'Morate se ponovno ulogirati'; -$messages['storageerror'] = 'NeuspjeÅ¡na veza na IMAP server'; -$messages['servererror'] = 'GreÅ¡ka poslužitelja'; -$messages['servererrormsg'] = 'GreÅ¡ka na serveru: $msg'; +$messages['errortitle'] = 'Dogodila se greÅ¡ka!'; +$messages['loginfailed'] = 'Prijava neuspjeÅ¡na.'; +$messages['cookiesdisabled'] = 'VaÅ¡ preglednik ne prihvaća kolaÄiće.'; +$messages['sessionerror'] = 'VaÅ¡a sesija je nevaljala ili istekla.'; +$messages['storageerror'] = 'NeuspjeÅ¡no povezivanje na IMAP poslužitelj.'; +$messages['servererror'] = 'GreÅ¡ka poslužitelja!'; +$messages['servererrormsg'] = 'GreÅ¡ka poslužitelja: $msg'; $messages['dberror'] = 'GreÅ¡ka baze podataka!'; -$messages['errorreadonly'] = 'Nemoguća izvedba operacije. Mapa je samo za Äitanje.'; -$messages['errornoperm'] = 'Nemoguća izvedba operacije. Dozvola odbijena.'; -$messages['invalidrequest'] = 'Nepravilan zahtijev! Podaci nisu spremljeni.'; -$messages['nomessagesfound'] = 'Nema poruka u sanduÄiću'; -$messages['loggedout'] = 'UspjeÅ¡no ste se odjavili. Zbogom!'; -$messages['mailboxempty'] = 'SanduÄuć je prazan'; +$messages['requesttimedout'] = 'Zahtjev istekao'; +$messages['errorreadonly'] = 'Nemoguće izvrÅ¡iti operaciju. Mapa je samo za Äitanje.'; +$messages['errornoperm'] = 'Nemoguće izvrÅ¡iti operaciju. Nije dozvoljen pristup.'; +$messages['erroroverquota'] = 'Nemoguće izvrÅ¡iti operaciju. Nema prostora na disku.'; +$messages['erroroverquotadelete'] = 'Nema prostora na disku. Upotrijebite SHIFT+DEL za brisanje poruka.'; +$messages['invalidrequest'] = 'Neispravan zahtjev! Podaci nisu spremljeni.'; +$messages['invalidhost'] = 'Neispravno ime poslužitelja.'; +$messages['nomessagesfound'] = 'Nema poruka u ovom sanduÄiću.'; +$messages['loggedout'] = 'UspjeÅ¡no ste se odjavili. DoviÄ‘enja!'; +$messages['refreshing'] = 'Osvježavanje...'; $messages['loading'] = 'UÄitavanje...'; -$messages['uploading'] = 'Prenosim datoteku...'; -$messages['uploadingmany'] = 'Prenosim datoteke...'; +$messages['uploading'] = 'Postavljanje datoteke...'; +$messages['uploadingmany'] = 'Postavljanje datoteka...'; $messages['loadingdata'] = 'UÄitavanje podataka...'; $messages['checkingmail'] = 'Provjera novih poruka u tijeku...'; -$messages['sendingmessage'] = 'Poruka se Å¡alje...'; -$messages['messagesent'] = 'Poruka je uspjeÅ¡no poslana'; -$messages['savingmessage'] = 'Poruka se sprema...'; -$messages['messagesaved'] = 'Poruka uspjeÅ¡no spremljena u \'PredloÅ¡ci\''; -$messages['successfullysaved'] = 'Spremanje uspjeÅ¡no obavljeno'; -$messages['addedsuccessfully'] = 'Kontakt uspjeÅ¡no dodan u imenik'; -$messages['contactexists'] = 'Kontakt sa ovom e-mail adresom već postoji u imeniku'; -$messages['contactnameexists'] = 'Kontak s istim imenom već postoji.'; -$messages['blockedimages'] = 'Zbog zaÅ¡tite privatnosti, slike sa udaljenih servera su blokirane.'; -$messages['encryptedmessage'] = 'Ova poruka je zaÅ¡tićena pa se ne može prikazati'; -$messages['nocontactsfound'] = 'Imenik je prazan'; -$messages['contactnotfound'] = 'Traženi kontakt nije pronaÄ‘en'; -$messages['contactsearchonly'] = 'UpiÅ¡ite nekoliko pojmova za pretragu imenika'; -$messages['sendingfailed'] = 'GreÅ¡ka pri slanju poruke'; -$messages['senttooquickly'] = 'Molimo saÄekajte $sec sek. prije slanja ove poruke'; -$messages['errormoving'] = 'GreÅ¡ka pri premjeÅ¡tanju poruke'; -$messages['errorcopying'] = 'GreÅ¡ka pri kopiranju poruke'; -$messages['errordeleting'] = 'GreÅ¡ka pri brisanju poruke'; -$messages['errormarking'] = 'Nije moguće oznaÄiti poruku'; -$messages['deletecontactconfirm'] = 'Želite li obrisati izabrane kontakte?'; +$messages['sendingmessage'] = 'Slanje poruke...'; +$messages['messagesent'] = 'Poruka uspjeÅ¡no poslana.'; +$messages['savingmessage'] = 'Spremanje poruke...'; +$messages['messagesaved'] = 'Poruka spremljena u mapu PredloÅ¡ci.'; +$messages['successfullysaved'] = 'UspjeÅ¡no spremljeno.'; +$messages['savingresponse'] = 'Spremanje teksta odgovora...'; +$messages['deleteresponseconfirm'] = 'Jeste li sigurni da želite obrisati tekst ovog odgovora?'; +$messages['addedsuccessfully'] = 'Kontakt uspjeÅ¡no dodan u imenik.'; +$messages['contactexists'] = 'Kontakt sa istom e-mail adresom već postoji.'; +$messages['contactnameexists'] = 'Kontakt istog imena već postoji.'; +$messages['blockedimages'] = 'Zbog zaÅ¡tite privatnosti, slike sa interneta su blokirane u ovoj poruci.'; +$messages['encryptedmessage'] = 'Ova poruka je Å¡ifrirana i ne može se prikazati.'; +$messages['nocontactsfound'] = 'Imenik je prazan.'; +$messages['contactnotfound'] = 'Traženi kontakt nije pronaÄ‘en.'; +$messages['contactsearchonly'] = 'UpiÅ¡ite neke pojmove za pretragu imenika'; +$messages['sendingfailed'] = 'Slanje poruke nije uspjelo.'; +$messages['senttooquickly'] = 'Molimo saÄekajte $sec sek. prije slanja ove poruke.'; +$messages['errorsavingsent'] = 'GreÅ¡ka pri spremanju poslane poruke.'; +$messages['errorsaving'] = 'GreÅ¡ka pri spremanju.'; +$messages['errormoving'] = 'GreÅ¡ka pri premjeÅ¡tanju poruke(a).'; +$messages['errorcopying'] = 'GreÅ¡ka pri kopiranju poruke(a).'; +$messages['errordeleting'] = 'GreÅ¡ka pri brisanju poruke(a).'; +$messages['errormarking'] = 'GreÅ¡ka pri oznaÄavanju poruke(a).'; +$messages['deletecontactconfirm'] = 'Jeste li sigurni da želite obrisati odabrani kontakt(e)?'; $messages['deletegroupconfirm'] = 'Jeste li sigurni da želite obrisati odabranu grupu?'; -$messages['deletemessagesconfirm'] = 'Sigurno želite obrisati odabrane poruke?'; -$messages['deletefolderconfirm'] = 'Želite li obrisati ovu mapu?'; -$messages['purgefolderconfirm'] = 'Želite li obrisati sve poruke u mapi?'; -$messages['contactdeleting'] = 'BriÅ¡em kontakt(e)...'; -$messages['groupdeleting'] = 'BriÅ¡em grupu...'; -$messages['folderdeleting'] = 'BriÅ¡em mapu...'; -$messages['foldermoving'] = 'PremjeÅ¡tam mapu...'; -$messages['foldersubscribing'] = 'Pretplata na mapu...'; +$messages['deletemessagesconfirm'] = 'Jeste li sigurni da želite obrisati odabranu poruku(e)?'; +$messages['deletefolderconfirm'] = 'Jeste li sigurni da želite obrisati mapu?'; +$messages['purgefolderconfirm'] = 'Jeste li sigurni da želite obrisati sve poruke u mapi?'; +$messages['contactdeleting'] = 'Brisanje kontak(a)ta...'; +$messages['groupdeleting'] = 'Brisanje grupe...'; +$messages['folderdeleting'] = 'Brisanje mape...'; +$messages['foldermoving'] = 'PremjeÅ¡tanje mape...'; +$messages['foldersubscribing'] = 'Pretplaćivanje na mapu...'; $messages['folderunsubscribing'] = 'PoniÅ¡tavanje pretplate na mapu...'; -$messages['formincomplete'] = 'Obrazac nije u cjelosti popunjen'; -$messages['noemailwarning'] = 'Unesite valjanu e-mail adresu'; -$messages['nonamewarning'] = 'Unesite ime'; -$messages['nopagesizewarning'] = 'Unesite veliÄinu stranice'; -$messages['nosenderwarning'] = 'Unesite e-mail adresu poÅ¡iljatelja'; -$messages['norecipientwarning'] = 'Unesite primatelja (ZA)'; +$messages['formincomplete'] = 'Obrazac nije u cjelosti popunjen.'; +$messages['noemailwarning'] = 'Unesite ispravnu e-mail adresu.'; +$messages['nonamewarning'] = 'Unesite ime.'; +$messages['nopagesizewarning'] = 'Unesite veliÄinu stranice.'; +$messages['nosenderwarning'] = 'Unesite e-mail adresu poÅ¡iljatelja.'; +$messages['norecipientwarning'] = 'Unesite barem jednog primatelja.'; $messages['nosubjectwarning'] = 'Polje \'Naslov\' je prazno. Želite li unijeti naslov?'; $messages['nobodywarning'] = 'Želite li poslati poruku bez teksta?'; $messages['notsentwarning'] = 'Poruka nije poslana. Želite li odbaciti ovu poruku?'; -$messages['noldapserver'] = 'Unesite LDAP poslužitelj za pretragu'; -$messages['nosearchname'] = 'Unesite ime ili e-mail adresu'; -$messages['notuploadedwarning'] = 'Svi prilozi joÅ¡ nisu presnimljeni na poslužitelj. Molim priÄekajte ili zaustavite prsnimavanje.'; -$messages['searchsuccessful'] = 'Broj pronaÄ‘enih poruka: $nr'; -$messages['contactsearchsuccessful'] = '$nr kontakata pronaÄ‘eno.'; -$messages['searchnomatch'] = 'Traženi termin nije pronaÄ‘en ni u jednoj poruci'; -$messages['searching'] = 'Pretraga u tijeku...'; +$messages['restoresavedcomposedata'] = 'PronaÄ‘ena je zapoÄeta, ali neposlana poruka .\n\nNaslov: $subject\nSnimljeno: $date\n\nŽelite li je prikazati?'; +$messages['noldapserver'] = 'Odaberite LDAP poslužitelj za pretragu.'; +$messages['nosearchname'] = 'Unesite ime ili e-mail adresu.'; +$messages['notuploadedwarning'] = 'Svi privitci joÅ¡ nisu postavljeni na poslužitelj. Molim priÄekajte ili zaustavite postavljanje.'; +$messages['searchsuccessful'] = 'PronaÄ‘eno $nr poruka.'; +$messages['contactsearchsuccessful'] = 'PronaÄ‘eno $nr kontakata.'; +$messages['searchnomatch'] = 'Pretraga nije vratila nijedan rezultat.'; +$messages['searching'] = 'Pretraživanje u tijeku...'; $messages['checking'] = 'Provjera u tijeku...'; -$messages['nospellerrors'] = 'Nije pronaÄ‘ena niti jedna pravopisna greÅ¡ka'; -$messages['folderdeleted'] = 'Mapa uspjeÅ¡no obrisana'; -$messages['foldersubscribed'] = 'Mapa uspjeÅ¡no pretplaćena'; -$messages['folderunsubscribed'] = 'Pretplata na mapu uspjeÅ¡no poniÅ¡tena'; -$messages['folderpurged'] = 'Mapa uspjeÅ¡no ispražnjena'; -$messages['folderexpunged'] = 'Mapa uspjeÅ¡no zbijena'; -$messages['deletedsuccessfully'] = 'UspjeÅ¡no obrisano'; -$messages['converting'] = 'Formatiranje poruke'; -$messages['messageopenerror'] = 'UÄitavanje poruke nije uspjelo'; -$messages['fileuploaderror'] = 'Prijenos datoteke nije uspio'; -$messages['filesizeerror'] = 'Datoteka je prevelika. Maksimalna veliÄina je $size'; -$messages['sourceisreadonly'] = 'Ovaj resurs adresa je samo za Äitanje'; -$messages['errorsavingcontact'] = 'Nije uspjelo spremanje adrese kontakta'; -$messages['movingmessage'] = 'PremjeÅ¡tanje poruke...'; -$messages['copyingmessage'] = 'Kopiranje poruke...'; -$messages['copyingcontact'] = 'Kopiram kontakt(e)...'; -$messages['deletingmessage'] = 'Brisanje poruke...'; -$messages['markingmessage'] = 'OznaÄavanje poruke...'; -$messages['addingmember'] = 'Dodajem kontakt(e) u grupu...'; -$messages['removingmember'] = 'Izbacujem kontakt(e) iz groupe...'; -$messages['receiptsent'] = 'UspjeÅ¡no poslana potvrda (proÄitano)'; -$messages['errorsendingreceipt'] = 'Ne može poslati potvrdu'; -$messages['deleteidentityconfirm'] = 'Jeste li sigurni da želite obrisati profil?'; -$messages['nodeletelastidentity'] = 'Ne možete izbrisati zadnji identitet.'; -$messages['forbiddencharacter'] = 'Naziv mape sadrži zabranjene znakove'; -$messages['selectimportfile'] = 'Odaberite datoteku za prijenos'; -$messages['addresswriterror'] = 'U odabrani adresar nije moguće zapisivat...'; -$messages['contactaddedtogroup'] = 'Kontakti uspjeÅ¡no dodani ovoj grupi'; -$messages['contactremovedfromgroup'] = 'Kontakti uspjeÅ¡no izbrisani iz ove grupe'; -$messages['importwait'] = 'Uvozim, molimo saÄekajte...'; -$messages['importconfirm'] = '<b>UspjeÅ¡no je uvezeno $inserted kontakt(a), preskoÄeno $skipped već postojećih</b>:<p><em>$names</em></p>'; +$messages['nospellerrors'] = 'Nije pronaÄ‘ena nijedna pravopisna greÅ¡ka.'; +$messages['folderdeleted'] = 'Mapa uspjeÅ¡no obrisana.'; +$messages['foldersubscribed'] = 'Mapa uspjeÅ¡no pretplaćena.'; +$messages['folderunsubscribed'] = 'Pretplata na mapu uspjeÅ¡no poniÅ¡tena.'; +$messages['folderpurged'] = 'Mapa uspjeÅ¡no ispražnjena.'; +$messages['folderexpunged'] = 'Mapa uspjeÅ¡no sažeta.'; +$messages['deletedsuccessfully'] = 'UspjeÅ¡no obrisano.'; +$messages['converting'] = 'Uklanjanje formatiranja poruke...'; +$messages['messageopenerror'] = 'UÄitavanje poruke s poslužitelja nije uspjelo.'; +$messages['fileuploaderror'] = 'Postavljanje datoteke nije uspjelo.'; +$messages['filesizeerror'] = 'Postavljena datoteka prelazi maksimalna veliÄinu od $size.'; +$messages['copysuccess'] = 'UspjeÅ¡no kopirano $n kontakata.'; +$messages['movesuccess'] = 'UspjeÅ¡no premjeÅ¡teno $n kontakata.'; +$messages['copyerror'] = 'Kopiranje kontakata nije uspjelo.'; +$messages['moveerror'] = 'PremjeÅ¡tanje kontakata nije uspjelo.'; +$messages['sourceisreadonly'] = 'Ovaj izvor adresa je samo za Äitanje.'; +$messages['errorsavingcontact'] = 'Spremanje adrese kontakta nije uspjelo.'; +$messages['movingmessage'] = 'PremjeÅ¡tanje poruke(a)...'; +$messages['copyingmessage'] = 'Kopiranje poruke(a)...'; +$messages['copyingcontact'] = 'Kopiranje kontak(a)ta...'; +$messages['movingcontact'] = 'PremjeÅ¡tanje kontakata...'; +$messages['deletingmessage'] = 'Brisanje poruke(a)...'; +$messages['markingmessage'] = 'OznaÄavanje poruke(a)...'; +$messages['addingmember'] = 'Dodavanje kontak(a)ta u grupu...'; +$messages['removingmember'] = 'Brisanje kontak(a)ta iz grupe...'; +$messages['receiptsent'] = 'Potvrda o primitku uspjeÅ¡no poslana.'; +$messages['errorsendingreceipt'] = 'Slanje potvrde o primitku nije uspjelo.'; +$messages['deleteidentityconfirm'] = 'Jeste li sigurni da želite obrisati ovaj identitet?'; +$messages['nodeletelastidentity'] = 'Jedini preostali identitet nije moguće obrisati.'; +$messages['forbiddencharacter'] = 'Naziv mape sadrži zabranjene znakove.'; +$messages['selectimportfile'] = 'Odaberite datoteku za postavljanje.'; +$messages['addresswriterror'] = 'U odabrani imenik nije omogućeno pisanje.'; +$messages['contactaddedtogroup'] = 'Kontakti uspjeÅ¡no dodani u grupu.'; +$messages['contactremovedfromgroup'] = 'Kontakti uspjeÅ¡no obrisani iz grupe.'; +$messages['nogroupassignmentschanged'] = 'Nema promjene u zadacima grupa.'; +$messages['importwait'] = 'Uvoz, molim priÄekajte...'; +$messages['importformaterror'] = 'Uvoz nije uspio! Postavljena datoteka nije ispravnog formata za uvoz.'; +$messages['importconfirm'] = '<b>UspjeÅ¡no uvezeno $inserted kontakta</b>'; $messages['importconfirmskipped'] = '<b>PreskoÄeno $skipped postojećih unosa</b>'; +$messages['importmessagesuccess'] = 'UspjeÅ¡no uvezeno $nr poruka'; +$messages['importmessageerror'] = 'Uvoz neuspjeÅ¡an! Datoteka nije u formatu poruke ili sanduÄića'; $messages['opnotpermitted'] = 'Operacija nije dozvoljena!'; -$messages['nofromaddress'] = 'Nije upisana e-mail adresa u odabrani identitet'; -$messages['editorwarning'] = 'Prebacivanje u Äisti tekstualni ureÄ‘ivaÄ Ä‡e prouzrokovati gubljenje formatiranje teksta. Želite li nastaviti?'; -$messages['httpreceivedencrypterror'] = 'Dogodila se fatalna greÅ¡ka u konfiguraciji. Odmah kontaktirajte administratora. <b>VaÅ¡a poruka se nemože poslati.</b>'; -$messages['smtpconnerror'] = 'SMTP GreÅ¡ka ($code): Veza na server nije uspjela'; -$messages['smtpautherror'] = 'SMTP GreÅ¡ka ($code): Autentikacija nije uspjela'; -$messages['smtpfromerror'] = 'SMTP GreÅ¡ka ($code): Nije uspjelo postavljanje poÅ¡iljatelja "$from" ($msg)'; -$messages['smtptoerror'] = 'SMTP GreÅ¡ka ($code): Nije uspjelo dodavanje primatelja "$to" ($msg)'; -$messages['smtprecipientserror'] = 'SMTP GreÅ¡ka: Nije moguće proÄitati listu primatelja'; -$messages['smtperror'] = 'SMTP GreÅ¡ka: $msg'; -$messages['emailformaterror'] = 'Nepravilna e-mail adresa: $email'; +$messages['nofromaddress'] = 'Nije upisana e-mail adresa u odabrani identitet.'; +$messages['editorwarning'] = 'Prebacivanje u Äisti tekstualni ureÄ‘ivaÄ Ä‡e uzrokovati gubljenje formatiranja teksta. Želite li nastaviti?'; +$messages['httpreceivedencrypterror'] = 'Dogodila se fatalna greÅ¡ka u konfiguraciji. Odmah kontaktirajte administratora. <b>VaÅ¡a poruka se ne može poslati.</b>'; +$messages['smtpconnerror'] = 'SMTP greÅ¡ka ($code): Povezivanje na poslužitelj nije uspjelo.'; +$messages['smtpautherror'] = 'SMTP greÅ¡ka ($code): Autentikacija nije uspjela.'; +$messages['smtpfromerror'] = 'SMTP greÅ¡ka ($code): Postavljanje poÅ¡iljatelja "$from" ($msg) nije uspjelo.'; +$messages['smtptoerror'] = 'SMTP greÅ¡ka ($code): Dodavanje primatelja "$to" ($msg) nije uspjelo.'; +$messages['smtprecipientserror'] = 'SMTP greÅ¡ka: Nije moguće proÄitati listu primatelja.'; +$messages['smtperror'] = 'SMTP greÅ¡ka: $msg'; +$messages['emailformaterror'] = 'Neispravna e-mail adresa: $email'; $messages['toomanyrecipients'] = 'PreviÅ¡e primatelja. Smanjite broj primatelja na $max.'; -$messages['maxgroupmembersreached'] = 'Broj Älanova grupe prelazi preko maximuma od $max'; +$messages['maxgroupmembersreached'] = 'Broj Älanova grupe prelazi maksimalni broj od $max.'; +$messages['internalerror'] = 'Dogodila se interna greÅ¡ka. Molimo pokuÅ¡ajte ponovno.'; $messages['contactdelerror'] = 'Kontakti ne mogu biti obrisani.'; $messages['contactdeleted'] = 'Kontakti uspjeÅ¡no obrisani.'; $messages['contactrestoreerror'] = 'Ne mogu vratiti obrisan(e) kontakt(e).'; -$messages['contactrestored'] = 'Kontakt(i) uspjeÅ¡no vraćeni .'; +$messages['contactrestored'] = 'Kontakt(i) uspjeÅ¡no vraćeni.'; $messages['groupdeleted'] = 'Grupa uspjeÅ¡no obrisana.'; $messages['grouprenamed'] = 'Grupa uspjeÅ¡no preimenovana.'; -$messages['groupcreated'] = 'Grupa uspjeÅ¡no kreirana.'; +$messages['groupcreated'] = 'Grupa uspjeÅ¡no stvorena.'; $messages['savedsearchdeleted'] = 'Pohranjena pretraga uspjeÅ¡no obrisana.'; -$messages['savedsearchdeleteerror'] = 'Ne mogu obrisati pohranjenu pretragu'; +$messages['savedsearchdeleteerror'] = 'Ne mogu obrisati pohranjenu pretragu.'; $messages['savedsearchcreated'] = 'Pohranjena pretraga uspjeÅ¡no stvorena.'; $messages['savedsearchcreateerror'] = 'Ne mogu stvoriti pohranjenu pretragu.'; $messages['messagedeleted'] = 'Poruke uspjeÅ¡no obrisane.'; -$messages['messagemoved'] = 'Poruke uspjeÅ¡no pomjerene.'; +$messages['messagemoved'] = 'Poruke uspjeÅ¡no premjeÅ¡tene.'; $messages['messagecopied'] = 'Poruke uspjeÅ¡no kopirane.'; $messages['messagemarked'] = 'Poruke uspjeÅ¡no oznaÄene.'; $messages['autocompletechars'] = 'Unesite barem $min znakova za auto-dopunjavanje.'; $messages['autocompletemore'] = 'ViÅ¡e podudarajućih zapisa pronaÄ‘eno. Molim upiÅ¡ite joÅ¡ znakova.'; -$messages['namecannotbeempty'] = 'Polje za ime ne može biti prazno.'; -$messages['nametoolong'] = 'Ime predugo.'; -$messages['folderupdated'] = 'Ažuriranje mape uspjeÅ¡no.'; -$messages['foldercreated'] = 'Kreiranje mape uspjeÅ¡no.'; +$messages['namecannotbeempty'] = 'Ime ne može biti prazno.'; +$messages['nametoolong'] = 'Ime je predugaÄko.'; +$messages['folderupdated'] = 'Mapa uspjeÅ¡no ažurirana.'; +$messages['foldercreated'] = 'Mapa uspjeÅ¡no stvorena.'; $messages['invalidimageformat'] = 'Format slike nije ispravan.'; -$messages['mispellingsfound'] = 'GreÅ¡ke pravopisa su pronaÄ‘ene u poruci.'; -$messages['parentnotwritable'] = 'Nije moguće stvoriti/pomaknuti mapu u odabranu mapu. Nemate prava pristupa.'; -$messages['messagetoobig'] = 'Dio poruke je prevelik za procesiranje.'; +$messages['mispellingsfound'] = 'Poruka sadrži pravopisne greÅ¡ke.'; +$messages['parentnotwritable'] = 'Nije moguće stvoriti/pomaknuti mapu u odabranoj mapi. Nemate pravo pristupa.'; +$messages['messagetoobig'] = 'Dio poruke je prevelik za obradu.'; +$messages['attachmentvalidationerror'] = 'UPOZORENJE! Ovaj privitak je sumnjiv jer vrsta privitka ne odgovara vrsti deklariranoj u poruci. Ako ne vjerujete poÅ¡iljatelju, ne biste trebali otvarati privitak u pregledniku jer može isti može sadržavati zloćudni kod.<br/><br/><em>OÄekivano: $expected; pronaÄ‘eno: $detected</em>'; +$messages['noscriptwarning'] = 'UPOZORENJE: Ovaj webmail servis zahtijeva Javascript! Kako biste ga mogli koristiti, molimo omogućite Javascript u postavkama svog preglednika.'; ?> diff --git a/program/localization/hu_HU/labels.inc b/program/localization/hu_HU/labels.inc index 1a2135433..fdd43effe 100644 --- a/program/localization/hu_HU/labels.inc +++ b/program/localization/hu_HU/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to / $count'; $labels['copy'] = 'Másolás'; $labels['move'] = 'Ãthelyezés'; $labels['moveto'] = 'Ãthelyezés...'; +$labels['copyto'] = 'Másold oda..'; $labels['download'] = 'letöltés'; $labels['open'] = 'MegnyÃtás'; $labels['showattachment'] = 'MegjelenÃtés'; diff --git a/program/localization/hu_HU/messages.inc b/program/localization/hu_HU/messages.inc index f7eaa1394..859f3c6ea 100644 --- a/program/localization/hu_HU/messages.inc +++ b/program/localization/hu_HU/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,8 @@ $messages['invalidrequest'] = 'Érvénytelen kérés! Az adatok nem lettek elmen $messages['invalidhost'] = 'Hibás szerver hoszt név'; $messages['nomessagesfound'] = 'A fiók nem tartalmaz leveleket'; $messages['loggedout'] = 'Sikeres kijelentkezés. Viszontlátásra!'; -$messages['mailboxempty'] = 'A fiók üres'; +$messages['mailboxempty'] = 'A postafiók üres'; +$messages['nomessages'] = 'Nincsenek üzenetek'; $messages['refreshing'] = 'FrissÃtés...'; $messages['loading'] = 'Betöltés...'; $messages['uploading'] = 'Fájl feltöltése...'; diff --git a/program/localization/hy_AM/labels.inc b/program/localization/hy_AM/labels.inc index fec95f3cd..fa5a2bec6 100644 --- a/program/localization/hy_AM/labels.inc +++ b/program/localization/hy_AM/labels.inc @@ -31,6 +31,7 @@ $labels['trash'] = 'Ô±Õ²Õ¢Õ¡Ö€Õ¯Õ²'; $labels['junk'] = 'Ô¹Õ¡ÖƒÕ¸Õ¶'; $labels['subject'] = 'ÕŽÕ¥Ö€Õ¶Õ¡Õ£Õ«Ö€'; $labels['from'] = 'ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¸Õ²'; +$labels['sender'] = 'ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¸Õ²'; $labels['to'] = 'ÕÕ¿Õ¡ÖÕ¸Õ²'; $labels['cc'] = 'Cc'; $labels['bcc'] = 'Bcc'; @@ -51,6 +52,9 @@ $labels['copy'] = 'Cc'; $labels['move'] = 'ÕÕ¥Õ²Õ¡ÖƒÕ¸ÕÕ¥Õ¬'; $labels['moveto'] = 'ÕÕ¥Õ²Õ¡ÖƒÕ¸ÕÕ¥Õ¬...'; $labels['download'] = 'Õ”Õ¡Õ·Õ¥Õ¬'; +$labels['open'] = 'Ô²Õ¡Ö'; +$labels['showattachment'] = 'Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬'; +$labels['showanyway'] = 'Ô±Õ´Õ¥Õ¶ Õ¤Õ¥ÕºÖ„Õ¸Ö‚Õ´ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬'; $labels['filename'] = 'Õ–Õ¡ÕµÕ¬Õ« Õ¡Õ¶Õ¸Ö‚Õ¶'; $labels['filesize'] = 'Õ–Õ¡ÕµÕ¬Õ« Õ¹Õ¡Öƒ'; $labels['addtoaddressbook'] = 'Õ€Õ«Õ·Õ¥Õ¬ Õ°Õ¡Õ½ÖÕ¥Õ¶'; @@ -133,6 +137,7 @@ $labels['unread'] = 'Õ‰Õ¯Õ¡Ö€Õ¤Õ¡ÖÕ¡Õ®Õ¨'; $labels['flagged'] = 'Õ†Õ·Õ¾Õ¡Õ®'; $labels['unanswered'] = 'Ô±Õ¶ÕºÕ¡Õ¿Õ¡Õ½ÕÕ¡Õ¶'; $labels['deleted'] = 'Õ‹Õ¶Õ»Õ¾Õ¡Õ®'; +$labels['undeleted'] = 'Õ‹Õ¶Õ»Õ¾Õ¡Õ® Õ¹Õ§'; $labels['invert'] = 'Õ“Õ¸ÕÕ¡Õ¿Õ¥Õ²Õ¥Õ¬'; $labels['filter'] = 'Ô¶Õ¿Õ«Õ¹'; $labels['list'] = 'Õ‘Õ¸Ö‚ÖÕ¡Õ¯'; @@ -166,9 +171,13 @@ $labels['quicksearch'] = 'Ô±Ö€Õ¡Õ£ Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´'; $labels['resetsearch'] = 'ÕŽÕ¥Ö€Õ½Õ¯Õ½Õ¥Õ¬ Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´Õ¨'; $labels['searchmod'] = 'ÕˆÖ€Õ¸Õ¶Õ´Õ¡Õ¶ ÖƒÕ¸ÖƒÕ¸ÕÕ«Õ¹Õ¶Õ¥Ö€'; $labels['msgtext'] = 'ÕˆÕ²Õ» Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨'; +$labels['body'] = 'Õ„Õ¡Ö€Õ´Õ«Õ¶'; +$labels['type'] = 'ÕÖ‡'; +$labels['namex'] = 'Ô±Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´'; $labels['openinextwin'] = 'Ô²Õ¡ÖÕ¥Õ¬ Õ¶Õ¸Ö€ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ¸Ö‚Õ´'; $labels['emlsave'] = 'Õ†Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ (.eml)'; $labels['editasnew'] = 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Õ¸Ö€ÕºÕ¥Õ½ Õ¶Õ¸Ö€'; +$labels['send'] = 'ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬'; $labels['sendmessage'] = 'ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬'; $labels['savemessage'] = 'Õ€Õ«Õ·Õ¥Õ¬ Õ¸Ö€ÕºÕ¥Õ½ Õ½Ö‡Õ¡Õ£Õ«Ö€'; $labels['addattachment'] = 'Ô¿ÖÕ¥Õ¬ Ö†Õ¡ÕµÕ¬'; @@ -198,6 +207,9 @@ $labels['nosubject'] = '(Õ¡Õ¼Õ¡Õ¶Ö Õ¾Õ¥Ö€Õ¶Õ¡Õ£Ö€Õ«)'; $labels['showimages'] = 'Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ¶Õ¯Õ¡Ö€Õ¶Õ¥Ö€Õ¨'; $labels['alwaysshow'] = 'Õ„Õ«Õ·Õ¿ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ¨ $sender–իÖ'; $labels['isdraft'] = 'ÕÕ¡ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ½Ö‡Õ¡Õ£Õ«Ö€ Õ§'; +$labels['andnmore'] = '$nr Õ¡ÕµÕ¬...'; +$labels['togglemoreheaders'] = 'Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ£Õ¬ÕÕ¡Õ£Ö€Õ¥Ö€Õ¨'; +$labels['togglefullheaders'] = 'Õ“Õ¸ÕÕ¥Õ¬ Õ£Õ¬ÕÕ¡Õ£Ö€Õ¥Ö€Õ¨'; $labels['htmltoggle'] = 'HTML'; $labels['plaintoggle'] = 'ÕŠÕ¡Ö€Õ¦ Õ¿Õ¥Ö„Õ½Õ¿'; $labels['savesentmessagein'] = 'Ô³Ö€Õ¡Õ¶ÖÕ¥Õ¬ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¾Õ¡Õ® Õ¶Õ¡Õ´Õ¡Õ¯Õ¨'; @@ -279,6 +291,8 @@ $labels['composeto'] = 'Ô³Ö€Õ¥Õ¬ Õ¶Õ¡Õ´Õ¡Õ¯'; $labels['contactsfromto'] = 'Õ€Õ¡Õ½ÖÕ¥Õ¶Õ¥Ö€ $fromâ€“Õ«Ö $to–ը Õ¥Õ²Õ¡Õ® $count–իÖ'; $labels['print'] = 'ÕÕºÕ¥Õ¬'; $labels['export'] = 'Ô±Ö€Õ¿Õ¡Õ°Õ¡Õ¶Õ¥Õ¬'; +$labels['exportall'] = 'Ô±Ö€Õ¿Õ¡Õ°Õ¡Õ¶Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€Õ¨'; +$labels['exportsel'] = 'Ô±Ö€Õ¿Õ¡Õ°Õ¡Õ¶Õ¥Õ¬ Õ¶Õ·Õ¾Õ¡Õ®Õ¶Õ¥Ö€Õ¨'; $labels['exportvcards'] = 'Ô±Ö€Õ¿Õ¡Õ°Õ¡Õ¶Õ¥Õ¬ Õ°Õ¡Õ½ÖÕ¥Õ¶Õ¥Ö€Õ¨ vCard Õ¹Õ¡ÖƒÕ¡Õ±Ö‡Õ¸Õ¾'; $labels['newcontactgroup'] = 'ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¯Õ¡ÕºÕ¸Ö€Õ¤Õ¶Õ¥Ö€Õ« Õ¶Õ¸Ö€ ÕÕ¸Ö‚Õ´Õ¢'; $labels['grouprename'] = 'ÕŽÕ¥Ö€Õ¡Õ¶Õ¾Õ¡Õ¶Õ¥Õ¬ ÕÕ¸Ö‚Õ´Õ¢Õ¨'; @@ -290,13 +304,16 @@ $labels['nextpage'] = 'Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ°Õ¡Õ»Õ¸Ö€Õ¤ Õ§Õ»Õ¨'; $labels['lastpage'] = 'Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ§Õ»Õ¨'; $labels['group'] = 'Ô½Õ¸Ö‚Õ´Õ¢'; $labels['groups'] = 'Ô½Õ´Õ¢Õ¥Ö€'; +$labels['listgroup'] = 'Ô½Õ´Õ¢Õ« Õ¡Õ¶Õ¤Õ¡Õ´Õ¶Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯'; $labels['personaladrbook'] = 'Ô±Õ¶Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ½ÖÕ¥Õ¶Õ¥Ö€'; $labels['searchsave'] = 'ÕŠÕ¡Õ°ÕºÕ¡Õ¶Õ¥Õ¬ Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´Õ¨'; $labels['searchdelete'] = 'Õ‹Õ¶Õ»Õ¥Õ¬ Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´Õ¨'; $labels['import'] = 'Õ†Õ¥Ö€Õ¯Ö€Õ¥Õ¬'; $labels['importcontacts'] = 'Õ†Õ¥Ö€Õ¯Ö€Õ¥Õ¬ Õ°Õ¡Õ½ÖÕ¥Õ¶Õ¥Ö€'; $labels['importfromfile'] = 'Õ†Õ¥Ö€Õ¯Ö€Õ¥Õ¬ Ö†Õ¡ÕµÕ¬Õ«Ö'; +$labels['importtarget'] = 'Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¯Õ¡ÕºÕ¸Ö€Õ¤Õ¶Õ¥Ö€Õ¨'; $labels['importreplace'] = 'Õ“Õ¸ÕÕ¥Õ¬ Õ¸Õ²Õ» Õ°Õ¡Õ½ÖÕ¥Õ¡Õ£Õ«Ö€Ö„Õ¨'; +$labels['importdesc'] = 'Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¾Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ¯Õ¡ÕºÕ¸ÖÕ¶Õ¥Ö€Õ¶ Õ¡Ö€Õ¤Õ¥Õ¶ Õ£Õ¸ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ¶Õ¥ÖÕ¸Õ² Õ°Õ¡Õ½ÖÕ¥Õ¡Õ£Ö€Ö„Õ«Ö:<br/>Ô±ÕµÕªÕ´ Õ´Õ¥Õ¶Ö„ Ö…Õ£Õ¶Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¶Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Õ¬ <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> Õ¯Õ¡Õ´ CSV (comma-separated) Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ±Ö‡Õ¡Õ¹Õ¡ÖƒÕ¥Ö€Õ«Ö:'; $labels['done'] = 'Ô±Õ¾Õ¡Ö€Õ¿Õ¾Õ¡Õ® Õ§'; $labels['settingsfor'] = 'Õ†Õ¡ÕÕ¡Õ½Õ«Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€'; $labels['about'] = 'Õ†Õ¯Õ¡Ö€Õ¡Õ£Õ«Ö€'; @@ -311,6 +328,8 @@ $labels['edititem'] = 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Õ«Ö€Õ¨'; $labels['preferhtml'] = 'Ô³Õ¥Ö€Õ¡Õ¤Õ¡Õ½Õ¥Õ¬ HTML'; $labels['defaultcharset'] = 'Ô¼Õ¼Õ¥Õ¬ÕµÕ¡Õ¬ Õ¿Õ¡Õ¼Õ¡Õ·Õ¡Ö€'; $labels['htmlmessage'] = 'HTML Õ¶Õ¡Õ´Õ¡Õ¯'; +$labels['messagepart'] = 'Õ´Õ¡Õ½'; +$labels['digitalsig'] = 'Ô¹Õ¾Õ¡ÕµÕ«Õ¶ Õ½Õ¿Õ¸Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶'; $labels['dateformat'] = 'Ô±Õ´Õ½Õ¡Õ©Õ¾Õ« Õ±Ö‡Õ¡Õ¹Õ¡Öƒ'; $labels['timeformat'] = 'ÔºÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ« Õ±Ö‡Õ¡Õ¹Õ¡Öƒ'; $labels['prettydate'] = 'ÕŠÕ¡Ö€Õ¦ Õ¡Õ´Õ½Õ¡Õ©Õ¾Õ¥Ö€'; @@ -321,8 +340,11 @@ $labels['timezone'] = 'ÔºÕ¡Õ´Õ¡ÕµÕ«Õ¶ Õ£Õ¸Õ¿Õ«'; $labels['pagesize'] = 'ÕÕ¸Õ²Õ¥Ö€ Õ¡Õ¼ Õ§Õ»'; $labels['signature'] = 'ÕÕ¿Õ¸Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶'; $labels['dstactive'] = 'Ô±Õ´Õ¡Õ¼Õ¡ÕµÕ«Õ¶ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯'; +$labels['showinextwin'] = 'Ô²Õ¡ÖÕ¥Õ¬ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¶Õ¸Ö€ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ¸Ö‚Õ´'; +$labels['composeextwin'] = 'Ô¿Õ¡Õ¦Õ´Õ¥Õ¬ Õ¶Õ¸Ö€ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ¸Ö‚Õ´'; $labels['htmleditor'] = 'ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ HTML Õ¶Õ¡Õ´Õ¡Õ¯Õ¶Õ¥Ö€'; $labels['htmlonreply'] = 'Õ´Õ«Õ¡ÕµÕ¶ HTML Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨ ÕºÕ¡Õ¿Õ¡Õ½ÕÕ¡Õ¶Õ¥Õ¬Õ«Õ½'; +$labels['htmlonreplyandforward'] = 'Õ´Õ«Õ¡ÕµÕ¶ HTML Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶Õ¨ ÕºÕ¡Õ¿Õ¡Õ½ÕÕ¡Õ¶Õ¥Õ¬Õ«Õ½ Õ¯Õ¡Õ´ Õ¾Õ¥Ö€Õ¡Õ°Õ¡Õ½ÖÕ¥Õ¡Õ¾Õ¸Ö€Õ¥Õ¬Õ«Õ½'; $labels['htmlsignature'] = 'HTML Õ½Õ¿Õ¸Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶'; $labels['previewpane'] = 'Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ¨'; $labels['skin'] = 'ÕÕ¥Õ½Ö„Õ« Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯'; @@ -348,6 +370,7 @@ $labels['always'] = 'Õ´Õ«Õ·Õ¿'; $labels['showinlineimages'] = 'Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ¯ÖÕ¾Õ¡Õ® ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ¨ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¿Õ¡Õ¯'; $labels['autosavedraft'] = 'ÕÖ‡Õ¡Õ£Ö€Õ« Õ¡Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ Õ£Ö€Õ¡Õ¶ÖÕ¸Ö‚Õ´'; $labels['everynminutes'] = 'Õ¡Õ´Õ¥Õ¶ $n Ö€Õ¸ÕºÕ¥Õ¶'; +$labels['refreshinterval'] = 'Ô¹Õ¡Ö€Õ´Õ¡ÖÕ¶Õ¥Õ¬ (Õ½Õ¿Õ¸Ö‚Õ£Õ¥Õ¬ Õ¶Õ¸Ö€ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Ö‡ Õ¡ÕµÕ¬Õ¶)'; $labels['never'] = 'Õ¥Ö€Õ¢Õ¥Ö„'; $labels['immediately'] = 'Õ¡Õ¶Õ´Õ«Õ»Õ¡ÕºÕ¥Õ½'; $labels['messagesdisplaying'] = 'Õ¶Õ¡Õ´Õ¡Õ¯Õ¶Õ¥Ö€Õ¨ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬Õ«Õ½'; @@ -369,6 +392,7 @@ $labels['maintenance'] = 'ÕÕºÕ¡Õ½Õ¡Ö€Õ¯Õ¸Ö‚Õ´'; $labels['newmessage'] = 'Õ†Õ¸Ö€ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶'; $labels['signatureoptions'] = 'ÕÕ¿Õ¸Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€'; $labels['whenreplying'] = 'ÕŠÕ¡Õ¿Õ¡Õ½ÕÕ¡Õ¶Õ¥Õ¬Õ«Õ½'; +$labels['replyempty'] = 'Õ´Õ« Ö„Õ¡Õ²Õ¾Õ¡Õ®Õ¥Ö„Õ¡Õ¼Õ¡Õ»Õ«Õ¶ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨'; $labels['replytopposting'] = 'Õ½Õ¯Õ½Õ¥Õ¬ Õ¶Õ¸Ö€ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¾Õ¥Ö€Ö‡Õ«Ö'; $labels['replybottomposting'] = 'Õ½Õ¯Õ½Õ¥Õ¬ Õ¶Õ¸Ö€ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¶Õ¥Ö€Ö„Ö‡Õ«Ö'; $labels['replyremovesignature'] = 'ÕŠÕ¡Õ¿Õ¡Õ½ÕÕ¡Õ¶Õ¥Õ¬Õ«Õ½ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ«Ö Õ¶Õ¡ÕÕ¸Ö€Õ¤ Õ½Õ¿Õ¸Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨'; @@ -381,6 +405,7 @@ $labels['afternseconds'] = '$n Õ¾Õ¡Ö€Õ¯ÕµÕ¡Õ¶ Õ°Õ¥Õ¿Õ¸'; $labels['reqmdn'] = 'Õ„Õ«Õ·Õ¿ ÕºÕ¡Õ¿Õ¾Õ«Ö€Õ¥Õ¬ Õ½Õ¿Õ¡ÖÕ¡Õ¯Õ¡Õ¶'; $labels['reqdsn'] = 'Õ„Õ«Õ·Õ¿ ÕºÕ¡Õ¿Õ¾Õ«Ö€Õ¥Õ¬ Õ¡Õ¼Õ¡Ö„Õ´Õ¡Õ¶ Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ®Õ¡Õ¶Õ¸Ö‚ÖÕ¸Ö‚Õ´'; $labels['replysamefolder'] = 'Õ€Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÕºÕ¡Õ¿Õ¡Õ½ÕÕ¡Õ¶Õ¶Õ¥Ö€Õ¨ ÕºÕ¡Õ°Õ¥Õ¬ Õ¶Õ¸Ö‚ÕµÕ¶ ÕºÕ¡Õ¶Õ¡Õ¯Õ¸Ö‚Õ´'; +$labels['defaultabook'] = 'Õ€Õ«Õ´Õ¶Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ½ÖÕ¥Õ¡Õ£Õ«Ö€Ö„Õ¨'; $labels['autocompletesingle'] = 'Ô±Õ¾Õ¿Õ¸Õ¬Ö€Õ¡ÖÕ´Õ¡Õ¶ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯ Õ¢Õ¡ÖÕ¡Õ¼Õ¥Õ¬ Õ¡ÕµÕ¬Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¡ÕµÕ«Õ¶ Õ§Õ¬ÖƒÕ¸Õ½Õ¿Õ« Õ°Õ¡Õ½ÖÕ¥Õ¶Õ¥Ö€Õ¨'; $labels['listnamedisplay'] = 'Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ¯Õ¡ÕºÕ¸Ö€Õ¤Õ¶Õ¥Ö€Õ¨ Õ¸Ö€ÕºÕ¥Õ½'; $labels['spellcheckbeforesend'] = 'ÕÕ¿Õ¸Ö‚Õ£Õ¥Õ¬ Õ¿Õ¡Õ¼Õ¡Õ½ÕÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ»'; @@ -390,6 +415,9 @@ $labels['spellcheckignorenums'] = 'Ô±Õ¶Õ¿Õ¥Õ½Õ¥Õ¬ Õ©Õ¾Õ¥Ö€Õ¸Õ¾ Õ¢Õ¡Õ¼Õ¥Ö€Õ¨'; $labels['spellcheckignorecaps'] = 'Ô±Õ¶Õ¿Õ¥Õ½Õ¥Õ¬ Õ¬Ö€Õ«Õ¾ Õ´Õ¥Õ®Õ¡Õ¿Õ¡Õ¼ Õ¢Õ¡Õ¼Õ¥Ö€Õ¨'; $labels['addtodict'] = 'Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¡Õ¼Õ¡Ö€Õ¡Õ¶Õ¸Ö‚Õ´'; $labels['mailtoprotohandler'] = 'mailto: Õ°Õ²Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ½ÕºÕ¡Õ½Õ¡Ö€Õ¯Õ¸Õ²'; +$labels['forwardmode'] = 'Õ€Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ¾Õ¥Ö€Õ¡Õ°Õ¡Õ½ÖÕ¥Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´'; +$labels['inline'] = 'Õ´Õ¥Õ»Õ¨'; +$labels['asattachment'] = 'Õ¸Ö€ÕºÕ¥Õ½ Õ¯ÖÕ¸Ö€Õ¤'; $labels['folder'] = 'Ô´Õ¡Ö€Õ¡Õ¯'; $labels['folders'] = 'Ô´Õ¡Ö€Õ¡Õ¯Õ¶Õ¥Ö€'; $labels['foldername'] = 'Ô´Õ¡Ö€Õ¡Õ¯Õ« Õ¡Õ¶Õ¸Ö‚Õ¶'; @@ -414,6 +442,7 @@ $labels['sortby'] = 'Ô´Õ¡Õ½Õ¡Õ¾Õ¸Ö€Õ¥Õ¬'; $labels['sortasc'] = 'Õ¨Õ½Õ¿ Õ¡Õ³Õ´Õ¡Õ¶'; $labels['sortdesc'] = 'Õ¨Õ½Õ¿ Õ¶Õ¾Õ¡Õ¦Õ´Õ¡Õ¶'; $labels['undo'] = 'ÔµÕ¿Õ¡Ö€Õ¯Õ¥Õ¬'; +$labels['installedplugins'] = 'ÕÕ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¾Õ¡Õ® Õ°Õ¡Õ¾Õ¥Õ¬Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨'; $labels['plugin'] = 'Ô½Ö€Õ«Õ¹'; $labels['version'] = 'ÕÕ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯'; $labels['source'] = 'Ô±Õ²Õ¢ÕµÕ¸Ö‚Ö€'; diff --git a/program/localization/hy_AM/messages.inc b/program/localization/hy_AM/messages.inc index c5d167acf..ba851c5d2 100644 --- a/program/localization/hy_AM/messages.inc +++ b/program/localization/hy_AM/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -29,7 +29,6 @@ $messages['errornoperm'] = 'Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¯Õ¡Õ¿Õ¡Ö€Õ´Õ¡Õ¶ Õ«Ö€Õ¡Õ¾Õ¸ $messages['invalidrequest'] = 'ÕÕÕ¡Õ¬ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´, Õ¡ÕºÕ¡Ö€Õ¤ÕµÕ¸Ö‚Õ¶Ö‰'; $messages['nomessagesfound'] = 'Ô±ÕµÕ½ ÖƒÕ¸Õ½Õ¿Õ¡Ö€Õ¯Õ²Õ¸Ö‚Õ´ Õ¶Õ¡Õ´Õ¡Õ¯Õ¶Õ¥Ö€ Õ¹Õ¯Õ¡Õ¶'; $messages['loggedout'] = 'Ô´Õ¸Ö‚Ö„ Õ¢Õ¡Ö€Õ¥Õ°Õ¡Õ»Õ¸Õ² Õ¡Õ¾Õ¡Ö€Õ¿Õ¥ÖÕ«Ö„ Õ¡Õ·ÕÕ¡Õ¿Õ¡Õ¶Ö„Õ¨Ö‰ Ցտեսություն…'; -$messages['mailboxempty'] = 'Õ“Õ¸Õ½Õ¿Õ¡Ö€Õ¯Õ²Õ¨ Õ¤Õ¡Õ¿Õ¡Ö€Õ¯ Õ§'; $messages['loading'] = 'Ô²Õ¥Õ¼Õ¶Õ¸Ö‚Õ´...'; $messages['uploading'] = 'Õ–Õ¡ÕµÕ¬Õ« վերբեռնում…'; $messages['uploadingmany'] = 'ÕŽÕ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¾Õ¸Ö‚Õ´ Õ¥Õ¶ ֆայլերը…'; diff --git a/program/localization/ia/messages.inc b/program/localization/ia/messages.inc index 50ef68145..32733f21d 100644 --- a/program/localization/ia/messages.inc +++ b/program/localization/ia/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | diff --git a/program/localization/id_ID/messages.inc b/program/localization/id_ID/messages.inc index 020b03f8a..a78054a20 100644 --- a/program/localization/id_ID/messages.inc +++ b/program/localization/id_ID/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,6 @@ $messages['invalidrequest'] = 'Permintaan tidak valid! Tidak ada data yang tersi $messages['invalidhost'] = 'Nama server invalid.'; $messages['nomessagesfound'] = 'Surat tidak ditemukan di kotak masuk ini'; $messages['loggedout'] = 'Anda berhasil mengakhiri session. Selamat Tinggal!'; -$messages['mailboxempty'] = 'Kotak masuk kosong.'; $messages['refreshing'] = 'Menyegarkan...'; $messages['loading'] = 'Memuat...'; $messages['uploading'] = 'Menggungah berkas ...'; diff --git a/program/localization/index.inc b/program/localization/index.inc index 4496b056a..38edb7367 100644 --- a/program/localization/index.inc +++ b/program/localization/index.inc @@ -5,7 +5,7 @@ | program/localization/index.inc | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2012, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -26,7 +26,8 @@ $rcube_languages = array( 'sq_AL' => 'Albanian (Shqip)', - 'ar_SA' => 'Arabic (العربية)', + 'ar' => 'Arabic (العربية)', + 'ar_SA' => 'Arabic (Saudi Arabia)', 'hy_AM' => 'Armenian (Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶)', 'ast' => 'Asturiana (Asturianu)', 'az_AZ' => 'Azerbaijani (AzÉ™rbaycanca)', @@ -51,6 +52,7 @@ $rcube_languages = array( 'en_US' => 'English (US)', 'eo' => 'Esperanto', 'et_EE' => 'Estonian (Eesti)', + 'fo_FO' => 'Faroese (Føroyskt)', 'fi_FI' => 'Finnish (Suomi)', 'nl_BE' => 'Flemish (Vlaams)', 'fr_FR' => 'French (Français)', @@ -96,6 +98,7 @@ $rcube_languages = array( 'es_419' => 'Spanish (Latin America)', 'sv_SE' => 'Swedish (Svenska)', 'ta_IN' => 'Tamil (தமிழà¯)', + 'ti' => 'Tigrinya (ትáŒáˆáŠ›)', 'th_TH' => 'Thai (ไทย)', 'tr_TR' => 'Turkish (Türkçe)', 'uk_UA' => 'Ukrainian (УкраїнÑька)', @@ -107,7 +110,6 @@ $rcube_languages = array( $rcube_language_aliases = array( 'am' => 'hy_AM', - 'ar' => 'ar_SA', 'az' => 'az_AZ', 'bg' => 'bg_BG', 'bs' => 'bs_BA', @@ -137,6 +139,7 @@ $rcube_language_aliases = array( 'kr' => 'ko_KR', 'kh' => 'km_KH', 'kh_KH' => 'km_KH', + 'kn' => 'kn_IN', 'km' => 'km_KH', 'lb' => 'lb_LU', 'ne' => 'ne_NP', diff --git a/program/localization/is_IS/messages.inc b/program/localization/is_IS/messages.inc index 06b707389..6e5c7a8b0 100644 --- a/program/localization/is_IS/messages.inc +++ b/program/localization/is_IS/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -21,7 +21,6 @@ $messages['sessionerror'] = 'Innskráningin þÃn ógild eða útrunnin'; $messages['storageerror'] = 'Tengin við IMAP-miðlara mistókst'; $messages['nomessagesfound'] = 'Engin skeyti eru à þessu pósthólfi'; $messages['loggedout'] = 'Þú hefur útskráðst. Bless!'; -$messages['mailboxempty'] = 'Pósthólfið er tómt'; $messages['loading'] = 'Hleð...'; $messages['loadingdata'] = 'Hleð gögn...'; $messages['checkingmail'] = 'Gái að nýjum skeytum...'; diff --git a/program/localization/it_IT/csv2vcard.inc b/program/localization/it_IT/csv2vcard.inc new file mode 100644 index 000000000..33b44cccd --- /dev/null +++ b/program/localization/it_IT/csv2vcard.inc @@ -0,0 +1,110 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | localization/it_IT/csv2vcard.inc | + | | + | Localization file of the Roundcube Webmail client | + | Copyright (C) 2005-2014, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + | Author: Aleksander Machniak <alec@alec.pl> | + +-----------------------------------------------------------------------+ +*/ + +// This is a list of CSV column names specified in CSV file header +// These must be original texts used in Outlook/Thunderbird exported csv files +// Encoding UTF-8 + +$map = array(); + +// MS Outlook 2010 +$map['anniversary'] = "Anniversary"; +$map['assistants_name'] = "Assistant's Name"; +$map['assistants_phone'] = "Assistant's Phone"; +$map['birthday'] = "Birthday"; +$map['business_city'] = "Città di lavoro"; +$map['business_countryregion'] = "Business Country/Region"; +$map['business_fax'] = "Business Fax"; +$map['business_phone'] = "Business Phone"; +$map['business_phone_2'] = "Business Phone 2"; +$map['business_postal_code'] = "Business Postal Code"; +$map['business_state'] = "Provincia di lavoro"; +$map['business_street'] = "Indirizzo di lavoro"; +$map['car_phone'] = "Car Phone"; +$map['categories'] = "Categories"; +$map['company'] = "Company"; +$map['department'] = "Reparto"; +$map['email_address'] = "E-mail Address"; +$map['first_name'] = "Nome"; +$map['gender'] = "Gender"; +$map['home_city'] = "Città di residenza"; +$map['home_countryregion'] = "Home Country/Region"; +$map['home_fax'] = "Home Fax"; +$map['home_phone'] = "Telefono casa"; +$map['home_phone_2'] = "Home Phone 2"; +$map['home_postal_code'] = "Home Postal Code"; +$map['home_state'] = "Provincia di residenza"; +$map['home_street'] = "Indirizzo di casa"; +$map['job_title'] = "Qualifica"; +$map['last_name'] = "Cognome"; +$map['managers_name'] = "Manager's Name"; +$map['middle_name'] = "Middle Name"; +$map['mobile_phone'] = "Mobile Phone"; +$map['notes'] = "Note"; +$map['other_city'] = "Other City"; +$map['other_countryregion'] = "Other Country/Region"; +$map['other_fax'] = "Other Fax"; +$map['other_phone'] = "Other Phone"; +$map['other_postal_code'] = "Other Postal Code"; +$map['other_state'] = "Other State"; +$map['other_street'] = "Other Street"; +$map['pager'] = "Numero cercapersone"; +$map['primary_phone'] = "Primary Phone"; +$map['spouse'] = "Spouse"; +$map['suffix'] = "Suffix"; +$map['title'] = "Title"; +$map['web_page'] = "Web Page"; + +// Thunderbird +$map['birth_day'] = "Giorno di nascita"; +$map['birth_month'] = "Mese di nascita"; +$map['birth_year'] = "Anno di nascita"; +$map['display_name'] = "Nome visualizzato"; +$map['fax_number'] = "Numero fax"; +$map['home_address'] = "Indirizzo di casa 2"; +$map['home_country'] = "Nazione di residenza"; +$map['home_zipcode'] = "CAP di residenza"; +$map['mobile_number'] = "Numero cellulare"; +$map['nickname'] = "Soprannome"; +$map['organization'] = "Organizzazione"; +$map['pager_number'] = "Pager Namber"; +$map['primary_email'] = "Email primaria"; +$map['secondary_email'] = "Email secondaria"; +$map['web_page_1'] = "Pagina web 1"; +$map['web_page_2'] = "Pagina web 2"; +$map['work_phone'] = "Telefono lavoro"; +$map['work_address'] = "Indirizzo di lavoro 2"; +$map['work_country'] = "Nazione di lavoro"; +$map['work_zipcode'] = "CAP di lavoro"; + +// Atmail +$map['date_of_birth'] = "Date of Birth"; +$map['email'] = "Email"; +$map['home_mobile'] = "Home Mobile"; +$map['home_zip'] = "Home Zip"; +$map['info'] = "Info"; +$map['user_photo'] = "User Photo"; +$map['url'] = "URL"; +$map['work_city'] = "Work City"; +$map['work_company'] = "Work Company"; +$map['work_dept'] = "Work Dept"; +$map['work_fax'] = "Work Fax"; +$map['work_mobile'] = "Work Mobile"; +$map['work_state'] = "Work State"; +$map['work_title'] = "Work Title"; +$map['work_zip'] = "Work Zip"; diff --git a/program/localization/it_IT/labels.inc b/program/localization/it_IT/labels.inc index c9f23c64d..f0f660d3d 100644 --- a/program/localization/it_IT/labels.inc +++ b/program/localization/it_IT/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to di $count'; $labels['copy'] = 'Copia'; $labels['move'] = 'Sposta'; $labels['moveto'] = 'Sposta in...'; +$labels['copyto'] = 'Copia su...'; $labels['download'] = 'Download'; $labels['open'] = 'Apri'; $labels['showattachment'] = 'Visualizza'; diff --git a/program/localization/it_IT/messages.inc b/program/localization/it_IT/messages.inc index 47db415b4..5d964697b 100644 --- a/program/localization/it_IT/messages.inc +++ b/program/localization/it_IT/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,8 @@ $messages['invalidrequest'] = 'Richiesta non valida! Nessun dato salvato.'; $messages['invalidhost'] = 'Nome del server non valido.'; $messages['nomessagesfound'] = 'Nessun messaggio trovato in questa cartella'; $messages['loggedout'] = 'Sessione chiusa correttamente. Arrivederci!'; -$messages['mailboxempty'] = 'La casella è vuota'; +$messages['mailboxempty'] = 'La Mailbox è vuota'; +$messages['nomessages'] = 'Non ci sono messaggi'; $messages['refreshing'] = 'Aggiornamento...'; $messages['loading'] = 'Caricamento...'; $messages['uploading'] = 'Caricamento file...'; diff --git a/program/localization/ja_JP/labels.inc b/program/localization/ja_JP/labels.inc index 600a40088..e58582e73 100644 --- a/program/localization/ja_JP/labels.inc +++ b/program/localization/ja_JP/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$count通ã®$from通目ã‹ã‚‰$to通目'; $labels['copy'] = 'コピー'; $labels['move'] = '移動'; $labels['moveto'] = 'フォルダーã«ç§»å‹•'; +$labels['copyto'] = 'コピー...'; $labels['download'] = 'ダウンãƒãƒ¼ãƒ‰'; $labels['open'] = 'é–‹ã'; $labels['showattachment'] = '表示'; diff --git a/program/localization/ja_JP/messages.inc b/program/localization/ja_JP/messages.inc index 8b4296ba4..1babab7a3 100644 --- a/program/localization/ja_JP/messages.inc +++ b/program/localization/ja_JP/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -33,6 +33,7 @@ $messages['invalidhost'] = 'æ£ã—ããªã„サーãƒãƒ¼åã§ã™ã€‚'; $messages['nomessagesfound'] = 'ã“ã®ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã«ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã‚ã‚Šã¾ã›ã‚“。'; $messages['loggedout'] = 'ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸã€‚ã•ã‚ˆã†ãªã‚‰!'; $messages['mailboxempty'] = 'メールボックスã¯ç©ºã§ã™ã€‚'; +$messages['nomessages'] = 'メッセージãªã—'; $messages['refreshing'] = 'å†è¡¨ç¤ºä¸...'; $messages['loading'] = 'èªã¿è¾¼ã¿ä¸...'; $messages['uploading'] = 'ファイルをアップãƒãƒ¼ãƒ‰ä¸...'; diff --git a/program/localization/ka_GE/messages.inc b/program/localization/ka_GE/messages.inc index 2c544e17d..b0ef05373 100644 --- a/program/localization/ka_GE/messages.inc +++ b/program/localization/ka_GE/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -26,7 +26,6 @@ $messages['errornoperm'] = 'მáƒáƒ¥áƒ›áƒ”დების შესრულე $messages['invalidrequest'] = 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი მáƒáƒ—ხáƒáƒ•áƒœáƒ! მáƒáƒœáƒáƒªáƒ”მების შენáƒáƒ®áƒ•áƒ áƒáƒ მáƒáƒ®áƒ”რხდáƒ.'; $messages['nomessagesfound'] = 'áƒáƒ áƒáƒ ის áƒáƒ®áƒáƒšáƒ˜ შეტყáƒáƒ‘ინებáƒ'; $messages['loggedout'] = 'წáƒáƒ მáƒáƒ¢áƒ”ბით დáƒáƒ˜áƒ®áƒ£áƒ რთქვენი სესიáƒ'; -$messages['mailboxempty'] = 'სáƒáƒ¤áƒáƒ¡áƒ¢áƒ ყუთი ცáƒáƒ იელიáƒ'; $messages['loading'] = 'იტვირთებáƒ...'; $messages['uploading'] = 'ფáƒáƒ˜áƒšáƒ˜ იტვირთებáƒ...'; $messages['uploadingmany'] = 'ფáƒáƒ˜áƒšáƒ”ბის áƒáƒ¢áƒ•áƒ˜áƒ თვáƒ...'; diff --git a/program/localization/km_KH/labels.inc b/program/localization/km_KH/labels.inc index 9a2799922..c94133b5d 100644 --- a/program/localization/km_KH/labels.inc +++ b/program/localization/km_KH/labels.inc @@ -31,6 +31,7 @@ $labels['trash'] = 'ធុងសំរាម'; $labels['junk'] = 'សំបុážáŸ’រមិនល្អ'; $labels['subject'] = 'ចំណងជើង'; $labels['from'] = 'អ្នកផ្ញើ'; +$labels['sender'] = 'អ្នក​ផ្ញើ​'; $labels['to'] = 'អ្នកទទួល'; $labels['cc'] = 'Cc'; $labels['bcc'] = 'Bcc'; @@ -41,14 +42,18 @@ $labels['size'] = 'ទំហំ'; $labels['priority'] = 'អទិភាព'; $labels['organization'] = 'អង្គភាព'; $labels['readstatus'] = 'ស្ážáž¶áž“ភាពនៃការអាន'; +$labels['listoptions'] = 'ជម្រើស​បញ្ជី...'; $labels['mailboxlist'] = 'ážážáž‘ាំងអស់'; $labels['messagesfromto'] = 'សំបុážáŸ’រពី $from ទៅដល់ $toក្នុងចំណោម $count សំបុážáŸ’ážš'; $labels['threadsfromto'] = 'បន្ážáž»áŸ†ážŸáŸ†áž”áž»ážáŸ’រពី $from ទៅដល់ $toក្នុងចំណោម $count សំបុážáŸ’ážš'; $labels['messagenrof'] = 'សំបុážáŸ’ážš $nr នៃ $count'; +$labels['fromtoshort'] = '$from – $to នៃ $count'; $labels['copy'] = 'ចំលង'; $labels['move'] = 'ផ្ទáŸážš'; $labels['moveto'] = 'ផ្ទáŸážšáž‘ៅ'; $labels['download'] = 'ទាញយក'; +$labels['showattachment'] = 'បង្ហាញ'; +$labels['showanyway'] = 'បង្ហាញ​វា​យ៉ាង​ណា​កáŸâ€‹áž”ាន'; $labels['filename'] = 'ឈ្មោះឯកសារ'; $labels['filesize'] = 'ទំហំឯកសារ'; $labels['addtoaddressbook'] = 'រក្សាទុកក្នុងសៀវភៅអាសយដ្ឋាន'; @@ -91,43 +96,54 @@ $labels['longoct'] = 'ážáž»áž›áž¶'; $labels['longnov'] = 'វិច្ឆិកា'; $labels['longdec'] = 'ធ្នូ'; $labels['today'] = 'ážáŸ’ងៃនáŸáŸ‡'; +$labels['refresh'] = 'ធ្វើ​ឲ្យ​ស្រស់'; $labels['checkmail'] = 'áž–áž·áž“áž·ážáŸ’យសំបុážáŸ’ážšážáŸ’មី'; $labels['compose'] = 'សរសáŸážšážŸáŸ†áž”áž»ážáŸ’ážšážáŸ’មី'; $labels['writenewmessage'] = 'សរសáŸážšážŸáŸ†áž”áž»ážáŸ’ážšážáŸ’មី'; +$labels['reply'] = 'ឆ្លើយ'; $labels['replytomessage'] = 'ឆ្លើយážáž”ទៅអ្នកផ្ញើ'; $labels['replytoallmessage'] = 'ឆ្លើយážáž”ទៅ អ្នកទទួលទាំងអស់និង ក្រុម ឬ អ្នកផ្ញើ'; $labels['replyall'] = 'ឆ្លើយážáž”ទៅទាំងអស់គ្នា'; -$labels['replylist'] = 'ឆ្លើយážáž”ទៅក្រុម'; -$labels['forwardmessage'] = 'ផ្ញើសំបុážáŸ’របន្ážážš'; -$labels['deletemessage'] = 'លុបសំបុážáŸ’រចោល'; -$labels['movemessagetotrash'] = 'ផ្ទáŸážšážŸáŸ†áž”áž»ážáŸ’រទៅក្នុងធុងសំរាម'; -$labels['printmessage'] = 'បោះពុម្ភសំបុážáŸ’ážš'; -$labels['previousmessage'] = 'បង្ហាញសំបុážáŸ’រចាស់'; -$labels['firstmessage'] = 'បង្ហាញសំបុážáŸ’រដំបូង'; -$labels['nextmessage'] = 'បង្ហាញសំបុážáŸ’របន្ទាប់'; -$labels['lastmessage'] = 'បង្ហាញសំបុážáŸ’រចុងក្រោយ'; -$labels['backtolist'] = 'ážáŸ’រលប់ទៅកាន់ក្រុមសំបុážáŸ’ážš'; -$labels['viewsource'] = 'បង្ហាញ Source របស់សំបុážáŸ’ážš'; -$labels['markmessages'] = 'កំណážáŸ‹ážŸáŸ†áž‚ាល់សំបុážáŸ’ážš'; -$labels['markread'] = 'កំណážáŸ‹ážáž¶áž”ានអានរួច'; -$labels['markunread'] = 'កំណážáŸ‹ážáž¶áž˜áž·áž“ទាន់បានអាន'; -$labels['markflagged'] = 'កំណážáŸ‹ážŸáŸ†áž‚ាល់ដោយផ្កាយ'; -$labels['markunflagged'] = 'លុបកំណážáŸ‹ážŸáŸ†áž‚ាល់ដោយផ្កាយ'; +$labels['replylist'] = 'បញ្ជី​ឆ្លើយážáž”'; +$labels['forward'] = 'បញ្ជូន​បន្áž'; +$labels['forwardinline'] = 'បញ្ចូល​បន្ážâ€‹áž€áŸ’នុង​បន្ទាážáŸ‹'; +$labels['forwardattachment'] = 'បញ្ជូន​បន្ážâ€‹áž‡áž¶â€‹áž¯áž€ážŸáž¶ážšâ€‹áž—្ជាប់'; +$labels['forwardmessage'] = 'បញ្ជូន​បន្ážâ€‹ážŸáž¶ážš'; +$labels['deletemessage'] = 'លុប​សារ'; +$labels['movemessagetotrash'] = 'ផ្លាស់ទី​សារ​ទៅ​ធុង​សំរាម'; +$labels['printmessage'] = 'បោះពុម្ព​សារ​នáŸáŸ‡'; +$labels['previousmessage'] = 'បង្ហាញ​សារ​មុន'; +$labels['firstmessage'] = 'បង្ហាញ​សារ​ដំបូង'; +$labels['nextmessage'] = 'បង្ហាញ​សារ​បន្ទាប់'; +$labels['lastmessage'] = 'បង្ហាញ​សារ​ចុងក្រោយ'; +$labels['backtolist'] = 'ážáŸ’រឡប់​ទៅ​កាន់​បញ្ជី​សារ'; +$labels['viewsource'] = 'បង្ហាញ​ប្រភព'; +$labels['mark'] = 'សម្គាល់'; +$labels['markmessages'] = 'សម្គាល់​សារ'; +$labels['markread'] = 'អាន​រួច'; +$labels['markunread'] = 'មិន​ទាន់​អាន'; +$labels['markflagged'] = 'ដាក់​ទង់'; +$labels['markunflagged'] = 'ដោះ​ទង់'; +$labels['moreactions'] = 'សកម្មភាព​ច្រើន​ទៀáž...'; +$labels['more'] = 'ច្រើន​ទៀáž'; +$labels['back'] = 'ážáŸ’រឡប់​ក្រោយ'; +$labels['options'] = 'ជម្រើស'; $labels['select'] = 'ជ្រើសរើស'; $labels['all'] = 'ទាំងអស់'; $labels['none'] = 'មិនážáŸ†ážšáŸ€áž”'; -$labels['currpage'] = 'ទំពáŸážšáž“áŸáŸ‡'; -$labels['unread'] = 'មិនទាន់អាន'; +$labels['currpage'] = 'ទំពáŸážšâ€‹áž”ច្ចុប្បន្ន'; +$labels['unread'] = 'មិន​ទាន់​អាន'; $labels['flagged'] = 'មានកំណážáŸ‹ážŸáŸ†áž‚ាល់ដោយផ្កាយ'; $labels['unanswered'] = 'មិនទាន់ឆ្លើយážáž”'; -$labels['deleted'] = 'បានលុបរួច'; +$labels['deleted'] = 'បាន​លុប'; +$labels['undeleted'] = 'មិន​ទាន់​លុប'; $labels['invert'] = 'បញ្ច្រស់'; $labels['filter'] = 'លក្ážážáŸážŽáŸ’ឌ'; -$labels['list'] = 'ážáž¶ážšáž¶áž„'; +$labels['list'] = 'បញ្ជី'; $labels['threads'] = 'បណ្ážáž»áŸ†ážŸáŸ†áž”áž»ážáŸ’ážš'; -$labels['expand-all'] = 'បង្ហាញសំបុážáŸ’រទាំងអស់'; +$labels['expand-all'] = 'បង្ហាញ​ទាំងអស់'; $labels['expand-unread'] = 'បង្ហាញសំបុážáŸ’រមិនទាន់អាន'; -$labels['collapse-all'] = 'បិទសំបុážáŸ’រទាំងអស់'; +$labels['collapse-all'] = 'បង្រួញ​ទាំងអស់'; $labels['threaded'] = 'បានបែកចែកជាក្រុមរួច'; $labels['autoexpand_threads'] = 'បង្ហាញបណ្ážáž»áŸ†ážŸáŸ†áž”áž»ážáŸ’ážš'; $labels['do_expand'] = 'បណ្ážáž»áŸ†áž‘ាំងអស់'; @@ -157,6 +173,7 @@ $labels['msgtext'] = 'សំបុážáŸ’រទាំងមូល'; $labels['openinextwin'] = 'បើកក្នុងវីនដូវážáŸ’មី'; $labels['emlsave'] = 'រក្សាទុកទិន្ននáŸáž™áž‡áž¶áž¯áž€ážŸáž¶ážšáž”្រភáŸáž‘(.eml)'; $labels['editasnew'] = 'កែហើយរក្សាទុកដូចជាសំបុážáŸ’ážšážáŸ’មី'; +$labels['send'] = 'ផ្ញើ'; $labels['sendmessage'] = 'ផ្ញើសំបុážáŸ’ážšáž“áŸáŸ‡'; $labels['savemessage'] = 'រក្សាទុកសំបុážáŸ’រពង្រៀង'; $labels['addattachment'] = 'ឯកសារភ្ជាប់'; @@ -164,12 +181,17 @@ $labels['charset'] = 'ប្រភáŸáž‘អក្សរ'; $labels['editortype'] = 'ប្រភáŸáž‘ Editor'; $labels['returnreceipt'] = 'អážáŸ’ážáž”ទបញ្ជាក់ពីការážáŸ’រឡប់'; $labels['dsn'] = 'ប្រាប់អំពីស្ážáž¶áž“ភាពផ្ញើ'; +$labels['mailreplyintro'] = 'កាលពី​ážáŸ’ងៃ $date, $sender បាន​សរសáŸážšáŸ–'; +$labels['originalmessage'] = 'សារ​ដើម'; $labels['editidents'] = 'ផ្លាស់ប្ážáž¼ážšáž¢ážáŸ’ážážŸáž‰áŸ’ញាណ'; +$labels['spellcheck'] = 'អក្ážážšáž¶ážœáž·ážšáž»áž‘្ធ'; $labels['checkspelling'] = 'áž–áž·áž“áž·ážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធ'; $labels['resumeediting'] = 'បន្ážážšáž€áž¶ážšáž€áŸ‚ážáŸ†ážšáž¼ážœ'; $labels['revertto'] = 'ážáŸ’រលប់ទៅ'; +$labels['attach'] = 'ភ្ជាប់'; $labels['attachments'] = 'ឯកសារភ្ជាប់'; $labels['upload'] = 'ភ្ជាប់ឯកសារ'; +$labels['uploadprogress'] = '$percent ($current ពី $total)'; $labels['close'] = 'បិទ'; $labels['messageoptions'] = 'កំណážáŸ‹áž‡áŸ†ážšáž¾ážŸážšáž”ស់សំបុážáŸ’ážš'; $labels['low'] = 'ទាប'; @@ -180,6 +202,10 @@ $labels['highest'] = 'ážáŸ’ពស់បំផុáž'; $labels['nosubject'] = '(គ្មានចំណងជើង)'; $labels['showimages'] = 'បង្ហាញរូបភាព'; $labels['alwaysshow'] = 'បង្ហាញជានិច្ចរាល់រូបភាពបញ្ជូនពី$sender'; +$labels['isdraft'] = 'áž“áŸáŸ‡â€‹áž‡áž¶â€‹ážŸáž¶ážšâ€‹áž–្រាង។'; +$labels['andnmore'] = '$nr ច្រើន​ទៀáž...'; +$labels['togglemoreheaders'] = 'បង្ហាញ​បឋមកážáž¶â€‹ážŸáž¶ážšâ€‹áž…្រើន​ទៀáž'; +$labels['togglefullheaders'] = 'បិទ/បើក​បឋមកážáž¶â€‹ážŸáž¶ážšâ€‹â€‹ážŠáž¾áž˜'; $labels['htmltoggle'] = 'អážáŸ’ážáž”áž‘ HTML'; $labels['plaintoggle'] = 'អážáŸ’ážáž”ទធម្មážáž¶'; $labels['savesentmessagein'] = 'រក្សាសំបុážáŸ’រដែលបានផ្ញើក្នុង'; diff --git a/program/localization/km_KH/messages.inc b/program/localization/km_KH/messages.inc index a2c4bab20..682c733fd 100644 --- a/program/localization/km_KH/messages.inc +++ b/program/localization/km_KH/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -15,20 +15,25 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/messages/ */ -$messages['loginfailed'] = 'ការពិនិážáŸ’យចូលមិនបានសំរáŸáž…ព្រោះមានបញ្ហាកើážáž¡áž¾áž„'; -$messages['cookiesdisabled'] = 'កម្មវិធីមើលគáŸáž ទំពáŸážšáž“áŸáŸ‡áž˜áž·áž“ទទួលយកCookies'; -$messages['sessionerror'] = 'Session មិនážáŸ’រឹមážáŸ’រូវ ឬហួសកំណážáŸ‹'; -$messages['storageerror'] = 'មិនអាចភ្ជាប់ទៅកាន់ម៉ាស៊ីនIMAP'; -$messages['servererror'] = 'មានបញ្ហានៅម៉ាស៊ីនមáŸ'; +$messages['errortitle'] = 'មាន​បញ្ហា​បាន​កើážâ€‹áž¡áž¾áž„!'; +$messages['loginfailed'] = 'បាន​បរាជáŸáž™â€‹áž€áŸ’នុង​ការ​ចូល។'; +$messages['cookiesdisabled'] = 'កម្មវិធី​អ៊ីនធឺណិážâ€‹ážšáž”ស់​អ្នក​មិន​ទទួល​ážáž¼áž‚ី​ទáŸáŸ”'; +$messages['sessionerror'] = 'សមáŸáž™â€‹ážšáž”ស់​អ្នក​មិន​ážáŸ’រឹម​ážáŸ’រូវ ឬ​ផុážâ€‹áž€áŸ†ážŽážáŸ‹áŸ”'; +$messages['storageerror'] = 'មិន​អាច​ážáž—្ជាប់​ទៅ​ម៉ាស៊ីន​ឃ្លាំង​ផ្ទុក។'; +$messages['servererror'] = 'ម៉ាស៊ីន​មáŸâ€‹áž˜áž¶áž“​បញ្ហា!'; $messages['servererrormsg'] = 'បញ្ហា: $msg'; +$messages['dberror'] = 'កំហុស​មូលដ្ឋាន​ទិន្ននáŸáž™!'; +$messages['requesttimedout'] = 'សំណើ​អស់​ពáŸáž›'; $messages['errorreadonly'] = 'មិនអាចប្រážáž·áž”ážáŸ’ážáž·áž”ានពីព្រោះážážáž“áŸáŸ‡ážáŸ’រូវបានគáŸáž€áŸ†ážŽážáŸ‹ážŸáŸ†ážšáž¶áž”់ážáŸ‚មើល'; $messages['errornoperm'] = 'មិនអាចប្រážáž·áž”ážáŸ’ážáž·áž”ានពីព្រោះមិនមានសិទ្ទគ្រប់គ្រាន់'; $messages['invalidrequest'] = 'មិនអាចរក្សាទុកទិន្ននáŸáž™áž”ានពីព្រោះមានបញ្ហានៅពáŸáž›áž”ញ្ជូនទិន្ននáŸáž™'; +$messages['invalidhost'] = 'ឈ្មោះ​ម៉ាស៊ីន​មáŸâ€‹áž˜áž·áž“​ážáŸ’រឹមážáŸ’រូវ។'; $messages['nomessagesfound'] = 'ពុំមានសំបុážáŸ’រក្នុងប្រអប់សំបុážáŸ’ážšáž“áŸáŸ‡áž‘áŸ'; $messages['loggedout'] = 'អ្នកបានពិនិážáŸ’យចáŸáž‰ážŠáŸ„យជោគជáŸáž™áŸ”'; -$messages['mailboxempty'] = 'ប្រអប់សំបុážáŸ’ážšáž‘áž‘áŸ'; +$messages['refreshing'] = 'កំពុង​ផ្ទុកឡើងវិញ...'; $messages['loading'] = 'កំពុងដំណើរការ...'; $messages['uploading'] = 'កំពុងបញ្ជូនឯកសារ...'; +$messages['uploadingmany'] = 'កំពុង​ផ្ទុកឯកសារ​ឡើង...'; $messages['loadingdata'] = 'កំពុងបើកឯកសារ...'; $messages['checkingmail'] = 'កំពុងស្វែងរកមើលសំបុážáŸ’ážšážáŸ’មីáŸ...'; $messages['sendingmessage'] = 'កំពុងផ្ញើសំបុážáŸ’ážš...'; @@ -38,10 +43,12 @@ $messages['messagesaved'] = 'សំបុážáŸ’ážšážáŸ’រូវបានរក $messages['successfullysaved'] = 'រក្សាទុកដោយជោគជáŸáž™'; $messages['addedsuccessfully'] = 'អាសយដ្ឋានážáŸ’រូវបានរក្សាទុកដោយជោគជáŸáž™'; $messages['contactexists'] = 'áž–áŸážáŸŒáž˜áž¶áž“ទាក់ទងដែលមានអ៊ីមែលនáŸáŸ‡áž˜áž¶áž“ក្នុងសៀវភៅអាសយដ្ឋានរួចហើយ'; +$messages['contactnameexists'] = 'មាន​ទំនាក់ទំនង​ដែលមាន​ឈ្មោះ​ដូច​គ្នា​នáŸáŸ‡â€‹ážšáž½áž…​ហើយ។'; $messages['blockedimages'] = 'រូបភាពដែលមានក្នុងសំបុážáŸ’ážšáž“áŸáŸ‡ážáŸ’រូវបានបិទដើម្បីរក្សាសុវážáŸ’ážáž—ាព'; $messages['encryptedmessage'] = 'លោកអ្នកមិនអាចមើលសំបុážáŸ’ážšáž“áŸáŸ‡áž”ានទáŸáž–ីព្រោះសំបុážáŸ’ážšáž“áŸáŸ‡áž‡áž¶ážŸáŸ†áž”áž»ážáŸ’រសំងាážáŸ‹'; $messages['nocontactsfound'] = 'ពុំមានអាសយដ្ឋានទាក់ទងទáŸ'; $messages['contactnotfound'] = 'អាសយដ្ឋានទាក់ទងដែលលោកអ្នកចង់រកពុំមានឡើយ'; +$messages['contactsearchonly'] = 'បញ្ចូល​ពាក្យ​ស្វែងរក​មួយ​ចំនួន ដើម្បី​រក​ទំនាក់ទំនង'; $messages['sendingfailed'] = 'មិនអាចផ្ញើសំបុážáŸ’របាន'; $messages['senttooquickly'] = 'សូមរងចាំ $sec វិនាទីមុននឹងផ្ញើសំបុážáŸ’ážšáž“áŸáŸ‡'; $messages['errormoving'] = 'មិនអាចផ្ទáŸážšážŸáŸ†áž”áž»ážáŸ’របាន'; @@ -49,9 +56,12 @@ $messages['errorcopying'] = 'មិនអាចចំលងសំបុážáŸ’ážš $messages['errordeleting'] = 'មិនអាចលុបសំបុážáŸ’រចោលបាន'; $messages['errormarking'] = 'មិនអាចកំណážáŸ‹áž…ំណាំលើសំបុážáŸ’របាន'; $messages['deletecontactconfirm'] = 'ážáž¾áž›áŸ„កអ្នកពិážáž‡áž¶áž…ង់លុបពáŸážáŸŒáž˜áž¶áž“ទំនាក់ទំនងនáŸáŸ‡áž˜áŸ‚áž“áž‘áŸ?'; +$messages['deletegroupconfirm'] = 'ážáž¾áž¢áŸ’នកពិážâ€‹áž‡áž¶â€‹áž…ង់លុប​ក្រុម​បានជ្រើស?'; $messages['deletemessagesconfirm'] = 'ážáž¾áž›áŸ„កអ្នកពិážáž‡áž¶áž…ង់លុបសំបុážáŸ’ážšáž“áŸáŸ‡áž˜áŸ‚áž“áž‘áŸ?'; $messages['deletefolderconfirm'] = 'ážáž¾áž›áŸ„កអ្នកពិážáž‡áž¶áž…ង់លុបážážáž“áŸáŸ‡áž˜áŸ‚áž“áž‘áŸ?'; $messages['purgefolderconfirm'] = 'ážáž¾áž›áŸ„កអ្នកពិážáž‡áž¶áž…ង់លុបសំបុážáŸ’រទាំងអស់នៅក្នុងážážáž“áŸáŸ‡áž˜áŸ‚áž“áž‘áŸ?'; +$messages['contactdeleting'] = 'កំពុង​លុប​ទំនាក់ទំនង...'; +$messages['groupdeleting'] = 'កំពុង​លុប​ក្រុម...'; $messages['folderdeleting'] = 'កំពុងលុបážážážŸáŸ†ážšáž¶áž”់ទុកឯកសារ...'; $messages['foldermoving'] = 'កំពុងផ្ទáŸážšážážážŸáŸ†ážšáž¶áž”់ទុកឯកសារ...'; $messages['foldersubscribing'] = 'កំពុងកំណážáŸ‹áž”្រើážážážŸáŸ†ážšáž¶áž”់ទុកឯកសារ...'; @@ -67,7 +77,9 @@ $messages['nobodywarning'] = 'ážáž¾áž›áŸ„កអ្នកចង់ផ្ញើហ$messages['notsentwarning'] = 'សំបុážáŸ’ážšáž“áŸáŸ‡áž˜áž·áž“ទាន់បានផ្ញើទáŸáŸ” ážáž¾áž›áŸ„កអ្នកចង់លុបចោលទáŸ?'; $messages['noldapserver'] = 'សូមកំណážáŸ‹áž˜áŸ‰áž¶ážŸáŸŠáž¸áž“ LDAPដើម្បីស្វែងរក'; $messages['nosearchname'] = 'សូមបំពáŸáž‰ážˆáŸ’មោះទំនាក់ទំនង ឬអាសយដ្ឋានអ៊ីមែល'; +$messages['notuploadedwarning'] = 'ឯកសារ​ភ្ជាប់​ទាំង​អស់​មិន​ážáŸ’រូវ​បាន​ផ្ទុក​ឡើង​នៅឡើយ​ទáŸáŸ” សូម​រង់ចាំ​ ឬ​បោះបង់​ការ​​ផ្ទុក​ឡើង។'; $messages['searchsuccessful'] = 'រកឃើញសំបុážáŸ’រចំនួន $nr'; +$messages['contactsearchsuccessful'] = 'រក​ឃើញ​ទំនាក់ទំនង $nr ។'; $messages['searchnomatch'] = 'រកមិនឃើញអ្វីទាំងអស់'; $messages['searching'] = 'កំពុងស្វែងរក...'; $messages['checking'] = 'កំពុងពិនិážáŸ’យរក...'; @@ -86,16 +98,21 @@ $messages['sourceisreadonly'] = 'លោកអ្នកមានសិទ្ធហ$messages['errorsavingcontact'] = 'មិនអាចរក្សាអាសយដ្ឋានបានទáŸ'; $messages['movingmessage'] = 'កំពុកផ្ážáŸážšážŸáŸ†áž”áž»ážáŸ’ážš...'; $messages['copyingmessage'] = 'កំពុងចំលងសំបុážáŸ’ážš...'; +$messages['copyingcontact'] = 'កំពុង​ចម្លង​ទំនាក់ទំនង...'; $messages['deletingmessage'] = 'កំពុងលុបសំបុážáŸ’ážš...'; $messages['markingmessage'] = 'កំពុងកំណážáŸ‹ážŸáŸ†áž‚ាល់សំបុážáŸ’ážš...'; +$messages['addingmember'] = 'កំពុង​បន្ážáŸ‚ម​ទំនាក់ទំនង​ទៅ​ក្រុម...'; +$messages['removingmember'] = 'កំពុង​លុបទំនាក់ទំនង​ពី​ក្រុម...'; $messages['receiptsent'] = 'បានបញ្ជូនអážáŸ’ážáž”ទបញ្ជាក់ážáž¶áž”ានអានបានសំរáŸáž…'; $messages['errorsendingreceipt'] = 'មិនអាចបញ្ជូនអážáŸ’ážáž”ទបញ្ជាក់ážáž¶áž”ានអាន áž‘áŸ'; +$messages['deleteidentityconfirm'] = 'ážáž¾áž¢áŸ’នក​ពិážâ€‹áž‡áž¶â€‹áž…ង់​លុប​អážáŸ’ážážŸáž‰áŸ’ញាណ​នáŸáŸ‡?'; $messages['nodeletelastidentity'] = 'លោកអ្នកមិនអាចលុបអážáŸ’ážážŸáž‰áŸ’ញាណនáŸáŸ‡áž‘áŸáž–្រោះវានៅសល់ចុងក្រោយគáŸ'; $messages['forbiddencharacter'] = 'ឈ្មោះážážáž“áŸáŸ‡áž˜áž¶áž“អក្សរដែលážáŸ’រូវហាមឃាážáŸ‹'; $messages['selectimportfile'] = 'សូមជ្រើសរើសឯកសារដើម្បីបញ្ជូនភ្ជាប់'; $messages['addresswriterror'] = 'សៀវភៅអាសយដ្ឋាននោះមិនអាចសរសáŸážšáž…ូលបានទáŸ'; $messages['contactaddedtogroup'] = 'បានដាក់ពážáŸŒáž˜áž¶áž“ទំនាក់ទំនងចូលក្នុងក្រុមនáŸáŸ‡ážŠáŸ„យជោគជáŸáž™'; $messages['contactremovedfromgroup'] = 'បានលុបពážáŸŒáž˜áž¶áž“ទំនាក់ទំនងចáŸáž‰áž–ីក្រុមនáŸáŸ‡ážŠáŸ„យជោគជáŸáž™'; +$messages['nogroupassignmentschanged'] = 'គ្មាន​ការ​ផ្ដល់​ក្រុម​បាន​ប្ដូរ។'; $messages['importwait'] = 'សូមមáŸážáŸ’ážáž¶ážšáž„់ចាំកំពុងទាញទិន្ននáŸáž™áž…ូល ...'; $messages['importconfirm'] = '<b>áž–áŸážáŸŒáž˜áž¶áž“ទំនាក់ទំនង $insertedបានបញ្ចូលដោយជោគជáŸáž™,ហើយបានរំលងចោលពážáŸŒáž˜áž¶áž“ដែលមានស្រាប់$skipped </b>:<p><em>$names</em></p>'; $messages['opnotpermitted'] = 'ប្រážáž·áŸ’ážáž”ážáŸ’ážáž·áž€áž¶ážšážáŸ’រូវបានគáŸáž ាមឃាážáŸ‹!'; diff --git a/program/localization/kn_IN/labels.inc b/program/localization/kn_IN/labels.inc new file mode 100644 index 000000000..bff989285 --- /dev/null +++ b/program/localization/kn_IN/labels.inc @@ -0,0 +1,166 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | localization/<lang>/labels.inc | + | | + | Localization file of the Roundcube Webmail client | + | Copyright (C) 2005-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/labels/ +*/ +$labels['welcome'] = '$product ಗೆ ಸà³à²µà²¾à²—ತ '; +$labels['password'] = 'ರಹಸà³à²¯ ಪದ'; +$labels['addressbook'] = 'ವಿಳಾಸ ಪà³à²¸à³à²¤à²•'; +$labels['subject'] = 'ವಿಷಯ'; +$labels['from'] = 'ಇಂದ'; +$labels['to'] = 'ಗೆ'; +$labels['date'] = 'ದಿನಾಂಕ '; +$labels['size'] = 'ಗಾತà³à²°'; +$labels['priority'] = 'ಆದà³à²¯à²¤à³†'; +$labels['organization'] = 'ಸಂಘಟನೆ'; +$labels['showattachment'] = 'ತೋರಿಸà³'; +$labels['filename'] = 'ಫೈಲೠಹೆಸರà³'; +$labels['filesize'] = 'ಫೈಲೠಗಾತà³à²°'; +$labels['addtoaddressbook'] = 'ಪà³à²¸à³à²¤à²• ವಿಳಾಸ ಸೇರಿಸೠ'; +$labels['sun'] = 'à²à²¾à²¨à³ '; +$labels['mon'] = 'ಸೋಮ'; +$labels['tue'] = 'ಮಂಗಳ'; +$labels['wed'] = 'ಬà³à²§'; +$labels['thu'] = 'ಗà³à²°à³'; +$labels['fri'] = 'ಶà³à²•à³à²°'; +$labels['sat'] = 'ಶನಿ'; +$labels['sunday'] = 'à²à²¾à²¨à³à²µà²¾à²°'; +$labels['monday'] = 'ಸೋಮವಾರ'; +$labels['tuesday'] = 'ಮಂಗಳವಾರ'; +$labels['wednesday'] = 'ಬà³à²§à²µà²¾à²°'; +$labels['thursday'] = 'ಗà³à²°à³à²µà²¾à²°'; +$labels['friday'] = 'ಶà³à²•à³à²°à²µà²¾à²°'; +$labels['saturday'] = 'ಶನಿವಾರ'; +$labels['longjan'] = 'ಜನವರಿ'; +$labels['longfeb'] = 'ಫೆಬà³à²°à³à²µà²°à²¿'; +$labels['longmar'] = 'ಮಾರà³à²šà³'; +$labels['longapr'] = 'à²à²ªà³à²°à²¿à²²à³'; +$labels['longmay'] = 'ಮೇ'; +$labels['longjun'] = 'ಜೂನà³'; +$labels['longjul'] = 'ಜೂಲೈ'; +$labels['longaug'] = 'ಆಗಸà³à²Ÿà³ '; +$labels['longsep'] = 'ಸೆಪà³à²Ÿà³†à²‚ಬರ'; +$labels['longoct'] = 'ಅಕà³à²Ÿà³‹à²¬à²°'; +$labels['longnov'] = 'ನವೆಂಬರ'; +$labels['longdec'] = 'ಡಿಸೆಂಬರ'; +$labels['today'] = 'ಇಂದà³'; +$labels['checkmail'] = 'ಹೊಸ ಸಂದೇಶಗಳಿಗಾಗಿ ಪರಿಶೀಲಿಸà³'; +$labels['writenewmessage'] = 'ಒಂದೠಹೊಸ ಸಂದೇಶವನà³à²¨à³ ರಚಿಸà³'; +$labels['reply'] = 'ಉತà³à²¤à²°à²•à³†à³‚ಡà³'; +$labels['deletemessage'] = 'ಸಂದೇಶ ಅಳಿಸà³'; +$labels['printmessage'] = 'ಈ ಸಂದೇಶವನà³à²¨à³ ಮà³à²¦à³à²°à²¿à²¸à³'; +$labels['previousmessage'] = 'ಹಿಂದಿನ ಸಂದೇಶವನà³à²¨à³ ತೋರಿಸà³'; +$labels['firstmessage'] = 'ಮೊದಲ ಸಂದೇಶವನà³à²¨à³ ತೋರಿಸà³'; +$labels['nextmessage'] = 'ಮà³à²‚ದಿನ ಸಂದೇಶವನà³à²¨à³ ತೋರಿಸà³'; +$labels['lastmessage'] = 'ಕೊನೆಯ ಸಂದೇಶವನà³à²¨à³ ತೋರಿಸà³'; +$labels['unlimited'] = 'ಅನಿಯಮಿತ'; +$labels['namex'] = 'ಹೆಸರà³'; +$labels['send'] = 'ಕಳà³à²¹à²¿à²¸à³'; +$labels['sendmessage'] = 'ಸಂದೇಶ ಕಳà³à²¹à²¿à²¸à³'; +$labels['savemessage'] = 'ಡà³à²°à²¾à²«à³à²Ÿà³ ಆಗಿ ಉಳಿಸಿ'; +$labels['originalmessage'] = 'ಮೂಲ ಸಂದೇಶ'; +$labels['responsename'] = 'ಹೆಸರà³'; +$labels['close'] = 'ಮà³à²šà³à²šà³'; +$labels['messageoptions'] = 'ಸಂದೇಶ ಆಯà³à²•à³†à²—ಳà³'; +$labels['low'] = 'ಕಡಿಮೆ'; +$labels['lowest'] = 'ಅತಿ ಕಡಿಮೆ'; +$labels['normal'] = 'ಸಾಧಾರಣ'; +$labels['high'] = 'ಜಾಸà³à²¤à²¿'; +$labels['highest'] = 'ಅತಿ ಜಾಸà³à²¤à²¿ '; +$labels['nosubject'] = '(ವಿಷಯ ಇಲà³à²²)'; +$labels['showimages'] = 'ಚಿತà³à²°à²—ಳನà³à²¨à³ ತೋರಿಸà³'; +$labels['alwaysshow'] = '$sender ಇಂದ ಯಾವಾಗಲೂ ಚಿತà³à²°à²—ಳನà³à²¨à³ ತೋರಿಸà³'; +$labels['htmltoggle'] = 'HTML'; +$labels['dontsave'] = 'ಉಳಿಸಬೇಡ'; +$labels['department'] = 'ವಿà²à²¾à²—'; +$labels['gender'] = 'ಲಿಂಗ'; +$labels['email'] = 'ಇಮೇಲà³'; +$labels['phone'] = 'ದೂರವಾಣಿ'; +$labels['address'] = 'ವಿಳಾಸ'; +$labels['street'] = 'ರಸà³à²¤à³†'; +$labels['locality'] = 'ನಗರ'; +$labels['country'] = 'ದೇಶ'; +$labels['birthday'] = 'ಜನà³à²®à²¦à²¿à²¨'; +$labels['manager'] = 'ವà³à²¯à²µà²¸à³à²¥à²¾à²ªà²•'; +$labels['assistant'] = 'ಸಹಾಯಕ'; +$labels['search'] = 'ಹà³à²¡à³à²•à³'; +$labels['typehome'] = 'ಮನೆ'; +$labels['typework'] = 'ಕೆಲಸ'; +$labels['typecar'] = 'ಕಾರà³'; +$labels['addcontact'] = 'ಹೊಸ ಸಂಪರà³à²• ಸೇರಿಸಿ'; +$labels['editcontact'] = 'ಸಂಪರà³à²• ತಿದà³à²¦à³'; +$labels['contacts'] = 'ಸಂಪರà³à²•à²—ಳà³'; +$labels['edit'] = 'ತಿದà³à²¦à³'; +$labels['addphoto'] = 'ಸೇರಿಸà³'; +$labels['replacephoto'] = 'ಬದಲಾಯಿಸà³'; +$labels['uploadphoto'] = 'ಫೋಟೋ ಅಪà³à²²à³†à³‚ೕಡೠಮಾಡà³'; +$labels['deletecontact'] = 'ಆಯà³à²•à³†à²®à²¾à²¡à²¿à²¦ ಸಂಪರà³à²•à²—ಳನà³à²¨à³ ಅಳಿಸà³'; +$labels['print'] = 'ಮà³à²¦à³à²°à²¿à²¸à³'; +$labels['previouspage'] = 'ಹಿಂದಿನ ಪà³à²Ÿà²µà²¨à³à²¨à³ ತೋರಿಸà³'; +$labels['firstpage'] = 'ಮೊದಲ ಪà³à²Ÿ ತೋರಿಸà³'; +$labels['nextpage'] = 'ಮà³à²‚ದಿನ ಪà³à²Ÿ ತೋರಿಸà³'; +$labels['lastpage'] = 'ಕೊನೆಯ ಪà³à²Ÿ ತೋರಿಸà³'; +$labels['group'] = 'ಗà³à²‚ಪà³'; +$labels['groups'] = 'ಗà³à²‚ಪà³à²—ಳà³'; +$labels['preferences'] = 'ಆಯà³à²•à³†à²—ಳà³'; +$labels['userpreferences'] = 'ಬಳಕೆದಾರ ಆಯà³à²•à³†à²—ಳà³'; +$labels['editpreferences'] = 'ಬಳಕೆದಾರನ ಆಯà³à²•à³†à²—ಳನನà³à²¨à³ ತಿದà³à²¦à²¿'; +$labels['preferhtml'] = 'HTML ತೋರಿಸà³'; +$labels['htmlmessage'] = 'HTML ಸಂದೇಶ'; +$labels['digitalsig'] = 'ಡಿಜಿಟಲೠಸಹಿ'; +$labels['dateformat'] = 'ದಿನಾಂಕ ಸà³à²µà²°à³‚ಪ'; +$labels['timeformat'] = 'ಸಮಯ ಸà³à²µà²°à³‚ಪ'; +$labels['language'] = 'à²à²¾à²·à³†'; +$labels['timezone'] = 'ಸಮಯ ವಲಯ'; +$labels['pagesize'] = 'ಪà³à²°à²¤à²¿ ಪà³à²Ÿà²•à³à²•à³† ಸಾಲà³à²—ಳà³'; +$labels['signature'] = 'ಸಹಿ'; +$labels['showinextwin'] = 'ಹೊಸ ವಿಂಡೋದಲà³à²²à²¿ ಸಂದೇಶ ತೆರೆಯಿರಿ'; +$labels['composeextwin'] = 'ಹೊಸ ವಿಂಡೋದಲà³à²²à²¿ ರಚಿಸà³'; +$labels['htmleditor'] = 'HTML ಸಂದೇಶಗಳನà³à²¨à³ ರಚಿಸà³'; +$labels['htmlsignature'] = 'HTML ಸಹಿ'; +$labels['showemail'] = ' ಇಮೇಲೠವಿಳಾಸವನà³à²¨à³ ಹೆಸರಿನೊಂದಿಗೆ ತೋರಿಸà³'; +$labels['askuser'] = 'ನನನà³à²¨à³ ಕೇಳà³'; +$labels['autosend'] = 'ರಸಿಟನà³à²¨à³ ಕಳಿಸà³'; +$labels['ignore'] = 'ನಿರà³à²²à²•à³à²·à²¿à²¸à³'; +$labels['skipdeleted'] = 'ಅಳಿಸಲಾಗಿರà³à²µ ಸಂದೇಶಗಳನà³à²¨à³ ತೋರಿಸಬೇಡ'; +$labels['always'] = 'ಯಾವಾಗಲೂ'; +$labels['everynminutes'] = 'ಪà³à²°à²¤à²¿ $n ನಿಮಿಷ (ಗಳà³)'; +$labels['refreshinterval'] = 'ರಿಫà³à²°à³†à²¶à³ (ಹೊಸ ಸಂದೇಶಗಳನà³à²¨à³, ಇತà³à²¯à²¾à²¦à²¿à²—ಳನà³à²¨à³ ಪರಿಶೀಲಿಸà³)'; +$labels['immediately'] = 'ತತà³à²•à³à²·à²£ '; +$labels['mainoptions'] = 'ಮà³à²–à³à²¯ ಆಯà³à²•à³†à²—ಳà³'; +$labels['section'] = 'ವಿà²à²¾à²—'; +$labels['newmessage'] = 'ಹೊಸ ಸಂದೇಶ'; +$labels['signatureoptions'] = 'ಸಹಿ ಆಯà³à²•à³†à²—ಳà³'; +$labels['whenreplying'] = 'ಪà³à²°à²¤à³à²¯à³à²¤à³à²¤à²° ನೀಡà³à²µà²¾à²—'; +$labels['replyempty'] = 'ಮೂಲ ಸಂದೇಶವನà³à²¨à³ ಉಲà³à²²à³†à³•à²–ಿಸಬೇಡ'; +$labels['replyremovesignature'] = ' ಪà³à²°à²¤à³à²¯à³à²¤à³à²¤à²° ನೀಡà³à²µà²¾à²— ಸಂದೇಶದಿಂದ ಮೂಲಸಹಿಯನà³à²¨à³ ತೆಗೆದೠಹಾಕà³'; +$labels['newmessageonly'] = 'ಹೊಸ ಸಂದೇಶ ಮಾತà³à²° '; +$labels['insertsignature'] = 'ಸಹಿ ಸೇರಿಸà³'; +$labels['afternseconds'] = '$n ಸೆಕೆಂಡà³à²—ಳ ನಂತರ'; +$labels['addtodict'] = 'ನಿಘಂಟಿಗೆ ಸೇರಿಸà³'; +$labels['messagecount'] = 'ಸಂದೇಶಗಳà³'; +$labels['create'] = 'ರಚಿಸà³'; +$labels['properties'] = 'ಗà³à²£à²²à²•à³à²·à²£à²—ಳà³'; +$labels['location'] = 'ಸà³à²¥à²³'; +$labels['info'] = 'ಮಾಹಿತಿ'; +$labels['source'] = 'ಮೂಲ'; +$labels['B'] = 'B'; +$labels['KB'] = 'KB'; +$labels['MB'] = 'MB'; +$labels['GB'] = 'GB'; +$labels['english'] = 'ಇಂಗà³à²²à²¿à³•à²·à³'; +$labels['westerneuropean'] = 'ಪಾಶà³à²šà²¾à²¤à³à²¯ ಯà³à²°à³†à³‚ೕಪಿಯನà³'; +$labels['easterneuropean'] = 'ಪೂರà³à²µ ಯà³à²°à³†à³‚ೕಪಿಯನà³'; +?> diff --git a/program/localization/kn_IN/messages.inc b/program/localization/kn_IN/messages.inc new file mode 100644 index 000000000..7f4edf2fa --- /dev/null +++ b/program/localization/kn_IN/messages.inc @@ -0,0 +1,54 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | localization/<lang>/messages.inc | + | | + | Localization file of the Roundcube Webmail client | + | Copyright (C) 2005-2014, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/messages/ +*/ +$messages['requesttimedout'] = 'ವಿನಂತಿ ಸಮಯ ಮೀರಿತà³'; +$messages['checkingmail'] = 'ಹೊಸ ಸಂದೇಶಗಳನà³à²¨à³ ಪರಿಶೀಲಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†...'; +$messages['sendingmessage'] = 'ಸಂದೇಶ ಕಳà³à²¹à²¿à²¸à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†...'; +$messages['messagesent'] = 'ಸಂದೇಶ ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ಕಳà³à²¹à²¿à²¸à²²à²¾à²—ಿದೆ.'; +$messages['savingmessage'] = 'ಸಂದೇಶ ಉಳಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†...'; +$messages['successfullysaved'] = 'ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ಉಳಿಸಲಾಗಿದೆ.'; +$messages['contactexists'] = 'ಅದೇ ಇಮೇಲೠವಿಳಾಸದೊಂದಿಗೆ ಸಂಪರà³à²• ಈಗಾಗಲೇ ಅಸà³à²¤à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²¦à³†.'; +$messages['contactnameexists'] = 'ಅದೇ ಹೆಸರಿನ ಸಂಪರà³à²• ಈಗಾಗಲೇ ಅಸà³à²¤à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²¦à³†.'; +$messages['nocontactsfound'] = 'ಯಾವà³à²¦à³†à³• ಸಂಪರà³à²•à²—ಳೠಕಂಡà³à²¬à²‚ದಿಲà³à²².'; +$messages['contactnotfound'] = 'ವಿನಂತಿಸಿದ ಸಂಪರà³à²• ಕಂಡà³à²¬à²‚ದಿಲà³à²².'; +$messages['contactsearchonly'] = 'ಸಂಪರà³à²•à²—ಳನà³à²¨à³ ಹà³à²¡à³à²•à²²à³ ಕೆಲವೠಹà³à²¡à³à²•à²¾à²Ÿ ಪದಗಳನà³à²¨à³ ನಮೂದಿಸಿ'; +$messages['sendingfailed'] = 'ಸಂದೇಶವನà³à²¨à³ ಕಳà³à²¹à²¿à²¸à²²à³ ವಿಫಲವಾಗಿದೆ.'; +$messages['senttooquickly'] = 'ಈ ಸಂದೇಶವನà³à²¨à³ ಕಳà³à²¹à²¿à²¸à³à²µ ಮೊದಲà³, $sec ಸೆಕೆಂಡೠ(ಗಳà³) ನಿರೀಕà³à²·à²¿à²¸à²¿'; +$messages['deletecontactconfirm'] = 'ನೀವೠನಿಜವಾಗಿಯೂ ಆಯà³à²•à³† ಸಂಪರà³à²• (ಗಳನà³à²¨à³) ಅಳಿಸಲೠಬಯಸà³à²¤à³à²¤à²¿à³•à²°à²¾?'; +$messages['deletegroupconfirm'] = 'ನೀವೠನಿಜವಾಗಿಯೂ ಆಯà³à²•à³† ಗà³à²‚ಪೠಅಳಿಸಲೠಬಯಸà³à²¤à³à²¤à²¿à³•à²°à²¾?'; +$messages['deletemessagesconfirm'] = 'ನೀವೠನಿಜವಾಗಿಯೂ ಆಯà³à²¦ ಸಂದೇಶ (ಗಳೠ) ಅಳಿಸಲೠಬಯಸà³à²¤à³à²¤à²¿à³•à²°à²¾?'; +$messages['contactdeleting'] = 'ಸಂಪರà³à²•(ಗಳೠ) ಅಳಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³† ...'; +$messages['nonamewarning'] = 'ದಯವಿಟà³à²Ÿà³ ಒಂದೠಹೆಸರನà³à²¨à³ ನಮೂದಿಸಿ.'; +$messages['nopagesizewarning'] = 'ದಯವಿಟà³à²Ÿà³ ಒಂದೠಪà³à²Ÿà²¦ ಗಾತà³à²° ನಮೂದಿಸಿ.'; +$messages['norecipientwarning'] = 'ದಯವಿಟà³à²Ÿà³ ಕನಿಷà³à² ಒಬà³à²¬ ಸà³à²µà²¿à³•à²•à²°à²¿à²¸à³à²µà²µà²°à²¨à³à²¨à³ ನಮೂದಿಸಿ.'; +$messages['nosubjectwarning'] = '"ವಿಷಯ" ಕà³à²·à³†à³•à²¤à³à²° ಖಾಲಿಯಾಗಿದೆ. ನೀವೠಈಗ ಒಂದೠದಾಖಲಿಸಲೠಇಚà³à²›à²¿à²¸à³à²µà²¿à²°?'; +$messages['nosearchname'] = 'ದಯವಿಟà³à²Ÿà³ ಸಂಪರà³à²• ಹೆಸರೠಅಥವಾ ಇಮೇಲೠವಿಳಾಸವನà³à²¨à³ ನಮೂದಿಸಿ.'; +$messages['contactsearchsuccessful'] = '$nr ಸಂಪರà³à²•à²—ಳೠಸಿಕà³à²•à²¿à²µà³†.'; +$messages['searching'] = 'ಹà³à²¡à³à²•à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†...'; +$messages['checking'] = 'ಪರಿಶೀಲಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†...'; +$messages['nospellerrors'] = 'ಕಾಗà³à²£à²¿à²¤ ದೋಷಗಳನà³à²¨à³ ಕಂಡà³à²¬à²‚ದಿಲà³à²².'; +$messages['deletedsuccessfully'] = 'ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ಅಳಿಸಲಾಗಿದೆ.'; +$messages['fileuploaderror'] = 'ಫೈಲೠಅಪà³à²²à³†à³‚ೕಡೠವಿಫಲವಾಗಿದೆ.'; +$messages['filesizeerror'] = 'ಅಪà³à²²à³†à³‚ೕಡೠಮಾಡಿದ ಫೈಲೠ$size ಗರಿಷà³à² ಗಾತà³à²°à²µà²¨à³à²¨à³ ಮೀರಿದೆ'; +$messages['errorsavingcontact'] = 'ಸಂಪರà³à²• ವಿಳಾಸ ಉಳಿಸಲಾಗಲಿಲà³à²².'; +$messages['selectimportfile'] = 'ಅಪà³à²²à³†à³‚ೕಡೠಮಾಡಲೠಫೈಲೠಆಯà³à²•à³† ಮಾಡಿ.'; +$messages['emailformaterror'] = 'ಅಮಾನà³à²¯à²µà²¾à²¦ ಇಮೇಲೠವಿಳಾಸ: $email'; +$messages['autocompletechars'] = 'ಸà³à²µà²¯à²‚ಪೂರà³à²£à²—ೊಳಿಸà³à²µà²¿à²•à³† ಕನಿಷà³à² $min ಅಕà³à²·à²°à²—ಳನà³à²¨à³ ನಮೂದಿಸಿ.'; +$messages['namecannotbeempty'] = 'ಹೆಸರೠಖಾಲಿ ಇರà³à²µà²‚ತಿಲà³à²².'; +$messages['nametoolong'] = 'ಹೆಸರೠತà³à²‚ಬಾ ಉದà³à²¦à²µà²¾à²—ಿದೆ.'; +$messages['mispellingsfound'] = 'ಸಂದೇಶದಲà³à²²à²¿ ಕಾಗà³à²£à²¿à²¤ ದೋಷಗಳೠಪತà³à²¤à³†à²¯à²¾à²—ಿವೆ.'; +?> diff --git a/program/localization/ko_KR/labels.inc b/program/localization/ko_KR/labels.inc index bccd42163..fdb43166d 100644 --- a/program/localization/ko_KR/labels.inc +++ b/program/localization/ko_KR/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = 'ì´ $countê°œ 중 $from 번째 - $to 번째'; $labels['copy'] = '복사'; $labels['move'] = 'ì´ë™'; $labels['moveto'] = 'ì´ë™í• 위치...'; +$labels['copyto'] = '복사 위치...'; $labels['download'] = '다운로드'; $labels['open'] = '열기'; $labels['showattachment'] = '보기'; @@ -104,7 +105,7 @@ $labels['compose'] = '메시지 작성'; $labels['writenewmessage'] = '새 메시지 ìƒì„±'; $labels['reply'] = 'íšŒì‹ '; $labels['replytomessage'] = 'ë°œì‹ ì¸ì—게 íšŒì‹ '; -$labels['replytoallmessage'] = '보낸 사람과 ëª¨ë“ ìˆ˜ì‹ ì¸ì—게 íšŒì‹ '; +$labels['replytoallmessage'] = 'ëª©ë¡ ë˜ëŠ” ë°œì‹ ì¸ ë° ëª¨ë“ ìˆ˜ì‹ ì¸ì—게 íšŒì‹ '; $labels['replyall'] = 'ì „ì²´ íšŒì‹ '; $labels['replylist'] = 'íšŒì‹ ëª©ë¡'; $labels['forward'] = 'ì „ë‹¬'; @@ -197,6 +198,16 @@ $labels['spellcheck'] = '맞춤법'; $labels['checkspelling'] = '맞춤법 검사하기'; $labels['resumeediting'] = '편집 계ì†í•˜ê¸°'; $labels['revertto'] = 'ëŒì•„가기'; +$labels['restore'] = '복구'; +$labels['restoremessage'] = '메시지를 ë³µêµ¬í• ê¹Œìš”?'; +$labels['responses'] = 'ì‘답'; +$labels['insertresponse'] = 'ì‘답 삽입'; +$labels['manageresponses'] = 'ì‘답 관리'; +$labels['savenewresponse'] = '새로운 ì‘답 ì €ìž¥'; +$labels['editresponses'] = 'ì‘답 편집'; +$labels['editresponse'] = 'ì‘답 편집'; +$labels['responsename'] = 'ì´ë¦„'; +$labels['responsetext'] = 'ì‘답 í…스트'; $labels['attach'] = '첨부'; $labels['attachments'] = '첨부파ì¼'; $labels['upload'] = '업로드'; @@ -224,10 +235,10 @@ $labels['addcc'] = '참조 추가'; $labels['addbcc'] = 'ìˆ¨ì€ ì°¸ì¡° 추가'; $labels['addreplyto'] = 'íšŒì‹ ì£¼ì†Œ 추가'; $labels['addfollowupto'] = 'ì „ë‹¬ 추가'; -$labels['mdnrequest'] = 'ì´ ë©”ì‹œì§€ë¥¼ 보낸 ì‚¬ëžŒì´ ì‚¬ìš©ìžê°€ ì´ ë©”ì‹œì§€ë¥¼ ì½ì—ˆì„ ë•Œ ì½ìŒ 확ì¸ì„ ìš”ì²í–ˆìŠµë‹ˆë‹¤. 보낸 사람ì—게 ì•Œë¦¬ì‹œê² ìŠµë‹ˆê¹Œ?'; -$labels['receiptread'] = 'ìˆ˜ì‹ í™•ì¸ (ì½ìŒ)'; +$labels['mdnrequest'] = 'ì´ ë©”ì‹œì§€ì˜ ë°œì‹ ì¸ì´ 사용ìžê°€ ì´ ë©”ì‹œì§€ë¥¼ ì½ì—ˆì„ ë•Œ ì½ìŒ 확ì¸ì„ ìš”ì²í–ˆìŠµë‹ˆë‹¤. ë°œì‹ ì¸ì—게 ì•Œë¦¬ì‹œê² ìŠµë‹ˆê¹Œ?'; +$labels['receiptread'] = 'ìˆ˜ì‹ í™•ì¸(ì½ìŒ)'; $labels['yourmessage'] = 'ì´ê²ƒì€ 사용ìžì˜ ë©”ì‹œì§€ì— ëŒ€í•œ ìˆ˜ì‹ í™•ì¸ìž…니다.'; -$labels['receiptnote'] = 'ì°¸ê³ : ì´ ìˆ˜ì‹ í™•ì¸ì€ ì´ ë©”ì‹œì§€ê°€ 받는 ì‚¬ëžŒì˜ ì»´í“¨í„°ì— í‘œì‹œë˜ì—ˆë‹¤ëŠ” ê²ƒë§Œì„ ì˜ë¯¸í•©ë‹ˆë‹¤. 받는 ì‚¬ëžŒì´ ë©”ì‹œì§€ ë‚´ìš©ì„ ì½ê±°ë‚˜ ì´í•´í–ˆë‹¤ëŠ” ë³´ìž¥ì€ ì—†ìŠµë‹ˆë‹¤.'; +$labels['receiptnote'] = 'ì°¸ê³ : ì´ ìˆ˜ì‹ í™•ì¸ì€ ì´ ë©”ì‹œì§€ê°€ ìˆ˜ì‹ ì¸ì˜ ì»´í“¨í„°ì— í‘œì‹œë˜ì—ˆë‹¤ëŠ” ê²ƒë§Œì„ ì˜ë¯¸í•©ë‹ˆë‹¤. ìˆ˜ì‹ ì¸ì´ 메시지 ë‚´ìš©ì„ ì½ì—ˆê±°ë‚˜ ì´í•´í–ˆë‹¤ëŠ” ë³´ìž¥ì€ ì—†ìŠµë‹ˆë‹¤.'; $labels['name'] = '표시명'; $labels['firstname'] = 'ì´ë¦„'; $labels['surname'] = '성'; @@ -361,7 +372,7 @@ $labels['logoutclear'] = 'ë¡œê·¸ì•„ì›ƒí• ë•Œ 휴지통 비우기'; $labels['logoutcompact'] = 'ë¡œê·¸ì•„ì›ƒí• ë•Œ ë°›ì€ íŽ¸ì§€í•¨ 압축하기'; $labels['uisettings'] = 'ì‚¬ìš©ìž ì¸í„°íŽ˜ì´ìŠ¤'; $labels['serversettings'] = '서버 ì„¤ì •'; -$labels['mailboxview'] = 'ë©”ì¼í•¨ 화면'; +$labels['mailboxview'] = '편지함 화면'; $labels['mdnrequests'] = 'ìˆ˜ì‹ í™•ì¸ ìš”ì² ì‹œ'; $labels['askuser'] = '사용ìžì—게 물어봄'; $labels['autosend'] = 'ìˆ˜ì‹ í™•ì¸ ë³´ë‚´ê¸°'; @@ -428,6 +439,9 @@ $labels['standardwindows'] = 'íŒì—…ì„ ì¼ë°˜ ì°½ê°™ì´ ì·¨ê¸‰'; $labels['forwardmode'] = '메시지 ì „ë‹¬'; $labels['inline'] = '본문 내용으로'; $labels['asattachment'] = '첨부파ì¼ë¡œ'; +$labels['replyallmode'] = '[ì „ì²´ íšŒì‹ ] ë²„íŠ¼ì˜ ê¸°ë³¸ ë™ìž‘'; +$labels['replyalldefault'] = 'ì „ì²´ íšŒì‹ '; +$labels['replyalllist'] = '발송목ë¡ì—만 íšŒì‹ (ì°¾ì•˜ì„ ê²½ìš°)'; $labels['folder'] = 'í´ë”'; $labels['folders'] = 'í´ë”'; $labels['foldername'] = 'í´ë”명'; diff --git a/program/localization/ko_KR/messages.inc b/program/localization/ko_KR/messages.inc index f6f274c43..3c7060c59 100644 --- a/program/localization/ko_KR/messages.inc +++ b/program/localization/ko_KR/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -15,7 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/messages/ */ -$messages['errortitle'] = '오류 ë°œìƒ!'; +$messages['errortitle'] = '오류가 ë°œìƒí•˜ì˜€ìŒ!'; $messages['loginfailed'] = '로그ì¸ì´ 실패하였습니다.'; $messages['cookiesdisabled'] = '브ë¼ìš°ì €ê°€ ì¿ í‚¤ë¥¼ 지ì›í•˜ì§€ 않습니다.'; $messages['sessionerror'] = 'ì„¸ì…˜ì´ ìœ íš¨í•˜ì§€ 않거나 종료ë˜ì—ˆìŠµë‹ˆë‹¤.'; @@ -26,13 +26,14 @@ $messages['dberror'] = 'ë°ì´í„°ë² ì´ìŠ¤ 오류!'; $messages['requesttimedout'] = 'ìš”ì² ì‹œê°„ 초과'; $messages['errorreadonly'] = 'ëª…ë ¹ì„ ìˆ˜í–‰í• ìˆ˜ 없습니다. ì½ê¸° ì „ìš© í´ë”ìž„.'; $messages['errornoperm'] = 'ëª…ë ¹ì„ ìˆ˜í–‰í• ìˆ˜ 없습니다. ê¶Œí•œì´ ê±°ë¶€ë¨.'; -$messages['erroroverquota'] = 'ìž‘ì—…ì„ ìˆ˜í–‰í• ìˆ˜ ì—†ìŒ. ì—¬ìœ ê³µê°„ì´ ì—†ìŒ.'; -$messages['erroroverquotadelete'] = 'ì—¬ìœ ê³µê°„ì´ ì—†ìŒ. SHIFT-DELì„ ì´ìš©í•˜ì—¬ 메시지를 ì‚ì œí•˜ì„¸ìš”.'; +$messages['erroroverquota'] = 'ìž‘ì—…ì„ ìˆ˜í–‰í• ìˆ˜ ì—†ìŒ. ì—¬ìœ ë””ìŠ¤í¬ ê³µê°„ì´ ì—†ìŒ.'; +$messages['erroroverquotadelete'] = 'ì—¬ìœ ë””ìŠ¤í¬ ê³µê°„ì´ ì—†ìŒ. SHIFT-DELì„ ì´ìš©í•˜ì—¬ 메시지를 ì‚ì œí•˜ì‹ì‹œì˜¤.'; $messages['invalidrequest'] = 'ìž˜ëª»ëœ ìš”ì²! ë°ì´í„°ê°€ ì €ìž¥ë˜ì§€ 않았ìŒ.'; $messages['invalidhost'] = 'ìž˜ëª»ëœ ì„œë²„ ì´ë¦„입니다.'; -$messages['nomessagesfound'] = 'ì´ ë©”ì¼í•¨ì— ë©”ì¼ì´ 없습니다.'; +$messages['nomessagesfound'] = 'ì´ ë©”ì¼í•¨ì—ì„œ ë©”ì¼ì„ 찾지 못했ìŒ.'; $messages['loggedout'] = 'ì„¸ì…˜ì„ ì„±ê³µì 으로 종료하였습니다. 안녕히 가세요!'; -$messages['mailboxempty'] = 'ë©”ì¼í•¨ì´ 비어있습니다.'; +$messages['mailboxempty'] = 'ë©”ì¼í•¨ì´ 비어있ìŒ'; +$messages['nomessages'] = '메시지가 ì—†ìŒ'; $messages['refreshing'] = '새로 ê³ ì¹˜ëŠ” 중 ...'; $messages['loading'] = '불러오는 중...'; $messages['uploading'] = '파ì¼ì„ 업로드하는 중...'; @@ -44,16 +45,20 @@ $messages['messagesent'] = '메시지를 성공ì 으로 보냈습니다.'; $messages['savingmessage'] = '메시지를 ì €ìž¥í•˜ëŠ” 중...'; $messages['messagesaved'] = '메시지가 ìž„ì‹œ ë³´ê´€í•¨ì— ì €ìž¥ë˜ì—ˆìŠµë‹ˆë‹¤.'; $messages['successfullysaved'] = '성공ì 으로 ì €ìž¥ë¨.'; +$messages['savingresponse'] = 'ì‘답 문구를 ì €ìž¥í•˜ëŠ” 중...'; +$messages['deleteresponseconfirm'] = 'ì •ë§ë¡œ ì´ ì‘답 문구를 ì‚ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?'; $messages['addedsuccessfully'] = 'ì—°ë½ì²˜ê°€ 주소ë¡ì— 성공ì 으로 추가ë˜ì—ˆìŠµë‹ˆë‹¤.'; $messages['contactexists'] = 'ì—°ë½ì²˜ì— ë™ì¼í•œ ì´ë©”ì¼ ì£¼ì†Œê°€ ì´ë¯¸ 존재합니다.'; $messages['contactnameexists'] = 'ì—°ë½ì²˜ì— ë™ì¼í•œ ì´ë¦„ì´ ì´ë¯¸ 존재합니다.'; $messages['blockedimages'] = 'ë³´ì•ˆì„ ìœ„í•´, ì´ ë©”ì‹œì§€ì˜ ì™¸ë¶€ ì´ë¯¸ì§€ë¥¼ 차단하였습니다.'; $messages['encryptedmessage'] = 'ì´ê²ƒì€ ì•”í˜¸í™”ëœ ë©”ì‹œì§€ë©° í‘œì‹œí• ìˆ˜ 없습니다. 죄송합니다!'; -$messages['nocontactsfound'] = 'ì—°ë½ì²˜ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ.'; +$messages['nocontactsfound'] = 'ì—°ë½ì²˜ë¥¼ ì°¾ì„ ìˆ˜ 없었ìŒ.'; $messages['contactnotfound'] = 'ìš”ì²í•œ ì—°ë½ì²˜ë¥¼ ì°¾ì„ ìˆ˜ 없었습니다.'; $messages['contactsearchonly'] = 'ì—°ë½ì²˜ë¥¼ 찾기 위해 ì¼ë¶€ 검색용어를 ìž…ë ¥í•˜ì„¸ìš”.'; $messages['sendingfailed'] = '메시지 보내기를 실패하였ìŒ.'; $messages['senttooquickly'] = 'ì´ ë©”ì‹œì§€ë¥¼ 보내기 ì „ì— $secì´ˆ ë™ì•ˆ 기다리세요.'; +$messages['errorsavingsent'] = '보낸 메시지를 ì €ìž¥í•˜ëŠ” 중 오류가 ë°œìƒí•˜ì˜€ìŒ.'; +$messages['errorsaving'] = 'ì €ìž¥í•˜ëŠ” 중 오류가 ë°œìƒí•˜ì˜€ìŒ.'; $messages['errormoving'] = '메시지를 ì´ë™í• 수 없었ìŒ.'; $messages['errorcopying'] = '메시지를 ë³µì‚¬í• ìˆ˜ 없었ìŒ.'; $messages['errordeleting'] = '메시지를 ì‚ì œí• ìˆ˜ 없었ìŒ.'; @@ -74,19 +79,20 @@ $messages['noemailwarning'] = 'ìœ íš¨í•œ ì´ë©”ì¼ ì£¼ì†Œë¥¼ ìž…ë ¥í•˜ì‹œê¸° ë°” $messages['nonamewarning'] = 'ì´ë¦„ì„ ìž…ë ¥í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤.'; $messages['nopagesizewarning'] = '페ì´ì§€ í¬ê¸°ë¥¼ ìž…ë ¥í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤.'; $messages['nosenderwarning'] = 'ë°œì‹ ì¸ ì´ë©”ì¼ ì£¼ì†Œë¥¼ ìž…ë ¥í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤.'; -$messages['norecipientwarning'] = 'ì ì–´ë„ í•œ ê°œ ì´ìƒì˜ ìˆ˜ì‹ ì¸ ì£¼ì†Œë¥¼ ìž…ë ¥í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤.'; +$messages['norecipientwarning'] = '최소 í•œ 명 ì´ìƒì˜ ìˆ˜ì‹ ì¸ì„ ìž…ë ¥í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤.'; $messages['nosubjectwarning'] = '"ì œëª©" 필드가 비어있습니다. 지금 ìž…ë ¥í•˜ì‹œê² ìŠµë‹ˆê¹Œ?'; $messages['nobodywarning'] = 'í…스트가 없는 메시지를 ë³´ë‚´ì‹œê² ìŠµë‹ˆê¹Œ?'; $messages['notsentwarning'] = '메시지를 보내지 못했습니다. 메시지를 íê¸°í•˜ì‹œê² ìŠµë‹ˆê¹Œ?'; +$messages['restoresavedcomposedata'] = 'ì´ì „ì— ìž‘ì„±í–ˆì§€ë§Œ 보내지 ì•Šì€ ë©”ì‹œì§€ë¥¼ 찾았습니다.\n\nSubject: $subject\nSaved: $date\n\nì´ ë©”ì‹œì§€ë¥¼ ë³µêµ¬í•˜ì‹œê² ìŠµë‹ˆê¹Œ?'; $messages['noldapserver'] = 'ê²€ìƒ‰í• LDAP 서버를 ì„ íƒí•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤.'; $messages['nosearchname'] = 'ì—°ë½ì²˜ëª…ì´ë‚˜ ì´ë©”ì¼ ì£¼ì†Œë¥¼ ìž…ë ¥í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤.'; $messages['notuploadedwarning'] = 'ì•„ì§ ëª¨ë“ ì²¨ë¶€ê°€ 업로드ë˜ì§€ 않았습니다. 기다리거나 업로드를 취소하시기 ë°”ëžë‹ˆë‹¤.'; -$messages['searchsuccessful'] = '$nrê°œì˜ ë©”ì‹œì§€ë¥¼ ì°¾ìŒ.'; -$messages['contactsearchsuccessful'] = '$nrê°œì˜ ì—°ë½ì²˜ë¥¼ ì°¾ìŒ.'; +$messages['searchsuccessful'] = '$nrê°œì˜ ë©”ì‹œì§€ë¥¼ 찾았ìŒ.'; +$messages['contactsearchsuccessful'] = '$nrê°œì˜ ì—°ë½ì²˜ë¥¼ 찾았ìŒ.'; $messages['searchnomatch'] = 'ê²€ìƒ‰ì´ ì¼ì¹˜ í•ëª©ì„ 찾지 못함.'; $messages['searching'] = '검색 중...'; $messages['checking'] = 'í™•ì¸ ì¤‘...'; -$messages['nospellerrors'] = '맞춤법 오류를 찾지 못함.'; +$messages['nospellerrors'] = '맞춤법 오류를 찾지 못했ìŒ.'; $messages['folderdeleted'] = 'í´ë”를 성공ì 으로 ì‚ì œí•¨.'; $messages['foldersubscribed'] = 'í´ë”를 성공ì 으로 구ë…함.'; $messages['folderunsubscribed'] = 'í´ë”를 성공ì 으로 êµ¬ë… ì·¨ì†Œí•¨.'; @@ -94,15 +100,15 @@ $messages['folderpurged'] = 'í´ë”를 성공ì 으로 ë¹„ì› ìŠµë‹ˆë‹¤.'; $messages['folderexpunged'] = 'í´ë”를 성공ì 으로 압축하였습니다.'; $messages['deletedsuccessfully'] = '성공ì 으로 ì‚ì œí•¨.'; $messages['converting'] = 'ì„œì‹ ì„¤ì • ì‚ì œ 중...'; -$messages['messageopenerror'] = '서버ì—ì„œ 메시지를 불러올 수 ì—†ìŒ.'; +$messages['messageopenerror'] = '서버ì—ì„œ 메시지를 불러올 수 없었ìŒ.'; $messages['fileuploaderror'] = 'íŒŒì¼ ì—…ë¡œë“œë¥¼ 실패함.'; $messages['filesizeerror'] = 'ì—…ë¡œë“œëœ íŒŒì¼ì´ 최대 í¬ê¸°ì¸ $size를 초과하였습니다.'; $messages['copysuccess'] = '$nrê°œì˜ ì—°ë½ì²˜ë¥¼ 성공ì 으로 복사함'; $messages['movesuccess'] = '$nrê°œì˜ ì—°ë½ì²˜ë¥¼ 성공ì 으로 ì´ë™í•¨'; $messages['copyerror'] = 'ì „ì²´ ì—°ë½ì²˜ë¥¼ ë³µì‚¬í• ìˆ˜ 없없ìŒ'; -$messages['moveerror'] = 'ì „ì²´ ì—°ë½ì²˜ë¥¼ ì´ë™í• 수 없없ìŒ'; +$messages['moveerror'] = 'ì „ì²´ ì—°ë½ì²˜ë¥¼ ì´ë™í• 수 없었ìŒ'; $messages['sourceisreadonly'] = 'ì´ ì£¼ì†Œì˜ ì†ŒìŠ¤ëŠ” ì½ê¸° ì „ìš©ìž…ë‹ˆë‹¤.'; -$messages['errorsavingcontact'] = 'ì—°ë½ì²˜ì˜ 주소를 ì €ìž¥í• ìˆ˜ ì—†ìŒ.'; +$messages['errorsavingcontact'] = 'ì—°ë½ì²˜ì˜ 주소를 ì €ìž¥í• ìˆ˜ 없었ìŒ.'; $messages['movingmessage'] = '메시지를 ì´ë™í•˜ëŠ” 중...'; $messages['copyingmessage'] = '메시지 복사하는 중...'; $messages['copyingcontact'] = 'ì—°ë½ì²˜ 복사하는 중...'; @@ -111,8 +117,8 @@ $messages['deletingmessage'] = '메시지 ì‚ì œí•˜ëŠ” 중...'; $messages['markingmessage'] = 'ë©”ì‹œì§€ì— í‘œì‹œí•˜ëŠ” 중...'; $messages['addingmember'] = 'ê·¸ë£¹ì— ì—°ë½ì²˜ë¥¼ 추가하는 중...'; $messages['removingmember'] = '그룹ì—ì„œ ì—°ë½ì²˜ë¥¼ ì‚ì œí•˜ëŠ” 중...'; -$messages['receiptsent'] = 'ì½ìŒ 확ì¸ì„ 보냄.'; -$messages['errorsendingreceipt'] = 'ì½ìŒ 확ì¸ì„ 보낼 수 ì—†ìŒ.'; +$messages['receiptsent'] = 'ì½ìŒ 확ì¸ì„ 성공ì 으로 보냈ìŒ.'; +$messages['errorsendingreceipt'] = 'ì½ìŒ 확ì¸ì„ 보낼 수 없었ìŒ.'; $messages['deleteidentityconfirm'] = 'ì´ í•ëª©ì„ ì •ë§ë¡œ ì‚ì œ í•˜ì‹œê² ìŠµë‹ˆê¹Œ?'; $messages['nodeletelastidentity'] = 'ì´ ì‹ ì›ì€ 마지막 하나ì´ë¯€ë¡œ ì‚ì œí• ìˆ˜ 없습니다.'; $messages['forbiddencharacter'] = 'í´ë”ëª…ì— ê¸ˆì§€ëœ ë¬¸ìžê°€ í¬í•¨ë˜ì–´ 있습니다.'; @@ -120,14 +126,14 @@ $messages['selectimportfile'] = 'ì—…ë¡œë“œí• íŒŒì¼ì„ ì„ íƒí•´ì£¼ì‹œê¸° ë°”ëž $messages['addresswriterror'] = 'ì„ íƒëœ 주소ë¡ì€ 쓰기가 불가능합니다.'; $messages['contactaddedtogroup'] = 'ì´ ê·¸ë£¹ì— ì—°ë½ì²˜ë¥¼ 성공ì 으로 추가함.'; $messages['contactremovedfromgroup'] = 'ì´ ê·¸ë£¹ì—ì„œ ì—°ë½ì²˜ë¥¼ 성공ì 으로 ì œê±°í•¨.'; -$messages['nogroupassignmentschanged'] = '그룹 í• ë‹¹ì´ ë³€ê²½ë˜ì§€ ì•ŠìŒ.'; +$messages['nogroupassignmentschanged'] = '그룹 í• ë‹¹ì´ ë³€ê²½ë˜ì§€ 않았ìŒ.'; $messages['importwait'] = 'ê°€ì ¸ì˜¤ëŠ” 중, ê¸°ë‹¤ë ¤ì£¼ì‹œê¸° ë°”ëžë‹ˆë‹¤...'; $messages['importformaterror'] = 'ê°€ì ¸ì˜¤ê¸°ë¥¼ 실패함! ì—…ë¡œë“œëœ íŒŒì¼ì€ ìœ íš¨í•˜ì§€ ì•Šì€ ê°€ì ¸ì˜¤ê¸° ë°ì´í„° 파ì¼ìž…니다.'; $messages['importconfirm'] = '<b>$inserted ì—°ë½ì²˜ë¥¼ 성공ì 으로 ê°€ì ¸ì˜´<b>'; $messages['importconfirmskipped'] = '<b>기존 기재사í•ì¸ $skippedì„(를) 건너뜀</b>'; $messages['importmessagesuccess'] = '$nrê°œì˜ ë©”ì‹œì§€ë¥¼ 성공ì 으로 ê°€ì ¸ì˜´'; $messages['importmessageerror'] = 'ê°€ì ¸ì˜¤ê¸° 실패! ì—…ë¡œë“œëœ íŒŒì¼ì€ ìœ íš¨í•˜ì§€ ì•Šì€ ë©”ì‹œì§€ ë˜ëŠ” ë©”ì¼í•¨ 파ì¼ìž„'; -$messages['opnotpermitted'] = 'ìž‘ì—…ì´ í—ˆê°€ë˜ì§€ ì•ŠìŒ!'; +$messages['opnotpermitted'] = 'ìž‘ì—…ì´ í—ˆê°€ë˜ì§€ 않았ìŒ!'; $messages['nofromaddress'] = 'ì„ íƒëœ ì‹ ì›ì— ì´ë©”ì¼ ì£¼ì†Œ ê°€ 누ë½ë¨.'; $messages['editorwarning'] = 'ì¼ë°˜ í…스트 편집기로 바꾸면 ëª¨ë“ í…스트 ì„œì‹ì´ 사ë¼ì§‘니다. 계ì†í•˜ì‹œê² 습니까?'; $messages['httpreceivedencrypterror'] = '치명ì ì¸ êµ¬ì„± 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤. 즉시 관리ìžì—게 ì—°ë½í•˜ì„¸ìš”. @@ -139,17 +145,18 @@ $messages['smtptoerror'] = 'SMTP 오류 ($code): ìˆ˜ì‹ ì¸ì„ "$to" ($msg)ì— ì¶ $messages['smtprecipientserror'] = 'SMTP 오류: ìˆ˜ì‹ ì¸ ëª©ë¡ì„ 분ì„(parse)í• ìˆ˜ ì—†ìŒ.'; $messages['smtperror'] = 'SMTP 오류: $msg'; $messages['emailformaterror'] = 'ìœ íš¨í•˜ì§€ ì•Šì€ ì´ë©”ì¼ ì£¼ì†Œ: $email'; -$messages['toomanyrecipients'] = 'ìˆ˜ì‹ ì¸ì´ 너무 많ìŒ. ìˆ˜ì‹ ì¸ ìˆ˜ë¥¼ $max명으로 줄ì´ì„¸ìš”.'; +$messages['toomanyrecipients'] = 'ìˆ˜ì‹ ì¸ì´ 너무 많ìŒ. ìˆ˜ì‹ ì¸ ìˆ˜ë¥¼ $max명으로 줄ì´ì‹ì‹œì˜¤.'; $messages['maxgroupmembersreached'] = '그룹 구성ì›ì˜ 수가 최대 ì¸ì›ì¸ $maxëª…ì„ ì´ˆê³¼í•©ë‹ˆë‹¤.'; -$messages['contactdelerror'] = 'ì—°ë½ì²˜ë¥¼ ì‚ì œí• ìˆ˜ ì—†ìŒ.'; +$messages['internalerror'] = '내부 오류가 ë°œìƒí•˜ì˜€ìŒ. 다시 ì‹œë„하ì‹ì‹œì˜¤.'; +$messages['contactdelerror'] = 'ì—°ë½ì²˜ë¥¼ ì‚ì œí• ìˆ˜ 없었ìŒ.'; $messages['contactdeleted'] = 'ì—°ë½ì²˜ê°€ 성공ì 으로 ì‚ì œë¨.'; -$messages['contactrestoreerror'] = 'ì‚ì œëœ ì—°ë½ì²˜ë¥¼ ë³µêµ¬í• ìˆ˜ ì—†ìŒ.'; +$messages['contactrestoreerror'] = 'ì‚ì œëœ ì—°ë½ì²˜ë¥¼ ë³µêµ¬í• ìˆ˜ 없었ìŒ.'; $messages['contactrestored'] = 'ì—°ë½ì²˜ê°€ 성공ì 으로 복구ë¨.'; $messages['groupdeleted'] = 'ê·¸ë£¹ì´ ì„±ê³µì 으로 ì‚ì œë¨.'; $messages['grouprenamed'] = 'ê·¸ë£¹ëª…ì´ ì„±ê³µì 으로 변경ë¨.'; $messages['groupcreated'] = 'ê·¸ë£¹ì´ ì„±ê³µì 으로 ìƒì„±ë¨.'; $messages['savedsearchdeleted'] = 'ì €ìž¥ëœ ê²€ìƒ‰ì´ ì„±ê³µì 으로 ì‚ì œë¨.'; -$messages['savedsearchdeleteerror'] = 'ì €ìž¥ëœ ì •ë³´ë¥¼ ì‚ì œí• ìˆ˜ 없었ìŒ.'; +$messages['savedsearchdeleteerror'] = 'ì €ìž¥ëœ ê²€ìƒ‰ì„ ì‚ì œí• ìˆ˜ 없었ìŒ.'; $messages['savedsearchcreated'] = 'ì €ìž¥ëœ ê²€ìƒ‰ì´ ì„±ê³µì 으로 ìƒì„±ë¨.'; $messages['savedsearchcreateerror'] = 'ì €ìž¥ëœ ê²€ìƒ‰ì„ ìƒì„±í• 수 없었ìŒ.'; $messages['messagedeleted'] = '메시지가 성공ì 으로 ì‚ì œë¨.'; @@ -157,7 +164,7 @@ $messages['messagemoved'] = '메시지가 성공ì 으로 ì´ë™ë¨.'; $messages['messagecopied'] = '메시지가 성공ì 으로 복사ë¨.'; $messages['messagemarked'] = 'ë©”ì‹œì§€ì— ì„±ê³µì 으로 표시ë¨.'; $messages['autocompletechars'] = 'ìžë™ ì™„ì„±ì„ ìœ„í•´ì„œ ì ì–´ë„ $minê°œì˜ ë¬¸ìžë¥¼ ìž…ë ¥í•˜ì„¸ìš”.'; -$messages['autocompletemore'] = 'ë” ë§Žì€ ì¼ì¹˜ í•ëª©ì´ 발견ë¨. ë” ë§Žì€ ë¬¸ìžë¥¼ ìž…ë ¥í•´ì£¼ì‹œê¸° ë°”ëžë‹ˆë‹¤.'; +$messages['autocompletemore'] = 'ë” ë§Žì€ ì¼ì¹˜í•˜ëŠ” í•ëª©ì„ 찾았ìŒ. ë” ë§Žì€ ë¬¸ìžë¥¼ ìž…ë ¥í•´ì£¼ì‹ì‹œì˜¤.'; $messages['namecannotbeempty'] = 'ì´ë¦„ì„ ë¹„ì›Œë‘˜ 수 없습니다.'; $messages['nametoolong'] = 'ì´ë¦„ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤.'; $messages['folderupdated'] = 'í´ë”ê°€ 성공ì 으로 ì—…ë°ì´íŠ¸ë¨.'; diff --git a/program/localization/ku/messages.inc b/program/localization/ku/messages.inc index 6000aacb0..95d33d78f 100644 --- a/program/localization/ku/messages.inc +++ b/program/localization/ku/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -21,7 +21,6 @@ $messages['sessionerror'] = 'Danişîna te çewt e an jî bi dawî bûye'; $messages['storageerror'] = 'Girêdana pêşkêşkara IMAP têk çû'; $messages['nomessagesfound'] = 'Di vê peyamdankê de tu peyam nehat dîtin'; $messages['loggedout'] = 'Te danişînî bi dawî anî. Oxir be!'; -$messages['mailboxempty'] = 'Peyamdank vala ye'; $messages['loading'] = 'Tê barkirin...'; $messages['loadingdata'] = 'Dane tên barkirin...'; $messages['checkingmail'] = 'Li peyamên nû vedinihêre...'; diff --git a/program/localization/lb_LU/labels.inc b/program/localization/lb_LU/labels.inc index 00a133af3..edfa6e5d1 100644 --- a/program/localization/lb_LU/labels.inc +++ b/program/localization/lb_LU/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from bis $to vun $count'; $labels['copy'] = 'Kopéieren'; $labels['move'] = 'Réckelen'; $labels['moveto'] = 'Réckelen an...'; +$labels['copyto'] = 'Kopéieren op...'; $labels['download'] = 'Eroflueden'; $labels['open'] = 'Opmaachen'; $labels['showattachment'] = 'Weisen'; @@ -62,10 +63,10 @@ $labels['addtoaddressbook'] = 'An d\'Adressbuch setzen'; $labels['sun'] = 'Son'; $labels['mon'] = 'Méi'; $labels['tue'] = 'Dën'; -$labels['wed'] = 'Don'; -$labels['thu'] = 'Fre'; -$labels['fri'] = 'Sam'; -$labels['sat'] = 'Son'; +$labels['wed'] = 'Mët'; +$labels['thu'] = 'Don'; +$labels['fri'] = 'Fre'; +$labels['sat'] = 'Sam'; $labels['sunday'] = 'Sonndeg'; $labels['monday'] = 'Méindeg'; $labels['tuesday'] = 'Dënschdeg'; @@ -197,6 +198,8 @@ $labels['spellcheck'] = 'Orthographie'; $labels['checkspelling'] = 'Orthographie kontrolléieren'; $labels['resumeediting'] = 'Weider editéieren'; $labels['revertto'] = 'Zréck bei'; +$labels['restore'] = 'Erëmhirstellen'; +$labels['restoremessage'] = 'Message erëmhirstellen'; $labels['responses'] = 'Äntwerten'; $labels['insertresponse'] = 'Äntwert afügen'; $labels['manageresponses'] = 'Äntwerte geréieren'; diff --git a/program/localization/lb_LU/messages.inc b/program/localization/lb_LU/messages.inc index fc053b59e..41dada829 100644 --- a/program/localization/lb_LU/messages.inc +++ b/program/localization/lb_LU/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,8 @@ $messages['invalidrequest'] = 'Ongëlteg Ufro! Et goufe keng Date gespäichert.' $messages['invalidhost'] = 'Ongëltege Server-Numm.'; $messages['nomessagesfound'] = 'Keng Messagen an der Mailbox fonnt.'; $messages['loggedout'] = 'Du hues dech erfollegräich ofgemellt. Äddi!'; -$messages['mailboxempty'] = 'D\'Mailbox ass eidel.'; +$messages['mailboxempty'] = 'D\'Mailbox ass eidel'; +$messages['nomessages'] = 'Keng Messagen'; $messages['refreshing'] = 'Lueden nei...'; $messages['loading'] = 'Lueden...'; $messages['uploading'] = 'Fichier gëtt eropgelueden...'; @@ -82,6 +83,7 @@ $messages['norecipientwarning'] = 'Gëff w.e.gl op mannst een Empfänger an.'; $messages['nosubjectwarning'] = 'D\'Feld "Sujet" ass eidel. Wëlls du elo eent uginn?'; $messages['nobodywarning'] = 'Soll dëse Message ouni Text verschéckt ginn?'; $messages['notsentwarning'] = 'De Message gouf net verschéckt. Wëlls du e verwerfen?'; +$messages['restoresavedcomposedata'] = 'Et gouf e Message fonnt dee scho geschriwwen awer nach net verschéckt ginn ass.\n\nSujet: $subject\nGespäichert: $date\n\nSoll de Message recuperéiert ginn?'; $messages['noldapserver'] = 'Wiel w.e.gl en LDAP-Server fir d\'Sich aus.'; $messages['nosearchname'] = 'Gëff w.e.gl en Numm oder eng E-Mail-Adress fir de Kontakt an.'; $messages['notuploadedwarning'] = 'Net all d\'Unhäng goufen eropgelueden. Waart w.e.gl e Moment oder briech den Upload of.'; diff --git a/program/localization/lt_LT/messages.inc b/program/localization/lt_LT/messages.inc index d9c83f873..d45bdeb5e 100644 --- a/program/localization/lt_LT/messages.inc +++ b/program/localization/lt_LT/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,6 @@ $messages['invalidrequest'] = 'Netinkama užklausa! Duomenys neiÅ¡saugoti.'; $messages['invalidhost'] = 'Negalimas serverio vardas.'; $messages['nomessagesfound'] = 'Å ioje paÅ¡to dėžutÄ—je laiÅ¡kų nÄ—ra.'; $messages['loggedout'] = 'JÅ«s sÄ—kmingai atsijungÄ—te. Iki kito karto!'; -$messages['mailboxempty'] = 'PaÅ¡to dėžutÄ— tuÅ¡Äia.'; $messages['refreshing'] = 'Atnaujinama…'; $messages['loading'] = 'Ä®keliama…'; $messages['uploading'] = 'Ä®keliamas failas…'; diff --git a/program/localization/lv_LV/labels.inc b/program/localization/lv_LV/labels.inc index 0f80350bb..185d75180 100644 --- a/program/localization/lv_LV/labels.inc +++ b/program/localization/lv_LV/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to no $count'; $labels['copy'] = 'KopÄ“t'; $labels['move'] = 'PÄrvietot'; $labels['moveto'] = 'PÄrvietot uz...'; +$labels['copyto'] = 'KopÄ“t uz ...'; $labels['download'] = 'lejupielÄdÄ“t'; $labels['open'] = 'AtvÄ“rt'; $labels['showattachment'] = 'RÄdÄ«t'; @@ -197,6 +198,8 @@ $labels['spellcheck'] = 'IzrunÄt'; $labels['checkspelling'] = 'PÄrbaudÄ«t pareizrakstÄ«bu'; $labels['resumeediting'] = 'TurpinÄt rediģēšanu'; $labels['revertto'] = 'Atgriezt uz'; +$labels['restore'] = 'Atjaunot'; +$labels['restoremessage'] = 'Atjaunot vÄ“stuli?'; $labels['responses'] = 'Atbildes'; $labels['insertresponse'] = 'Ievietot atbildi'; $labels['manageresponses'] = 'PÄrvaldÄ«t atbildes'; @@ -436,6 +439,9 @@ $labels['standardwindows'] = 'IzlÄ“coÅ¡ie logi kÄ parasti logi'; $labels['forwardmode'] = 'VÄ“stuļu pÄrsÅ«tÄ«Å¡ana'; $labels['inline'] = 'iekļaujot'; $labels['asattachment'] = 'kÄ pielikumu'; +$labels['replyallmode'] = '[AtbildÄ“t visiem] pogas noklusÄ“tÄ darbÄ«ba'; +$labels['replyalldefault'] = 'atbildÄ“t visiem'; +$labels['replyalllist'] = 'atbildÄ“t tikai sarakstei (ja tÄda tiek atrasta)'; $labels['folder'] = 'Mapi'; $labels['folders'] = 'Mapes'; $labels['foldername'] = 'Mapes nosaukums'; diff --git a/program/localization/lv_LV/messages.inc b/program/localization/lv_LV/messages.inc index 55cff4134..6f1622c16 100644 --- a/program/localization/lv_LV/messages.inc +++ b/program/localization/lv_LV/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,6 @@ $messages['invalidrequest'] = 'NederÄ«gs pieprasÄ«jums! Dati netika saglabÄti . $messages['invalidhost'] = 'NederÄ«gs servera nosaukums'; $messages['nomessagesfound'] = 'Å ajÄ pastkastÄ“ nav vÄ“stuļu'; $messages['loggedout'] = 'JÅ«s esat veiksmÄ«gi atslÄ“dzies no sistÄ“mas. Uz redzÄ“Å¡anos!'; -$messages['mailboxempty'] = 'Pastkaste ir tukÅ¡a'; $messages['refreshing'] = 'Atjauno...'; $messages['loading'] = 'Notiek ielÄde...'; $messages['uploading'] = 'AugÅ¡upielÄde failu...'; @@ -82,6 +81,7 @@ $messages['norecipientwarning'] = 'LÅ«dzu ievadiet vismaz vienu saņēmÄ“ju'; $messages['nosubjectwarning'] = 'Lauks "temats" ir tukÅ¡s. Vai vÄ“laties to aizpildÄ«t tagad?'; $messages['nobodywarning'] = 'SÅ«tÄ«t vÄ“stuli bez teksta?'; $messages['notsentwarning'] = 'VÄ“stule netika nosÅ«tÄ«ta. Vai tieÅ¡Äm vÄ“laties atcelt vÄ“stules rakstÄ«Å¡anu?'; +$messages['restoresavedcomposedata'] = 'Ir atrasta pirms kÄda laika uzrakstÄ«ta, bet nenosÅ«tÄ«ta vÄ“stule.\n\nTÄ“ma: $subject\nSaglabÄta:$date\n\nVai atjaunot Å¡o vÄ“stuli?'; $messages['noldapserver'] = 'Lai meklÄ“tu, lÅ«dzu izvÄ“laties LDAP serveri'; $messages['nosearchname'] = 'LÅ«dzu ievadiet kontaktpersonas vÄrdu vai e-pasta adresi'; $messages['notuploadedwarning'] = 'Visi pielikumi vÄ“l nav augÅ¡upielÄdÄ“ti - lÅ«dzu uzgaidiet vai atceļiet augÅ¡upielÄdi'; diff --git a/program/localization/mk_MK/messages.inc b/program/localization/mk_MK/messages.inc index d123bada9..c8e29dfe9 100644 --- a/program/localization/mk_MK/messages.inc +++ b/program/localization/mk_MK/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -23,7 +23,6 @@ $messages['servererror'] = 'Грешка во Ñерверот!'; $messages['invalidrequest'] = 'Ðеважечко барање! Податоците не Ñе зачувани.'; $messages['nomessagesfound'] = 'Ðемате пиÑма во ова Ñандаче'; $messages['loggedout'] = 'УÑпешно Ñе одјавивте. Ви благодариме и довидување!'; -$messages['mailboxempty'] = 'ПоштенÑкото Ñандаче е празно.'; $messages['loading'] = 'Вчитувам...'; $messages['uploading'] = 'Ја подигам податотеката...'; $messages['loadingdata'] = 'Ги вчитувам податоците...'; diff --git a/program/localization/ml_IN/messages.inc b/program/localization/ml_IN/messages.inc index 9abaeda99..5d6d9f011 100644 --- a/program/localization/ml_IN/messages.inc +++ b/program/localization/ml_IN/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | diff --git a/program/localization/mr_IN/messages.inc b/program/localization/mr_IN/messages.inc index 36eb8dc04..2685f4826 100644 --- a/program/localization/mr_IN/messages.inc +++ b/program/localization/mr_IN/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -28,7 +28,6 @@ $messages['errornoperm'] = 'कृती करणà¥à¤¯à¤¾à¤¸ असमरà¥à¤ $messages['invalidrequest'] = 'अवैध विनंती! माहिती साठवलेली नाही.'; $messages['nomessagesfound'] = 'या खातà¥à¤¯à¤¾à¤®à¤§à¥‡ कोणताही संदेश आलेला नाही'; $messages['loggedout'] = 'तà¥à¤®à¥à¤¹à¥€ यशसà¥à¤µà¥€à¤°à¤¿à¤¤à¥à¤¯à¤¾ खाते बंद केले आहे . राम राम !'; -$messages['mailboxempty'] = 'खातà¥à¤¯à¤¾à¤¤ कोणताही संदेश नाही'; $messages['loading'] = 'संदेश आणत आहे'; $messages['uploading'] = 'फाईल चढवली जात आहे...'; $messages['loadingdata'] = 'माहिती आणत आहे'; diff --git a/program/localization/ms_MY/messages.inc b/program/localization/ms_MY/messages.inc index c2140e216..99b35310a 100644 --- a/program/localization/ms_MY/messages.inc +++ b/program/localization/ms_MY/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -21,7 +21,6 @@ $messages['sessionerror'] = 'Sesi anda tidak sah atau telah tamat'; $messages['storageerror'] = 'Sambungan ke pelayan IMAP gagal'; $messages['nomessagesfound'] = 'Tiada mesej dijumpai dalam kotak mel ini'; $messages['loggedout'] = 'Sesi anda telah tamat. Selamat tinggal!'; -$messages['mailboxempty'] = 'Kotak mail kosong'; $messages['loading'] = 'Memuat...'; $messages['loadingdata'] = 'Memuat data...'; $messages['checkingmail'] = 'Menyemak mesej baru...'; diff --git a/program/localization/nb_NO/labels.inc b/program/localization/nb_NO/labels.inc index 20bbd1383..4590e516e 100644 --- a/program/localization/nb_NO/labels.inc +++ b/program/localization/nb_NO/labels.inc @@ -29,6 +29,7 @@ $labels['drafts'] = 'Kladd'; $labels['sent'] = 'Sendt'; $labels['trash'] = 'Slettet'; $labels['junk'] = 'Spam'; +$labels['show_real_foldernames'] = 'Vis orginale navn for spesielle mapper'; $labels['subject'] = 'Emne'; $labels['from'] = 'Avsender'; $labels['sender'] = 'Avsender'; @@ -51,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to av $count'; $labels['copy'] = 'Kopier'; $labels['move'] = 'Flytt'; $labels['moveto'] = 'flytt til...'; +$labels['copyto'] = 'Kopier til...'; $labels['download'] = 'last ned'; $labels['open'] = 'Ã…pen'; $labels['showattachment'] = 'Vis'; @@ -165,6 +167,7 @@ $labels['listmode'] = 'Listevisningsmodus'; $labels['folderactions'] = 'Mappehandlinger...'; $labels['compact'] = 'Rydd opp'; $labels['empty'] = 'Tøm'; +$labels['importmessages'] = 'Importer meldinger'; $labels['quota'] = 'Plassforbruk'; $labels['unknown'] = 'ukjent'; $labels['unlimited'] = 'ubegrenset'; @@ -173,6 +176,8 @@ $labels['resetsearch'] = 'Nullstill søk'; $labels['searchmod'] = 'Søke felt'; $labels['msgtext'] = 'Hele meldingen'; $labels['body'] = 'Meldingstekst'; +$labels['type'] = 'Type'; +$labels['namex'] = 'Navn'; $labels['openinextwin'] = 'Ã…pne i nytt vindu'; $labels['emlsave'] = 'Last ned (.eml)'; $labels['changeformattext'] = 'Vis i ren tekst'; @@ -185,7 +190,7 @@ $labels['addattachment'] = 'Vedlegg'; $labels['charset'] = 'Tegnsett'; $labels['editortype'] = 'Format'; $labels['returnreceipt'] = 'Be om kvittering'; -$labels['dsn'] = 'Leveringsstatus notifikasjon'; +$labels['dsn'] = 'Leveringsstatus varsling'; $labels['mailreplyintro'] = 'Den $date, skrev $sender:'; $labels['originalmessage'] = 'Opprinnelig melding'; $labels['editidents'] = 'Endre identiteter'; @@ -193,6 +198,16 @@ $labels['spellcheck'] = 'Stavekontroll'; $labels['checkspelling'] = 'Stavekontroll'; $labels['resumeediting'] = 'Fortsett redigering'; $labels['revertto'] = 'Tilbake til'; +$labels['restore'] = 'Gjenopprett'; +$labels['restoremessage'] = 'Gjenopprett melding?'; +$labels['responses'] = 'Svar'; +$labels['insertresponse'] = 'Sett inn et svar'; +$labels['manageresponses'] = 'Rediger svar'; +$labels['savenewresponse'] = 'Lagre nytt svar'; +$labels['editresponses'] = 'Rediger svar'; +$labels['editresponse'] = 'Rediger svar'; +$labels['responsename'] = 'Navn'; +$labels['responsetext'] = 'Svar tekst'; $labels['attach'] = 'Legg ved'; $labels['attachments'] = 'Vedlegg'; $labels['upload'] = 'Last opp'; @@ -305,13 +320,18 @@ $labels['nextpage'] = 'Vis neste sett'; $labels['lastpage'] = 'Vis siste sett'; $labels['group'] = 'Gruppe'; $labels['groups'] = 'Grupper'; +$labels['listgroup'] = 'Vis gruppemedlemmer'; $labels['personaladrbook'] = 'Egne adresser'; $labels['searchsave'] = 'Lagre søk'; $labels['searchdelete'] = 'Slett søk'; $labels['import'] = 'Importer'; $labels['importcontacts'] = 'Importer kontakter'; $labels['importfromfile'] = 'Importer fra fil:'; +$labels['importtarget'] = 'Legg kontakter til'; $labels['importreplace'] = 'Erstatt hele adresseboken'; +$labels['importgroups'] = 'Importer gruppetilordninger'; +$labels['importgroupsall'] = 'Alle (opprett grupper hvis nødvendig)'; +$labels['importgroupsexisting'] = 'Bare for eksisterende grupper'; $labels['importdesc'] = 'Du kan laste opp kontakter fra en eksisterende adressebok.<br/>Vi støtter adressebøker i <a href="http://no.wikipedia.org/wiki/VCard">vCard</a> eller CSV (kommaseparert) .'; $labels['done'] = 'Fullført'; $labels['settingsfor'] = 'Innstillinger for'; @@ -415,9 +435,13 @@ $labels['spellcheckignorenums'] = 'Ignorer ord med tall'; $labels['spellcheckignorecaps'] = 'Ignorer ord med kun store bokstaver'; $labels['addtodict'] = 'Legg til i ordbok'; $labels['mailtoprotohandler'] = 'Registrer protokollhÃ¥ndtering for mailto-lenker'; +$labels['standardwindows'] = 'HÃ¥ndter sprettoppvinduer som vanlige vinduer'; $labels['forwardmode'] = 'Meldinger videresendes'; $labels['inline'] = 'i teksten'; $labels['asattachment'] = 'som vedlegg'; +$labels['replyallmode'] = 'Standard valg for [Svar alle] knapp'; +$labels['replyalldefault'] = 'svar til alle'; +$labels['replyalllist'] = 'svar kun til epostliste (hvis funnet)'; $labels['folder'] = 'Mappe'; $labels['folders'] = 'Mapper'; $labels['foldername'] = 'Mappenavn'; diff --git a/program/localization/nb_NO/messages.inc b/program/localization/nb_NO/messages.inc index 1d51017fb..c2a489714 100644 --- a/program/localization/nb_NO/messages.inc +++ b/program/localization/nb_NO/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,8 @@ $messages['invalidrequest'] = 'Ugyldig forespørsel! Ingen data ble lagret.'; $messages['invalidhost'] = 'Ugyldig servernavn.'; $messages['nomessagesfound'] = 'Det ble ikke funnet noen meldinger i denne mappen'; $messages['loggedout'] = 'Du er logget av webmail. Ha det bra!'; -$messages['mailboxempty'] = 'Mappen er tom!'; +$messages['mailboxempty'] = 'Mappen er tom'; +$messages['nomessages'] = 'Ingen meldinger'; $messages['refreshing'] = 'Oppdaterer …'; $messages['loading'] = 'Laster...'; $messages['uploading'] = 'Laster opp fil...'; @@ -44,6 +45,8 @@ $messages['messagesent'] = 'Meldingen ble sendt'; $messages['savingmessage'] = 'Lagrer melding...'; $messages['messagesaved'] = 'Melding er lagret som kladd'; $messages['successfullysaved'] = 'Lagret'; +$messages['savingresponse'] = 'Lagrer svartekst...'; +$messages['deleteresponseconfirm'] = 'Vil du virkelig Ã¥ slette denne svarteksten?'; $messages['addedsuccessfully'] = 'Kontakten ble lagt til i adresseboken'; $messages['contactexists'] = 'Det finnes allerede en kontakt med denne e-postadressen'; $messages['contactnameexists'] = 'Det finnes allerede en kontakt med dette navnet'; @@ -54,6 +57,8 @@ $messages['contactnotfound'] = 'Den ønskede kontakten ble ikke funnet'; $messages['contactsearchonly'] = 'Skriv inn noen søkeord for Ã¥ finne kontakter.'; $messages['sendingfailed'] = 'Kunne ikke sende e-posten'; $messages['senttooquickly'] = 'Vennligst vent $sec sekund(er) før du sender denne meldingen'; +$messages['errorsavingsent'] = 'En feil oppsto under lagring av sendt melding.'; +$messages['errorsaving'] = 'En feil oppsto under lagring.'; $messages['errormoving'] = 'Kunne ikke flytte meldingen(e)'; $messages['errorcopying'] = 'Kunne ikke kopiere meldingen(e)'; $messages['errordeleting'] = 'Kunne ikke slette meldingen(e)'; @@ -78,6 +83,7 @@ $messages['norecipientwarning'] = 'Skriv inn minst én mottaker'; $messages['nosubjectwarning'] = 'Emnefeltet er tomt. Vil du skrive det inn nÃ¥?'; $messages['nobodywarning'] = 'Send denne meldingen uten tekst?'; $messages['notsentwarning'] = 'E-posten er ikke sendt. Er du sikker pÃ¥ at du vil avbryte skrivingen?'; +$messages['restoresavedcomposedata'] = 'Et tidligere usendt svar ble funnet.\n\nEmne: $subject\nLagret: $date\n\nVil du gjenopprette denne meldingen?'; $messages['noldapserver'] = 'Velg LDAP-tjener Ã¥ søke i'; $messages['nosearchname'] = 'Venligst skriv inn kontaktens navn eller e-postadresse'; $messages['notuploadedwarning'] = 'Ikke alle vedlegg er ferdig opplastet. Vennligst vent eller avbryt opplastingen.'; @@ -97,11 +103,16 @@ $messages['converting'] = 'Fjerner formatering fra meldingen ...'; $messages['messageopenerror'] = 'Kunne ikke hente meldingen fra server'; $messages['fileuploaderror'] = 'Feil under opplastning.'; $messages['filesizeerror'] = 'Filen overstiger maksimum tillatt filstørrelse ($size)'; +$messages['copysuccess'] = 'Kopierte $nr kontakter.'; +$messages['movesuccess'] = 'Flyttet $nr kontakter.'; +$messages['copyerror'] = 'Kunne ikke kopiere noen kontakter.'; +$messages['moveerror'] = 'Kunne ikke flytte noen kontakter.'; $messages['sourceisreadonly'] = 'Denne adressekilden er skrivebeskyttet'; $messages['errorsavingcontact'] = 'Kunne ikke lagre kontaktadressen.'; $messages['movingmessage'] = 'Flytter e-post ...'; $messages['copyingmessage'] = 'Kopierer e-post...'; $messages['copyingcontact'] = 'Kopierer kontakt(er) …'; +$messages['movingcontact'] = 'Flytter kontakt(er)...'; $messages['deletingmessage'] = 'Sletter melding(er) …'; $messages['markingmessage'] = 'Markerer melding(er) ...'; $messages['addingmember'] = 'Legger til kontakt(er) i gruppa ...'; @@ -135,6 +146,7 @@ $messages['smtperror'] = 'SMTP-feil ($code): $msg'; $messages['emailformaterror'] = 'Ukorrekt e-postadresse: $email'; $messages['toomanyrecipients'] = 'For mange mottakere. Reduser antall mottakere til $max.'; $messages['maxgroupmembersreached'] = 'Antall gruppemedlemmer overskrider maksgrensen pÃ¥ $max'; +$messages['internalerror'] = 'En intern feil har oppstÃ¥tt, prøv igjen senere.'; $messages['contactdelerror'] = 'Kunne ikke slette kontakt(er)'; $messages['contactdeleted'] = 'Kontakt(er) slettet uten feil.'; $messages['contactrestoreerror'] = 'Kunne ikke gjenopprette kontakt(er).'; diff --git a/program/localization/ne_NP/messages.inc b/program/localization/ne_NP/messages.inc index 7873f5715..e8dcd091a 100644 --- a/program/localization/ne_NP/messages.inc +++ b/program/localization/ne_NP/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -21,7 +21,6 @@ $messages['sessionerror'] = 'सतà¥à¤° समापà¥à¤¤ वा अवैद $messages['storageerror'] = 'सरà¥à¤µà¤° संग समà¥à¤ªà¤°à¥à¤• हà¥à¤¨ पाà¤à¤¨'; $messages['nomessagesfound'] = 'यो मेलबकà¥à¤¸ मा कà¥à¤¨à¥ˆ मेल छैन'; $messages['loggedout'] = 'सतà¥à¤° समापà¥à¤¤ । नमासà¥à¤•à¤¾à¤°!'; -$messages['mailboxempty'] = 'मेल बकà¥à¤¸ खाली छ'; $messages['loading'] = 'लोड à¤à¤ˆà¤°à¤¹à¥‡à¤•à¥‹ छ...'; $messages['loadingdata'] = 'डाटा लोड à¤à¤ˆà¤°à¤¹à¥‡à¤•à¥‹ छै...'; $messages['checkingmail'] = 'नया मेलको खोजी à¤à¤ˆà¤°à¤¹à¥‡à¤•à¥‹ छ...'; diff --git a/program/localization/nl_BE/messages.inc b/program/localization/nl_BE/messages.inc index a90e250d9..ac6c17b6e 100644 --- a/program/localization/nl_BE/messages.inc +++ b/program/localization/nl_BE/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -30,7 +30,6 @@ $messages['invalidrequest'] = 'Ongeldige aanvraag! Er zijn geen gegevens opgesla $messages['invalidhost'] = 'Ongeldige server.'; $messages['nomessagesfound'] = 'Er zijn geen berichten in deze map...'; $messages['loggedout'] = 'U bent nu afgemeld. Tot ziens!'; -$messages['mailboxempty'] = 'Mailbox is leeg...'; $messages['refreshing'] = 'Bezig met vernieuwen...'; $messages['loading'] = 'Bezig met ophalen gegevens...'; $messages['uploading'] = 'Bezig met uploaden...'; diff --git a/program/localization/nl_NL/labels.inc b/program/localization/nl_NL/labels.inc index 58179eda5..e4f4794b6 100644 --- a/program/localization/nl_NL/labels.inc +++ b/program/localization/nl_NL/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to van $count'; $labels['copy'] = 'Kopiëren'; $labels['move'] = 'Verplaats'; $labels['moveto'] = 'Verplaats naar...'; +$labels['copyto'] = 'Kopiëren naar...'; $labels['download'] = 'Download'; $labels['open'] = 'Openen'; $labels['showattachment'] = 'Toon'; diff --git a/program/localization/nl_NL/messages.inc b/program/localization/nl_NL/messages.inc index bf8c41472..2595c2259 100644 --- a/program/localization/nl_NL/messages.inc +++ b/program/localization/nl_NL/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,8 @@ $messages['invalidrequest'] = 'Ongeldige aanvraag! Er zijn geen gegevens opgesla $messages['invalidhost'] = 'Ongeldige servernaam.'; $messages['nomessagesfound'] = 'Geen berichten gevonden in deze mailbox.'; $messages['loggedout'] = 'Succesvol uitgelogd. Tot ziens!'; -$messages['mailboxempty'] = 'Mailbox is leeg.'; +$messages['mailboxempty'] = 'Mailbox is leeg'; +$messages['nomessages'] = 'Geen berichten'; $messages['refreshing'] = 'Vernieuwen...'; $messages['loading'] = 'Laden...'; $messages['uploading'] = 'Bestand wordt geüpload...'; diff --git a/program/localization/nn_NO/messages.inc b/program/localization/nn_NO/messages.inc index 5c8386c64..867c73887 100644 --- a/program/localization/nn_NO/messages.inc +++ b/program/localization/nn_NO/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -30,7 +30,6 @@ $messages['invalidrequest'] = 'Eg forstÃ¥r ingen ting! Ingen data lagra.'; $messages['invalidhost'] = 'Ugyldig tenarnamn.'; $messages['nomessagesfound'] = 'Ingen meldingar i denne postkassa.'; $messages['loggedout'] = 'Du har avslutta økta. Ha det bra!'; -$messages['mailboxempty'] = 'Postkassa er tom.'; $messages['refreshing'] = 'Oppdaterer …'; $messages['loading'] = 'Hentar …'; $messages['uploading'] = 'Lastar opp fil …'; diff --git a/program/localization/pl_PL/labels.inc b/program/localization/pl_PL/labels.inc index 4c13fb7c6..741306b5c 100644 --- a/program/localization/pl_PL/labels.inc +++ b/program/localization/pl_PL/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from - $to z $count'; $labels['copy'] = 'Kopiuj'; $labels['move'] = 'PrzenieÅ›'; $labels['moveto'] = 'PrzenieÅ› do...'; +$labels['copyto'] = 'Kopiuj do...'; $labels['download'] = 'Pobierz'; $labels['open'] = 'Otwórz'; $labels['showattachment'] = 'Pokaż'; @@ -197,6 +198,16 @@ $labels['spellcheck'] = 'Pisownia'; $labels['checkspelling'] = 'Sprawdź pisowniÄ™'; $labels['resumeediting'] = 'ZakoÅ„cz sprawdzanie pisowni'; $labels['revertto'] = 'Powróć do'; +$labels['restore'] = 'Przywróć'; +$labels['restoremessage'] = 'Przyrócić wiadomość?'; +$labels['responses'] = 'Odpowiedzi'; +$labels['insertresponse'] = 'Wstaw odpowiedź'; +$labels['manageresponses'] = 'ZarzÄ…dzaj odpowiedziami'; +$labels['savenewresponse'] = 'Zapisz nowÄ… odpowiedź'; +$labels['editresponses'] = 'Edytuj odpowiedzi'; +$labels['editresponse'] = 'Edytuj odpowiedź'; +$labels['responsename'] = 'Nazwa'; +$labels['responsetext'] = 'Tekst odpowiedzi'; $labels['attach'] = 'ZaÅ‚Ä…cz'; $labels['attachments'] = 'ZaÅ‚Ä…czniki'; $labels['upload'] = 'PrzeÅ›lij'; @@ -428,6 +439,9 @@ $labels['standardwindows'] = 'Traktuj okna wyskakujÄ…ce jako standardowe okna'; $labels['forwardmode'] = 'Przekazywanie wiadomoÅ›ci'; $labels['inline'] = 'w treÅ›ci'; $labels['asattachment'] = 'jako zaÅ‚Ä…cznik'; +$labels['replyallmode'] = 'DomyÅ›la akcja przycisku [Odpowiedz wszystkim]'; +$labels['replyalldefault'] = 'odpowiedz wszystkim'; +$labels['replyalllist'] = 'odpowiedz tylko do listy mailingowej (jeÅ›li wykryto)'; $labels['folder'] = 'Folder'; $labels['folders'] = 'Foldery'; $labels['foldername'] = 'Nazwa folderu'; diff --git a/program/localization/pl_PL/messages.inc b/program/localization/pl_PL/messages.inc index 0ad357b69..fd4583c83 100644 --- a/program/localization/pl_PL/messages.inc +++ b/program/localization/pl_PL/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,8 @@ $messages['invalidrequest'] = 'BÅ‚Ä™dne żądanie! Nie zapisano danych.'; $messages['invalidhost'] = 'BÅ‚Ä™dna nazwa serwera.'; $messages['nomessagesfound'] = 'Brak wiadomoÅ›ci w skrzynce.'; $messages['loggedout'] = 'Użytkownik wylogowaÅ‚ siÄ™ poprawnie.'; -$messages['mailboxempty'] = 'Skrzynka jest pusta!'; +$messages['mailboxempty'] = 'Folder jest pusty'; +$messages['nomessages'] = 'Brak wiadomoÅ›ci'; $messages['refreshing'] = 'OdÅ›wieżanie...'; $messages['loading'] = 'Åadowanie...'; $messages['uploading'] = 'Zapisywanie pliku...'; @@ -44,6 +45,8 @@ $messages['messagesent'] = 'Wiadomość zostaÅ‚a wysÅ‚ana.'; $messages['savingmessage'] = 'Zapisywanie wiadomoÅ›ci...'; $messages['messagesaved'] = 'Wiadomość zostaÅ‚a zapisana w folderze Kopie robocze.'; $messages['successfullysaved'] = 'Zapisano pomyÅ›lnie.'; +$messages['savingresponse'] = 'Zapisywanie tekstu odpowiedzi...'; +$messages['deleteresponseconfirm'] = 'Czy na pewno chcesz usunąć tÄ… odpowiedź?'; $messages['addedsuccessfully'] = 'Kontakt zostaÅ‚ dodany.'; $messages['contactexists'] = 'Kontakt o podanym adresie e-mail już istnieje!'; $messages['contactnameexists'] = 'Kontakt z podanÄ… nazwÄ… już istnieje!'; @@ -80,6 +83,7 @@ $messages['norecipientwarning'] = 'Podaj co najmniej jednego odbiorcÄ™!'; $messages['nosubjectwarning'] = 'Nie podano tematu wiadomoÅ›ci. Czy chcesz go teraz uzupeÅ‚nić?'; $messages['nobodywarning'] = 'Ta wiadomość jest pusta, czy mimo to chcesz jÄ… wysÅ‚ać?'; $messages['notsentwarning'] = 'Wiadomość nie zostaÅ‚a wysÅ‚ana. Czy chcesz usunąć tÄ™ wiadomość?'; +$messages['restoresavedcomposedata'] = 'Wykryto poprzednio tworzonÄ… ale nie wysÅ‚anÄ… wiadomość.\n\nTemat: $subject\nZapisano: $date\n\nCzy przywrócić tÄ… wiadomość?'; $messages['noldapserver'] = 'Wybierz serwer LDAP!'; $messages['nosearchname'] = 'Podaj nazwÄ™ kontaktu lub jego adres e-mail.'; $messages['notuploadedwarning'] = 'Nie wszystkie zaÅ‚Ä…czniki zostaÅ‚y pobrane. Poczekaj lub anuluj pobieranie.'; diff --git a/program/localization/ps/messages.inc b/program/localization/ps/messages.inc index a900d328f..606e59c0f 100644 --- a/program/localization/ps/messages.inc +++ b/program/localization/ps/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -21,7 +21,6 @@ $messages['sessionerror'] = 'Ø³ØªØ§Ø³Û Ù†Ø§Ø³ØªÙ‡ ناباوري يا له مي $messages['storageerror'] = 'له ای ميپ سرور سره پيوستون په بري سره ترسره نه شو'; $messages['nomessagesfound'] = 'ليکبکس Ú©Û Ù‡ÛÚ… استوزي ونه مونده'; $messages['loggedout'] = 'ØªØ§Ø³Û Ù„Ù‡ Ù†Ø§Ø³ØªÛ Ú…Ø®Ù‡ په بشپړه توګه وويستل شوئ الله په امان'; -$messages['mailboxempty'] = 'ليکبکس تش دی'; $messages['loading'] = 'د کار په Øال Ú©Û'; $messages['loadingdata'] = 'اومتوک د کار په Øال Ú©Û'; $messages['checkingmail'] = 'نوي استوزي ګوري'; diff --git a/program/localization/pt_BR/labels.inc b/program/localization/pt_BR/labels.inc index e1df5854a..e5aececc9 100644 --- a/program/localization/pt_BR/labels.inc +++ b/program/localization/pt_BR/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from - $to de $count'; $labels['copy'] = 'Copiar'; $labels['move'] = 'Mover'; $labels['moveto'] = 'Mover para...'; +$labels['copyto'] = 'Copiar para...'; $labels['download'] = 'Baixar'; $labels['open'] = 'Abrir'; $labels['showattachment'] = 'Exibir'; diff --git a/program/localization/pt_BR/messages.inc b/program/localization/pt_BR/messages.inc index 4546ceea9..0fcb27ff7 100644 --- a/program/localization/pt_BR/messages.inc +++ b/program/localization/pt_BR/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -33,6 +33,7 @@ $messages['invalidhost'] = 'Endereço de servidor inválido.'; $messages['nomessagesfound'] = 'Nenhuma mensagem encontrada nessa caixa de mensagens'; $messages['loggedout'] = 'Sua sessão foi finalizada com sucesso. Até logo!'; $messages['mailboxempty'] = 'A caixa de mensagens está vazia'; +$messages['nomessages'] = 'Sem mensagens'; $messages['refreshing'] = 'Atualizando...'; $messages['loading'] = 'Carregando...'; $messages['uploading'] = 'Enviando arquivo...'; diff --git a/program/localization/pt_PT/labels.inc b/program/localization/pt_PT/labels.inc index a4b419d21..457a308f2 100644 --- a/program/localization/pt_PT/labels.inc +++ b/program/localization/pt_PT/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to de $count'; $labels['copy'] = 'Copiar'; $labels['move'] = 'Mover'; $labels['moveto'] = 'mover para...'; +$labels['copyto'] = 'Copiar para...'; $labels['download'] = 'descarregar'; $labels['open'] = 'Abrir'; $labels['showattachment'] = 'Mostrar'; diff --git a/program/localization/pt_PT/messages.inc b/program/localization/pt_PT/messages.inc index f1206b589..a6618d33e 100644 --- a/program/localization/pt_PT/messages.inc +++ b/program/localization/pt_PT/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -33,6 +33,7 @@ $messages['invalidhost'] = 'Nome do servidor inválido.'; $messages['nomessagesfound'] = 'Não existem mensagens nesta pasta.'; $messages['loggedout'] = 'A sua sessão foi encerrada com sucesso. Até breve!'; $messages['mailboxempty'] = 'A caixa de entrada está vazia'; +$messages['nomessages'] = 'Não existem mensagens'; $messages['refreshing'] = 'A actualizar...'; $messages['loading'] = 'A carregar...'; $messages['uploading'] = 'A enviar ficheiro...'; diff --git a/program/localization/ro_RO/labels.inc b/program/localization/ro_RO/labels.inc index 953cfe8da..af85c358c 100644 --- a/program/localization/ro_RO/labels.inc +++ b/program/localization/ro_RO/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from - $to din $count'; $labels['copy'] = 'Copiază'; $labels['move'] = 'Mută'; $labels['moveto'] = 'Mută in...'; +$labels['copyto'] = 'Copiază în...'; $labels['download'] = 'Descarcă'; $labels['open'] = 'Deschide'; $labels['showattachment'] = 'Arată'; @@ -197,6 +198,16 @@ $labels['spellcheck'] = 'Ortografie'; $labels['checkspelling'] = 'Verifică ortografie'; $labels['resumeediting'] = 'Reia editarea'; $labels['revertto'] = 'Revino la'; +$labels['restore'] = 'Restaurează'; +$labels['restoremessage'] = 'Restaurezi mesajul?'; +$labels['responses'] = 'Răspunsuri'; +$labels['insertresponse'] = 'Adaugă un răspuns'; +$labels['manageresponses'] = 'Administrează răspunsurile'; +$labels['savenewresponse'] = 'Salvează noul răspuns'; +$labels['editresponses'] = 'Modifică răspunsurile'; +$labels['editresponse'] = 'Modifică răspunsul'; +$labels['responsename'] = 'Nume'; +$labels['responsetext'] = 'Textul răspunsului'; $labels['attach'] = 'AtaÅŸează'; $labels['attachments'] = 'AtaÅŸamente'; $labels['upload'] = 'ÃŽncarcă'; @@ -428,6 +439,9 @@ $labels['standardwindows'] = 'Trateaza popupsurile ca ferestre standard'; $labels['forwardmode'] = 'Trimitere mai departe mesaj'; $labels['inline'] = 'într-e linii'; $labels['asattachment'] = 'ca ataÈ™ament'; +$labels['replyallmode'] = 'AcÈ›iunea implicită pentru butonul [Răspunde la toÈ›i]'; +$labels['replyalldefault'] = 'răspunde la toÈ›i'; +$labels['replyalllist'] = 'răspunde listei (dacă este găsită)'; $labels['folder'] = 'Dosar'; $labels['folders'] = 'Dosare'; $labels['foldername'] = 'Nume dosar'; diff --git a/program/localization/ro_RO/messages.inc b/program/localization/ro_RO/messages.inc index fb555ad47..d17364d95 100644 --- a/program/localization/ro_RO/messages.inc +++ b/program/localization/ro_RO/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -33,6 +33,7 @@ $messages['invalidhost'] = 'Nume server invalid.'; $messages['nomessagesfound'] = 'Nu a fost găsit nici un mesaj în această căsuţă poÅŸtală'; $messages['loggedout'] = 'Sesiune încheiată cu succes. La revedere!'; $messages['mailboxempty'] = 'CăsuÅ£a poÅŸtală este goală'; +$messages['nomessages'] = 'Nici un mesaj'; $messages['refreshing'] = 'Reîmprospătare...'; $messages['loading'] = 'Se încarcă...'; $messages['uploading'] = 'FiÅŸierul se încarcă...'; @@ -82,6 +83,7 @@ $messages['norecipientwarning'] = 'Vă rugăm să introduceÅ£i cel puÅ£in un des $messages['nosubjectwarning'] = 'Mesajul nu are subiect. VreÅ£i să introduceÅ£i unul acum?'; $messages['nobodywarning'] = 'TrimiteÅ£i acest mesaj fără text?'; $messages['notsentwarning'] = 'Mesajul nu a fost trimis. VreÅ£i să renunÅ£aÅ£i la el?'; +$messages['restoresavedcomposedata'] = 'Un mesaj compus anterior a fost găsit.\n\nSubiect:$subject\nSalvat: $date\n\nDoriÅ£i restaurarea acestuia ?'; $messages['noldapserver'] = 'Vă rugăm să alegeÅ£i un server ldap pentru căutare'; $messages['nosearchname'] = 'Vă rugăm să introduceÅ£i un nume de contact sau adresă de e-mail'; $messages['notuploadedwarning'] = 'Nu toate fiÅŸierele au fost ataÅŸate. Vă rugăm să aÅŸteptaÅ£i sau să anulaÅ£i încărcarea acestora.'; diff --git a/program/localization/ru_RU/labels.inc b/program/localization/ru_RU/labels.inc index aa83eb9df..6df06a56b 100644 --- a/program/localization/ru_RU/labels.inc +++ b/program/localization/ru_RU/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to из $count'; $labels['copy'] = 'Копировать'; $labels['move'] = 'ПеремеÑтить'; $labels['moveto'] = 'ПеремеÑтить в...'; +$labels['copyto'] = 'Копировать в...'; $labels['download'] = 'Загрузить'; $labels['open'] = 'Открыть'; $labels['showattachment'] = 'Показать'; diff --git a/program/localization/ru_RU/messages.inc b/program/localization/ru_RU/messages.inc index 6d679f699..8dfbe3df8 100644 --- a/program/localization/ru_RU/messages.inc +++ b/program/localization/ru_RU/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,8 @@ $messages['invalidrequest'] = 'Ðеверный запроÑ! Информаци $messages['invalidhost'] = 'Ðеверное Ð¸Ð¼Ñ Ñервера.'; $messages['nomessagesfound'] = 'Сообщений не найдено'; $messages['loggedout'] = 'Ваша ÑеÑÑÐ¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð°. Ð’Ñего доброго!'; -$messages['mailboxempty'] = 'Почтовый Ñщик пуÑÑ‚.'; +$messages['mailboxempty'] = 'Почтовый Ñщик пуÑÑ‚'; +$messages['nomessages'] = 'Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÑутÑтвуют'; $messages['refreshing'] = 'Обновление...'; $messages['loading'] = 'Загрузка...'; $messages['uploading'] = 'Файл загружаетÑÑ…'; diff --git a/program/localization/si_LK/messages.inc b/program/localization/si_LK/messages.inc index 0c6fa1156..9a49e17f7 100644 --- a/program/localization/si_LK/messages.inc +++ b/program/localization/si_LK/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -22,7 +22,6 @@ $messages['sessionerror'] = 'ඔබේ à·€à·à¶»à¶º අවලංගු හ෠ච$messages['dberror'] = 'දà¶à·Šà¶ ගබඩà·à·€à·š දà·à·‚ය!'; $messages['nomessagesfound'] = 'ලියුම් පෙට්ටියේ පනිවුඩ නà·à¶'; $messages['loggedout'] = 'ඔබගේ à·€à·à¶»à¶º à·ƒà·à¶»à·Šà¶®à¶šà·€ අවසන් විය. අයුබොවන්!'; -$messages['mailboxempty'] = 'ලියුම් පෙට්ටිය හිස්'; $messages['loading'] = 'පූරනය...'; $messages['loadingdata'] = 'දà¶à·Šà¶ පූරනය...'; $messages['checkingmail'] = 'අලුà¶à·Š පණිවිඩ පරීක්ෂ෠කරමින්...'; diff --git a/program/localization/sk_SK/csv2vcard.inc b/program/localization/sk_SK/csv2vcard.inc index 724ed7438..c53273af5 100644 --- a/program/localization/sk_SK/csv2vcard.inc +++ b/program/localization/sk_SK/csv2vcard.inc @@ -15,14 +15,7 @@ | Author: Marek MeÄiar <mmmeciar@gmail.com> | +-----------------------------------------------------------------------+ */ - -// This is a list of CSV column names specified in CSV file header -// These must be original texts used in Outlook/Thunderbird exported csv files -// Encoding UTF-8 - $map = array(); - -// MS Outlook 2010 $map['anniversary'] = "VýroÄie"; $map['assistants_name'] = "Meno asistenta"; $map['assistants_phone'] = "Telefón asistenta"; @@ -69,8 +62,6 @@ $map['spouse'] = "Manžel(ka)"; $map['suffix'] = "PrÃpona"; $map['title'] = "Titul"; $map['web_page'] = "Webová stránka"; - -// Thunderbird $map['birth_day'] = "Deň narodenia"; $map['birth_month'] = "Mesiac narodenia"; $map['birth_year'] = "Rok narodenia"; diff --git a/program/localization/sk_SK/labels.inc b/program/localization/sk_SK/labels.inc index dee79f1bf..630869bea 100644 --- a/program/localization/sk_SK/labels.inc +++ b/program/localization/sk_SK/labels.inc @@ -29,7 +29,7 @@ $labels['drafts'] = 'Koncepty'; $labels['sent'] = 'Odoslané'; $labels['trash'] = 'Kôš'; $labels['junk'] = 'Nevyžiadaná poÅ¡ta'; -$labels['show_real_foldernames'] = 'Pri osobitných prieÄinkoch zobrazovaÅ¥ reálne názvy'; +$labels['show_real_foldernames'] = 'Pri osobitných prieÄinkoch zobrazovaÅ¥ skutoÄné názvy'; $labels['subject'] = 'Predmet'; $labels['from'] = 'Od'; $labels['sender'] = 'Odosielateľ'; @@ -45,13 +45,14 @@ $labels['organization'] = 'Organizácia'; $labels['readstatus'] = 'PreÄÃtaÅ¥ stav'; $labels['listoptions'] = 'Nastavenia zoznamu...'; $labels['mailboxlist'] = 'PrieÄinky'; -$labels['messagesfromto'] = 'Správy od $from, komu $to, z $count'; -$labels['threadsfromto'] = 'Konverzácie od $from, komu $to, z $count'; +$labels['messagesfromto'] = 'Správy: $from – $to, z $count'; +$labels['threadsfromto'] = 'Konverzácie: $from – $to, z $count'; $labels['messagenrof'] = 'Správa Ä. $nr z $count'; $labels['fromtoshort'] = '$from – $to z $count'; $labels['copy'] = 'KopÃrovaÅ¥'; $labels['move'] = 'Presunúť'; $labels['moveto'] = 'Presunúť do...'; +$labels['copyto'] = 'KopÃrovaÅ¥ do...'; $labels['download'] = 'StiahnuÅ¥'; $labels['open'] = 'OtvoriÅ¥'; $labels['showattachment'] = 'ZobraziÅ¥'; @@ -103,12 +104,12 @@ $labels['checkmail'] = 'SkontrolovaÅ¥ nové správy'; $labels['compose'] = 'VytvoriÅ¥ správu'; $labels['writenewmessage'] = 'VytvoriÅ¥ novú správu'; $labels['reply'] = 'OdpovedaÅ¥'; -$labels['replytomessage'] = 'OdpovedaÅ¥ odosielateľovi'; +$labels['replytomessage'] = 'OdpovedaÅ¥ na správu'; $labels['replytoallmessage'] = 'OdpovedaÅ¥ do zoznamu alebo odosielateľovi a vÅ¡etkým prÃjemcom'; $labels['replyall'] = 'OdpovedaÅ¥ vÅ¡etkým'; $labels['replylist'] = 'Zoznam pre odpovedanie'; -$labels['forward'] = 'Dopredu'; -$labels['forwardinline'] = 'PoslaÅ¥ Äalej'; +$labels['forward'] = 'PoslaÅ¥ Äalej'; +$labels['forwardinline'] = 'PoslaÅ¥ Äalej v správe'; $labels['forwardattachment'] = 'PoslaÅ¥ Äalej ako prÃlohu'; $labels['forwardmessage'] = 'PoslaÅ¥ správu Äalej'; $labels['deletemessage'] = 'VymazaÅ¥ správu'; @@ -118,24 +119,24 @@ $labels['previousmessage'] = 'ZobraziÅ¥ predchádzajúcu správu'; $labels['firstmessage'] = 'ZobraziÅ¥ prvú správu'; $labels['nextmessage'] = 'ZobraziÅ¥ ÄalÅ¡iu správu'; $labels['lastmessage'] = 'ZobraziÅ¥ poslednú správu'; -$labels['backtolist'] = 'Späť na zoznam správ'; -$labels['viewsource'] = 'ZobraziÅ¥ zdroj'; +$labels['backtolist'] = 'Naspäť na zoznam správ'; +$labels['viewsource'] = 'ZobraziÅ¥ zdrojový text'; $labels['mark'] = 'OznaÄiÅ¥'; $labels['markmessages'] = 'OznaÄiÅ¥ správy'; $labels['markread'] = 'Ako preÄÃtané'; $labels['markunread'] = 'Ako nepreÄÃtané'; -$labels['markflagged'] = 'Ako oznaÄené prÃznakom'; -$labels['markunflagged'] = 'Ako neoznaÄené prÃznakom'; +$labels['markflagged'] = 'Ako oznaÄené znaÄkou'; +$labels['markunflagged'] = 'Ako neoznaÄené znaÄkou'; $labels['moreactions'] = 'Viac akciÃ...'; $labels['more'] = 'Viac'; $labels['back'] = 'Dozadu'; $labels['options'] = 'Možnosti'; $labels['select'] = 'Výber'; -$labels['all'] = 'VÅ¡etky'; +$labels['all'] = 'VÅ¡etko'; $labels['none'] = 'NiÄ'; $labels['currpage'] = 'Aktuálna stránka'; $labels['unread'] = 'NepreÄÃtané'; -$labels['flagged'] = 'OznaÄené prÃznakom'; +$labels['flagged'] = 'OznaÄené znaÄkou'; $labels['unanswered'] = 'Bez odpovede'; $labels['withattachment'] = 'S prÃlohou'; $labels['deleted'] = 'Vymazané'; @@ -148,51 +149,51 @@ $labels['expand-all'] = 'RozbaliÅ¥ vÅ¡etko'; $labels['expand-unread'] = 'RozbaliÅ¥ nepreÄÃtané'; $labels['collapse-all'] = 'ZbaliÅ¥ vÅ¡etko'; $labels['threaded'] = 'Spojené do konverzáciÃ'; -$labels['autoexpand_threads'] = 'RozbaliÅ¥ konverzácie správy'; -$labels['do_expand'] = 'vÅ¡etky konverzácie'; +$labels['autoexpand_threads'] = 'RozbaliÅ¥ konverzácie'; +$labels['do_expand'] = 'vÅ¡etky'; $labels['expand_only_unread'] = 'len s nepreÄÃtanými správami'; $labels['fromto'] = 'Od/Komu'; -$labels['flag'] = 'PrÃznak'; +$labels['flag'] = 'ZnaÄka'; $labels['attachment'] = 'PrÃloha'; -$labels['nonesort'] = 'NiÄ'; +$labels['nonesort'] = 'Žiadne'; $labels['sentdate'] = 'Dátum odoslania'; $labels['arrival'] = 'Dátum prijatia'; $labels['asc'] = 'vzostupne'; $labels['desc'] = 'zostupne'; -$labels['listcolumns'] = 'Stĺpce v zozname'; -$labels['listsorting'] = 'ZoraÄovanie v stĺpci'; +$labels['listcolumns'] = 'Stĺpce'; +$labels['listsorting'] = 'ZoraÄovanie'; $labels['listorder'] = 'Systém zoraÄovania'; $labels['listmode'] = 'Režim zobrazenia zoznamu'; $labels['folderactions'] = 'Akcie pre prieÄinky...'; $labels['compact'] = 'ZhustiÅ¥'; $labels['empty'] = 'VyprázdniÅ¥'; $labels['importmessages'] = 'ImportovaÅ¥ správy'; -$labels['quota'] = 'Zaplnenie disku'; +$labels['quota'] = 'Úložné miesto'; $labels['unknown'] = 'neznáme'; $labels['unlimited'] = 'neobmedzené'; $labels['quicksearch'] = 'Rýchle vyhľadávanie'; -$labels['resetsearch'] = 'VyÄistiÅ¥ vyhľadávanie'; -$labels['searchmod'] = 'Modifikátory pri hľadanÃ'; +$labels['resetsearch'] = 'Reset vyhľadávania'; +$labels['searchmod'] = 'ZmeniÅ¥ kritériá vyhľadávania'; $labels['msgtext'] = 'Celá správa'; -$labels['body'] = 'Telo'; +$labels['body'] = 'Telo (obsah)'; $labels['type'] = 'Typ'; $labels['namex'] = 'Meno'; $labels['openinextwin'] = 'OtvoriÅ¥ v novom okne'; $labels['emlsave'] = 'StiahnuÅ¥ (.eml)'; $labels['changeformattext'] = 'ZobraziÅ¥ vo formáte Äistého textu'; $labels['changeformathtml'] = 'ZobraziÅ¥ vo formáte HTML'; -$labels['editasnew'] = 'UpraviÅ¥ ako novú'; +$labels['editasnew'] = 'UpraviÅ¥ ako novú správu'; $labels['send'] = 'OdoslaÅ¥'; $labels['sendmessage'] = 'OdoslaÅ¥ správu'; -$labels['savemessage'] = 'UložiÅ¥ ako koncept'; -$labels['addattachment'] = 'PripojiÅ¥ súbor'; +$labels['savemessage'] = 'UložiÅ¥ správu ako koncept'; +$labels['addattachment'] = 'PriložiÅ¥ súbor'; $labels['charset'] = 'Znaková sada'; $labels['editortype'] = 'Typ editora'; $labels['returnreceipt'] = 'Potvrdenie o doruÄenÃ'; $labels['dsn'] = 'Oznámenie o stave doruÄenia'; $labels['mailreplyintro'] = 'Dňa $date $sender napÃsal(a):'; $labels['originalmessage'] = 'Pôvodná správa'; -$labels['editidents'] = 'UpraviÅ¥ identity'; +$labels['editidents'] = 'UpraviÅ¥ identitu odosielateľa'; $labels['spellcheck'] = 'Pravopis'; $labels['checkspelling'] = 'SkontrolovaÅ¥ pravopis'; $labels['resumeediting'] = 'PokraÄovaÅ¥ v úpravách'; @@ -221,10 +222,10 @@ $labels['highest'] = 'NajvyÅ¡Å¡ia'; $labels['nosubject'] = '(bez predmetu)'; $labels['showimages'] = 'ZobraziÅ¥ obrázky'; $labels['alwaysshow'] = 'Vždy zobraziÅ¥ obrázky od odosielateľa $sender'; -$labels['isdraft'] = 'Toto je koncept.'; -$labels['andnmore'] = '$nr viac...'; -$labels['togglemoreheaders'] = 'ZobraziÅ¥ viac záhlavà správ'; -$labels['togglefullheaders'] = 'Prepnúť zobrazenie nespracovaných záhlavà správ'; +$labels['isdraft'] = 'Toto je koncept'; +$labels['andnmore'] = 'PoÄet ÄalÅ¡Ãch: $nr...'; +$labels['togglemoreheaders'] = 'ZobraziÅ¥ viac hlaviÄiek správ'; +$labels['togglefullheaders'] = 'Prepnúť zobrazenie úplných hlaviÄiek správ'; $labels['htmltoggle'] = 'HTML'; $labels['plaintoggle'] = 'ÄŒistý text'; $labels['savesentmessagein'] = 'UložiÅ¥ odoslanú správu do'; @@ -233,20 +234,20 @@ $labels['maxuploadsize'] = 'Maximálna povolená veľkosÅ¥ súboru je $size'; $labels['addcc'] = 'PridaÅ¥ kópiu'; $labels['addbcc'] = 'PridaÅ¥ skrytú kopiu'; $labels['addreplyto'] = 'PridaÅ¥ pole OdpovedaÅ¥ na'; -$labels['addfollowupto'] = 'PridaÅ¥ pole preposlaÅ¥ na'; +$labels['addfollowupto'] = 'PridaÅ¥ pole PreposlaÅ¥ na'; $labels['mdnrequest'] = 'Odosielateľ tejto správy chce byÅ¥ informovaný o tom, že ste túto správu ÄÃtali. Chcete mu potvrdiÅ¥ prijatie správy?'; -$labels['receiptread'] = 'Potvrdenie o prijatà (a preÄÃtanÃ) správy'; -$labels['yourmessage'] = 'Toto je potvrdenie o prijatà vaÅ¡ej správy'; -$labels['receiptnote'] = 'Poznámka: Toto potvrdenie znamená len to, že správa sa zobrazila na poÄÃtaÄi prÃjemcu. Nie je vÅ¡ak zaruÄené, že klient správu ÄÃtal a porozumel jej obsahu.'; -$labels['name'] = 'ZobraziÅ¥ meno'; +$labels['receiptread'] = 'Potvrdenie o doruÄenà (a preÄÃtanÃ) správy'; +$labels['yourmessage'] = 'Toto je potvrdenie o doruÄenà vaÅ¡ej správy'; +$labels['receiptnote'] = 'Poznámka: Toto potvrdenie znamená len to, že správa sa zobrazila na poÄÃtaÄi prÃjemcu. Nie je vÅ¡ak zaruÄené, že prÃjemca správu ÄÃtal a porozumel jej obsahu.'; +$labels['name'] = 'Zobrazované meno'; $labels['firstname'] = 'Meno'; $labels['surname'] = 'Priezvisko'; $labels['middlename'] = 'Stredná ÄasÅ¥ mena'; $labels['nameprefix'] = 'Titul'; -$labels['namesuffix'] = 'PrÃpona'; +$labels['namesuffix'] = 'Dodatok za menom'; $labels['nickname'] = 'Prezývka'; -$labels['jobtitle'] = 'Názov pozÃcie'; -$labels['department'] = 'Oddelenie'; +$labels['jobtitle'] = 'OznaÄenie povolania'; +$labels['department'] = 'Oddelenie/firma/zastúpenie'; $labels['gender'] = 'Pohlavie'; $labels['maidenname'] = 'Rodné priezvisko'; $labels['email'] = 'E-mail'; @@ -254,8 +255,8 @@ $labels['phone'] = 'Telefón'; $labels['address'] = 'Adresa'; $labels['street'] = 'Ulica'; $labels['locality'] = 'Mesto'; -$labels['zipcode'] = 'Smerovacie ÄÃslo'; -$labels['region'] = 'Å tát/Provincia/Kraj'; +$labels['zipcode'] = 'PSÄŒ'; +$labels['region'] = 'Región'; $labels['country'] = 'Krajina'; $labels['birthday'] = 'Narodeniny'; $labels['anniversary'] = 'VýroÄie'; @@ -266,7 +267,7 @@ $labels['male'] = 'muž'; $labels['female'] = 'žena'; $labels['manager'] = 'Manažér'; $labels['assistant'] = 'Asistent'; -$labels['spouse'] = 'Partner'; +$labels['spouse'] = 'Partner/ka'; $labels['allfields'] = 'VÅ¡etky polia'; $labels['search'] = 'HľadaÅ¥'; $labels['advsearch'] = 'RozÅ¡Ãrené vyhľadávanie'; @@ -276,7 +277,7 @@ $labels['typehome'] = 'Domov'; $labels['typework'] = 'Práca'; $labels['typeother'] = 'Iné'; $labels['typemobile'] = 'Mobilný telefón'; -$labels['typemain'] = 'Hlavný'; +$labels['typemain'] = 'Hlavné ÄÃslo'; $labels['typehomefax'] = 'Fax - domov'; $labels['typeworkfax'] = 'Fax - práca'; $labels['typecar'] = 'Auto'; @@ -291,21 +292,21 @@ $labels['addcontact'] = 'PridaÅ¥ nový kontakt'; $labels['editcontact'] = 'UpraviÅ¥ kontakt'; $labels['contacts'] = 'Kontakty'; $labels['contactproperties'] = 'Vlastnosti kontaktu'; -$labels['personalinfo'] = 'Osobná informácia'; +$labels['personalinfo'] = 'Osobné informácie'; $labels['edit'] = 'UpraviÅ¥'; $labels['cancel'] = 'ZruÅ¡iÅ¥'; $labels['save'] = 'UložiÅ¥'; $labels['delete'] = 'VymazaÅ¥'; $labels['rename'] = 'PremenovaÅ¥'; -$labels['addphoto'] = 'PridaÅ¥'; -$labels['replacephoto'] = 'NahradiÅ¥'; +$labels['addphoto'] = 'PridaÅ¥ fotografiu'; +$labels['replacephoto'] = 'NahradiÅ¥ fotografiu'; $labels['uploadphoto'] = 'NahraÅ¥ fotografiu'; -$labels['newcontact'] = 'VytvoriÅ¥ novú vizitku kontaktu'; +$labels['newcontact'] = 'VytvoriÅ¥ nový kontakt'; $labels['deletecontact'] = 'VymazaÅ¥ vybrané kontakty'; $labels['composeto'] = 'VytvoriÅ¥ správu pre'; -$labels['contactsfromto'] = 'Kontakty od $from do $to z $count'; +$labels['contactsfromto'] = 'Kontakty: $from – $to, z $count'; $labels['print'] = 'TlaÄ'; -$labels['export'] = 'Export'; +$labels['export'] = 'ExportovaÅ¥'; $labels['exportall'] = 'ExportovaÅ¥ vÅ¡etko'; $labels['exportsel'] = 'ExportovaÅ¥ vybrané'; $labels['exportvcards'] = 'ExportovaÅ¥ kontakty vo formáte vCard'; @@ -321,15 +322,15 @@ $labels['group'] = 'Skupina'; $labels['groups'] = 'Skupiny'; $labels['listgroup'] = 'Zoznam Älenov skupiny'; $labels['personaladrbook'] = 'Osobné adresy'; -$labels['searchsave'] = 'UložiÅ¥ vyhľadávanie'; -$labels['searchdelete'] = 'VymazaÅ¥ vyhľadávanie'; +$labels['searchsave'] = 'UložiÅ¥ výsledky vyhľadávania'; +$labels['searchdelete'] = 'VymazaÅ¥ výsledky vyhľadávania'; $labels['import'] = 'Import'; $labels['importcontacts'] = 'ImportovaÅ¥ kontakty'; $labels['importfromfile'] = 'ImportovaÅ¥ zo súboru:'; $labels['importtarget'] = 'PridaÅ¥ kontakty do'; $labels['importreplace'] = 'NahradiÅ¥ celý adresár kontaktov'; $labels['importgroups'] = 'ImportovaÅ¥ priradenia do skupÃn'; -$labels['importgroupsall'] = 'VÅ¡etky (vytvoriÅ¥ skupiny, ak je to potrebné)'; +$labels['importgroupsall'] = 'VÅ¡etky (vytvoriÅ¥ skupiny ak je to potrebné)'; $labels['importgroupsexisting'] = 'Len pre existujúce skupiny'; $labels['importdesc'] = 'Môžete vložiÅ¥ kontakty zo svojho existujúceho adresára.<br/>Momentálne je možné importovanie adries z formátu <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> alebo CSV (údaje oddeľované Äiarkou).'; $labels['done'] = 'Hotovo'; @@ -350,43 +351,43 @@ $labels['messagepart'] = 'ÄŒasÅ¥'; $labels['digitalsig'] = 'Digitálny podpis'; $labels['dateformat'] = 'Formát dátumu'; $labels['timeformat'] = 'Formát Äasu'; -$labels['prettydate'] = 'Pekné formáty dátumov'; -$labels['setdefault'] = 'NastaviÅ¥ pôvodné'; +$labels['prettydate'] = 'Krátke formáty dátumov'; +$labels['setdefault'] = 'NastaviÅ¥ ako Å¡tandardné'; $labels['autodetect'] = 'Automaticky'; $labels['language'] = 'Jazyk'; $labels['timezone'] = 'ÄŒasová zóna'; -$labels['pagesize'] = 'Riadky na stránku'; +$labels['pagesize'] = 'PoÄet záznamov na stránku'; $labels['signature'] = 'Podpis'; $labels['dstactive'] = 'Letný Äas'; $labels['showinextwin'] = 'OtvoriÅ¥ správu v novom okne'; $labels['composeextwin'] = 'PÃsaÅ¥ v novom okne'; -$labels['htmleditor'] = 'VytvoriÅ¥ HTML správy'; +$labels['htmleditor'] = 'VytváraÅ¥ HTML správy'; $labels['htmlonreply'] = 'len v odpovedi na HTML správu'; -$labels['htmlonreplyandforward'] = 'pri preposielanà alebo odpovedi na HTML správu'; +$labels['htmlonreplyandforward'] = 'pri odosielanà Äalej alebo pri odpovedi na HTML správu'; $labels['htmlsignature'] = 'HTML podpis'; -$labels['showemail'] = 'ZobrazovaÅ¥ e-mailovú adresu so zobrazeným menom'; -$labels['previewpane'] = 'ZobraziÅ¥ panel s náhľadom'; +$labels['showemail'] = 'ZobrazovaÅ¥ e-mailovú adresu so zobrazovaným menom'; +$labels['previewpane'] = 'ZobraziÅ¥ panel s náhľadom na správu'; $labels['skin'] = 'Vzhľad rozhrania'; $labels['logoutclear'] = 'VyprázdniÅ¥ kôš pri odhlásenÃ'; $labels['logoutcompact'] = 'ZhustiÅ¥ prieÄinok DoruÄená poÅ¡ta pri odhlásenÃ'; $labels['uisettings'] = 'PoužÃvateľské rozhranie'; $labels['serversettings'] = 'Nastavenia servera'; $labels['mailboxview'] = 'Zobrazenie schránky'; -$labels['mdnrequests'] = 'Pri požiadanà o potvrdenie o doruÄenÃ'; +$labels['mdnrequests'] = 'Pri žiadosti o potvrdenie o doruÄenÃ'; $labels['askuser'] = 'opýtaÅ¥ sa použÃvateľa'; $labels['autosend'] = 'odoslaÅ¥ potvrdenie'; -$labels['autosendknown'] = 'odoslaÅ¥ potvrdenie iba mojÃm kontaktom, inokedy sa opýtaÅ¥'; -$labels['autosendknownignore'] = 'odoslaÅ¥ potvrdenie mojÃm kontaktom, inokedy ignorovaÅ¥'; +$labels['autosendknown'] = 'odoslaÅ¥ potvrdenie iba mojim kontaktom'; +$labels['autosendknownignore'] = 'odoslaÅ¥ potvrdenie známym odosielateľom, inak ignorovaÅ¥'; $labels['ignore'] = 'ignorovaÅ¥'; $labels['readwhendeleted'] = 'OznaÄiÅ¥ správu ako preÄÃtanú pri jej vymazávanÃ'; -$labels['flagfordeletion'] = 'Namiesto vymazania správy ju iba oznaÄiÅ¥ ako odstránenú'; +$labels['flagfordeletion'] = 'Namiesto vymazania správy ju iba oznaÄiÅ¥ ako vymazanú'; $labels['skipdeleted'] = 'NezobrazovaÅ¥ vymazané správy'; -$labels['deletealways'] = 'OdstrániÅ¥ správy, ak zlyhá ich presun do koÅ¡a'; -$labels['deletejunk'] = 'HneÄ vymazávaÅ¥ správy v prieÄinku s Nevyžiadanou poÅ¡tou'; +$labels['deletealways'] = 'VymazaÅ¥ správy, ak zlyhá ich presun do koÅ¡a'; +$labels['deletejunk'] = 'HneÄ vymazávaÅ¥ správy v prieÄinku Nevyžiadaná poÅ¡ta (spam)'; $labels['showremoteimages'] = 'ZobrazovaÅ¥ obrázky uložené mimo správy'; -$labels['fromknownsenders'] = 'od známych odosielateľov'; +$labels['fromknownsenders'] = 'pri známych odosielateľoch'; $labels['always'] = 'vždy'; -$labels['showinlineimages'] = 'ZobrazovaÅ¥ pripojené obrázky pod správou'; +$labels['showinlineimages'] = 'ZobrazovaÅ¥ priložené obrázky pod správou'; $labels['autosavedraft'] = 'Automaticky uložiÅ¥ koncept'; $labels['everynminutes'] = 'každých $n minút'; $labels['refreshinterval'] = 'ObnoviÅ¥ (skontrolovaÅ¥ nové správy atÄ.)'; @@ -395,47 +396,47 @@ $labels['immediately'] = 'ihneÄ'; $labels['messagesdisplaying'] = 'Zobrazovanie správ'; $labels['messagescomposition'] = 'Vytváranie správ'; $labels['mimeparamfolding'] = 'Názvy prÃloh'; -$labels['2231folding'] = 'Full RFC 2231 (Thunderbird)'; +$labels['2231folding'] = 'Úplné RFC 2231 (Thunderbird)'; $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)'; -$labels['2047folding'] = 'Full RFC 2047 (iné)'; +$labels['2047folding'] = 'Úplné RFC 2047 (iné)'; $labels['force7bit'] = 'PoužiÅ¥ kódovanie MIME pre 8-bitové znaky'; $labels['advancedoptions'] = 'RozÅ¡Ãrené nastavenia'; $labels['focusonnewmessage'] = 'AktivovaÅ¥ okno prehliadaÄa pri novej správe'; $labels['checkallfolders'] = 'KontrolovaÅ¥ nové správy vo vÅ¡etkých prieÄinkoch'; -$labels['displaynext'] = 'ZobraziÅ¥ ÄalÅ¡iu správu po vymazanÃ/prenose správy'; -$labels['defaultfont'] = 'Prednastavené pÃsmo pre HTML správu'; +$labels['displaynext'] = 'ZobraziÅ¥ ÄalÅ¡iu správu po vymazanÃ/presunutà správy'; +$labels['defaultfont'] = 'Predvolené pÃsmo pre HTML správu'; $labels['mainoptions'] = 'Hlavné nastavenia'; $labels['browseroptions'] = 'Nastavenia prehliadania'; $labels['section'] = 'Sekcia'; $labels['maintenance'] = 'Údržba'; $labels['newmessage'] = 'Nová správa'; $labels['signatureoptions'] = 'Nastavenia podpÃsania'; -$labels['whenreplying'] = 'Pri odpovedanÃ'; +$labels['whenreplying'] = 'Pri odpovedi'; $labels['replyempty'] = 'necitovaÅ¥ pôvodnú správu'; -$labels['replytopposting'] = 'zaÄaÅ¥ novú správu nad citovanou správou'; -$labels['replybottomposting'] = 'zaÄaÅ¥ novú správu pod citovanou správou'; +$labels['replytopposting'] = 'zaÄaÅ¥ odpoveÄ nad citovanou správou'; +$labels['replybottomposting'] = 'zaÄaÅ¥ odpoveÄ pod citovanou správou'; $labels['replyremovesignature'] = 'Pri odpovedanà odstrániÅ¥ zo správy pôvodný podpis'; $labels['autoaddsignature'] = 'Automaticky pridaÅ¥ podpis'; $labels['newmessageonly'] = 'iba k novým správam'; -$labels['replyandforwardonly'] = 'len k odpovediam a preposielaným správam'; +$labels['replyandforwardonly'] = 'iba k odpovediam a preposielaným správam'; $labels['insertsignature'] = 'VložiÅ¥ podpis'; -$labels['previewpanemarkread'] = 'OznaÄiÅ¥ zobrazenú správu ako preÄÃtanú'; +$labels['previewpanemarkread'] = 'OznaÄiÅ¥ správu v náhľade ako preÄÃtanú'; $labels['afternseconds'] = 'po $n sekundách'; -$labels['reqmdn'] = 'Vždy požadovaÅ¥ potvrdenie o doruÄenÃ'; -$labels['reqdsn'] = 'Vždy vyžadovaÅ¥ potvrdenie o doruÄenà správy'; -$labels['replysamefolder'] = 'UmiestňovaÅ¥ odpovede do rovnakého prieÄinka ako správu, na ktorú sa odpovedalo'; +$labels['reqmdn'] = 'Vždy vyžadovaÅ¥ potvrdenie o doruÄenÃ'; +$labels['reqdsn'] = 'Vždy vyžadovaÅ¥ oznámenie o stave doruÄenia'; +$labels['replysamefolder'] = 'UmiestňovaÅ¥ odpovede do rovnakého prieÄinka ako pôvodnú správu'; $labels['defaultabook'] = 'Predvolený adresár kontaktov'; -$labels['autocompletesingle'] = 'VynechaÅ¥ alternatÃvne emailové adresy pri automatickom dopĺňanÃ'; +$labels['autocompletesingle'] = 'VynechaÅ¥ alternatÃvne e-mailové adresy pri automatickom dopĺňanÃ'; $labels['listnamedisplay'] = 'ZobraziÅ¥ kontakty ako'; $labels['spellcheckbeforesend'] = 'SkontrolovaÅ¥ pravopis pred odoslanÃm správy'; $labels['spellcheckoptions'] = 'Nastavenia kontroly pravopisu'; $labels['spellcheckignoresyms'] = 'IgnorovaÅ¥ slová so symbolmi'; $labels['spellcheckignorenums'] = 'IgnorovaÅ¥ slová s ÄÃslami'; -$labels['spellcheckignorecaps'] = 'IgnorovaÅ¥ slová pÃsané veľkými pÃsmenami'; +$labels['spellcheckignorecaps'] = 'IgnorovaÅ¥ slová pÃsané iba veľkými pÃsmenami'; $labels['addtodict'] = 'PridaÅ¥ do slovnÃka'; -$labels['mailtoprotohandler'] = 'ZaregistrovaÅ¥ handler pre odkazy typu „mailto:“'; +$labels['mailtoprotohandler'] = 'ZaregistrovaÅ¥ priradenie pre odkazy typu „mailto:“'; $labels['standardwindows'] = 'S vyskakovacÃmi oknami pracovaÅ¥ ako so Å¡tandardnými oknami'; -$labels['forwardmode'] = 'Preposielanie správ'; +$labels['forwardmode'] = 'Odosielanie správ Äalej'; $labels['inline'] = 'vo vnútri správy'; $labels['asattachment'] = 'ako prÃloha'; $labels['replyallmode'] = 'Predvolená akcia pre tlaÄidlo [OdpovedaÅ¥ vÅ¡etkým]'; @@ -444,7 +445,7 @@ $labels['replyalllist'] = 'odpovedaÅ¥ len do mailing-listu (ak bol nájdený)'; $labels['folder'] = 'PrieÄinok'; $labels['folders'] = 'PrieÄinky'; $labels['foldername'] = 'Názov prieÄinka'; -$labels['subscribed'] = 'Prihlásený k odberu'; +$labels['subscribed'] = 'Odber aktÃvny'; $labels['messagecount'] = 'Správy'; $labels['create'] = 'VytvoriÅ¥'; $labels['createfolder'] = 'VytvoriÅ¥ nový prieÄinok'; @@ -455,8 +456,8 @@ $labels['folderproperties'] = 'Vlastnosti prieÄinka'; $labels['parentfolder'] = 'RodiÄovský prieÄinok'; $labels['location'] = 'Umiestnenie'; $labels['info'] = 'Informácia'; -$labels['getfoldersize'] = 'Kliknúť pre zistenie veľkosti prieÄinka'; -$labels['changesubscription'] = 'Kliknúť pre zmenu prihlásenÃ'; +$labels['getfoldersize'] = 'Na zistenie veľkosti prieÄinka kliknite sem'; +$labels['changesubscription'] = 'Na zmenu odberu kliknite sem'; $labels['foldertype'] = 'Typ prieÄinka'; $labels['personalfolder'] = 'Súkromný prieÄinok'; $labels['otherfolder'] = 'Iné prieÄinky použÃvateľa'; @@ -465,12 +466,12 @@ $labels['sortby'] = 'ZoradiÅ¥ podľa'; $labels['sortasc'] = 'ZoradiÅ¥ vzostupne'; $labels['sortdesc'] = 'ZoradiÅ¥ zostupne'; $labels['undo'] = 'Späť'; -$labels['installedplugins'] = 'NainÅ¡talované zásuvné moduly'; +$labels['installedplugins'] = 'NainÅ¡talované prÃdavné moduly'; $labels['plugin'] = 'Zásuvný modul'; $labels['version'] = 'Verzia'; -$labels['source'] = 'Zdroj'; +$labels['source'] = 'Zdrojový kód'; $labels['license'] = 'Licencia'; -$labels['support'] = 'ZÃskaÅ¥ podporu'; +$labels['support'] = 'Podpora'; $labels['B'] = 'B'; $labels['KB'] = 'KB'; $labels['MB'] = 'MB'; @@ -489,7 +490,7 @@ $labels['turkish'] = 'Turecky'; $labels['nordic'] = 'Nórsky'; $labels['thai'] = 'Thajsky'; $labels['celtic'] = 'KeltÅ¡tina'; -$labels['vietnamese'] = 'Vietnamsky'; +$labels['vietnamese'] = 'VietnamÄina'; $labels['japanese'] = 'Japonsky'; $labels['korean'] = 'Kórejsky'; $labels['chinese'] = 'ÄŒÃnsky'; diff --git a/program/localization/sk_SK/messages.inc b/program/localization/sk_SK/messages.inc index ece954d48..d5cf323db 100644 --- a/program/localization/sk_SK/messages.inc +++ b/program/localization/sk_SK/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -24,15 +24,16 @@ $messages['servererror'] = 'Chyba servera!'; $messages['servererrormsg'] = 'Chyba servera: $msg'; $messages['dberror'] = 'Chyba databázy!'; $messages['requesttimedout'] = 'ÄŒas na vykonanie požiadavky uplynul'; -$messages['errorreadonly'] = 'Nemožno vykonaÅ¥ operáciu. PrieÄinok je urÄený len na ÄÃtanie.'; -$messages['errornoperm'] = 'Nemožno vykonaÅ¥ operáciu. PrÃstup bol odmietnutý.'; -$messages['erroroverquota'] = 'Nemožno vykonaÅ¥ operáciu. Na disku nie je dostatok voľného miesta.'; -$messages['erroroverquotadelete'] = 'Na disku nie je dostatok voľného miesta. Vymažte nejakú správu pomocou klávesov SHIFT+DEL.'; +$messages['errorreadonly'] = 'Akciu nemožno vykonaÅ¥. PrieÄinok je urÄený len na ÄÃtanie.'; +$messages['errornoperm'] = 'Akciu nemožno vykonaÅ¥. PrÃstup bol odmietnutý.'; +$messages['erroroverquota'] = 'Akciu nemožno vykonaÅ¥. Nie je dostatok voľného miesta.'; +$messages['erroroverquotadelete'] = 'Nie je dostatok voľného miesta. Vymažte nejakú správu pomocou klávesov SHIFT+DEL.'; $messages['invalidrequest'] = 'Neplatná požiadavka! Neuložili sa žiadne údaje.'; $messages['invalidhost'] = 'Neplatný názov servera.'; -$messages['nomessagesfound'] = 'Vo tejto schránke nie je žiadna správa.'; -$messages['loggedout'] = 'Odhlásenie prebehlo úspeÅ¡ne. Dovidenia!'; -$messages['mailboxempty'] = 'Schránka je prázdna.'; +$messages['nomessagesfound'] = 'V tomto prieÄinku nie je žiadna správa.'; +$messages['loggedout'] = 'Odhlásenie prebehlo úspeÅ¡ne. Dovidenia.'; +$messages['mailboxempty'] = 'Schránka je prázdna'; +$messages['nomessages'] = 'Žiadne správy'; $messages['refreshing'] = 'Obnovuje sa...'; $messages['loading'] = 'NaÄÃtava sa...'; $messages['uploading'] = 'Nahráva sa súbor...'; @@ -42,13 +43,13 @@ $messages['checkingmail'] = 'Kontrolujú sa nové správy...'; $messages['sendingmessage'] = 'Správa sa odosiela...'; $messages['messagesent'] = 'Správa bola úspeÅ¡ne odoslaná.'; $messages['savingmessage'] = 'Správa sa ukladá...'; -$messages['messagesaved'] = 'Správa bola uložená medzi koncepty.'; +$messages['messagesaved'] = 'Správa bola uložená ako koncept.'; $messages['successfullysaved'] = 'Ukladanie bolo úspeÅ¡ne dokonÄené.'; $messages['savingresponse'] = 'Ukladanie textu odpovede...'; $messages['deleteresponseconfirm'] = 'Naozaj chcete vymazaÅ¥ text odpovede?'; $messages['addedsuccessfully'] = 'Kontakt bol pridaný do adresára.'; $messages['contactexists'] = 'Kontakt s touto e-mailovou adresou už existuje.'; -$messages['contactnameexists'] = 'Kontakt s týmto menom už existuje.'; +$messages['contactnameexists'] = 'Kontakt s takýmto menom už existuje.'; $messages['blockedimages'] = 'Kvôli ochrane vášho súkromia boli v tejto správe zablokované vzdialené obrázky.'; $messages['encryptedmessage'] = 'Táto správa je zaÅ¡ifrovaná, a nie je možné ju zobraziÅ¥. PrepáÄte!'; $messages['nocontactsfound'] = 'NenaÅ¡li sa žiadne kontakty.'; @@ -58,15 +59,15 @@ $messages['sendingfailed'] = 'Nepodarilo sa odoslaÅ¥ správu.'; $messages['senttooquickly'] = 'PoÄkajte $sec sekúnd pred odoslanÃm tejto správy.'; $messages['errorsavingsent'] = 'PoÄas ukladania odoslanej správy sa vyskytla chyba.'; $messages['errorsaving'] = 'PoÄas ukladania sa vyskytla chyba.'; -$messages['errormoving'] = 'Správy nemožno presunúť.'; -$messages['errorcopying'] = 'Správy nemožno skopÃrovaÅ¥,'; -$messages['errordeleting'] = 'Správy nemožno vymazaÅ¥.'; +$messages['errormoving'] = 'Správu/správy nemožno presunúť.'; +$messages['errorcopying'] = 'Správu/správy nemožno skopÃrovaÅ¥,'; +$messages['errordeleting'] = 'Správu/správy nemožno vymazaÅ¥.'; $messages['errormarking'] = 'Nemožno oznaÄiÅ¥ správu/správy.'; $messages['deletecontactconfirm'] = 'Naozaj chcete vymazaÅ¥ vybrané kontakty?'; $messages['deletegroupconfirm'] = 'Naozaj chcete vymazaÅ¥ vybranú skupinu?'; $messages['deletemessagesconfirm'] = 'Naozaj chcete vymazaÅ¥ vybrané správy?'; $messages['deletefolderconfirm'] = 'Naozaj chcete vymazaÅ¥ tento prieÄinok?'; -$messages['purgefolderconfirm'] = 'Naozaj chcete vymazaÅ¥ vÅ¡etky správy v tomto prieÄinku?'; +$messages['purgefolderconfirm'] = 'Naozaj chcete vyprázdniÅ¥ tento prieÄinok?'; $messages['contactdeleting'] = 'Vymazávajú sa kontakty...'; $messages['groupdeleting'] = 'Vymazáva sa skupina...'; $messages['folderdeleting'] = 'Vymazáva sa prieÄinok ...'; @@ -74,9 +75,9 @@ $messages['foldermoving'] = 'Presúva sa prieÄinok...'; $messages['foldersubscribing'] = 'Prebieha prihlasovanie k prieÄinku...'; $messages['folderunsubscribing'] = 'Prebieha odhlasovanie z prieÄinka...'; $messages['formincomplete'] = 'Formulár nie je kompletne vyplnený.'; -$messages['noemailwarning'] = 'ProsÃm zadajte platnú emailovú adresu.'; +$messages['noemailwarning'] = 'ProsÃm zadajte platnú e-mailovú adresu.'; $messages['nonamewarning'] = 'ProsÃm zadajte meno.'; -$messages['nopagesizewarning'] = 'ProsÃm zadajte veľkosÅ¥ strany.'; +$messages['nopagesizewarning'] = 'ProsÃm zadajte poÄet záznamov na stranu.'; $messages['nosenderwarning'] = 'ProsÃm zadajte adresu odosielateľa.'; $messages['norecipientwarning'] = 'ProsÃm zadajte aspoň jedného prÃjemcu.'; $messages['nosubjectwarning'] = '"Predmet" správy je prázdny. Chcete ho teraz zadaÅ¥?'; @@ -84,10 +85,10 @@ $messages['nobodywarning'] = 'Chcete odoslaÅ¥ správu bez textu?'; $messages['notsentwarning'] = 'Správa nebola odoslaná, chcete ju zruÅ¡iÅ¥?'; $messages['restoresavedcomposedata'] = 'NaÅ¡la sa starÅ¡ia správa, ktorú ste napÃsali ale neodoslali.\n\nPredmet: $subject\nUložené: $date\n\nChcete túto správu obnoviÅ¥?'; $messages['noldapserver'] = 'ProsÃm vyberte server LDAP pre vyhľadávanie.'; -$messages['nosearchname'] = 'ProsÃm zadajte meno alebo emailovú adresu kontaktu.'; -$messages['notuploadedwarning'] = 'EÅ¡te neboli nahrané vÅ¡etky prÃlohy. ProsÃm Äakajte alebo nahrávanie zruÅ¡te.'; -$messages['searchsuccessful'] = 'nájdené správy: $nr.'; -$messages['contactsearchsuccessful'] = 'nájdené kontakty: $nr.'; +$messages['nosearchname'] = 'ProsÃm zadajte meno alebo e-mailovú adresu kontaktu.'; +$messages['notuploadedwarning'] = 'EÅ¡te neboli nahrané vÅ¡etky súbory. ProsÃm Äakajte alebo nahrávanie zruÅ¡te.'; +$messages['searchsuccessful'] = 'Nájdené správy: $nr.'; +$messages['contactsearchsuccessful'] = 'Nájdené kontakty: $nr.'; $messages['searchnomatch'] = 'Hľadaný výraz sa nenaÅ¡iel.'; $messages['searching'] = 'Vyhľadáva sa...'; $messages['checking'] = 'Kontroluje sa...'; @@ -104,10 +105,10 @@ $messages['fileuploaderror'] = 'Nahrávanie súboru bolo neúspeÅ¡né.'; $messages['filesizeerror'] = 'Nahraný súbor prekroÄil maximálnu veľkosÅ¥ $size.'; $messages['copysuccess'] = 'PoÄet úspeÅ¡ne skopÃrovaných kontaktov: $nr.'; $messages['movesuccess'] = 'PoÄet úspeÅ¡ne presunutých kontaktov: $nr.'; -$messages['copyerror'] = 'Kontakty nie je možné kopÃrovaÅ¥.'; +$messages['copyerror'] = 'Kontakty nemožno kopÃrovaÅ¥.'; $messages['moveerror'] = 'Kontakty nemožno presúvaÅ¥.'; -$messages['sourceisreadonly'] = 'Tento zdroj adries je len na ÄÃtanie.'; -$messages['errorsavingcontact'] = 'Nemožno uložiÅ¥ adresu kontaktu.'; +$messages['sourceisreadonly'] = 'Tento zdroj adries je urÄený len na ÄÃtanie.'; +$messages['errorsavingcontact'] = 'Zmeny nebolo možné uložiÅ¥.'; $messages['movingmessage'] = 'Prebieha presúvanie správ(y)...'; $messages['copyingmessage'] = 'Prebieha kopÃrovanie správ(y)...'; $messages['copyingcontact'] = 'Prebieha kopÃrovanie kontaktov...'; @@ -119,9 +120,9 @@ $messages['removingmember'] = 'Prebieha odstraňovanie kontaktov zo skupiny...'; $messages['receiptsent'] = 'Potvrdenie o preÄÃtanà bolo odoslané.'; $messages['errorsendingreceipt'] = 'Potvrdenie nemožno odoslaÅ¥.'; $messages['deleteidentityconfirm'] = 'Naozaj chcete vymazaÅ¥ túto identitu?'; -$messages['nodeletelastidentity'] = 'Túto identitu nemožno odstrániÅ¥, pretože je posledná.'; +$messages['nodeletelastidentity'] = 'Túto identitu nemožno vymazaÅ¥, pretože je posledná.'; $messages['forbiddencharacter'] = 'Názov prieÄinka obsahuje nepovolený znak.'; -$messages['selectimportfile'] = 'Zvoľte súbor, ktorý chcete nahraÅ¥ na server.'; +$messages['selectimportfile'] = 'Zvoľte súbor, ktorý chcete importovaÅ¥ na server.'; $messages['addresswriterror'] = 'Do vybraného adresára nie je možné zapisovaÅ¥ údaje.'; $messages['contactaddedtogroup'] = 'Kontakty boli úspeÅ¡ne pridané do tejto skupiny.'; $messages['contactremovedfromgroup'] = 'Kontakty boli úspeÅ¡ne odstránené z tejto skupiny.'; @@ -131,7 +132,7 @@ $messages['importformaterror'] = 'Importovanie nebolo úspeÅ¡né! Nahraný súbo $messages['importconfirm'] = '<b>PoÄet úspeÅ¡ne naimportovaných kontaktov: $inserted</b>'; $messages['importconfirmskipped'] = '<b>PoÄet preskoÄených existujúcich záznamov: $skipped</b>'; $messages['importmessagesuccess'] = 'PoÄet úspeÅ¡ne naimportovaných správ: $nr'; -$messages['importmessageerror'] = 'Importovanie bolo neúspeÅ¡né! Odoslaný súbor nie je platným súborom pre správu alebo poÅ¡tový prieÄinok'; +$messages['importmessageerror'] = 'Importovanie bolo neúspeÅ¡né! Odoslaný súbor nie je platným súborom pre importovanie'; $messages['opnotpermitted'] = 'Táto operácia nie je povolená!'; $messages['nofromaddress'] = 'Pri vybranej identite chýba e-mailová adresa.'; $messages['editorwarning'] = 'Prepnutie na editor Äistého textu spôsobà stratu formátovania. Naozaj chcete pokraÄovaÅ¥?'; @@ -153,10 +154,10 @@ $messages['contactrestored'] = 'Kontakty boli úspeÅ¡ne obnovené.'; $messages['groupdeleted'] = 'Skupina bola úspeÅ¡ne vymazaná.'; $messages['grouprenamed'] = 'Skupina bola úspeÅ¡ne premenovaná.'; $messages['groupcreated'] = 'Skupina bola úspeÅ¡ne vytvorená.'; -$messages['savedsearchdeleted'] = 'Uložené vyhľadávanie bolo úspeÅ¡ne vymazané.'; -$messages['savedsearchdeleteerror'] = 'Nemožno vymazaÅ¥ uložené vyhľadávanie.'; -$messages['savedsearchcreated'] = 'Uložené vyhľadávanie bolo úspeÅ¡ne vytvorené.'; -$messages['savedsearchcreateerror'] = 'Nemožno vytvoriÅ¥ uložené vyhľadávanie.'; +$messages['savedsearchdeleted'] = 'Uložené výsledky vyhľadávania boli úspeÅ¡ne vymazané.'; +$messages['savedsearchdeleteerror'] = 'Nemožno vymazaÅ¥ uložené výsledky vyhľadávania.'; +$messages['savedsearchcreated'] = 'Uložené výsledky vyhľadávania boli úspeÅ¡ne vytvorené.'; +$messages['savedsearchcreateerror'] = 'Nemožno vytvoriÅ¥ uložené výsledky vyhľadávania.'; $messages['messagedeleted'] = 'Vymazanie správ(y) bolo úspeÅ¡né.'; $messages['messagemoved'] = 'Presunutie správ(y) bolo úspeÅ¡né.'; $messages['messagecopied'] = 'KopÃrovanie správ(y) bolo úspeÅ¡né.'; @@ -165,9 +166,9 @@ $messages['autocompletechars'] = 'Zadajte najmenej $min znakov pre automatické $messages['autocompletemore'] = 'NaÅ¡lo sa viacero záznamov. Zadajte prosÃm viac znakov.'; $messages['namecannotbeempty'] = 'Meno nemôže byÅ¥ prázdne.'; $messages['nametoolong'] = 'Meno je prÃliÅ¡ dlhé.'; -$messages['folderupdated'] = 'PrieÄinok bol úspeÅ¡n aktualizovaný.'; +$messages['folderupdated'] = 'PrieÄinok bol úspeÅ¡ne aktualizovaný.'; $messages['foldercreated'] = 'PrieÄinok bol úspeÅ¡ne vytvorený.'; -$messages['invalidimageformat'] = 'Neplatný formát obrázku'; +$messages['invalidimageformat'] = 'Neplatný formát obrázka'; $messages['mispellingsfound'] = 'V správe boli nájdené pravopisné chyby.'; $messages['parentnotwritable'] = 'Nemožno vytvoriÅ¥/presunúť prieÄinok do vybraného rodiÄovského prieÄinka. Nemáte prÃstupové oprávnenia.'; $messages['messagetoobig'] = 'ÄŒasÅ¥ správy je prÃliÅ¡ veľká na spracovanie.'; diff --git a/program/localization/sl_SI/labels.inc b/program/localization/sl_SI/labels.inc index f1e9010d4..b8d9d98ee 100644 --- a/program/localization/sl_SI/labels.inc +++ b/program/localization/sl_SI/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from – $to od $count'; $labels['copy'] = 'Kopiraj'; $labels['move'] = 'Premakni'; $labels['moveto'] = 'Premakni v...'; +$labels['copyto'] = 'Kopiraj v...'; $labels['download'] = 'Prenesi'; $labels['open'] = 'Odpri'; $labels['showattachment'] = 'Prikaži'; @@ -197,6 +198,8 @@ $labels['spellcheck'] = 'ÄŒrkovanje'; $labels['checkspelling'] = 'Preglej pravopis'; $labels['resumeediting'] = 'Nadaljuj z urejanjem'; $labels['revertto'] = 'Razveljavi'; +$labels['restore'] = 'Obnovi'; +$labels['restoremessage'] = 'Obnovi sporoÄilo'; $labels['responses'] = 'Odgovori'; $labels['insertresponse'] = 'Vnesi odgovor'; $labels['manageresponses'] = 'Uredi odgovore'; @@ -431,11 +434,14 @@ $labels['spellcheckignoresyms'] = 'Ne upoÅ¡tevaj besed, ki vsebujejo simbole'; $labels['spellcheckignorenums'] = 'Ne upoÅ¡tevaj besed, ki vsebujejo Å¡tevilke'; $labels['spellcheckignorecaps'] = 'Ne upoÅ¡tevaj besed, ki vsebujejo samo velike Ärke'; $labels['addtodict'] = 'Dodaj v slovar'; -$labels['mailtoprotohandler'] = 'Registriraj upravljavca protokola za e-naslov: povezave'; +$labels['mailtoprotohandler'] = 'DoloÄi Arnes Spletno poÅ¡to kot privzeti poÅ¡tni odjemalec.'; $labels['standardwindows'] = 'Prikaži pojavna okna kot obiÄajna'; $labels['forwardmode'] = 'Posredovanje sporoÄil'; $labels['inline'] = 'medvrstiÄno'; $labels['asattachment'] = 'Kot priponka'; +$labels['replyallmode'] = 'Privzete možnosti gumba [Odgovori vsem]'; +$labels['replyalldefault'] = 'odgovori vsem'; +$labels['replyalllist'] = 'odgovori na dopisni seznam (v kolikor ta obstaja)'; $labels['folder'] = 'Mapa'; $labels['folders'] = 'Mape'; $labels['foldername'] = 'Ime mape'; diff --git a/program/localization/sl_SI/messages.inc b/program/localization/sl_SI/messages.inc index 3d1ea677c..9b4370922 100644 --- a/program/localization/sl_SI/messages.inc +++ b/program/localization/sl_SI/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -33,6 +33,7 @@ $messages['invalidhost'] = 'Nepravilno ime strežnika'; $messages['nomessagesfound'] = 'V poÅ¡tnem predalu ni sporoÄil.'; $messages['loggedout'] = 'Odjava je bila uspeÅ¡na.'; $messages['mailboxempty'] = 'PoÅ¡tni predal je prazen.'; +$messages['nomessages'] = 'Ni sporoÄil'; $messages['refreshing'] = 'Osvežujem...'; $messages['loading'] = 'Nalaganje...'; $messages['uploading'] = 'Prenos dokumenta na strežnik...'; @@ -82,6 +83,7 @@ $messages['norecipientwarning'] = 'Vnesite vsaj enega prejemnika sporoÄila'; $messages['nosubjectwarning'] = 'Polje "Zadeva" je prazno. Želite dodati tekst v to polje?'; $messages['nobodywarning'] = 'Želite poslati sporoÄilo brez vsebine?'; $messages['notsentwarning'] = 'SporoÄilo ni bilo poslano. Želite zavreÄi to sporoÄilo?'; +$messages['restoresavedcomposedata'] = 'Ali želite nadaljevati z urejanjem Å¡e neodposlanega osnutka:\n\nZadeva: $subject\nShranjeno dne: $date\n\n '; $messages['noldapserver'] = 'Izberite LDAP strežnik, v katerem želite iskati?'; $messages['nosearchname'] = 'Vnesite ime ali elektronski naslov stika'; $messages['notuploadedwarning'] = 'Priponke se Å¡e nalagajo na strežnik. PoÄakajte ali prekinite prenos.'; diff --git a/program/localization/sq_AL/messages.inc b/program/localization/sq_AL/messages.inc index d4b981318..f14e42e52 100644 --- a/program/localization/sq_AL/messages.inc +++ b/program/localization/sq_AL/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -21,7 +21,6 @@ $messages['sessionerror'] = 'Sesioni juaj është i pavlefshëm ose i ka kaluar $messages['storageerror'] = 'Lidhja me serverin IMAP dështoi'; $messages['nomessagesfound'] = 'Nuk ka mesazhe në këtë kuti postare'; $messages['loggedout'] = 'Sesionin e mbyllët me sukses. Mirupafshim!'; -$messages['mailboxempty'] = 'Kutia postare është bosh'; $messages['loading'] = 'Po ngarkohet...'; $messages['loadingdata'] = 'Po ngarkohen të dhëna...'; $messages['checkingmail'] = 'Po shoh për mesazhe të reja...'; diff --git a/program/localization/sr_CS/messages.inc b/program/localization/sr_CS/messages.inc index 7a4c89356..2d4efc408 100644 --- a/program/localization/sr_CS/messages.inc +++ b/program/localization/sr_CS/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -30,7 +30,6 @@ $messages['invalidrequest'] = 'Погрешан захтев! Подаци Ð½Ð¸Ñ $messages['invalidhost'] = 'Погрешно име Ñервера.'; $messages['nomessagesfound'] = 'Ðемате порука у Ñандучету.'; $messages['loggedout'] = 'УÑпешно Ñте Ñе одјавили.'; -$messages['mailboxempty'] = 'Сандуче је празно.'; $messages['refreshing'] = 'ОÑвежавам...'; $messages['loading'] = 'Учитавам...'; $messages['uploading'] = 'Шаљем датотеку...'; diff --git a/program/localization/sv_SE/labels.inc b/program/localization/sv_SE/labels.inc index 3a8af75d8..6b7765269 100644 --- a/program/localization/sv_SE/labels.inc +++ b/program/localization/sv_SE/labels.inc @@ -51,7 +51,8 @@ $labels['messagenrof'] = 'Meddelande $nr av $count'; $labels['fromtoshort'] = '$from – $to av $count'; $labels['copy'] = 'Kopiera'; $labels['move'] = 'Flytta'; -$labels['moveto'] = 'Flytta till:'; +$labels['moveto'] = 'Flytta till...'; +$labels['copyto'] = 'Kopiera till...'; $labels['download'] = 'Ladda ner'; $labels['open'] = 'Öppna'; $labels['showattachment'] = 'Visa'; @@ -100,8 +101,8 @@ $labels['longdec'] = 'december'; $labels['today'] = 'idag'; $labels['refresh'] = 'Uppdatera'; $labels['checkmail'] = 'Hämta nya meddelanden'; -$labels['compose'] = 'Nytt meddelande'; -$labels['writenewmessage'] = 'Nytt meddelande'; +$labels['compose'] = 'Meddelande'; +$labels['writenewmessage'] = 'Skriv nytt meddelande'; $labels['reply'] = 'Svara'; $labels['replytomessage'] = 'Svara avsändaren'; $labels['replytoallmessage'] = 'Svara avsändaren och alla mottagare'; @@ -112,7 +113,7 @@ $labels['forwardinline'] = 'Vidarebefordra infogat'; $labels['forwardattachment'] = 'Vidarebefordra som bilaga'; $labels['forwardmessage'] = 'Vidarebefordra meddelande'; $labels['deletemessage'] = 'Ta bort meddelande'; -$labels['movemessagetotrash'] = 'Flytta meddelande till papperskorgen'; +$labels['movemessagetotrash'] = 'Flytta meddelande till Papperskorg'; $labels['printmessage'] = 'Skriv ut'; $labels['previousmessage'] = 'Visa föregÃ¥ende meddelande'; $labels['firstmessage'] = 'Visa första meddelandet'; @@ -126,7 +127,7 @@ $labels['markread'] = 'Läst'; $labels['markunread'] = 'Oläst'; $labels['markflagged'] = 'Flaggat'; $labels['markunflagged'] = 'Oflaggat'; -$labels['moreactions'] = 'Fler Ã¥tgärder'; +$labels['moreactions'] = 'Fler Ã¥tgärder...'; $labels['more'] = 'Fler'; $labels['back'] = 'Tillbaka'; $labels['options'] = 'Alternativ'; @@ -139,7 +140,7 @@ $labels['flagged'] = 'Flaggade'; $labels['unanswered'] = 'Obesvarade'; $labels['withattachment'] = 'Med bilaga'; $labels['deleted'] = 'Borttagna'; -$labels['undeleted'] = 'Inte borttaget'; +$labels['undeleted'] = 'Inte borttagna'; $labels['invert'] = 'Invertera'; $labels['filter'] = 'Filter'; $labels['list'] = 'Lista'; @@ -163,7 +164,7 @@ $labels['listcolumns'] = 'Kolumner'; $labels['listsorting'] = 'Sortering'; $labels['listorder'] = 'Ordning'; $labels['listmode'] = 'Visningsläge'; -$labels['folderactions'] = 'Hantera kataloger'; +$labels['folderactions'] = 'Hantera kataloger...'; $labels['compact'] = 'Packa'; $labels['empty'] = 'Töm'; $labels['importmessages'] = 'Importera meddelanden'; @@ -212,7 +213,7 @@ $labels['attachments'] = 'Bilagor'; $labels['upload'] = 'Bifoga'; $labels['uploadprogress'] = '$percent ($current av $total)'; $labels['close'] = 'Stäng'; -$labels['messageoptions'] = 'Meddelandealternativ'; +$labels['messageoptions'] = 'Meddelandealternativ...'; $labels['low'] = 'LÃ¥g'; $labels['lowest'] = 'Lägst'; $labels['normal'] = 'Normal'; @@ -223,8 +224,8 @@ $labels['showimages'] = 'Visa bilder'; $labels['alwaysshow'] = 'Visa alltid bilder frÃ¥n $sender'; $labels['isdraft'] = 'Detta meddelande är ett utkast.'; $labels['andnmore'] = '$nr fler...'; -$labels['togglemoreheaders'] = 'Visa fler meddelandehuvuden'; -$labels['togglefullheaders'] = 'Växla meddelandehuvuden'; +$labels['togglemoreheaders'] = 'Växla ytterligare meddelandeinformation'; +$labels['togglefullheaders'] = 'Växla teknisk meddelandeinformation'; $labels['htmltoggle'] = 'HTML'; $labels['plaintoggle'] = 'Text'; $labels['savesentmessagein'] = 'Spara kopia i'; @@ -249,9 +250,9 @@ $labels['jobtitle'] = 'Titel'; $labels['department'] = 'Avdelning'; $labels['gender'] = 'Kön'; $labels['maidenname'] = 'Flicknamn'; -$labels['email'] = 'E-post'; +$labels['email'] = 'Mailadress'; $labels['phone'] = 'Telefon'; -$labels['address'] = 'Adress'; +$labels['address'] = 'Postadress'; $labels['street'] = 'Gata'; $labels['locality'] = 'Ort'; $labels['zipcode'] = 'Postnummer'; @@ -321,7 +322,7 @@ $labels['group'] = 'Grupp'; $labels['groups'] = 'Kontaktgrupper'; $labels['listgroup'] = 'Visa gruppmedlemmar'; $labels['personaladrbook'] = 'Personliga adresser'; -$labels['searchsave'] = 'Lägg till sökning'; +$labels['searchsave'] = 'Spara sökning'; $labels['searchdelete'] = 'Ta bort sökning'; $labels['import'] = 'Importera'; $labels['importcontacts'] = 'Importera kontakter'; @@ -367,8 +368,8 @@ $labels['htmlsignature'] = 'HTML-signatur'; $labels['showemail'] = 'Visa namn och adress'; $labels['previewpane'] = 'Visa meddelandefältet'; $labels['skin'] = 'Stilmall för användargränssnitt'; -$labels['logoutclear'] = 'Töm papperskorgen vid utloggning'; -$labels['logoutcompact'] = 'Packa inkorgen vid utloggning'; +$labels['logoutclear'] = 'Töm Papperskorg vid utloggning'; +$labels['logoutcompact'] = 'Packa Inkorg vid utloggning'; $labels['uisettings'] = 'Användargränssnitt'; $labels['serversettings'] = 'Serverinställningar'; $labels['mailboxview'] = 'Hantering av meddelanden'; @@ -410,10 +411,10 @@ $labels['section'] = 'Avdelning'; $labels['maintenance'] = 'UnderhÃ¥ll'; $labels['newmessage'] = 'Nytt meddelande'; $labels['signatureoptions'] = 'Signaturalternativ'; -$labels['whenreplying'] = 'Vid svar fortsätt skriv'; +$labels['whenreplying'] = 'Vid svar'; $labels['replyempty'] = 'Inkludera inte ursprungligt meddelande'; -$labels['replytopposting'] = 'Ovanför befintligt meddelande'; -$labels['replybottomposting'] = 'Nedanför befintligt meddelande'; +$labels['replytopposting'] = 'Skriv nytt meddelande ovanför befintligt'; +$labels['replybottomposting'] = 'Skriv nytt meddelande nedanför befintligt'; $labels['replyremovesignature'] = 'Ta bort befintlig signatur frÃ¥n meddelandet vid svar'; $labels['autoaddsignature'] = 'Infoga signatur automatiskt'; $labels['newmessageonly'] = 'Vid nytt meddelande'; @@ -438,7 +439,7 @@ $labels['standardwindows'] = 'Hantera popup-rutor som standardfönster'; $labels['forwardmode'] = 'Vidarebefordra meddelande'; $labels['inline'] = 'Infogat'; $labels['asattachment'] = 'Bilaga'; -$labels['replyallmode'] = 'Standardfunktion för knappen [Svara alla]'; +$labels['replyallmode'] = 'Standardfunktion för knappen Svara alla'; $labels['replyalldefault'] = 'Svara alla'; $labels['replyalllist'] = 'Svara endast lista (i förekommande fall)'; $labels['folder'] = 'Katalog'; diff --git a/program/localization/sv_SE/messages.inc b/program/localization/sv_SE/messages.inc index a61b7ccc4..7efc08013 100644 --- a/program/localization/sv_SE/messages.inc +++ b/program/localization/sv_SE/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -24,15 +24,16 @@ $messages['servererror'] = 'Serverfel!'; $messages['servererrormsg'] = 'Serverfel: $msg'; $messages['dberror'] = 'Databasfel!'; $messages['requesttimedout'] = 'Begäran tog för lÃ¥ng tid'; -$messages['errorreadonly'] = 'Ã…tgärden kunde inte utföras. Katalogen är skrivskyddad'; -$messages['errornoperm'] = 'Ã…tgärden kunde inte utföras. Otillräcklig befogenhet'; +$messages['errorreadonly'] = 'Ã…tgärden kunde inte utföras. Katalogen är skrivskyddad.'; +$messages['errornoperm'] = 'Ã…tgärden kunde inte utföras. Otillräcklig befogenhet.'; $messages['erroroverquota'] = 'Ã…tgärden kunde inte utföras. Otillräckligt lagringsutrymme.'; $messages['erroroverquotadelete'] = 'Otillräckligt lagringsutrymme. Tryck pÃ¥ SHIFT och DEL för att ta bort ett meddelande.'; $messages['invalidrequest'] = 'Ogiltig begäran! Informationen sparades inte.'; $messages['invalidhost'] = 'Ogiltigt servernamn.'; -$messages['nomessagesfound'] = 'Inga meddelanden'; +$messages['nomessagesfound'] = 'Inga meddelanden.'; $messages['loggedout'] = 'Du är utloggad. Välkommen Ã¥ter!'; $messages['mailboxempty'] = 'Katalogen är tom'; +$messages['nomessages'] = 'Inga meddelanden'; $messages['refreshing'] = 'Uppdaterar...'; $messages['loading'] = 'Laddar...'; $messages['uploading'] = 'Överför fil...'; @@ -43,25 +44,25 @@ $messages['sendingmessage'] = 'Skickar meddelande...'; $messages['messagesent'] = 'Meddelandet har skickats.'; $messages['savingmessage'] = 'Sparar meddelande...'; $messages['messagesaved'] = 'Meddelandet har sparats i Utkast'; -$messages['successfullysaved'] = 'Informationen har sparats.'; +$messages['successfullysaved'] = 'Sparat.'; $messages['savingresponse'] = 'Sparar responstext...'; $messages['deleteresponseconfirm'] = 'Vill du verkligen ta bort denna responstext?'; $messages['addedsuccessfully'] = 'Kontakten har lagts till i adressboken.'; -$messages['contactexists'] = 'En kontakt med den här adressen finns redan'; -$messages['contactnameexists'] = 'En kontakt med det här namnet finns redan'; +$messages['contactexists'] = 'En kontakt med den här adressen finns redan.'; +$messages['contactnameexists'] = 'En kontakt med det här namnet finns redan.'; $messages['blockedimages'] = 'Externt länkade bilder i meddelandet har blockerats.'; $messages['encryptedmessage'] = 'Meddelandet är krypterat och kan tyvärr inte visas.'; -$messages['nocontactsfound'] = 'Inga kontakter hittades'; -$messages['contactnotfound'] = 'EfterfrÃ¥gad kontakt hittades inte'; +$messages['nocontactsfound'] = 'Inga kontakter hittades.'; +$messages['contactnotfound'] = 'EfterfrÃ¥gad kontakt hittades inte.'; $messages['contactsearchonly'] = 'Ange sökord för att hitta kontakter'; -$messages['sendingfailed'] = 'Meddelandet kunde inte skickas'; -$messages['senttooquickly'] = 'Vänta ytterligare $sec sekunder med att skicka meddelandet'; -$messages['errorsavingsent'] = 'Ett fel inträffade när det skickade meddelandet skulle sparas'; -$messages['errorsaving'] = 'Meddelandet kunde inte sparas'; -$messages['errormoving'] = 'Meddelandet kunde inte flyttas'; -$messages['errorcopying'] = 'Meddelandet kunde inte kopieras'; -$messages['errordeleting'] = 'Meddelandet kunde inte tas bort'; -$messages['errormarking'] = 'Meddelandet kunde inte markeras'; +$messages['sendingfailed'] = 'Meddelandet kunde inte skickas.'; +$messages['senttooquickly'] = 'Vänta ytterligare $sec sekunder med att skicka meddelandet.'; +$messages['errorsavingsent'] = 'Det skickade meddelandet kunde inte sparas.'; +$messages['errorsaving'] = 'Meddelandet kunde inte sparas.'; +$messages['errormoving'] = 'Meddelandet kunde inte flyttas.'; +$messages['errorcopying'] = 'Meddelandet kunde inte kopieras.'; +$messages['errordeleting'] = 'Meddelandet kunde inte tas bort.'; +$messages['errormarking'] = 'Meddelandet kunde inte markeras.'; $messages['deletecontactconfirm'] = 'Vill du verkligen ta bort valda kontakter?'; $messages['deletegroupconfirm'] = 'Vill du verkligen ta bort den valda gruppen?'; $messages['deletemessagesconfirm'] = 'Vill du verkligen ta bort valda meddelanden?'; @@ -73,41 +74,41 @@ $messages['folderdeleting'] = 'Tar bort katalog...'; $messages['foldermoving'] = 'Flyttar katalog...'; $messages['foldersubscribing'] = 'Startar prenumeration pÃ¥ katalog...'; $messages['folderunsubscribing'] = 'Avslutar prenumeration pÃ¥ katalog...'; -$messages['formincomplete'] = 'Formuläret var inte komplett ifyllt'; -$messages['noemailwarning'] = 'Ange en giltig adress'; -$messages['nonamewarning'] = 'Ange ett namn'; -$messages['nopagesizewarning'] = 'Ange en sidstorlek'; -$messages['nosenderwarning'] = 'Ange en avsändaradress'; -$messages['norecipientwarning'] = 'Ange minst en mottagare'; -$messages['nosubjectwarning'] = 'Ämnesraden är tom. Vill du ange ämne nu?'; +$messages['formincomplete'] = 'Formuläret var inte komplett ifyllt.'; +$messages['noemailwarning'] = 'Ange en giltig adress.'; +$messages['nonamewarning'] = 'Ange ett namn.'; +$messages['nopagesizewarning'] = 'Ange en sidstorlek.'; +$messages['nosenderwarning'] = 'Ange en avsändaradress.'; +$messages['norecipientwarning'] = 'Ange minst en mottagare.'; +$messages['nosubjectwarning'] = 'Ämnesraden är tom. Vill du ange ett ämne nu?'; $messages['nobodywarning'] = 'Skicka det här meddelandet utan text?'; $messages['notsentwarning'] = 'Meddelandet har inte skickats. Vill du avbryta meddelandet?'; $messages['restoresavedcomposedata'] = 'Ett tidigare skrivet men inte skickat meddelande upptäcktes.\n\nÄmne: $subject\nSparat: $date\n\nVill du Ã¥terskapa meddelandet?'; -$messages['noldapserver'] = 'Ange en LDAP-server för att söka'; -$messages['nosearchname'] = 'Ange ett kontaktnamn eller en adress'; +$messages['noldapserver'] = 'Ange en LDAP-server för att söka.'; +$messages['nosearchname'] = 'Ange ett kontaktnamn eller en adress.'; $messages['notuploadedwarning'] = 'Alla bilagor har inte överförts ännu. Vänta eller avbryt överföringen.'; $messages['searchsuccessful'] = '$nr meddelanden hittades.'; $messages['contactsearchsuccessful'] = '$nr kontakter hittades.'; -$messages['searchnomatch'] = 'Sökningen gav inget resultat'; +$messages['searchnomatch'] = 'Sökningen gav inget resultat.'; $messages['searching'] = 'Söker...'; $messages['checking'] = 'Kontrollerar...'; -$messages['nospellerrors'] = 'Inget stavfel hittades'; +$messages['nospellerrors'] = 'Inget stavfel hittades.'; $messages['folderdeleted'] = 'Katalogen togs bort.'; $messages['foldersubscribed'] = 'Prenumeration pÃ¥ katalog startad.'; $messages['folderunsubscribed'] = 'Prenumeration pÃ¥ katalog avslutad.'; -$messages['folderpurged'] = 'Katalog rensad.'; -$messages['folderexpunged'] = 'Katalog tömd.'; -$messages['deletedsuccessfully'] = 'Lyckad borttagning.'; -$messages['converting'] = 'Tar bort formatering frÃ¥n meddelande...'; -$messages['messageopenerror'] = 'Meddelandet kunde inte hämtas frÃ¥n servern'; -$messages['fileuploaderror'] = 'Filuppladdning misslyckades'; -$messages['filesizeerror'] = 'Den uppladdade filens storlek överstiger högsta tillÃ¥tna $size'; +$messages['folderpurged'] = 'Katalog tömd.'; +$messages['folderexpunged'] = 'Katalog rensad.'; +$messages['deletedsuccessfully'] = 'Borttaget.'; +$messages['converting'] = 'Tar bort formatering...'; +$messages['messageopenerror'] = 'Meddelandet kunde inte hämtas frÃ¥n servern.'; +$messages['fileuploaderror'] = 'Filuppladdning misslyckades.'; +$messages['filesizeerror'] = 'Den uppladdade filens storlek överstiger högsta tillÃ¥tna $size.'; $messages['copysuccess'] = '$nr kontakter har kopierats.'; $messages['movesuccess'] = '$nr kontakter har flyttats.'; $messages['copyerror'] = 'NÃ¥gra kontakter kunde inte kopieras.'; $messages['moveerror'] = 'NÃ¥gra kontakter kunde inte flyttas.'; -$messages['sourceisreadonly'] = 'Denna adresskälla är skrivskyddad'; -$messages['errorsavingcontact'] = 'Kontaktadressen kunde inte sparas'; +$messages['sourceisreadonly'] = 'Denna adresskälla är skrivskyddad.'; +$messages['errorsavingcontact'] = 'Kontaktadressen kunde inte sparas.'; $messages['movingmessage'] = 'Flyttar meddelande...'; $messages['copyingmessage'] = 'Kopierar meddelande...'; $messages['copyingcontact'] = 'Kopierar kontakter...'; @@ -117,12 +118,12 @@ $messages['markingmessage'] = 'Markerar meddelande...'; $messages['addingmember'] = 'Lägger till kontakter i gruppen...'; $messages['removingmember'] = 'Tar bort kontakter frÃ¥n gruppen...'; $messages['receiptsent'] = 'Mottagarkvitto har skickats.'; -$messages['errorsendingreceipt'] = 'Mottagarkvitto kunde inte skickas'; +$messages['errorsendingreceipt'] = 'Mottagarkvitto kunde inte skickas.'; $messages['deleteidentityconfirm'] = 'Vill du verkligen ta bort denna identitet?'; $messages['nodeletelastidentity'] = 'Du kan inte ta bort identiteten, den är din sista.'; -$messages['forbiddencharacter'] = 'Katalognamnet innehÃ¥ller otillÃ¥tna tecken'; -$messages['selectimportfile'] = 'Välj en fil att ladda upp'; -$messages['addresswriterror'] = 'Angiven adressbok är skrivskyddad'; +$messages['forbiddencharacter'] = 'Katalognamnet innehÃ¥ller otillÃ¥tna tecken.'; +$messages['selectimportfile'] = 'Välj en fil att ladda upp.'; +$messages['addresswriterror'] = 'Markerad adressbok är skrivskyddad.'; $messages['contactaddedtogroup'] = 'Kontakterna har lagts till i gruppen.'; $messages['contactremovedfromgroup'] = 'Kontakterna har tagits bort frÃ¥n gruppen.'; $messages['nogroupassignmentschanged'] = 'Ingen grupptillhörighet ändrades.'; @@ -130,47 +131,47 @@ $messages['importwait'] = 'Importerar, var god vänta...'; $messages['importformaterror'] = 'Importen misslyckades! Filen har inte korrekt dataformat.'; $messages['importconfirm'] = '<b>Lyckad import av $inserted kontakter</b>'; $messages['importconfirmskipped'] = '<b>Hoppade över $skipped befintliga poster</b>'; -$messages['importmessagesuccess'] = '$nr meddelanden har importerats.'; -$messages['importmessageerror'] = 'Importen misslyckades! Filen innehÃ¥ller inte nÃ¥got meddelande eller nÃ¥gon brevlÃ¥da'; +$messages['importmessagesuccess'] = '$nr meddelanden har importerats'; +$messages['importmessageerror'] = 'Importen misslyckades! Filen är inte ett giltigt meddelande eller en brevlÃ¥da'; $messages['opnotpermitted'] = 'OtillÃ¥ten operation!'; -$messages['nofromaddress'] = 'Adress saknas i den valda identiteten'; +$messages['nofromaddress'] = 'Adress saknas i den valda identiteten.'; $messages['editorwarning'] = 'Genom att växla till text-läge gÃ¥r formateringen förlorad. Vill du fortsätta?'; $messages['httpreceivedencrypterror'] = 'Ett irreparabelt fel har uppstÃ¥tt. Kontakta administratören omgÃ¥ende. <b>Meddelandet kan inte skickas.</b>'; -$messages['smtpconnerror'] = 'SMTP-fel ($code): Anslutning till servern misslyckades'; -$messages['smtpautherror'] = 'SMTP-fel ($code): Inloggningen misslyckades'; -$messages['smtpfromerror'] = 'SMTP-fel ($code): Kan inte sätta avsändaradress till "$from" ($msg)'; -$messages['smtptoerror'] = 'SMTP-fel ($code): Kan inte lägga till mottagaradress "$to" ($msg)'; -$messages['smtprecipientserror'] = 'SMTP-fel: Felaktigt formaterad lista med mottagaradresser'; +$messages['smtpconnerror'] = 'SMTP-fel ($code): Anslutning till servern misslyckades.'; +$messages['smtpautherror'] = 'SMTP-fel ($code): Inloggningen misslyckades.'; +$messages['smtpfromerror'] = 'SMTP-fel ($code): Kan inte sätta avsändaradress till "$from" ($msg).'; +$messages['smtptoerror'] = 'SMTP-fel ($code): Kan inte lägga till mottagaradress "$to" ($msg).'; +$messages['smtprecipientserror'] = 'SMTP-fel: Felaktigt formaterad lista med mottagaradresser.'; $messages['smtperror'] = 'SMTP-fel: $msg'; $messages['emailformaterror'] = 'Felaktig adress: $email'; -$messages['toomanyrecipients'] = 'FörmÃ¥nga mottagare. Minska antalet till högst $max'; -$messages['maxgroupmembersreached'] = 'Antalet gruppmedlemmar fÃ¥r inte överstiga $max'; +$messages['toomanyrecipients'] = 'FörmÃ¥nga mottagare. Minska antalet till högst $max.'; +$messages['maxgroupmembersreached'] = 'Antalet gruppmedlemmar fÃ¥r inte överstiga $max.'; $messages['internalerror'] = 'Ett internt fel uppstod. Försök igen.'; -$messages['contactdelerror'] = 'Kontakt kunde inte tas bort'; +$messages['contactdelerror'] = 'Kontakt kunde inte tas bort.'; $messages['contactdeleted'] = 'Kontakt borttagen.'; -$messages['contactrestoreerror'] = 'Borttagna kontakter kunde inte Ã¥terskapas'; +$messages['contactrestoreerror'] = 'Borttagna kontakter kunde inte Ã¥terskapas.'; $messages['contactrestored'] = 'Kontakter Ã¥terskapade.'; $messages['groupdeleted'] = 'Grupp borttagen.'; $messages['grouprenamed'] = 'Gruppnamn ändrat.'; $messages['groupcreated'] = 'Grupp skapad.'; $messages['savedsearchdeleted'] = 'Sparad sökning borttagen.'; -$messages['savedsearchdeleteerror'] = 'Kunde inte ta bort sparad sökning'; +$messages['savedsearchdeleteerror'] = 'Kunde inte ta bort sparad sökning.'; $messages['savedsearchcreated'] = 'Sparad sökning tillagd.'; -$messages['savedsearchcreateerror'] = 'Kunde inte lägga till sparad sökning'; +$messages['savedsearchcreateerror'] = 'Kunde inte lägga till sparad sökning.'; $messages['messagedeleted'] = 'Meddelande borttaget.'; $messages['messagemoved'] = 'Meddelande flyttat.'; $messages['messagecopied'] = 'Meddelande kopierat.'; $messages['messagemarked'] = 'Meddelande markerat.'; -$messages['autocompletechars'] = 'Ange minst $min tecken för automatisk komplettering'; -$messages['autocompletemore'] = 'Flera passande informationsposter funna. Skriv fler tecken.'; -$messages['namecannotbeempty'] = 'Namnet fÃ¥r inte vara tomt'; -$messages['nametoolong'] = 'Namnet är för lÃ¥ngt'; +$messages['autocompletechars'] = 'Ange minst $min tecken för automatisk komplettering.'; +$messages['autocompletemore'] = 'Ytterligare passande poster funna. Skriv fler tecken.'; +$messages['namecannotbeempty'] = 'Namnet fÃ¥r inte vara tomt.'; +$messages['nametoolong'] = 'Namnet är för lÃ¥ngt.'; $messages['folderupdated'] = 'Katalog uppdaterad.'; $messages['foldercreated'] = 'Katalog skapad.'; -$messages['invalidimageformat'] = 'Ogiltigt bildfilsformat'; -$messages['mispellingsfound'] = 'Stavfel hittades i meddelandet'; +$messages['invalidimageformat'] = 'Ogiltigt bildfilsformat.'; +$messages['mispellingsfound'] = 'Stavfel hittades i meddelandet.'; $messages['parentnotwritable'] = 'Katalogen kunde inte skapas eller flyttas. Ã…tkomsträttighet saknas.'; -$messages['messagetoobig'] = 'Denna del av meddelandet är alltför stor för att hantera.'; +$messages['messagetoobig'] = 'Meddelandet är alltför stort att behandla.'; $messages['attachmentvalidationerror'] = 'VARNING! Bilagan misstänks vara av annan typ än vad som anges i meddelandet. Om du inte litar pÃ¥ avsändaren ska du inte öppna bilagan.<br/><br/><em>Angiven typ: $expected; funnen typ: $detected</em>'; $messages['noscriptwarning'] = 'Varning: Denna webbmailtjänst fungerar inte utan Javascript! Aktivera Javascript i webbläsarens inställningar.'; ?> diff --git a/program/localization/ta_IN/messages.inc b/program/localization/ta_IN/messages.inc index d496b3836..0da63d2af 100644 --- a/program/localization/ta_IN/messages.inc +++ b/program/localization/ta_IN/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -23,7 +23,6 @@ $messages['servererror'] = 'சேவையக பிழை!'; $messages['invalidrequest'] = 'செலà¯à®²à®¾à®¤ வேணà¯à®Ÿà¯à®•à¯‹à®³à¯! எநà¯à®¤ தரவà¯à®®à¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.'; $messages['nomessagesfound'] = 'இநà¯à®¤ தபால௠பெடà¯à®Ÿà®¿à®¯à®¿à®²à¯ எநà¯à®¤ தரவà¯à®®à¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ'; $messages['loggedout'] = 'நீஙà¯à®•à®³à¯ அமரà¯à®µà¯ˆ வெறà¯à®±à®¿à®•à®°à®®à®¾à®• à®®à¯à®Ÿà®¿à®¤à¯à®¤à¯€à®°à¯à®•à®³à¯. வணகà¯à®•à®®à¯'; -$messages['mailboxempty'] = 'தபால௠பெடà¯à®Ÿà®¿ காலியாக உளà¯à®³à®¤à¯'; $messages['loading'] = 'à®à®±à¯à®±à¯à®•à®¿à®±à®¤à¯...'; $messages['uploading'] = 'கோபà¯à®ªà¯ˆ à®à®±à¯à®±à¯à®•à®¿à®±à®¤à¯...'; $messages['loadingdata'] = 'தரவை à®à®±à¯à®±à¯à®•à®¿à®±à®¤à¯...'; diff --git a/program/localization/th_TH/messages.inc b/program/localization/th_TH/messages.inc index 46d960aff..2ad95fc94 100644 --- a/program/localization/th_TH/messages.inc +++ b/program/localization/th_TH/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -25,7 +25,6 @@ $messages['dberror'] = 'เà¸à¸´à¸”ข้à¸à¸œà¸´à¸”พลาดเà¸à¸µà¹ˆà¸ $messages['invalidhost'] = 'ชื่à¸à¹€à¸‹à¸´à¸£à¹Œà¸Ÿà¹€à¸§à¸à¸£à¹Œà¹„ม่ถูà¸à¸•à¹‰à¸à¸‡'; $messages['nomessagesfound'] = 'ไม่มีจดหมายในà¸à¸¥à¹ˆà¸à¸‡à¸ˆà¸”หมายนี้'; $messages['loggedout'] = 'ทำà¸à¸²à¸£à¸à¸à¸à¸ˆà¸²à¸à¸£à¸°à¸šà¸šà¹€à¸£à¸µà¸¢à¸šà¸£à¹‰à¸à¸¢'; -$messages['mailboxempty'] = 'à¸à¸¥à¹ˆà¸à¸‡à¸ˆà¸”หมายนี้ว่างเปล่า'; $messages['refreshing'] = 'à¸à¸³à¸¥à¸±à¸‡à¸£à¸µà¹€à¸Ÿà¸£à¸Š...'; $messages['loading'] = 'Loading...'; $messages['uploading'] = 'à¸à¸³à¸¥à¸±à¸‡à¸à¸±à¸žà¹‚หลดไฟล์...'; diff --git a/program/localization/ti/labels.inc b/program/localization/ti/labels.inc new file mode 100644 index 000000000..2919f47c0 --- /dev/null +++ b/program/localization/ti/labels.inc @@ -0,0 +1,62 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | localization/<lang>/labels.inc | + | | + | Localization file of the Roundcube Webmail client | + | Copyright (C) 2005-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/labels/ +*/ +$labels['welcome'] = 'ሰናዠáˆáˆáŒ»áŠ¥ ናብ $product'; +$labels['username'] = 'ሽáˆá‹“ሙና'; +$labels['password'] = 'መáˆáˆˆáŠ ቃáˆ'; +$labels['server'] = 'á‹áˆƒá‰¢ áŒáˆáŒ‹áˆŽá‰µ'; +$labels['login'] = 'áŠáŠ£á‰±'; +$labels['logout'] = 'áŠá‹áŒ½áŠ¥'; +$labels['mail'] = 'ደብዳበ'; +$labels['settings'] = 'ከመንታá‹'; +$labels['addressbook'] = 'መጽሓá አድራሻ'; +$labels['inbox'] = 'ሳጹን አታዊ'; +$labels['drafts'] = 'ወጡን ጽሑá'; +$labels['sent'] = 'á‹á‰°áˆˆáŠ£áŠ¸'; +$labels['trash'] = 'እንዳጉሓá'; +$labels['junk'] = 'እንዳቅንጠመንጢ'; +$labels['subject'] = 'ዋኒን'; +$labels['from'] = 'ካብ'; +$labels['sender'] = 'áˆáŠ£áŠº(ት)'; +$labels['to'] = 'ናብ'; +$labels['cc'] = 'ካኮ'; +$labels['bcc'] = 'ሕካኮ'; +$labels['replyto'] = 'ተመላሲ ናብ'; +$labels['followupto'] = 'ናብ...á‹áˆµá‹“በ'; +$labels['date'] = 'ዕለት'; +$labels['size'] = 'መጠን'; +$labels['priority'] = 'ህጹጽáŠá‰µ'; +$labels['organization'] = 'á‹á‹µá‰¥'; +$labels['readstatus'] = 'áˆáŠ•á‰£á‰¡'; +$labels['listoptions'] = 'መማáˆáŒ½á‰³á‰µ á‹áˆá‹áˆ'; +$labels['mailboxlist'] = 'ማህዸራት'; +$labels['messagesfromto'] = '$countዠመáˆáŠ¥áŠ½á‰² ካብ $from ናብ $to '; +$labels['sun'] = 'ሰንበ'; +$labels['mon'] = 'ሰኑá‹'; +$labels['tue'] = 'ሰሉስ'; +$labels['wed'] = 'ረቡዕ'; +$labels['thu'] = 'ሓሙስ'; +$labels['fri'] = 'á‹“áˆá‰¢'; +$labels['sat'] = 'ቀዳáˆ'; +$labels['sunday'] = 'ሰንበት'; +$labels['monday'] = 'ሰኑá‹'; +$labels['tuesday'] = 'ሰሉስ'; +$labels['wednesday'] = 'ረቡዕ'; +$labels['thursday'] = 'ሓሙስ'; +$labels['friday'] = 'á‹“áˆá‰¢ '; +$labels['saturday'] = 'ቀዳáˆ'; +?> diff --git a/program/localization/fy_NL/messages.inc b/program/localization/ti/messages.inc index da4e39679..278a0897a 100644 --- a/program/localization/fy_NL/messages.inc +++ b/program/localization/ti/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -15,4 +15,10 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/messages/ */ +$messages['errortitle'] = 'ተጓንᎠጋዶ'; +$messages['loginfailed'] = 'ከá‹á‹² áˆáŠ¥á‰³á‹Ž áˆáˆºáˆ‰'; +$messages['cookiesdisabled'] = 'ጎስጓሲ ኢንተáˆáŠ”ት ዛላማላ አá‹á‰•á‰ áˆáŠ•'; +$messages['sessionerror'] = 'እዋኑ á‹áˆ“ለᎠወዠዋጋ ዘá‹á‰¥áˆ‰ ካáˆáŠ áˆáŒ¥á‰ƒáˆ áŠáˆáŠáˆ እዩ::'; +$messages['storageerror'] = 'ናብ á‹áˆƒá‰¢ áŒáˆáŒ‹áˆ‰á‰µ ቆᎠረኽቢ አá‹á‰°áŠ»áˆˆáŠ•::'; +$messages['servererror'] = 'ጋዶ á‹áˆƒá‰¢á‰µ áŒáˆáŒ‹áˆ‰á‰µ'; ?> diff --git a/program/localization/tr_TR/labels.inc b/program/localization/tr_TR/labels.inc index 1f20a22bc..99122ccad 100644 --- a/program/localization/tr_TR/labels.inc +++ b/program/localization/tr_TR/labels.inc @@ -52,6 +52,7 @@ $labels['fromtoshort'] = '$from - $to , Toplam: $count'; $labels['copy'] = 'Kopyala'; $labels['move'] = 'Taşı'; $labels['moveto'] = 'Åžuraya taşı...'; +$labels['copyto'] = 'Åžuraya kopyala...'; $labels['download'] = 'Ä°ndir'; $labels['open'] = 'Aç'; $labels['showattachment'] = 'Göster'; diff --git a/program/localization/tr_TR/messages.inc b/program/localization/tr_TR/messages.inc index ede900d01..cf3607498 100644 --- a/program/localization/tr_TR/messages.inc +++ b/program/localization/tr_TR/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -30,9 +30,10 @@ $messages['erroroverquota'] = 'Ä°ÅŸlem gerçekleÅŸtirilemedi. BoÅŸ alan yok.'; $messages['erroroverquotadelete'] = 'BoÅŸ alan yok. SHIFT+DEL tuÅŸ kombinasyonunu kullanarak mesajı silin.'; $messages['invalidrequest'] = 'Geçersiz Ä°stek! Veri kaydedilmedi'; $messages['invalidhost'] = 'Geçersiz sunucu adı.'; -$messages['nomessagesfound'] = 'Posta kutusunda ileti bulunamadı'; +$messages['nomessagesfound'] = 'Posta kutusunda ileti bulunamadı.'; $messages['loggedout'] = 'Oturumu baÅŸarılı bir ÅŸekilde kapattınız. Güle güle!'; $messages['mailboxempty'] = 'Posta kutusu boÅŸ'; +$messages['nomessages'] = 'Mesaj yok'; $messages['refreshing'] = 'Yenileniyor...'; $messages['loading'] = 'Yükleniyor...'; $messages['uploading'] = 'Dosya yükleniyor...'; @@ -67,7 +68,7 @@ $messages['deletegroupconfirm'] = 'Seçili grupları silmek istediÄŸinizden emi $messages['deletemessagesconfirm'] = 'Seçili postaları silmek istediÄŸinizden emin misiniz?'; $messages['deletefolderconfirm'] = 'Bu klasörü silmek istediÄŸinizden emin misiniz?'; $messages['purgefolderconfirm'] = 'Bu klasördeki tüm postaları silmek istediÄŸinizden emin misiniz?'; -$messages['contactdeleting'] = 'KiÅŸi(er) siliniyor...'; +$messages['contactdeleting'] = 'KiÅŸi(ler) siliniyor...'; $messages['groupdeleting'] = 'Grup siliniyor...'; $messages['folderdeleting'] = 'Klasör siliniyor...'; $messages['foldermoving'] = 'Klasör taşınıyor...'; @@ -87,27 +88,27 @@ $messages['noldapserver'] = 'Lütfen arama için bir LDAP sunucu seçin'; $messages['nosearchname'] = 'Lütfen bir kiÅŸi ismi veya e-posta adresi girin'; $messages['notuploadedwarning'] = 'Henüz tüm ekli dosyalar yüklenmedi. Lütfen bekleyin ya da yüklemeyi iptal edin.'; $messages['searchsuccessful'] = '$nr posta bulundu'; -$messages['contactsearchsuccessful'] = '$nr kiÅŸi bulundu'; -$messages['searchnomatch'] = 'Aramanıza uygun hiçbir sonuç bulunamadı'; +$messages['contactsearchsuccessful'] = '$nr kiÅŸi bulundu.'; +$messages['searchnomatch'] = 'Aramanıza uygun hiçbir sonuç bulunamadı.'; $messages['searching'] = 'Aranıyor...'; $messages['checking'] = 'Denetleniyor...'; -$messages['nospellerrors'] = 'Yazım hatası bulunamadı'; -$messages['folderdeleted'] = 'Klasör silindi'; -$messages['foldersubscribed'] = 'Klasöre abone olundu'; -$messages['folderunsubscribed'] = 'Klasör aboneliÄŸi kaldırıldı'; -$messages['folderpurged'] = 'Klasör sıklaÅŸtırıldı'; -$messages['folderexpunged'] = 'Klasör boÅŸaltıldı'; -$messages['deletedsuccessfully'] = 'Silindi'; +$messages['nospellerrors'] = 'Yazım hatası bulunamadı.'; +$messages['folderdeleted'] = 'Klasör baÅŸarıyla silindi.'; +$messages['foldersubscribed'] = 'Klasöre baÅŸarıyla abone olundu.'; +$messages['folderunsubscribed'] = 'Klasör aboneliÄŸi baÅŸarıyla kaldırıldı.'; +$messages['folderpurged'] = 'Klasör baÅŸarıyla sıklaÅŸtırıldı.'; +$messages['folderexpunged'] = 'Klasör baÅŸarıyla boÅŸaltıldı.'; +$messages['deletedsuccessfully'] = 'BaÅŸarıyla silindi.'; $messages['converting'] = 'Postanın biçimlendirmesi kaldırılıyor...'; -$messages['messageopenerror'] = 'Sunucudan posta yüklenemedi'; -$messages['fileuploaderror'] = 'Dosya yükleme baÅŸarısız'; -$messages['filesizeerror'] = 'Yüklenen dosya en büyük dosya boyunu ($size) aşıyor'; +$messages['messageopenerror'] = 'Sunucudan posta yüklenemedi.'; +$messages['fileuploaderror'] = 'Dosya yükleme baÅŸarısız.'; +$messages['filesizeerror'] = 'Yüklenen dosya en büyük dosya boyunu ($size) aşıyor.'; $messages['copysuccess'] = '$nr adet kiÅŸi baÅŸarıyla kopyalandı.'; $messages['movesuccess'] = '$nr adet kiÅŸi baÅŸarıyla taşındı.'; $messages['copyerror'] = 'KiÅŸiler kopyalanamadı.'; $messages['moveerror'] = 'KiÅŸiler taşınamadı.'; -$messages['sourceisreadonly'] = 'Adres kaynağı salt okunur durumda'; -$messages['errorsavingcontact'] = 'KiÅŸinin adresi kaydedilemedi'; +$messages['sourceisreadonly'] = 'Adres kaynağı salt okunur durumda.'; +$messages['errorsavingcontact'] = 'KiÅŸi adresi kaydedilemedi.'; $messages['movingmessage'] = 'Posta(lar) taşınıyor...'; $messages['copyingmessage'] = 'Posta(lar) kopyalanıyor...'; $messages['copyingcontact'] = 'KiÅŸile(ler) kopyalanıyor...'; @@ -116,19 +117,19 @@ $messages['deletingmessage'] = 'Posta(lar) siliniyor...'; $messages['markingmessage'] = 'Posta(lar) iÅŸaretleniyor...'; $messages['addingmember'] = 'Gruba kiÅŸi(ler) ekleniyor...'; $messages['removingmember'] = 'Gruptan kiÅŸi(ler) siliniyor...'; -$messages['receiptsent'] = 'Okundu onayı gönderildi'; -$messages['errorsendingreceipt'] = 'Okundu onayı gönderilemedi'; +$messages['receiptsent'] = 'Okundu onayı baÅŸarıyla gönderildi.'; +$messages['errorsendingreceipt'] = 'Okundu onayı gönderilemedi.'; $messages['deleteidentityconfirm'] = 'Bu kimliÄŸi silmek istediÄŸinizden emin misiniz?'; -$messages['nodeletelastidentity'] = 'Son kimliÄŸiniz olduÄŸu için bu kimliÄŸi silemezsiniz'; -$messages['forbiddencharacter'] = 'Klasör ismi yasaklanmış bir karakter içeriyor'; -$messages['selectimportfile'] = 'Lütfen yüklenecek dosyayı seçin'; -$messages['addresswriterror'] = 'Seçili adres defterine yazılamaz'; -$messages['contactaddedtogroup'] = 'KiÅŸiler bu gruba eklendi'; +$messages['nodeletelastidentity'] = 'Son kimliÄŸiniz olduÄŸu için bu kimliÄŸi silemezsiniz.'; +$messages['forbiddencharacter'] = 'Klasör ismi yasaklanmış bir karakter içeriyor.'; +$messages['selectimportfile'] = 'Lütfen yüklenecek dosyayı seçin.'; +$messages['addresswriterror'] = 'Seçili adres defteri yazılabilir durumda deÄŸil.'; +$messages['contactaddedtogroup'] = 'KiÅŸiler bu baÅŸarıyla gruba eklendi.'; $messages['contactremovedfromgroup'] = 'KiÅŸiler bu gruptan çıkarıldı'; $messages['nogroupassignmentschanged'] = 'Grup atamalarında bir deÄŸiÅŸiklik yapılmadı'; $messages['importwait'] = 'Aktarılıyor, lütfen bekleyin...'; $messages['importformaterror'] = 'İçe aktarım baÅŸarısız. Yüklenen dosya geçerli bir içe aktarım dosyası deÄŸil.'; -$messages['importconfirm'] = '<b>$inserted kiÅŸi baÅŸarıyla aktarıldı</b>'; +$messages['importconfirm'] = '<b>$inserted kiÅŸiler baÅŸarıyla aktarıldı</b>'; $messages['importconfirmskipped'] = '<b>Var olan $skipped girdi atlandı</b>'; $messages['importmessagesuccess'] = '$nr adet mesaj baÅŸarıyla içe aktarıldı'; $messages['importmessageerror'] = 'İçe aktarım baÅŸarısız. Yüklenen dosya geçerli bir içe aktarım dosyası deÄŸil.'; diff --git a/program/localization/uk_UA/messages.inc b/program/localization/uk_UA/messages.inc index fb3539467..5e4e6c631 100644 --- a/program/localization/uk_UA/messages.inc +++ b/program/localization/uk_UA/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,6 @@ $messages['invalidrequest'] = 'Ðевірний запит! Дані не збе $messages['invalidhost'] = 'Ðевірне ім\'Ñ Ñерверу.'; $messages['nomessagesfound'] = 'ЛиÑтів не знайдено'; $messages['loggedout'] = 'Вашу ÑеÑÑ–ÑŽ завершено. Ð’Ñього найкращого!'; -$messages['mailboxempty'] = 'Поштова Ñкринька порожнÑ'; $messages['refreshing'] = 'ОновленнÑ...'; $messages['loading'] = 'ЗавантаженнÑ...'; $messages['uploading'] = 'Файл відправлÑєтьÑÑ...'; @@ -44,6 +43,8 @@ $messages['messagesent'] = 'ЛиÑÑ‚ уÑпішно відправлено'; $messages['savingmessage'] = 'Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð»Ð¸Ñта...'; $messages['messagesaved'] = 'Збережено в Чернетках'; $messages['successfullysaved'] = 'Збережено'; +$messages['savingresponse'] = 'Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‚ÐµÐºÑту відповіді...'; +$messages['deleteresponseconfirm'] = 'Справді бажаєте видалити цей текÑÑ‚ відповіді?'; $messages['addedsuccessfully'] = 'Контакт уÑпішно доданий до ÑпиÑку контактів'; $messages['contactexists'] = 'Контакт з такою електронною адреÑою вже Ñ–Ñнує'; $messages['contactnameexists'] = 'Контакт з таким Ñамим іменем вже Ñ–Ñнує.'; diff --git a/program/localization/ur_PK/messages.inc b/program/localization/ur_PK/messages.inc deleted file mode 100644 index da4e39679..000000000 --- a/program/localization/ur_PK/messages.inc +++ /dev/null @@ -1,18 +0,0 @@ -<?php - -/* - +-----------------------------------------------------------------------+ - | localization/<lang>/messages.inc | - | | - | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | - | | - | Licensed under the GNU General Public License version 3 or | - | any later version with exceptions for skins & plugins. | - | See the README file for a full license statement. | - | | - +-----------------------------------------------------------------------+ - - For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/messages/ -*/ -?> diff --git a/program/localization/vi_VN/labels.inc b/program/localization/vi_VN/labels.inc index 6bd6d4402..d0a63ead2 100644 --- a/program/localization/vi_VN/labels.inc +++ b/program/localization/vi_VN/labels.inc @@ -15,26 +15,27 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/labels/ */ -$labels['welcome'] = 'Chà o bạn đã đến vá»›i $product'; +$labels['welcome'] = 'Chà o mừng bạn đã sá» dụng $product'; $labels['username'] = 'Tên đăng nháºp'; $labels['password'] = 'Máºt khẩu'; $labels['server'] = 'Máy chủ'; $labels['login'] = 'Äăng nháºp'; $labels['logout'] = 'Thoát'; $labels['mail'] = 'ThÆ°'; -$labels['settings'] = 'Tùy chá»n'; +$labels['settings'] = 'Thiết láºp cấu hình'; $labels['addressbook'] = 'Sổ địa chỉ'; $labels['inbox'] = 'Há»™p thÆ°'; $labels['drafts'] = 'ThÆ° nháp'; $labels['sent'] = 'Äã gá»i'; -$labels['trash'] = 'Sá»t rác'; +$labels['trash'] = 'Thùng rác'; $labels['junk'] = 'ThÆ° rác'; +$labels['show_real_foldernames'] = 'Hiển thị tên tháºt cho các thÆ° mục đặc biệt'; $labels['subject'] = 'Tiêu Ä‘á»'; -$labels['from'] = 'NgÆ°á»i gá»i'; +$labels['from'] = 'Gá»i từ'; $labels['sender'] = 'NgÆ°á»i gá»i'; $labels['to'] = 'NgÆ°á»i nháºn'; $labels['cc'] = 'Äồng kÃnh gá»i'; -$labels['bcc'] = 'NgÆ°á»i đồng nháºn (ngừoi nháºn không thấy email của ngÆ°á»i khác cùng được nháºn thÆ°)'; +$labels['bcc'] = 'NgÆ°á»i đồng nháºn (ngÆ°á»i nháºn không thấy email của ngÆ°á»i khác cùng được nháºn thÆ°)'; $labels['replyto'] = 'Trả lá»i cho'; $labels['followupto'] = 'Äánh dấu thÆ° cần theo dõi'; $labels['date'] = 'Ngà y'; @@ -51,7 +52,9 @@ $labels['fromtoshort'] = '$from - $to của $count'; $labels['copy'] = 'Sao chép'; $labels['move'] = 'Di Chuyển'; $labels['moveto'] = 'Di chuyển tá»›i...'; +$labels['copyto'] = 'Sao dữ liệu đến...'; $labels['download'] = 'Tải vá»'; +$labels['open'] = 'Mở'; $labels['showattachment'] = 'Hiển thị'; $labels['showanyway'] = 'Tiếp tục hiển thị'; $labels['filename'] = 'Tên táºp tin'; @@ -164,6 +167,7 @@ $labels['listmode'] = 'Xem dạng danh sách'; $labels['folderactions'] = 'Thao tác vá»›i thÆ° mục'; $labels['compact'] = 'Nén'; $labels['empty'] = 'Trống'; +$labels['importmessages'] = 'Nháºp thÆ°'; $labels['quota'] = 'Lượng Ä‘Ä©a sá» dụng'; $labels['unknown'] = 'Không rõ'; $labels['unlimited'] = 'không giá»›i hạn'; @@ -194,6 +198,16 @@ $labels['spellcheck'] = 'Äánh vần'; $labels['checkspelling'] = 'Kiểm tra chÃnh tả'; $labels['resumeediting'] = 'Tiếp tục soạn thảo'; $labels['revertto'] = 'Trở lại vá»›i'; +$labels['restore'] = 'Khôi phục'; +$labels['restoremessage'] = 'Khôi phục thÆ°?'; +$labels['responses'] = 'Các phản hồi'; +$labels['insertresponse'] = 'Thêm má»™t phản hồi'; +$labels['manageresponses'] = 'Quản lý các phản hồi'; +$labels['savenewresponse'] = 'LÆ°u má»™t phản hồi má»›i'; +$labels['editresponses'] = 'Sá»a các phản hồi'; +$labels['editresponse'] = 'Sá»a phản hồi'; +$labels['responsename'] = 'Tên'; +$labels['responsetext'] = 'Thông tin phản hồi'; $labels['attach'] = 'ÄÃnh kèm'; $labels['attachments'] = 'Các Ä‘Ãnh kèm'; $labels['upload'] = 'Tải lên'; @@ -313,7 +327,11 @@ $labels['searchdelete'] = 'Xóa tìm kiếm'; $labels['import'] = 'Nháºp'; $labels['importcontacts'] = 'Nháºp liên lạc'; $labels['importfromfile'] = 'Nháºp từ táºp tin:'; +$labels['importtarget'] = 'Thêm các địa chỉ liên hệ và o'; $labels['importreplace'] = 'Thay thế toà n bá»™ sổ địa chỉ'; +$labels['importgroups'] = 'Nháºp nhóm'; +$labels['importgroupsall'] = 'Tất cả (tạo nhóm nếu cần thiết)'; +$labels['importgroupsexisting'] = 'Chỉ dà nh cho các nhóm Ä‘ang tồn tại'; $labels['importdesc'] = 'Bạn có thể cáºp nháºt các liên hệ từ má»™t sổ địa chỉ có sẵn.<br />Hiện tại, chúng tôi há»— trợ nháºp địa chỉ từ dạng dữ liệu <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> hoặc CSV (dạng thức dữ liệu ngăn cách bằng dấu phẩy)'; $labels['done'] = 'Hoà n tất'; $labels['settingsfor'] = 'Thiết láºp cho'; @@ -347,6 +365,7 @@ $labels['htmleditor'] = 'Soạn thÆ° dạng HTML'; $labels['htmlonreply'] = 'Chỉ trả lá»i lại bằng thÆ° HTML'; $labels['htmlonreplyandforward'] = 'Khi chuyển tiếp hoặc trả lá»i thÆ° theo định dạng HTML'; $labels['htmlsignature'] = 'Chữ ký HTML'; +$labels['showemail'] = 'Hiển thị địa chỉ email kèm theo tên '; $labels['previewpane'] = 'Hiển thị ô Xem thá»'; $labels['skin'] = 'Bá» mặt giao diện'; $labels['logoutclear'] = 'Xóa sạch rác khi thoát'; @@ -416,9 +435,13 @@ $labels['spellcheckignorenums'] = 'Bá» qua các từ kèm số'; $labels['spellcheckignorecaps'] = 'Bá» qua các từ được viết hoa'; $labels['addtodict'] = 'Thêm và o từ Ä‘iển'; $labels['mailtoprotohandler'] = 'Xác định cách xá» lý giao thức mailto: liên kết'; +$labels['standardwindows'] = 'Mở các popup nhÆ° là các cá»a sổ thông thÆ°á»ng'; $labels['forwardmode'] = 'Chuyển tiếp thÆ°'; $labels['inline'] = 'ná»™i tuyến'; $labels['asattachment'] = 'dạng gá»i kèm'; +$labels['replyallmode'] = 'Thao tác mặc định cho nút [Trả lá»i tất cả]'; +$labels['replyalldefault'] = 'Trả lá»i tất cả'; +$labels['replyalllist'] = 'Chỉ gá»i trả lá»i đến danh sách thÆ° (nếu có tồn tại)'; $labels['folder'] = 'ThÆ° mục'; $labels['folders'] = 'Các thÆ° mục'; $labels['foldername'] = 'Tên thÆ° mục'; diff --git a/program/localization/vi_VN/messages.inc b/program/localization/vi_VN/messages.inc index b2d7c71ff..5c9983e33 100644 --- a/program/localization/vi_VN/messages.inc +++ b/program/localization/vi_VN/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -15,7 +15,7 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/messages/ */ -$messages['errortitle'] = 'Xuất hiện 1 lá»—i'; +$messages['errortitle'] = 'Có lá»—i xảy ra.'; $messages['loginfailed'] = 'Không đăng nháºp được'; $messages['cookiesdisabled'] = 'Trình duyệt không há»— trợ cookies'; $messages['sessionerror'] = 'Phiên là m việc không hợp lệ hoặc đã hết hạn'; @@ -26,11 +26,12 @@ $messages['dberror'] = 'Lá»—i cÆ¡ sở dữ liệu'; $messages['requesttimedout'] = 'Yêu cầu hết hạn'; $messages['errorreadonly'] = 'Không thể thá»±c hiện thao tác. ThÆ° mục chỉ cho phép Ä‘á»c.'; $messages['errornoperm'] = 'Bạn không đủ quyá»n hạn để thá»±c hiện thao tác nà y.'; +$messages['erroroverquota'] = 'Không thể thá»±c hiện thao tác do không còn đủ chá»— trống trên ổ Ä‘Ä©a.'; +$messages['erroroverquotadelete'] = 'Không còn dÆ° chá»— trống trên ổ Ä‘Ä©a. Sá» dụng tổ hợp phÃm SHIFT+DEL để xoá thÆ°.'; $messages['invalidrequest'] = 'Yêu cầu không hợp lệ! Không có dữ liệu nà o được lÆ°u.'; $messages['invalidhost'] = 'Sai thông tin máy chủ'; $messages['nomessagesfound'] = 'Không thấy có thÆ° nà o trong há»™p thÆ° nà y.'; $messages['loggedout'] = 'Phiên là m việc đã kết thúc thà nh công. Hẹn gặp lại!'; -$messages['mailboxempty'] = 'Há»™p thÆ° rá»—ng'; $messages['refreshing'] = 'Äang tải xuống bản cáºp nháºt má»›i...'; $messages['loading'] = 'Äang tải...'; $messages['uploading'] = 'Äang tải lên táºp tin...'; @@ -42,6 +43,8 @@ $messages['messagesent'] = 'ThÆ° đã được gá»i thà nh công.'; $messages['savingmessage'] = 'Äang lÆ°u thÆ°...'; $messages['messagesaved'] = 'ThÆ° đã được lÆ°u lại và o há»™p thÆ° Nháp.'; $messages['successfullysaved'] = 'Äã lÆ°u thà nh công'; +$messages['savingresponse'] = 'Äang lÆ°u thông tin...'; +$messages['deleteresponseconfirm'] = 'Bạn có thá»±c sá»± muốn xoá thông tin nà y?'; $messages['addedsuccessfully'] = 'Liên hệ đã được thêm và o sổ địa chỉ thà nh công.'; $messages['contactexists'] = 'Liên hệ trùng địa chỉ email đã tồn tại'; $messages['contactnameexists'] = 'Liên hệ trùng tên đã tồn tại.'; @@ -52,6 +55,8 @@ $messages['contactnotfound'] = 'Không tìm thấy liên lạc được yêu cẠ$messages['contactsearchonly'] = 'Gõ má»™t và i từ tìm kiếm để tìm liên hệ'; $messages['sendingfailed'] = 'Không gá»i được thÆ°'; $messages['senttooquickly'] = 'Xin đợi và i giây trÆ°á»›c khi gá»i thÆ° nà y'; +$messages['errorsavingsent'] = 'Có lá»—i xảy ra khi lÆ°u lại thÆ° đã gá»i.'; +$messages['errorsaving'] = 'Lá»—i trong quá trình lÆ°u.'; $messages['errormoving'] = 'Không thể chuyển được thÆ°'; $messages['errorcopying'] = 'Không thể sao chép thÆ°'; $messages['errordeleting'] = 'Không thể xóa được thÆ°'; @@ -76,6 +81,7 @@ $messages['norecipientwarning'] = 'Xin nháºp it nhất 1 ngÆ°á»i nháºn.'; $messages['nosubjectwarning'] = 'Mục "Tiêu Ä‘á»" vẫn còn trống. Bạn có muốn nháºp tiêu Ä‘á» bây giá» không?'; $messages['nobodywarning'] = 'Gá»i thÆ° không có ná»™i dung?'; $messages['notsentwarning'] = 'ThÆ° chÆ°a được gá»i. Bá» qua thÆ° Ä‘ang soạn?'; +$messages['restoresavedcomposedata'] = 'Tìm thấy má»™t thÆ° đã được soạn trÆ°á»›c nhÆ°ng chÆ°a gá»i.\n\nTiêu Ä‘á»: $subject\nLÆ°u ngà y: $date\n\nBạn có muốn khôi phục lại thÆ° nà y?'; $messages['noldapserver'] = 'Chá»n máy chủ ldap server để tìm'; $messages['nosearchname'] = 'Nháºp liên hệ hoặc địa chỉ email.'; $messages['notuploadedwarning'] = 'Tất cả các Ä‘Ãnh kèm vẫn chÆ°a được tải lên hết. Xin đợi hoặc hủy việc tải lên.'; @@ -95,11 +101,16 @@ $messages['converting'] = 'Loại bỠđịnh dạng...'; $messages['messageopenerror'] = 'Không thể tải thÆ° từ máy chủ'; $messages['fileuploaderror'] = 'Tải táºp tin lên thất bại'; $messages['filesizeerror'] = 'Táºp tin được tải lên vượt quá dung lượng tối Ä‘a....'; +$messages['copysuccess'] = 'Sao chép thà nh công $nr địa chỉ.'; +$messages['movesuccess'] = 'Äã chuyển thà nh công $nr địa chỉ liên hệ.'; +$messages['copyerror'] = 'Không thể sao chép địa chỉ liên hệ nà o.'; +$messages['moveerror'] = 'Không thể chuyển địa chỉ liên hệ nà o.'; $messages['sourceisreadonly'] = 'Nguồn địa chỉ nà y chỉ cho Ä‘á»c'; $messages['errorsavingcontact'] = 'Không thể lÆ°u địa chỉ liên lạc'; $messages['movingmessage'] = 'Äang chuyển thÆ°...'; $messages['copyingmessage'] = 'Äang sao chép thÆ°...'; $messages['copyingcontact'] = 'Äang sao chép liên lạc...'; +$messages['movingcontact'] = 'Äang chuyển (các) địa chỉ liên hệ...'; $messages['deletingmessage'] = 'Äang xóa thÆ°...'; $messages['markingmessage'] = 'Äánh dấu thÆ°...'; $messages['addingmember'] = 'Äang thêm liên lạc và o nhóm...'; @@ -118,6 +129,8 @@ $messages['importwait'] = 'Äang nháºp, xin chá»...'; $messages['importformaterror'] = 'Nháºp dữ liệu lá»—i. Tệp tin vừa tải lên không phải tệp dữ liệu chÃnh xác.'; $messages['importconfirm'] = 'Äã nháºp $inserted liên hệ đã chèn và o thà nh công.'; $messages['importconfirmskipped'] = 'Äã bá» qua được $skipped mục tồn tại.'; +$messages['importmessagesuccess'] = 'Äã nháºp thà nh công $nr thÆ°.'; +$messages['importmessageerror'] = 'Nháºp dữ liệu bị lá»—i. Tệp tin vừa tải lên không có định dạng chÃnh xác của tệp cấu hình hòm thÆ° hoặc má»™t thÆ° Ä‘Æ¡n lẻ.'; $messages['opnotpermitted'] = 'Thao tác không được cho phép!'; $messages['nofromaddress'] = 'Äịa chỉ email mất ở trong nháºn dạng đã chá»n'; $messages['editorwarning'] = 'Việc chuyển soạn thảo text gốc sẽ gây ra toà n bá»™ định dạng text đã có bị mất. Bạn có muốn tiếp tục không?'; @@ -131,6 +144,7 @@ $messages['smtperror'] = 'Lá»—i SMTP: $msg'; $messages['emailformaterror'] = 'Äịa chỉ email không hợp lệ'; $messages['toomanyrecipients'] = 'Quá nhiá»u ngÆ°á»i nháºn. Hãy giảm số lượng ngÆ°á»i nháºn xuống tối Ä‘a là $max.'; $messages['maxgroupmembersreached'] = 'Số lượng thà nh viên trong nhóm vượt quá mức tối Ä‘a là $max.'; +$messages['internalerror'] = 'Xuất hiện má»™t lá»—i ná»™i bá»™. Xin hãy thá» lại'; $messages['contactdelerror'] = 'Không thể xóa liên lạc'; $messages['contactdeleted'] = 'Liên lạc được xóa thà nh công'; $messages['contactrestoreerror'] = 'Không thể khôi phục liên lạc đã xóa'; diff --git a/program/localization/zh_CN/labels.inc b/program/localization/zh_CN/labels.inc index 1d9c04733..c3b14396c 100644 --- a/program/localization/zh_CN/labels.inc +++ b/program/localization/zh_CN/labels.inc @@ -29,6 +29,7 @@ $labels['drafts'] = 'è‰ç¨¿ç®±'; $labels['sent'] = 'å·²å‘é€é‚®ä»¶'; $labels['trash'] = 'å·²åˆ é™¤é‚®ä»¶'; $labels['junk'] = '垃圾邮件'; +$labels['show_real_foldernames'] = '显示特殊文件夹的åå—'; $labels['subject'] = '主题'; $labels['from'] = 'å‘件人'; $labels['sender'] = 'å‘件人'; @@ -165,6 +166,7 @@ $labels['listmode'] = 'åˆ—è¡¨è§†å›¾æ ·å¼'; $labels['folderactions'] = '文件夹æ“作...'; $labels['compact'] = '压缩'; $labels['empty'] = '清空'; +$labels['importmessages'] = '导入邮件'; $labels['quota'] = '邮箱容é‡'; $labels['unknown'] = '未知'; $labels['unlimited'] = 'æ— é™åˆ¶'; @@ -173,6 +175,8 @@ $labels['resetsearch'] = '清空'; $labels['searchmod'] = '修改æœç´¢'; $labels['msgtext'] = 'æ•´å°é‚®ä»¶'; $labels['body'] = 'æ£æ–‡'; +$labels['type'] = '类型:'; +$labels['namex'] = '姓å'; $labels['openinextwin'] = '在新窗å£ä¸æ‰“å¼€'; $labels['emlsave'] = '下载(.eml)'; $labels['changeformattext'] = 'ä»¥æ–‡æœ¬æ ¼å¼æ˜¾ç¤º'; @@ -193,6 +197,16 @@ $labels['spellcheck'] = '拼写'; $labels['checkspelling'] = '拼写检查'; $labels['resumeediting'] = '继ç»ç¼–辑'; $labels['revertto'] = 'æ¢å¤è‡³'; +$labels['restore'] = 'æ¢å¤ä¿¡æ¯'; +$labels['restoremessage'] = '是å¦æ¢å¤ä¿¡æ¯ï¼Ÿ'; +$labels['responses'] = '回å¤'; +$labels['insertresponse'] = 'æ’入回å¤'; +$labels['manageresponses'] = '管ç†å›žå¤'; +$labels['savenewresponse'] = 'ä¿å˜æ–°å›žå¤'; +$labels['editresponses'] = '编辑回å¤'; +$labels['editresponse'] = '编辑回å¤'; +$labels['responsename'] = '姓å'; +$labels['responsetext'] = '以文本形å¼å›žå¤'; $labels['attach'] = 'é™„åŠ '; $labels['attachments'] = '附件'; $labels['upload'] = 'ä¸Šä¼ '; @@ -305,13 +319,18 @@ $labels['nextpage'] = '下一页'; $labels['lastpage'] = '末页'; $labels['group'] = '分组'; $labels['groups'] = '分组'; +$labels['listgroup'] = '列出è”系人åå•'; $labels['personaladrbook'] = '个人通讯录'; $labels['searchsave'] = 'ä¿å˜æœç´¢'; $labels['searchdelete'] = 'åˆ é™¤æœç´¢'; $labels['import'] = '导入'; $labels['importcontacts'] = '导入通讯录'; $labels['importfromfile'] = '从文件导入'; +$labels['importtarget'] = 'æ·»åŠ è”系人至'; $labels['importreplace'] = '替æ¢å…¨éƒ¨é€šè®¯å½•'; +$labels['importgroups'] = '导入群组任务'; +$labels['importgroupsall'] = '全部(如果需è¦åˆ™åˆ›å»ºæ–°çš„群组)'; +$labels['importgroupsexisting'] = 'ä»…é™äºŽå·²æœ‰ç¾¤ç»„'; $labels['importdesc'] = '您å¯ä»¥ä»Žé€šè®¯å½•æ–‡ä»¶ä¸Šä¼ è”系人,目å‰å·²æ”¯æŒ <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> å’Œ CSV(逗å·åˆ†éš”)æ ¼å¼'; $labels['done'] = '完æˆ'; $labels['settingsfor'] = '设置'; @@ -415,9 +434,13 @@ $labels['spellcheckignorenums'] = '忽略带数å—çš„å•è¯'; $labels['spellcheckignorecaps'] = '忽略所有大写å—æ¯çš„å•è¯'; $labels['addtodict'] = 'æ·»åŠ åˆ°å—å…¸ä¸'; $labels['mailtoprotohandler'] = 'æ³¨å†Œä¸ºå¤„ç† mailto 链接的程åº'; +$labels['standardwindows'] = 'ä»¥æ ‡å‡†çª—å£çš„å½¢å¼å¼¹å‡ºçª—å£'; $labels['forwardmode'] = '邮件转å‘æ–¹å¼'; $labels['inline'] = '内嵌'; $labels['asattachment'] = '作为附件'; +$labels['replyallmode'] = '[回å¤æ‰€æœ‰]按钮的默认动作'; +$labels['replyalldefault'] = '回å¤å…¨éƒ¨'; +$labels['replyalllist'] = 'åªå›žå¤é‚®ä»¶åˆ—表ä¸çš„è”系人(找到的)'; $labels['folder'] = '文件夹管ç†'; $labels['folders'] = '文件夹管ç†'; $labels['foldername'] = '邮件夹å称'; diff --git a/program/localization/zh_CN/messages.inc b/program/localization/zh_CN/messages.inc index bf6e8cf2f..4adebcc74 100644 --- a/program/localization/zh_CN/messages.inc +++ b/program/localization/zh_CN/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,7 +32,6 @@ $messages['invalidrequest'] = 'è¯·æ±‚æ— æ•ˆï¼æœªä¿å˜æ•°æ®ã€‚'; $messages['invalidhost'] = 'æ— æ•ˆçš„ä¸»æœºå。'; $messages['nomessagesfound'] = 'æ¤é‚®ä»¶å¤¹å†…æ— é‚®ä»¶ã€‚'; $messages['loggedout'] = '您已æˆåŠŸæ³¨é”€ï¼Œå†è§ï¼'; -$messages['mailboxempty'] = '邮件夹为空。'; $messages['refreshing'] = 'æ£åœ¨åˆ·æ–°...'; $messages['loading'] = 'æ£åœ¨è½½å…¥...'; $messages['uploading'] = 'æ£åœ¨ä¸Šä¼ 文件...'; @@ -44,6 +43,8 @@ $messages['messagesent'] = '邮件已å‘é€ã€‚'; $messages['savingmessage'] = 'æ£åœ¨ä¿å˜é‚®ä»¶...'; $messages['messagesaved'] = '邮件已暂å˜è‡³è‰ç¨¿ç®±ã€‚'; $messages['successfullysaved'] = 'ä¿å˜æˆåŠŸã€‚'; +$messages['savingresponse'] = 'æ£åœ¨ä¿å˜å“应文本...'; +$messages['deleteresponseconfirm'] = '是å¦ç¡®è®¤åˆ 除å“应文本?'; $messages['addedsuccessfully'] = 'è”ç³»äººå·²æ·»åŠ ã€‚'; $messages['contactexists'] = '当å‰è”系人的电å邮件地å€å·²å˜åœ¨ã€‚'; $messages['contactnameexists'] = 'å·²å˜åœ¨åŒåè”系人。'; @@ -54,6 +55,8 @@ $messages['contactnotfound'] = '未找到指定的è”系人。'; $messages['contactsearchonly'] = '请输入è”系人的æœç´¢æ¡ä»¶'; $messages['sendingfailed'] = 'å‘é€å¤±è´¥ã€‚'; $messages['senttooquickly'] = '您需è¦ç‰å¾…$sec秒æ‰èƒ½å‘é€é‚®ä»¶ã€‚'; +$messages['errorsavingsent'] = 'ä¿å˜å·²å‘é€é‚®ä»¶æ—¶å‘生错误。'; +$messages['errorsaving'] = 'ä¿å˜æ—¶å‘生错误。'; $messages['errormoving'] = 'æ— æ³•ç§»åŠ¨é‚®ä»¶ã€‚'; $messages['errorcopying'] = 'æ— æ³•å¤åˆ¶é‚®ä»¶ã€‚'; $messages['errordeleting'] = 'æ— æ³•åˆ é™¤é‚®ä»¶ã€‚'; @@ -78,6 +81,7 @@ $messages['norecipientwarning'] = '至少输入一个收件人。'; $messages['nosubjectwarning'] = '主题为空。您è¦è¾“入一个主题å—?'; $messages['nobodywarning'] = 'è¦å‘é€æ²¡æœ‰æ£æ–‡çš„邮件å—?'; $messages['notsentwarning'] = '邮件未å‘é€ã€‚您确定è¦ç¦»å¼€å¹¶èˆå¼ƒå½“å‰é‚®ä»¶å—?'; +$messages['restoresavedcomposedata'] = '您有一å°é‚®ä»¶å°šæœªå‘é€.\n\nSubject: $subject\nSaved: $date\n\n您是å¦è¦æ¢å¤è¿™å°é‚®ä»¶ï¼Ÿ'; $messages['noldapserver'] = '请选择一个用æ¥æŸ¥æ‰¾çš„ LDAP æœåŠ¡å™¨ã€‚'; $messages['nosearchname'] = '请输入è”系人姓å或电å邮件地å€ã€‚'; $messages['notuploadedwarning'] = 'é™„ä»¶å°šæœªå…¨éƒ¨ä¸Šä¼ ï¼Œè¯·è€å¿ƒç‰å¾…或者å–æ¶ˆä¸Šä¼ ã€‚'; @@ -140,6 +144,7 @@ $messages['smtperror'] = 'SMTP 错误: $msg'; $messages['emailformaterror'] = 'æ— æ•ˆçš„é‚®ä»¶åœ°å€ï¼š$email'; $messages['toomanyrecipients'] = '收件人太多,请å‡å°‘人数至 $max。'; $messages['maxgroupmembersreached'] = '组员数é‡è¶…过最大值 $max。'; +$messages['internalerror'] = 'é‡åˆ°ä¸€ä¸ªå†…部错误,请é‡è¯•ã€‚'; $messages['contactdelerror'] = 'æ— æ³•åˆ é™¤è”系人。'; $messages['contactdeleted'] = 'åˆ é™¤è”系人æˆåŠŸã€‚'; $messages['contactrestoreerror'] = 'æ— æ³•æ¢å¤å·²åˆ 除的è”系人。'; diff --git a/program/localization/zh_TW/labels.inc b/program/localization/zh_TW/labels.inc index ca7debdea..e913f7117 100644 --- a/program/localization/zh_TW/labels.inc +++ b/program/localization/zh_TW/labels.inc @@ -37,7 +37,7 @@ $labels['to'] = '收件者'; $labels['cc'] = '副本'; $labels['bcc'] = '密件副本'; $labels['replyto'] = '回覆至'; -$labels['followupto'] = '信件跟隨至'; +$labels['followupto'] = '郵件列表回覆地å€'; $labels['date'] = '日期'; $labels['size'] = '大å°'; $labels['priority'] = 'å„ªå…ˆé †åº'; @@ -45,13 +45,14 @@ $labels['organization'] = '組織'; $labels['readstatus'] = '讀信狀態'; $labels['listoptions'] = '列表é¸é …...'; $labels['mailboxlist'] = '資料夾'; -$labels['messagesfromto'] = '郵件 $from 至 $to,共有 $count å°éƒµä»¶'; -$labels['threadsfromto'] = '郵件串 $from 至 $to,共有 $count 個'; +$labels['messagesfromto'] = '郵件 $from 至 $to,共 $count å°'; +$labels['threadsfromto'] = '郵件串 $from 至 $to,共 $count 個'; $labels['messagenrof'] = '第 $nr å°éƒµä»¶ï¼Œå…±æœ‰ $count å°'; -$labels['fromtoshort'] = '自 $from – $to 統計 $count'; +$labels['fromtoshort'] = '$from – $to å…± $count 個'; $labels['copy'] = '複製'; $labels['move'] = '移動'; $labels['moveto'] = '移至...'; +$labels['copyto'] = '複製到...'; $labels['download'] = '下載'; $labels['open'] = 'é–‹å•Ÿ'; $labels['showattachment'] = '顯示'; @@ -148,7 +149,7 @@ $labels['expand-all'] = '全部展開'; $labels['expand-unread'] = '展開未讀å–'; $labels['collapse-all'] = '全部收起'; $labels['threaded'] = '郵件串'; -$labels['autoexpand_threads'] = 'åªå±•é–‹éƒµä»¶ä¸²'; +$labels['autoexpand_threads'] = '展開郵件串'; $labels['do_expand'] = '所有郵件串'; $labels['expand_only_unread'] = 'åªå±•é–‹æœªè®€è¨Šæ¯'; $labels['fromto'] = '寄件者/收件者'; @@ -175,6 +176,7 @@ $labels['resetsearch'] = 'é‡è¨æœå°‹'; $labels['searchmod'] = '修改æœå°‹'; $labels['msgtext'] = 'æ•´å°éƒµä»¶'; $labels['body'] = '內文'; +$labels['type'] = 'é¡žåž‹'; $labels['namex'] = 'å稱'; $labels['openinextwin'] = '在新視窗開啟'; $labels['emlsave'] = '下載(.eml)'; @@ -184,7 +186,7 @@ $labels['editasnew'] = '以新郵件編輯'; $labels['send'] = '寄出'; $labels['sendmessage'] = 'ç«‹å³å¯„出'; $labels['savemessage'] = '儲å˜æˆè‰ç¨¿'; -$labels['addattachment'] = 'å¢žåŠ é™„ä»¶æª”æ¡ˆ'; +$labels['addattachment'] = 'åŠ å…¥é™„ä»¶æª”æ¡ˆ'; $labels['charset'] = '郵件編碼'; $labels['editortype'] = '編輯器類型'; $labels['returnreceipt'] = 'è¦æ±‚讀å–回æ¢'; @@ -196,6 +198,16 @@ $labels['spellcheck'] = '拼å—'; $labels['checkspelling'] = '拼å—檢查'; $labels['resumeediting'] = '繼續編輯'; $labels['revertto'] = 'æ¢å¾©è‡³'; +$labels['restore'] = '回復'; +$labels['restoremessage'] = '回復郵件?'; +$labels['responses'] = 'é è¨å›žæ‡‰'; +$labels['insertresponse'] = 'æ’å…¥é è¨å›žæ‡‰'; +$labels['manageresponses'] = '管ç†é è¨å›žæ‡‰'; +$labels['savenewresponse'] = '新增é è¨å›žæ‡‰'; +$labels['editresponses'] = '編輯é è¨å›žæ‡‰'; +$labels['editresponse'] = 'é è¨å›žæ‡‰'; +$labels['responsename'] = 'å稱'; +$labels['responsetext'] = 'é è¨å›žæ‡‰å…§å®¹'; $labels['attach'] = '附件'; $labels['attachments'] = 'é™„åŠ æª”æ¡ˆ'; $labels['upload'] = '上傳'; @@ -222,7 +234,7 @@ $labels['maxuploadsize'] = '上傳檔案大å°é™åˆ¶ç‚º $size'; $labels['addcc'] = '新增副本'; $labels['addbcc'] = '新增密件副本'; $labels['addreplyto'] = '新增回覆地å€'; -$labels['addfollowupto'] = '新增 信件跟隨至'; +$labels['addfollowupto'] = '新增郵件列表回覆地å€'; $labels['mdnrequest'] = 'æ¤éƒµä»¶çš„å¯„ä»¶è€…å¸Œæœ›åœ¨ä½ é–±è®€æ¤éƒµä»¶æ™‚å—åˆ°é€šçŸ¥ã€‚ä½ æƒ³è¦é€šçŸ¥å¯„件者嗎?'; $labels['receiptread'] = '郵件回æ¢ï¼ˆå·²é–±è®€ï¼‰'; $labels['yourmessage'] = 'é€™æ˜¯ä½ éƒµä»¶çš„éƒµä»¶å›žæ¢'; @@ -259,7 +271,7 @@ $labels['spouse'] = 'é…å¶'; $labels['allfields'] = '所有欄ä½'; $labels['search'] = 'æœå°‹'; $labels['advsearch'] = '進階æœå°‹'; -$labels['advanced'] = '進階è¨å®š'; +$labels['advanced'] = '進階'; $labels['other'] = '其他'; $labels['typehome'] = 'ä½å®¶'; $labels['typework'] = '工作'; @@ -292,7 +304,7 @@ $labels['uploadphoto'] = '上傳相片'; $labels['newcontact'] = '建立新è¯çµ¡äººè³‡æ–™'; $labels['deletecontact'] = '刪除所é¸æ“‡çš„è¯çµ¡äºº'; $labels['composeto'] = '寄信至所é¸æ“‡çš„è¯çµ¡äºº'; -$labels['contactsfromto'] = 'è¯çµ¡äºº $from 至 $to,共有 $count 人'; +$labels['contactsfromto'] = 'è¯çµ¡äºº $from 至 $to,共 $count 人'; $labels['print'] = '列å°'; $labels['export'] = '匯出通訊錄'; $labels['exportall'] = '匯出全部'; @@ -308,16 +320,19 @@ $labels['nextpage'] = '顯示下一é '; $labels['lastpage'] = '顯示最後一é '; $labels['group'] = '群組'; $labels['groups'] = '群組'; +$labels['listgroup'] = '列出群組æˆå“¡'; $labels['personaladrbook'] = '個人通訊錄'; $labels['searchsave'] = '儲å˜æœå°‹çµæžœ'; $labels['searchdelete'] = '刪除æœå°‹çµæžœ'; $labels['import'] = '匯入通訊錄'; -$labels['importcontacts'] = '由檔案匯入通訊錄'; +$labels['importcontacts'] = '匯入通訊錄'; $labels['importfromfile'] = 'é¸æ“‡ä½ è¦åŒ¯å…¥çš„檔案:'; -$labels['importreplace'] = '以匯入的資料å–代已å˜åœ¨çš„é‡è¤‡è³‡æ–™'; -$labels['importgroupsall'] = '全部(如有必è¦,新增群組)'; +$labels['importtarget'] = '新增è¯çµ¡äººåˆ°'; +$labels['importreplace'] = 'å–代整個'; +$labels['importgroups'] = '匯入群組'; +$labels['importgroupsall'] = '全部(å¿…è¦æ™‚新增群組)'; $labels['importgroupsexisting'] = '僅é™æ–¼æ—¢æœ‰ç¾¤çµ„'; -$labels['importdesc'] = '您å¯ä»¥å°‡å·²å˜åœ¨çš„資料匯入通訊錄,目å‰æ”¯æ´åŒ¯å…¥ <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> 與 CSV (逗點分隔)æ ¼å¼è³‡æ–™'; +$labels['importdesc'] = '您å¯ä»¥å°‡ç¾æœ‰çš„è¯çµ¡äººåŒ¯å…¥é€šè¨ŠéŒ„。<br/>ç›®å‰æ”¯æ´åŒ¯å…¥ <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> 與 CSV (逗點分隔)æ ¼å¼ã€‚'; $labels['done'] = '完æˆ'; $labels['settingsfor'] = 'è¨å®š'; $labels['about'] = '關於'; @@ -341,7 +356,7 @@ $labels['setdefault'] = 'è¨æˆé è¨å€¼'; $labels['autodetect'] = '自動é¸æ“‡'; $labels['language'] = '語言'; $labels['timezone'] = '時å€'; -$labels['pagesize'] = 'æ¯é 郵件數'; +$labels['pagesize'] = 'æ¯é 顯示列數'; $labels['signature'] = 'ç°½å檔'; $labels['dstactive'] = '日光節約時間'; $labels['showinextwin'] = '在新視窗ä¸é¡¯ç¤ºéƒµä»¶'; @@ -359,23 +374,23 @@ $labels['uisettings'] = '使用者介é¢'; $labels['serversettings'] = '伺æœå™¨è¨å®š'; $labels['mailboxview'] = '信箱顯示'; $labels['mdnrequests'] = '讀å–回æ¢å›žæ‡‰'; -$labels['askuser'] = 'è©¢å•ä½¿ç”¨è€…'; +$labels['askuser'] = 'è©¢å•æˆ‘'; $labels['autosend'] = '自動é€å‡º'; -$labels['autosendknown'] = 'åªå°æˆ‘çš„è¯çµ¡äººå‚³é€å›žæ¢ï¼Œå…¶ä»–è©¢å•ä½¿ç”¨è€…'; -$labels['autosendknownignore'] = 'åªå°æˆ‘çš„è¯çµ¡äººå‚³é€å›žæ¢ï¼Œå…¶ä»–忽略'; +$labels['autosendknown'] = '傳é€å›žæ¢çµ¦æˆ‘çš„è¯çµ¡äººï¼Œå…¶ä»–則詢å•æˆ‘'; +$labels['autosendknownignore'] = '傳é€å›žæ¢çµ¦æˆ‘çš„è¯çµ¡äººï¼Œå…¶ä»–則忽略'; $labels['ignore'] = '完全忽略'; $labels['readwhendeleted'] = '將刪除的郵件標示為已讀å–'; -$labels['flagfordeletion'] = '刪除郵件時將原始郵件標示為已刪除'; +$labels['flagfordeletion'] = '刪除郵件時åªå°‡éƒµä»¶æ¨™ç¤ºç‚ºå·²åˆªé™¤'; $labels['skipdeleted'] = 'ä¸è¦é¡¯ç¤ºå·²åˆªé™¤çš„郵件'; -$labels['deletealways'] = '如果移到垃圾桶失敗,就直接刪除'; -$labels['deletejunk'] = '直接從垃圾郵件刪除'; +$labels['deletealways'] = '如果移動郵件到垃圾桶失敗,就直接刪除'; +$labels['deletejunk'] = '直接刪除垃圾郵件ä¸çš„郵件'; $labels['showremoteimages'] = '顯示é 端郵件內文ä¸çš„圖片'; $labels['fromknownsenders'] = '從已知的寄件者'; $labels['always'] = '是'; $labels['showinlineimages'] = 'å°‡é™„åŠ æª”æ¡ˆçš„åœ–ç‰‡é¡¯ç¤ºæ–¼éƒµä»¶æœ€å¾Œ'; $labels['autosavedraft'] = '自動儲å˜è‰ç¨¿'; $labels['everynminutes'] = 'æ¯ $n 分é˜'; -$labels['refreshinterval'] = 'é‡æ–°æ•´ç† (確èªæ˜¯å¦æ–°éƒµä»¶)'; +$labels['refreshinterval'] = 'é‡æ–°æ•´ç† (檢查新郵件ç‰)'; $labels['never'] = 'æ°¸ä¸'; $labels['immediately'] = '馬上'; $labels['messagesdisplaying'] = '郵件顯示'; @@ -385,10 +400,10 @@ $labels['2231folding'] = '完全 RFC 2231 模å¼ï¼ˆThunderbird)'; $labels['miscfolding'] = 'RFC 2047/2231 æ··åˆæ¨¡å¼ï¼ˆMS Outlook)'; $labels['2047folding'] = '完全 RFC 2047 模å¼ï¼ˆå…¶ä»–)'; $labels['force7bit'] = 'å° 8 ä½å…ƒå—元使用 MIME 編碼'; -$labels['advancedoptions'] = '顯示進階è¨å®šé¸é …'; +$labels['advancedoptions'] = '進階é¸é …'; $labels['focusonnewmessage'] = '收到新郵件時使ç€è¦½å™¨ç²å¾—焦點'; $labels['checkallfolders'] = '檢查所有資料夾ä¸çš„新郵件'; -$labels['displaynext'] = '郵件刪除ï¼ç§»å‹•æ™‚顯示下一個郵件'; +$labels['displaynext'] = '郵件刪除/移動時顯示下一å°éƒµä»¶'; $labels['defaultfont'] = 'HTMLæ ¼å¼é è¨å—åž‹'; $labels['mainoptions'] = '主è¦é¸é …'; $labels['browseroptions'] = 'ç€è¦½é¸é …'; @@ -398,8 +413,8 @@ $labels['newmessage'] = '新郵件'; $labels['signatureoptions'] = 'ç°½å檔é¸é …'; $labels['whenreplying'] = '回覆時'; $labels['replyempty'] = 'ä¸è¦åŒ…å«åŽŸä¾†çš„信件內容'; -$labels['replytopposting'] = '在原來的上方開始新訊æ¯'; -$labels['replybottomposting'] = '在原來的下方開始新訊æ¯'; +$labels['replytopposting'] = '在原文的上方開始新訊æ¯'; +$labels['replybottomposting'] = '在原文的下方開始新訊æ¯'; $labels['replyremovesignature'] = '回覆時移除原有簽å檔'; $labels['autoaddsignature'] = 'è‡ªå‹•é™„åŠ ç°½å'; $labels['newmessageonly'] = 'åªæœ‰æ–°è¨Šæ¯'; @@ -411,15 +426,16 @@ $labels['reqmdn'] = 'æ°¸é ç´¢å–讀å–回æ¢'; $labels['reqdsn'] = '總是è¦æ±‚傳é€ç‹€æ…‹é€šçŸ¥'; $labels['replysamefolder'] = '將回信放在與原信件相åŒçš„資料夾'; $labels['defaultabook'] = 'é è¨é€šè¨ŠéŒ„'; -$labels['autocompletesingle'] = '在自動完æˆä¸ç•¥éŽå¦ä¸€å€‹email'; -$labels['listnamedisplay'] = '標記è¯çµ¡äººç‚º'; +$labels['autocompletesingle'] = '在自動完æˆæ™‚ç•¥éŽå…¶ä»–電郵地å€'; +$labels['listnamedisplay'] = 'è¯çµ¡äººé¡¯ç¤ºæ–¹å¼'; $labels['spellcheckbeforesend'] = '寄é€å‰åŸ·è¡Œæ‹¼å—檢查'; $labels['spellcheckoptions'] = '拼å—檢查é¸é …'; $labels['spellcheckignoresyms'] = '忽略符號'; $labels['spellcheckignorenums'] = '忽略數å—'; $labels['spellcheckignorecaps'] = '忽略大寫å—æ¯'; $labels['addtodict'] = 'åŠ å…¥è©žå…¸'; -$labels['mailtoprotohandler'] = '註冊mailto:å”定處ç†ç¨‹å¼'; +$labels['mailtoprotohandler'] = '註冊為 mailto: 連çµçš„é è¨è™•ç†å¸¸å¼'; +$labels['standardwindows'] = '以新視窗顯示彈出å¼å°è©±æ¡†'; $labels['forwardmode'] = '郵件轉寄方å¼'; $labels['inline'] = '放入內文'; $labels['asattachment'] = '當æˆé™„件'; diff --git a/program/localization/zh_TW/messages.inc b/program/localization/zh_TW/messages.inc index c52116a55..23c951a8b 100644 --- a/program/localization/zh_TW/messages.inc +++ b/program/localization/zh_TW/messages.inc @@ -5,7 +5,7 @@ | localization/<lang>/messages.inc | | | | Localization file of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -33,6 +33,7 @@ $messages['invalidhost'] = '無效的伺æœå™¨å稱'; $messages['nomessagesfound'] = 'æ¤éƒµä»¶åŒ£æ²’有任何郵件'; $messages['loggedout'] = 'ä½ å·²æˆåŠŸåœ°ç™»å‡ºä¸¦çµæŸå·¥ä½œéšŽæ®µäº†ã€‚å†è¦‹ï¼'; $messages['mailboxempty'] = '郵件匣是空的'; +$messages['nomessages'] = '沒有郵件'; $messages['refreshing'] = 'é‡æ–°æ•´ç†ä¸...'; $messages['loading'] = '載入ä¸...'; $messages['uploading'] = '上傳檔案ä¸...'; @@ -44,6 +45,8 @@ $messages['messagesent'] = '郵件寄出æˆåŠŸ'; $messages['savingmessage'] = '儲å˜éƒµä»¶ä¸...'; $messages['messagesaved'] = '郵件已經儲å˜è‡³è‰ç¨¿åŒ£'; $messages['successfullysaved'] = '儲å˜æˆåŠŸ'; +$messages['savingresponse'] = '儲å˜é è¨å›žæ‡‰ä¸...'; +$messages['deleteresponseconfirm'] = 'ä½ ç¢ºå®šè¦åˆªé™¤é€™å€‹é è¨å›žæ‡‰å—Žï¼Ÿ'; $messages['addedsuccessfully'] = 'è¯çµ¡äººå·²ç¶“æˆåŠŸåœ°æ–°å¢žè‡³é€šè¨ŠéŒ„'; $messages['contactexists'] = 'æ¤è¯çµ¡äººçš„é›»å郵件ä½å€å·²å˜åœ¨'; $messages['contactnameexists'] = 'å·²å˜åœ¨ç›¸åŒå稱的連絡人'; @@ -54,6 +57,8 @@ $messages['contactnotfound'] = '找ä¸åˆ°è¦æ±‚çš„è¯çµ¡äºº'; $messages['contactsearchonly'] = '輸入關éµå—找尋連絡人'; $messages['sendingfailed'] = '郵件寄出失敗'; $messages['senttooquickly'] = 'ä½ å¯„å‡ºçš„éƒµä»¶å¤ªéŽæ–¼é »ç¹ï¼Œè«‹ç¨å€™ $sec 秒後å†è©¦ä¸€æ¬¡ã€‚'; +$messages['errorsavingsent'] = '儲å˜éƒµä»¶åˆ°å¯„件備份時發生錯誤。'; +$messages['errorsaving'] = '儲å˜æ™‚發生錯誤。'; $messages['errormoving'] = '無法移動æ¤éƒµä»¶'; $messages['errorcopying'] = '無法訊æ¯'; $messages['errordeleting'] = '無法刪除æ¤éƒµä»¶'; @@ -78,6 +83,7 @@ $messages['norecipientwarning'] = '請輸入至少一ä½æ”¶ä¿¡è€…'; $messages['nosubjectwarning'] = '「主旨ã€æ¬„æ˜¯ç©ºçš„ã€‚ä½ è¦è¼¸å…¥ä¸€å€‹ä¸»æ—¨å—Žï¼Ÿ'; $messages['nobodywarning'] = 'è¦å‚³é€æ²’有內文的郵件嗎?'; $messages['notsentwarning'] = 'éƒµä»¶å°šæœªå¯„å‡ºã€‚ä½ ç¢ºå®šè¦é›¢é–‹ä¸¦ä¸”æ¨æ£„æ¤éƒµä»¶ï¼Ÿ'; +$messages['restoresavedcomposedata'] = '發ç¾ä¸€å°ä¸Šæ¬¡ç·¨å¯«ä½†å°šæœªå¯„出的郵件。\n\n主旨: $subject\n日期: $date\n\nä½ è¦å›žå¾©é€™å°éƒµä»¶å—Žï¼Ÿ'; $messages['noldapserver'] = 'è«‹é¸æ“‡ä¸€å€‹ LDAP 伺æœå™¨é€²è¡Œæœå°‹'; $messages['nosearchname'] = '請輸入一個è¯çµ¡äººå§“å或電å郵件ä½å€'; $messages['notuploadedwarning'] = 'å°šæœ‰é™„åŠ æª”æ¡ˆæœªä¸Šå‚³å®Œç•¢ï¼Œè«‹ç‰å¾…或å–消上傳'; @@ -95,8 +101,8 @@ $messages['folderexpunged'] = '資料夾æˆåŠŸå£“縮'; $messages['deletedsuccessfully'] = '刪除æˆåŠŸ'; $messages['converting'] = 'ç§»é™¤éƒµä»¶æ ¼å¼ä¸...'; $messages['messageopenerror'] = '無法從伺æœå™¨è¼‰å…¥éƒµä»¶'; -$messages['fileuploaderror'] = '檔案上傳失敗'; -$messages['filesizeerror'] = '上傳的檔案超éŽäº† $size 的大å°é™åˆ¶'; +$messages['fileuploaderror'] = '檔案上傳失敗。'; +$messages['filesizeerror'] = '上傳的檔案超éŽäº† $size 的大å°é™åˆ¶ã€‚'; $messages['copysuccess'] = 'æˆåŠŸè¤‡è£½ $nr 個è¯çµ¡äººã€‚'; $messages['movesuccess'] = 'æˆåŠŸç§»å‹• $nr 個è¯çµ¡äººã€‚'; $messages['copyerror'] = '無法複製任何è¯çµ¡äººã€‚'; @@ -116,17 +122,17 @@ $messages['errorsendingreceipt'] = '無法傳é€å›žæ¢'; $messages['deleteidentityconfirm'] = '您確定è¦åˆªé™¤é€™ä½é€£çµ¡äººå—Ž?'; $messages['nodeletelastidentity'] = 'ä½ ä¸èƒ½åˆªé™¤æ¤èº«ä»½ï¼Œå› 為åªå‰©ä¸€å€‹èº«ä»½ã€‚'; $messages['forbiddencharacter'] = '資料夾å稱ä¸åŒ…å«éžæ³•çš„å—å…ƒ'; -$messages['selectimportfile'] = 'è«‹é¸æ“‡ä¸€å€‹ä¸Šå‚³çš„檔案'; +$messages['selectimportfile'] = 'è«‹é¸æ“‡ä¸€å€‹è¦ä¸Šå‚³çš„檔案。'; $messages['addresswriterror'] = '無法寫入é¸æ“‡çš„通訊錄'; $messages['contactaddedtogroup'] = 'æˆåŠŸæŠŠè¯çµ¡äººåŠ å…¥æ¤ç¾¤çµ„'; $messages['contactremovedfromgroup'] = 'æˆåŠŸæŠŠç§»é™¤æ¤ç¾¤çµ„ä¸çš„è¯çµ¡äºº'; $messages['nogroupassignmentschanged'] = '群組資料沒有異動'; $messages['importwait'] = '匯入ä¸ï¼Œè«‹ç¨å€™...'; -$messages['importformaterror'] = '匯入失敗ï¼ä¸Šè¼‰çš„æª”æ¡ˆæ ¼å¼ä¸æ”¯æ´'; +$messages['importformaterror'] = '匯入失敗ï¼ä¸æ”¯æ´ä¸Šè¼‰çš„æª”æ¡ˆæ ¼å¼ã€‚'; $messages['importconfirm'] = '<b>æˆåŠŸåŒ¯å…¥ $inserted ç†è³‡æ–™ï¼Œç•¥éŽ $skipped ç†å·²å˜åœ¨çš„資料</b>:<p><em>$names</em></p>'; $messages['importconfirmskipped'] = '<b>ç•¥éŽ $skipped 個已å˜åœ¨çš„é …ç›®</b>'; $messages['importmessagesuccess'] = 'æˆåŠŸåŒ¯å…¥ $nr å°éƒµä»¶'; -$messages['importmessageerror'] = '匯入失敗ï¼ä¸Šè¼‰çš„檔案ä¸æ˜¯æœ‰æ•ˆçš„郵件或資料夾檔案'; +$messages['importmessageerror'] = '匯入失敗ï¼ä¸Šè¼‰çš„檔案ä¸æ˜¯æœ‰æ•ˆçš„郵件或資料夾檔案。'; $messages['opnotpermitted'] = 'ä¸å…許的æ“作'; $messages['nofromaddress'] = '在é¸æ“‡çš„身分ä¸éºå¤±äº†é›»å郵件ä½å€'; $messages['editorwarning'] = '切æ›åˆ°ç´”æ–‡å—編輯模å¼å°‡æœƒéºå¤±æ‰€æœ‰è¨å®šçš„樣å¼ã€‚您確定è¦ç¹¼çºŒå—Žï¼Ÿ'; @@ -140,6 +146,7 @@ $messages['smtperror'] = 'SMTP 錯誤:$msg'; $messages['emailformaterror'] = '錯誤電å郵件:$email'; $messages['toomanyrecipients'] = '太多收件人。請減少至 $max 人'; $messages['maxgroupmembersreached'] = '太多群組æˆå“¡ï¼Œè¶…éŽæœ€å¤§äººæ•¸ $max 人'; +$messages['internalerror'] = '發生內部錯誤。請å†æ¬¡å˜—試。'; $messages['contactdelerror'] = '無法刪除è¯çµ¡äºº'; $messages['contactdeleted'] = 'è¯çµ¡äººæˆåŠŸåˆªé™¤'; $messages['contactrestoreerror'] = '無法復原刪除的連絡人'; diff --git a/program/steps/addressbook/copy.inc b/program/steps/addressbook/copy.inc index 9114cb1fd..e4e276591 100644 --- a/program/steps/addressbook/copy.inc +++ b/program/steps/addressbook/copy.inc @@ -88,9 +88,9 @@ foreach ($cids as $source => $cid) { } } else { - $record = $result->first(); - $ids[] = $record['ID']; - $errormsg = empty($a_record['email']) ? 'contactnameexists' : 'contactexists'; + $record = $result->first(); + $ids[] = $record['ID']; + $errormsg = empty($email) ? 'contactnameexists' : 'contactexists'; } } diff --git a/program/steps/addressbook/func.inc b/program/steps/addressbook/func.inc index b33396baf..be0dd2a33 100644 --- a/program/steps/addressbook/func.inc +++ b/program/steps/addressbook/func.inc @@ -160,7 +160,7 @@ function rcmail_contact_source($source=null, $init_env=false, $writable=false) return $CONTACTS; $OUTPUT->set_env('readonly', $CONTACTS->readonly); - $OUTPUT->set_env('source', $source); + $OUTPUT->set_env('source', (string) $source); // reduce/extend $CONTACT_COLTYPES with specification from the current $CONTACT object if (is_array($CONTACTS->coltypes)) { diff --git a/program/steps/addressbook/import.inc b/program/steps/addressbook/import.inc index 33e473242..5dee5c06a 100644 --- a/program/steps/addressbook/import.inc +++ b/program/steps/addressbook/import.inc @@ -308,10 +308,11 @@ function rcmail_import_buttons($attrib) $out = $OUTPUT->button(array('command' => 'list', 'prop' => $target, 'label' => 'done') + $attrib); } else { - $out = $OUTPUT->button(array('command' => 'list', 'label' => 'cancel') + $attrib); - $out .= ' '; + $cancel = $OUTPUT->button(array('command' => 'list', 'label' => 'cancel') + $attrib); $attrib['class'] = trim($attrib['class'] . ' mainaction'); - $out .= $OUTPUT->button(array('command' => 'import', 'label' => 'import') + $attrib); + $out = $OUTPUT->button(array('command' => 'import', 'label' => 'import') + $attrib); + $out .= ' '; + $out .= $cancel; } return $out; diff --git a/program/steps/addressbook/move.inc b/program/steps/addressbook/move.inc index 6a70e7bda..7a730af77 100644 --- a/program/steps/addressbook/move.inc +++ b/program/steps/addressbook/move.inc @@ -97,9 +97,9 @@ foreach ($cids as $source => $source_cids) { } } else { - $record = $result->first(); - $ids[] = $record['ID']; - $errormsg = empty($a_record['email']) ? 'contactnameexists' : 'contactexists'; + $record = $result->first(); + $ids[] = $record['ID']; + $errormsg = empty($email) ? 'contactnameexists' : 'contactexists'; } } diff --git a/program/steps/addressbook/save.inc b/program/steps/addressbook/save.inc index 94556f96b..7451f433b 100644 --- a/program/steps/addressbook/save.inc +++ b/program/steps/addressbook/save.inc @@ -165,6 +165,10 @@ if (!empty($cid)) { $a_js_cols[] = rcube::Q((string)$record[$col]); } + // performance: unset some big data items we don't need here + $record = array_intersect_key($record, array('ID' => 1,'email' => 1,'name' => 1)); + $record['_type'] = 'person'; + // update the changed col in list $OUTPUT->command('parent.update_contact_row', $cid, $a_js_cols, $newcid, $source, $record); diff --git a/program/steps/mail/autocomplete.inc b/program/steps/mail/autocomplete.inc index c15de92cf..71b337a53 100644 --- a/program/steps/mail/autocomplete.inc +++ b/program/steps/mail/autocomplete.inc @@ -49,7 +49,7 @@ $mode = (int) $RCMAIL->config->get('addressbook_search_mode'); $single = (bool) $RCMAIL->config->get('autocomplete_single'); $search = rcube_utils::get_input_value('_search', rcube_utils::INPUT_GPC, true); $source = rcube_utils::get_input_value('_source', rcube_utils::INPUT_GPC); -$sid = rcube_utils::get_input_value('_id', rcube_utils::INPUT_GPC); +$reqid = rcube_utils::get_input_value('_reqid', rcube_utils::INPUT_GPC); if (strlen($source)) { $book_types = array($source); @@ -90,7 +90,7 @@ if (!empty($book_types) && strlen($search)) { // skip duplicates if (!in_array($contact, $contacts)) { - $contacts[] = $contact; + $contacts[] = array('name' => $contact, 'type' => $sql_arr['_type']); $sort_keys[] = sprintf('%s %03d', $sql_arr['name'] , $idx++); if (count($contacts) >= $MAXNUM) { @@ -118,7 +118,7 @@ if (!empty($book_types) && strlen($search)) { if ($group_prop['email']) { $idx = 0; foreach ((array)$group_prop['email'] as $email) { - $contacts[] = format_email_recipient($email, $group['name']); + $contacts[] = array('name' => format_email_recipient($email, $group['name']), 'type' => 'group'); $sort_keys[] = sprintf('%s %03d', $group['name'] , $idx++); if (count($contacts) >= $MAXNUM) { @@ -131,6 +131,7 @@ if (!empty($book_types) && strlen($search)) { $sort_keys[] = $group['name']; $contacts[] = array( 'name' => $group['name'] . ' (' . intval($result->count) . ')', + 'type' => 'group', 'id' => $group['ID'], 'source' => $id ); @@ -154,5 +155,5 @@ if (!empty($book_types) && strlen($search)) { } } -$OUTPUT->command('ksearch_query_results', $contacts, $search, $sid); +$OUTPUT->command('ksearch_query_results', $contacts, $search, $reqid); $OUTPUT->send(); diff --git a/program/steps/mail/check_recent.inc b/program/steps/mail/check_recent.inc index d2d27a2ca..70f4c03a6 100644 --- a/program/steps/mail/check_recent.inc +++ b/program/steps/mail/check_recent.inc @@ -5,7 +5,7 @@ | program/steps/mail/check_recent.inc | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2010, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -21,7 +21,7 @@ // If there's no folder or messages list, there's nothing to update // This can happen on 'refresh' request -if (empty($_REQUEST['_folderlist']) && empty($_REQUEST['_list'])) { +if (empty($_POST['_folderlist']) && empty($_POST['_list'])) { return; } @@ -29,10 +29,18 @@ $trash = $RCMAIL->config->get('trash_mbox'); $current = $RCMAIL->storage->get_folder(); $check_all = $RCMAIL->action != 'refresh' || (bool)$RCMAIL->config->get('check_all_folders'); +$search_request = rcube_utils::get_input_value('_search', rcube_utils::INPUT_GPC); +if ($search_request && $_SESSION['search_request'] != $search_request) { + $search_request = null; +} + // list of folders to check if ($check_all) { $a_mailboxes = $RCMAIL->storage->list_folders_subscribed('', '*', 'mail'); } +else if ($search_request && is_object($_SESSION['search'][1])) { + $a_mailboxes = (array) $_SESSION['search'][1]->get_parameters('MAILBOX'); +} else { $a_mailboxes = (array) $current; if ($current != 'INBOX') { @@ -46,7 +54,7 @@ $a_mailboxes = $plugin['folders']; // check recent/unseen counts foreach ($a_mailboxes as $mbox_name) { - $is_current = $mbox_name == $current; + $is_current = $mbox_name == $current || ($search_request && is_object($_SESSION['search'][1]) && in_array($mbox_name, (array)$_SESSION['search'][1]->get_parameters('MAILBOX'))); if ($is_current) { // Synchronize mailbox cache, handle flag changes $RCMAIL->storage->folder_sync($mbox_name); @@ -66,21 +74,23 @@ foreach ($a_mailboxes as $mbox_name) { if ($status && $is_current) { // refresh saved search set - $search_request = rcube_utils::get_input_value('_search', rcube_utils::INPUT_GPC); - if ($search_request && isset($_SESSION['search']) - && $_SESSION['search_request'] == $search_request - ) { + if ($search_request && isset($_SESSION['search'])) { + unset($search_request); // only do this once $_SESSION['search'] = $RCMAIL->storage->refresh_search(); + if ($_SESSION['search'][1]->multi) + $mbox_name = ''; } - if (!empty($_GET['_quota'])) + if (!empty($_POST['_quota'])) { $OUTPUT->command('set_quota', $RCMAIL->quota_content()); + } - $OUTPUT->set_env('exists', $RCMAIL->storage->count($mbox_name, 'EXISTS')); + $OUTPUT->set_env('exists', $RCMAIL->storage->count($mbox_name, 'EXISTS', true)); // "No-list" mode, don't get messages - if (empty($_GET['_list'])) + if (empty($_POST['_list'])) { continue; + } // get overall message count; allow caching because rcube_storage::folder_status() // did a refresh but only in list mode @@ -116,7 +126,7 @@ foreach ($a_mailboxes as $mbox_name) { } } // handle flag updates - else if ($is_current && ($uids = rcube_utils::get_input_value('_uids', rcube_utils::INPUT_GPC))) { + else if ($is_current && ($uids = rcube_utils::get_input_value('_uids', rcube_utils::INPUT_GPC)) && empty($search_request)) { $data = $RCMAIL->storage->folder_data($mbox_name); if (empty($_SESSION['list_mod_seq']) || $_SESSION['list_mod_seq'] != $data['HIGHESTMODSEQ']) { @@ -136,7 +146,7 @@ foreach ($a_mailboxes as $mbox_name) { // set trash folder state if ($mbox_name === $trash) { - $OUTPUT->command('set_trash_count', $RCMAIL->storage->count($mbox_name, 'EXISTS')); + $OUTPUT->command('set_trash_count', $RCMAIL->storage->count($mbox_name, 'EXISTS', true)); } } diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index db485fda8..6a0139d72 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -62,36 +62,6 @@ if (!is_array($COMPOSE)) { rcmail_process_compose_params($COMPOSE); - // add attachments listed by message_compose hook - if (is_array($plugin['attachments'])) { - foreach ($plugin['attachments'] as $attach) { - // we have structured data - if (is_array($attach)) { - $attachment = $attach; - } - // only a file path is given - else { - $filename = basename($attach); - $attachment = array( - 'group' => $COMPOSE_ID, - 'name' => $filename, - 'mimetype' => rcube_mime::file_content_type($attach, $filename), - 'path' => $attach, - ); - } - - // save attachment if valid - if (($attachment['data'] && $attachment['name']) || ($attachment['path'] && file_exists($attachment['path']))) { - $attachment = rcmail::get_instance()->plugins->exec_hook('attachment_save', $attachment); - } - - if ($attachment['status'] && !$attachment['abort']) { - unset($attachment['data'], $attachment['status'], $attachment['abort']); - $COMPOSE['attachments'][$attachment['id']] = $attachment; - } - } - } - // check if folder for saving sent messages exists and is subscribed (#1486802) if ($sent_folder = $COMPOSE['param']['sent_mbox']) { rcmail_check_sent_folder($sent_folder, true); @@ -111,7 +81,8 @@ $OUTPUT->add_label('nosubject', 'nosenderwarning', 'norecipientwarning', 'nosubj 'nobodywarning', 'notsentwarning', 'notuploadedwarning', 'savingmessage', 'sendingmessage', 'messagesaved', 'converting', 'editorwarning', 'searching', 'uploading', 'uploadingmany', 'fileuploaderror', 'sendmessage', 'savenewresponse', 'responsename', 'responsetext', 'save', - 'savingresponse', 'restoresavedcomposedata', 'restoremessage', 'delete', 'restore', 'ignore'); + 'savingresponse', 'restoresavedcomposedata', 'restoremessage', 'delete', 'restore', 'ignore', + 'selectimportfile'); $OUTPUT->set_pagetitle($RCMAIL->gettext('compose')); @@ -208,14 +179,20 @@ if (!empty($msg_uid) && empty($COMPOSE['as_attachment'])) { if (!$MESSAGE->headers) { // error } - else if ($compose_mode == RCUBE_COMPOSE_REPLY) { - $COMPOSE['reply_uid'] = $msg_uid; - $COMPOSE['reply_msgid'] = $MESSAGE->headers->messageID; - $COMPOSE['references'] = trim($MESSAGE->headers->references . " " . $MESSAGE->headers->messageID); + else if ($compose_mode == RCUBE_COMPOSE_FORWARD || $compose_mode == RCUBE_COMPOSE_REPLY) { + if ($compose_mode == RCUBE_COMPOSE_REPLY) { + $COMPOSE['reply_uid'] = $msg_uid; - if (!empty($COMPOSE['param']['all'])) { - $MESSAGE->reply_all = $COMPOSE['param']['all']; + if (!empty($COMPOSE['param']['all'])) { + $MESSAGE->reply_all = $COMPOSE['param']['all']; + } } + else { + $COMPOSE['forward_uid'] = $msg_uid; + } + + $COMPOSE['reply_msgid'] = $MESSAGE->headers->messageID; + $COMPOSE['references'] = trim($MESSAGE->headers->references . " " . $MESSAGE->headers->messageID); // Save the sent message in the same folder of the message being replied to if ($RCMAIL->config->get('reply_same_folder') && ($sent_folder = $COMPOSE['mailbox']) @@ -271,6 +248,10 @@ else { } } +if (!empty($COMPOSE['reply_msgid'])) { + $OUTPUT->set_env('reply_msgid', $COMPOSE['reply_msgid']); +} + $MESSAGE->compose = array(); // get user's identities @@ -482,6 +463,11 @@ function rcmail_process_compose_params(&$COMPOSE) } } + // resolve _forward_uid=* to an absolute list of messages from a search result + if ($COMPOSE['param']['forward_uid'] == '*' && is_object($_SESSION['search'][1])) { + $COMPOSE['param']['forward_uid'] = $_SESSION['search'][1]->get(); + } + // clean HTML message body which can be submitted by URL if (!empty($COMPOSE['param']['body'])) { $COMPOSE['param']['body'] = rcmail_wash_html($COMPOSE['param']['body'], array('safe' => false, 'inline_html' => true), array()); @@ -495,6 +481,36 @@ function rcmail_process_compose_params(&$COMPOSE) // pipe compose parameters thru plugins $plugin = $RCMAIL->plugins->exec_hook('message_compose', $COMPOSE); $COMPOSE['param'] = array_merge($COMPOSE['param'], $plugin['param']); + + // add attachments listed by message_compose hook + if (is_array($plugin['attachments'])) { + foreach ($plugin['attachments'] as $attach) { + // we have structured data + if (is_array($attach)) { + $attachment = $attach + array('group' => $COMPOSE_ID); + } + // only a file path is given + else { + $filename = basename($attach); + $attachment = array( + 'group' => $COMPOSE_ID, + 'name' => $filename, + 'mimetype' => rcube_mime::file_content_type($attach, $filename), + 'path' => $attach, + ); + } + + // save attachment if valid + if (($attachment['data'] && $attachment['name']) || ($attachment['path'] && file_exists($attachment['path']))) { + $attachment = rcmail::get_instance()->plugins->exec_hook('attachment_save', $attachment); + } + + if ($attachment['status'] && !$attachment['abort']) { + unset($attachment['data'], $attachment['status'], $attachment['abort']); + $COMPOSE['attachments'][$attachment['id']] = $attachment; + } + } + } } function rcmail_compose_headers($attrib) @@ -595,7 +611,7 @@ function rcmail_compose_header_from($attrib) $text = $html = $sql_arr['signature']; if ($sql_arr['html_signature']) { - $h2t = new rcube_html2text($sql_arr['signature'], false, false); + $h2t = new rcube_html2text($sql_arr['signature'], false, true); $text = trim($h2t->get_text()); } else { @@ -608,7 +624,8 @@ function rcmail_compose_header_from($attrib) } if (!$sql_arr['html_signature']) { - $html = "<pre>" . $html . "</pre>"; + $t2h = new rcube_text2html($sql_arr['signature'], false); + $html = $t2h->get_html(); } $a_signatures[$identity_id]['text'] = $text; @@ -810,15 +827,8 @@ function rcmail_compose_part_body($part, $isHtml = false) } } - if ($part->ctype_parameters['format'] == 'flowed') { - $body = rcube_mime::unfold_flowed($body); - } - // add HTML formatting - $body = rcmail_plain_body($body); - if ($body) { - $body = '<pre>' . $body . '</pre>'; - } + $body = rcmail_plain_body($body, $part->ctype_parameters['format'] == 'flowed'); } } else { @@ -1237,6 +1247,7 @@ function rcmail_write_forward_attachments() $storage = $RCMAIL->get_storage(); $names = array(); + $refs = array(); $loaded_attachments = array(); foreach ((array)$COMPOSE['attachments'] as $attachment) { @@ -1247,7 +1258,10 @@ function rcmail_write_forward_attachments() $index = $storage->index(null, rcmail_sort_column(), rcmail_sort_order()); $COMPOSE['forward_uid'] = $index->get(); } - else { + else if (!is_array($COMPOSE['forward_uid']) && strpos($COMPOSE['forward_uid'], ':')) { + $COMPOSE['forward_uid'] = rcube_imap_generic::uncompressMessageSet($COMPOSE['forward_uid']); + } + else if (is_string($COMPOSE['forward_uid'])) { $COMPOSE['forward_uid'] = explode(',', $COMPOSE['forward_uid']); } @@ -1316,6 +1330,18 @@ function rcmail_write_forward_attachments() else if ($path) { @unlink($path); } + + if ($message->headers->messageID) { + $refs[] = $message->headers->messageID; + } + } + + // set In-Reply-To and References headers + if (count($refs) == 1) { + $COMPOSE['reply_msgid'] = $refs[0]; + } + if (!empty($refs)) { + $COMPOSE['references'] = implode(' ', $refs); } } diff --git a/program/steps/mail/copy.inc b/program/steps/mail/copy.inc index a392f309f..86586d34d 100644 --- a/program/steps/mail/copy.inc +++ b/program/steps/mail/copy.inc @@ -5,7 +5,7 @@ | program/steps/mail/copy.inc | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -26,11 +26,14 @@ if (!$OUTPUT->ajax_call) { // move messages if (!empty($_POST['_uid']) && strlen($_POST['_target_mbox'])) { - $uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST); $target = rcube_utils::get_input_value('_target_mbox', rcube_utils::INPUT_POST, true); - $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST, true); - $copied = $RCMAIL->storage->copy_message($uids, $target, $mbox); + foreach (rcmail::get_uids() as $mbox => $uids) { + if ($mbox === $target) + $copied++; + else + $copied += (int)$RCMAIL->storage->copy_message($uids, $target, $mbox); + } if (!$copied) { // send error message diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 0211fabc4..50b1e8292 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -5,7 +5,7 @@ | program/steps/mail/func.inc | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -23,40 +23,8 @@ // always instantiate storage object (but not connect to server yet) $RCMAIL->storage_init(); -// set imap properties and session vars -if (strlen(trim($mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_GPC, true)))) { - $RCMAIL->storage->set_folder(($_SESSION['mbox'] = $mbox)); -} -else if ($RCMAIL->storage) { - $_SESSION['mbox'] = $RCMAIL->storage->get_folder(); -} - -if (!empty($_GET['_page'])) { - $RCMAIL->storage->set_page(($_SESSION['page'] = intval($_GET['_page']))); -} - -$a_threading = $RCMAIL->config->get('message_threading', array()); -$message_sort_col = $RCMAIL->config->get('message_sort_col'); -$message_sort_order = $RCMAIL->config->get('message_sort_col'); - -// set default sort col/order to session -if (!isset($_SESSION['sort_col'])) { - $_SESSION['sort_col'] = $message_sort_col ? $message_sort_col : ''; -} -if (!isset($_SESSION['sort_order'])) { - $_SESSION['sort_order'] = strtoupper($message_sort_order) == 'ASC' ? 'ASC' : 'DESC'; -} - -// set threads mode -if (isset($_GET['_threads'])) { - if ($_GET['_threads']) - $a_threading[$_SESSION['mbox']] = true; - else - unset($a_threading[$_SESSION['mbox']]); - - $RCMAIL->user->save_prefs(array('message_threading' => $a_threading)); -} -$RCMAIL->storage->set_threading($a_threading[$_SESSION['mbox']]); +// init environment - set current folder, page, list mode +rcmail_init_env(); // set message set for search result if (!empty($_REQUEST['_search']) && isset($_SESSION['search']) @@ -68,6 +36,26 @@ if (!empty($_REQUEST['_search']) && isset($_SESSION['search']) $OUTPUT->set_env('search_text', $_SESSION['last_text_search']); } +// remove mbox part from _uid +if (($_uid = rcube_utils::get_input_value('_uid', RCUBE_INPUT_GPC)) && !is_array($_uid) && preg_match('/^\d+-.+/', $_uid)) { + list($_uid, $mbox) = explode('-', $_uid, 2); + if (isset($_GET['_uid'])) $_GET['_uid'] = $_uid; + if (isset($_POST['_uid'])) $_POST['_uid'] = $_uid; + $_REQUEST['_uid'] = $_uid; + unset($_uid); + + // override mbox + if (!empty($mbox)) { + $_GET['_mbox'] = $mbox; + $_POST['_mbox'] = $mbox; + $RCMAIL->storage->set_folder(($_SESSION['mbox'] = $mbox)); + } +} + +if (!empty($_SESSION['browser_caps']) && !$OUTPUT->ajax_call) { + $OUTPUT->set_env('browser_capabilities', $_SESSION['browser_caps']); +} + // set main env variables, labels and page title if (empty($RCMAIL->action) || $RCMAIL->action == 'list') { // connect to storage server and trigger error on failure @@ -88,6 +76,9 @@ if (empty($RCMAIL->action) || $RCMAIL->action == 'list') { } $OUTPUT->set_env('search_mods', rcmail_search_mods()); + + if (!empty($_SESSION['search_scope'])) + $OUTPUT->set_env('search_scope', $_SESSION['search_scope']); } $threading = (bool) $RCMAIL->storage->get_threading(); @@ -117,17 +108,13 @@ if (empty($RCMAIL->action) || $RCMAIL->action == 'list') { $RCMAIL->set_env_config(array('delete_junk', 'flag_for_deletion', 'read_when_deleted', 'skip_deleted', 'display_next', 'message_extwin', 'compose_extwin', 'forward_attachment')); - if (!empty($_SESSION['browser_caps'])) { - $OUTPUT->set_env('browser_capabilities', $_SESSION['browser_caps']); - } - if (!$OUTPUT->ajax_call) { $OUTPUT->add_label('checkingmail', 'deletemessage', 'movemessagetotrash', 'movingmessage', 'copyingmessage', 'deletingmessage', 'markingmessage', - 'copy', 'move', 'quota', 'replyall', 'replylist', 'importwait'); + 'copy', 'move', 'quota', 'replyall', 'replylist', 'stillsearching'); } - $pagetitle = $RCMAIL->localize_foldername($RCMAIL->storage->mod_folder($mbox_name), true); + $pagetitle = $RCMAIL->localize_foldername($mbox_name, true); $pagetitle = str_replace($delimiter, " \xC2\xBB ", $pagetitle); $OUTPUT->set_pagetitle($pagetitle); @@ -166,6 +153,60 @@ $RCMAIL->register_action_map(array( )); +/** + * Sets storage properties and session + */ +function rcmail_init_env() +{ + global $RCMAIL; + + $a_threading = $RCMAIL->config->get('message_threading', array()); + $message_sort_col = $RCMAIL->config->get('message_sort_col'); + $message_sort_order = $RCMAIL->config->get('message_sort_order'); + + // set imap properties and session vars + if (!strlen($mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_GPC, true))) { + $mbox = strlen($_SESSION['mbox']) ? $_SESSION['mbox'] : 'INBOX'; + } + if (!($page = intval($_GET['_page']))) { + $page = $_SESSION['page'] ? $_SESSION['page'] : 1; + } + + $RCMAIL->storage->set_folder($_SESSION['mbox'] = $mbox); + $RCMAIL->storage->set_page($_SESSION['page'] = $page); + + // set default sort col/order to session + if (!isset($_SESSION['sort_col'])) { + $_SESSION['sort_col'] = $message_sort_col ? $message_sort_col : ''; + } + if (!isset($_SESSION['sort_order'])) { + $_SESSION['sort_order'] = strtoupper($message_sort_order) == 'ASC' ? 'ASC' : 'DESC'; + } + + // set threads mode + if (isset($_GET['_threads'])) { + if ($_GET['_threads']) { + // re-set current page number when listing mode changes + if (!$a_threading[$_SESSION['mbox']]) { + $RCMAIL->storage->set_page($_SESSION['page'] = 1); + } + + $a_threading[$_SESSION['mbox']] = true; + } + else { + // re-set current page number when listing mode changes + if ($a_threading[$_SESSION['mbox']]) { + $RCMAIL->storage->set_page($_SESSION['page'] = 1); + } + + unset($a_threading[$_SESSION['mbox']]); + } + + $RCMAIL->user->save_prefs(array('message_threading' => $a_threading)); + } + + $RCMAIL->storage->set_threading($a_threading[$_SESSION['mbox']]); +} /** * Returns default search mods @@ -298,7 +339,7 @@ function rcmail_message_list($attrib) $OUTPUT->set_env('sort_col', $_SESSION['sort_col']); $OUTPUT->set_env('sort_order', $_SESSION['sort_order']); $OUTPUT->set_env('messages', array()); - $OUTPUT->set_env('coltypes', $a_show_cols); + $OUTPUT->set_env('listcols', $a_show_cols); $OUTPUT->include_script('list.js'); @@ -315,7 +356,7 @@ function rcmail_message_list($attrib) /** * return javascript commands to add rows to the message list */ -function rcmail_js_message_list($a_headers, $insert_top=FALSE, $a_show_cols=null) +function rcmail_js_message_list($a_headers, $insert_top=false, $a_show_cols=null) { global $RCMAIL, $OUTPUT; @@ -334,6 +375,14 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE, $a_show_cols=null $head_replace = true; } + // add 'folder' column to list on multi-folder searches + $search_set = $RCMAIL->storage->get_search_set(); + $multifolder = $search_set && $search_set[1]->multi; + if ($multifolder && !in_array('folder', $a_show_cols)) { + $a_show_cols[] = 'folder'; + $head_replace = true; + } + $mbox = $RCMAIL->storage->get_folder(); // make sure 'threads' and 'subject' columns are present @@ -342,8 +391,6 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE, $a_show_cols=null if (!in_array('threads', $a_show_cols)) array_unshift($a_show_cols, 'threads'); - $_SESSION['list_attrib']['columns'] = $a_show_cols; - // Make sure there are no duplicated columns (#1486999) $a_show_cols = array_unique($a_show_cols); @@ -364,6 +411,12 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE, $a_show_cols=null $OUTPUT->command('set_message_coltypes', $a_show_cols, $thead, $smart_col); + if ($multifolder && $_SESSION['search_scope'] == 'all') { + $OUTPUT->command('select_folder', ''); + } + + $OUTPUT->set_env('multifolder_listing', $multifolder); + if (empty($a_headers)) { return; } @@ -380,6 +433,14 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE, $a_show_cols=null if (empty($header)) continue; + // make message UIDs unique by appending the folder name + if ($multifolder) { + $header->uid .= '-'.$header->folder; + $header->flags['skip_mbox_check'] = true; + if ($header->parent_uid) + $header->parent_uid .= '-'.$header->folder; + } + $a_msg_cols = array(); $a_msg_flags = array(); @@ -398,6 +459,8 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE, $a_show_cols=null $cont = show_bytes($header->$col); else if ($col == 'date') $cont = $RCMAIL->format_date($header->date); + else if ($col == 'folder') + $cont = rcube::Q(rcube_charset::convert($header->folder, 'UTF7-IMAP')); else $cont = rcube::Q($header->$col); @@ -421,7 +484,7 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE, $a_show_cols=null $a_msg_flags['prio'] = (int) $header->priority; $a_msg_flags['ctype'] = rcube::Q($header->ctype); - $a_msg_flags['mbox'] = $mbox; + $a_msg_flags['mbox'] = $header->folder; // merge with plugin result (Deprecated, use $header->flags) if (!empty($header->list_flags) && is_array($header->list_flags)) @@ -481,7 +544,7 @@ function rcmail_message_list_head($attrib, $a_show_cols) $list_menu = ''; } - $cells = array(); + $cells = $coltypes = array(); // get name of smart From/To column in folder context if (array_search('fromto', $a_show_cols) !== false) { @@ -489,32 +552,39 @@ function rcmail_message_list_head($attrib, $a_show_cols) } foreach ($a_show_cols as $col) { + $label = ''; + $sortable = false; + // get column name switch ($col) { case 'flag': - $col_name = '<span class="flagged"> </span>'; + $col_name = html::span('flagged', ' '); break; case 'attachment': case 'priority': case 'status': - $col_name = '<span class="' . $col .'"> </span>'; + $col_name = html::span($col, ' '); break; case 'threads': $col_name = $list_menu; break; case 'fromto': - $col_name = rcube::Q($RCMAIL->gettext($smart_col)); + $label = $RCMAIL->gettext($smart_col); + $col_name = rcube::Q($label); break; default: - $col_name = rcube::Q($RCMAIL->gettext($col)); + $label = $RCMAIL->gettext($col); + $col_name = rcube::Q($label); } // make sort links if (in_array($col, $a_sort_cols)) { + $sortable = true; $col_name = html::a(array( - 'href' => "./#sort", - 'onclick' => 'return '.rcmail_output::JS_OBJECT_NAME.".command('sort','".$col."',this)", - 'title' => $RCMAIL->gettext('sortby') + 'href' => "./#sort", + 'class' => 'sortcol', + 'rel' => $col, + 'title' => $RCMAIL->gettext('sortby') ), $col_name); } else if ($col_name[0] != '<') { @@ -526,8 +596,10 @@ function rcmail_message_list_head($attrib, $a_show_cols) // put it all together $cells[] = array('className' => $class_name, 'id' => "rcm$col", 'html' => $col_name); + $coltypes[$col] = array('className' => $class_name, 'id' => "rcm$col", 'label' => $label, 'sortable' => $sortable); } + $RCMAIL->output->set_env('coltypes', $coltypes); return $cells; } @@ -583,7 +655,7 @@ function rcmail_get_messagecount_text($count = null, $page = null) $max = $RCMAIL->storage->count(NULL, $RCMAIL->storage->get_threading() ? 'THREADS' : 'ALL'); if ($max == 0) - $out = $RCMAIL->gettext('mailboxempty'); + $out = $RCMAIL->storage->get_search_set() ? $RCMAIL->gettext('nomessages') : $RCMAIL->gettext('mailboxempty'); else $out = $RCMAIL->gettext(array('name' => $RCMAIL->storage->get_threading() ? 'threadsfromto' : 'messagesfromto', 'vars' => array('from' => $start_msg, @@ -806,95 +878,29 @@ function rcmail_print_body($part, $p = array()) // plaintext postprocessing if ($part->ctype_secondary == 'plain') { - if ($part->ctype_secondary == 'plain' && $part->ctype_parameters['format'] == 'flowed') { - $body = rcube_mime::unfold_flowed($body); - } - - $body = rcmail_plain_body($body); + $body = rcmail_plain_body($body, $part->ctype_parameters['format'] == 'flowed'); } // allow post-processing of the message body $data = $RCMAIL->plugins->exec_hook('message_part_after', array('type' => $part->ctype_secondary, 'body' => $body, 'id' => $part->mime_id) + $data); - return $data['type'] == 'html' ? $data['body'] : html::tag('pre', array(), $data['body']); + return $data['body']; } /** * Handle links and citation marks in plain text message * * @param string Plain text string + * @param boolean Set to True if the source text is in format=flowed * * @return string Formatted HTML string */ -function rcmail_plain_body($body) +function rcmail_plain_body($body, $flowed = false) { - global $RCMAIL; - - // make links and email-addresses clickable - $attribs = array('link_attribs' => array('rel' => 'noreferrer', 'target' => '_blank')); - $replacer = new rcmail_string_replacer($attribs); - - // search for patterns like links and e-mail addresses and replace with tokens - $body = $replacer->replace($body); - - // split body into single lines - $body = preg_split('/\r?\n/', $body); - $quote_level = 0; - $last = -1; - - // find/mark quoted lines... - for ($n=0, $cnt=count($body); $n < $cnt; $n++) { - if ($body[$n][0] == '>' && preg_match('/^(>+ {0,1})+/', $body[$n], $regs)) { - $q = substr_count($regs[0], '>'); - $body[$n] = substr($body[$n], strlen($regs[0])); - - if ($q > $quote_level) { - $body[$n] = $replacer->get_replacement($replacer->add( - str_repeat('<blockquote>', $q - $quote_level))) . $body[$n]; - $last = $n; - } - else if ($q < $quote_level) { - $body[$n] = $replacer->get_replacement($replacer->add( - str_repeat('</blockquote>', $quote_level - $q))) . $body[$n]; - $last = $n; - } - } - else { - $q = 0; - if ($quote_level > 0) - $body[$n] = $replacer->get_replacement($replacer->add( - str_repeat('</blockquote>', $quote_level))) . $body[$n]; - } - - $quote_level = $q; - } - - $body = join("\n", $body); - - // quote plain text (don't use rcube::Q() here, to display entities "as is") - $table = get_html_translation_table(HTML_SPECIALCHARS); - unset($table['?']); - $body = strtr($body, $table); - - // colorize signature (up to <sig_max_lines> lines) - $len = strlen($body); - $sig_max_lines = $RCMAIL->config->get('sig_max_lines', 15); - - while (($sp = strrpos($body, "-- \n", $sp ? -$len+$sp-1 : 0)) !== false) { - if ($sp == 0 || $body[$sp-1] == "\n") { - // do not touch blocks with more that X lines - if (substr_count($body, "\n", $sp) < $sig_max_lines) { - $body = substr($body, 0, max(0, $sp)) - . '<span class="sig">'.substr($body, $sp).'</span>'; - } - - break; - } - } - - // insert url/mailto links and citation tags - $body = $replacer->resolve($body); + $options = array('flowed' => $flowed, 'wrap' => !$flowed); + $text2html = new rcube_text2html($body, false, $options); + $body = $text2html->get_html(); return $body; } @@ -1049,7 +1055,9 @@ function rcmail_message_headers($attrib, $headers=null) $plugin = $RCMAIL->plugins->exec_hook('message_headers_output', array( 'output' => $output_headers, 'headers' => $headers_obj, - 'exclude' => $exclude_headers + 'exclude' => $exclude_headers, // readonly + 'folder' => $MESSAGE->folder, // readonly + 'uid' => $MESSAGE->uid, // readonly )); // single header value is requested @@ -1224,8 +1232,8 @@ function rcmail_message_body($attrib) $plugin = $RCMAIL->plugins->exec_hook('message_body_prefix', array('part' => $MESSAGE, 'prefix' => '')); - $out .= html::div('message-part', $plugin['prefix'] . html::tag('pre', array(), - rcmail_plain_body(rcube::Q($MESSAGE->body, 'strict', false)))); + $out .= html::div('message-part', + $plugin['prefix'] . rcmail_plain_body($MESSAGE->body)); } } @@ -1295,12 +1303,10 @@ function rcmail_message_body($attrib) function rcmail_part_image_type($part) { - $rcmail = rcmail::get_instance(); - // Skip TIFF images if browser doesn't support this format... $tiff_support = !empty($_SESSION['browser_caps']) && !empty($_SESSION['browser_caps']['tif']); // until we can convert them to JPEG - $tiff_support = $tiff_support || $rcmail->config->get('im_convert_path'); + $tiff_support = $tiff_support || rcube_image::is_convertable('image/tiff'); // Content-type regexp $mime_regex = $tiff_support ? '/^image\//i' : '/^image\/(?!tif)/i'; @@ -1693,7 +1699,8 @@ function rcmail_draftinfo_encode($p) { $parts = array(); foreach ($p as $key => $val) { - $parts[] = $key . '=' . ($key == 'folder' ? base64_encode($val) : $val); + $encode = $key == 'folder' || strpos($val, ';') !== false; + $parts[] = $key . '=' . ($encode ? 'B::' . base64_encode($val) : $val); } return join('; ', $parts); @@ -1705,7 +1712,10 @@ function rcmail_draftinfo_decode($str) foreach (preg_split('/;\s+/', $str) as $part) { list($key, $val) = explode('=', $part, 2); - if ($key == 'folder') { + if (strpos($val, 'B::') === 0) { + $val = base64_decode(substr($val, 3)); + } + else if ($key == 'folder') { $val = base64_decode($val); } @@ -1984,7 +1994,7 @@ function rcmail_search_filter($attrib) $ctypes = array('application/', 'multipart/m', 'multipart/signed', 'multipart/report'); // Build search string of "with attachment" filter - $attachment = str_repeat(' OR', count($ctypes)-1); + $attachment = trim(str_repeat(' OR', count($ctypes)-1)); foreach ($ctypes as $type) { $attachment .= ' HEADER Content-Type ' . rcube_imap_generic::escape($type); } @@ -2070,6 +2080,58 @@ function rcmail_message_import_form($attrib = array()) $content); $RCMAIL->output->add_gui_object('importform', $attrib['id'].'Frm'); + $RCMAIL->output->add_label('selectimportfile','importwait'); return html::div($attrib, $out); } + +/** + * Add groups from the given address source to the address book widget + */ +function rcmail_compose_contact_groups($abook, $source_id, $search = null, $search_mode = 0) +{ + global $RCMAIL, $OUTPUT; + + $jsresult = array(); + foreach ($abook->list_groups($search, $search_mode) as $group) { + $abook->reset(); + $abook->set_group($group['ID']); + $group_prop = $abook->get_group($group['ID']); + + // group (distribution list) with email address(es) + if ($group_prop['email']) { + foreach ((array)$group_prop['email'] as $email) { + $row_id = 'G'.$group['ID']; + $jsresult[$row_id] = format_email_recipient($email, $group['name']); + $OUTPUT->command('add_contact_row', $row_id, array( + 'contactgroup' => html::span(array('title' => $email), rcube::Q($group['name']))), 'group'); + } + } + // make virtual groups clickable to list their members + else if ($group_prop['virtual']) { + $row_id = 'G'.$group['ID']; + $OUTPUT->command('add_contact_row', $row_id, array( + 'contactgroup' => html::a(array( + 'href' => '#list', + 'rel' => $group['ID'], + 'title' => $RCMAIL->gettext('listgroup'), + 'onclick' => sprintf("return %s.command('pushgroup',{'source':'%s','id':'%s'},this,event)", + rcmail_output::JS_OBJECT_NAME, $source_id, $group['ID']), + ), rcube::Q($group['name']) . ' ' . html::span('action', '»'))), + 'group', + array('ID' => $group['ID'], 'name' => $group['name'], 'virtual' => true)); + } + // show group with count + else if (($result = $abook->count()) && $result->count) { + $row_id = 'E'.$group['ID']; + $jsresult[$row_id] = $group['name']; + $OUTPUT->command('add_contact_row', $row_id, array( + 'contactgroup' => rcube::Q($group['name'] . ' (' . intval($result->count) . ')')), 'group'); + } + } + + $abook->reset(); + $abook->set_group(0); + + return $jsresult; +} diff --git a/program/steps/mail/get.inc b/program/steps/mail/get.inc index 8f869c67c..02d57c7dc 100644 --- a/program/steps/mail/get.inc +++ b/program/steps/mail/get.inc @@ -221,7 +221,7 @@ else if (strlen($part_id)) { // TIFF to JPEG conversion, if needed $tiff_support = !empty($_SESSION['browser_caps']) && !empty($_SESSION['browser_caps']['tif']); if (!empty($_REQUEST['_embed']) && !$tiff_support - && $RCMAIL->config->get('im_convert_path') + && rcube_image::is_convertable('image/tiff') && rcmail_part_image_type($part) == 'image/tiff' ) { $tiff2jpeg = true; @@ -293,9 +293,7 @@ else if (strlen($part_id)) { $filename = rcmail_attachment_name($part); - if ($browser->ie && $browser->ver < 7) - $filename = rawurlencode(abbreviate_string($filename, 55)); - else if ($browser->ie) + if ($browser->ie) $filename = rawurlencode($filename); else $filename = addcslashes($filename, '"'); diff --git a/program/steps/mail/import.inc b/program/steps/mail/import.inc index 4f822e0e4..ef78ad945 100644 --- a/program/steps/mail/import.inc +++ b/program/steps/mail/import.inc @@ -5,7 +5,7 @@ | program/steps/mail/import.inc | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -16,6 +16,7 @@ | | +-----------------------------------------------------------------------+ | Author: Thomas Bruederli <roundcube@gmail.com> | + | Author: Aleksander Machniak <alec@alec.pl> | +-----------------------------------------------------------------------+ */ @@ -31,48 +32,62 @@ if (is_array($_FILES['_file'])) { if (!$err) { // check file content type first - list($mtype_primary,) = explode('/', rcube_mime::file_content_type($filepath, $_FILES['_file']['name'][$i], $_FILES['_file']['type'][$i])); + $ctype = rcube_mime::file_content_type($filepath, $_FILES['_file']['name'][$i], $_FILES['_file']['type'][$i]); + list($mtype_primary, $mtype_secondary) = explode('/', $ctype); - if (!in_array($mtype_primary, array('text','message'))) { - $OUTPUT->show_message('importmessageerror', 'error'); + if (in_array($ctype, array('application/zip', 'application/x-zip'))) { + $filepath = rcmail_zip_extract($filepath); + if (empty($filepath)) { + continue; + } + } + else if (!in_array($mtype_primary, array('text', 'message'))) { continue; } - // read the first few lines to detect header-like structure - $fp = fopen($filepath, 'r'); - do { - $line = fgets($fp); - } - while ($line !== false && trim($line) == ''); + foreach ((array) $filepath as $file) { + // read the first few lines to detect header-like structure + $fp = fopen($file, 'r'); + do { + $line = fgets($fp); + } + while ($line !== false && trim($line) == ''); - if (!preg_match('/^From\s+-/', $line) && !preg_match('/^[a-z-_]+:\s+.+/i', $line)) { - $OUTPUT->show_message('importmessageerror', 'error'); - continue; - } + if (!preg_match('/^From .+/', $line) && !preg_match('/^[a-z-_]+:\s+.+/i', $line)) { + continue; + } - $message = $lastline = ''; - fseek($fp, 0); - while (($line = fgets($fp)) !== false) { - // importing mbox file, split by From - lines - if (preg_match('/^From\s+-/', $line) && $lastline == '') { - if (!empty($message)) { - if ($RCMAIL->storage->save_message(null, rtrim($message))) { - $imported++; - } - else { - rcube::raise_error("Failed to import message to " . $RCMAIL->storage->get_folder(), false, true); + $message = $lastline = ''; + fseek($fp, 0); + while (($line = fgets($fp)) !== false) { + // importing mbox file, split by From - lines + if ($lastline === '' && strncmp($line, 'From ', 5) === 0 && strlen($line) > 5) { + if (!empty($message)) { + // unquote ">From " lines in message body + $message = preg_replace('/\n>([>]*)From /', "\n\\1From ", $message); + if ($RCMAIL->storage->save_message(null, rtrim($message))) { + $imported++; + } + else { + rcube::raise_error("Failed to import message to " . $RCMAIL->storage->get_folder(), false, true); + } + $message = ''; } - $message = ''; + continue; } - continue; + + $message .= $line; + $lastline = rtrim($line); } - $message .= $line; - $lastline = rtrim($line); - } + if (!empty($message) && $RCMAIL->storage->save_message(null, rtrim($message))) { + $imported++; + } - if (!empty($message) && $RCMAIL->storage->save_message(null, rtrim($message))) { - $imported++; + // remove temp files extracted from zip + if (is_array($filepath)) { + unlink($file); + } } } @@ -106,3 +121,39 @@ else if ($_SERVER['REQUEST_METHOD'] == 'POST') { // send html page with JS calls as response $OUTPUT->send('iframe'); + + +function rcmail_zip_extract($path) +{ + if (!class_exists('ZipArchive', false)) { + return; + } + + $rcmail = rcmail::get_instance(); + $temp_dir = $rcmail->config->get('temp_dir'); + $zip = new ZipArchive; + $files = array(); + + if ($zip->open($path)) { + for ($i = 0; $i < $zip->numFiles; $i++) { + $entry = $zip->getNameIndex($i); + $tmpfname = tempnam($temp_dir, 'zipimport'); + + if (copy("zip://$path#$entry", $tmpfname)) { + $ctype = rcube_mime::file_content_type($tmpfname, $entry); + list($mtype_primary, $mtype_secondary) = explode('/', $ctype); + + if (in_array($mtype_primary, array('text', 'message'))) { + $files[] = $tmpfname; + } + else { + unlink($tmpfname); + } + } + } + + $zip->close(); + } + + return $files; +} diff --git a/program/steps/mail/list.inc b/program/steps/mail/list.inc index 277564c38..929dda299 100644 --- a/program/steps/mail/list.inc +++ b/program/steps/mail/list.inc @@ -5,7 +5,7 @@ | program/steps/mail/list.inc | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2007, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -42,6 +42,7 @@ if ($sort = rcube_utils::get_input_value('_sort', rcube_utils::INPUT_GET)) { // is there a set of columns for this request? if ($cols = rcube_utils::get_input_value('_cols', rcube_utils::INPUT_GET)) { + $_SESSION['list_attrib']['columns'] = explode(',', $cols); if (!in_array('list_cols', $dont_override)) { $save_arr['list_cols'] = explode(',', $cols); } @@ -59,11 +60,12 @@ $RCMAIL->storage->folder_sync($mbox_name); // initialize searching result if search_filter is used if ($_SESSION['search_filter'] && $_SESSION['search_filter'] != 'ALL') { - $search_request = md5($mbox_name.$_SESSION['search_filter']); + $search_request = md5($mbox_name.$_SESSION['search_scope'].$_SESSION['search_filter']); $RCMAIL->storage->search($mbox_name, $_SESSION['search_filter'], RCUBE_CHARSET, rcmail_sort_column()); $_SESSION['search'] = $RCMAIL->storage->get_search_set(); $_SESSION['search_request'] = $search_request; $OUTPUT->set_env('search_request', $search_request); + $OUTPUT->set_env('search_filter', $_SESSION['search_filter']); } // fetch message headers @@ -91,7 +93,7 @@ rcmail_send_unread_count($mbox_name, !empty($_REQUEST['_refresh']), $unseen); // update message count display $pages = ceil($count/$RCMAIL->storage->get_pagesize()); -$exists = $RCMAIL->storage->count($mbox_name, 'EXISTS'); +$exists = $RCMAIL->storage->count($mbox_name, 'EXISTS', true); $OUTPUT->set_env('messagecount', $count); $OUTPUT->set_env('pagecount', $pages); @@ -100,8 +102,14 @@ $OUTPUT->set_env('current_page', $count ? $RCMAIL->storage->get_page() : 1); $OUTPUT->set_env('exists', $exists); $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($count), $mbox_name); +// remove old message rows if commanded by the client +if (!empty($_REQUEST['_clear'])) { + $OUTPUT->command('clear_message_list'); +} + // add message rows -rcmail_js_message_list($a_headers, FALSE, $cols); +rcmail_js_message_list($a_headers, false, $cols); + if (isset($a_headers) && count($a_headers)) { if ($search_request) { $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $count)); diff --git a/program/steps/mail/list_contacts.inc b/program/steps/mail/list_contacts.inc index 46f81353a..0ee81135b 100644 --- a/program/steps/mail/list_contacts.inc +++ b/program/steps/mail/list_contacts.inc @@ -5,7 +5,7 @@ | program/steps/mail/list_contacts.inc | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2012-2013, The Roundcube Dev Team | + | Copyright (C) 2012-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -23,15 +23,22 @@ $afields = $RCMAIL->config->get('contactlist_fields'); $addr_sort_col = $RCMAIL->config->get('addressbook_sort_col', 'name'); $page_size = $RCMAIL->config->get('addressbook_pagesize', $RCMAIL->config->get('pagesize', 50)); $list_page = max(1, intval($_GET['_page'])); +$jsresult = array(); // Use search result if (!empty($_REQUEST['_search']) && isset($_SESSION['search'][$_REQUEST['_search']])) { $search = (array)$_SESSION['search'][$_REQUEST['_search']]; + $sparam = $_SESSION['search_params']['id'] == $_REQUEST['_search'] ? $_SESSION['search_params']['data'] : array(); // get records from all sources foreach ($search as $s => $set) { $CONTACTS = $RCMAIL->get_address_book($s); + // list matching groups of this source (on page one) + if ($sparam[1] && $CONTACTS->groups && $list_page == 1) { + $jsresult += rcmail_compose_contact_groups($CONTACTS, $s, $sparam[1], (int)$RCMAIL->config->get('addressbook_search_mode')); + } + // reset page $CONTACTS->set_page(1); $CONTACTS->set_pagesize(9999); @@ -78,44 +85,7 @@ else { } // list groups of this source (on page one) else if ($CONTACTS->groups && $CONTACTS->list_page == 1) { - foreach ($CONTACTS->list_groups() as $group) { - $CONTACTS->reset(); - $CONTACTS->set_group($group['ID']); - $group_prop = $CONTACTS->get_group($group['ID']); - - // group (distribution list) with email address(es) - if ($group_prop['email']) { - foreach ((array)$group_prop['email'] as $email) { - $row_id = 'G'.$group['ID']; - $jsresult[$row_id] = format_email_recipient($email, $group['name']); - $OUTPUT->command('add_contact_row', $row_id, array( - 'contactgroup' => html::span(array('title' => $email), rcube::Q($group['name']))), 'group'); - } - } - // make virtual groups clickable to list their members - else if ($group_prop['virtual']) { - $row_id = 'G'.$group['ID']; - $OUTPUT->command('add_contact_row', $row_id, array( - 'contactgroup' => html::a(array( - 'href' => '#list', - 'rel' => $row['ID'], - 'title' => $RCMAIL->gettext('listgroup'), - 'onclick' => sprintf("return %s.command('pushgroup',{'source':'%s','id':'%s'},this,event)", rcmail_output::JS_OBJECT_NAME, $source, $group['ID']), - ), rcube::Q($group['name']) . ' ' . html::span('action', '»'))), - 'group', - array('ID' => $group['ID'], 'name' => $group['name'], 'virtual' => true)); - } - // show group with count - else if (($result = $CONTACTS->count()) && $result->count) { - $row_id = 'E'.$group['ID']; - $jsresult[$row_id] = $group['name']; - $OUTPUT->command('add_contact_row', $row_id, array( - 'contactgroup' => rcube::Q($group['name'] . ' (' . intval($result->count) . ')')), 'group'); - } - } - - $CONTACTS->reset(); - $CONTACTS->set_group(0); + $jsresult = rcmail_compose_contact_groups($CONTACTS, $source); } // get contacts for this user diff --git a/program/steps/mail/mark.inc b/program/steps/mail/mark.inc index daa8c7e54..4e83f975c 100644 --- a/program/steps/mail/mark.inc +++ b/program/steps/mail/mark.inc @@ -4,7 +4,7 @@ | program/steps/mail/mark.inc | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2013, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -36,7 +36,7 @@ $a_flags_map = array( 'unflagged' => 'UNFLAGGED', ); -if (($uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST)) +if (($_uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST)) && ($flag = rcube_utils::get_input_value('_flag', rcube_utils::INPUT_POST)) ) { $flag = $a_flags_map[$flag] ? $a_flags_map[$flag] : strtoupper($flag); @@ -45,10 +45,12 @@ if (($uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST)) // count messages before changing anything $old_count = $RCMAIL->storage->count(NULL, $threading ? 'THREADS' : 'ALL'); $old_pages = ceil($old_count / $RCMAIL->storage->get_pagesize()); - $count = sizeof(explode(',', $uids)); } - $marked = $RCMAIL->storage->set_flag($uids, $flag); + foreach (rcmail::get_uids() as $mbox => $uids) { + $marked += (int)$RCMAIL->storage->set_flag($uids, $flag, $mbox); + $count += count($uids); + } if (!$marked) { // send error message @@ -66,7 +68,9 @@ if (($uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST)) if ($flag == 'DELETED' && $read_deleted && !empty($_POST['_ruid'])) { $ruids = rcube_utils::get_input_value('_ruid', rcube_utils::INPUT_POST); - $read = $RCMAIL->storage->set_flag($ruids, 'SEEN'); + foreach (rcmail::get_uids($ruids) as $mbox => $uids) { + $read += (int)$RCMAIL->storage->set_flag($uids, 'SEEN', $mbox); + } if ($read && !$skip_deleted) { $OUTPUT->command('flag_deleted_as_read', $ruids); @@ -74,7 +78,9 @@ if (($uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST)) } if ($flag == 'SEEN' || $flag == 'UNSEEN' || ($flag == 'DELETED' && !$skip_deleted)) { - rcmail_send_unread_count($RCMAIL->storage->get_folder()); + foreach (rcmail::get_uids() as $mbox => $uids) { + rcmail_send_unread_count($mbox); + } } else if ($flag == 'DELETED' && $skip_deleted) { if ($_POST['_from'] == 'show') { @@ -128,7 +134,7 @@ if (($uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST)) } // add new rows from next page (if any) - if ($count && $uids != '*' && ($jump_back || $nextpage_count > 0)) { + if ($old_count && $_uids != '*' && ($jump_back || $nextpage_count > 0)) { $a_headers = $RCMAIL->storage->list_messages($mbox, NULL, rcmail_sort_column(), rcmail_sort_order(), $jump_back ? NULL : $count); diff --git a/program/steps/mail/move_del.inc b/program/steps/mail/move_del.inc index 7564bb89d..d98d49d1f 100644 --- a/program/steps/mail/move_del.inc +++ b/program/steps/mail/move_del.inc @@ -5,7 +5,7 @@ | program/steps/mail/move_del.inc | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2009, The Roundcube Dev Team | + | Copyright (C) 2005-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -32,13 +32,23 @@ $trash = $RCMAIL->config->get('trash_mbox'); // move messages if ($RCMAIL->action == 'move' && !empty($_POST['_uid']) && strlen($_POST['_target_mbox'])) { - $count = sizeof(explode(',', ($uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST)))); $target = rcube_utils::get_input_value('_target_mbox', rcube_utils::INPUT_POST, true); - $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST, true); - - $moved = $RCMAIL->storage->move_message($uids, $target, $mbox); + $trash = $RCMAIL->config->get('trash_mbox'); + + $success = true; + foreach (rcmail::get_uids() as $mbox => $uids) { + if ($mbox === $target) { + $count += count($uids); + } + else if ($RCMAIL->storage->move_message($uids, $target, $mbox)) { + $count += count($uids); + } + else { + $success = false; + } + } - if (!$moved) { + if (!$success) { // send error message if ($_POST['_from'] != 'show') $OUTPUT->command('list_mailbox'); @@ -47,17 +57,23 @@ if ($RCMAIL->action == 'move' && !empty($_POST['_uid']) && strlen($_POST['_targe exit; } else { - $OUTPUT->show_message('messagemoved', 'confirmation'); + $OUTPUT->show_message('messagemoved', 'confirmation'); } - $addrows = true; + if (!empty($_POST['_refresh'])) { + // FIXME: send updated message rows instead of releading the entire list + $OUTPUT->command('refresh_list'); + } + else { + $addrows = true; + } } // delete messages else if ($RCMAIL->action=='delete' && !empty($_POST['_uid'])) { - $count = sizeof(explode(',', ($uids = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST)))); - $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST, true); - - $del = $RCMAIL->storage->delete_message($uids, $mbox); + foreach (rcmail::get_uids() as $mbox => $uids) { + $del += (int)$RCMAIL->storage->delete_message($uids, $mbox); + $count += count($uids); + } if (!$del) { // send error message @@ -68,7 +84,7 @@ else if ($RCMAIL->action=='delete' && !empty($_POST['_uid'])) { exit; } else { - $OUTPUT->show_message('messagedeleted', 'confirmation'); + $OUTPUT->show_message('messagedeleted', 'confirmation'); } $addrows = true; @@ -150,7 +166,7 @@ else { $OUTPUT->command('set_trash_count', $exists); } else if ($target !== null && $target === $trash) { - $OUTPUT->command('set_trash_count', $RCMAIL->storage->count($trash, 'EXISTS')); + $OUTPUT->command('set_trash_count', $RCMAIL->storage->count($trash, 'EXISTS', true)); } } diff --git a/program/steps/mail/search.inc b/program/steps/mail/search.inc index a80887254..4aa22e14b 100644 --- a/program/steps/mail/search.inc +++ b/program/steps/mail/search.inc @@ -21,6 +21,8 @@ $REMOTE_REQUEST = TRUE; +@set_time_limit(170); // extend default max_execution_time to ~3 minutes + // reset list_page and old search results $RCMAIL->storage->set_page(1); $RCMAIL->storage->set_search_set(NULL); @@ -35,9 +37,12 @@ $str = rcube_utils::get_input_value('_q', rcube_utils::INPUT_GET, true); $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_GET, true); $filter = rcube_utils::get_input_value('_filter', rcube_utils::INPUT_GET); $headers = rcube_utils::get_input_value('_headers', rcube_utils::INPUT_GET); +$scope = rcube_utils::get_input_value('_scope', rcube_utils::INPUT_GET); +$continue = rcube_utils::get_input_value('_continue', rcube_utils::INPUT_GET); $subject = array(); -$search_request = md5($mbox.$filter.$str); +$filter = trim($filter); +$search_request = md5($mbox.$scope.$filter.$str); // add list filter string $search_str = $filter && $filter != 'ALL' ? $filter : ''; @@ -83,8 +88,9 @@ else if (strlen(trim($str))) { } // save search modifiers for the current folder to user prefs + $mkey = $scope == 'all' ? '*' : $mbox; $search_mods = rcmail_search_mods(); - $search_mods[$mbox] = array_fill_keys(array_keys($subject), 1); + $search_mods[$mkey] = array_fill_keys(array_keys($subject), 1); $RCMAIL->user->save_prefs(array('search_mods' => $search_mods)); } @@ -106,9 +112,26 @@ if (!empty($subject)) { $search_str = trim($search_str); $sort_column = rcmail_sort_column(); +// set message set for already stored (but incomplete) search request +if (!empty($continue) && isset($_SESSION['search']) && $_SESSION['search_request'] == $continue) { + $RCMAIL->storage->set_search_set($_SESSION['search']); + $search_str = $_SESSION['search'][0]; +} + // execute IMAP search if ($search_str) { - $RCMAIL->storage->search($mbox, $search_str, $imap_charset, $sort_column); + // search all, current or subfolders folders + if ($scope == 'all') { + $mboxes = $RCMAIL->storage->list_folders_subscribed('', '*', 'mail', null, true); + natcasesort($mboxes); // we want natural alphabetic sorting of folders in the result set + } + else if ($scope == 'sub') { + $mboxes = $RCMAIL->storage->list_folders_subscribed($mbox, '*', 'mail'); + if ($mbox != 'INBOX' && $mboxes[0] == 'INBOX') + array_shift($mboxes); + } + + $result = $RCMAIL->storage->search($mboxes, $search_str, $imap_charset, $sort_column); } // save search results in session @@ -121,38 +144,54 @@ if ($search_str) { $_SESSION['last_text_search'] = $str; } $_SESSION['search_request'] = $search_request; +$_SESSION['search_scope'] = $scope; // Get the headers -$result_h = $RCMAIL->storage->list_messages($mbox, 1, $sort_column, rcmail_sort_order()); -$count = $RCMAIL->storage->count($mbox, $RCMAIL->storage->get_threading() ? 'THREADS' : 'ALL'); +if (!$result->incomplete) { + $result_h = $RCMAIL->storage->list_messages($mbox, 1, $sort_column, rcmail_sort_order()); + $count = $RCMAIL->storage->count($mbox, $RCMAIL->storage->get_threading() ? 'THREADS' : 'ALL'); +} // Make sure we got the headers if (!empty($result_h)) { - rcmail_js_message_list($result_h); + rcmail_js_message_list($result_h, false); if ($search_str) { $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $RCMAIL->storage->count(NULL, 'ALL'))); } // remember last HIGHESTMODSEQ value (if supported) // we need it for flag updates in check-recent - $data = $RCMAIL->storage->folder_data($mbox_name); - if (!empty($data['HIGHESTMODSEQ'])) { - $_SESSION['list_mod_seq'] = $data['HIGHESTMODSEQ']; + if ($mbox !== null) { + $data = $RCMAIL->storage->folder_data($mbox); + if (!empty($data['HIGHESTMODSEQ'])) { + $_SESSION['list_mod_seq'] = $data['HIGHESTMODSEQ']; + } } } // handle IMAP errors (e.g. #1486905) -else if ($err_code = $RCMAIL->storage->get_error_code()) { +else if ($err_code = $RCMAIL->storage->get_error_code()) { $RCMAIL->display_server_error(); } +// advice the client to re-send the (cross-folder) search request +else if ($result->incomplete) { + $count = 0; // keep UI locked + $OUTPUT->command('continue_search', $search_request); +} else { $OUTPUT->show_message('searchnomatch', 'notice'); + $OUTPUT->set_env('multifolder_listing', (bool)$result->multi); + if ($result->multi && $scope == 'all') + $OUTPUT->command('select_folder', ''); } // update message count display $OUTPUT->set_env('search_request', $search_str ? $search_request : ''); +$OUTPUT->set_env('search_filter', $_SESSION['search_filter']); +$OUTPUT->set_env('threading', $RCMAIL->storage->get_threading()); $OUTPUT->set_env('messagecount', $count); $OUTPUT->set_env('pagecount', ceil($count/$RCMAIL->storage->get_pagesize())); -$OUTPUT->set_env('exists', $RCMAIL->storage->count($mbox_name, 'EXISTS')); +$OUTPUT->set_env('exists', $mbox === null ? 0 : $RCMAIL->storage->count($mbox, 'EXISTS')); $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($count, 1), $mbox); +$OUTPUT->set_pagetitle($RCMAIL->gettext(array('name' => 'searchfor', 'vars' => array('q' => $str)))); $OUTPUT->send(); diff --git a/program/steps/mail/search_contacts.inc b/program/steps/mail/search_contacts.inc index 4d5abf9ef..d56581695 100644 --- a/program/steps/mail/search_contacts.inc +++ b/program/steps/mail/search_contacts.inc @@ -5,7 +5,7 @@ | program/steps/mail/search_contacts.inc | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2013, The Roundcube Dev Team | + | Copyright (C) 2013-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -27,12 +27,18 @@ $afields = $RCMAIL->config->get('contactlist_fields'); $page_size = $RCMAIL->config->get('addressbook_pagesize', $RCMAIL->config->get('pagesize', 50)); $records = array(); $search_set = array(); +$jsresult = array(); foreach ($sources as $s) { $source = $RCMAIL->get_address_book($s['id']); $source->set_page(1); $source->set_pagesize(9999); + // list matching groups of this source + if ($source->groups) { + $jsresult += rcmail_compose_contact_groups($source, $s['id'], $search, $search_mode); + } + // get contacts count $result = $source->search($afields, $search, $search_mode, true, true, 'email'); @@ -53,6 +59,8 @@ foreach ($sources as $s) { unset($result); } +$group_count = count($jsresult); + // sort the records ksort($records, SORT_LOCALE_STRING); @@ -98,7 +106,7 @@ if (!empty($result) && $result->count > 0) { $OUTPUT->command('set_env', 'source', ''); $OUTPUT->command('unselect_directory'); } -else { +else if (!$group_count) { $OUTPUT->show_message('nocontactsfound', 'notice'); } diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index 2255acc13..7ae03e522 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -201,7 +201,7 @@ if (!empty($headers['Reply-To'])) { $headers['Mail-Reply-To'] = $headers['Reply-To']; } if ($hdr = rcube_utils::get_input_value('_followupto', rcube_utils::INPUT_POST, TRUE, $message_charset)) { - $headers['Mail-Followup-To'] = rcmail_email_input_format(); + $headers['Mail-Followup-To'] = rcmail_email_input_format($hdr); } // remember reply/forward UIDs in special headers @@ -209,7 +209,7 @@ if (!empty($COMPOSE['reply_uid']) && $savedraft) { $headers['X-Draft-Info'] = array('type' => 'reply', 'uid' => $COMPOSE['reply_uid']); } else if (!empty($COMPOSE['forward_uid']) && $savedraft) { - $headers['X-Draft-Info'] = array('type' => 'forward', 'uid' => $COMPOSE['forward_uid']); + $headers['X-Draft-Info'] = array('type' => 'forward', 'uid' => rcube_imap_generic::compressMessageSet($COMPOSE['forward_uid'])); } if (!empty($COMPOSE['reply_msgid'])) { @@ -281,13 +281,23 @@ if ($isHtml) { if (!$savedraft) { if ($isHtml) { - // remove signature's div ID - $message_body = preg_replace('/\s*id="_rc_sig"/', '', $message_body); - - // add inline css for blockquotes - $bstyle = 'padding-left:5px; border-left:#1010ff 2px solid; margin-left:5px'; - $message_body = preg_replace('/<blockquote>/', - '<blockquote type="cite" style="'.$bstyle.'">', $message_body); + $b_style = 'padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0'; + $pre_style = 'margin: 0; padding: 0; font-family: monospace'; + + $message_body = preg_replace( + array( + // remove signature's div ID + '/\s*id="_rc_sig"/', + // add inline css for blockquotes and container + '/<blockquote>/', + '/<div class="pre">/' + ), + array( + '', + '<blockquote type="cite" style="'.$b_style.'">', + '<div class="pre" style="'.$pre_style.'">' + ), + $message_body); } // Check spelling before send @@ -541,10 +551,16 @@ if (!$savedraft) { } // set replied/forwarded flag - if ($COMPOSE['reply_uid']) - $RCMAIL->storage->set_flag($COMPOSE['reply_uid'], 'ANSWERED', $COMPOSE['mailbox']); - else if ($COMPOSE['forward_uid']) - $RCMAIL->storage->set_flag($COMPOSE['forward_uid'], 'FORWARDED', $COMPOSE['mailbox']); + if ($COMPOSE['reply_uid']) { + foreach (rcmail::get_uids($COMPOSE['reply_uid'], $COMPOSE['mailbox']) as $mbox => $uids) { + $RCMAIL->storage->set_flag($uids, 'ANSWERED', $mbox); + } + } + else if ($COMPOSE['forward_uid']) { + foreach (rcmail::get_uids($COMPOSE['forward_uid'], $COMPOSE['mailbox']) as $mbox => $uids) { + $RCMAIL->storage->set_flag($uids, 'FORWARDED', $mbox); + } + } } // Determine which folder to save message @@ -913,7 +929,8 @@ function rcmail_generic_message_footer($isHtml) if (!preg_match('/\.(php|ini|conf)$/', $file) && strpos($file, '/etc/') === false) { $footer = file_get_contents($file); if ($isHtml && !$html_footer) { - $footer = '<pre>' . $footer . '</pre>'; + $t2h = new rcube_text2html($footer, false); + $footer = $t2h->get_html(); } return $footer; } diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc index 9498d1dc5..beb2cc6e9 100644 --- a/program/steps/mail/show.inc +++ b/program/steps/mail/show.inc @@ -102,7 +102,7 @@ if ($uid) { } if (empty($_SESSION['browser_caps']['tif']) && ($key = array_search('image/tiff', $mimetypes)) !== false) { // we can convert tiff to jpeg - if (!$RCMAIL->config->get('im_convert_path')) { + if (!rcube_image::is_convertable('image/tiff')) { unset($mimetypes[$key]); } } diff --git a/program/steps/mail/viewsource.inc b/program/steps/mail/viewsource.inc index 0328d9600..f988f679a 100644 --- a/program/steps/mail/viewsource.inc +++ b/program/steps/mail/viewsource.inc @@ -33,9 +33,7 @@ if ($uid = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_GET)) { $filename = ($subject ? $subject : $RCMAIL->config->get('product_name', 'email')) . '.eml'; $browser = $RCMAIL->output->browser; - if ($browser->ie && $browser->ver < 7) - $filename = rawurlencode(abbreviate_string($filename, 55)); - else if ($browser->ie) + if ($browser->ie) $filename = rawurlencode($filename); else $filename = addcslashes($filename, '"'); diff --git a/program/steps/settings/edit_folder.inc b/program/steps/settings/edit_folder.inc index fc6b2cd16..6b7bd08d2 100644 --- a/program/steps/settings/edit_folder.inc +++ b/program/steps/settings/edit_folder.inc @@ -139,6 +139,7 @@ function rcmail_folder_form($attrib) 'unsubscribed' => true, 'skip_noinferiors' => true, 'exceptions' => $exceptions, + 'additional' => strlen($selected) ? array($selected) : null, )); $form['props']['fieldsets']['location']['content']['path'] = array( diff --git a/program/steps/settings/edit_identity.inc b/program/steps/settings/edit_identity.inc index f208c8a05..3f7b6a58a 100644 --- a/program/steps/settings/edit_identity.inc +++ b/program/steps/settings/edit_identity.inc @@ -71,7 +71,7 @@ function rcube_identity_form($attrib) $RCMAIL->html_editor('identity'); // add some labels to client - $OUTPUT->add_label('noemailwarning', 'nonamewarning', 'converting', 'editorwarning'); + $OUTPUT->add_label('noemailwarning', 'converting', 'editorwarning'); $i_size = !empty($attrib['size']) ? $attrib['size'] : 40; $t_rows = !empty($attrib['textarearows']) ? $attrib['textarearows'] : 6; diff --git a/program/steps/settings/edit_prefs.inc b/program/steps/settings/edit_prefs.inc index 05f4db6a6..b72c3e73f 100644 --- a/program/steps/settings/edit_prefs.inc +++ b/program/steps/settings/edit_prefs.inc @@ -51,6 +51,10 @@ function rcmail_user_prefs_form($attrib) $out = $form_start; + if(!empty($SECTIONS[$CURR_SECTION]['header'])) { + $out .= html::div(array('id' => 'preferences-header', 'class' =>'boxcontent'), $SECTIONS[$CURR_SECTION]['header']); + } + foreach ($SECTIONS[$CURR_SECTION]['blocks'] as $class => $block) { if (!empty($block['options'])) { $table = new html_table(array('cols' => 2)); diff --git a/program/steps/settings/edit_response.inc b/program/steps/settings/edit_response.inc index 760f28290..6d3c3dc41 100644 --- a/program/steps/settings/edit_response.inc +++ b/program/steps/settings/edit_response.inc @@ -35,7 +35,7 @@ if (($key = rcube_utils::get_input_value('_key', rcube_utils::INPUT_GPC))) { // save response if ($RCMAIL->action == 'save-response' && isset($_POST['_name']) && !$RESPONSE_RECORD['static']) { $name = trim(rcube_utils::get_input_value('_name', rcube_utils::INPUT_POST)); - $text = trim(rcube_utils::get_input_value('_text', rcube_utils::INPUT_POST)); + $text = trim(rcube_utils::get_input_value('_text', rcube_utils::INPUT_POST, true)); if (!empty($name) && !empty($text)) { $dupes = 0; diff --git a/program/steps/settings/folders.inc b/program/steps/settings/folders.inc index b09ea03ce..1bcfb4cfc 100644 --- a/program/steps/settings/folders.inc +++ b/program/steps/settings/folders.inc @@ -45,7 +45,7 @@ if ($RCMAIL->action == 'subscribe') { if ($result) { // Handle subscription of protected folder (#1487656) if ($RCMAIL->config->get('protect_default_folders') - && in_array($mbox, (array)$RCMAIL->config->get('default_folders')) + && $STORAGE->is_special_folder($mbox) ) { $OUTPUT->command('disable_subscription', $mbox); } @@ -221,16 +221,15 @@ function rcube_subscription_form($attrib) // get folders from server $STORAGE->clear_cache('mailboxes', true); - $a_unsubscribed = $STORAGE->list_folders(); - $a_subscribed = $STORAGE->list_folders_subscribed('', '*', null, null, true); // unsorted - $delimiter = $STORAGE->get_hierarchy_delimiter(); - $namespace = $STORAGE->get_namespace(); - $a_js_folders = array(); - $seen = array(); - $list_folders = array(); - - $default_folders = (array) $RCMAIL->config->get('default_folders'); + $a_unsubscribed = $STORAGE->list_folders(); + $a_subscribed = $STORAGE->list_folders_subscribed('', '*', null, null, true); // unsorted + $delimiter = $STORAGE->get_hierarchy_delimiter(); + $namespace = $STORAGE->get_namespace(); + $special_folders = array_flip(array_merge(array('inbox' => 'INBOX'), $STORAGE->get_special_folders())); $protect_default = $RCMAIL->config->get('protect_default_folders'); + $a_js_folders = array(); + $seen = array(); + $list_folders = array(); // pre-process folders list foreach ($a_unsubscribed as $i => $folder) { @@ -291,7 +290,7 @@ function rcube_subscription_form($attrib) $idx = $i + 1; $sub_key = array_search($folder['id'], $a_subscribed); $subscribed = $sub_key !== false; - $protected = $protect_default && in_array($folder['id'], $default_folders); + $protected = $protect_default && isset($special_folders[$folder['id']]); $noselect = false; $classes = array($i%2 ? 'even' : 'odd'); @@ -368,7 +367,7 @@ function rcube_subscription_form($attrib) $OUTPUT->add_gui_object('subscriptionlist', $attrib['id']); $OUTPUT->set_env('subscriptionrows', $a_js_folders); - $OUTPUT->set_env('defaultfolders', $default_folders); + $OUTPUT->set_env('defaultfolders', array_keys($special_folders)); $OUTPUT->set_env('delimiter', $delimiter); return $form_start . $table->show($attrib) . $form_end; diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc index 7c36df3b1..4b4575f10 100644 --- a/program/steps/settings/func.inc +++ b/program/steps/settings/func.inc @@ -346,6 +346,7 @@ function rcmail_user_prefs($current = null) $license_link = $meta['license-url'] ? html::a(array('href' => $meta['license-url'], 'target' => '_blank'), rcube::Q($meta['license'])) : rcube::Q($meta['license']); } + $skinnames[] = mb_strtolower($skinname); $blocks['skin']['options'][$skin]['content'] = html::label(array('class' => 'skinselection'), html::span('skinitem', $input->show($config['skin'], array('value' => $skin, 'id' => $field_id.$skin))) . html::span('skinitem', html::img(array('src' => $thumbnail, 'class' => 'skinthumbnail', 'alt' => $skin, 'width' => 64, 'height' => 64))) . @@ -354,6 +355,7 @@ function rcmail_user_prefs($current = null) html::span('skinlicense', $license_link ? $RCMAIL->gettext('license').': ' . $license_link : '')) ); } + array_multisort($blocks['skin']['options'], SORT_ASC, SORT_STRING, $skinnames); } } @@ -376,13 +378,16 @@ function rcmail_user_prefs($current = null) if ($current) { $product_name = $RCMAIL->config->get('product_name', 'Roundcube Webmail'); $RCMAIL->output->add_script(sprintf("%s.check_protocol_handler('%s', '#mailtoprotohandler');", - rcmail_output::JS_OBJECT_NAME, rcube::JQ($product_name)), 'foot'); + rcmail_output::JS_OBJECT_NAME, rcube::JQ($product_name)), 'docready'); } $blocks['browser']['options']['mailtoprotohandler'] = array( 'content' => html::a(array( - 'href' => '#', - 'id' => 'mailtoprotohandler'), rcube::Q($RCMAIL->gettext('mailtoprotohandler'))), + 'href' => '#', + 'id' => 'mailtoprotohandler' + ), + rcube::Q($RCMAIL->gettext('mailtoprotohandler'))) . + html::span('mailtoprotohandler-status', ''), ); break; @@ -1032,7 +1037,8 @@ function rcmail_user_prefs($current = null) } // Configure special folders - if (!isset($no_override['default_folders']) && $current) { + $set = array('drafts_mbox', 'sent_mbox', 'junk_mbox', 'trash_mbox'); + if ($current && count(array_intersect($no_override, $set)) < 4) { $select = $RCMAIL->folder_selector(array( 'noselection' => '---', 'realnames' => true, @@ -1040,10 +1046,10 @@ function rcmail_user_prefs($current = null) 'folder_filter' => 'mail', 'folder_rights' => 'w', )); - } - // #1486114, #1488279, #1489219 - $onchange = "if ($(this).val() == 'INBOX') $(this).val('')"; + // #1486114, #1488279, #1489219 + $onchange = "if ($(this).val() == 'INBOX') $(this).val('')"; + } if (!isset($no_override['drafts_mbox'])) { if (!$current) { @@ -1235,6 +1241,13 @@ function rcmail_user_prefs($current = null) $sections[$idx]['blocks'] = $data['blocks']; } + $data = $RCMAIL->plugins->exec_hook('preferences_section_header', + array('section' => $sect['id'], 'header' => '', 'current' => $current)); + + if(!empty($data['header'])) { + $sections[$idx]['header'] = $data['header']; + } + return array($sections, $plugin['cols']); } @@ -1284,13 +1297,11 @@ function rcmail_update_folder_row($name, $oldname=null, $subscribe=false, $class { global $RCMAIL, $OUTPUT; - $default_folders = (array) $RCMAIL->config->get('default_folders'); $protect_folders = $RCMAIL->config->get('protect_default_folders'); - - $storage = $RCMAIL->get_storage(); - $delimiter = $storage->get_hierarchy_delimiter(); - $name_utf8 = rcube_charset::convert($name, 'UTF7-IMAP'); - $protected = $protect_folders && in_array($name, $default_folders); + $storage = $RCMAIL->get_storage(); + $delimiter = $storage->get_hierarchy_delimiter(); + $name_utf8 = rcube_charset::convert($name, 'UTF7-IMAP'); + $protected = $protect_folders && $storage->is_special_folder($name); $foldersplit = explode($delimiter, $storage->mod_folder($name)); $level = count($foldersplit) - 1; diff --git a/program/steps/settings/responses.inc b/program/steps/settings/responses.inc index 35a2a1b64..06093b3b8 100644 --- a/program/steps/settings/responses.inc +++ b/program/steps/settings/responses.inc @@ -22,7 +22,7 @@ if (!empty($_POST['_insert'])) { $name = trim(rcube_utils::get_input_value('_name', rcube_utils::INPUT_POST)); - $text = trim(rcube_utils::get_input_value('_text', rcube_utils::INPUT_POST)); + $text = trim(rcube_utils::get_input_value('_text', rcube_utils::INPUT_POST, true)); if (!empty($name) && !empty($text)) { $dupes = 0; diff --git a/program/steps/settings/save_identity.inc b/program/steps/settings/save_identity.inc index 1584c5f00..77245b988 100644 --- a/program/steps/settings/save_identity.inc +++ b/program/steps/settings/save_identity.inc @@ -26,8 +26,8 @@ $a_boolean_cols = array('standard', 'html_signature'); $updated = $default_id = false; // check input -if (IDENTITIES_LEVEL != 4 && (empty($_POST['_name']) || (empty($_POST['_email']) && IDENTITIES_LEVEL != 1 && IDENTITIES_LEVEL != 3))) { - $OUTPUT->show_message('formincomplete', 'warning'); +if (empty($_POST['_email']) && (IDENTITIES_LEVEL == 0 || IDENTITIES_LEVEL == 2)) { + $OUTPUT->show_message('noemailwarning', 'warning'); $RCMAIL->overwrite_action('edit-identity'); return; } diff --git a/program/steps/settings/save_prefs.inc b/program/steps/settings/save_prefs.inc index f71eee39a..7a17f21f4 100644 --- a/program/steps/settings/save_prefs.inc +++ b/program/steps/settings/save_prefs.inc @@ -121,12 +121,12 @@ case 'server': case 'folders': $a_user_prefs = array( 'show_real_foldernames' => isset($_POST['_show_real_foldernames']) ? true : false, - 'drafts_mbox' => rcube_utils::get_input_value('_drafts_mbox', rcube_utils::INPUT_POST, true), - 'sent_mbox' => rcube_utils::get_input_value('_sent_mbox', rcube_utils::INPUT_POST, true), - 'junk_mbox' => rcube_utils::get_input_value('_junk_mbox', rcube_utils::INPUT_POST, true), - 'trash_mbox' => rcube_utils::get_input_value('_trash_mbox', rcube_utils::INPUT_POST, true), ); + foreach (rcube_storage::$folder_types as $type) { + $a_user_prefs[$type . '_mbox'] = rcube_utils::get_input_value('_' . $type . '_mbox', rcube_utils::INPUT_POST, true); + }; + break; } @@ -191,21 +191,15 @@ case 'addressbook': break; case 'folders': - // special handling for 'default_folders' - if (in_array('default_folders', (array)$CONFIG['dont_override'])) { - foreach (array('drafts_mbox','sent_mbox','junk_mbox','trash_mbox') as $p) { - $a_user_prefs[$p] = $CONFIG[$p]; - } - } - else { - $a_user_prefs['default_folders'] = array('INBOX'); - foreach (array('drafts_mbox','sent_mbox','junk_mbox','trash_mbox') as $p) { - if ($a_user_prefs[$p]) { - $a_user_prefs['default_folders'][] = $a_user_prefs[$p]; - } - } + $storage = $RCMAIL->get_storage(); + $specials = array(); + + foreach (rcube_storage::$folder_types as $type) { + $specials[$type] = $a_user_prefs[$type . '_mbox']; } + $storage->set_special_folders($specials); + break; } diff --git a/program/steps/utils/html2text.inc b/program/steps/utils/html2text.inc index c01443b22..f6e2bec4d 100644 --- a/program/steps/utils/html2text.inc +++ b/program/steps/utils/html2text.inc @@ -19,7 +19,12 @@ +-----------------------------------------------------------------------+ */ -$html = $HTTP_RAW_POST_DATA; +$html = stream_get_contents(fopen('php://input', 'r')); + +// strip slashes if magic_quotes enabled +if (get_magic_quotes_gpc() || get_magic_quotes_runtime()) { + $html = stripslashes($html); +} // Replace emoticon images with its text representation $html = $RCMAIL->replace_emoticons($html); diff --git a/program/steps/utils/modcss.inc b/program/steps/utils/modcss.inc index c8a7cb524..f3d8d897a 100644 --- a/program/steps/utils/modcss.inc +++ b/program/steps/utils/modcss.inc @@ -5,7 +5,7 @@ | program/steps/utils/modcss.inc | | | | This file is part of the Roundcube Webmail client | - | Copyright (C) 2007-2012, The Roundcube Dev Team | + | Copyright (C) 2007-2014, The Roundcube Dev Team | | | | Licensed under the GNU General Public License version 3 or | | any later version with exceptions for skins & plugins. | @@ -33,27 +33,47 @@ if (!preg_match('~^(https?)://~i', $realurl, $matches)) { exit("Invalid URL"); } -if (!ini_get('allow_url_fopen')) { +if (ini_get('allow_url_fopen')) { + $scheme = strtolower($matches[1]); + $options = array( + $scheme => array( + 'method' => 'GET', + 'timeout' => 15, + ) + ); + + $context = stream_context_create($options); + $source = @file_get_contents($realurl, false, $context); + + // php.net/manual/en/reserved.variables.httpresponseheader.php + $headers = implode("\n", (array) $http_response_header); +} +else if (function_exists('curl_init')) { + $curl = curl_init($realurl); + curl_setopt($curl, CURLOPT_TIMEOUT, 15); + curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 15); + curl_setopt($curl, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); + curl_setopt($curl, CURLOPT_ENCODING, ''); + curl_setopt($curl, CURLOPT_HEADER, true); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + $data = curl_exec($curl); + + if ($data !== false) { + list($headers, $source) = explode("\r\n\r\n", $data, 2); + } + else { + $headers = false; + $source = false; + } +} +else { header('HTTP/1.1 403 Forbidden'); exit("HTTP connections disabled"); } -$scheme = strtolower($matches[1]); -$options = array( - $scheme => array( - 'method' => 'GET', - 'timeout' => 15, - ) -); - -$context = stream_context_create($options); -$source = @file_get_contents($realurl, false, $context); - -// php.net/manual/en/reserved.variables.httpresponseheader.php -$headers = implode("\n", (array)$http_response_header); -$ctype = '~Content-Type:\s+text/(css|plain)~i'; +$ctype_regexp = '~Content-Type:\s+text/(css|plain)~i'; -if ($source !== false && preg_match($ctype, $headers)) { +if ($source !== false && preg_match($ctype_regexp, $headers)) { header('Content-Type: text/css'); echo rcube_utils::mod_css_styles($source, preg_replace('/[^a-z0-9]/i', '', $_GET['_c'])); exit; diff --git a/program/steps/utils/spell.inc b/program/steps/utils/spell.inc index c8807e32f..696fa6005 100644 --- a/program/steps/utils/spell.inc +++ b/program/steps/utils/spell.inc @@ -37,6 +37,9 @@ if ($learn_word) { $spellchecker->add_word($data); $result = '<?xml version="1.0" encoding="'.RCUBE_CHARSET.'"?><learnwordresult></learnwordresult>'; } +else if (empty($data)) { + $result = '<?xml version="1.0" encoding="'.RCUBE_CHARSET.'"?><spellresult charschecked="0"></spellresult>'; +} else { $spellchecker->check($data); $result = $spellchecker->get_xml(); diff --git a/program/steps/utils/text2html.inc b/program/steps/utils/text2html.inc new file mode 100644 index 000000000..56d15fa19 --- /dev/null +++ b/program/steps/utils/text2html.inc @@ -0,0 +1,33 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | program/steps/utils/text2html.inc | + | | + | This file is part of the Roundcube Webmail client | + | Copyright (C) 2005-2014, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + | PURPOSE: | + | Convert plain text to HTML | + | | + +-----------------------------------------------------------------------+ + | Author: Thomas Bruederli <roundcube@gmail.com> | + +-----------------------------------------------------------------------+ +*/ + +$text = stream_get_contents(fopen('php://input', 'r')); + +// strip slashes if magic_quotes enabled +if (get_magic_quotes_gpc() || get_magic_quotes_runtime()) { + $html = stripslashes($html); +} + +$converter = new rcube_text2html($text, false, array('wrap' => true)); + +header('Content-Type: text/html; charset=' . RCUBE_CHARSET); +print $converter->get_html(); +exit; |