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.php20
-rw-r--r--program/include/rcmail_output_html.php1
-rw-r--r--program/js/app.js44
-rw-r--r--program/js/common.js12
-rw-r--r--program/js/list.js31
-rw-r--r--program/lib/Roundcube/bootstrap.php19
-rw-r--r--program/lib/Roundcube/html.php14
-rw-r--r--program/lib/Roundcube/rcube.php26
-rw-r--r--program/lib/Roundcube/rcube_contacts.php4
-rw-r--r--program/lib/Roundcube/rcube_db.php45
-rw-r--r--program/lib/Roundcube/rcube_db_pgsql.php15
-rw-r--r--program/lib/Roundcube/rcube_image.php4
-rw-r--r--program/lib/Roundcube/rcube_imap.php3
-rw-r--r--program/lib/Roundcube/rcube_imap_generic.php61
-rw-r--r--program/lib/Roundcube/rcube_message.php37
-rw-r--r--program/lib/Roundcube/rcube_message_header.php7
-rw-r--r--program/lib/Roundcube/rcube_mime.php178
-rw-r--r--program/lib/Roundcube/rcube_plugin.php18
-rw-r--r--program/lib/Roundcube/rcube_plugin_api.php120
-rw-r--r--program/lib/Roundcube/rcube_session.php28
-rw-r--r--program/lib/Roundcube/rcube_string_replacer.php4
-rw-r--r--program/lib/Roundcube/rcube_utils.php16
-rw-r--r--program/lib/Roundcube/rcube_vcard.php4
-rw-r--r--program/localization/ar_SA/labels.inc4
-rw-r--r--program/localization/ast/labels.inc4
-rw-r--r--program/localization/az_AZ/labels.inc14
-rw-r--r--program/localization/az_AZ/messages.inc24
-rw-r--r--program/localization/be_BE/labels.inc4
-rw-r--r--program/localization/bg_BG/labels.inc4
-rw-r--r--program/localization/bn_BD/labels.inc4
-rw-r--r--program/localization/br/labels.inc4
-rw-r--r--program/localization/bs_BA/labels.inc4
-rw-r--r--program/localization/ca_ES/labels.inc4
-rw-r--r--program/localization/cs_CZ/labels.inc4
-rw-r--r--program/localization/cy_GB/labels.inc4
-rw-r--r--program/localization/da_DK/labels.inc4
-rw-r--r--program/localization/de_CH/labels.inc4
-rw-r--r--program/localization/de_DE/labels.inc4
-rw-r--r--program/localization/el_GR/labels.inc4
-rw-r--r--program/localization/en_GB/labels.inc4
-rw-r--r--program/localization/en_US/labels.inc4
-rw-r--r--program/localization/eo/labels.inc4
-rw-r--r--program/localization/es_AR/labels.inc216
-rw-r--r--program/localization/es_ES/labels.inc10
-rw-r--r--program/localization/et_EE/labels.inc4
-rw-r--r--program/localization/eu_ES/labels.inc4
-rw-r--r--program/localization/fa_AF/labels.inc4
-rw-r--r--program/localization/fa_IR/labels.inc14
-rw-r--r--program/localization/fi_FI/labels.inc9
-rw-r--r--program/localization/fr_FR/labels.inc4
-rw-r--r--program/localization/fy_NL/labels.inc4
-rwxr-xr-xprogram/localization/ga_IE/labels.inc4
-rw-r--r--program/localization/gl_ES/labels.inc4
-rw-r--r--program/localization/he_IL/labels.inc4
-rw-r--r--program/localization/hi_IN/labels.inc4
-rw-r--r--program/localization/hr_HR/labels.inc4
-rw-r--r--program/localization/hu_HU/labels.inc4
-rw-r--r--program/localization/hy_AM/labels.inc4
-rw-r--r--program/localization/ia/labels.inc4
-rw-r--r--program/localization/id_ID/labels.inc4
-rw-r--r--program/localization/is_IS/labels.inc4
-rw-r--r--program/localization/it_IT/labels.inc8
-rw-r--r--program/localization/ja_JP/labels.inc4
-rwxr-xr-xprogram/localization/ka_GE/labels.inc4
-rw-r--r--program/localization/km_KH/labels.inc4
-rw-r--r--program/localization/ko_KR/labels.inc4
-rw-r--r--program/localization/ku/labels.inc4
-rw-r--r--program/localization/lt_LT/labels.inc4
-rw-r--r--program/localization/lv_LV/labels.inc4
-rwxr-xr-xprogram/localization/mk_MK/labels.inc4
-rw-r--r--program/localization/ml_IN/labels.inc4
-rwxr-xr-xprogram/localization/mr_IN/labels.inc4
-rw-r--r--program/localization/ms_MY/labels.inc4
-rw-r--r--program/localization/nb_NO/labels.inc17
-rw-r--r--program/localization/ne_NP/labels.inc4
-rw-r--r--program/localization/nl_BE/labels.inc4
-rw-r--r--program/localization/nl_NL/labels.inc4
-rw-r--r--program/localization/nn_NO/labels.inc11
-rw-r--r--program/localization/pl_PL/labels.inc4
-rwxr-xr-xprogram/localization/ps/labels.inc4
-rw-r--r--program/localization/pt_BR/labels.inc4
-rw-r--r--program/localization/pt_PT/labels.inc4
-rw-r--r--program/localization/ro_RO/labels.inc4
-rw-r--r--program/localization/ru_RU/labels.inc4
-rw-r--r--program/localization/si_LK/labels.inc4
-rw-r--r--program/localization/sk_SK/labels.inc4
-rw-r--r--program/localization/sl_SI/labels.inc4
-rw-r--r--program/localization/sq_AL/labels.inc4
-rw-r--r--program/localization/sr_CS/labels.inc4
-rw-r--r--program/localization/sv_SE/labels.inc4
-rw-r--r--program/localization/ta_IN/labels.inc4
-rw-r--r--program/localization/th_TH/labels.inc4
-rw-r--r--program/localization/tr_TR/labels.inc4
-rw-r--r--program/localization/uk_UA/labels.inc4
-rw-r--r--program/localization/vi_VN/labels.inc11
-rw-r--r--program/localization/zh_CN/labels.inc4
-rw-r--r--program/localization/zh_TW/labels.inc4
-rw-r--r--program/resources/blank.pdfbin0 -> 921 bytes
-rw-r--r--program/steps/addressbook/export.inc4
-rw-r--r--program/steps/addressbook/import.inc11
-rw-r--r--program/steps/addressbook/save.inc2
-rw-r--r--program/steps/mail/compose.inc20
-rw-r--r--program/steps/mail/copy.inc8
-rw-r--r--program/steps/mail/func.inc23
-rw-r--r--program/steps/mail/get.inc53
-rw-r--r--program/steps/mail/mark.inc10
-rw-r--r--program/steps/mail/move_del.inc2
-rw-r--r--program/steps/mail/sendmail.inc44
-rw-r--r--program/steps/mail/show.inc2
-rw-r--r--program/steps/settings/about.inc67
-rw-r--r--program/steps/settings/edit_folder.inc2
-rw-r--r--program/steps/settings/func.inc15
-rw-r--r--program/steps/settings/save_prefs.inc3
-rw-r--r--program/steps/utils/save_pref.inc16
115 files changed, 911 insertions, 674 deletions
diff --git a/program/include/bc.php b/program/include/bc.php
index d8356338d..df018320c 100644
--- a/program/include/bc.php
+++ b/program/include/bc.php
@@ -287,7 +287,7 @@ function rcmail_remote_ip()
function rcube_check_referer()
{
- return rcmail::check_referer();
+ return rcube_utils::check_referer();
}
function rcube_timer()
diff --git a/program/include/iniset.php b/program/include/iniset.php
index b32ae4e8e..919cc7682 100644
--- a/program/include/iniset.php
+++ b/program/include/iniset.php
@@ -24,21 +24,6 @@
define('RCMAIL_VERSION', '1.0-git');
define('RCMAIL_START', microtime(true));
-$config = array(
- // Some users are not using Installer, so we'll check some
- // critical PHP settings here. Only these, which doesn't provide
- // an error/warning in the logs later. See (#1486307).
- 'suhosin.session.encrypt' => 0,
- 'session.auto_start' => 0,
- 'file_uploads' => 1,
-);
-foreach ($config as $optname => $optval) {
- if ($optval != ini_get($optname) && @ini_set($optname, $optval) === false) {
- die("ERROR: Wrong '$optname' option value and it wasn't possible to set it to required value ($optval).\n"
- ."Check your PHP configuration (including php_admin_flag).");
- }
-}
-
if (!defined('INSTALL_PATH')) {
define('INSTALL_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/');
}
@@ -75,6 +60,11 @@ require_once 'Roundcube/bootstrap.php';
// register autoloader for rcmail app classes
spl_autoload_register('rcmail_autoload');
+// include composer autoloader (if available)
+if (file_exists('vendor/autoload.php')) {
+ require 'vendor/autoload.php';
+}
+
// backward compatybility (to be removed)
require_once INSTALL_PATH . 'program/include/bc.php';
diff --git a/program/include/rcmail_output_html.php b/program/include/rcmail_output_html.php
index 6100269b9..d8996edbf 100644
--- a/program/include/rcmail_output_html.php
+++ b/program/include/rcmail_output_html.php
@@ -873,6 +873,7 @@ class rcmail_output_html extends rcmail_output
// include a file
case 'include':
$old_base_path = $this->base_path;
+ if (!empty($attrib['skin_path'])) $attrib['skinpath'] = $attrib['skin_path'];
if ($path = $this->get_skin_file($attrib['file'], $skin_path, $attrib['skinpath'])) {
$this->base_path = preg_replace('!plugins/\w+/!', '', $skin_path); // set base_path to core skin directory (not plugin's skin)
$path = realpath($path);
diff --git a/program/js/app.js b/program/js/app.js
index 0f1a72448..58810c24a 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -314,7 +314,7 @@ function rcube_webmail()
}
// detect browser capabilities
- if (!this.is_framed())
+ if (!this.is_framed() && !this.env.extwin)
this.browser_capabilities_check();
break;
@@ -980,8 +980,8 @@ function rcube_webmail()
// Reset the auto-save timer
clearTimeout(this.save_timer);
- // compose form did not change
- if (this.cmp_hash == this.compose_field_hash()) {
+ // compose form did not change (and draft wasn't saved already)
+ if (this.env.draft_id && this.cmp_hash == this.compose_field_hash()) {
this.auto_save_start();
break;
}
@@ -1637,7 +1637,7 @@ function rcube_webmail()
l = (screen.width - w) / 2 + (screen.left || 0),
t = Math.max(0, (screen.height - h) / 2 + (screen.top || 0) - 20),
wname = 'rcmextwin' + new Date().getTime(),
- extwin = window.open(url + '&_extwin=1', wname,
+ extwin = window.open(url + (url.match(/\?/) ? '&' : '?') + '_extwin=1', wname,
'width='+w+',height='+h+',top='+t+',left='+l+',resizable=yes,toolbar=no,status=no,location=no');
// write loading... message to empty windows
@@ -3297,6 +3297,15 @@ function rcube_webmail()
this.set_draft_id = function(id)
{
+ var rc;
+
+ if (!this.env.draft_id && id && (rc = this.opener())) {
+ // refresh the drafts folder in opener window
+ if (rc.env.task == 'mail' && rc.env.action == '' && rc.env.mailbox == this.env.drafts_mailbox)
+ rc.command('checkmail');
+ }
+
+ this.env.draft_id = id;
$("input[name='_draft_saveid']").val(id);
};
@@ -3362,7 +3371,7 @@ function rcube_webmail()
sig = this.env.signatures[sig].text;
sig = sig.replace(/\r\n/g, '\n');
- p = this.env.sig_above ? message.indexOf(sig) : message.lastIndexOf(sig);
+ p = this.env.top_posting ? message.indexOf(sig) : message.lastIndexOf(sig);
if (p >= 0)
message = message.substring(0, p) + message.substring(p+sig.length, message.length);
}
@@ -3371,7 +3380,7 @@ function rcube_webmail()
sig = this.env.signatures[id].text;
sig = sig.replace(/\r\n/g, '\n');
- if (this.env.sig_above) {
+ if (this.env.top_posting) {
if (p >= 0) { // in place of removed signature
message = message.substring(0, p) + sig + message.substring(p, message.length);
cursor_pos = p - 1;
@@ -3415,7 +3424,7 @@ function rcube_webmail()
sigElem = doc.createElement('div');
sigElem.setAttribute('id', '_rc_sig');
- if (this.env.sig_above) {
+ if (this.env.top_posting) {
// if no existing sig and top posting then insert at caret pos
editor.getWin().focus(); // correct focus in IE & Chrome
@@ -3672,15 +3681,19 @@ function rcube_webmail()
this.env.search_id = null;
};
- this.sent_successfully = function(type, msg)
+ this.sent_successfully = function(type, msg, target)
{
this.display_message(msg, type);
if (this.env.extwin) {
- var opener_rc = this.opener();
+ var rc = this.opener();
this.lock_form(this.gui_objects.messageform);
- if (opener_rc)
- opener_rc.display_message(msg, type);
+ if (rc) {
+ rc.display_message(msg, type);
+ // refresh the folder where sent message was saved
+ if (target && rc.env.task == 'mail' && rc.env.action == '' && rc.env.mailbox == target)
+ rc.command('checkmail');
+ }
setTimeout(function(){ window.close() }, 1000);
}
else {
@@ -6708,6 +6721,15 @@ function rcube_webmail()
return 1;
}
+ // this will detect any pdf plugin including PDF.js in Firefox
+ var obj = document.createElement('OBJECT');
+ obj.onload = function() { rcmail.env.browser_capabilities.pdf = 1; };
+ obj.onerror = function() { rcmail.env.browser_capabilities.pdf = 0; };
+ obj.style.display = 'none';
+ obj.type = 'application/pdf';
+ obj.data = 'program/resources/blank.pdf';
+ document.body.appendChild(obj);
+
return 0;
};
diff --git a/program/js/common.js b/program/js/common.js
index f9e945c05..f7c0a7536 100644
--- a/program/js/common.js
+++ b/program/js/common.js
@@ -717,13 +717,15 @@ if (bw.ie) {
// jQuery plugin to emulate HTML5 placeholder attributes on input elements
jQuery.fn.placeholder = function(text) {
return this.each(function() {
- var elem = $(this);
+ var active = false, elem = $(this);
this.title = text;
+ // Try HTML5 placeholder attribute first
if ('placeholder' in this) {
- elem.attr('placeholder', text); // Try HTML5 placeholder attribute first
+ elem.attr('placeholder', text);
}
- else { // Fallback to Javascript emulation of placeholder
+ // Fallback to Javascript emulation of placeholder
+ else {
this._placeholder = text;
elem.blur(function(e) {
if ($.trim(elem.val()) == "")
@@ -740,7 +742,9 @@ jQuery.fn.placeholder = function(text) {
elem[(active ? 'addClass' : 'removeClass')]('placeholder').attr('spellcheck', active);
});
- if (this != document.activeElement) // Do not blur currently focused element
+ // Do not blur currently focused element (catch exception: #1489008)
+ try { active = this == document.activeElement; } catch(e) {}
+ if (!active)
elem.blur();
}
});
diff --git a/program/js/list.js b/program/js/list.js
index 9a531eaea..c6b0d3fb8 100644
--- a/program/js/list.js
+++ b/program/js/list.js
@@ -231,7 +231,8 @@ focus: function(e)
// Un-focus already focused elements (#1487123, #1487316, #1488600, #1488620)
$(':focus:not(body)').blur();
- $('iframe').each(function() { this.blur(); });
+ // un-focus iframe bodies (#1489058), this doesn't work in Opera and Chrome
+ $('iframe').contents().find('body').blur();
if (e || (e = window.event))
rcube_event.cancel(e);
@@ -779,10 +780,16 @@ shift_select: function(id, control)
if (!this.rows[this.shift_start] || !this.selection.length)
this.shift_start = id;
- var n, from_rowIndex = this.rows[this.shift_start].obj.rowIndex,
- to_rowIndex = this.rows[id].obj.rowIndex,
- i = ((from_rowIndex < to_rowIndex)? from_rowIndex : to_rowIndex),
- j = ((from_rowIndex > to_rowIndex)? from_rowIndex : to_rowIndex);
+ var n, i, j, to_row = this.rows[id],
+ from_rowIndex = this.rows[this.shift_start].obj.rowIndex,
+ to_rowIndex = to_row.obj.rowIndex;
+
+ if (!to_row.expanded && to_row.has_children)
+ if (to_row = this.rows[(this.row_children(id)).pop()])
+ to_rowIndex = to_row.obj.rowIndex;
+
+ i = ((from_rowIndex < to_rowIndex) ? from_rowIndex : to_rowIndex),
+ j = ((from_rowIndex > to_rowIndex) ? from_rowIndex : to_rowIndex);
// iterate through the entire message list
for (n in this.rows) {
@@ -828,7 +835,7 @@ select_all: function(filter)
for (n in this.rows) {
if (!filter || this.rows[n][filter] == true) {
this.last_selected = n;
- this.highlight_row(n, true);
+ this.highlight_row(n, true, true);
}
else {
$(this.rows[n].obj).removeClass('selected').removeClass('unfocused');
@@ -923,7 +930,7 @@ get_single_selection: function()
/**
* Highlight/unhighlight a row
*/
-highlight_row: function(id, multiple)
+highlight_row: function(id, multiple, norecur)
{
if (!this.rows[id])
return;
@@ -939,7 +946,7 @@ highlight_row: function(id, multiple)
if (!this.in_selection(id)) { // select row
this.selection.push(id);
$(this.rows[id].obj).addClass('selected');
- if (!this.rows[id].expanded)
+ if (!norecur && !this.rows[id].expanded)
this.highlight_children(id, true);
}
else { // unselect row
@@ -949,7 +956,7 @@ highlight_row: function(id, multiple)
this.selection = a_pre.concat(a_post);
$(this.rows[id].obj).removeClass('selected').removeClass('unfocused');
- if (!this.rows[id].expanded)
+ if (!norecur && !this.rows[id].expanded)
this.highlight_children(id, false);
}
}
@@ -967,7 +974,7 @@ highlight_children: function(id, status)
for (i=0; i<len; i++) {
selected = this.in_selection(children[i]);
if ((status && !selected) || (!status && selected))
- this.highlight_row(children[i], true);
+ this.highlight_row(children[i], true, true);
}
},
@@ -1228,7 +1235,7 @@ drag_mouse_up: function(e)
// remove temp divs
this.del_dragfix();
- this.triggerEvent('dragend');
+ this.triggerEvent('dragend', e);
return rcube_event.cancel(e);
},
@@ -1341,7 +1348,7 @@ column_drag_mouse_up: function(e)
}
}
- this.triggerEvent('column_dragend');
+ this.triggerEvent('column_dragend', e);
return rcube_event.cancel(e);
},
diff --git a/program/lib/Roundcube/bootstrap.php b/program/lib/Roundcube/bootstrap.php
index 0640a9448..b7e69cb2a 100644
--- a/program/lib/Roundcube/bootstrap.php
+++ b/program/lib/Roundcube/bootstrap.php
@@ -31,16 +31,25 @@ $config = array(
// critical PHP settings here. Only these, which doesn't provide
// an error/warning in the logs later. See (#1486307).
'mbstring.func_overload' => 0,
- 'suhosin.session.encrypt' => 0,
- 'session.auto_start' => 0,
- 'file_uploads' => 1,
'magic_quotes_runtime' => 0,
'magic_quotes_sybase' => 0, // #1488506
);
+
+// check these additional ini settings if not called via CLI
+if (php_sapi_name() != 'cli') {
+ $config += array(
+ 'suhosin.session.encrypt' => 0,
+ 'session.auto_start' => 0,
+ 'file_uploads' => 1,
+ );
+}
+
foreach ($config as $optname => $optval) {
if ($optval != ini_get($optname) && @ini_set($optname, $optval) === false) {
- die("ERROR: Wrong '$optname' option value and it wasn't possible to set it to required value ($optval).\n"
- ."Check your PHP configuration (including php_admin_flag).");
+ $error = "ERROR: Wrong '$optname' option value and it wasn't possible to set it to required value ($optval).\n"
+ . "Check your PHP configuration (including php_admin_flag).";
+ if (defined('STDERR')) fwrite(STDERR, $error); else echo $error;
+ exit(1);
}
}
diff --git a/program/lib/Roundcube/html.php b/program/lib/Roundcube/html.php
index 592720308..dbc9ca51f 100644
--- a/program/lib/Roundcube/html.php
+++ b/program/lib/Roundcube/html.php
@@ -35,6 +35,7 @@ class html
public static $common_attrib = array('id','class','style','title','align');
public static $containers = array('iframe','div','span','p','h1','h2','h3','form','textarea','table','thead','tbody','tr','th','td','style','script');
+
/**
* Constructor
*
@@ -217,7 +218,7 @@ class html
$attr = array('src' => $attr);
}
return self::tag('iframe', $attr, $cont, array_merge(self::$common_attrib,
- array('src','name','width','height','border','frameborder')));
+ array('src','name','width','height','border','frameborder','onload')));
}
/**
@@ -332,7 +333,16 @@ class html
*/
public static function quote($str)
{
- return @htmlspecialchars($str, ENT_COMPAT, RCUBE_CHARSET);
+ static $flags;
+
+ if (!$flags) {
+ $flags = ENT_COMPAT;
+ if (defined('ENT_SUBSTITUTE')) {
+ $flags |= ENT_SUBSTITUTE;
+ }
+ }
+
+ return @htmlspecialchars($str, $flags, RCUBE_CHARSET);
}
}
diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php
index 3ae511e1e..b681f0531 100644
--- a/program/lib/Roundcube/rcube.php
+++ b/program/lib/Roundcube/rcube.php
@@ -405,6 +405,7 @@ class rcube
$sess_domain = $this->config->get('session_domain');
$sess_path = $this->config->get('session_path');
$lifetime = $this->config->get('session_lifetime', 0) * 60;
+ $is_secure = $this->config->get('use_https') || rcube_utils::https_check();
// set session domain
if ($sess_domain) {
@@ -419,7 +420,7 @@ class rcube
ini_set('session.gc_maxlifetime', $lifetime * 2);
}
- ini_set('session.cookie_secure', rcube_utils::https_check());
+ ini_set('session.cookie_secure', $is_secure);
ini_set('session.name', $sess_name ? $sess_name : 'roundcube_sessid');
ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);
@@ -1081,6 +1082,9 @@ class rcube
'message' => $arg->getMessage(),
);
}
+ else if (is_string($arg)) {
+ $arg = array('message' => $arg, 'type' => 'php');
+ }
if (empty($arg['code'])) {
$arg['code'] = 500;
@@ -1093,14 +1097,24 @@ class rcube
return;
}
- if (($log || $terminate) && $arg['type'] && $arg['message']) {
+ $cli = php_sapi_name() == 'cli';
+
+ if (($log || $terminate) && !$cli && $arg['type'] && $arg['message']) {
$arg['fatal'] = $terminate;
self::log_bug($arg);
}
- // display error page and terminate script
- if ($terminate && is_object(self::$instance->output)) {
- self::$instance->output->raise_error($arg['code'], $arg['message']);
+ // terminate script
+ if ($terminate) {
+ // display error page
+ if (is_object(self::$instance->output)) {
+ self::$instance->output->raise_error($arg['code'], $arg['message']);
+ }
+ else if ($cli) {
+ fwrite(STDERR, 'ERROR: ' . $arg['message']);
+ }
+
+ exit(1);
}
}
@@ -1139,7 +1153,7 @@ class rcube
if (!self::write_log('errors', $log_entry)) {
// send error to PHPs error handler if write_log didn't succeed
- trigger_error($arg_arr['message']);
+ trigger_error($arg_arr['message'], E_USER_WARNING);
}
}
diff --git a/program/lib/Roundcube/rcube_contacts.php b/program/lib/Roundcube/rcube_contacts.php
index c66e98687..e4fd7dc10 100644
--- a/program/lib/Roundcube/rcube_contacts.php
+++ b/program/lib/Roundcube/rcube_contacts.php
@@ -626,10 +626,6 @@ class rcube_contacts extends rcube_addressbook
$insert_id = $this->db->insert_id($this->db_name);
}
- // also add the newly created contact to the active group
- if ($insert_id && $this->group_id)
- $this->add_to_group($this->group_id, $insert_id);
-
$this->cache = null;
return $insert_id;
diff --git a/program/lib/Roundcube/rcube_db.php b/program/lib/Roundcube/rcube_db.php
index 49bbe5c6e..d86e3dd98 100644
--- a/program/lib/Roundcube/rcube_db.php
+++ b/program/lib/Roundcube/rcube_db.php
@@ -444,17 +444,20 @@ class rcube_db
*
* @param mixed $result Optional query handle
* @return mixed Number of rows or false on failure
+ * @deprecated This method shows very poor performance and should be avoided.
*/
public function num_rows($result = null)
{
if ($result || ($result === null && ($result = $this->last_result))) {
// repeat query with SELECT COUNT(*) ...
- if (preg_match('/^SELECT\s+(?:ALL\s+|DISTINCT\s+)?(?:.*?)\s+FROM\s+(.*)$/i', $result->queryString, $m)) {
+ if (preg_match('/^SELECT\s+(?:ALL\s+|DISTINCT\s+)?(?:.*?)\s+FROM\s+(.*)$/ims', $result->queryString, $m)) {
$query = $this->dbh->query('SELECT COUNT(*) FROM ' . $m[1], PDO::FETCH_NUM);
return $query ? intval($query->fetchColumn(0)) : false;
}
else {
- return count($result->fetchAll());
+ $num = count($result->fetchAll());
+ $result->execute(); // re-execute query because there's no seek(0)
+ return $num;
}
}
@@ -631,6 +634,22 @@ class rcube_db
}
/**
+ * Escapes a string so it can be safely used in a query
+ *
+ * @param string $str A string to escape
+ *
+ * @return string Escaped string for use in a query
+ */
+ public function escape($str)
+ {
+ if (is_null($str)) {
+ return 'NULL';
+ }
+
+ return substr($this->quote($str), 1, -1);
+ }
+
+ /**
* Quotes a string so it can be safely used as a table or column name
*
* @param string $str Value to quote
@@ -645,6 +664,20 @@ class rcube_db
}
/**
+ * Escapes a string so it can be safely used in a query
+ *
+ * @param string $str A string to escape
+ *
+ * @return string Escaped string for use in a query
+ * @deprecated Replaced by rcube_db::escape
+ * @see rcube_db::escape
+ */
+ public function escapeSimple($str)
+ {
+ return $this->escape($str);
+ }
+
+ /**
* Quotes a string so it can be safely used as a table or column name
*
* @param string $str Value to quote
@@ -813,11 +846,9 @@ class rcube_db
{
$rcube = rcube::get_instance();
- // return table name if configured
- $config_key = 'db_table_'.$table;
-
- if ($name = $rcube->config->get($config_key)) {
- return $name;
+ // add prefix to the table name if configured
+ if ($prefix = $rcube->config->get('db_prefix')) {
+ return $prefix . $table;
}
return $table;
diff --git a/program/lib/Roundcube/rcube_db_pgsql.php b/program/lib/Roundcube/rcube_db_pgsql.php
index cf23c5e48..adfd2207b 100644
--- a/program/lib/Roundcube/rcube_db_pgsql.php
+++ b/program/lib/Roundcube/rcube_db_pgsql.php
@@ -53,19 +53,20 @@ class rcube_db_pgsql extends rcube_db
/**
* Return correct name for a specific database sequence
*
- * @param string $sequence Secuence name
+ * @param string $table Table name
*
* @return string Translated sequence name
*/
- protected function sequence_name($sequence)
+ protected function sequence_name($table)
{
- $rcube = rcube::get_instance();
+ // 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
- $config_key = 'db_sequence_'.$sequence;
-
- if ($name = $rcube->config->get($config_key)) {
- return $name;
+ if ($prefix = $rcube->config->get('db_prefix')) {
+ return $prefix . $sequence;
}
return $sequence;
diff --git a/program/lib/Roundcube/rcube_image.php b/program/lib/Roundcube/rcube_image.php
index a55ba1600..735a0df01 100644
--- a/program/lib/Roundcube/rcube_image.php
+++ b/program/lib/Roundcube/rcube_image.php
@@ -124,6 +124,7 @@ class rcube_image
}
if ($result === '') {
+ @chmod($filename, 0600);
return $type;
}
}
@@ -183,6 +184,7 @@ class rcube_image
}
if ($result) {
+ @chmod($filename, 0600);
return $type;
}
}
@@ -223,6 +225,7 @@ class rcube_image
$result = rcube::exec($convert . ' 2>&1 -colorspace RGB -quality 75 {in} {type}:{out}', $p);
if ($result === '') {
+ @chmod($filename, 0600);
return true;
}
}
@@ -256,6 +259,7 @@ class rcube_image
}
if ($result) {
+ @chmod($filename, 0600);
return true;
}
}
diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php
index 0aa059c26..c67985186 100644
--- a/program/lib/Roundcube/rcube_imap.php
+++ b/program/lib/Roundcube/rcube_imap.php
@@ -3372,7 +3372,6 @@ class rcube_imap extends rcube_storage
{
if (!empty($this->options['fetch_headers'])) {
$headers = explode(' ', $this->options['fetch_headers']);
- $headers = array_map('strtoupper', $headers);
}
else {
$headers = array();
@@ -3382,7 +3381,7 @@ class rcube_imap extends rcube_storage
$headers = array_merge($headers, $this->all_headers);
}
- return implode(' ', array_unique($headers));
+ return $headers;
}
diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php
index 2ac1355fd..460e6cc92 100644
--- a/program/lib/Roundcube/rcube_imap_generic.php
+++ b/program/lib/Roundcube/rcube_imap_generic.php
@@ -2265,24 +2265,53 @@ class rcube_imap_generic
return $result;
}
- function fetchHeaders($mailbox, $message_set, $is_uid = false, $bodystr = false, $add = '')
+ /**
+ * Returns message(s) data (flags, headers, etc.)
+ *
+ * @param string $mailbox Mailbox name
+ * @param mixed $message_set Message(s) sequence identifier(s) or UID(s)
+ * @param bool $is_uid True if $message_set contains UIDs
+ * @param bool $bodystr Enable to add BODYSTRUCTURE data to the result
+ * @param array $add_headers List of additional headers
+ *
+ * @return bool|array List of rcube_message_header elements, False on error
+ */
+ function fetchHeaders($mailbox, $message_set, $is_uid = false, $bodystr = false, $add_headers = array())
{
$query_items = array('UID', 'RFC822.SIZE', 'FLAGS', 'INTERNALDATE');
- if ($bodystr)
+ $headers = array('DATE', 'FROM', 'TO', 'SUBJECT', 'CONTENT-TYPE', 'CC', 'REPLY-TO',
+ 'LIST-POST', 'DISPOSITION-NOTIFICATION-TO', 'X-PRIORITY');
+
+ if (!empty($add_headers)) {
+ $add_headers = array_map('strtoupper', $add_headers);
+ $headers = array_unique(array_merge($headers, $add_headers));
+ }
+
+ if ($bodystr) {
$query_items[] = 'BODYSTRUCTURE';
- $query_items[] = 'BODY.PEEK[HEADER.FIELDS ('
- . 'DATE FROM TO SUBJECT CONTENT-TYPE CC REPLY-TO LIST-POST DISPOSITION-NOTIFICATION-TO X-PRIORITY'
- . ($add ? ' ' . trim($add) : '')
- . ')]';
+ }
+
+ $query_items[] = 'BODY.PEEK[HEADER.FIELDS (' . implode(' ', $headers) . ')]';
$result = $this->fetch($mailbox, $message_set, $is_uid, $query_items);
return $result;
}
- function fetchHeader($mailbox, $id, $uidfetch=false, $bodystr=false, $add='')
+ /**
+ * Returns message data (flags, headers, etc.)
+ *
+ * @param string $mailbox Mailbox name
+ * @param int $id Message sequence identifier or UID
+ * @param bool $is_uid True if $id is an UID
+ * @param bool $bodystr Enable to add BODYSTRUCTURE data to the result
+ * @param array $add_headers List of additional headers
+ *
+ * @return bool|rcube_message_header Message data, False on error
+ */
+ function fetchHeader($mailbox, $id, $is_uid = false, $bodystr = false, $add_headers = array())
{
- $a = $this->fetchHeaders($mailbox, $id, $uidfetch, $bodystr, $add);
+ $a = $this->fetchHeaders($mailbox, $id, $is_uid, $bodystr, $add_headers);
if (is_array($a)) {
return array_shift($a);
}
@@ -3638,8 +3667,20 @@ class rcube_imap_generic
*/
static function strToTime($date)
{
- // support non-standard "GMTXXXX" literal
- $date = preg_replace('/GMT\s*([+-][0-9]+)/', '\\1', $date);
+ // Clean malformed data
+ $date = preg_replace(
+ array(
+ '/GMT\s*([+-][0-9]+)/', // support non-standard "GMTXXXX" literal
+ '/[^a-z0-9\x20\x09:+-]/i', // remove any invalid characters
+ '/\s*(Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*/i', // remove weekday names
+ ),
+ array(
+ '\\1',
+ '',
+ '',
+ ), $date);
+
+ $date = trim($date);
// if date parsing fails, we have a date in non-rfc format
// remove token from the end and try again
diff --git a/program/lib/Roundcube/rcube_message.php b/program/lib/Roundcube/rcube_message.php
index 42d7b9bbe..9db1fa30a 100644
--- a/program/lib/Roundcube/rcube_message.php
+++ b/program/lib/Roundcube/rcube_message.php
@@ -85,12 +85,13 @@ class rcube_message
$this->headers = $this->storage->get_message($uid);
- if (!$this->headers)
+ if (!$this->headers) {
return;
+ }
$this->mime = new rcube_mime($this->headers->charset);
- $this->subject = $this->mime->decode_mime_string($this->headers->subject);
+ $this->subject = $this->headers->get('subject');
list(, $this->sender) = each($this->mime->decode_address_list($this->headers->from, 1));
$this->set_safe((intval($_GET['_safe']) || $_SESSION['safe_messages'][$this->folder.':'.$uid]));
@@ -125,15 +126,11 @@ class rcube_message
*/
public function get_header($name, $raw = false)
{
- if (empty($this->headers))
+ if (empty($this->headers)) {
return null;
+ }
- if ($this->headers->$name)
- $value = $this->headers->$name;
- else if ($this->headers->others[$name])
- $value = $this->headers->others[$name];
-
- return $raw ? $value : $this->mime->decode_header($value);
+ return $this->headers->get($name, !$raw);
}
@@ -152,12 +149,13 @@ class rcube_message
* Compose a valid URL for getting a message part
*
* @param string $mime_id Part MIME-ID
+ * @param mixed $embed Mimetype class for parts to be embedded
* @return string URL or false if part does not exist
*/
public function get_part_url($mime_id, $embed = false)
{
if ($this->mime_parts[$mime_id])
- return $this->opt['get_url'] . '&_part=' . $mime_id . ($embed ? '&_embed=1' : '');
+ return $this->opt['get_url'] . '&_part=' . $mime_id . ($embed ? '&_embed=1&_mimeclass=' . $embed : '');
else
return false;
}
@@ -364,7 +362,7 @@ class rcube_message
// parse headers from message/rfc822 part
if (!isset($structure->headers['subject']) && !isset($structure->headers['from'])) {
- list($headers, $dump) = explode("\r\n\r\n", $this->get_part_content($structure->mime_id, null, true, 8192));
+ list($headers, $dump) = explode("\r\n\r\n", $this->get_part_content($structure->mime_id, null, true, 32768));
$structure->headers = rcube_mime::parse_headers($headers);
}
}
@@ -372,7 +370,8 @@ class rcube_message
$mimetype = $structure->mimetype;
// show message headers
- if ($recursive && is_array($structure->headers) && (isset($structure->headers['subject']) || isset($structure->headers['from']))) {
+ if ($recursive && is_array($structure->headers) &&
+ (isset($structure->headers['subject']) || $structure->headers['from'] || $structure->headers['to'])) {
$c = new stdClass;
$c->type = 'headers';
$c->headers = $structure->headers;
@@ -486,14 +485,6 @@ class rcube_message
$this->parts[] = $c;
}
- // add html part as attachment
- if ($html_part !== null && $structure->parts[$html_part] !== $print_part) {
- $html_part = $structure->parts[$html_part];
- $html_part->mimetype = 'text/html';
-
- $this->attachments[] = $html_part;
- }
-
// add unsupported/unrecognized parts to attachments list
if ($attach_part) {
$this->attachments[] = $structure->parts[$attach_part];
@@ -578,10 +569,6 @@ class rcube_message
if (!empty($mail_part->filename)) {
$this->attachments[] = $mail_part;
}
- // list html part as attachment (here the part is most likely inside a multipart/related part)
- else if ($this->parse_alternative && ($secondary_type == 'html' && !$this->opt['prefer_html'])) {
- $this->attachments[] = $mail_part;
- }
}
// part message/*
else if ($primary_type == 'message') {
@@ -657,7 +644,7 @@ class rcube_message
$img_regexp = '/^image\/(gif|jpe?g|png|tiff|bmp|svg)/';
foreach ($this->inline_parts as $inline_object) {
- $part_url = $this->get_part_url($inline_object->mime_id, true);
+ $part_url = $this->get_part_url($inline_object->mime_id, $inline_object->ctype_primary);
if (isset($inline_object->content_id))
$a_replaces['cid:'.$inline_object->content_id] = $part_url;
if ($inline_object->content_location) {
diff --git a/program/lib/Roundcube/rcube_message_header.php b/program/lib/Roundcube/rcube_message_header.php
index 274ae7f9f..2c5e2b6c8 100644
--- a/program/lib/Roundcube/rcube_message_header.php
+++ b/program/lib/Roundcube/rcube_message_header.php
@@ -215,7 +215,12 @@ class rcube_message_header
$value = $this->others[$name];
}
- return $decode ? rcube_mime::decode_header($value, $this->charset) : $value;
+ if ($decode) {
+ $value = rcube_mime::decode_header($value, $this->charset);
+ $value = rcube_charset::clean($value);
+ }
+
+ return $value;
}
/**
diff --git a/program/lib/Roundcube/rcube_mime.php b/program/lib/Roundcube/rcube_mime.php
index b70d681c9..96296a57c 100644
--- a/program/lib/Roundcube/rcube_mime.php
+++ b/program/lib/Roundcube/rcube_mime.php
@@ -564,82 +564,122 @@ class rcube_mime
/**
- * Improved wordwrap function.
+ * Improved wordwrap function with multibyte support.
+ * The code is based on Zend_Text_MultiByte::wordWrap().
*
- * @param string $string Text to wrap
- * @param int $width Line width
- * @param string $break Line separator
- * @param bool $cut Enable to cut word
- * @param string $charset Charset of $string
+ * @param string $string Text to wrap
+ * @param int $width Line width
+ * @param string $break Line separator
+ * @param bool $cut Enable to cut word
+ * @param string $charset Charset of $string
+ * @param bool $wrap_quoted When enabled quoted lines will not be wrapped
*
* @return string Text
*/
- public static function wordwrap($string, $width=75, $break="\n", $cut=false, $charset=null)
+ public static function wordwrap($string, $width=75, $break="\n", $cut=false, $charset=null, $wrap_quoted=true)
{
- if ($charset && function_exists('mb_internal_encoding')) {
- mb_internal_encoding($charset);
+ if (!$charset) {
+ $charset = RCUBE_CHARSET;
}
- $para = preg_split('/\r?\n/', $string);
- $string = '';
-
- while (count($para)) {
- $line = array_shift($para);
- if ($line[0] == '>') {
- $string .= $line . (count($para) ? $break : '');
- continue;
+ // detect available functions
+ $strlen_func = function_exists('iconv_strlen') ? 'iconv_strlen' : 'mb_strlen';
+ $strpos_func = function_exists('iconv_strpos') ? 'iconv_strpos' : 'mb_strpos';
+ $strrpos_func = function_exists('iconv_strrpos') ? 'iconv_strrpos' : 'mb_strrpos';
+ $substr_func = function_exists('iconv_substr') ? 'iconv_substr' : 'mb_substr';
+
+ // Convert \r\n to \n, this is our line-separator
+ $string = str_replace("\r\n", "\n", $string);
+ $separator = "\n"; // must be 1 character length
+ $result = array();
+
+ while (($stringLength = $strlen_func($string, $charset)) > 0) {
+ $breakPos = $strpos_func($string, $separator, 0, $charset);
+
+ // quoted line (do not wrap)
+ if ($wrap_quoted && $string[0] == '>') {
+ if ($breakPos === $stringLength - 1 || $breakPos === false) {
+ $subString = $string;
+ $cutLength = null;
+ }
+ else {
+ $subString = $substr_func($string, 0, $breakPos, $charset);
+ $cutLength = $breakPos + 1;
+ }
+ }
+ // next line found and current line is shorter than the limit
+ else if ($breakPos !== false && $breakPos < $width) {
+ if ($breakPos === $stringLength - 1) {
+ $subString = $string;
+ $cutLength = null;
+ }
+ else {
+ $subString = $substr_func($string, 0, $breakPos, $charset);
+ $cutLength = $breakPos + 1;
+ }
}
+ else {
+ $subString = $substr_func($string, 0, $width, $charset);
- $list = explode(' ', $line);
- $len = 0;
- while (count($list)) {
- $line = array_shift($list);
- $l = mb_strlen($line);
- $space = $len ? 1 : 0;
- $newlen = $len + $l + $space;
-
- if ($newlen <= $width) {
- $string .= ($space ? ' ' : '').$line;
- $len += ($space + $l);
+ // last line
+ if ($breakPos === false && $subString === $string) {
+ $cutLength = null;
}
else {
- if ($l > $width) {
- if ($cut) {
- $start = 0;
- while ($l) {
- $str = mb_substr($line, $start, $width);
- $strlen = mb_strlen($str);
- $string .= ($len ? $break : '').$str;
- $start += $strlen;
- $l -= $strlen;
- $len = $strlen;
- }
+ $nextChar = $substr_func($string, $width, 1, $charset);
+
+ if ($nextChar === ' ' || $nextChar === $separator) {
+ $afterNextChar = $substr_func($string, $width + 1, 1, $charset);
+
+ if ($afterNextChar === false) {
+ $subString .= $nextChar;
+ }
+
+ $cutLength = $strlen_func($subString, $charset) + 1;
+ }
+ else {
+ if ($strrpos_func[0] == 'm') {
+ $spacePos = $strrpos_func($subString, ' ', 0, $charset);
}
else {
- $string .= ($len ? $break : '').$line;
- if (count($list)) {
- $string .= $break;
+ $spacePos = $strrpos_func($subString, ' ', $charset);
+ }
+
+ if ($spacePos !== false) {
+ $subString = $substr_func($subString, 0, $spacePos, $charset);
+ $cutLength = $spacePos + 1;
+ }
+ else if ($cut === false) {
+ $spacePos = $strpos_func($string, ' ', 0, $charset);
+
+ if ($spacePos !== false && $spacePos < $breakPos) {
+ $subString = $substr_func($string, 0, $spacePos, $charset);
+ $cutLength = $spacePos + 1;
+ }
+ else {
+ $subString = $string;
+ $cutLength = null;
}
- $len = 0;
}
- }
- else {
- $string .= $break.$line;
- $len = $l;
+ else {
+ $subString = $substr_func($subString, 0, $width, $charset);
+ $cutLength = $width;
+ }
}
}
}
- if (count($para)) {
- $string .= $break;
- }
- }
+ $result[] = $subString;
- if ($charset && function_exists('mb_internal_encoding')) {
- mb_internal_encoding(RCUBE_CHARSET);
+ if ($cutLength !== null) {
+ $string = $substr_func($string, $cutLength, ($stringLength - $cutLength), $charset);
+ }
+ else {
+ break;
+ }
}
- return $string;
+ return implode($break, $result);
}
@@ -769,11 +809,35 @@ class rcube_mime
// fallback to some well-known types most important for daily emails
if (empty($mime_types)) {
- $mime_extensions = @include(RCUBE_CONFIG_DIR . '/mimetypes.php');
- $mime_extensions += array('gif' => 'image/gif', 'png' => 'image/png', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'tif' => 'image/tiff');
+ $mime_extensions = (array) @include(RCUBE_CONFIG_DIR . '/mimetypes.php');
- foreach ($mime_extensions as $ext => $mime)
+ foreach ($mime_extensions as $ext => $mime) {
$mime_types[$mime][] = $ext;
+ }
+ }
+
+ // Add some known aliases that aren't included by some mime.types (#1488891)
+ // the order is important here so standard extensions have higher prio
+ $aliases = array(
+ 'image/gif' => array('gif'),
+ 'image/png' => array('png'),
+ 'image/x-png' => array('png'),
+ 'image/jpeg' => array('jpg', 'jpeg', 'jpe'),
+ 'image/jpg' => array('jpg', 'jpeg', 'jpe'),
+ 'image/pjpeg' => array('jpg', 'jpeg', 'jpe'),
+ 'image/tiff' => array('tif'),
+ 'message/rfc822' => array('eml'),
+ 'text/x-mail' => array('eml'),
+ );
+
+ foreach ($aliases as $mime => $exts) {
+ $mime_types[$mime] = array_unique(array_merge((array) $mime_types[$mime], $exts));
+
+ foreach ($exts as $ext) {
+ if (!isset($mime_extensions[$ext])) {
+ $mime_extensions[$ext] = $mime;
+ }
+ }
}
return $mimetype ? $mime_types[$mimetype] : $mime_extensions;
diff --git a/program/lib/Roundcube/rcube_plugin.php b/program/lib/Roundcube/rcube_plugin.php
index 9ea0f73d3..d24a2693c 100644
--- a/program/lib/Roundcube/rcube_plugin.php
+++ b/program/lib/Roundcube/rcube_plugin.php
@@ -60,6 +60,14 @@ abstract class rcube_plugin
*/
public $noframe = false;
+ /**
+ * A list of config option names that can be modified
+ * by the user via user interface (with save-prefs command)
+ *
+ * @var array
+ */
+ public $allowed_prefs;
+
protected $home;
protected $urlbase;
private $mytask;
@@ -84,6 +92,16 @@ abstract class rcube_plugin
abstract function init();
/**
+ * Provide information about this
+ *
+ * @return array Meta information about a plugin or false if not implemented
+ */
+ public static function info()
+ {
+ return false;
+ }
+
+ /**
* Attempt to load the given plugin which is required for the current plugin
*
* @param string Plugin name
diff --git a/program/lib/Roundcube/rcube_plugin_api.php b/program/lib/Roundcube/rcube_plugin_api.php
index 111c177d9..4bb6c6677 100644
--- a/program/lib/Roundcube/rcube_plugin_api.php
+++ b/program/lib/Roundcube/rcube_plugin_api.php
@@ -36,6 +36,7 @@ class rcube_plugin_api
public $task = '';
public $output;
public $handlers = array();
+ public $allowed_prefs = array();
protected $plugins = array();
protected $tasks = array();
@@ -202,6 +203,11 @@ class rcube_plugin_api
$plugin->init();
$this->plugins[$plugin_name] = $plugin;
}
+
+ if (!empty($plugin->allowed_prefs)) {
+ $this->allowed_prefs = array_merge($this->allowed_prefs, $plugin->allowed_prefs);
+ }
+
return true;
}
}
@@ -222,6 +228,120 @@ class rcube_plugin_api
}
/**
+ * Get information about a specific plugin.
+ * This is either provided my a plugin's info() method or extracted from a package.xml or a composer.json file
+ *
+ * @param string Plugin name
+ * @return array Meta information about a plugin or False if plugin was not found
+ */
+ public function get_info($plugin_name)
+ {
+ static $composer_lock, $license_uris = array(
+ 'Apache' => 'http://www.apache.org/licenses/LICENSE-2.0.html',
+ 'Apache-2' => 'http://www.apache.org/licenses/LICENSE-2.0.html',
+ 'Apache-1' => 'http://www.apache.org/licenses/LICENSE-1.0',
+ 'Apache-1.1' => 'http://www.apache.org/licenses/LICENSE-1.1',
+ 'GPL' => 'http://www.gnu.org/licenses/gpl.html',
+ 'GPLv2' => 'http://www.gnu.org/licenses/gpl-2.0.html',
+ 'GPL-2.0' => 'http://www.gnu.org/licenses/gpl-2.0.html',
+ 'GPLv3' => 'http://www.gnu.org/licenses/gpl-3.0.html',
+ 'GPL-3.0' => 'http://www.gnu.org/licenses/gpl-3.0.html',
+ 'GPL-3.0+' => 'http://www.gnu.org/licenses/gpl.html',
+ 'GPL-2.0+' => 'http://www.gnu.org/licenses/gpl.html',
+ 'LGPL' => 'http://www.gnu.org/licenses/lgpl.html',
+ 'LGPLv2' => 'http://www.gnu.org/licenses/lgpl-2.0.html',
+ 'LGPLv2.1' => 'http://www.gnu.org/licenses/lgpl-2.1.html',
+ 'LGPLv3' => 'http://www.gnu.org/licenses/lgpl.html',
+ 'LGPL-2.0' => 'http://www.gnu.org/licenses/lgpl-2.0.html',
+ 'LGPL-2.1' => 'http://www.gnu.org/licenses/lgpl-2.1.html',
+ 'LGPL-3.0' => 'http://www.gnu.org/licenses/lgpl.html',
+ 'LGPL-3.0+' => 'http://www.gnu.org/licenses/lgpl.html',
+ 'BSD' => 'http://opensource.org/licenses/bsd-license.html',
+ 'BSD-2-Clause' => 'http://opensource.org/licenses/BSD-2-Clause',
+ 'BSD-3-Clause' => 'http://opensource.org/licenses/BSD-3-Clause',
+ 'FreeBSD' => 'http://opensource.org/licenses/BSD-2-Clause',
+ 'MIT' => 'http://www.opensource.org/licenses/mit-license.php',
+ 'PHP' => 'http://opensource.org/licenses/PHP-3.0',
+ 'PHP-3' => 'http://www.php.net/license/3_01.txt',
+ 'PHP-3.0' => 'http://www.php.net/license/3_0.txt',
+ 'PHP-3.01' => 'http://www.php.net/license/3_01.txt',
+ );
+
+ $dir = dir($this->dir);
+ $fn = unslashify($dir->path) . DIRECTORY_SEPARATOR . $plugin_name . DIRECTORY_SEPARATOR . $plugin_name . '.php';
+ $info = false;
+
+ if (!class_exists($plugin_name))
+ include($fn);
+
+ if (class_exists($plugin_name))
+ $info = $plugin_name::info();
+
+ // fall back to composer.json file
+ if (!$info) {
+ $composer = INSTALL_PATH . "/plugins/$plugin_name/composer.json";
+ if (file_exists($composer) && ($json = @json_decode(file_get_contents($composer), true))) {
+ list($info['vendor'], $info['name']) = explode('/', $json['name']);
+ $info['license'] = $json['license'];
+ if ($license_uri = $license_uris[$info['license']])
+ $info['license_uri'] = $license_uri;
+ }
+
+ // read local composer.lock file (once)
+ if (!isset($composer_lock)) {
+ $composer_lock = @json_decode(@file_get_contents(INSTALL_PATH . "/composer.lock"), true);
+ if ($composer_lock['packages']) {
+ foreach ($composer_lock['packages'] as $i => $package) {
+ $composer_lock['installed'][$package['name']] = $package;
+ }
+ }
+ }
+
+ // load additional information from local composer.lock file
+ if ($lock = $composer_lock['installed'][$json['name']]) {
+ $info['version'] = $lock['version'];
+ $info['uri'] = $lock['homepage'] ? $lock['homepage'] : $lock['source']['uri'];
+ $info['src_uri'] = $lock['dist']['uri'] ? $lock['dist']['uri'] : $lock['source']['uri'];
+ }
+ }
+
+ // fall back to package.xml file
+ if (!$info) {
+ $package = INSTALL_PATH . "/plugins/$plugin_name/package.xml";
+ if (file_exists($package) && ($file = file_get_contents($package))) {
+ $doc = new DOMDocument();
+ $doc->loadXML($file);
+ $xpath = new DOMXPath($doc);
+ $xpath->registerNamespace('rc', "http://pear.php.net/dtd/package-2.0");
+ $data = array();
+
+ // XPaths of plugin metadata elements
+ $metadata = array(
+ 'name' => 'string(//rc:package/rc:name)',
+ 'version' => 'string(//rc:package/rc:version/rc:release)',
+ 'license' => 'string(//rc:package/rc:license)',
+ 'license_uri' => 'string(//rc:package/rc:license/@uri)',
+ 'src_uri' => 'string(//rc:package/rc:srcuri)',
+ 'uri' => 'string(//rc:package/rc:uri)',
+ );
+
+ foreach ($metadata as $key => $path) {
+ $info[$key] = $xpath->evaluate($path);
+ }
+
+ // dependent required plugins (can be used, but not included in config)
+ $deps = $xpath->evaluate('//rc:package/rc:dependencies/rc:required/rc:package/rc:name');
+ for ($i = 0; $i < $deps->length; $i++) {
+ $dn = $deps->item($i)->nodeValue;
+ $info['requires'][] = $dn;
+ }
+ }
+ }
+
+ return $info;
+ }
+
+ /**
* Allows a plugin object to register a callback for a certain hook
*
* @param string $hook Hook name
diff --git a/program/lib/Roundcube/rcube_session.php b/program/lib/Roundcube/rcube_session.php
index 82ff8a804..dedde2284 100644
--- a/program/lib/Roundcube/rcube_session.php
+++ b/program/lib/Roundcube/rcube_session.php
@@ -203,10 +203,15 @@ class rcube_session
if (is_array($a_oldvars)) {
// remove unset keys on oldvars
foreach ((array)$this->unsets as $var) {
- $path = explode('.', $var);
- $k = array_pop($path);
- $node = &$this->get_node($path, $a_oldvars);
- unset($node[$k]);
+ if (isset($a_oldvars[$var])) {
+ unset($a_oldvars[$var]);
+ }
+ else {
+ $path = explode('.', $var);
+ $k = array_pop($path);
+ $node = &$this->get_node($path, $a_oldvars);
+ unset($node[$k]);
+ }
}
$newvars = $this->serialize(array_merge(
@@ -402,7 +407,7 @@ class rcube_session
/**
* Unset a session variable
*
- * @param string Varibale name (can be a path denoting a certain node in the session array, e.g. compose.attachments.5)
+ * @param string Variable name (can be a path denoting a certain node in the session array, e.g. compose.attachments.5)
* @return boolean True on success
*/
public function remove($var=null)
@@ -413,10 +418,15 @@ class rcube_session
$this->unsets[] = $var;
- $path = explode('.', $var);
- $key = array_pop($path);
- $node = &$this->get_node($path, $_SESSION);
- unset($node[$key]);
+ if (isset($_SESSION[$var])) {
+ unset($_SESSION[$var]);
+ }
+ else {
+ $path = explode('.', $var);
+ $key = array_pop($path);
+ $node = &$this->get_node($path, $_SESSION);
+ unset($node[$key]);
+ }
return true;
}
diff --git a/program/lib/Roundcube/rcube_string_replacer.php b/program/lib/Roundcube/rcube_string_replacer.php
index b8768bc98..0fc90a55a 100644
--- a/program/lib/Roundcube/rcube_string_replacer.php
+++ b/program/lib/Roundcube/rcube_string_replacer.php
@@ -95,12 +95,12 @@ class rcube_string_replacer
$attrib = (array)$this->options['link_attribs'];
$attrib['href'] = $url_prefix . $url;
- $i = $this->add($prefix . html::a($attrib, rcube::Q($url)) . $suffix);
+ $i = $this->add(html::a($attrib, rcube::Q($url)) . $suffix);
}
// Return valid link for recognized schemes, otherwise
// return the unmodified string for unrecognized schemes.
- return $i >= 0 ? $this->get_replacement($i) : $matches[0];
+ return $i >= 0 ? $prefix . $this->get_replacement($i) : $matches[0];
}
/**
diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php
index 1ae782a25..fabe0f060 100644
--- a/program/lib/Roundcube/rcube_utils.php
+++ b/program/lib/Roundcube/rcube_utils.php
@@ -729,8 +729,20 @@ class rcube_utils
return $date;
}
- // support non-standard "GMTXXXX" literal
- $date = preg_replace('/GMT\s*([+-][0-9]+)/', '\\1', $date);
+ // Clean malformed data
+ $date = preg_replace(
+ array(
+ '/GMT\s*([+-][0-9]+)/', // support non-standard "GMTXXXX" literal
+ '/[^a-z0-9\x20\x09:+-]/i', // remove any invalid characters
+ '/\s*(Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*/i', // remove weekday names
+ ),
+ array(
+ '\\1',
+ '',
+ '',
+ ), $date);
+
+ $date = trim($date);
// if date parsing fails, we have a date in non-rfc format.
// remove token from the end and try again
diff --git a/program/lib/Roundcube/rcube_vcard.php b/program/lib/Roundcube/rcube_vcard.php
index de28767f8..54bb9521d 100644
--- a/program/lib/Roundcube/rcube_vcard.php
+++ b/program/lib/Roundcube/rcube_vcard.php
@@ -491,7 +491,9 @@ class rcube_vcard
if (preg_match('/^END:VCARD$/i', $line)) {
// parse vcard
$obj = new rcube_vcard(self::cleanup($vcard_block), $charset, true, self::$fieldmap);
- if (!empty($obj->displayname) || !empty($obj->email)) {
+ // FN and N is required by vCard format (RFC 2426)
+ // on import we can be less restrictive, let's addressbook decide
+ if (!empty($obj->displayname) || !empty($obj->surname) || !empty($obj->firstname) || !empty($obj->email)) {
$out[] = $obj;
}
diff --git a/program/localization/ar_SA/labels.inc b/program/localization/ar_SA/labels.inc
index 7dc8c15ad..cc023c31c 100644
--- a/program/localization/ar_SA/labels.inc
+++ b/program/localization/ar_SA/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'الصفحة الحالية';
$labels['unread'] = 'غير المقروءة';
$labels['flagged'] = 'موسوم';
$labels['unanswered'] = 'بلا رد';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'محذوف';
$labels['undeleted'] = 'غير محذوفة';
$labels['invert'] = 'عكس';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'إزالة التوقيع من الرسالة
$labels['autoaddsignature'] = 'إضافة التوقيع آلياً';
$labels['newmessageonly'] = 'الرسالة الجديدة فقط';
$labels['replyandforwardonly'] = 'الردود والتمريرات فقط';
-$labels['replysignaturepos'] = 'إضافة التوقيع عند الرد أو التمرير';
-$labels['belowquote'] = 'بعد الاقتباس';
-$labels['abovequote'] = 'قبل الاقتباس';
$labels['insertsignature'] = 'إضافة التوقيع';
$labels['previewpanemarkread'] = 'تحديد الرسائل المُعاينة كمقروءة';
$labels['afternseconds'] = 'بعد $n ثواني';
diff --git a/program/localization/ast/labels.inc b/program/localization/ast/labels.inc
index 996c6043f..c6207c0d7 100644
--- a/program/localization/ast/labels.inc
+++ b/program/localization/ast/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page';
$labels['unread'] = 'Ensin lleer';
$labels['flagged'] = 'Marcáu';
$labels['unanswered'] = 'Ensin contestar';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Desaniciáu';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Invertir';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/az_AZ/labels.inc b/program/localization/az_AZ/labels.inc
index 60e861177..7d25c9234 100644
--- a/program/localization/az_AZ/labels.inc
+++ b/program/localization/az_AZ/labels.inc
@@ -64,7 +64,7 @@ $labels['copy'] = 'Kopyala';
$labels['move'] = 'Köçür';
$labels['moveto'] = 'Burada köçür...';
$labels['download'] = 'Endir';
-$labels['open'] = 'Open';
+$labels['open'] = 'Aç';
$labels['showattachment'] = 'Göstər';
$labels['showanyway'] = 'İstənilən halda göstər';
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Hazırki səhifəni';
$labels['unread'] = 'Oxunmamışları';
$labels['flagged'] = 'İşarəliləri';
$labels['unanswered'] = 'Cavabsızları';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Silinmişləri';
$labels['undeleted'] = 'Silinməyib';
$labels['invert'] = 'İnvertliləri';
@@ -205,8 +206,8 @@ $labels['body'] = 'Mətn';
$labels['openinextwin'] = 'Yeni pəncərədə aç';
$labels['emlsave'] = 'Saxla (.eml)';
-$labels['changeformattext'] = 'Display in plain text format';
-$labels['changeformathtml'] = 'Display in HTML format';
+$labels['changeformattext'] = 'Sadə mətn formatında göstər';
+$labels['changeformathtml'] = 'HTML formatında göstər';
// message compose
$labels['editasnew'] = 'Yeni kimi redaktə et';
@@ -338,8 +339,8 @@ $labels['composeto'] = 'Seçilmiş ünvanlara məktub yaz';
$labels['contactsfromto'] = '$count ünvanının $from - $to arası';
$labels['print'] = 'Çap et';
$labels['export'] = 'İxrac et';
-$labels['exportall'] = 'Export all';
-$labels['exportsel'] = 'Export selected';
+$labels['exportall'] = 'Hamısını İxrac et';
+$labels['exportsel'] = 'Seçilmişləri İxrac et';
$labels['exportvcards'] = 'Ünvanları vCards formatında ixrac et';
$labels['newcontactgroup'] = 'Ünvanlar qrupunu yarat';
$labels['grouprename'] = 'Qruğun adını dəyişdir';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Cavab zamanı imzanı sil';
$labels['autoaddsignature'] = 'İmzanı avtomatik əlavə et';
$labels['newmessageonly'] = 'yalnız yeni məktublarda';
$labels['replyandforwardonly'] = 'Yalnız cavab və yönəldilənlərdə';
-$labels['replysignaturepos'] = 'Cavab və yönəltmə zamanı imzanı bərkid';
-$labels['belowquote'] = 'sitatdan sonra';
-$labels['abovequote'] = 'sitatdan əvvəl';
$labels['insertsignature'] = 'İmza əlavə et';
$labels['previewpanemarkread'] = 'Baxılmış şəkilləri oxunmuş kimi qeyd et';
$labels['afternseconds'] = '$n saniyədən sonra';
diff --git a/program/localization/az_AZ/messages.inc b/program/localization/az_AZ/messages.inc
index 939827247..418f270be 100644
--- a/program/localization/az_AZ/messages.inc
+++ b/program/localization/az_AZ/messages.inc
@@ -17,20 +17,22 @@
*/
$messages = array();
-$messages['errortitle'] = 'Xəta baş verib!';
-$messages['loginfailed'] = 'Giriş uğursuz oldu';
-$messages['cookiesdisabled'] = 'Sizin brauzer kukiləri qəbul etmir';
-$messages['sessionerror'] = 'Sizin sessiya köhnəlib';
-$messages['storageerror'] = 'IMAP serverlə bağlantı alınmadı';
-$messages['servererror'] = 'Server xətası!';
-$messages['servererrormsg'] = 'Server xətası: $msg';
-$messages['dberror'] = 'Məlumatlar bazasında xəta!';
+$messages['errortitle'] = 'Xəta baş verdi!';
+$messages['loginfailed'] = 'Giriş uğursuz oldu.';
+$messages['cookiesdisabled'] = 'Sizin brauzer kukiləri qəbul etmir.';
+$messages['sessionerror'] = 'Sizin sessiya köhnəlib.';
+$messages['storageerror'] = 'IMAP serverlə bağlantı alınmadı.';
+$messages['servererror'] = 'Server Xətası!';
+$messages['servererrormsg'] = 'Server Xətası: $msg';
+$messages['dberror'] = 'Məlumatlar Bazasında Xəta!';
$messages['requesttimedout'] = 'Sorğunun gözləmə müddəti bitdi';
-$messages['errorreadonly'] = 'Əməliyyatı etmək mümkün deyil. Qovluq yalnız oxunuş üçündür.';
+$messages['errorreadonly'] = 'Əməliyyatı icra etmək mümkün deyil. Qovluq yalnız oxunuş üçündür.';
$messages['errornoperm'] = 'Əməliyyatı etmək mümkün deyil. Giriş qadağandır.';
+$messages['erroroverquota'] = 'Əməliyyat icra edilə bilinmir. Boş disk həcmi yoxdur.';
+$messages['erroroverquotadelete'] = 'Boş disk həcmi yoxdur. Məktubu silmək üçün SHIFT+DEL düyməsini istifadə edin.';
$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['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['refreshing'] = 'Yenilənmə...';
diff --git a/program/localization/be_BE/labels.inc b/program/localization/be_BE/labels.inc
index db3893ced..3bb5c4436 100644
--- a/program/localization/be_BE/labels.inc
+++ b/program/localization/be_BE/labels.inc
@@ -162,6 +162,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';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/bg_BG/labels.inc b/program/localization/bg_BG/labels.inc
index fa92ec042..dfe9d2d26 100644
--- a/program/localization/bg_BG/labels.inc
+++ b/program/localization/bg_BG/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Страница';
$labels['unread'] = 'Нови';
$labels['flagged'] = 'Отбелязано';
$labels['unanswered'] = 'Без отговор';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Изтрито';
$labels['undeleted'] = 'Не е изтрит';
$labels['invert'] = 'Инвертирай';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Премахване на предишния
$labels['autoaddsignature'] = 'Автоматично добавяне на подпис';
$labels['newmessageonly'] = 'само на нови съобщения';
$labels['replyandforwardonly'] = 'само на отговори и препратени';
-$labels['replysignaturepos'] = 'Поставяне на подпис при отговор или препращане';
-$labels['belowquote'] = 'над цитатът';
-$labels['abovequote'] = 'под цитатът';
$labels['insertsignature'] = 'Вмъкване на подпис';
$labels['previewpanemarkread'] = 'Маркиране на прегледаните съобщения като прочетени';
$labels['afternseconds'] = 'след $n секунди';
diff --git a/program/localization/bn_BD/labels.inc b/program/localization/bn_BD/labels.inc
index 0f20bba37..58f4467d3 100644
--- a/program/localization/bn_BD/labels.inc
+++ b/program/localization/bn_BD/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page';
$labels['unread'] = 'নাদেখা (unread)';
$labels['flagged'] = 'দাগানো (flagged)';
$labels['unanswered'] = 'উত্তর না দেওয়া গুলো';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Deleted';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Invert';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/br/labels.inc b/program/localization/br/labels.inc
index 95756e393..0755a6d9b 100644
--- a/program/localization/br/labels.inc
+++ b/program/localization/br/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page';
$labels['unread'] = 'Na lennet';
$labels['flagged'] = 'Flagged';
$labels['unanswered'] = 'Unanswered';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Deleted';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Invert';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/bs_BA/labels.inc b/program/localization/bs_BA/labels.inc
index f2a871cdd..d81d97320 100644
--- a/program/localization/bs_BA/labels.inc
+++ b/program/localization/bs_BA/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Trenutna stranica';
$labels['unread'] = 'Nepročitano';
$labels['flagged'] = 'Važno';
$labels['unanswered'] = 'Neodgovoreno';
+$labels['withattachment'] = 'Sa prilogom';
$labels['deleted'] = 'Obrisano';
$labels['undeleted'] = 'Nije obrisano';
$labels['invert'] = 'Izokreni';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Prilikom odgovaranja na poruku, ukloni origin
$labels['autoaddsignature'] = 'Automatski dodaj potpis';
$labels['newmessageonly'] = 'samo za nove poruke';
$labels['replyandforwardonly'] = 'samo za odgovore i prosljeđivanja';
-$labels['replysignaturepos'] = 'Prilikom odgovaranja ili prosljeđivanja potpis ubaci';
-$labels['belowquote'] = 'ispod citata';
-$labels['abovequote'] = 'iznad citata';
$labels['insertsignature'] = 'Umetni potpis';
$labels['previewpanemarkread'] = 'Obilježi prikazane poruke kao pročitane';
$labels['afternseconds'] = 'nakon $n sekundi';
diff --git a/program/localization/ca_ES/labels.inc b/program/localization/ca_ES/labels.inc
index 1bcb526ea..25dbb1155 100644
--- a/program/localization/ca_ES/labels.inc
+++ b/program/localization/ca_ES/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Pàgina actual';
$labels['unread'] = 'No llegits';
$labels['flagged'] = 'Marcat';
$labels['unanswered'] = 'No respost';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Suprimit';
$labels['undeleted'] = 'No s\'ha suprimit';
$labels['invert'] = 'Inverteix';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Quan es contesti, suprimeix la signatura orig
$labels['autoaddsignature'] = 'Afegeix la signatura automàticament';
$labels['newmessageonly'] = 'només si és un missatge nou';
$labels['replyandforwardonly'] = 'només a respostes i reenviaments';
-$labels['replysignaturepos'] = 'Quan es contesti o reenviï, posa-hi la signatura';
-$labels['belowquote'] = 'sota les cometes';
-$labels['abovequote'] = 'sobre les cometes';
$labels['insertsignature'] = 'Inserta la signatura';
$labels['previewpanemarkread'] = 'Marca els missatges previsualitzats com a llegits';
$labels['afternseconds'] = 'després de $n segons';
diff --git a/program/localization/cs_CZ/labels.inc b/program/localization/cs_CZ/labels.inc
index 2240065e7..cb94c71c9 100644
--- a/program/localization/cs_CZ/labels.inc
+++ b/program/localization/cs_CZ/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Aktuální stránka';
$labels['unread'] = 'Nepřečtené';
$labels['flagged'] = 'Označené';
$labels['unanswered'] = 'Neoznačené';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Smazané';
$labels['undeleted'] = 'Nesmazáno';
$labels['invert'] = 'Převrátit';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Při odpovídání odstranit ze zprávy půvo
$labels['autoaddsignature'] = 'Automaticky přidat podpis';
$labels['newmessageonly'] = 'pouze k novým zprávám';
$labels['replyandforwardonly'] = 'jen k odpovědi a přeposílané zprávě';
-$labels['replysignaturepos'] = 'Při odpovídání nebo přeposílání zprávy vložit podpis';
-$labels['belowquote'] = 'pod citaci';
-$labels['abovequote'] = 'nad citaci';
$labels['insertsignature'] = 'Vložit podpis';
$labels['previewpanemarkread'] = 'Označit zobrazené zprávy jako přečtené';
$labels['afternseconds'] = 'po $n sekundách';
diff --git a/program/localization/cy_GB/labels.inc b/program/localization/cy_GB/labels.inc
index 9b695e140..2a22827bf 100644
--- a/program/localization/cy_GB/labels.inc
+++ b/program/localization/cy_GB/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Tudalen gyfredol';
$labels['unread'] = 'Heb eu darllen';
$labels['flagged'] = 'Nodwyd';
$labels['unanswered'] = 'Heb ei ateb';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Dilewyd';
$labels['undeleted'] = 'Heb ei ddileu';
$labels['invert'] = 'Gwrth-droi';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Wrth ateb, dileu\'r llofnod gwreiddiol o\'r n
$labels['autoaddsignature'] = 'Ychwanegu llofnod yn awtomatig';
$labels['newmessageonly'] = 'negeseuon newydd yn unig';
$labels['replyandforwardonly'] = 'atebion a danfon ymlaen yn unig';
-$labels['replysignaturepos'] = 'Wrth ateb neu ddanfon ymlaen, rhoi\'r llofnod';
-$labels['belowquote'] = 'o dan y dyfynniad';
-$labels['abovequote'] = 'uwchben y dyfynniad';
$labels['insertsignature'] = 'Mewnosod llofnod';
$labels['previewpanemarkread'] = 'Nodi negeseuon rhagolwg fel darllenwyd';
$labels['afternseconds'] = 'ar ôl $n eiliad';
diff --git a/program/localization/da_DK/labels.inc b/program/localization/da_DK/labels.inc
index cb4e3b55c..da92c2fcc 100644
--- a/program/localization/da_DK/labels.inc
+++ b/program/localization/da_DK/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Aktuel side';
$labels['unread'] = 'Ulæste';
$labels['flagged'] = 'Markeret';
$labels['unanswered'] = 'Ubesvaret';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Slettede';
$labels['undeleted'] = 'Ikke slettet';
$labels['invert'] = 'Invertér';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Fjern original signatur fra besked, når der
$labels['autoaddsignature'] = 'Indsæt automatisk signatur';
$labels['newmessageonly'] = 'kun på nye beskeder';
$labels['replyandforwardonly'] = 'kun på svar og videresendelse af beskeder';
-$labels['replysignaturepos'] = 'Når beskeder besvares eller videresendes; indsæt signatur';
-$labels['belowquote'] = 'under det citerede';
-$labels['abovequote'] = 'over det citerede';
$labels['insertsignature'] = 'Indsæt signatur';
$labels['previewpanemarkread'] = 'Markér forhåndsviste beskeder som læst';
$labels['afternseconds'] = 'efter $n sekunder';
diff --git a/program/localization/de_CH/labels.inc b/program/localization/de_CH/labels.inc
index 98bbd8837..82cee4fe2 100644
--- a/program/localization/de_CH/labels.inc
+++ b/program/localization/de_CH/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Aktuelle Seite';
$labels['unread'] = 'Ungelesene';
$labels['flagged'] = 'Markierte';
$labels['unanswered'] = 'Unbeantwortete';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Gelöschte';
$labels['undeleted'] = 'Nicht gelöscht';
$labels['invert'] = 'Umkehren';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Beim Antworten die Signatur der Originalnachr
$labels['autoaddsignature'] = 'Signatur automatisch einfügen';
$labels['newmessageonly'] = 'nur bei neuen Nachrichten';
$labels['replyandforwardonly'] = 'nur bei Antworten und Weiterleitungen';
-$labels['replysignaturepos'] = 'Beim Antworten oder Weiterleiten die Signatur';
-$labels['belowquote'] = 'unter der Originalnachricht einfügen';
-$labels['abovequote'] = 'über der Originalnachricht einfügen';
$labels['insertsignature'] = 'Signatur einfügen';
$labels['previewpanemarkread'] = 'Nachricht in Vorschau als gelesen markieren';
$labels['afternseconds'] = 'nach $n Sekunden';
diff --git a/program/localization/de_DE/labels.inc b/program/localization/de_DE/labels.inc
index 956e32aa4..211607288 100644
--- a/program/localization/de_DE/labels.inc
+++ b/program/localization/de_DE/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Aktuelle Seite';
$labels['unread'] = 'Ungelesene';
$labels['flagged'] = 'Markierte';
$labels['unanswered'] = 'Unbeantwortete';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Gelöschte';
$labels['undeleted'] = 'Nicht gelöscht';
$labels['invert'] = 'Invertieren';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Beim Antworten Signatur der Originalnachricht
$labels['autoaddsignature'] = 'Signatur automatisch einfügen';
$labels['newmessageonly'] = 'nur bei neuen Nachrichten';
$labels['replyandforwardonly'] = 'nur bei Antworten und Weiterleitungen';
-$labels['replysignaturepos'] = 'Beim Antworten die Signatur';
-$labels['belowquote'] = 'unter der Originalnachricht einfügen';
-$labels['abovequote'] = 'über der Originalnachricht einfügen';
$labels['insertsignature'] = 'Signatur einfügen';
$labels['previewpanemarkread'] = 'Nachricht in Vorschau als gelesen markieren';
$labels['afternseconds'] = 'nach $n Sekunden';
diff --git a/program/localization/el_GR/labels.inc b/program/localization/el_GR/labels.inc
index b3166730f..4e1db7002 100644
--- a/program/localization/el_GR/labels.inc
+++ b/program/localization/el_GR/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Τρέχουσα σελίδα';
$labels['unread'] = 'Μη αναγνωσμένο';
$labels['flagged'] = 'Σημειωμένο';
$labels['unanswered'] = 'Αναπάντητο';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Διεγραμμένο';
$labels['undeleted'] = 'Μη διεγραμμένο';
$labels['invert'] = 'Αναστροφή';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Όταν το μήνυμα είναι απά
$labels['autoaddsignature'] = 'Η υπογραφή να προστίθεται αυτόματα';
$labels['newmessageonly'] = 'μόνο στα νέα μηνύματα';
$labels['replyandforwardonly'] = 'μόνο στις απαντήσεις και προωθήσεις';
-$labels['replysignaturepos'] = 'Όταν γίνεται απάντηση ή προώθηση, η υπογραφή να τοποθετείτε';
-$labels['belowquote'] = 'πάνω από την παράθεση';
-$labels['abovequote'] = 'κάτω από την παράθεση';
$labels['insertsignature'] = 'Προσθήκη υπογραφής';
$labels['previewpanemarkread'] = 'Στα μηνύματα που έγινε προεπισκόπηση να μαρκάρονται σαν αναγνωσμένα';
$labels['afternseconds'] = 'μετά από $n δευτερόλεπτα';
diff --git a/program/localization/en_GB/labels.inc b/program/localization/en_GB/labels.inc
index 49b6be519..8d5509b64 100644
--- a/program/localization/en_GB/labels.inc
+++ b/program/localization/en_GB/labels.inc
@@ -162,6 +162,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';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc
index 252e0ce68..3e1bde0a5 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -162,6 +162,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';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/eo/labels.inc b/program/localization/eo/labels.inc
index 823fc25cb..bb678479e 100644
--- a/program/localization/eo/labels.inc
+++ b/program/localization/eo/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Nuna paĝo';
$labels['unread'] = 'Nelegitan';
$labels['flagged'] = 'Markita';
$labels['unanswered'] = 'Nerespondita';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Forigita';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Inversigu';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/es_AR/labels.inc b/program/localization/es_AR/labels.inc
index 3e6793e51..b4b318053 100644
--- a/program/localization/es_AR/labels.inc
+++ b/program/localization/es_AR/labels.inc
@@ -41,7 +41,7 @@ $labels['junk'] = 'Basura';
// message listing
$labels['subject'] = 'Asunto';
$labels['from'] = 'Remitente';
-$labels['sender'] = 'Sender';
+$labels['sender'] = 'Remitente';
$labels['to'] = 'Destinatario';
$labels['cc'] = 'Copia';
$labels['bcc'] = 'Cco';
@@ -52,21 +52,21 @@ $labels['size'] = 'Tamaño';
$labels['priority'] = 'Prioridad';
$labels['organization'] = 'Organización';
$labels['readstatus'] = 'Read status';
-$labels['listoptions'] = 'List options...';
+$labels['listoptions'] = 'Listar opciones...';
$labels['mailboxlist'] = 'Carpetas';
$labels['messagesfromto'] = 'Mensajes $from a $to de $count';
-$labels['threadsfromto'] = 'Threads $from to $to of $count';
+$labels['threadsfromto'] = '$from a $to de $count conversaciones';
$labels['messagenrof'] = 'Mensaje $nr de $count';
-$labels['fromtoshort'] = '$from – $to of $count';
+$labels['fromtoshort'] = '$from – $to de $count';
$labels['copy'] = 'Copiar';
$labels['move'] = 'Mover';
$labels['moveto'] = 'Mover a...';
$labels['download'] = 'Descargar';
$labels['open'] = 'Open';
-$labels['showattachment'] = 'Show';
-$labels['showanyway'] = 'Show it anyway';
+$labels['showattachment'] = 'Mostrar';
+$labels['showanyway'] = 'Mostrar esto siempre';
$labels['filename'] = 'Nombre del archivo';
$labels['filesize'] = 'Tamaño del archivo';
@@ -122,18 +122,18 @@ $labels['longdec'] = 'Diciembre';
$labels['today'] = 'Hoy';
// toolbar buttons
-$labels['refresh'] = 'Refresh';
+$labels['refresh'] = 'Actualizar';
$labels['checkmail'] = 'Revisar si hay nuevos mensajes';
$labels['compose'] = 'Escribir un mensaje';
$labels['writenewmessage'] = 'Crear nuevo mensaje';
-$labels['reply'] = 'Reply';
+$labels['reply'] = 'Responder';
$labels['replytomessage'] = 'Responder mensaje';
$labels['replytoallmessage'] = 'Responder al emisor y a todos los destinatarios';
-$labels['replyall'] = 'Reply all';
-$labels['replylist'] = 'Reply list';
-$labels['forward'] = 'Forward';
-$labels['forwardinline'] = 'Forward inline';
-$labels['forwardattachment'] = 'Forward as attachment';
+$labels['replyall'] = 'Responder a todos';
+$labels['replylist'] = 'Responder a lista';
+$labels['forward'] = 'Reenviar';
+$labels['forwardinline'] = 'Reenviar en linea';
+$labels['forwardattachment'] = 'Reenviar como adjunto';
$labels['forwardmessage'] = 'Reenviar mensaje';
$labels['deletemessage'] = 'Eliminar mensaje';
$labels['movemessagetotrash'] = 'Mover mensaje a la papelera';
@@ -144,16 +144,16 @@ $labels['nextmessage'] = 'Mostrar siguente mensaje';
$labels['lastmessage'] = 'Mostrar último mensaje';
$labels['backtolist'] = 'Volver a la lista de mensajes';
$labels['viewsource'] = 'Mostrar código';
-$labels['mark'] = 'Mark';
+$labels['mark'] = 'Marcar';
$labels['markmessages'] = 'Marcar mensajes';
$labels['markread'] = 'Como leído';
$labels['markunread'] = 'Como no leído';
$labels['markflagged'] = 'Como marcado';
$labels['markunflagged'] = 'Como no marcado';
-$labels['moreactions'] = 'More actions...';
-$labels['more'] = 'More';
-$labels['back'] = 'Back';
-$labels['options'] = 'Options';
+$labels['moreactions'] = 'Mas acciones...';
+$labels['more'] = 'Más';
+$labels['back'] = 'Atrás';
+$labels['options'] = 'Opciones';
$labels['select'] = 'Elija';
$labels['all'] = 'Todos';
@@ -162,34 +162,35 @@ $labels['currpage'] = 'Página actual';
$labels['unread'] = 'Sin leer';
$labels['flagged'] = 'Marcado';
$labels['unanswered'] = 'Sin respuesta';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Eliminado';
-$labels['undeleted'] = 'Not deleted';
+$labels['undeleted'] = 'No eliminado';
$labels['invert'] = 'Invertir';
$labels['filter'] = 'Filtrar';
-$labels['list'] = 'List';
-$labels['threads'] = 'Threads';
+$labels['list'] = 'Lista';
+$labels['threads'] = 'Conversaciones';
$labels['expand-all'] = 'Expandir Todos';
$labels['expand-unread'] = 'Expandir No Leidos';
$labels['collapse-all'] = 'Colapsar Todos';
-$labels['threaded'] = 'Threaded';
+$labels['threaded'] = 'Como conversaciones';
-$labels['autoexpand_threads'] = 'Expand message threads';
-$labels['do_expand'] = 'all threads';
+$labels['autoexpand_threads'] = 'Expandir mensajes en conversación';
+$labels['do_expand'] = 'todas las conversaciones';
$labels['expand_only_unread'] = 'solo con mensajes no leídos';
-$labels['fromto'] = 'From/To';
-$labels['flag'] = 'Flag';
+$labels['fromto'] = 'De/A';
+$labels['flag'] = 'Marca';
$labels['attachment'] = 'Adjunto';
$labels['nonesort'] = 'Ninguno';
$labels['sentdate'] = 'Fecha de Enviado';
$labels['arrival'] = 'Fecha de Recepción';
$labels['asc'] = 'Ascendente';
$labels['desc'] = 'Descendente';
-$labels['listcolumns'] = 'List columns';
-$labels['listsorting'] = 'Sorting column';
-$labels['listorder'] = 'Sorting order';
+$labels['listcolumns'] = 'Listar columnas';
+$labels['listsorting'] = 'Ordenar por';
+$labels['listorder'] = 'Ordenado por';
$labels['listmode'] = 'List view mode';
-$labels['folderactions'] = 'Folder actions...';
+$labels['folderactions'] = 'Acciones de carpeta...';
$labels['compact'] = 'Compactar';
$labels['empty'] = 'Vaciar';
@@ -210,29 +211,29 @@ $labels['changeformathtml'] = 'Display in HTML format';
// message compose
$labels['editasnew'] = 'Editar como nuevo';
-$labels['send'] = 'Send';
+$labels['send'] = 'Enviar';
$labels['sendmessage'] = 'Enviar ahora el mensaje';
$labels['savemessage'] = 'Guardar como borrador';
$labels['addattachment'] = 'Añadir un archivo';
$labels['charset'] = 'Codificación';
$labels['editortype'] = 'Tipo de editor';
$labels['returnreceipt'] = 'Acuse de recibo';
-$labels['dsn'] = 'Delivery status notification';
-$labels['mailreplyintro'] = 'On $date, $sender wrote:';
-$labels['originalmessage'] = 'Original Message';
+$labels['dsn'] = 'Notificación de estado del envío';
+$labels['mailreplyintro'] = 'El $date, $sender escribió:';
+$labels['originalmessage'] = 'Mensaje original';
-$labels['editidents'] = 'Edit identities';
-$labels['spellcheck'] = 'Spell';
+$labels['editidents'] = 'Editar identidades';
+$labels['spellcheck'] = 'Gramática';
$labels['checkspelling'] = 'Revisar ortografía';
$labels['resumeediting'] = 'Continuar edición';
$labels['revertto'] = 'Revertir a';
-$labels['attach'] = 'Attach';
+$labels['attach'] = 'Adjuntar';
$labels['attachments'] = 'Adjuntos';
$labels['upload'] = 'Agregar';
-$labels['uploadprogress'] = '$percent ($current from $total)';
+$labels['uploadprogress'] = '$percent ($current de $total)';
$labels['close'] = 'Cerrar';
-$labels['messageoptions'] = 'Message options...';
+$labels['messageoptions'] = 'Opciones de mensaje...';
$labels['low'] = 'Bajo';
$labels['lowest'] = 'Bajísimo';
@@ -243,9 +244,9 @@ $labels['highest'] = 'Altísimo';
$labels['nosubject'] = '(sin asunto)';
$labels['showimages'] = 'Mostrar imágenes';
$labels['alwaysshow'] = 'Siempre mostrar imágenes de $sender';
-$labels['isdraft'] = 'This is a draft message.';
-$labels['andnmore'] = '$nr more...';
-$labels['togglemoreheaders'] = 'Show more message headers';
+$labels['isdraft'] = 'Este es un borrador.';
+$labels['andnmore'] = '$nr más...';
+$labels['togglemoreheaders'] = 'Mostrarme más encabezados de mensaje';
$labels['togglefullheaders'] = 'Toggle raw message headers';
$labels['htmltoggle'] = 'HTML';
@@ -269,68 +270,68 @@ $labels['receiptnote'] = 'Nota: Esta notificación sólo significa que su mensaj
$labels['name'] = 'Nombre completo';
$labels['firstname'] = 'Nombre';
$labels['surname'] = 'Apellido';
-$labels['middlename'] = 'Middle Name';
-$labels['nameprefix'] = 'Prefix';
-$labels['namesuffix'] = 'Suffix';
-$labels['nickname'] = 'Nickname';
-$labels['jobtitle'] = 'Job Title';
-$labels['department'] = 'Department';
-$labels['gender'] = 'Gender';
-$labels['maidenname'] = 'Maiden Name';
+$labels['middlename'] = 'Segundo nombre';
+$labels['nameprefix'] = 'Prefijo';
+$labels['namesuffix'] = 'Subfijo';
+$labels['nickname'] = 'Sobre nombre';
+$labels['jobtitle'] = 'Puesto';
+$labels['department'] = 'Departamento';
+$labels['gender'] = 'Sexo';
+$labels['maidenname'] = 'Apellido de soltera';
$labels['email'] = 'Correo';
-$labels['phone'] = 'Phone';
-$labels['address'] = 'Address';
-$labels['street'] = 'Street';
-$labels['locality'] = 'City';
-$labels['zipcode'] = 'ZIP Code';
-$labels['region'] = 'State/Province';
-$labels['country'] = 'Country';
-$labels['birthday'] = 'Birthday';
-$labels['anniversary'] = 'Anniversary';
-$labels['website'] = 'Website';
-$labels['instantmessenger'] = 'IM';
-$labels['notes'] = 'Notes';
-$labels['male'] = 'male';
-$labels['female'] = 'female';
-$labels['manager'] = 'Manager';
-$labels['assistant'] = 'Assistant';
-$labels['spouse'] = 'Spouse';
-$labels['allfields'] = 'All fields';
-$labels['search'] = 'Search';
-$labels['advsearch'] = 'Advanced Search';
-$labels['advanced'] = 'Advanced';
-$labels['other'] = 'Other';
-
-$labels['typehome'] = 'Home';
-$labels['typework'] = 'Work';
-$labels['typeother'] = 'Other';
-$labels['typemobile'] = 'Mobile';
-$labels['typemain'] = 'Main';
-$labels['typehomefax'] = 'Home Fax';
-$labels['typeworkfax'] = 'Work Fax';
-$labels['typecar'] = 'Car';
+$labels['phone'] = 'Teléfono';
+$labels['address'] = 'Dirección';
+$labels['street'] = 'Calle';
+$labels['locality'] = 'Ciudad';
+$labels['zipcode'] = 'Código Postal';
+$labels['region'] = 'Estado/Provincia';
+$labels['country'] = 'País';
+$labels['birthday'] = 'Cumpleaños';
+$labels['anniversary'] = 'Aniversario';
+$labels['website'] = 'Sitio Web';
+$labels['instantmessenger'] = 'Mensajería Instantanea';
+$labels['notes'] = 'Notas';
+$labels['male'] = 'masculino';
+$labels['female'] = 'femenino';
+$labels['manager'] = 'Administrador';
+$labels['assistant'] = 'Asistente';
+$labels['spouse'] = 'Cónygue';
+$labels['allfields'] = 'Todos los campos';
+$labels['search'] = 'Buscar';
+$labels['advsearch'] = 'Búsqueda Avanzada';
+$labels['advanced'] = 'Avanzado';
+$labels['other'] = 'Otro';
+
+$labels['typehome'] = 'Particular';
+$labels['typework'] = 'Laboral';
+$labels['typeother'] = 'Otro';
+$labels['typemobile'] = 'Móvil';
+$labels['typemain'] = 'Principal';
+$labels['typehomefax'] = 'Fax Particular';
+$labels['typeworkfax'] = 'Fax Laboral';
+$labels['typecar'] = 'Auto';
$labels['typepager'] = 'Pager';
$labels['typevideo'] = 'Video';
-$labels['typeassistant'] = 'Assistant';
-$labels['typehomepage'] = 'Home Page';
+$labels['typeassistant'] = 'Asistente';
+$labels['typehomepage'] = 'Página Personal';
$labels['typeblog'] = 'Blog';
-$labels['typeprofile'] = 'Profile';
+$labels['typeprofile'] = 'Perfil';
-$labels['addfield'] = 'Add field...';
+$labels['addfield'] = 'Agregar campo...';
$labels['addcontact'] = 'Añadir nuevo contacto';
$labels['editcontact'] = 'Editar contacto';
-$labels['contacts'] = 'Contacts';
-$labels['contactproperties'] = 'Contact properties';
-$labels['personalinfo'] = 'Personal information';
+$labels['contacts'] = 'Contactos';
+$labels['contactproperties'] = 'Propiedades del contacto';
+$labels['personalinfo'] = 'Información personal';
$labels['edit'] = 'Editar';
$labels['cancel'] = 'Cancelar';
$labels['save'] = 'Guardar';
$labels['delete'] = 'Eliminar';
-$labels['rename'] = 'Rename';
-$labels['addphoto'] = 'Add';
-$labels['replacephoto'] = 'Replace';
-$labels['uploadphoto'] = 'Upload photo';
+$labels['rename'] = 'Renombrar';
+$labels['addphoto'] = 'Agregar';
+$labels['replacephoto'] = 'Reemplazar';
+$labels['uploadphoto'] = 'Subir foto';
$labels['newcontact'] = 'Añadir nuevo contacto';
$labels['deletecontact'] = 'Eliminar contactos seleccionados';
@@ -342,9 +343,9 @@ $labels['exportall'] = 'Export all';
$labels['exportsel'] = 'Export selected';
$labels['exportvcards'] = 'Exportar contactos en format vCard';
$labels['newcontactgroup'] = 'Crear Nuevo Grupo de Contacto';
-$labels['grouprename'] = 'Rename group';
-$labels['groupdelete'] = 'Delete group';
-$labels['groupremoveselected'] = 'Remove selected contacts from group';
+$labels['grouprename'] = 'Renombrar grupo';
+$labels['groupdelete'] = 'Eliminar grupo';
+$labels['groupremoveselected'] = 'Remover del grupo los contactos seleccionados';
$labels['previouspage'] = 'Mostrar grupo anterior';
$labels['firstpage'] = 'Mostrar primer grupo';
@@ -355,20 +356,20 @@ $labels['group'] = 'Grupo';
$labels['groups'] = 'Grupos';
$labels['personaladrbook'] = 'Direcciones personales';
-$labels['searchsave'] = 'Save search';
-$labels['searchdelete'] = 'Delete search';
+$labels['searchsave'] = 'Guardar búsqueda';
+$labels['searchdelete'] = 'Eliminar búsqueda';
$labels['import'] = 'Importar';
$labels['importcontacts'] = 'Importar contactos';
$labels['importfromfile'] = 'Importar desde el archivo:';
-$labels['importtarget'] = 'Add new contacts to address book:';
+$labels['importtarget'] = 'Agregar nuevos contactos a la libreta de direcciones:';
$labels['importreplace'] = 'Reemplazar completamente la lista de contactos';
-$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['importdesc'] = 'Puedes subir contactos desde una libreta de direcciones existente.<br/>Actualmente soportamos la importación de direcciones utilizando el formato <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> o CSV (Valores Separados por Coma).';
$labels['done'] = 'Hecho';
// settings
$labels['settingsfor'] = 'Configuración para';
-$labels['about'] = 'About';
+$labels['about'] = 'Acerca de';
$labels['preferences'] = 'Preferencias';
$labels['userpreferences'] = 'Preferencias de usuario';
$labels['editpreferences'] = 'Editar preferencias de usuario';
@@ -385,8 +386,8 @@ $labels['defaultcharset'] = 'Juego de Caracteres por Defecto';
$labels['htmlmessage'] = 'Mensaje HTML';
$labels['messagepart'] = 'Part';
$labels['digitalsig'] = 'Digital Signature';
-$labels['dateformat'] = 'Date format';
-$labels['timeformat'] = 'Time format';
+$labels['dateformat'] = 'Formato de fecha';
+$labels['timeformat'] = 'Formato de tiempo';
$labels['prettydate'] = 'Fecha detallada';
$labels['setdefault'] = 'Seleccionar opción por defecto';
$labels['autodetect'] = 'Automático';
@@ -395,11 +396,11 @@ $labels['timezone'] = 'Zona horaria';
$labels['pagesize'] = 'Filas por página';
$labels['signature'] = 'Firma';
$labels['dstactive'] = 'Cambio de horario';
-$labels['showinextwin'] = 'Open message in a new window';
-$labels['composeextwin'] = 'Compose in a new window';
+$labels['showinextwin'] = 'Abrir mensaje en nueva ventana';
+$labels['composeextwin'] = 'Redactar en nueva ventana';
$labels['htmleditor'] = 'Componer mensaje en HTML';
-$labels['htmlonreply'] = 'on reply to HTML message';
-$labels['htmlonreplyandforward'] = 'on forward or reply to HTML message';
+$labels['htmlonreply'] = 'al responder un mensaje HTML';
+$labels['htmlonreplyandforward'] = 'al reenviar o responder un mensaje HTML';
$labels['htmlsignature'] = 'Firma HTML';
$labels['previewpane'] = 'Mostrar vista preliminar';
$labels['skin'] = 'Apariencia de la interfaz';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Al responder, eliminar la firma del mensaje o
$labels['autoaddsignature'] = 'Agregar la firma automáticamente';
$labels['newmessageonly'] = 'nuevos mensajes solamente';
$labels['replyandforwardonly'] = 'respuestas o reenvios solamente';
-$labels['replysignaturepos'] = 'Agregar firma al responder o reenviar';
-$labels['belowquote'] = 'debajo de la cita';
-$labels['abovequote'] = 'sobre la cita';
$labels['insertsignature'] = 'Insertar firma';
$labels['previewpanemarkread'] = 'Marcar mensajes previsualizados como leidos';
$labels['afternseconds'] = 'despues de $n segundos';
diff --git a/program/localization/es_ES/labels.inc b/program/localization/es_ES/labels.inc
index cbee58b6e..451b762b6 100644
--- a/program/localization/es_ES/labels.inc
+++ b/program/localization/es_ES/labels.inc
@@ -64,7 +64,7 @@ $labels['copy'] = 'Copiar';
$labels['move'] = 'Mover';
$labels['moveto'] = 'Mover a…';
$labels['download'] = 'Descargar';
-$labels['open'] = 'Open';
+$labels['open'] = 'Abrir';
$labels['showattachment'] = 'Mostrar';
$labels['showanyway'] = 'Mostrarlo de todos modos';
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Página actual';
$labels['unread'] = 'Sin leer';
$labels['flagged'] = 'Señalado';
$labels['unanswered'] = 'Sin respuesta';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Eliminado';
$labels['undeleted'] = 'No eliminado';
$labels['invert'] = 'Invertir';
@@ -205,8 +206,8 @@ $labels['body'] = 'Cuerpo';
$labels['openinextwin'] = 'Abrir en nueva ventana';
$labels['emlsave'] = 'Descargar (.eml)';
-$labels['changeformattext'] = 'Display in plain text format';
-$labels['changeformathtml'] = 'Display in HTML format';
+$labels['changeformattext'] = 'Mostrar en formato de texto sencillo';
+$labels['changeformathtml'] = 'Mostrar en formato HTML';
// message compose
$labels['editasnew'] = 'Editar como nuevo';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Eliminar la firma original del mensaje al res
$labels['autoaddsignature'] = 'Añadir firma automáticamente';
$labels['newmessageonly'] = 'solamente mensaje nuevo';
$labels['replyandforwardonly'] = 'respuestas y reenvíos solamente';
-$labels['replysignaturepos'] = 'Colocar firma al responder o reenviar';
-$labels['belowquote'] = 'abajo del texto seleccionado';
-$labels['abovequote'] = 'arriba del texto seleccionado';
$labels['insertsignature'] = 'Insertar firma';
$labels['previewpanemarkread'] = 'Marcar mensaje previsualizado como leído';
$labels['afternseconds'] = 'después de $n segundos';
diff --git a/program/localization/et_EE/labels.inc b/program/localization/et_EE/labels.inc
index cb184b086..ad47c15f1 100644
--- a/program/localization/et_EE/labels.inc
+++ b/program/localization/et_EE/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Praegune leht';
$labels['unread'] = 'Lugemata';
$labels['flagged'] = 'Märgistatud';
$labels['unanswered'] = 'Vastamata';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Kustutatud';
$labels['undeleted'] = 'Pole kustutatud';
$labels['invert'] = 'Vaheta';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Vastates eemalda kirjast esialgne allkiri';
$labels['autoaddsignature'] = 'Lisa allkiri automaatselt';
$labels['newmessageonly'] = 'ainult uutele';
$labels['replyandforwardonly'] = 'ainult vastates ja edastades';
-$labels['replysignaturepos'] = 'Vastates või edastades aseta allkiri';
-$labels['belowquote'] = 'tsiteeritu alla';
-$labels['abovequote'] = 'tsiteeritu kohale';
$labels['insertsignature'] = 'Sisesta allkiri';
$labels['previewpanemarkread'] = 'Märgi eelvaadatud kirjad loetuks';
$labels['afternseconds'] = '$n sekundi pärast';
diff --git a/program/localization/eu_ES/labels.inc b/program/localization/eu_ES/labels.inc
index eb61f4c8c..f6b3cfba6 100644
--- a/program/localization/eu_ES/labels.inc
+++ b/program/localization/eu_ES/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Uneko orrialdea';
$labels['unread'] = 'Irakurri gabeak';
$labels['flagged'] = 'Banderaduna';
$labels['unanswered'] = 'Unanswered';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Ezabatuak';
$labels['undeleted'] = 'Ezabatu gabeak';
$labels['invert'] = 'Invert';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/fa_AF/labels.inc b/program/localization/fa_AF/labels.inc
index 6a4904d7e..c8eab1d2c 100644
--- a/program/localization/fa_AF/labels.inc
+++ b/program/localization/fa_AF/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page';
$labels['unread'] = 'ناخوانده';
$labels['flagged'] = 'نشانی شده';
$labels['unanswered'] = 'پیامهای جواب نداده شده';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Deleted';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Invert';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/fa_IR/labels.inc b/program/localization/fa_IR/labels.inc
index 8bba66c26..a1c45fb36 100644
--- a/program/localization/fa_IR/labels.inc
+++ b/program/localization/fa_IR/labels.inc
@@ -22,7 +22,7 @@ $labels = array();
$labels['welcome'] = 'به $product خوش آمدید';
$labels['username'] = 'نام کاربری';
$labels['password'] = 'گذرواژه';
-$labels['server'] = 'سرور';
+$labels['server'] = 'سرویس‌دهنده';
$labels['login'] = 'ورود';
// taskbar
@@ -34,8 +34,8 @@ $labels['addressbook'] = 'دفتر نشانی';
// mailbox names
$labels['inbox'] = 'صندوق ورودی';
$labels['drafts'] = 'پیش‌نویس‌ها';
-$labels['sent'] = 'ارسال شده';
-$labels['trash'] = 'زباله‌دان';
+$labels['sent'] = 'فرستاده شده';
+$labels['trash'] = 'سطل آشغال';
$labels['junk'] = 'بنجل';
// message listing
@@ -162,6 +162,7 @@ $labels['currpage'] = 'صفحه جاری';
$labels['unread'] = 'خوانده‌نشده';
$labels['flagged'] = 'پرچم‌دار';
$labels['unanswered'] = 'پاسخ داده نشده';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'حذف شده';
$labels['undeleted'] = 'حذف نشده';
$labels['invert'] = 'وارونه';
@@ -205,8 +206,8 @@ $labels['body'] = 'بدنه';
$labels['openinextwin'] = 'باز کردن در پنجره‌ی جدید';
$labels['emlsave'] = 'بارگیری (.eml)';
-$labels['changeformattext'] = 'Display in plain text format';
-$labels['changeformathtml'] = 'Display in HTML format';
+$labels['changeformattext'] = 'نمایش در قالب متنی';
+$labels['changeformathtml'] = 'نمایش در قالب اچ‌تی‌ام‌ال';
// message compose
$labels['editasnew'] = 'ویرایش به عنوان جدید';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'هنگام پاسخ امضاء اصلی را
$labels['autoaddsignature'] = 'اضافه کردن خودکار امضاء';
$labels['newmessageonly'] = 'فقط پیغام جدید';
$labels['replyandforwardonly'] = 'فقط پاسخ‌ها و ارجاع‌ها';
-$labels['replysignaturepos'] = 'هنگام پاسخ یا ارجاع امضاء را قرار داده شود';
-$labels['belowquote'] = 'زیر نقل‌قول';
-$labels['abovequote'] = 'بالای نقل‌قول';
$labels['insertsignature'] = 'درج امضاء';
$labels['previewpanemarkread'] = 'نشانه‌گذاری پیغام‌های پیش مرور شده به عنوان خوانده شده';
$labels['afternseconds'] = 'بعد از $s ثانیه';
diff --git a/program/localization/fi_FI/labels.inc b/program/localization/fi_FI/labels.inc
index 62c2d6b07..ccf14da93 100644
--- a/program/localization/fi_FI/labels.inc
+++ b/program/localization/fi_FI/labels.inc
@@ -64,6 +64,7 @@ $labels['copy'] = 'Kopioi';
$labels['move'] = 'Siirrä';
$labels['moveto'] = 'siirrä kansioon...';
$labels['download'] = 'lataa';
+$labels['open'] = 'Avaa';
$labels['showattachment'] = 'Näytä';
$labels['showanyway'] = 'Näytä silti';
@@ -161,6 +162,7 @@ $labels['currpage'] = 'Nykyinen sivu';
$labels['unread'] = 'Lukemattomat';
$labels['flagged'] = 'Korostettu';
$labels['unanswered'] = 'Vastaamaton';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Poistettu';
$labels['undeleted'] = 'Ei poistettu';
$labels['invert'] = 'Käännä';
@@ -204,6 +206,8 @@ $labels['body'] = 'Runko';
$labels['openinextwin'] = 'Avaa uudessa ikkunassa';
$labels['emlsave'] = 'Tallenna (.eml)';
+$labels['changeformattext'] = 'Näytä raakatekstimuodossa';
+$labels['changeformathtml'] = 'Näytä HTML-muodossa';
// message compose
$labels['editasnew'] = 'Muokkaa uutena';
@@ -360,7 +364,7 @@ $labels['importcontacts'] = 'Tuo yhteystiedot';
$labels['importfromfile'] = 'Tuo tiedostosta:';
$labels['importtarget'] = 'Lisää uudet yhteystiedot osoitekirjaan:';
$labels['importreplace'] = 'Korvaa koko osoitekirja';
-$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['importdesc'] = 'Voit tuoda yhteystietoja olemassa olevasta osoitekirjasta.<br/>Tuettuja muotoja ovat <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> ja CSV (pilkuin erotetut arvot).';
$labels['done'] = 'Valmis';
// settings
@@ -451,9 +455,6 @@ $labels['replyremovesignature'] = 'Vastattaessa poista alkuperäinen allekirjoit
$labels['autoaddsignature'] = 'Lisää allekirjoitus automaattisesti';
$labels['newmessageonly'] = 'vain uuteen viestiin';
$labels['replyandforwardonly'] = 'vain vastauksiin ja välityksiin';
-$labels['replysignaturepos'] = 'Vastattaessa tai välitettäessä laita allekirjoitus';
-$labels['belowquote'] = 'lainauksen alle';
-$labels['abovequote'] = 'lainauksen ylle';
$labels['insertsignature'] = 'Lisää allekirjoitus';
$labels['previewpanemarkread'] = 'Merkitse esikatsellut viestit luetuiksi';
$labels['afternseconds'] = '$n sekunnin jälkeen';
diff --git a/program/localization/fr_FR/labels.inc b/program/localization/fr_FR/labels.inc
index 4a78e565f..bc1078e8d 100644
--- a/program/localization/fr_FR/labels.inc
+++ b/program/localization/fr_FR/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Page courante';
$labels['unread'] = 'Non lus';
$labels['flagged'] = 'Marqué';
$labels['unanswered'] = 'Non répondu';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Supprimé';
$labels['undeleted'] = 'Non supprimé';
$labels['invert'] = 'Inverser';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'En répondant, supprimer la signature d\'orig
$labels['autoaddsignature'] = 'Ajouter la signature automatiquement';
$labels['newmessageonly'] = 'nouveau message uniquement';
$labels['replyandforwardonly'] = 'réponses et transferts uniquement';
-$labels['replysignaturepos'] = 'En répondant ou en transférant, placer la signature';
-$labels['belowquote'] = 'en-dessous de la citation';
-$labels['abovequote'] = 'au-dessus de la citation';
$labels['insertsignature'] = 'Insérer la signature';
$labels['previewpanemarkread'] = 'Marquer les messages prévisualisés comme lus';
$labels['afternseconds'] = 'après $n secondes';
diff --git a/program/localization/fy_NL/labels.inc b/program/localization/fy_NL/labels.inc
index d04d7e89c..1db0fe384 100644
--- a/program/localization/fy_NL/labels.inc
+++ b/program/localization/fy_NL/labels.inc
@@ -162,6 +162,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';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/ga_IE/labels.inc b/program/localization/ga_IE/labels.inc
index 7169a8800..39541bff8 100755
--- a/program/localization/ga_IE/labels.inc
+++ b/program/localization/ga_IE/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page';
$labels['unread'] = 'Na rudaí nach bhuil corraithe';
$labels['flagged'] = 'Flagged';
$labels['unanswered'] = 'Unanswered';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Deleted';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Invert';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/gl_ES/labels.inc b/program/localization/gl_ES/labels.inc
index 13fdfa793..49c5f5b68 100644
--- a/program/localization/gl_ES/labels.inc
+++ b/program/localization/gl_ES/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Páxina actual';
$labels['unread'] = 'Non lidas';
$labels['flagged'] = 'Marcadas';
$labels['unanswered'] = 'Non respostadas';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Marcadas como eliminadas';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Inverter';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Eliminar a firma do remitente ao respostar';
$labels['autoaddsignature'] = 'Engadir firma automáticamente';
$labels['newmessageonly'] = 'só nas mensaxes novas';
$labels['replyandforwardonly'] = 'só nas respostas e reenvíos';
-$labels['replysignaturepos'] = 'Ao respostar ou reenviar colocar a firma';
-$labels['belowquote'] = 'embaixo do texto citado';
-$labels['abovequote'] = 'enriba do texto citado';
$labels['insertsignature'] = 'Engadir firma';
$labels['previewpanemarkread'] = 'Marcar como lidas as mensaxes previsualizadas';
$labels['afternseconds'] = 'logo de $n segundos';
diff --git a/program/localization/he_IL/labels.inc b/program/localization/he_IL/labels.inc
index 698b73493..5176a5f5a 100644
--- a/program/localization/he_IL/labels.inc
+++ b/program/localization/he_IL/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'דף נוכחי';
$labels['unread'] = 'לא נקראו';
$labels['flagged'] = 'מסומן';
$labels['unanswered'] = 'לא נענה';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'נמחק';
$labels['undeleted'] = 'לא נמחק';
$labels['invert'] = 'היפוך הסימון';
@@ -456,9 +457,6 @@ $labels['replyremovesignature'] = 'החתימה תוסר מההודעה המקו
$labels['autoaddsignature'] = 'הוספה אוטומטית של חתימה';
$labels['newmessageonly'] = 'הודעה חדשה בלבד';
$labels['replyandforwardonly'] = 'מענה והעברת הודעה בלבד';
-$labels['replysignaturepos'] = 'במענה או בהעברת הודעה, החתימה תופיע';
-$labels['belowquote'] = 'בסוף ההודעה המקורית';
-$labels['abovequote'] = 'בתחילת ההודעה המקורית';
$labels['insertsignature'] = 'שיבוץ חתימה';
$labels['previewpanemarkread'] = 'סימון הודעה שנצפתה כנקראה';
$labels['afternseconds'] = 'לאחר $n שניות';
diff --git a/program/localization/hi_IN/labels.inc b/program/localization/hi_IN/labels.inc
index 4564e1226..f446a3e65 100644
--- a/program/localization/hi_IN/labels.inc
+++ b/program/localization/hi_IN/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page';
$labels['unread'] = 'अनदेखी';
$labels['flagged'] = 'Flagged';
$labels['unanswered'] = 'Unanswered';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Deleted';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Invert';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/hr_HR/labels.inc b/program/localization/hr_HR/labels.inc
index bf5364653..fe85feccc 100644
--- a/program/localization/hr_HR/labels.inc
+++ b/program/localization/hr_HR/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Trenutna stranica';
$labels['unread'] = 'Nepročitane';
$labels['flagged'] = 'Označene';
$labels['unanswered'] = 'Neodgovrene';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Obrisano';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Obrni';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Kod odgovaranja, makni originalni potpis iz p
$labels['autoaddsignature'] = 'Automatski dodaj potpis';
$labels['newmessageonly'] = 'samo nova poruka';
$labels['replyandforwardonly'] = 'samo odgovori i proslijeđivanja';
-$labels['replysignaturepos'] = 'Kod downloada ili proslijeđivanja postavi potpis';
-$labels['belowquote'] = 'ispod citata';
-$labels['abovequote'] = 'iznad citata';
$labels['insertsignature'] = 'Umetni potpis';
$labels['previewpanemarkread'] = 'Obilježi pregledane poruke kao pročitane';
$labels['afternseconds'] = 'nakon $n sekundi';
diff --git a/program/localization/hu_HU/labels.inc b/program/localization/hu_HU/labels.inc
index 96c43d146..03846cdff 100644
--- a/program/localization/hu_HU/labels.inc
+++ b/program/localization/hu_HU/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Aktuális oldal';
$labels['unread'] = 'Olvasatlan';
$labels['flagged'] = 'Megjelölt';
$labels['unanswered'] = 'Megválaszolatlan';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Törölt';
$labels['undeleted'] = 'Nem lett törölve';
$labels['invert'] = 'Invertálás';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Válasznál az eredeti aláírás eltávolít
$labels['autoaddsignature'] = 'Aláírás automatikus hozzáadása';
$labels['newmessageonly'] = 'csak új üzenetnél';
$labels['replyandforwardonly'] = 'válasznál és továbbításnál';
-$labels['replysignaturepos'] = 'Válasznál és továbbításnál kerüljön az aláírás';
-$labels['belowquote'] = 'az idézett szöveg alá';
-$labels['abovequote'] = 'az idézett szöveg fölé';
$labels['insertsignature'] = 'Aláírás beillesztése';
$labels['previewpanemarkread'] = 'Előnézetben megjelent üzenetek megjelölése olvasottként';
$labels['afternseconds'] = '$n másodperc elteltével';
diff --git a/program/localization/hy_AM/labels.inc b/program/localization/hy_AM/labels.inc
index 3612dc974..a27a19a9d 100644
--- a/program/localization/hy_AM/labels.inc
+++ b/program/localization/hy_AM/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Առկա էջ';
$labels['unread'] = 'Չկարդացածը';
$labels['flagged'] = 'Նշված';
$labels['unanswered'] = 'Անպատասխան';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Ջնջված';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Փոխատեղել';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Պատասխանելիս հեռացնել հ
$labels['autoaddsignature'] = 'Ավելացնել ստորագրություն';
$labels['newmessageonly'] = 'միայն նոր հաղորդագրություններում';
$labels['replyandforwardonly'] = 'պատասխաններում և փոխանցումներում';
-$labels['replysignaturepos'] = 'Ավելացնել ստորագրությունը պատասխանելիս կամ փոխանցելիս';
-$labels['belowquote'] = 'Մեջբերման ներքևում';
-$labels['abovequote'] = 'Մեջբերման վերևում';
$labels['insertsignature'] = 'Ներդնել ստորագրությունը';
$labels['previewpanemarkread'] = 'Նշել նախադիտված հաղորդագրությունները որպես ընթերցված';
$labels['afternseconds'] = '$n վարկյան հետո';
diff --git a/program/localization/ia/labels.inc b/program/localization/ia/labels.inc
index 89273c147..55e7fc2ad 100644
--- a/program/localization/ia/labels.inc
+++ b/program/localization/ia/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page';
$labels['unread'] = 'Non legite';
$labels['flagged'] = 'Marcate';
$labels['unanswered'] = 'Unanswered';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Delete';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Inverter';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automaticamente inserta signatura';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insertar signatura';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/id_ID/labels.inc b/program/localization/id_ID/labels.inc
index 4877434ed..c75c27196 100644
--- a/program/localization/id_ID/labels.inc
+++ b/program/localization/id_ID/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Halaman sekarang';
$labels['unread'] = 'Belum terbaca';
$labels['flagged'] = 'Ditandai';
$labels['unanswered'] = 'Belum terjawab';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Terhapus';
$labels['undeleted'] = 'Tidak terhapus';
$labels['invert'] = 'Sebaliknya';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'ketika membalas pesan hapus tanda tangan dari
$labels['autoaddsignature'] = 'Otomatis tambahkan tanda tangan';
$labels['newmessageonly'] = 'Hanya untuk pesan baru';
$labels['replyandforwardonly'] = 'Hanya untuk dijawab dan diteruskan';
-$labels['replysignaturepos'] = 'ketika membalas atau meneruskan pesan tambahkan tanda tangan';
-$labels['belowquote'] = 'Dibawah kutipan';
-$labels['abovequote'] = 'Diatas kutipan';
$labels['insertsignature'] = 'Isi tanda tangan';
$labels['previewpanemarkread'] = 'Tandai pesan yang sudah dilihat';
$labels['afternseconds'] = 'setelah $n detik';
diff --git a/program/localization/is_IS/labels.inc b/program/localization/is_IS/labels.inc
index c8d49bf23..b9d3fbc90 100644
--- a/program/localization/is_IS/labels.inc
+++ b/program/localization/is_IS/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Núverandi síða';
$labels['unread'] = 'Ólesið';
$labels['flagged'] = 'Flaggað';
$labels['unanswered'] = 'Ósvarað';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Eytt';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Umhverfa';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Þegar svarað fjarlægja upphaflega undirskr
$labels['autoaddsignature'] = 'Bæta undirskrift við sjálfkrafa';
$labels['newmessageonly'] = 'ný skeyti eingöngu';
$labels['replyandforwardonly'] = 'svör og áframsendingar eingöngu';
-$labels['replysignaturepos'] = 'Þegar skeytum er svarað eða áframsend setja undirskrift';
-$labels['belowquote'] = 'undir tilvitnun';
-$labels['abovequote'] = 'fyrir ofan tilvitnun';
$labels['insertsignature'] = 'Bæta undirskrift við';
$labels['previewpanemarkread'] = 'Merka forskoðuð skeyti sem lesin';
$labels['afternseconds'] = 'eftir $n sekúndur';
diff --git a/program/localization/it_IT/labels.inc b/program/localization/it_IT/labels.inc
index 97be929cf..29b708ec7 100644
--- a/program/localization/it_IT/labels.inc
+++ b/program/localization/it_IT/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Pagina corrente';
$labels['unread'] = 'Non letti';
$labels['flagged'] = 'Contrassegnato';
$labels['unanswered'] = 'Senza risposta';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Cancellato';
$labels['undeleted'] = 'Non eliminato';
$labels['invert'] = 'Inverti';
@@ -205,8 +206,8 @@ $labels['body'] = 'Body';
$labels['openinextwin'] = 'Apri in una nuova finestra';
$labels['emlsave'] = 'Scarica (.eml)';
-$labels['changeformattext'] = 'Display in plain text format';
-$labels['changeformathtml'] = 'Display in HTML format';
+$labels['changeformattext'] = 'Visualizza nel formato testo semplice';
+$labels['changeformathtml'] = 'Visualizza nel formato HTML';
// message compose
$labels['editasnew'] = 'Modifica come nuovo';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Quando rispondi, rimuovi la firma dal messagg
$labels['autoaddsignature'] = 'Aggiungi automaticamente la firma';
$labels['newmessageonly'] = 'solo ai nuovi messaggi';
$labels['replyandforwardonly'] = 'solo alle risposte e inoltri';
-$labels['replysignaturepos'] = 'In risposta o inoltro, posiziona la firma';
-$labels['belowquote'] = 'sotto la citazione';
-$labels['abovequote'] = 'sopra la citazione';
$labels['insertsignature'] = 'Inserisci firma';
$labels['previewpanemarkread'] = 'Segna i messagi in anteprima come letti';
$labels['afternseconds'] = 'dopo $n secondi';
diff --git a/program/localization/ja_JP/labels.inc b/program/localization/ja_JP/labels.inc
index 685dba0b3..6f1597593 100644
--- a/program/localization/ja_JP/labels.inc
+++ b/program/localization/ja_JP/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = '現在のページ';
$labels['unread'] = '未読';
$labels['flagged'] = 'フラグ付き';
$labels['unanswered'] = '未返信';
+$labels['withattachment'] = '添付ファイルあり';
$labels['deleted'] = '削除済み';
$labels['undeleted'] = '削除済みでない';
$labels['invert'] = '反転';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = '返信時に元の署名をメッセージか
$labels['autoaddsignature'] = '自動的に署名を付加';
$labels['newmessageonly'] = '新しいメッセージだけ';
$labels['replyandforwardonly'] = '返信と転送だけ';
-$labels['replysignaturepos'] = '返信や転送で署名を挿入する位置';
-$labels['belowquote'] = '引用の後';
-$labels['abovequote'] = '引用の前';
$labels['insertsignature'] = '署名を挿入';
$labels['previewpanemarkread'] = 'プレビューしたメッセージを既読に設定';
$labels['afternseconds'] = '$n秒後';
diff --git a/program/localization/ka_GE/labels.inc b/program/localization/ka_GE/labels.inc
index b3a712515..eb95c8264 100755
--- a/program/localization/ka_GE/labels.inc
+++ b/program/localization/ka_GE/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'მიმდინარე გვერდი';
$labels['unread'] = 'წაუკითხავი';
$labels['flagged'] = 'მონიშნული';
$labels['unanswered'] = 'უპასუხო';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'წაშლილი';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'შებრუნებული';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'წაიშალოს ხელმოწ
$labels['autoaddsignature'] = 'ავტომატურად დაემატოს ხელმოწერა';
$labels['newmessageonly'] = 'მხოლოდ ახალი შეტყობინება';
$labels['replyandforwardonly'] = 'მხოლოდ გადაგზავნის და პასუხის შემთხვევაში';
-$labels['replysignaturepos'] = 'მხოლოდ პასუხის ან გადაგზავნის შემთხვევაში გაყვეს ხელმოწერა';
-$labels['belowquote'] = 'ციტატის შემდეგ';
-$labels['abovequote'] = 'ციტატამდე';
$labels['insertsignature'] = 'ხელმოცერის ჩასმა';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = '$n წამის შემდეგ';
diff --git a/program/localization/km_KH/labels.inc b/program/localization/km_KH/labels.inc
index a344e60c2..f9d57812b 100644
--- a/program/localization/km_KH/labels.inc
+++ b/program/localization/km_KH/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'ទំព័រនេះ';
$labels['unread'] = 'មិនទាន់អាន';
$labels['flagged'] = 'មានកំណត់សំគាល់ដោយផ្កាយ';
$labels['unanswered'] = 'មិនទាន់ឆ្លើយតប';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'បានលុបរួច';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'បញ្ច្រស់';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'នៅ​ពេល​ឆ្លើយ​តប
$labels['autoaddsignature'] = 'បញ្ចូលហត្តលេខាដោយស្វ័យប្រវត្តិ';
$labels['newmessageonly'] = 'សំរាប់សំបុត្រថ្មីតែប៉ុណ្ណោះ';
$labels['replyandforwardonly'] = 'សំរាប់ឆើ្លយតប​និងផ្ញើបន្តតែ​ប៉ុណ្ណោះ';
-$labels['replysignaturepos'] = 'បញ្ចូលហត្តលេខានៅពេលឆើ្លយតប​និងផ្ញើបន្ត';
-$labels['belowquote'] = 'ពីក្រោមសម្រង់អត្ថបទ';
-$labels['abovequote'] = 'ពីលើសម្រង់អត្ថបទ';
$labels['insertsignature'] = 'បញ្ចូលហត្តលេខា';
$labels['previewpanemarkread'] = 'កំណត់សំបុត្រ​ដែល​បាន​បង្ហាញ​​ជា​សំបុត្របាន​អាន​រួច';
$labels['afternseconds'] = 'ក្រោយពី $n វិនាទី';
diff --git a/program/localization/ko_KR/labels.inc b/program/localization/ko_KR/labels.inc
index 667fb422a..c1e54590a 100644
--- a/program/localization/ko_KR/labels.inc
+++ b/program/localization/ko_KR/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = '현재 페이지';
$labels['unread'] = '읽지 않음';
$labels['flagged'] = '깃발로 표시됨';
$labels['unanswered'] = '답장하지 않음';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = '삭제됨';
$labels['undeleted'] = '삭제되지 않음';
$labels['invert'] = '반전';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = '회신 시 메시지에서 원문 서명을
$labels['autoaddsignature'] = '서명 자동으로 추가';
$labels['newmessageonly'] = '새로운 메시지에만';
$labels['replyandforwardonly'] = '회신 및 전달 시에만';
-$labels['replysignaturepos'] = '회신 또는 전달 시 서명 추가';
-$labels['belowquote'] = '인용문 하단';
-$labels['abovequote'] = '인용문 상단';
$labels['insertsignature'] = '서명 삽입';
$labels['previewpanemarkread'] = '미리 본 메시지를 읽음으로 표시';
$labels['afternseconds'] = '$n초 후';
diff --git a/program/localization/ku/labels.inc b/program/localization/ku/labels.inc
index 5c6786502..d4544de91 100644
--- a/program/localization/ku/labels.inc
+++ b/program/localization/ku/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page';
$labels['unread'] = 'Nexwendî';
$labels['flagged'] = 'Flagged';
$labels['unanswered'] = 'Unanswered';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Deleted';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Invert';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/lt_LT/labels.inc b/program/localization/lt_LT/labels.inc
index 376f9c771..0d6776550 100644
--- a/program/localization/lt_LT/labels.inc
+++ b/program/localization/lt_LT/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'matomus šiame puslapyje';
$labels['unread'] = 'neskaitytus';
$labels['flagged'] = 'su gairele';
$labels['unanswered'] = 'neatsakytus';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'pašalintus';
$labels['undeleted'] = 'Neištrintas';
$labels['invert'] = 'invertuoti';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Pašalinti cituojamame laiške esantį paraš
$labels['autoaddsignature'] = 'Automatiškai pridėti parašą';
$labels['newmessageonly'] = 'tik naujuose laiškuose';
$labels['replyandforwardonly'] = 'tik atsakymuose ir persiunčiamuose laiškuose';
-$labels['replysignaturepos'] = 'Atsakant ir persiunčiant laiškus, parašą pridėti';
-$labels['belowquote'] = 'po citata';
-$labels['abovequote'] = 'virš citatos';
$labels['insertsignature'] = 'Pridėti parašą';
$labels['previewpanemarkread'] = 'Peržiūros polangyje parodytus laiškus žymėti skaitytais';
$labels['afternseconds'] = 'praėjus $n sek.';
diff --git a/program/localization/lv_LV/labels.inc b/program/localization/lv_LV/labels.inc
index a71d5e554..70369b4dd 100644
--- a/program/localization/lv_LV/labels.inc
+++ b/program/localization/lv_LV/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Pašreizējā lapa';
$labels['unread'] = 'nelasītās';
$labels['flagged'] = 'iezīmētās';
$labels['unanswered'] = 'neatbildētās';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'dzēstās';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'invertēt';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Atbildot izņemt oriģinālo parakstu no vēs
$labels['autoaddsignature'] = 'Automātiski pievienot parakstu';
$labels['newmessageonly'] = 'tikai jaunas vēstules';
$labels['replyandforwardonly'] = 'tikai atbildes un pārsūtījumi';
-$labels['replysignaturepos'] = 'Atbildot vai pārsūtot ievietot parakstu';
-$labels['belowquote'] = 'zem citāta';
-$labels['abovequote'] = 'virs citāta';
$labels['insertsignature'] = 'Ievietot parakstu';
$labels['previewpanemarkread'] = 'Atzīmēt priekšskatītās vēstules kā lasītas';
$labels['afternseconds'] = 'pēc $n sekundēm';
diff --git a/program/localization/mk_MK/labels.inc b/program/localization/mk_MK/labels.inc
index c8190276e..dc11b98cc 100755
--- a/program/localization/mk_MK/labels.inc
+++ b/program/localization/mk_MK/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page';
$labels['unread'] = 'Непрочитани';
$labels['flagged'] = 'Обележано';
$labels['unanswered'] = 'Неодговорено';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Избришано';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Обратно';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'При одговарање отстрани
$labels['autoaddsignature'] = 'Автоматски додавај потпис';
$labels['newmessageonly'] = 'само нови писма';
$labels['replyandforwardonly'] = 'само одгорови и препраќања';
-$labels['replysignaturepos'] = 'При одговарање или препраќање стави потпис';
-$labels['belowquote'] = 'под цитираното';
-$labels['abovequote'] = 'над цитираното';
$labels['insertsignature'] = 'Вметни потпис';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/ml_IN/labels.inc b/program/localization/ml_IN/labels.inc
index 463256c0e..145d90b83 100644
--- a/program/localization/ml_IN/labels.inc
+++ b/program/localization/ml_IN/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'നിലവിലുളള പേജ്';
$labels['unread'] = 'വായിക്കാത്തത്';
$labels['flagged'] = 'അടയാളപ്പെടുത്തിയവ';
$labels['unanswered'] = 'മറുപടി കൊടുക്കാത്ത';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'മായ്ച്ചവ';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'തലതിരിക്കുക';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'പുതിയ സന്ദേശം മാത്രം';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'ഉദ്ധാരണത്തിനു താഴെ';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = '$n നിമിഷങ്ങള്‍ കഴിഞ്ഞു്';
diff --git a/program/localization/mr_IN/labels.inc b/program/localization/mr_IN/labels.inc
index 804fb5651..e0143b293 100755
--- a/program/localization/mr_IN/labels.inc
+++ b/program/localization/mr_IN/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'सध्‍याचे पान';
$labels['unread'] = 'न वाचलेले';
$labels['flagged'] = 'खूण लावलेले';
$labels['unanswered'] = 'उत्तर न दिलेले';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'काढून टाकलेला(ले)';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'उलट करा';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'उत्‍तर देताना मु
$labels['autoaddsignature'] = 'आपोआप सही करा';
$labels['newmessageonly'] = 'फक्‍त नवीन संदेश';
$labels['replyandforwardonly'] = 'फक्‍त उत्‍तरे आ‍णी पुढे पाठवलेले संदेश';
-$labels['replysignaturepos'] = 'उत्‍तर देताना किंवा पुढे पाठवताना सही करा';
-$labels['belowquote'] = 'उतारया खाली';
-$labels['abovequote'] = 'उतारयाच्‍या वर';
$labels['insertsignature'] = 'सही मध्‍ये टाका';
$labels['previewpanemarkread'] = 'प्रदर्शित संदेश पाहीले अशी खुण करा';
$labels['afternseconds'] = '$n क्षणानंतर';
diff --git a/program/localization/ms_MY/labels.inc b/program/localization/ms_MY/labels.inc
index 43884e986..dae5caada 100644
--- a/program/localization/ms_MY/labels.inc
+++ b/program/localization/ms_MY/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Muka terkini';
$labels['unread'] = 'Belum dibaca';
$labels['flagged'] = 'Ditanda';
$labels['unanswered'] = 'Belum dijawab';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Telah dipadam';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Songsangkan';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/nb_NO/labels.inc b/program/localization/nb_NO/labels.inc
index ecbe8545e..de71714c6 100644
--- a/program/localization/nb_NO/labels.inc
+++ b/program/localization/nb_NO/labels.inc
@@ -41,7 +41,7 @@ $labels['junk'] = 'Spam';
// message listing
$labels['subject'] = 'Emne';
$labels['from'] = 'Avsender';
-$labels['sender'] = 'Sender';
+$labels['sender'] = 'Avsender';
$labels['to'] = 'Mottaker';
$labels['cc'] = 'Kopi til';
$labels['bcc'] = 'Blindkopi til';
@@ -64,6 +64,7 @@ $labels['copy'] = 'Kopier';
$labels['move'] = 'Flytt';
$labels['moveto'] = 'flytt til...';
$labels['download'] = 'last ned';
+$labels['open'] = 'Open';
$labels['showattachment'] = 'Vis';
$labels['showanyway'] = 'Vis likevel';
@@ -161,6 +162,7 @@ $labels['currpage'] = 'Gjeldende side';
$labels['unread'] = 'Uleste';
$labels['flagged'] = 'Flagget';
$labels['unanswered'] = 'Ubesvarte';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Slettet';
$labels['undeleted'] = 'Ikke slettet';
$labels['invert'] = 'Inverter';
@@ -200,10 +202,12 @@ $labels['quicksearch'] = 'Hurtigsøk';
$labels['resetsearch'] = 'Nullstill søk';
$labels['searchmod'] = 'Søke felt';
$labels['msgtext'] = 'Hele meldingen';
-$labels['body'] = 'Body';
+$labels['body'] = 'Meldingstekst';
$labels['openinextwin'] = 'Åpne i nytt vindu';
$labels['emlsave'] = 'Last ned (.eml)';
+$labels['changeformattext'] = 'Display in plain text format';
+$labels['changeformathtml'] = 'Display in HTML format';
// message compose
$labels['editasnew'] = 'Rediger som ny';
@@ -335,8 +339,8 @@ $labels['composeto'] = 'Skriv e-post til';
$labels['contactsfromto'] = 'Kontakter $from til $to av $count';
$labels['print'] = 'Skriv ut';
$labels['export'] = 'Eksporter';
-$labels['exportall'] = 'Export all';
-$labels['exportsel'] = 'Export selected';
+$labels['exportall'] = 'Eksporter alle';
+$labels['exportsel'] = 'Eksporter valgte';
$labels['exportvcards'] = 'Eksporter kontakter i vCard-format';
$labels['newcontactgroup'] = 'Opprett ny kontaktgruppe';
$labels['grouprename'] = 'Endre navn på gruppe';
@@ -380,7 +384,7 @@ $labels['edititem'] = 'Rediger punkt';
$labels['preferhtml'] = 'Foretrekk HTML';
$labels['defaultcharset'] = 'Standard tegnsett';
$labels['htmlmessage'] = 'HTML-melding';
-$labels['messagepart'] = 'Part';
+$labels['messagepart'] = 'Del';
$labels['digitalsig'] = 'Digital signatur';
$labels['dateformat'] = 'Datoformat';
$labels['timeformat'] = 'Tidsformat';
@@ -451,9 +455,6 @@ $labels['replyremovesignature'] = 'Fjern orginalsignaturen i svar på melding';
$labels['autoaddsignature'] = 'Legg til signatur';
$labels['newmessageonly'] = 'kun på nye meldinger';
$labels['replyandforwardonly'] = 'kun i svar og videresendinger';
-$labels['replysignaturepos'] = 'Plassering av signatur ved svar eller videresending';
-$labels['belowquote'] = 'over sitert melding';
-$labels['abovequote'] = 'under sitert melding';
$labels['insertsignature'] = 'Sett inn signatur';
$labels['previewpanemarkread'] = 'Merk forhåndsviste meldinger som lest';
$labels['afternseconds'] = 'etter $n sekunder';
diff --git a/program/localization/ne_NP/labels.inc b/program/localization/ne_NP/labels.inc
index 26be68f35..10aa1e2b7 100644
--- a/program/localization/ne_NP/labels.inc
+++ b/program/localization/ne_NP/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page';
$labels['unread'] = 'नपढिएका |';
$labels['flagged'] = 'Flagged';
$labels['unanswered'] = 'Unanswered';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Deleted';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Invert';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/nl_BE/labels.inc b/program/localization/nl_BE/labels.inc
index 82cf3a023..c9f07fa35 100644
--- a/program/localization/nl_BE/labels.inc
+++ b/program/localization/nl_BE/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Huidige pagina';
$labels['unread'] = 'Ongelezen';
$labels['flagged'] = 'Geselecteerd';
$labels['unanswered'] = 'Onbeantwoord';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Verwijderd';
$labels['undeleted'] = 'Niet verwijderd';
$labels['invert'] = 'Selectie omkeren';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Verwijder handtekening uit het origneel bij b
$labels['autoaddsignature'] = 'Handtekening automatisch toevoegen';
$labels['newmessageonly'] = 'alleen bij nieuwe berichten';
$labels['replyandforwardonly'] = 'alleen bij beantwoorden en doorsturen';
-$labels['replysignaturepos'] = 'Ondertekening plaatsen bij beantwoorden of doorsturen';
-$labels['belowquote'] = 'onder het citaat';
-$labels['abovequote'] = 'boven het citaat';
$labels['insertsignature'] = 'Handtekening invoegen';
$labels['previewpanemarkread'] = 'Markeer voorbeeldbericht als gelezen';
$labels['afternseconds'] = 'Na $n seconden';
diff --git a/program/localization/nl_NL/labels.inc b/program/localization/nl_NL/labels.inc
index 2d34a5135..042879b4b 100644
--- a/program/localization/nl_NL/labels.inc
+++ b/program/localization/nl_NL/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Huidige pagina';
$labels['unread'] = 'Ongelezen';
$labels['flagged'] = 'Gemarkeerd';
$labels['unanswered'] = 'Onbeantwoord';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Verwijderd';
$labels['undeleted'] = 'Niet verwijderd';
$labels['invert'] = 'Selectie omkeren';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Verwijder oorspronkelijke ondertekening van b
$labels['autoaddsignature'] = 'Ondertekening automatisch toevoegen';
$labels['newmessageonly'] = 'alleen bij nieuwe berichten';
$labels['replyandforwardonly'] = 'alleen bij antwoorden en doorsturen';
-$labels['replysignaturepos'] = 'Ondertekening plaatsen bij antwoorden of doorsturen';
-$labels['belowquote'] = 'onder het citaat';
-$labels['abovequote'] = 'boven het citaat';
$labels['insertsignature'] = 'Ondertekening invoegen';
$labels['previewpanemarkread'] = 'Markeer voorbeeldberichten als gelezen';
$labels['afternseconds'] = 'na $n seconden';
diff --git a/program/localization/nn_NO/labels.inc b/program/localization/nn_NO/labels.inc
index 725919d14..8fd281c97 100644
--- a/program/localization/nn_NO/labels.inc
+++ b/program/localization/nn_NO/labels.inc
@@ -64,6 +64,7 @@ $labels['copy'] = 'Kopier';
$labels['move'] = 'Flytt';
$labels['moveto'] = 'flytt til …';
$labels['download'] = 'Last ned';
+$labels['open'] = 'Open';
$labels['showattachment'] = 'Vis';
$labels['showanyway'] = 'Vis likevel';
@@ -161,6 +162,7 @@ $labels['currpage'] = 'Gjeldande side';
$labels['unread'] = 'Uleste';
$labels['flagged'] = 'Flagga';
$labels['unanswered'] = 'Ikkje svara';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Sletta';
$labels['undeleted'] = 'Ikkje sletta';
$labels['invert'] = 'Inverter';
@@ -204,6 +206,8 @@ $labels['body'] = 'Meldingstekst';
$labels['openinextwin'] = 'Opna i nytt vindauga';
$labels['emlsave'] = 'Last ned (.eml)';
+$labels['changeformattext'] = 'Display in plain text format';
+$labels['changeformathtml'] = 'Display in HTML format';
// message compose
$labels['editasnew'] = 'Rediger som ny';
@@ -335,8 +339,8 @@ $labels['composeto'] = 'Ny melding til';
$labels['contactsfromto'] = 'Kontaktar $from til $to av $count';
$labels['print'] = 'Skriv ut';
$labels['export'] = 'Eksport';
-$labels['exportall'] = 'Export all';
-$labels['exportsel'] = 'Export selected';
+$labels['exportall'] = 'Eksporter alle';
+$labels['exportsel'] = 'Eksporter valde';
$labels['exportvcards'] = 'Eksporter kontaktar i vCard-format';
$labels['newcontactgroup'] = 'Lag ny kontaktgruppe';
$labels['grouprename'] = 'Endre namn på gruppe';
@@ -451,9 +455,6 @@ $labels['replyremovesignature'] = 'Fjern den original signatur frå eposten når
$labels['autoaddsignature'] = 'Legg signatur til automatisk';
$labels['newmessageonly'] = 'berre på nye epostar';
$labels['replyandforwardonly'] = 'berre på svar og vidaresending';
-$labels['replysignaturepos'] = 'Når du svarar eller sender vidare, plasser signaturen';
-$labels['belowquote'] = 'nedanfor siteringa';
-$labels['abovequote'] = 'oppanfor siteringa';
$labels['insertsignature'] = 'Sett inn signatur';
$labels['previewpanemarkread'] = 'Merk forehandsviste epostar som leste';
$labels['afternseconds'] = 'etter $n sekund';
diff --git a/program/localization/pl_PL/labels.inc b/program/localization/pl_PL/labels.inc
index 7a4248830..eb6fe9b9a 100644
--- a/program/localization/pl_PL/labels.inc
+++ b/program/localization/pl_PL/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Bieżąca strona';
$labels['unread'] = 'Nieprzeczytane';
$labels['flagged'] = 'Oznaczone';
$labels['unanswered'] = 'Bez odpowiedzi';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Usunięte';
$labels['undeleted'] = 'Nieusunięte';
$labels['invert'] = 'Odwróć';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Podczas odpowiedzi usuń podpis z cytowanej t
$labels['autoaddsignature'] = 'Automatycznie wstaw podpis';
$labels['newmessageonly'] = 'tylko dla nowych wiadomości';
$labels['replyandforwardonly'] = 'tylko dla przekazywania i odpowiedzi';
-$labels['replysignaturepos'] = 'Podczas odpowiedzi wstaw podpis';
-$labels['belowquote'] = 'poniżej cytowanej treści';
-$labels['abovequote'] = 'ponad cytowaną treścią';
$labels['insertsignature'] = 'Wstaw podpis';
$labels['previewpanemarkread'] = 'Oznacz podglądane wiadomości jako przeczytane';
$labels['afternseconds'] = 'po $n sekundach';
diff --git a/program/localization/ps/labels.inc b/program/localization/ps/labels.inc
index 05f6c3d32..f4f2f5380 100755
--- a/program/localization/ps/labels.inc
+++ b/program/localization/ps/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page';
$labels['unread'] = 'نالوستي';
$labels['flagged'] = 'بې کاره';
$labels['unanswered'] = 'ناځواب شوي';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Deleted';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Invert';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/pt_BR/labels.inc b/program/localization/pt_BR/labels.inc
index 55068df5b..858fcbe7c 100644
--- a/program/localization/pt_BR/labels.inc
+++ b/program/localization/pt_BR/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Página atual';
$labels['unread'] = 'Não lidas';
$labels['flagged'] = 'Marcadas';
$labels['unanswered'] = 'Não respondidas';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Excluídas';
$labels['undeleted'] = 'Não excluídas';
$labels['invert'] = 'Inverter';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Remover assinatura original da mensagem ao re
$labels['autoaddsignature'] = 'Adicionar assinatura automaticamente';
$labels['newmessageonly'] = 'somente em novas mensagens';
$labels['replyandforwardonly'] = 'somente em respostas e encaminhamentos';
-$labels['replysignaturepos'] = 'Inserir assinatura ao responder ou encaminhar';
-$labels['belowquote'] = 'abaixo da citação';
-$labels['abovequote'] = 'acima da citação';
$labels['insertsignature'] = 'Inserir assinatura';
$labels['previewpanemarkread'] = 'Marcar mensagens pré-visualizadas como lidas';
$labels['afternseconds'] = 'depois de $n segundos';
diff --git a/program/localization/pt_PT/labels.inc b/program/localization/pt_PT/labels.inc
index 62fa8bbb4..17cae3795 100644
--- a/program/localization/pt_PT/labels.inc
+++ b/program/localization/pt_PT/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Página actual';
$labels['unread'] = 'Não lidas';
$labels['flagged'] = 'Sinalizadas';
$labels['unanswered'] = 'Não respondidas';
+$labels['withattachment'] = 'Com anexo';
$labels['deleted'] = 'Eliminadas';
$labels['undeleted'] = 'Não eliminada';
$labels['invert'] = 'Inverter selecção';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Ao responder, remover a assinatura original d
$labels['autoaddsignature'] = 'Adicionar assinatura automaticamente';
$labels['newmessageonly'] = 'apenas em novas mensagens';
$labels['replyandforwardonly'] = 'apenas em respostas e reenvios';
-$labels['replysignaturepos'] = 'Ao responder ou reencaminhar colocar assinatura';
-$labels['belowquote'] = 'depois da citação';
-$labels['abovequote'] = 'antes da citação';
$labels['insertsignature'] = 'Inserir assinatura';
$labels['previewpanemarkread'] = 'Marcar mensagem como lida';
$labels['afternseconds'] = 'após $n segundos';
diff --git a/program/localization/ro_RO/labels.inc b/program/localization/ro_RO/labels.inc
index 0dcd97919..7f458a543 100644
--- a/program/localization/ro_RO/labels.inc
+++ b/program/localization/ro_RO/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Pagina curentă';
$labels['unread'] = 'Necitite';
$labels['flagged'] = 'Marcat';
$labels['unanswered'] = 'Fără răspuns';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Şterse';
$labels['undeleted'] = 'Nu a fost șters';
$labels['invert'] = 'Inversează';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Când răspundeţi, se şterge semnătura ori
$labels['autoaddsignature'] = 'Adăugarea automată a semnăturii';
$labels['newmessageonly'] = 'numai la mesajele noi';
$labels['replyandforwardonly'] = 'numai la răspunsuri si cele trimise mai departe';
-$labels['replysignaturepos'] = 'Când răspundeţi sau trimiteţi mai departe, semnătura se va plasa';
-$labels['belowquote'] = 'dedesubtul citatului';
-$labels['abovequote'] = 'deasupra citatului';
$labels['insertsignature'] = 'Introduce o semnătură';
$labels['previewpanemarkread'] = 'Marchează mesajele previzualizate ca citite';
$labels['afternseconds'] = 'după $n secunde';
diff --git a/program/localization/ru_RU/labels.inc b/program/localization/ru_RU/labels.inc
index 6b6d0c6bd..970e30b88 100644
--- a/program/localization/ru_RU/labels.inc
+++ b/program/localization/ru_RU/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Текущая страница';
$labels['unread'] = 'Непрочитанные';
$labels['flagged'] = 'Помеченные';
$labels['unanswered'] = 'Неотвеченные';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Удаленное';
$labels['undeleted'] = 'Не удалено';
$labels['invert'] = 'Инвертное';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Удалить подпись при отве
$labels['autoaddsignature'] = 'Автоматически добавлять подпись';
$labels['newmessageonly'] = 'только в новых сообщениях';
$labels['replyandforwardonly'] = 'только в ответах и пересылках';
-$labels['replysignaturepos'] = 'Прикрепить подпись при ответе и пересылке';
-$labels['belowquote'] = 'после цитаты';
-$labels['abovequote'] = 'до цитаты';
$labels['insertsignature'] = 'Вставить подпись';
$labels['previewpanemarkread'] = 'Отмечать просмотренные сообщения как прочитанные';
$labels['afternseconds'] = 'через $n секунд';
diff --git a/program/localization/si_LK/labels.inc b/program/localization/si_LK/labels.inc
index eddc01b57..be091f4cf 100644
--- a/program/localization/si_LK/labels.inc
+++ b/program/localization/si_LK/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'දැනට ඇති පිටුව';
$labels['unread'] = 'නොකියවූ';
$labels['flagged'] = 'Flagged';
$labels['unanswered'] = 'Unanswered';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'මකා දැමූ';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Invert';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'ස්වයංක්‍රීයව අත්සන ඇතුලත් කරන්න';
$labels['newmessageonly'] = 'අලුත් පණිවිඩය පමණක්';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'අත්සන ඇතුලත් කරන්න';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'තත්පර $nකට පසු';
diff --git a/program/localization/sk_SK/labels.inc b/program/localization/sk_SK/labels.inc
index 7b993e77a..a48d265e8 100644
--- a/program/localization/sk_SK/labels.inc
+++ b/program/localization/sk_SK/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Aktuálna stránka';
$labels['unread'] = 'Neprečítané';
$labels['flagged'] = 'Označené';
$labels['unanswered'] = 'Neoznačené';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Zmazané';
$labels['undeleted'] = 'Nevymazané';
$labels['invert'] = 'Prevrátiť';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Pri odpovedaní odstrániť zo správy pôvod
$labels['autoaddsignature'] = 'Automaticky pridať podpis';
$labels['newmessageonly'] = 'iba k novým správam';
$labels['replyandforwardonly'] = 'len k odpovede a preposílanej správe';
-$labels['replysignaturepos'] = 'Pri odpovedaní alebo preposielanie správy vložiť podpis';
-$labels['belowquote'] = 'nad citáciu';
-$labels['abovequote'] = 'pod citáciu';
$labels['insertsignature'] = 'Vložit podpis';
$labels['previewpanemarkread'] = 'Označiť zobrazenej správy ako prečítané';
$labels['afternseconds'] = 'po $n sekundách';
diff --git a/program/localization/sl_SI/labels.inc b/program/localization/sl_SI/labels.inc
index 70150e4d9..8542acb9a 100644
--- a/program/localization/sl_SI/labels.inc
+++ b/program/localization/sl_SI/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Trenutna stran';
$labels['unread'] = 'Neprebrano';
$labels['flagged'] = 'Označeno';
$labels['unanswered'] = 'Neoznačeno';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Izbrisano';
$labels['undeleted'] = 'Ni izbrisano';
$labels['invert'] = 'Zamenjaj';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Pri odgovoru na sporočilo odstrani izvorni p
$labels['autoaddsignature'] = 'Samodejno dodaj podpis';
$labels['newmessageonly'] = 'samo novim sporočilom';
$labels['replyandforwardonly'] = 'samo k odgovorom in posredovanim sporočilom';
-$labels['replysignaturepos'] = 'Pri odgovoru ali posredovanju sporočila vstavi podpis';
-$labels['belowquote'] = 'pod citiran tekst';
-$labels['abovequote'] = 'nad citiran tekst';
$labels['insertsignature'] = 'Vstavi podpis';
$labels['previewpanemarkread'] = 'Označi predogledana sporočila kot prebrana';
$labels['afternseconds'] = 'po $n sekundah';
diff --git a/program/localization/sq_AL/labels.inc b/program/localization/sq_AL/labels.inc
index 52ff45cd6..0c61af687 100644
--- a/program/localization/sq_AL/labels.inc
+++ b/program/localization/sq_AL/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page';
$labels['unread'] = 'Palexuar';
$labels['flagged'] = 'Flagged';
$labels['unanswered'] = 'Unanswered';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Deleted';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Invert';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'Automatically add signature';
$labels['newmessageonly'] = 'new message only';
$labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'Insert signature';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/sr_CS/labels.inc b/program/localization/sr_CS/labels.inc
index 1e84735e6..15de82e52 100644
--- a/program/localization/sr_CS/labels.inc
+++ b/program/localization/sr_CS/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Тренутна страница';
$labels['unread'] = 'Непрочитане';
$labels['flagged'] = 'Означено';
$labels['unanswered'] = 'Неодговорено';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Обрисано';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'Уведи';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'При одговору одстрани ор
$labels['autoaddsignature'] = 'Аутоматски додај потпис';
$labels['newmessageonly'] = 'само нове поруке';
$labels['replyandforwardonly'] = 'само одговори и прослеђивања';
-$labels['replysignaturepos'] = 'При одговору или прослеђивању додај потпис';
-$labels['belowquote'] = 'испод квоте';
-$labels['abovequote'] = 'изнад квоте';
$labels['insertsignature'] = 'Убаци потпис';
$labels['previewpanemarkread'] = 'Прегледану поруку означи као прочитану';
$labels['afternseconds'] = 'након $n секунди';
diff --git a/program/localization/sv_SE/labels.inc b/program/localization/sv_SE/labels.inc
index c1a91cf82..e9def21f6 100644
--- a/program/localization/sv_SE/labels.inc
+++ b/program/localization/sv_SE/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Sida';
$labels['unread'] = 'Olästa';
$labels['flagged'] = 'Flaggade';
$labels['unanswered'] = 'Obesvarade';
+$labels['withattachment'] = 'Med bilaga';
$labels['deleted'] = 'Borttagna';
$labels['undeleted'] = 'Inte borttaget';
$labels['invert'] = 'Invertera';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Ta bort befintlig signatur från meddelandet
$labels['autoaddsignature'] = 'Infoga signatur automatiskt';
$labels['newmessageonly'] = 'Vid nytt meddelande';
$labels['replyandforwardonly'] = 'Vid svar och vidarebefordran';
-$labels['replysignaturepos'] = 'Vid svar eller vidarebefordran infoga signatur';
-$labels['belowquote'] = 'Nedanför befintligt meddelande';
-$labels['abovequote'] = 'Ovanför befintligt meddelande';
$labels['insertsignature'] = 'Infoga signatur';
$labels['previewpanemarkread'] = 'Märk meddelande som läst vid visning';
$labels['afternseconds'] = 'Efter $n sekunder';
diff --git a/program/localization/ta_IN/labels.inc b/program/localization/ta_IN/labels.inc
index 1cbffb588..ff0f5e0cc 100644
--- a/program/localization/ta_IN/labels.inc
+++ b/program/localization/ta_IN/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page';
$labels['unread'] = 'படிக்காதது';
$labels['flagged'] = 'நட்சத்திரமிட்டது';
$labels['unanswered'] = 'பதிலளிக்காதது';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'நீக்கியது';
$labels['undeleted'] = 'Not deleted';
$labels['invert'] = 'தலைகீழ்';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'பதிலளிக்கும் பே
$labels['autoaddsignature'] = 'தானாக கையொப்பத்தை சேர்';
$labels['newmessageonly'] = 'புது செய்தி மட்டும்';
$labels['replyandforwardonly'] = 'பதிலளிப்பு முன்அனுப்பு மட்டும்';
-$labels['replysignaturepos'] = 'பதிலளிக்கும் போதும் முன்அனுப்பும் போதும் கையோப்பமிடு';
-$labels['belowquote'] = 'மேற்கோளுக்கு கீழே';
-$labels['abovequote'] = 'மேற்கோளுக்கு மேலே';
$labels['insertsignature'] = 'கையோப்பமிடு';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/th_TH/labels.inc b/program/localization/th_TH/labels.inc
index 93f2304e1..7853cdd9d 100644
--- a/program/localization/th_TH/labels.inc
+++ b/program/localization/th_TH/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'หน้าปัจจุบัน';
$labels['unread'] = 'จดหมายที่ไม่ได้อ่าน';
$labels['flagged'] = 'Flagged';
$labels['unanswered'] = 'ยังไม่ได้ตอบ';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'ลบแล้ว';
$labels['undeleted'] = 'ยังไม่ได้ลบ';
$labels['invert'] = 'Invert';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from
$labels['autoaddsignature'] = 'เพิ่มลายเซ็นต์เข้าไปอัตโนมัติ';
$labels['newmessageonly'] = 'เฉพาะข้อความใหม่เท่านั้น';
$labels['replyandforwardonly'] = 'ตอบกลับและส่งต่อเท่านั้น';
-$labels['replysignaturepos'] = 'When replying or forwarding place signature';
-$labels['belowquote'] = 'below the quote';
-$labels['abovequote'] = 'above the quote';
$labels['insertsignature'] = 'แทรกลายเซ็นต์';
$labels['previewpanemarkread'] = 'Mark previewed messages as read';
$labels['afternseconds'] = 'after $n seconds';
diff --git a/program/localization/tr_TR/labels.inc b/program/localization/tr_TR/labels.inc
index d8e9e20cf..0b525ff55 100644
--- a/program/localization/tr_TR/labels.inc
+++ b/program/localization/tr_TR/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Şimdiki sayfa';
$labels['unread'] = 'Okunmamışları';
$labels['flagged'] = 'İşaretlenmişleri';
$labels['unanswered'] = 'Yanıtlanmamışları';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Silinmişleri';
$labels['undeleted'] = 'Silinmemiş';
$labels['invert'] = 'Seçimi Tersine Çevir';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Yanıtlarken önceki imzaları sil';
$labels['autoaddsignature'] = 'Otomatik olarak imza ekle';
$labels['newmessageonly'] = 'sadece yeni postalarda';
$labels['replyandforwardonly'] = 'sadece yanıtlar ve yönlendirmelerde';
-$labels['replysignaturepos'] = 'Yanıtlarken veya yönlendirirken imzayı yerleştir';
-$labels['belowquote'] = 'alıntının altına';
-$labels['abovequote'] = 'alıntının üstüne';
$labels['insertsignature'] = 'İmza ekle';
$labels['previewpanemarkread'] = 'Önzilemede görünen postaları okunmuş işaretle';
$labels['afternseconds'] = '$n saniye sonra';
diff --git a/program/localization/uk_UA/labels.inc b/program/localization/uk_UA/labels.inc
index 35be96cab..67ca0ed31 100644
--- a/program/localization/uk_UA/labels.inc
+++ b/program/localization/uk_UA/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = 'Поточна сторінка';
$labels['unread'] = 'Непрочитані';
$labels['flagged'] = 'Із зірочкою';
$labels['unanswered'] = 'Без відповіді';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Видалені';
$labels['undeleted'] = 'Не видалено';
$labels['invert'] = 'Інвертувати виділення';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'При відповіді видаляти п
$labels['autoaddsignature'] = 'Автоматично додавати підпис';
$labels['newmessageonly'] = 'тільки до нових листів';
$labels['replyandforwardonly'] = 'тільки при відповідях та пересилках';
-$labels['replysignaturepos'] = 'При відповідях чи пересилках додавати підпис';
-$labels['belowquote'] = 'після цитати';
-$labels['abovequote'] = 'перед цитатою';
$labels['insertsignature'] = 'Додати підпис';
$labels['previewpanemarkread'] = 'Позначити переглянуті листи як прочитані';
$labels['afternseconds'] = 'через $n секунд';
diff --git a/program/localization/vi_VN/labels.inc b/program/localization/vi_VN/labels.inc
index 00d04b46b..bece2f47d 100644
--- a/program/localization/vi_VN/labels.inc
+++ b/program/localization/vi_VN/labels.inc
@@ -64,6 +64,7 @@ $labels['copy'] = 'Sao chép';
$labels['move'] = 'Di Chuyển';
$labels['moveto'] = 'Di chuyển tới...';
$labels['download'] = 'Tải về';
+$labels['open'] = 'Open';
$labels['showattachment'] = 'Hiển thị';
$labels['showanyway'] = 'Tiếp tục hiển thị';
@@ -161,6 +162,7 @@ $labels['currpage'] = 'Trang hiện tại';
$labels['unread'] = 'Chưa đọc';
$labels['flagged'] = 'Đã đánh dấu';
$labels['unanswered'] = 'Chưa trả lời';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = 'Đã xóa';
$labels['undeleted'] = 'Chưa xóa được';
$labels['invert'] = 'Đảo ngược';
@@ -204,6 +206,8 @@ $labels['body'] = 'Nội dung thư';
$labels['openinextwin'] = 'Mở trong khung cửa mới';
$labels['emlsave'] = 'Tải về theo định dạng .eml';
+$labels['changeformattext'] = 'Display in plain text format';
+$labels['changeformathtml'] = 'Display in HTML format';
// message compose
$labels['editasnew'] = 'Sửa như một email mới';
@@ -335,8 +339,8 @@ $labels['composeto'] = 'Soạn thư cho';
$labels['contactsfromto'] = 'Liên hệ từ $from - $to / $count';
$labels['print'] = 'In ra';
$labels['export'] = 'Trích xuất';
-$labels['exportall'] = 'Export all';
-$labels['exportsel'] = 'Export selected';
+$labels['exportall'] = 'Xuất tất cả';
+$labels['exportsel'] = 'Xuất mục chọn';
$labels['exportvcards'] = 'Tải dữ liệu máy theo định dạng vCard';
$labels['newcontactgroup'] = 'Tạo nhóm liên lạc mới';
$labels['grouprename'] = 'Đổi tên nhóm';
@@ -451,9 +455,6 @@ $labels['replyremovesignature'] = 'Khi trả lời bỏ chữ ký cũ khỏi n
$labels['autoaddsignature'] = 'Tự động thêm chữ ký';
$labels['newmessageonly'] = 'chỉ thư mới';
$labels['replyandforwardonly'] = 'chỉ trả lời và chuyển tiếp thư';
-$labels['replysignaturepos'] = 'Khi trả lời hoặc chuyển tiếp thư thêm vào chữ ký';
-$labels['belowquote'] = 'Dưới phần nội dung cũ';
-$labels['abovequote'] = 'trên phần nội dung cũ';
$labels['insertsignature'] = 'Chèn chữ ký';
$labels['previewpanemarkread'] = 'Đánh dẫu thư xem thử là đã đọc';
$labels['afternseconds'] = 'sau $n giây';
diff --git a/program/localization/zh_CN/labels.inc b/program/localization/zh_CN/labels.inc
index 9b79283b1..2d896d7c3 100644
--- a/program/localization/zh_CN/labels.inc
+++ b/program/localization/zh_CN/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = '当前页';
$labels['unread'] = '未读邮件';
$labels['flagged'] = '已标记邮件';
$labels['unanswered'] = '未回复邮件';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = '已删除邮件';
$labels['undeleted'] = '未删除邮件';
$labels['invert'] = '反选';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = '当回复时从邮件移除原始签名';
$labels['autoaddsignature'] = '自动插入签名';
$labels['newmessageonly'] = '仅新邮件';
$labels['replyandforwardonly'] = '仅回复和转发邮件';
-$labels['replysignaturepos'] = '当回复或转发时插入签名';
-$labels['belowquote'] = '位于原文下方';
-$labels['abovequote'] = '位于原文上方';
$labels['insertsignature'] = '插入签名';
$labels['previewpanemarkread'] = '标记预览邮件为已读';
$labels['afternseconds'] = '$n 秒之后';
diff --git a/program/localization/zh_TW/labels.inc b/program/localization/zh_TW/labels.inc
index 488a7ab2d..f53a5a969 100644
--- a/program/localization/zh_TW/labels.inc
+++ b/program/localization/zh_TW/labels.inc
@@ -162,6 +162,7 @@ $labels['currpage'] = '目前頁面';
$labels['unread'] = '未讀取的郵件';
$labels['flagged'] = '已加標記的郵件';
$labels['unanswered'] = '未回覆的郵件';
+$labels['withattachment'] = 'With attachment';
$labels['deleted'] = '已刪除的郵件';
$labels['undeleted'] = '未刪除的郵件';
$labels['invert'] = '反選';
@@ -454,9 +455,6 @@ $labels['replyremovesignature'] = '回覆時移除原有簽名檔';
$labels['autoaddsignature'] = '自動附加簽名';
$labels['newmessageonly'] = '只有新訊息';
$labels['replyandforwardonly'] = '只有回覆或轉寄';
-$labels['replysignaturepos'] = '當回覆或轉寄時附上簽名檔';
-$labels['belowquote'] = '引用的下方';
-$labels['abovequote'] = '引用的上方';
$labels['insertsignature'] = '插入簽名檔';
$labels['previewpanemarkread'] = '標示已預覽訊息為已讀取';
$labels['afternseconds'] = '$n 秒之後';
diff --git a/program/resources/blank.pdf b/program/resources/blank.pdf
new file mode 100644
index 000000000..7bf83e390
--- /dev/null
+++ b/program/resources/blank.pdf
Binary files differ
diff --git a/program/steps/addressbook/export.inc b/program/steps/addressbook/export.inc
index 15bf8b0d4..761f26b75 100644
--- a/program/steps/addressbook/export.inc
+++ b/program/steps/addressbook/export.inc
@@ -138,7 +138,9 @@ header('Content-Disposition: attachment; filename="contacts.vcf"');
while ($result && ($row = $result->next())) {
// we already have a vcard record
if ($row['vcard'] && $row['name']) {
- $row['vcard'] = preg_replace('/\r?\n/', rcube_vcard::$eol, $row['vcard']);
+ // fix folding and end-of-line chars
+ $row['vcard'] = preg_replace('/\r|\n\s+/', '', $row['vcard']);
+ $row['vcard'] = preg_replace('/\n/', rcube_vcard::$eol, $row['vcard']);
echo rcube_vcard::rfc2425_fold($row['vcard']) . rcube_vcard::$eol;
}
// copy values into vcard object
diff --git a/program/steps/addressbook/import.inc b/program/steps/addressbook/import.inc
index df07d64bc..72da15078 100644
--- a/program/steps/addressbook/import.inc
+++ b/program/steps/addressbook/import.inc
@@ -209,6 +209,15 @@ if (is_array($_FILES['_file'])) {
foreach ($vcards as $vcard) {
$a_record = $vcard->get_assoc();
+ // Generate contact's display name (must be before validation), the same we do in save.inc
+ if (empty($a_record['name'])) {
+ $a_record['name'] = rcube_addressbook::compose_display_name($a_record, true);
+ // Reset it if equals to email address (from compose_display_name())
+ if ($a_record['name'] == $a_record['email'][0]) {
+ $a_record['name'] = '';
+ }
+ }
+
// skip invalid (incomplete) entries
if (!$CONTACTS->validate($a_record, true)) {
$IMPORT_STATS->invalid++;
@@ -250,7 +259,7 @@ if (is_array($_FILES['_file'])) {
if ($success) {
$IMPORT_STATS->inserted++;
- $IMPORT_STATS->names[] = $vcard->displayname ? $vcard->displayname : $email;
+ $IMPORT_STATS->names[] = $a_record['name'] ? $a_record['name'] : $email;
}
else {
$IMPORT_STATS->errors++;
diff --git a/program/steps/addressbook/save.inc b/program/steps/addressbook/save.inc
index 8cab6e817..25bfbd48b 100644
--- a/program/steps/addressbook/save.inc
+++ b/program/steps/addressbook/save.inc
@@ -192,7 +192,7 @@ else {
if (($maxnum = $RCMAIL->config->get('max_group_members', 0)) && ($counts->count + 1 > $maxnum))
$OUTPUT->show_message('maxgroupmembersreached', 'warning', array('max' => $maxnum));
- $CONTACTS->add_to_group($gid, $plugin['ids']);
+ $CONTACTS->add_to_group($plugin['group_id'], $plugin['ids']);
}
}
else
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index c166eb74e..81b598377 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -139,7 +139,6 @@ if (!empty($CONFIG['drafts_mbox'])) {
}
// set current mailbox in client environment
$OUTPUT->set_env('mailbox', $RCMAIL->storage->get_folder());
-$OUTPUT->set_env('sig_above', $RCMAIL->config->get('sig_above', false));
$OUTPUT->set_env('top_posting', intval($RCMAIL->config->get('reply_mode')) > 0);
$OUTPUT->set_env('recipients_separator', trim($RCMAIL->config->get('recipients_separator', ',')));
@@ -152,6 +151,7 @@ if ($font && !is_array($font)) {
// get reference message and set compose mode
if ($msg_uid = $COMPOSE['param']['draft_uid']) {
$compose_mode = RCUBE_COMPOSE_DRAFT;
+ $OUTPUT->set_env('draft_id', $msg_uid);
$RCMAIL->storage->set_folder($CONFIG['drafts_mbox']);
}
else if ($msg_uid = $COMPOSE['param']['reply_uid']) {
@@ -220,9 +220,9 @@ if (!empty($msg_uid) && empty($COMPOSE['as_attachment']))
}
}
else if ($compose_mode == RCUBE_COMPOSE_DRAFT) {
- if ($MESSAGE->headers->others['x-draft-info']) {
+ if ($draft_info = $MESSAGE->headers->get('x-draft-info')) {
// get reply_uid/forward_uid to flag the original message when sending
- $info = rcmail_draftinfo_decode($MESSAGE->headers->others['x-draft-info']);
+ $info = rcmail_draftinfo_decode($draft_info);
if ($info['type'] == 'reply')
$COMPOSE['reply_uid'] = $info['uid'];
@@ -239,8 +239,8 @@ if (!empty($msg_uid) && empty($COMPOSE['as_attachment']))
}
}
- if ($MESSAGE->headers->in_reply_to)
- $COMPOSE['reply_msgid'] = '<'.$MESSAGE->headers->in_reply_to.'>';
+ if ($in_reply_to = $MESSAGE->headers->get('in-reply-to'))
+ $COMPOSE['reply_msgid'] = '<' . $in_reply_to . '>';
$COMPOSE['references'] = $MESSAGE->headers->references;
}
@@ -461,7 +461,7 @@ function rcmail_compose_header_from($attrib)
if (count($MESSAGE->identities))
{
$a_signatures = array();
- $separator = $RCMAIL->config->get('sig_above')
+ $separator = intval($RCMAIL->config->get('reply_mode')) > 0
&& ($compose_mode == RCUBE_COMPOSE_REPLY || $compose_mode == RCUBE_COMPOSE_FORWARD) ? '---' : '-- ';
$field_attrib['onchange'] = JS_OBJECT_NAME.".change_identity(this)";
@@ -571,7 +571,7 @@ function rcmail_prepare_message_body()
rcmail_write_forward_attachments();
}
// reply/edit/draft/forward
- else if ($compose_mode && ($compose_mode != RCUBE_COMPOSE_REPLY || $RCMAIL->config->get('reply_mode') != -1)) {
+ else if ($compose_mode && ($compose_mode != RCUBE_COMPOSE_REPLY || intval($RCMAIL->config->get('reply_mode')) != -1)) {
$isHtml = rcmail_compose_editor_mode();
if (!empty($MESSAGE->parts)) {
@@ -997,10 +997,12 @@ function rcmail_write_compose_attachments(&$message, $bodyIsHtml)
foreach ((array)$message->mime_parts as $pid => $part)
{
if ($part->disposition == 'attachment' || ($part->disposition == 'inline' && $bodyIsHtml) || $part->filename) {
- if (($part->ctype_primary == 'message' && $bodyIsHtml) || $part->ctype_primary == 'multipart') {
+ // skip parts that aren't valid attachments
+ if ($part->ctype_primary == 'multipart' || $part->mimetype == 'application/ms-tnef') {
continue;
}
- if ($part->mimetype == 'application/ms-tnef') {
+ // skip message attachments in reply mode
+ if ($part->ctype_primary == 'message' && $compose_mode == RCUBE_COMPOSE_REPLY) {
continue;
}
// skip inline images when forwarding in plain text
diff --git a/program/steps/mail/copy.inc b/program/steps/mail/copy.inc
index a72378b0e..876657485 100644
--- a/program/steps/mail/copy.inc
+++ b/program/steps/mail/copy.inc
@@ -24,10 +24,10 @@ if (!$OUTPUT->ajax_call)
return;
// move messages
-if (!empty($_POST['_uid']) && !empty($_POST['_target_mbox'])) {
- $uids = get_input_value('_uid', RCUBE_INPUT_POST);
+if (!empty($_POST['_uid']) && strlen($_POST['_target_mbox'])) {
+ $uids = get_input_value('_uid', RCUBE_INPUT_POST);
$target = get_input_value('_target_mbox', RCUBE_INPUT_POST, true);
- $mbox = get_input_value('_mbox', RCUBE_INPUT_POST, true);
+ $mbox = get_input_value('_mbox', RCUBE_INPUT_POST, true);
$copied = $RCMAIL->storage->copy_message($uids, $target, $mbox);
@@ -47,7 +47,7 @@ if (!empty($_POST['_uid']) && !empty($_POST['_target_mbox'])) {
}
// unknown action or missing query param
else {
- exit;
+ $OUTPUT->show_message('internalerror', 'error');
}
// send response
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index 274c40b5c..60db3f310 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -896,7 +896,7 @@ function rcmail_washtml_callback($tagname, $attrib, $content, $washtml)
* return table with message headers
*/
function rcmail_message_headers($attrib, $headers=null)
- {
+{
global $OUTPUT, $MESSAGE, $PRINT_MODE, $RCMAIL;
static $sa_attrib;
@@ -1194,7 +1194,7 @@ function rcmail_message_body($attrib)
html::a($show_link + array('class' => 'image-link', 'style' => sprintf('width:%dpx', $thumbnail_size)),
html::img(array(
'class' => 'image-thumbnail',
- 'src' => $MESSAGE->get_part_url($attach_prop->mime_id, true) . '&_thumb=1',
+ 'src' => $MESSAGE->get_part_url($attach_prop->mime_id, 'image') . '&_thumb=1',
'title' => $attach_prop->filename,
'alt' => $attach_prop->filename,
'style' => sprintf('max-width:%dpx; max-height:%dpx', $thumbnail_size, $thumbnail_size),
@@ -1214,7 +1214,7 @@ function rcmail_message_body($attrib)
html::tag('legend', 'image-filename', Q($attach_prop->filename)) .
html::p(array('align' => "center"),
html::img(array(
- 'src' => $MESSAGE->get_part_url($attach_prop->mime_id, true),
+ 'src' => $MESSAGE->get_part_url($attach_prop->mime_id, 'image'),
'title' => $attach_prop->filename,
'alt' => $attach_prop->filename,
)))
@@ -1897,13 +1897,15 @@ function rcmail_search_filter($attrib)
$attrib['onchange'] = JS_OBJECT_NAME.'.filter_mailbox(this.value)';
- /*
- RFC3501 (6.4.4): 'ALL', 'RECENT',
- 'ANSWERED', 'DELETED', 'FLAGGED', 'SEEN',
- 'UNANSWERED', 'UNDELETED', 'UNFLAGGED', 'UNSEEN',
- 'NEW', // = (RECENT UNSEEN)
- 'OLD' // = NOT RECENT
- */
+ // Content-Type values of messages with attachments
+ // the same as in app.js:add_message_row()
+ $ctypes = array('application/', 'multipart/m', 'multipart/signed', 'multipart/report');
+
+ // Build search string of "with attachment" filter
+ $attachment = str_repeat(' OR', count($ctypes)-1);
+ foreach ($ctypes as $type) {
+ $attachment .= ' HEADER Content-Type ' . rcube_imap_generic::escape($type);
+ }
$select_filter = new html_select($attrib);
$select_filter->add(rcube_label('all'), 'ALL');
@@ -1914,6 +1916,7 @@ function rcmail_search_filter($attrib)
$select_filter->add(rcube_label('deleted'), 'DELETED');
$select_filter->add(rcube_label('undeleted'), 'UNDELETED');
}
+ $select_filter->add(rcube_label('withattachment'), $attachment);
$select_filter->add(rcube_label('priority').': '.rcube_label('highest'), 'HEADER X-PRIORITY 1');
$select_filter->add(rcube_label('priority').': '.rcube_label('high'), 'HEADER X-PRIORITY 2');
$select_filter->add(rcube_label('priority').': '.rcube_label('normal'), 'NOT HEADER X-PRIORITY 1 NOT HEADER X-PRIORITY 2 NOT HEADER X-PRIORITY 4 NOT HEADER X-PRIORITY 5');
diff --git a/program/steps/mail/get.inc b/program/steps/mail/get.inc
index 23dc22b7c..bcc6f11bc 100644
--- a/program/steps/mail/get.inc
+++ b/program/steps/mail/get.inc
@@ -22,7 +22,7 @@
// show loading page
if (!empty($_GET['_preload'])) {
- $url = preg_replace('/([&?]+)_preload=/', '\\1_embed=', $_SERVER['REQUEST_URI']);
+ $url = preg_replace('/([&?]+)_preload=/', '\\1_mimewarning=1&_embed=', $_SERVER['REQUEST_URI']);
$message = rcube_label('loadingdata');
header('Content-Type: text/html; charset=' . RCMAIL_CHARSET);
@@ -62,9 +62,10 @@ else if ($_GET['_thumb']) {
$thumbnail_size = $RCMAIL->config->get('image_thumbnail_size', 240);
$temp_dir = $RCMAIL->config->get('temp_dir');
list(,$ext) = explode('/', $part->mimetype);
- $cache_basename = $temp_dir . '/' . md5($MESSAGE->headers->messageID . $part->mime_id . ':' . $RCMAIL->user->ID . ':' . $thumbnail_size);
- $cache_file = $cache_basename . '.' . $ext;
$mimetype = $part->mimetype;
+ $file_ident = $MESSAGE->headers->messageID . ':' . $part->mime_id . ':' . $part->size . ':' . $part->mimetype;
+ $cache_basename = $temp_dir . '/' . md5($file_ident . ':' . $RCMAIL->user->ID . ':' . $thumbnail_size);
+ $cache_file = $cache_basename . '.' . $ext;
// render thumbnail image if not done yet
if (!is_file($cache_file)) {
@@ -118,7 +119,7 @@ else if (strlen($pid = get_input_value('_part', RCUBE_INPUT_GET))) {
$file_extension = strtolower(pathinfo($part->filename, PATHINFO_EXTENSION));
// 1. compare filename suffix with expected suffix derived from mimetype
- $valid = $file_extension && in_array($file_extension, (array)$extensions);
+ $valid = $file_extension && in_array($file_extension, (array)$extensions) || !empty($_REQUEST['_mimeclass']);
// 2. detect the real mimetype of the attachment part and compare it with the stated mimetype and filename extension
if ($valid || !$file_extension || $mimetype == 'application/octet-stream' || $mimetype == 'text/plain') {
@@ -145,6 +146,10 @@ else if (strlen($pid = get_input_value('_part', RCUBE_INPUT_GET))) {
$extensions = rcube_mime::get_mime_extensions($real_mimetype);
$valid_extension = (!$file_extension || in_array($file_extension, (array)$extensions));
+ // ignore filename extension if mimeclass matches (#1489029)
+ if (!empty($_REQUEST['_mimeclass']) && $real_ctype_primary == $_REQUEST['_mimeclass'])
+ $valid_extension = true;
+
// fix mimetype for images wrongly declared as octet-stream
if ($mimetype == 'application/octet-stream' && strpos($real_mimetype, 'image/') === 0 && $valid_extension)
$mimetype = $real_mimetype;
@@ -157,22 +162,32 @@ else if (strlen($pid = get_input_value('_part', RCUBE_INPUT_GET))) {
// show warning if validity checks failed
if (!$valid) {
- $OUTPUT = new rcmail_html_page();
- $OUTPUT->write(html::tag('html', null, html::tag('body', 'embed',
- html::div(array('class' => 'rcmail-inline-message rcmail-inline-warning'),
- rcube_label(array(
- 'name' => 'attachmentvalidationerror',
- 'vars' => array(
- 'expected' => $mimetype . ($file_extension ? "(.$file_extension)" : ''),
- 'detected' => $real_mimetype . ($extensions[0] ? "(.$extensions[0])" : ''),
+ // send blocked.gif for expected images
+ if (empty($_REQUEST['_mimewarning']) && strpos($mimetype, 'image/') === 0) {
+ // Do not cache. Failure might be the result of a misconfiguration, thus real content should be returned once fixed.
+ $OUTPUT->nocacheing_headers();
+ header("Content-Type: image/gif");
+ header("Content-Transfer-Encoding: binary");
+ readfile(INSTALL_PATH . 'program/resources/blocked.gif');
+ }
+ else { // html warning with a button to load the file anyway
+ $OUTPUT = new rcmail_html_page();
+ $OUTPUT->write(html::tag('html', null, html::tag('body', 'embed',
+ html::div(array('class' => 'rcmail-inline-message rcmail-inline-warning'),
+ rcube_label(array(
+ 'name' => 'attachmentvalidationerror',
+ 'vars' => array(
+ 'expected' => $mimetype . ($file_extension ? "(.$file_extension)" : ''),
+ 'detected' => $real_mimetype . ($extensions[0] ? "(.$extensions[0])" : ''),
+ )
+ )) .
+ html::p(array('class' => 'rcmail-inline-buttons'),
+ html::tag('button',
+ array('onclick' => "location.href='" . $RCMAIL->url(array_merge($_GET, array('_nocheck' => 1))) . "'"),
+ rcube_label('showanyway')))
)
- )) .
- html::p(array('class' => 'rcmail-inline-buttons'),
- html::tag('button',
- array('onclick' => "location.href='" . $RCMAIL->url(array_merge($_GET, array('_nocheck' => 1))) . "'"),
- rcube_label('showanyway')))
- )
- )));
+ )));
+ }
exit;
}
}
diff --git a/program/steps/mail/mark.inc b/program/steps/mail/mark.inc
index c220fc5c4..dfc892ea1 100644
--- a/program/steps/mail/mark.inc
+++ b/program/steps/mail/mark.inc
@@ -113,7 +113,7 @@ if (($uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_va
$OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($msg_count), $mbox);
if ($threading) {
- $count = get_input_value('_count', RCUBE_INPUT_POST);
+ $count = get_input_value('_count', RCUBE_INPUT_POST);
}
// add new rows from next page (if any)
@@ -125,9 +125,9 @@ if (($uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_va
}
}
}
-
- $OUTPUT->send();
+}
+else {
+ $OUTPUT->show_message('internalerror', 'error');
}
-exit;
-
+$OUTPUT->send();
diff --git a/program/steps/mail/move_del.inc b/program/steps/mail/move_del.inc
index 3fc6ac5a7..e21ba2c6b 100644
--- a/program/steps/mail/move_del.inc
+++ b/program/steps/mail/move_del.inc
@@ -74,6 +74,8 @@ else if ($RCMAIL->action=='delete' && !empty($_POST['_uid'])) {
}
// unknown action or missing query param
else {
+ $OUTPUT->show_message('internalerror', 'error');
+ $OUTPUT->send();
exit;
}
diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc
index eb0ba89c6..2f96e930f 100644
--- a/program/steps/mail/sendmail.inc
+++ b/program/steps/mail/sendmail.inc
@@ -255,6 +255,33 @@ function rcmail_email_input_format($mailto, $count=false, $check=true)
}
+function rcmail_generic_message_footer($isHtml)
+{
+ global $CONFIG;
+
+ if ($isHtml && !empty($CONFIG['generic_message_footer_html'])) {
+ $file = $CONFIG['generic_message_footer_html'];
+ $html_footer = true;
+ }
+ else {
+ $file = $CONFIG['generic_message_footer'];
+ $html_footer = false;
+ }
+
+ if ($file && realpath($file)) {
+ // sanity check
+ if (!preg_match('/\.(php|ini|conf)$/', $file) && strpos($file, '/etc/') === false) {
+ $footer = file_get_contents($file);
+ if ($isHtml && !$html_footer)
+ $footer = '<pre>' . $footer . '</pre>';
+ return $footer;
+ }
+ }
+
+ return false;
+}
+
+
/****** compose message ********/
if (strlen($_POST['_draft_saveid']) > 3)
@@ -466,7 +493,7 @@ if (!$savedraft) {
$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; width:100%';
+ $bstyle = 'padding-left:5px; border-left:#1010ff 2px solid; margin-left:5px';
$message_body = preg_replace('/<blockquote>/',
'<blockquote type="cite" style="'.$bstyle.'">', $message_body);
}
@@ -490,19 +517,10 @@ if (!$savedraft) {
}
// generic footer for all messages
- if ($isHtml && !empty($CONFIG['generic_message_footer_html'])) {
- $footer = file_get_contents(realpath($CONFIG['generic_message_footer_html']));
- $footer = rcube_charset_convert($footer, RCMAIL_CHARSET, $message_charset);
- }
- else if (!empty($CONFIG['generic_message_footer'])) {
- $footer = file_get_contents(realpath($CONFIG['generic_message_footer']));
+ if ($footer = rcmail_generic_message_footer($isHtml)) {
$footer = rcube_charset_convert($footer, RCMAIL_CHARSET, $message_charset);
- if ($isHtml)
- $footer = '<pre>'.$footer.'</pre>';
- }
-
- if ($footer)
$message_body .= "\r\n" . $footer;
+ }
}
if ($isHtml) {
@@ -820,6 +838,6 @@ else {
if ($store_folder && !$saved)
$OUTPUT->command('sent_successfully', 'error', rcube_label('errorsavingsent'));
else
- $OUTPUT->command('sent_successfully', 'confirmation', rcube_label('messagesent'));
+ $OUTPUT->command('sent_successfully', 'confirmation', rcube_label('messagesent'), $store_target);
$OUTPUT->send('iframe');
}
diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc
index 552c180f5..1947c0f29 100644
--- a/program/steps/mail/show.inc
+++ b/program/steps/mail/show.inc
@@ -109,7 +109,7 @@ if ($uid) {
$OUTPUT->set_env('skip_deleted', true);
if ($CONFIG['display_next'])
$OUTPUT->set_env('display_next', true);
- if ($MESSAGE->headers->others['list-post'])
+ if ($MESSAGE->headers->get('list-post', false))
$OUTPUT->set_env('list_post', true);
if ($CONFIG['forward_attachment'])
$OUTPUT->set_env('forward_attachment', true);
diff --git a/program/steps/settings/about.inc b/program/steps/settings/about.inc
index 9b13402f1..0fdefddda 100644
--- a/program/steps/settings/about.inc
+++ b/program/steps/settings/about.inc
@@ -40,17 +40,28 @@ function rcmail_plugins_list($attrib)
$attrib['id'] = 'rcmpluginlist';
$plugins = array_filter((array) $RCMAIL->config->get('plugins'));
- $plugins = array_flip($plugins);
+ $plugin_info = array();
- foreach ($plugins as $name => $plugin) {
- rcube_plugin_data($name, $plugins);
+ foreach ($plugins as $name) {
+ if ($info = $RCMAIL->plugins->get_info($name))
+ $plugin_info[$name] = $info;
}
- if (empty($plugins)) {
+ // load info from required plugins, too
+ foreach ($plugin_info as $name => $info) {
+ if (is_array($info['required']) && !empty($info['required'])) {
+ foreach ($info['required'] as $req_name) {
+ if (!isset($plugin_info[$req_name]) && ($req_info = $RCMAIL->plugins->get_info($req_name)))
+ $plugin_info[$req_name] = $req_info;
+ }
+ }
+ }
+
+ if (empty($plugin_info)) {
return '';
}
- ksort($plugins, SORT_LOCALE_STRING);
+ ksort($plugin_info, SORT_LOCALE_STRING);
$table = new html_table($attrib);
@@ -60,8 +71,8 @@ function rcmail_plugins_list($attrib)
$table->add_header('license', rcube_label('license'));
$table->add_header('source', rcube_label('source'));
- foreach ($plugins as $name => $data) {
- $uri = $data['srcuri'] ? $data['srcuri'] : $data['uri'];
+ foreach ($plugin_info as $name => $data) {
+ $uri = $data['src_uri'] ? $data['src_uri'] : $data['uri'];
if ($uri && stripos($uri, 'http') !== 0) {
$uri = 'http://' . $uri;
}
@@ -78,48 +89,6 @@ function rcmail_plugins_list($attrib)
return $table->show();
}
-function rcube_plugin_data($name, &$plugins = array())
-{
- // XPaths of plugin metadata elements
- $metadata = array(
- 'name' => 'string(//rc:package/rc:name)',
- 'version' => 'string(//rc:package/rc:version/rc:release)',
- 'license' => 'string(//rc:package/rc:license)',
- 'license_uri' => 'string(//rc:package/rc:license/@uri)',
- 'srcuri' => 'string(//rc:package/rc:srcuri)',
- 'uri' => 'string(//rc:package/rc:uri)',
- );
-
- $package = INSTALL_PATH . "/plugins/$name/package.xml";
- if (file_exists($package) && ($file = file_get_contents($package))) {
- $doc = new DOMDocument();
- $doc->loadXML($file);
- $xpath = new DOMXPath($doc);
- $xpath->registerNamespace('rc', "http://pear.php.net/dtd/package-2.0");
- $data = array();
-
- foreach ($metadata as $key => $path) {
- $data[$key] = $xpath->evaluate($path);
- }
-
- $plugins[$name] = $data;
-
- // dependent required plugins (can be used, but not included in config)
- $deps = $xpath->evaluate('//rc:package/rc:dependencies/rc:required/rc:package/rc:name');
- $cnt = $deps->length;
-
- for ($i=0; $i<$cnt; $i++) {
- $dn = $deps->item($i)->nodeValue;
- if (!array_key_exists($dn, $plugins)) {
- rcube_plugin_data($dn, $plugins);
- }
- }
- }
- else {
- unset($plugins[$name]);
- }
-}
-
$OUTPUT->set_pagetitle(rcube_label('about'));
diff --git a/program/steps/settings/edit_folder.inc b/program/steps/settings/edit_folder.inc
index cd2372790..fdb38e602 100644
--- a/program/steps/settings/edit_folder.inc
+++ b/program/steps/settings/edit_folder.inc
@@ -78,7 +78,7 @@ function rcmail_folder_form($attrib)
// Location (name)
if ($options['protected']) {
- $foldername = Q(str_replace($delimiter, ' &raquo; ', rcmail_localize_folderpath($mbox_imap)));
+ $foldername = str_replace($delimiter, ' &raquo; ', Q(rcmail_localize_folderpath($mbox_imap)));
}
else if ($options['norename']) {
$foldername = Q($folder);
diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc
index 2f726c7e8..319c58db9 100644
--- a/program/steps/settings/func.inc
+++ b/program/steps/settings/func.inc
@@ -581,8 +581,7 @@ function rcmail_user_prefs($current=null)
if (!isset($no_override['reply_mode'])) {
$field_id = 'rcmfd_reply_mode';
- $select_replymode = new html_select(array('name' => '_reply_mode', 'id' => $field_id,
- 'onchange' => "\$('#rcmfd_sig_above').attr('disabled',this.selectedIndex<2)"));
+ $select_replymode = new html_select(array('name' => '_reply_mode', 'id' => $field_id));
$select_replymode->add(rcube_label('replyempty'), -1);
$select_replymode->add(rcube_label('replybottomposting'), 0);
$select_replymode->add(rcube_label('replytopposting'), 1);
@@ -631,18 +630,6 @@ function rcmail_user_prefs($current=null)
);
}
- if (!isset($no_override['sig_above'])) {
- $field_id = 'rcmfd_sig_above';
- $select_sigabove = new html_select(array('name' => '_sig_above', 'id' => $field_id, 'disabled' => $config['reply_mode'] < 1));
- $select_sigabove->add(rcube_label('belowquote'), 0);
- $select_sigabove->add(rcube_label('abovequote'), 1);
-
- $blocks['sig']['options']['sig_above'] = array(
- 'title' => html::label($field_id, Q(rcube_label('replysignaturepos'))),
- 'content' => $select_sigabove->show($config['sig_above']?1:0),
- );
- }
-
if (!isset($no_override['strip_existing_sig'])) {
$field_id = 'rcmfd_strip_existing_sig';
$input_stripexistingsig = new html_checkbox(array('name' => '_strip_existing_sig', 'id' => $field_id, 'value' => 1));
diff --git a/program/steps/settings/save_prefs.inc b/program/steps/settings/save_prefs.inc
index 5daab0d24..dfb2b13ac 100644
--- a/program/steps/settings/save_prefs.inc
+++ b/program/steps/settings/save_prefs.inc
@@ -86,7 +86,6 @@ switch ($CURR_SECTION)
'show_sig' => isset($_POST['_show_sig']) ? intval($_POST['_show_sig']) : 1,
'reply_mode' => isset($_POST['_reply_mode']) ? intval($_POST['_reply_mode']) : 0,
'strip_existing_sig' => isset($_POST['_strip_existing_sig']),
- 'sig_above' => !empty($_POST['_sig_above']) && $_POST['_reply_mode'] > 0,
'default_font' => get_input_value('_default_font', RCUBE_INPUT_POST),
'forward_attachment' => !empty($_POST['_forward_attachment']),
);
@@ -158,7 +157,7 @@ switch ($CURR_SECTION)
$a_user_prefs['timezone'] = (string) $a_user_prefs['timezone'];
if (isset($a_user_prefs['refresh_interval']) && !empty($CONFIG['min_refresh_interval'])) {
- if ($a_user_prefs['refresh_interval'] > $CONFIG['min_refresh_interval']) {
+ if ($a_user_prefs['refresh_interval'] < $CONFIG['min_refresh_interval']) {
$a_user_prefs['refresh_interval'] = $CONFIG['min_refresh_interval'];
}
}
diff --git a/program/steps/utils/save_pref.inc b/program/steps/utils/save_pref.inc
index b550ad7ef..7def8733d 100644
--- a/program/steps/utils/save_pref.inc
+++ b/program/steps/utils/save_pref.inc
@@ -21,6 +21,22 @@
$name = get_input_value('_name', RCUBE_INPUT_POST);
$value = get_input_value('_value', RCUBE_INPUT_POST);
+$whitelist = array(
+ 'preview_pane',
+ 'list_cols',
+ 'collapsed_folders',
+ 'collapsed_abooks',
+);
+
+if (!in_array($name, array_merge($whitelist, $RCMAIL->plugins->allowed_prefs))) {
+ raise_error(array('code' => 500, 'type' => 'php',
+ 'file' => __FILE__, 'line' => __LINE__,
+ 'message' => sprintf("Hack attempt detected (user: %s)", $RCMAIL->get_user_name())),
+ true, false);
+
+ $OUTPUT->reset();
+ $OUTPUT->send();
+}
// save preference value
$RCMAIL->user->save_prefs(array($name => $value));