summaryrefslogtreecommitdiff
path: root/program
diff options
context:
space:
mode:
Diffstat (limited to 'program')
-rw-r--r--program/include/bc.php2
-rw-r--r--program/include/iniset.php6
-rw-r--r--program/include/rcmail.php258
-rw-r--r--program/include/rcmail_html_page.php2
-rw-r--r--program/include/rcmail_install.php776
-rw-r--r--program/include/rcmail_output.php2
-rw-r--r--program/include/rcmail_output_html.php190
-rw-r--r--program/include/rcmail_output_json.php2
-rw-r--r--program/include/rcmail_string_replacer.php2
-rw-r--r--program/js/app.js1268
-rw-r--r--program/js/common.js144
-rw-r--r--program/js/editor.js46
-rw-r--r--program/js/googiespell.js63
-rw-r--r--program/js/jquery.min.js38
-rw-r--r--program/js/jstz.min.js35
-rw-r--r--program/js/list.js141
-rw-r--r--program/js/treelist.js337
-rw-r--r--program/lib/Mail/mime.php27
-rw-r--r--program/lib/Mail/mimePart.php9
-rw-r--r--program/lib/Roundcube/bootstrap.php4
-rw-r--r--program/lib/Roundcube/html.php14
-rw-r--r--program/lib/Roundcube/rcube.php121
-rw-r--r--program/lib/Roundcube/rcube_browser.php16
-rw-r--r--program/lib/Roundcube/rcube_cache.php35
-rw-r--r--program/lib/Roundcube/rcube_charset.php11
-rw-r--r--program/lib/Roundcube/rcube_config.php14
-rw-r--r--program/lib/Roundcube/rcube_csv2vcard.php2
-rw-r--r--program/lib/Roundcube/rcube_db.php83
-rw-r--r--program/lib/Roundcube/rcube_db_mssql.php20
-rw-r--r--program/lib/Roundcube/rcube_db_mysql.php11
-rw-r--r--program/lib/Roundcube/rcube_db_pgsql.php25
-rw-r--r--program/lib/Roundcube/rcube_db_sqlsrv.php121
-rw-r--r--program/lib/Roundcube/rcube_html2text.php9
-rw-r--r--program/lib/Roundcube/rcube_image.php120
-rw-r--r--program/lib/Roundcube/rcube_imap.php459
-rw-r--r--program/lib/Roundcube/rcube_imap_cache.php5
-rw-r--r--program/lib/Roundcube/rcube_imap_generic.php113
-rw-r--r--program/lib/Roundcube/rcube_imap_search.php231
-rw-r--r--program/lib/Roundcube/rcube_ldap.php19
-rw-r--r--program/lib/Roundcube/rcube_ldap_generic.php14
-rw-r--r--program/lib/Roundcube/rcube_message.php5
-rw-r--r--program/lib/Roundcube/rcube_message_header.php9
-rw-r--r--program/lib/Roundcube/rcube_mime.php30
-rw-r--r--program/lib/Roundcube/rcube_output.php12
-rw-r--r--program/lib/Roundcube/rcube_plugin.php8
-rw-r--r--program/lib/Roundcube/rcube_plugin_api.php6
-rw-r--r--program/lib/Roundcube/rcube_result_index.php21
-rw-r--r--program/lib/Roundcube/rcube_result_multifolder.php337
-rw-r--r--program/lib/Roundcube/rcube_result_set.php30
-rw-r--r--program/lib/Roundcube/rcube_result_thread.php4
-rw-r--r--program/lib/Roundcube/rcube_session.php12
-rw-r--r--program/lib/Roundcube/rcube_smtp.php14
-rw-r--r--program/lib/Roundcube/rcube_spellcheck_googie.php4
-rw-r--r--program/lib/Roundcube/rcube_spellchecker.php2
-rw-r--r--program/lib/Roundcube/rcube_storage.php98
-rw-r--r--program/lib/Roundcube/rcube_string_replacer.php2
-rw-r--r--program/lib/Roundcube/rcube_text2html.php307
-rw-r--r--program/lib/Roundcube/rcube_user.php5
-rw-r--r--program/lib/Roundcube/rcube_utils.php75
-rw-r--r--program/lib/Roundcube/rcube_vcard.php5
-rw-r--r--program/lib/Roundcube/rcube_washtml.php111
-rw-r--r--program/localization/ar/labels.inc123
-rw-r--r--program/localization/ar_SA/labels.inc50
-rw-r--r--program/localization/ar_SA/messages.inc27
-rw-r--r--program/localization/ast/messages.inc3
-rw-r--r--program/localization/az_AZ/labels.inc1
-rw-r--r--program/localization/az_AZ/messages.inc5
-rw-r--r--program/localization/be_BE/labels.inc1
-rw-r--r--program/localization/be_BE/messages.inc5
-rw-r--r--program/localization/bg_BG/labels.inc11
-rw-r--r--program/localization/bg_BG/messages.inc7
-rw-r--r--program/localization/bn_BD/messages.inc3
-rw-r--r--program/localization/br/labels.inc23
-rw-r--r--program/localization/br/messages.inc3
-rw-r--r--program/localization/bs_BA/labels.inc1
-rw-r--r--program/localization/bs_BA/messages.inc5
-rw-r--r--program/localization/ca_ES/labels.inc15
-rw-r--r--program/localization/ca_ES/messages.inc5
-rw-r--r--program/localization/cs_CZ/labels.inc1
-rw-r--r--program/localization/cs_CZ/messages.inc3
-rw-r--r--program/localization/cy_GB/labels.inc14
-rw-r--r--program/localization/cy_GB/messages.inc16
-rw-r--r--program/localization/da_DK/labels.inc1
-rw-r--r--program/localization/da_DK/messages.inc3
-rw-r--r--program/localization/de_CH/csv2vcard.inc110
-rw-r--r--program/localization/de_CH/labels.inc1
-rw-r--r--program/localization/de_CH/messages.inc3
-rw-r--r--program/localization/de_DE/csv2vcard.inc110
-rw-r--r--program/localization/de_DE/labels.inc16
-rw-r--r--program/localization/de_DE/messages.inc11
-rw-r--r--program/localization/el_GR/labels.inc18
-rw-r--r--program/localization/el_GR/messages.inc202
-rw-r--r--program/localization/en_CA/messages.inc3
-rw-r--r--program/localization/en_GB/labels.inc35
-rw-r--r--program/localization/en_GB/messages.inc20
-rw-r--r--program/localization/en_US/labels.inc5
-rw-r--r--program/localization/en_US/messages.inc9
-rw-r--r--program/localization/eo/messages.inc3
-rw-r--r--program/localization/es_419/messages.inc2
-rw-r--r--program/localization/es_AR/messages.inc3
-rw-r--r--program/localization/es_ES/labels.inc3
-rw-r--r--program/localization/es_ES/messages.inc6
-rw-r--r--program/localization/et_EE/messages.inc3
-rw-r--r--program/localization/eu_ES/labels.inc18
-rw-r--r--program/localization/eu_ES/messages.inc9
-rw-r--r--program/localization/fa_AF/messages.inc3
-rw-r--r--program/localization/fa_IR/labels.inc56
-rw-r--r--program/localization/fa_IR/messages.inc37
-rw-r--r--program/localization/fi_FI/labels.inc1
-rw-r--r--program/localization/fi_FI/messages.inc5
-rw-r--r--program/localization/fo_FO/labels.inc497
-rw-r--r--program/localization/fo_FO/messages.inc177
-rw-r--r--program/localization/fr_FR/labels.inc320
-rw-r--r--program/localization/fr_FR/messages.inc264
-rw-r--r--program/localization/ga_IE/messages.inc3
-rw-r--r--program/localization/gl_ES/messages.inc3
-rw-r--r--program/localization/he_IL/labels.inc18
-rw-r--r--program/localization/he_IL/messages.inc9
-rw-r--r--program/localization/hi_IN/messages.inc3
-rw-r--r--program/localization/hr_HR/labels.inc315
-rw-r--r--program/localization/hr_HR/messages.inc240
-rw-r--r--program/localization/hu_HU/labels.inc1
-rw-r--r--program/localization/hu_HU/messages.inc5
-rw-r--r--program/localization/hy_AM/labels.inc29
-rw-r--r--program/localization/hy_AM/messages.inc3
-rw-r--r--program/localization/ia/messages.inc2
-rw-r--r--program/localization/id_ID/messages.inc3
-rw-r--r--program/localization/index.inc9
-rw-r--r--program/localization/is_IS/messages.inc3
-rw-r--r--program/localization/it_IT/csv2vcard.inc110
-rw-r--r--program/localization/it_IT/labels.inc1
-rw-r--r--program/localization/it_IT/messages.inc5
-rw-r--r--program/localization/ja_JP/labels.inc1
-rw-r--r--program/localization/ja_JP/messages.inc3
-rw-r--r--program/localization/ka_GE/messages.inc3
-rw-r--r--program/localization/km_KH/labels.inc70
-rw-r--r--program/localization/km_KH/messages.inc31
-rw-r--r--program/localization/kn_IN/labels.inc166
-rw-r--r--program/localization/kn_IN/messages.inc54
-rw-r--r--program/localization/ko_KR/labels.inc24
-rw-r--r--program/localization/ko_KR/messages.inc53
-rw-r--r--program/localization/ku/messages.inc3
-rw-r--r--program/localization/lb_LU/labels.inc11
-rw-r--r--program/localization/lb_LU/messages.inc6
-rw-r--r--program/localization/lt_LT/messages.inc3
-rw-r--r--program/localization/lv_LV/labels.inc6
-rw-r--r--program/localization/lv_LV/messages.inc4
-rw-r--r--program/localization/mk_MK/messages.inc3
-rw-r--r--program/localization/ml_IN/messages.inc2
-rw-r--r--program/localization/mr_IN/messages.inc3
-rw-r--r--program/localization/ms_MY/messages.inc3
-rw-r--r--program/localization/nb_NO/labels.inc26
-rw-r--r--program/localization/nb_NO/messages.inc16
-rw-r--r--program/localization/ne_NP/messages.inc3
-rw-r--r--program/localization/nl_BE/messages.inc3
-rw-r--r--program/localization/nl_NL/labels.inc1
-rw-r--r--program/localization/nl_NL/messages.inc5
-rw-r--r--program/localization/nn_NO/messages.inc3
-rw-r--r--program/localization/pl_PL/labels.inc14
-rw-r--r--program/localization/pl_PL/messages.inc8
-rw-r--r--program/localization/ps/messages.inc3
-rw-r--r--program/localization/pt_BR/labels.inc1
-rw-r--r--program/localization/pt_BR/messages.inc3
-rw-r--r--program/localization/pt_PT/labels.inc1
-rw-r--r--program/localization/pt_PT/messages.inc3
-rw-r--r--program/localization/ro_RO/labels.inc14
-rw-r--r--program/localization/ro_RO/messages.inc4
-rw-r--r--program/localization/ru_RU/labels.inc1
-rw-r--r--program/localization/ru_RU/messages.inc5
-rw-r--r--program/localization/si_LK/messages.inc3
-rw-r--r--program/localization/sk_SK/csv2vcard.inc9
-rw-r--r--program/localization/sk_SK/labels.inc179
-rw-r--r--program/localization/sk_SK/messages.inc65
-rw-r--r--program/localization/sl_SI/labels.inc8
-rw-r--r--program/localization/sl_SI/messages.inc4
-rw-r--r--program/localization/sq_AL/messages.inc3
-rw-r--r--program/localization/sr_CS/messages.inc3
-rw-r--r--program/localization/sv_SE/labels.inc39
-rw-r--r--program/localization/sv_SE/messages.inc125
-rw-r--r--program/localization/ta_IN/messages.inc3
-rw-r--r--program/localization/th_TH/messages.inc3
-rw-r--r--program/localization/ti/labels.inc62
-rw-r--r--program/localization/ti/messages.inc (renamed from program/localization/fy_NL/messages.inc)8
-rw-r--r--program/localization/tr_TR/labels.inc1
-rw-r--r--program/localization/tr_TR/messages.inc51
-rw-r--r--program/localization/uk_UA/messages.inc5
-rw-r--r--program/localization/ur_PK/messages.inc18
-rw-r--r--program/localization/vi_VN/labels.inc33
-rw-r--r--program/localization/vi_VN/messages.inc20
-rw-r--r--program/localization/zh_CN/labels.inc23
-rw-r--r--program/localization/zh_CN/messages.inc9
-rw-r--r--program/localization/zh_TW/labels.inc72
-rw-r--r--program/localization/zh_TW/messages.inc19
-rw-r--r--program/steps/addressbook/copy.inc6
-rw-r--r--program/steps/addressbook/func.inc2
-rw-r--r--program/steps/addressbook/import.inc7
-rw-r--r--program/steps/addressbook/move.inc6
-rw-r--r--program/steps/addressbook/save.inc4
-rw-r--r--program/steps/mail/autocomplete.inc9
-rw-r--r--program/steps/mail/check_recent.inc34
-rw-r--r--program/steps/mail/compose.inc122
-rw-r--r--program/steps/mail/copy.inc11
-rw-r--r--program/steps/mail/func.inc336
-rw-r--r--program/steps/mail/get.inc6
-rw-r--r--program/steps/mail/import.inc115
-rw-r--r--program/steps/mail/list.inc16
-rw-r--r--program/steps/mail/list_contacts.inc48
-rw-r--r--program/steps/mail/mark.inc20
-rw-r--r--program/steps/mail/move_del.inc44
-rw-r--r--program/steps/mail/search.inc61
-rw-r--r--program/steps/mail/search_contacts.inc12
-rw-r--r--program/steps/mail/sendmail.inc45
-rw-r--r--program/steps/mail/show.inc2
-rw-r--r--program/steps/mail/viewsource.inc4
-rw-r--r--program/steps/settings/edit_folder.inc1
-rw-r--r--program/steps/settings/edit_identity.inc2
-rw-r--r--program/steps/settings/edit_prefs.inc4
-rw-r--r--program/steps/settings/edit_response.inc2
-rw-r--r--program/steps/settings/folders.inc23
-rw-r--r--program/steps/settings/func.inc37
-rw-r--r--program/steps/settings/responses.inc2
-rw-r--r--program/steps/settings/save_identity.inc4
-rw-r--r--program/steps/settings/save_prefs.inc28
-rw-r--r--program/steps/utils/html2text.inc7
-rw-r--r--program/steps/utils/modcss.inc54
-rw-r--r--program/steps/utils/spell.inc3
-rw-r--r--program/steps/utils/text2html.inc33
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) . ':&nbsp; <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) . ':&nbsp; <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) . ':&nbsp; <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) . ':&nbsp; <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;">&nbsp;&nbsp;</span>';
+ tree += '<span id="rcmtab' + msg_id + '" class="branch" style="width:' + (message.depth * 15) + 'px;">&nbsp;&nbsp;</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') + '">&nbsp;&nbsp;</div>';
+ expando = '<div id="rcmexpando' + row.id + '" class="' + (message.expanded ? 'expanded' : 'collapsed') + '">&nbsp;&nbsp;</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+'">&nbsp;</span>';
+ tree += '<span id="msgicn'+row.id+'" class="'+css_class+'">&nbsp;</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+'">&nbsp;</span>';
+ html = '<span id="flagicn'+row.id+'" class="'+css_class+'">&nbsp;</span>';
}
else if (c == 'attachment') {
- if (/application\/|multipart\/(m|signed)/.test(flags.ctype))
+ if (flags.attachmentClass)
+ html = '<span class="'+flags.attachmentClass+'">&nbsp;</span>';
+ else if (/application\/|multipart\/(m|signed)/.test(flags.ctype))
html = '<span class="attachment">&nbsp;</span>';
else if (/multipart\/report/.test(flags.ctype))
html = '<span class="report">&nbsp;</span>';
@@ -1923,16 +1981,13 @@ function rcube_webmail()
css_class = 'unreadchildren';
else
css_class = 'msgicon';
- html = '<span id="statusicn'+uid+'" class="'+css_class+'">&nbsp;</span>';
+ html = '<span id="statusicn'+row.id+'" class="'+css_class+'">&nbsp;</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 = '&nbsp;';
}
+ 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, '&lt;').replace(/>/g, '&gt;').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(/<[^>]+>|&nbsp;|\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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
- $('#'+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') + '">&nbsp;</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, '-&#8288;', '/&#8288;'), $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 .= '&nbsp;';
+ $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 .= '&nbsp;';
+ $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">&nbsp;</span>';
+ $col_name = html::span('flagged', '&nbsp;');
break;
case 'attachment':
case 'priority':
case 'status':
- $col_name = '<span class="' . $col .'">&nbsp;</span>';
+ $col_name = html::span($col, '&nbsp;');
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']) . '&nbsp;' . html::span('action', '&raquo;'))),
+ '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']) . '&nbsp;' . html::span('action', '&raquo;'))),
- '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').':&nbsp;' . $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;