summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.htaccess3
-rw-r--r--CHANGELOG41
-rw-r--r--Dockerfile2
-rwxr-xr-xbin/installto.sh2
-rwxr-xr-xbin/jsshrink.sh4
-rwxr-xr-xbin/update.sh21
-rw-r--r--config/defaults.inc.php13
-rw-r--r--index.php4
-rw-r--r--installer/index.php4
-rw-r--r--plugins/acl/acl.js1
-rw-r--r--plugins/acl/localization/fr_FR.inc28
-rw-r--r--plugins/acl/localization/fy_NL.inc19
-rw-r--r--plugins/acl/localization/ia.inc98
-rw-r--r--plugins/archive/localization/es_ES.inc8
-rw-r--r--plugins/archive/localization/fr_FR.inc6
-rw-r--r--plugins/archive/localization/ia.inc31
-rw-r--r--plugins/attachment_reminder/localization/es_ES.inc2
-rw-r--r--plugins/attachment_reminder/localization/fr_FR.inc4
-rw-r--r--plugins/attachment_reminder/localization/ia.inc20
-rw-r--r--plugins/attachment_reminder/localization/tr_TR.inc6
-rw-r--r--plugins/help/help.php6
-rw-r--r--plugins/help/localization/fy_NL.inc21
-rw-r--r--plugins/help/localization/ia.inc21
-rw-r--r--plugins/help/skins/larry/help.css2
-rw-r--r--plugins/hide_blockquote/localization/ia.inc21
-rw-r--r--plugins/hide_blockquote/localization/tr_TR.inc2
-rw-r--r--plugins/jqueryui/jqueryui.php21
-rwxr-xr-xplugins/jqueryui/js/jquery-ui-1.10.4.custom.min.js31
-rw-r--r--plugins/jqueryui/js/jquery-ui-accessible-datepicker.js31
-rw-r--r--plugins/jqueryui/js/jquery.miniColors.min.js4
-rw-r--r--plugins/jqueryui/js/jquery.tagedit.js683
-rwxr-xr-xplugins/jqueryui/themes/larry/jquery-ui-1.10.4.custom.css20
-rw-r--r--plugins/jqueryui/themes/larry/jquery-ui-css.diff4
-rw-r--r--plugins/jqueryui/themes/larry/tagedit.css122
-rw-r--r--plugins/managesieve/Changelog9
-rw-r--r--plugins/managesieve/composer.json2
-rw-r--r--plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php84
-rw-r--r--plugins/managesieve/lib/Roundcube/rcube_sieve_script.php18
-rw-r--r--plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php234
-rw-r--r--plugins/managesieve/localization/cs_CZ.inc2
-rw-r--r--plugins/managesieve/localization/es_ES.inc54
-rw-r--r--plugins/managesieve/localization/fr_FR.inc42
-rw-r--r--plugins/managesieve/localization/fy_NL.inc39
-rw-r--r--plugins/managesieve/localization/ia.inc203
-rw-r--r--plugins/markasjunk/localization/es_ES.inc2
-rw-r--r--plugins/markasjunk/localization/fy_NL.inc19
-rw-r--r--plugins/markasjunk/localization/ia.inc21
-rw-r--r--plugins/markasjunk/localization/tr_TR.inc2
-rw-r--r--plugins/new_user_dialog/localization/es_ES.inc4
-rw-r--r--plugins/new_user_dialog/localization/ia.inc20
-rw-r--r--plugins/newmail_notifier/localization/es_ES.inc14
-rw-r--r--plugins/newmail_notifier/localization/fr_FR.inc6
-rw-r--r--plugins/newmail_notifier/localization/fy_NL.inc20
-rw-r--r--plugins/newmail_notifier/localization/ia.inc14
-rw-r--r--plugins/newmail_notifier/localization/tr_TR.inc8
-rw-r--r--plugins/password/drivers/dbmail.php17
-rw-r--r--plugins/password/helpers/chgdbmailusers.c2
-rw-r--r--plugins/password/localization/es_ES.inc8
-rw-r--r--plugins/password/localization/fy_NL.inc19
-rw-r--r--plugins/password/localization/ia.inc33
-rw-r--r--plugins/password/localization/tr_TR.inc10
-rw-r--r--plugins/subscriptions_option/localization/br.inc19
-rw-r--r--plugins/subscriptions_option/localization/ia.inc19
-rw-r--r--plugins/userinfo/localization/es_ES.inc2
-rw-r--r--plugins/userinfo/localization/fy_NL.inc19
-rw-r--r--plugins/userinfo/localization/ia.inc4
-rw-r--r--plugins/vcard_attachments/localization/es_ES.inc4
-rw-r--r--plugins/vcard_attachments/localization/ia.inc20
-rw-r--r--plugins/zipdownload/localization/fr_FR.inc2
-rw-r--r--plugins/zipdownload/localization/fy_NL.inc18
-rw-r--r--plugins/zipdownload/localization/ia.inc22
-rw-r--r--program/include/iniset.php6
-rw-r--r--program/include/rcmail.php23
-rw-r--r--program/include/rcmail_install.php5
-rw-r--r--program/js/app.js140
-rw-r--r--program/js/common.js2
-rw-r--r--program/js/editor.js6
-rw-r--r--program/js/list.js14
-rw-r--r--program/lib/Roundcube/bootstrap.php15
-rw-r--r--program/lib/Roundcube/rcube.php9
-rw-r--r--program/lib/Roundcube/rcube_config.php10
-rw-r--r--program/lib/Roundcube/rcube_imap.php8
-rw-r--r--program/lib/Roundcube/rcube_ldap.php3
-rw-r--r--program/lib/Roundcube/rcube_message.php16
-rw-r--r--program/lib/Roundcube/rcube_plugin_api.php313
-rw-r--r--program/lib/Roundcube/rcube_smtp.php14
-rw-r--r--program/lib/Roundcube/rcube_washtml.php4
-rw-r--r--program/localization/bn_BD/labels.inc1
-rw-r--r--program/localization/bs_BA/labels.inc3
-rw-r--r--program/localization/cs_CZ/messages.inc2
-rw-r--r--program/localization/de_CH/labels.inc3
-rw-r--r--program/localization/el_GR/labels.inc10
-rw-r--r--program/localization/en_US/csv2vcard.inc2
-rw-r--r--program/localization/en_US/labels.inc3
-rw-r--r--program/localization/en_US/messages.inc2
-rw-r--r--program/localization/es_ES/labels.inc192
-rw-r--r--program/localization/es_ES/messages.inc156
-rw-r--r--program/localization/et_EE/labels.inc2
-rw-r--r--program/localization/eu_ES/labels.inc2
-rw-r--r--program/localization/fr_FR/labels.inc176
-rw-r--r--program/localization/fr_FR/messages.inc76
-rw-r--r--program/localization/fy_NL/labels.inc69
-rw-r--r--program/localization/fy_NL/messages.inc20
-rw-r--r--program/localization/he_IL/labels.inc2
-rw-r--r--program/localization/hu_HU/labels.inc13
-rw-r--r--program/localization/ia/labels.inc427
-rw-r--r--program/localization/ia/messages.inc165
-rw-r--r--program/localization/it_IT/labels.inc1
-rw-r--r--program/localization/mk_MK/messages.inc19
-rw-r--r--program/localization/ro_RO/labels.inc5
-rw-r--r--program/localization/ru_RU/labels.inc27
-rw-r--r--program/localization/ur_PK/labels.inc9
-rw-r--r--program/steps/addressbook/export.inc10
-rw-r--r--program/steps/addressbook/func.inc75
-rw-r--r--program/steps/addressbook/print.inc138
-rw-r--r--program/steps/addressbook/save.inc14
-rw-r--r--program/steps/addressbook/show.inc15
-rw-r--r--program/steps/mail/compose.inc55
-rw-r--r--program/steps/mail/func.inc2
-rw-r--r--program/steps/mail/get.inc24
-rw-r--r--program/steps/mail/sendmail.inc35
-rw-r--r--program/steps/settings/edit_identity.inc5
-rw-r--r--program/steps/settings/save_identity.inc5
-rw-r--r--skins/classic/addressbook.css10
-rw-r--r--skins/classic/common.css5
-rw-r--r--skins/classic/print.css64
-rw-r--r--skins/classic/templates/about.html2
-rw-r--r--skins/classic/templates/addressbook.html1
-rw-r--r--skins/classic/templates/compose.html6
-rw-r--r--skins/classic/templates/contactprint.html20
-rw-r--r--skins/larry/print.css63
-rw-r--r--skins/larry/styles.css4
-rw-r--r--skins/larry/templates/about.html2
-rw-r--r--skins/larry/templates/addressbook.html1
-rw-r--r--skins/larry/templates/compose.html6
-rw-r--r--skins/larry/templates/contactprint.html20
-rw-r--r--skins/larry/ui.js29
-rw-r--r--tests/Framework/Washtml.php24
-rw-r--r--tests/MailFunc.php2
139 files changed, 3973 insertions, 980 deletions
diff --git a/.htaccess b/.htaccess
index 32c47f01e..95e5bf475 100644
--- a/.htaccess
+++ b/.htaccess
@@ -24,6 +24,7 @@ php_value session.gc_probability 1
</IfModule>
<IfModule mod_rewrite.c>
+Options +FollowSymLinks
RewriteEngine On
RewriteRule ^favicon\.ico$ skins/larry/images/favicon.ico
@@ -34,7 +35,7 @@ RewriteRule ^(?!installer|[a-f0-9]{16})(\.?[^\.]+)$ - [F]
# - deny access to some locations
RewriteRule ^/?(\.git|\.tx|SQL|bin|config|logs|temp|tests|program\/(include|lib|localization|steps)) - [F]
# - deny access to some documentation files
-RewriteRule /?(README\.md|composer\.json-dist|composer\.json|package\.xml)$ - [F]
+RewriteRule /?(README\.md|composer\.json-dist|composer\.json|package\.xml|Dockerfile)$ - [F]
</IfModule>
<IfModule mod_deflate.c>
diff --git a/CHANGELOG b/CHANGELOG
index 7f26bd825..f0f61fb73 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,34 @@
CHANGELOG Roundcube Webmail
===========================
+- Add possibility to print contact information (of a single contact)
+- Fix refreshing of drafts list when sending a message which was saved in meantime (#1490238)
+- Fix saving/sending emoticon images when assets_dir is set
+- Fix PHP fatal error when visiting Vacation interface and there's no sieve script yet
+
+RELEASE 1.1.0
+-------------
+- Make SMTP error log more verbose - include server response and error code
+- Fix download options menu (added by zipdownload plugin) in classic skin (#1490228)
+- Fix blocked.gif image usage with assets_dir set
+- Fix bug where max_group_members was ignored when adding a new contact (#1490214)
+- Hide MDN and DSN options in compose if disabled by admin (#1490221)
+- Fix checks based on window.ActiveXObject in IE > 10
+- Fix XSS issue in style attribute handling (#1490227)
+- Fix bug where Drafts list wasn't updated on draft-save action in new window (#1490225)
+- Fix so "set as default" option is hidden if identities_level > 1 (#1490226)
+- Fix bug where search was reset after returning from compose visited for reply
+- Fix javascript error in "IE 8.0/Tablet PC" browser (#1490210)
+- Fix bug where Reply-To address was ignored on reply to messages sent by self (#1490233)
+- Fix bug where empty fieldmap config entries caused empty results of ldap search (#1490229)
+- Fix bug where drafts list wasn't refreshed after draft message was sent from another window (#1490238)
+- Fix keyboard navigation and css in datepicker widget across many Firefox versions
+- Fix false warning when opening attached text/plain files (#1490241)
+- Fix bug where signature could have been inserted twice after plain-to-html switch (#1490239)
+- Fix security issue in DBMail driver of password plugin (#1490261)
+- Enable FollowSymLinks option in .htaccess file which is required by rewrite rules (#1490255)
+- Fix so JSON.parse() errors on localStorage items are ignored (#1490249)
+
RELEASE 1.1-rc
--------------
- Update jQuery to version 2.1.3
@@ -77,6 +105,17 @@ RELEASE 1.1-beta
- Fix so attachment charset is set in headers of forward/draft message (#1490109)
- Fix bug where wrong charset could be used for text attachment preview page (#1490106)
+RELEASE 1.0.5
+-------------
+- Fix wrong icon for download button in classic skin
+- Fix checks based on window.ActiveXObject in IE > 10
+- Fix XSS issue in style attribute handling (#1490227)
+- Fix bug where Drafts list wasn't updated on draft-save action in new window (#1490225)
+- Fix so "set as default" option is hidden if identities_level > 1 (#1490226)
+- Fix javascript error in "IE 8.0/Tablet PC" browser (#1490210)
+- Fix bug where empty fieldmap config entries caused empty results of ldap search (#1490229)
+- Fix bug where sent message was saved in Sent folder even if disabled by user (#1490208)
+
RELEASE 1.0.4
-------------
- Disable TinyMCE contextmenu plugin as there are more cons than pros in using it (#1490118)
@@ -96,7 +135,7 @@ RELEASE 1.0.4
- Fix possible issues in skin/skin_path config handling (#1490125)
- Fix lack of delimiter for recipient addresses in smtp_log (#1490150)
- Fix generation of Blowfish-based password hashes (#1490184)
-- Fix bugs where CSRF attacks were still possible on some requests
+- Fix bugs where CSRF attacks were still possible on some requests [CVE-2014-9587]
RELEASE 1.0.3
-------------
diff --git a/Dockerfile b/Dockerfile
index 4db07cf0b..c8ef79921 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -20,7 +20,7 @@ RUN a2enmod headers
RUN a2enmod ssl
RUN apt-get install -qq php5 php-pear php5-mysql php5-pgsql php5-sqlite
-RUN pear install mail_mime mail_mimedecode net_smtp2-beta net_idna2-beta auth_sasl2-beta net_sieve crypt_gpg
+RUN pear install mail_mime mail_mimedecode net_smtp net_idna2-beta auth_sasl net_sieve crypt_gpg
RUN rm -rf /var/www
ADD . /var/www
diff --git a/bin/installto.sh b/bin/installto.sh
index 12d317e12..4be6528a2 100755
--- a/bin/installto.sh
+++ b/bin/installto.sh
@@ -54,7 +54,7 @@ if (strtolower($input) == 'y') {
break;
}
}
- foreach (array('index.php','.htaccess','config/defaults.inc.php','composer.json-dist','CHANGELOG','README.md','UPGRADING','LICENSE') as $file) {
+ foreach (array('index.php','.htaccess','config/defaults.inc.php','composer.json-dist','CHANGELOG','README.md','UPGRADING','LICENSE','INSTALL') as $file) {
if (!system("rsync -av " . INSTALL_PATH . "$file $target_dir/$file")) {
$err = true;
break;
diff --git a/bin/jsshrink.sh b/bin/jsshrink.sh
index f7c7b22e9..0890a5c40 100755
--- a/bin/jsshrink.sh
+++ b/bin/jsshrink.sh
@@ -9,7 +9,9 @@ CLOSURE_COMPILER_URL='http://dl.google.com/closure-compiler/compiler-20131014.zi
do_shrink() {
rm -f "$2"
- java -jar $JAR_DIR/compiler.jar --compilation_level=SIMPLE_OPTIMIZATIONS --js="$1" --js_output_file="$2" --language_in="$3"
+ # copy the first comment block with license information for LibreJS
+ grep -q '@lic' $1 && sed -n '/\/\*/,/\*\// { p; /\*\//q; }' $1 > $2
+ java -jar $JAR_DIR/compiler.jar --compilation_level=SIMPLE_OPTIMIZATIONS --js="$1" --language_in="$3" >> $2
}
if [ ! -d "$JS_DIR" ]; then
diff --git a/bin/update.sh b/bin/update.sh
index 26314408c..1dfaa961d 100755
--- a/bin/update.sh
+++ b/bin/update.sh
@@ -181,6 +181,27 @@ if ($RCI->configured) {
*/
}
+ // update the repositories section with the new dependencies
+ if (is_array($composer_template['repositories'])) {
+ if (!is_array($composer_data['repositories'])) {
+ $composer_data['repositories'] = array();
+ }
+
+ foreach ($composer_template['repositories'] as $repo) {
+ $rkey = $repo['type'] . $repo['url'] . $repo['package']['name'];
+ $existing = false;
+ foreach ($composer_data['repositories'] as $_repo) {
+ if ($rkey == $_repo['type'] . $_repo['url'] . $_repo['package']['name']) {
+ $existing = true;
+ break;
+ }
+ }
+ if (!$existing) {
+ $composer_data['repositories'][] = $repo;
+ }
+ }
+ }
+
// use the JSON encoder from the Composer package
if (is_file('composer.phar')) {
include 'phar://composer.phar/src/Composer/Json/JsonFile.php';
diff --git a/config/defaults.inc.php b/config/defaults.inc.php
index 5a5bffb5e..06ea9ec21 100644
--- a/config/defaults.inc.php
+++ b/config/defaults.inc.php
@@ -384,6 +384,19 @@ $config['session_storage'] = 'db';
// Define any number of hosts in the form of hostname:port or unix:///path/to/socket.file
$config['memcache_hosts'] = null; // e.g. array( 'localhost:11211', '192.168.1.12:11211', 'unix:///var/tmp/memcached.sock' );
+// Controls the use of a persistent connections to memcache servers
+// See http://php.net/manual/en/memcache.addserver.php
+$config['memcache_pconnect'] = true;
+
+// Value in seconds which will be used for connecting to the daemon
+// See http://php.net/manual/en/memcache.addserver.php
+$config['memcache_timeout'] = 1;
+
+// Controls how often a failed server will be retried (value in seconds).
+// Setting this parameter to -1 disables automatic retry.
+// See http://php.net/manual/en/memcache.addserver.php
+$config['memcache_retry_interval'] = 15;
+
// check client IP in session authorization
$config['ip_check'] = false;
diff --git a/index.php b/index.php
index e19d81a26..a3066f439 100644
--- a/index.php
+++ b/index.php
@@ -2,9 +2,9 @@
/*
+-------------------------------------------------------------------------+
| Roundcube Webmail IMAP Client |
- | Version 1.1-git |
+ | Version 1.2-git |
| |
- | Copyright (C) 2005-2014, The Roundcube Dev Team |
+ | Copyright (C) 2005-2015, The Roundcube Dev Team |
| |
| This program is free software: you can redistribute it and/or modify |
| it under the terms of the GNU General Public License (with exceptions |
diff --git a/installer/index.php b/installer/index.php
index 61ff40076..4443d76c9 100644
--- a/installer/index.php
+++ b/installer/index.php
@@ -3,9 +3,9 @@
/*
+-------------------------------------------------------------------------+
| Roundcube Webmail setup tool |
- | Version 1.1-git |
+ | Version 1.2-git |
| |
- | Copyright (C) 2009-2014, The Roundcube Dev Team |
+ | Copyright (C) 2009-2015, The Roundcube Dev Team |
| |
| This program is free software: you can redistribute it and/or modify |
| it under the terms of the GNU General Public License (with exceptions |
diff --git a/plugins/acl/acl.js b/plugins/acl/acl.js
index 14634534e..e6a84ff73 100644
--- a/plugins/acl/acl.js
+++ b/plugins/acl/acl.js
@@ -353,6 +353,7 @@ rcube_webmail.prototype.acl_init_form = function(id)
id ? this.gettext('acl.editperms') : this.gettext('acl.newuser'),
buttons,
{
+ button_classes: ['mainaction'],
modal: true,
closeOnEscape: true,
close: function(e, ui) {
diff --git a/plugins/acl/localization/fr_FR.inc b/plugins/acl/localization/fr_FR.inc
index ba0f1015d..b011fff3d 100644
--- a/plugins/acl/localization/fr_FR.inc
+++ b/plugins/acl/localization/fr_FR.inc
@@ -26,19 +26,19 @@ $labels['anyone'] = 'Tous les utilisateurs (n\'importe qui)';
$labels['anonymous'] = 'Invités (anonyme)';
$labels['identifier'] = 'Identifiant';
$labels['acll'] = 'Consultation';
-$labels['aclr'] = 'Lire les messages';
+$labels['aclr'] = 'Lire les courriels';
$labels['acls'] = 'Garder l\'état « vu »';
$labels['aclw'] = 'Drapeaux d\'écriture';
$labels['acli'] = 'Insérer (copier dans)';
$labels['aclp'] = 'Publier';
$labels['aclc'] = 'Créer des sous-dossiers';
$labels['aclk'] = 'Créer des sous-dossiers';
-$labels['acld'] = 'Supprimer des messages';
-$labels['aclt'] = 'Supprimer des messages';
+$labels['acld'] = 'Supprimer des courriels';
+$labels['aclt'] = 'Supprimer des courriels';
$labels['acle'] = 'Purger';
$labels['aclx'] = 'Supprimer un dossier';
$labels['acla'] = 'Administrer';
-$labels['acln'] = 'Annoter les messages';
+$labels['acln'] = 'Annoter les courriels';
$labels['aclfull'] = 'Contrôle total';
$labels['aclother'] = 'Autre';
$labels['aclread'] = 'Lecture';
@@ -64,22 +64,22 @@ $labels['shortaclwrite'] = 'Écriture';
$labels['shortacldelete'] = 'Supprimer';
$labels['longacll'] = 'Ce dossier est visible dans les listes et on peut s\'y abonner';
$labels['longaclr'] = 'Le dossier peut-être ouvert en lecture';
-$labels['longacls'] = 'Le drapeau Vu des messages peut-être changée';
-$labels['longaclw'] = 'Les drapeaux et mot-clefs des messages peuvent-être changés, sauf pour Vu et Supprimé';
-$labels['longacli'] = 'Les messages peuvent-être écrits ou copiés dans le dossier';
-$labels['longaclp'] = 'Les messages peuvent-être publiés dans ce dossier';
+$labels['longacls'] = 'Le drapeau Vu des courriels peut-être changée';
+$labels['longaclw'] = 'Les drapeaux et mot-clefs des courriels peuvent-être changés, sauf pour Vu et Supprimé';
+$labels['longacli'] = 'Les courriels peuvent-être écrits ou copiés dans le dossier';
+$labels['longaclp'] = 'Les courriels peuvent-être publiés dans ce dossier';
$labels['longaclc'] = 'Les dossiers peuvent-être créés (ou renommés) directement depuis ce dossier';
$labels['longaclk'] = 'Les dossiers peuvent-être créés (ou renommés) directement depuis ce dossier';
-$labels['longacld'] = 'Le drapeau de suppression des messages peut-être modifiée';
-$labels['longaclt'] = 'Le drapeau de suppression des messages peut-être modifiée';
-$labels['longacle'] = 'Les messages peuvent-être purgés';
+$labels['longacld'] = 'Le drapeau de suppression des courriels peut-être modifiée';
+$labels['longaclt'] = 'Le drapeau de suppression des courriels peut-être modifiée';
+$labels['longacle'] = 'Les courriels peuvent-être purgés';
$labels['longaclx'] = 'Le dossier peut-être supprimé ou renommé';
$labels['longacla'] = 'Les droits d\'accès du dossier peuvent être modifiés';
-$labels['longacln'] = 'Les métadonnées partagées par les messages (annotations) peuvent être changées';
+$labels['longacln'] = 'Les métadonnées partagées des courriels (annotations) peuvent être changées';
$labels['longaclfull'] = 'Contrôle total, incluant l\'administration des dossiers';
$labels['longaclread'] = 'Le dossier peut-être ouvert en lecture';
-$labels['longaclwrite'] = 'Les messages peuvent-être marqués, écrits ou copiés dans ce dossier';
-$labels['longacldelete'] = 'Les messages peuvent être supprimés';
+$labels['longaclwrite'] = 'Les courriels peuvent-être marqués, écrits ou copiés dans ce dossier';
+$labels['longacldelete'] = 'Les courriels peuvent être supprimés';
$labels['longaclother'] = 'Autres droits d\'accès';
$labels['ariasummaryacltable'] = 'Liste de droits d\'accès';
$labels['arialabelaclactions'] = 'Lister les actions';
diff --git a/plugins/acl/localization/fy_NL.inc b/plugins/acl/localization/fy_NL.inc
new file mode 100644
index 000000000..340190af8
--- /dev/null
+++ b/plugins/acl/localization/fy_NL.inc
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/acl/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail ACL plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
+*/
+$labels['username'] = 'Brûker:';
+?>
diff --git a/plugins/acl/localization/ia.inc b/plugins/acl/localization/ia.inc
new file mode 100644
index 000000000..c3627389d
--- /dev/null
+++ b/plugins/acl/localization/ia.inc
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/acl/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail ACL plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/
+*/
+$labels['sharing'] = 'Uso in commun';
+$labels['myrights'] = 'Derectos de accesso';
+$labels['username'] = 'Usator:';
+$labels['advanced'] = 'Modo avantiate';
+$labels['newuser'] = 'Adder entrata';
+$labels['editperms'] = 'Modificar permissiones';
+$labels['actions'] = 'Actiones de derecto de accesso...';
+$labels['anyone'] = 'Tote le usatores (non importa qui)';
+$labels['anonymous'] = 'Hospites (anonyme)';
+$labels['identifier'] = 'Identificator';
+$labels['acll'] = 'Cercar';
+$labels['aclr'] = 'Leger messages';
+$labels['acls'] = 'Retener le stato Vidite';
+$labels['aclw'] = 'Signales de scriptura';
+$labels['acli'] = 'Inserer (copiar in)';
+$labels['aclp'] = 'Inviar';
+$labels['aclc'] = 'Crear subdossieres';
+$labels['aclk'] = 'Crear subdossieres';
+$labels['acld'] = 'Deler messages';
+$labels['aclt'] = 'Deler messages';
+$labels['acle'] = 'Expunger';
+$labels['aclx'] = 'Deler dossier';
+$labels['acla'] = 'Administrar';
+$labels['acln'] = 'Annotar messages';
+$labels['aclfull'] = 'Controlo total';
+$labels['aclother'] = 'Altere';
+$labels['aclread'] = 'Leger';
+$labels['aclwrite'] = 'Scriber';
+$labels['acldelete'] = 'Deler';
+$labels['shortacll'] = 'Cercar';
+$labels['shortaclr'] = 'Leger';
+$labels['shortacls'] = 'Retener';
+$labels['shortaclw'] = 'Scriber';
+$labels['shortacli'] = 'Inserer';
+$labels['shortaclp'] = 'Inviar';
+$labels['shortaclc'] = 'Crear';
+$labels['shortaclk'] = 'Crear';
+$labels['shortacld'] = 'Deler';
+$labels['shortaclt'] = 'Deler';
+$labels['shortacle'] = 'Expunger';
+$labels['shortaclx'] = 'Deletion de dossier';
+$labels['shortacla'] = 'Administrar';
+$labels['shortacln'] = 'Annotar';
+$labels['shortaclother'] = 'Altere';
+$labels['shortaclread'] = 'Leger';
+$labels['shortaclwrite'] = 'Scriber';
+$labels['shortacldelete'] = 'Deler';
+$labels['longacll'] = 'Le dossier es visibile in listas e on pote subscriber se a illo';
+$labels['longaclr'] = 'Le dossier pote esser aperite pro lectura';
+$labels['longacls'] = 'Le signal "Vidite" de messages pote esser cambiate';
+$labels['longaclw'] = 'Le signales e parolas-clave de messages pote esser cambiate, excepte "Vidite" e "Delite"';
+$labels['longacli'] = 'Messages pote esser scribite o copiate al dossier';
+$labels['longaclp'] = 'Messages pote esser inviate a iste dossier';
+$labels['longaclc'] = 'Dossieres pote esser create (o renominate) directemente sub iste dossier';
+$labels['longaclk'] = 'Dossieres pote esser create (o renominate) directemente sub iste dossier';
+$labels['longacld'] = 'Le signal "Deler" de messages pote esser cambiate';
+$labels['longaclt'] = 'Le signal "Deler" de messages pote esser cambiate';
+$labels['longacle'] = 'Messages pote esser expungite';
+$labels['longaclx'] = 'Le dossier pote esser delite o renominate';
+$labels['longacla'] = 'Le derectos de accesso del dossier pote esser cambiate';
+$labels['longacln'] = 'Le metadatos commun (annotationes) de messages pote esser cambiate';
+$labels['longaclfull'] = 'Controlo total incluse le administration de dossieres';
+$labels['longaclread'] = 'Le dossier pote esser aperite pro lectura';
+$labels['longaclwrite'] = 'Messages pote esser marcate, scribite o copiate al dossier';
+$labels['longacldelete'] = 'Messages pote esser delite';
+$labels['longaclother'] = 'Altere derectos de accesso';
+$labels['ariasummaryacltable'] = 'Lista de derectos de accesso';
+$labels['arialabelaclactions'] = 'Listar actiones';
+$labels['arialabelaclform'] = 'Formulario de derectos de accesso';
+$messages['deleting'] = 'A deler derectos de accesso...';
+$messages['saving'] = 'A salveguardar derectos de accesso...';
+$messages['updatesuccess'] = 'Le derectos de accesso ha essite cambiate';
+$messages['deletesuccess'] = 'Le derectos de accesso ha essite delite';
+$messages['createsuccess'] = 'Le derectos de accesso ha essite addite';
+$messages['updateerror'] = 'Impossibile actualisar le derectos de accesso';
+$messages['deleteerror'] = 'Impossibile deler derectos de accesso';
+$messages['createerror'] = 'Impossibile adder derectos de accesso';
+$messages['deleteconfirm'] = 'Es vos secur de voler remover le derectos de accesso del usator(es) seligite?';
+$messages['norights'] = 'Nulle derecto ha essite specificate.';
+$messages['nouser'] = 'Nulle nomine de usator ha essite specificate.';
+?>
diff --git a/plugins/archive/localization/es_ES.inc b/plugins/archive/localization/es_ES.inc
index 115751f67..75a80489f 100644
--- a/plugins/archive/localization/es_ES.inc
+++ b/plugins/archive/localization/es_ES.inc
@@ -17,15 +17,15 @@
*/
$labels['buttontext'] = 'Archivo';
$labels['buttontitle'] = 'Archivar este mensaje';
-$labels['archived'] = 'Mensaje Archivado';
-$labels['archivedreload'] = 'Archivado con éxito. Recargue la página para ver las nuevas carpetas de archivo.';
-$labels['archiveerror'] = 'No se ha podido archivar algunos mensajes';
+$labels['archived'] = 'Archivado correctamente';
+$labels['archivedreload'] = 'Archivado correctamente. Recargue la página para ver las nuevas carpetas de archivo.';
+$labels['archiveerror'] = 'No se pudo archivar algunos mensajes';
$labels['archivefolder'] = 'Archivo';
$labels['settingstitle'] = 'Archivo';
$labels['archivetype'] = 'Dividir el archivo por';
$labels['archivetypeyear'] = 'Año (p.ej. Archivo/2012)';
$labels['archivetypemonth'] = 'Mes (p.ej. Archivo/2012/06)';
$labels['archivetypefolder'] = 'Bandeja original';
-$labels['archivetypesender'] = 'Email del remitente';
+$labels['archivetypesender'] = 'Correo electrónico del remitente';
$labels['unkownsender'] = 'desconocido';
?>
diff --git a/plugins/archive/localization/fr_FR.inc b/plugins/archive/localization/fr_FR.inc
index 7fba1aa0e..fa6bb9d68 100644
--- a/plugins/archive/localization/fr_FR.inc
+++ b/plugins/archive/localization/fr_FR.inc
@@ -16,10 +16,10 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/
*/
$labels['buttontext'] = 'Archive';
-$labels['buttontitle'] = 'Archiver ce message';
-$labels['archived'] = 'Message archivé avec succès';
+$labels['buttontitle'] = 'Archiver ce courriel';
+$labels['archived'] = 'Archivé avec succès';
$labels['archivedreload'] = 'Archivé avec succès. Recharger la page pour voir les nouveaux dossiers d\'archives.';
-$labels['archiveerror'] = 'Certains messages n\'ont pas pu être archivés.';
+$labels['archiveerror'] = 'Certains courriels n\'ont pas pu être archivés.';
$labels['archivefolder'] = 'Archive';
$labels['settingstitle'] = 'Archive';
$labels['archivetype'] = 'Diviser l\'archive par';
diff --git a/plugins/archive/localization/ia.inc b/plugins/archive/localization/ia.inc
new file mode 100644
index 000000000..3f0cb5707
--- /dev/null
+++ b/plugins/archive/localization/ia.inc
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/archive/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Archive plugin |
+ | Copyright (C) 2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-archive/
+*/
+$labels['buttontext'] = 'Archivar';
+$labels['buttontitle'] = 'Archivar iste message';
+$labels['archived'] = 'Archivate con successo';
+$labels['archivedreload'] = 'Archivate con successo. Recarga le pagina pro vider le nove dossieres de archivo.';
+$labels['archiveerror'] = 'Alcun messages non poteva esser archivate';
+$labels['archivefolder'] = 'Archivo';
+$labels['settingstitle'] = 'Archivo';
+$labels['archivetype'] = 'Divider le archivo per';
+$labels['archivetypeyear'] = 'Anno (p.ex. Archivo/2012)';
+$labels['archivetypemonth'] = 'Mense (p.ex. Archivo/2012/06)';
+$labels['archivetypefolder'] = 'Dossier original';
+$labels['archivetypesender'] = 'E-mail del expeditor';
+$labels['unkownsender'] = 'incognite';
+?>
diff --git a/plugins/attachment_reminder/localization/es_ES.inc b/plugins/attachment_reminder/localization/es_ES.inc
index 7f6f29e6e..2e4ffdf28 100644
--- a/plugins/attachment_reminder/localization/es_ES.inc
+++ b/plugins/attachment_reminder/localization/es_ES.inc
@@ -17,4 +17,4 @@
*/
$messages['forgotattachment'] = "¿Olvidó adjuntar un fichero al mensaje?";
$messages['reminderoption'] = "Recordatorio sobre adjuntos olvidados";
-$messages['keywords'] = "adjunto";
+$messages['keywords'] = "adjunto, archivo, adjuntar, unido, adjuntando, cerrado, CV, carta de presentación";
diff --git a/plugins/attachment_reminder/localization/fr_FR.inc b/plugins/attachment_reminder/localization/fr_FR.inc
index 1d1af5a56..999affccb 100644
--- a/plugins/attachment_reminder/localization/fr_FR.inc
+++ b/plugins/attachment_reminder/localization/fr_FR.inc
@@ -16,5 +16,5 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/
*/
$messages['forgotattachment'] = "Avez-vous oublié de joindre un fichier ?";
-$messages['reminderoption'] = "Rappeler les pièces jointes oubliées";
-$messages['keywords'] = "joins,joint,attaché,fichier,inclus,ci-inclus,CV";
+$messages['reminderoption'] = "Rappel sur les pièces jointes oubliées";
+$messages['keywords'] = "pièce jointe,fichier,joindre,joins,joint,attaché,inclus,ci-inclus,CV, lettre d'accompagnement";
diff --git a/plugins/attachment_reminder/localization/ia.inc b/plugins/attachment_reminder/localization/ia.inc
new file mode 100644
index 000000000..3b7af087d
--- /dev/null
+++ b/plugins/attachment_reminder/localization/ia.inc
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/attachment_reminder/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Archive plugin |
+ | Copyright (C) 2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/
+*/
+$messages['forgotattachment'] = "Ha vos oblidate de attachar un file?";
+$messages['reminderoption'] = "Rememorar de attachamentos oblidate";
+$messages['keywords'] = "attachamento,file,attachar,attachate,attachante,annexo,annexe,annexate,CV,curriculo de vita";
diff --git a/plugins/attachment_reminder/localization/tr_TR.inc b/plugins/attachment_reminder/localization/tr_TR.inc
index f03587d97..6d0d5c027 100644
--- a/plugins/attachment_reminder/localization/tr_TR.inc
+++ b/plugins/attachment_reminder/localization/tr_TR.inc
@@ -15,6 +15,6 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-attachment_reminder/
*/
-$messages['forgotattachment'] = "Bir dosya eklemeyi unuttunuz mu?";
-$messages['reminderoption'] = "Unutulan dosya eklemelerini hatırlat";
-$messages['keywords'] = "ekleme,dosya,ek,eklenildi,ekleniliyor,konuldu,CV,kapak mektubu";
+$messages['forgotattachment'] = "Dosya eklemeyi mi unuttunuz?";
+$messages['reminderoption'] = "Dosya ek(ler)i unutulduysa hatırlat.";
+$messages['keywords'] = "ekleme,dosya,ek,eklenildi,ekleniliyor,ekteki,CV,mektup";
diff --git a/plugins/help/help.php b/plugins/help/help.php
index df08caf71..d71cd0ec6 100644
--- a/plugins/help/help.php
+++ b/plugins/help/help.php
@@ -82,8 +82,14 @@ class help extends rcube_plugin
function tablink($attrib)
{
$rcmail = rcmail::get_instance();
+
$attrib['name'] = 'helplink' . $attrib['action'];
$attrib['href'] = $rcmail->url(array('_action' => $attrib['action'], '_extwin' => !empty($_REQUEST['_extwin']) ? 1 : null));
+
+ // title might be already translated here, so revert to it's initial value
+ // so button() will translate it correctly
+ $attrib['title'] = $attrib['label'];
+
return $rcmail->output->button($attrib);
}
diff --git a/plugins/help/localization/fy_NL.inc b/plugins/help/localization/fy_NL.inc
new file mode 100644
index 000000000..3e852a7ce
--- /dev/null
+++ b/plugins/help/localization/fy_NL.inc
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/help/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Help plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-help/
+*/
+$labels['help'] = 'Help';
+$labels['about'] = 'Oer';
+$labels['license'] = 'Lisinsje';
+?>
diff --git a/plugins/help/localization/ia.inc b/plugins/help/localization/ia.inc
new file mode 100644
index 000000000..d097947c1
--- /dev/null
+++ b/plugins/help/localization/ia.inc
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/help/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Help plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-help/
+*/
+$labels['help'] = 'Adjuta';
+$labels['about'] = 'A proposito';
+$labels['license'] = 'Licentia';
+?>
diff --git a/plugins/help/skins/larry/help.css b/plugins/help/skins/larry/help.css
index d9af6e15e..d42f4e00b 100644
--- a/plugins/help/skins/larry/help.css
+++ b/plugins/help/skins/larry/help.css
@@ -5,7 +5,7 @@
}
#mainscreen .readtext {
- margin: 0 auto;
+ margin: 20px;
}
#helptoolbar {
diff --git a/plugins/hide_blockquote/localization/ia.inc b/plugins/hide_blockquote/localization/ia.inc
new file mode 100644
index 000000000..0d7795cea
--- /dev/null
+++ b/plugins/hide_blockquote/localization/ia.inc
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/hide_blockquote/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Hide-Blockquote plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-hide_blockquote/
+*/
+$labels['hide'] = 'Celar';
+$labels['show'] = 'Monstrar';
+$labels['quotelimit'] = 'Celar le citation quando le numero de lineas es superior a';
+?>
diff --git a/plugins/hide_blockquote/localization/tr_TR.inc b/plugins/hide_blockquote/localization/tr_TR.inc
index db3d013e7..b9ac529cf 100644
--- a/plugins/hide_blockquote/localization/tr_TR.inc
+++ b/plugins/hide_blockquote/localization/tr_TR.inc
@@ -17,5 +17,5 @@
*/
$labels['hide'] = 'Gizle';
$labels['show'] = 'Göster';
-$labels['quotelimit'] = 'Satır sayısı şu satır sayısındna fazla ile alıntıları gizle:';
+$labels['quotelimit'] = 'Satır sayısı şu satır sayısından fazla ise alıntıları gizle:';
?>
diff --git a/plugins/jqueryui/jqueryui.php b/plugins/jqueryui/jqueryui.php
index 2dfa8add1..1511ac5cf 100644
--- a/plugins/jqueryui/jqueryui.php
+++ b/plugins/jqueryui/jqueryui.php
@@ -108,6 +108,27 @@ class jqueryui extends rcube_plugin
$rcube->output->set_env('mscolors', self::get_color_values());
}
+ public static function tagedit()
+ {
+ if (in_array('tagedit', self::$features)) {
+ return;
+ }
+
+ self::$features[] = 'tagedit';
+
+ $script = 'plugins/jqueryui/js/jquery.tagedit.js';
+ $rcube = rcube::get_instance();
+ $ui_theme = self::$ui_theme;
+ $css = "plugins/jqueryui/themes/$ui_theme/tagedit.css";
+
+ if (!file_exists(INSTALL_PATH . $css)) {
+ $css = "plugins/jqueryui/themes/larry/tagedit.css";
+ }
+
+ $rcube->output->include_css($css);
+ $rcube->output->add_header(html::tag('script', array('type' => "text/javascript", 'src' => $script)));
+ }
+
/**
* Return a (limited) list of color values to be used for calendar and category coloring
*
diff --git a/plugins/jqueryui/js/jquery-ui-1.10.4.custom.min.js b/plugins/jqueryui/js/jquery-ui-1.10.4.custom.min.js
index ea4edecb3..73248ecac 100755
--- a/plugins/jqueryui/js/jquery-ui-1.10.4.custom.min.js
+++ b/plugins/jqueryui/js/jquery-ui-1.10.4.custom.min.js
@@ -109,17 +109,23 @@ $.extend($.datepicker, {
var that = this;
// register additional keyboard events to control date selection with cursor keys
- $(target).unbind('keyup.datepicker-extended').bind('keyup.datepicker-extended', function(event) {
+ $(target).unbind('keydown.datepicker-extended').bind('keydown.datepicker-extended', function(event) {
var inc = 1;
switch (event.keyCode) {
case 109:
+ case 173:
case 189: // "minus"
inc = -1;
+ case 61:
case 107:
case 187: // "plus"
+ // do nothing if the input does not contain full date string
+ if (this.value.length < that._formatDate(inst, inst.selectedDay, inst.selectedMonth, inst.selectedYear).length) {
+ return true;
+ }
that._adjustInstDate(inst, inc, 'D');
- that._selectDate(target, that._formatDate(inst, inst.selectedDay, inst.selectedMonth, inst.selectedYear));
- break;
+ that._selectDateRC(target, that._formatDate(inst, inst.selectedDay, inst.selectedMonth, inst.selectedYear));
+ return false;
case $.ui.keyCode.UP:
case $.ui.keyCode.DOWN:
@@ -222,8 +228,23 @@ $.extend($.datepicker, {
inst.dpDiv.find('.ui-datepicker-calendar').focus();
inst._hasfocus = false;
}
- }
+ },
+ _selectDateRC: function(id, dateStr) {
+ var target = $(id), inst = this._getInst(target[0]);
+
+ dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
+ if (inst.input) {
+ inst.input.val(dateStr);
+ }
+ this._updateAlternate(inst);
+ if (inst.input) {
+ inst.input.trigger("change"); // fire the change event
+ }
+ if (inst.inline) {
+ this._updateDatepicker(inst);
+ }
+ }
});
-}(jQuery)); \ No newline at end of file
+}(jQuery));
diff --git a/plugins/jqueryui/js/jquery-ui-accessible-datepicker.js b/plugins/jqueryui/js/jquery-ui-accessible-datepicker.js
index 1c79e13bd..ef7561c7b 100644
--- a/plugins/jqueryui/js/jquery-ui-accessible-datepicker.js
+++ b/plugins/jqueryui/js/jquery-ui-accessible-datepicker.js
@@ -94,17 +94,23 @@ $.extend($.datepicker, {
var that = this;
// register additional keyboard events to control date selection with cursor keys
- $(target).unbind('keyup.datepicker-extended').bind('keyup.datepicker-extended', function(event) {
+ $(target).unbind('keydown.datepicker-extended').bind('keydown.datepicker-extended', function(event) {
var inc = 1;
switch (event.keyCode) {
case 109:
+ case 173:
case 189: // "minus"
inc = -1;
+ case 61:
case 107:
case 187: // "plus"
+ // do nothing if the input does not contain full date string
+ if (this.value.length < that._formatDate(inst, inst.selectedDay, inst.selectedMonth, inst.selectedYear).length) {
+ return true;
+ }
that._adjustInstDate(inst, inc, 'D');
- that._selectDate(target, that._formatDate(inst, inst.selectedDay, inst.selectedMonth, inst.selectedYear));
- break;
+ that._selectDateRC(target, that._formatDate(inst, inst.selectedDay, inst.selectedMonth, inst.selectedYear));
+ return false;
case $.ui.keyCode.UP:
case $.ui.keyCode.DOWN:
@@ -207,8 +213,23 @@ $.extend($.datepicker, {
inst.dpDiv.find('.ui-datepicker-calendar').focus();
inst._hasfocus = false;
}
- }
+ },
+ _selectDateRC: function(id, dateStr) {
+ var target = $(id), inst = this._getInst(target[0]);
+
+ dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
+ if (inst.input) {
+ inst.input.val(dateStr);
+ }
+ this._updateAlternate(inst);
+ if (inst.input) {
+ inst.input.trigger("change"); // fire the change event
+ }
+ if (inst.inline) {
+ this._updateDatepicker(inst);
+ }
+ }
});
-}(jQuery)); \ No newline at end of file
+}(jQuery));
diff --git a/plugins/jqueryui/js/jquery.miniColors.min.js b/plugins/jqueryui/js/jquery.miniColors.min.js
index 4b42ab7ed..487e6ade1 100644
--- a/plugins/jqueryui/js/jquery.miniColors.min.js
+++ b/plugins/jqueryui/js/jquery.miniColors.min.js
@@ -35,8 +35,8 @@
jQuery&&function(d){d.extend(d.fn,{miniColors:function(j,k){var x=function(a,b){var e=l(a.val());e||(e="FFFFFF");var c=p(e),e=d('<a class="miniColors-trigger" style="background-color: #'+e+'" href="#"></a>');e.insertAfter(a);a.addClass("miniColors").attr("maxlength",7).attr("autocomplete","off");a.data("trigger",e);a.data("hsb",c);b.change&&a.data("change",b.change);b.readonly&&a.attr("readonly",true);b.disabled&&q(a);b.colorValues&&a.data("colorValues",b.colorValues);e.bind("click.miniColors",function(b){b.preventDefault();
a.trigger("focus")});a.bind("focus.miniColors",function(){w(a)});a.bind("blur.miniColors",function(){var b=l(a.val());a.val(b?"#"+b:"")});a.bind("keydown.miniColors",function(b){b.keyCode===9&&i(a)});a.bind("keyup.miniColors",function(){var b=a.val().replace(/[^A-F0-9#]/ig,"");a.val(b);r(a)||a.data("trigger").css("backgroundColor","#FFF")});a.bind("paste.miniColors",function(){setTimeout(function(){a.trigger("keyup")},5)})},q=function(a){i(a);a.attr("disabled",true);a.data("trigger").css("opacity",
0.5)},w=function(a){if(a.attr("disabled"))return false;i();var b=d('<div class="miniColors-selector"></div>');b.append('<div class="miniColors-colors" style="background-color: #FFF;"><div class="miniColors-colorPicker"></div></div>');b.append('<div class="miniColors-hues"><div class="miniColors-huePicker"></div></div>');b.css({top:a.is(":visible")?a.offset().top+a.outerHeight():a.data("trigger").offset().top+a.data("trigger").outerHeight(),left:a.is(":visible")?a.offset().left:a.data("trigger").offset().left,
-display:"none"}).addClass(a.attr("class"));var e=a.data("colorValues");if(e&&e.length){var c,f='<div class="miniColors-presets">',g;for(g in e)c=l(e[g]),f+='<div class="miniColors-colorPreset" style="background-color:#'+c+'" rel="'+c+'"></div>';f+="</div>";b.append(f);c=Math.ceil(e.length/7)*24;b.css("width",b.width()+c+5+"px");b.find(".miniColors-presets").css("width",c+"px")}c=a.data("hsb");b.find(".miniColors-colors").css("backgroundColor","#"+n(m({h:c.h,s:100,b:100})));(f=a.data("colorPosition"))||
-(f=s(c));b.find(".miniColors-colorPicker").css("top",f.y+"px").css("left",f.x+"px");(f=a.data("huePosition"))||(f=t(c));b.find(".miniColors-huePicker").css("top",f.y+"px");a.data("selector",b);a.data("huePicker",b.find(".miniColors-huePicker"));a.data("colorPicker",b.find(".miniColors-colorPicker"));a.data("mousebutton",0);d("BODY").append(b);b.fadeIn(100);b.bind("selectstart",function(){return false});d(document).bind("mousedown.miniColors",function(b){a.data("mousebutton",1);d(b.target).parents().andSelf().hasClass("miniColors-colors")&&
+display:"none"}).addClass(a.attr("class")).appendTo(d("BODY"));;var e=a.data("colorValues");if(e&&e.length){var c,f='<div class="miniColors-presets">',g;for(g in e)c=l(e[g]),f+='<div class="miniColors-colorPreset" style="background-color:#'+c+'" rel="'+c+'"></div>';f+="</div>";b.append(f);c=Math.ceil(e.length/7)*24;b.css("width",b.width()+c+5+"px");b.find(".miniColors-presets").css("width",c+"px")}c=a.data("hsb");b.find(".miniColors-colors").css("backgroundColor","#"+n(m({h:c.h,s:100,b:100})));(f=a.data("colorPosition"))||
+(f=s(c));b.find(".miniColors-colorPicker").css("top",f.y+"px").css("left",f.x+"px");(f=a.data("huePosition"))||(f=t(c));b.find(".miniColors-huePicker").css("top",f.y+"px");a.data("selector",b);a.data("huePicker",b.find(".miniColors-huePicker"));a.data("colorPicker",b.find(".miniColors-colorPicker"));a.data("mousebutton",0);b.fadeIn(100);b.bind("selectstart",function(){return false});d(document).bind("mousedown.miniColors",function(b){a.data("mousebutton",1);d(b.target).parents().andSelf().hasClass("miniColors-colors")&&
(b.preventDefault(),a.data("moving","colors"),u(a,b));d(b.target).parents().andSelf().hasClass("miniColors-hues")&&(b.preventDefault(),a.data("moving","hues"),v(a,b));d(b.target).parents().andSelf().hasClass("miniColors-selector")?b.preventDefault():d(b.target).parents().andSelf().hasClass("miniColors")||i(a)});d(document).bind("mouseup.miniColors",function(){a.data("mousebutton",0);a.removeData("moving")});d(document).bind("mousemove.miniColors",function(b){a.data("mousebutton")===1&&(a.data("moving")===
"colors"&&u(a,b),a.data("moving")==="hues"&&v(a,b))});e&&(b.find(".miniColors-colorPreset").click(function(){a.val(d(this).attr("rel"));r(a)}),b.find('.miniColors-presets div[rel="'+a.val().replace(/#/,"")+'"]').addClass("miniColors-colorPreset-active"))},i=function(a){a||(a=".miniColors");d(a).each(function(){var a=d(this).data("selector");d(this).removeData("selector");d(a).fadeOut(100,function(){d(this).remove()})});d(document).unbind("mousedown.miniColors");d(document).unbind("mousemove.miniColors")},
u=function(a,b){var e=a.data("colorPicker");e.hide();var c={x:b.clientX-a.data("selector").find(".miniColors-colors").offset().left+d(document).scrollLeft()-5,y:b.clientY-a.data("selector").find(".miniColors-colors").offset().top+d(document).scrollTop()-5};if(c.x<=-5)c.x=-5;if(c.x>=144)c.x=144;if(c.y<=-5)c.y=-5;if(c.y>=144)c.y=144;a.data("colorPosition",c);e.css("left",c.x).css("top",c.y).show();e=Math.round((c.x+5)*0.67);e<0&&(e=0);e>100&&(e=100);c=100-Math.round((c.y+5)*0.67);c<0&&(c=0);c>100&&
diff --git a/plugins/jqueryui/js/jquery.tagedit.js b/plugins/jqueryui/js/jquery.tagedit.js
new file mode 100644
index 000000000..baab701cf
--- /dev/null
+++ b/plugins/jqueryui/js/jquery.tagedit.js
@@ -0,0 +1,683 @@
+/*
+* Tagedit - jQuery Plugin
+* The Plugin can be used to edit tags from a database the easy way
+*
+* Examples and documentation at: tagedit.webwork-albrecht.de
+*
+* License:
+* This work is licensed under a MIT License
+*
+* @licstart The following is the entire license notice for the
+* JavaScript code in this file.
+*
+* Copyright (c) 2010 Oliver Albrecht <info@webwork-albrecht.de>
+* Copyright (c) 2014 Thomas Brüderli <thomas@roundcube.net>
+*
+* Licensed under the MIT licenses
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be
+* included in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+* @licend The above is the entire license notice
+* for the JavaScript code in this file.
+*
+* @author Oliver Albrecht Mial: info@webwork-albrecht.de Twitter: @webworka
+* @version 1.5.2 (06/2014)
+* Requires: jQuery v1.4+, jQueryUI v1.8+, jQuerry.autoGrowInput
+*
+* Example of usage:
+*
+* $( "input.tag" ).tagedit();
+*
+* Possible options:
+*
+* autocompleteURL: '', // url for a autocompletion
+* deleteEmptyItems: true, // Deletes items with empty value
+* deletedPostfix: '-d', // will be put to the Items that are marked as delete
+* addedPostfix: '-a', // will be put to the Items that are choosem from the database
+* additionalListClass: '', // put a classname here if the wrapper ul shoud receive a special class
+* allowEdit: true, // Switch on/off edit entries
+* allowDelete: true, // Switch on/off deletion of entries. Will be ignored if allowEdit = false
+* allowAdd: true, // switch on/off the creation of new entries
+* direction: 'ltr' // Sets the writing direction for Outputs and Inputs
+* animSpeed: 500 // Sets the animation speed for effects
+* autocompleteOptions: {}, // Setting Options for the jquery UI Autocomplete (http://jqueryui.com/demos/autocomplete/)
+* breakKeyCodes: [ 13, 44 ], // Sets the characters to break on to parse the tags (defaults: return, comma)
+* checkNewEntriesCaseSensitive: false, // If there is a new Entry, it is checked against the autocompletion list. This Flag controlls if the check is (in-)casesensitive
+* texts: { // some texts
+* removeLinkTitle: 'Remove from list.',
+* saveEditLinkTitle: 'Save changes.',
+* deleteLinkTitle: 'Delete this tag from database.',
+* deleteConfirmation: 'Are you sure to delete this entry?',
+* deletedElementTitle: 'This Element will be deleted.',
+* breakEditLinkTitle: 'Cancel'
+* }
+*/
+
+(function($) {
+
+ $.fn.tagedit = function(options) {
+ /**
+ * Merge Options with defaults
+ */
+ options = $.extend(true, {
+ // default options here
+ autocompleteURL: null,
+ checkToDeleteURL: null,
+ deletedPostfix: '-d',
+ addedPostfix: '-a',
+ additionalListClass: '',
+ allowEdit: true,
+ allowDelete: true,
+ allowAdd: true,
+ direction: 'ltr',
+ animSpeed: 500,
+ autocompleteOptions: {
+ select: function( event, ui ) {
+ $(this).val(ui.item.value).trigger('transformToTag', [ui.item.id]);
+ return false;
+ }
+ },
+ breakKeyCodes: [ 13, 44 ],
+ checkNewEntriesCaseSensitive: false,
+ texts: {
+ removeLinkTitle: 'Remove from list.',
+ saveEditLinkTitle: 'Save changes.',
+ deleteLinkTitle: 'Delete this tag from database.',
+ deleteConfirmation: 'Are you sure to delete this entry?',
+ deletedElementTitle: 'This Element will be deleted.',
+ breakEditLinkTitle: 'Cancel',
+ forceDeleteConfirmation: 'There are more records using this tag, are you sure do you want to remove it?'
+ },
+ tabindex: false
+ }, options || {});
+
+ // no action if there are no elements
+ if(this.length == 0) {
+ return;
+ }
+
+ // set the autocompleteOptions source
+ if(options.autocompleteURL) {
+ options.autocompleteOptions.source = options.autocompleteURL;
+ }
+
+ // Set the direction of the inputs
+ var direction= this.attr('dir');
+ if(direction && direction.length > 0) {
+ options.direction = this.attr('dir');
+ }
+
+ var elements = this;
+ var focusItem = null;
+
+ var baseNameRegexp = new RegExp("^(.*)\\[([0-9]*?("+options.deletedPostfix+"|"+options.addedPostfix+")?)?\]$", "i");
+
+ var baseName = elements.eq(0).attr('name').match(baseNameRegexp);
+ if(baseName && baseName.length == 4) {
+ baseName = baseName[1];
+ }
+ else {
+ // Elementname does not match the expected format, exit
+ alert('elementname dows not match the expected format (regexp: '+baseNameRegexp+')')
+ return;
+ }
+
+ // read tabindex from source element
+ var ti;
+ if (!options.tabindex && (ti = elements.eq(0).attr('tabindex')))
+ options.tabindex = ti;
+
+ // init elements
+ inputsToList();
+
+ /**
+ * Creates the tageditinput from a list of textinputs
+ *
+ */
+ function inputsToList() {
+ var html = '<ul class="tagedit-list '+options.additionalListClass+'">';
+
+ elements.each(function(i) {
+ var element_name = $(this).attr('name').match(baseNameRegexp);
+ if(element_name && element_name.length == 4 && (options.deleteEmptyItems == false || $(this).val().length > 0)) {
+ if(element_name[1].length > 0) {
+ var elementId = typeof element_name[2] != 'undefined'? element_name[2]: '',
+ domId = 'tagedit-' + baseName + '-' + (elementId || i);
+
+ html += '<li class="tagedit-listelement tagedit-listelement-old" aria-labelledby="'+domId+'">';
+ html += '<span dir="'+options.direction+'" id="'+domId+'">' + $(this).val() + '</span>';
+ html += '<input type="hidden" name="'+baseName+'['+elementId+']" value="'+$(this).val()+'" />';
+ if (options.allowDelete)
+ html += '<a class="tagedit-close" title="'+options.texts.removeLinkTitle+'" aria-label="'+options.texts.removeLinkTitle+' '+$(this).val()+'">x</a>';
+ html += '</li>';
+ }
+ }
+ });
+
+ // replace Elements with the list and save the list in the local variable elements
+ elements.last().after(html)
+ var newList = elements.last().next();
+ elements.remove();
+ elements = newList;
+
+ // Check if some of the elementshav to be marked as deleted
+ if(options.deletedPostfix.length > 0) {
+ elements.find('input[name$="'+options.deletedPostfix+'\]"]').each(function() {
+ markAsDeleted($(this).parent());
+ });
+ }
+
+ // put an input field at the End
+ // Put an empty element at the end
+ html = '<li class="tagedit-listelement tagedit-listelement-new">';
+ if (options.allowAdd)
+ html += '<input type="text" name="'+baseName+'[]" value="" id="tagedit-input" disabled="disabled" class="tagedit-input-disabled" dir="'+options.direction+'"/>';
+ html += '</li>';
+ html += '</ul>';
+
+ elements
+ .append(html)
+ .attr('tabindex', options.tabindex) // set tabindex to <ul> to recieve focus
+
+ // Set function on the input
+ .find('#tagedit-input')
+ .attr('tabindex', options.tabindex)
+ .each(function() {
+ $(this).autoGrowInput({comfortZone: 15, minWidth: 15, maxWidth: 20000});
+
+ // Event is triggert in case of choosing an item from the autocomplete, or finish the input
+ $(this).bind('transformToTag', function(event, id) {
+ var oldValue = (typeof id != 'undefined' && (id.length > 0 || id > 0));
+
+ var checkAutocomplete = oldValue == true || options.autocompleteOptions.noCheck ? false : true;
+ // check if the Value ist new
+ var isNewResult = isNew($(this).val(), checkAutocomplete);
+ if(isNewResult[0] === true || (isNewResult[0] === false && typeof isNewResult[1] == 'string')) {
+
+ if(oldValue == false && typeof isNewResult[1] == 'string') {
+ oldValue = true;
+ id = isNewResult[1];
+ }
+
+ if(options.allowAdd == true || oldValue) {
+ var domId = 'tagedit-' + baseName + '-' + id;
+ // Make a new tag in front the input
+ html = '<li class="tagedit-listelement tagedit-listelement-old" aria-labelledby="'+domId+'">';
+ html += '<span dir="'+options.direction+'" id="'+domId+'">' + $(this).val() + '</span>';
+ var name = oldValue? baseName + '['+id+options.addedPostfix+']' : baseName + '[]';
+ html += '<input type="hidden" name="'+name+'" value="'+$(this).val()+'" />';
+ html += '<a class="tagedit-close" title="'+options.texts.removeLinkTitle+'" aria-label="'+options.texts.removeLinkTitle+' '+$(this).val()+'">x</a>';
+ html += '</li>';
+
+ $(this).parent().before(html);
+ }
+ }
+ $(this).val('');
+
+ // close autocomplete
+ if(options.autocompleteOptions.source) {
+ if($(this).is(':ui-autocomplete'))
+ $(this).autocomplete( "close" );
+ }
+
+ })
+ .keydown(function(event) {
+ var code = event.keyCode > 0? event.keyCode : event.which;
+
+ switch(code) {
+ case 46:
+ if (!focusItem)
+ break;
+ case 8: // BACKSPACE
+ if(focusItem) {
+ focusItem.fadeOut(options.animSpeed, function() {
+ $(this).remove();
+ })
+ unfocusItem();
+ event.preventDefault();
+ return false;
+ }
+ else if($(this).val().length == 0) {
+ // delete Last Tag
+ var elementToRemove = elements.find('li.tagedit-listelement-old').last();
+ elementToRemove.fadeOut(options.animSpeed, function() {elementToRemove.remove();})
+ event.preventDefault();
+ return false;
+ }
+ break;
+ case 9: // TAB
+ if($(this).val().length > 0 && $('ul.ui-autocomplete #ui-active-menuitem').length == 0) {
+ $(this).trigger('transformToTag');
+ event.preventDefault();
+ return false;
+ }
+ break;
+ case 37: // LEFT
+ case 39: // RIGHT
+ if($(this).val().length == 0) {
+ // select previous Tag
+ var inc = code == 37 ? -1 : 1,
+ items = elements.find('li.tagedit-listelement-old')
+ x = items.length, next = 0;
+ items.each(function(i, elem) {
+ if ($(elem).hasClass('tagedit-listelement-focus')) {
+ x = i;
+ return true;
+ }
+ });
+ unfocusItem();
+ next = Math.max(0, x + inc);
+ if (items.get(next)) {
+ focusItem = items.eq(next).addClass('tagedit-listelement-focus');
+ $(this).attr('aria-activedescendant', focusItem.attr('aria-labelledby'))
+
+ if(options.autocompleteOptions.source != false) {
+ $(this).autocomplete('close').autocomplete('disable');
+ }
+ }
+ event.preventDefault();
+ return false;
+ }
+ break;
+ default:
+ // ignore input if an item is focused
+ if (focusItem !== null) {
+ event.preventDefault();
+ event.bubble = false;
+ return false;
+ }
+ }
+ return true;
+ })
+ .keypress(function(event) {
+ var code = event.keyCode > 0? event.keyCode : event.which;
+ if($.inArray(code, options.breakKeyCodes) > -1) {
+ if($(this).val().length > 0 && $('ul.ui-autocomplete #ui-active-menuitem').length == 0) {
+ $(this).trigger('transformToTag');
+ }
+ event.preventDefault();
+ return false;
+ }
+ else if($(this).val().length > 0){
+ unfocusItem();
+ }
+ return true;
+ })
+ .bind('paste', function(e){
+ var that = $(this);
+ if (e.type == 'paste'){
+ setTimeout(function(){
+ that.trigger('transformToTag');
+ }, 1);
+ }
+ })
+ .blur(function() {
+ if($(this).val().length == 0) {
+ // disable the field to prevent sending with the form
+ $(this).attr('disabled', 'disabled').addClass('tagedit-input-disabled');
+ }
+ else {
+ // Delete entry after a timeout
+ var input = $(this);
+ $(this).data('blurtimer', window.setTimeout(function() {input.val('');}, 500));
+ }
+ unfocusItem();
+ // restore tabindex when widget looses focus
+ if (options.tabindex)
+ elements.attr('tabindex', options.tabindex);
+ })
+ .focus(function() {
+ window.clearTimeout($(this).data('blurtimer'));
+ // remove tabindex on <ul> because #tagedit-input now has it
+ elements.attr('tabindex', '-1');
+ });
+
+ if(options.autocompleteOptions.source != false) {
+ $(this).autocomplete(options.autocompleteOptions);
+ }
+ })
+ .end()
+ .click(function(event) {
+ switch(event.target.tagName) {
+ case 'A':
+ $(event.target).parent().fadeOut(options.animSpeed, function() {
+ $(event.target).parent().remove();
+ elements.find('#tagedit-input').focus();
+ });
+ break;
+ case 'INPUT':
+ case 'SPAN':
+ case 'LI':
+ if($(event.target).hasClass('tagedit-listelement-deleted') == false &&
+ $(event.target).parent('li').hasClass('tagedit-listelement-deleted') == false) {
+ // Don't edit an deleted Items
+ return doEdit(event);
+ }
+ default:
+ $(this).find('#tagedit-input')
+ .removeAttr('disabled')
+ .removeClass('tagedit-input-disabled')
+ .focus();
+ }
+ return false;
+ })
+ // forward focus event (on tabbing through the form)
+ .focus(function(e){ $(this).click(); })
+ }
+
+ /**
+ * Remove class and reference to currently focused tag item
+ */
+ function unfocusItem() {
+ if(focusItem){
+ if(options.autocompleteOptions.source != false) {
+ elements.find('#tagedit-input').autocomplete('enable');
+ }
+ focusItem.removeClass('tagedit-listelement-focus');
+ focusItem = null;
+ elements.find('#tagedit-input').removeAttr('aria-activedescendant');
+ }
+ }
+
+ /**
+ * Sets all Actions and events for editing an Existing Tag.
+ *
+ * @param event {object} The original Event that was given
+ * return {boolean}
+ */
+ function doEdit(event) {
+ if(options.allowEdit == false) {
+ // Do nothing
+ return;
+ }
+
+ var element = event.target.tagName == 'SPAN'? $(event.target).parent() : $(event.target);
+
+ var closeTimer = null;
+
+ // Event that is fired if the User finishes the edit of a tag
+ element.bind('finishEdit', function(event, doReset) {
+ window.clearTimeout(closeTimer);
+
+ var textfield = $(this).find(':text');
+ var isNewResult = isNew(textfield.val(), true);
+ if(textfield.val().length > 0 && (typeof doReset == 'undefined' || doReset === false) && (isNewResult[0] == true)) {
+ // This is a new Value and we do not want to do a reset. Set the new value
+ $(this).find(':hidden').val(textfield.val());
+ $(this).find('span').html(textfield.val());
+ }
+
+ textfield.remove();
+ $(this).find('a.tagedit-save, a.tagedit-break, a.tagedit-delete').remove(); // Workaround. This normaly has to be done by autogrow Plugin
+ $(this).removeClass('tagedit-listelement-edit').unbind('finishEdit');
+ return false;
+ });
+
+ var hidden = element.find(':hidden');
+ html = '<input type="text" name="tmpinput" autocomplete="off" value="'+hidden.val()+'" class="tagedit-edit-input" dir="'+options.direction+'"/>';
+ html += '<a class="tagedit-save" title="'+options.texts.saveEditLinkTitle+'">o</a>';
+ html += '<a class="tagedit-break" title="'+options.texts.breakEditLinkTitle+'">x</a>';
+
+ // If the Element is one from the Database, it can be deleted
+ if(options.allowDelete == true && element.find(':hidden').length > 0 &&
+ typeof element.find(':hidden').attr('name').match(baseNameRegexp)[3] != 'undefined') {
+ html += '<a class="tagedit-delete" title="'+options.texts.deleteLinkTitle+'">d</a>';
+ }
+
+ hidden.after(html);
+ element
+ .addClass('tagedit-listelement-edit')
+ .find('a.tagedit-save')
+ .click(function() {
+ $(this).parent().trigger('finishEdit');
+ return false;
+ })
+ .end()
+ .find('a.tagedit-break')
+ .click(function() {
+ $(this).parent().trigger('finishEdit', [true]);
+ return false;
+ })
+ .end()
+ .find('a.tagedit-delete')
+ .click(function() {
+ window.clearTimeout(closeTimer);
+ if(confirm(options.texts.deleteConfirmation)) {
+ var canDelete = checkToDelete($(this).parent());
+ if (!canDelete && confirm(options.texts.forceDeleteConfirmation)) {
+ markAsDeleted($(this).parent());
+ }
+
+ if(canDelete) {
+ markAsDeleted($(this).parent());
+ }
+
+ $(this).parent().find(':text').trigger('finishEdit', [true]);
+ }
+ else {
+ $(this).parent().find(':text').trigger('finishEdit', [true]);
+ }
+ return false;
+ })
+ .end()
+ .find(':text')
+ .focus()
+ .autoGrowInput({comfortZone: 10, minWidth: 15, maxWidth: 20000})
+ .keypress(function(event) {
+ switch(event.keyCode) {
+ case 13: // RETURN
+ event.preventDefault();
+ $(this).parent().trigger('finishEdit');
+ return false;
+ case 27: // ESC
+ event.preventDefault();
+ $(this).parent().trigger('finishEdit', [true]);
+ return false;
+ }
+ return true;
+ })
+ .blur(function() {
+ var that = $(this);
+ closeTimer = window.setTimeout(function() {that.parent().trigger('finishEdit', [true])}, 500);
+ });
+ }
+
+ /**
+ * Verifies if the tag select to be deleted is used by other records using an Ajax request.
+ *
+ * @param element
+ * @returns {boolean}
+ */
+ function checkToDelete(element) {
+ // if no URL is provide will not verify
+ if(options.checkToDeleteURL === null) {
+ return false;
+ }
+
+ var inputName = element.find('input:hidden').attr('name');
+ var idPattern = new RegExp('\\d');
+ var tagId = inputName.match(idPattern);
+ var checkResult = false;
+
+ $.ajax({
+ async : false,
+ url : options.checkToDeleteURL,
+ dataType: 'json',
+ type : 'POST',
+ data : { 'tagId' : tagId},
+ complete: function (XMLHttpRequest, textStatus) {
+
+ // Expected JSON Object: { "success": Boolean, "allowDelete": Boolean}
+ var result = $.parseJSON(XMLHttpRequest.responseText);
+ if(result.success === true){
+ checkResult = result.allowDelete;
+ }
+ }
+ });
+
+ return checkResult;
+ }
+
+ /**
+ * Marks a single Tag as deleted.
+ *
+ * @param element {object}
+ */
+ function markAsDeleted(element) {
+ element
+ .trigger('finishEdit', [true])
+ .addClass('tagedit-listelement-deleted')
+ .attr('title', options.deletedElementTitle);
+ element.find(':hidden').each(function() {
+ var nameEndRegexp = new RegExp('('+options.addedPostfix+'|'+options.deletedPostfix+')?\]');
+ var name = $(this).attr('name').replace(nameEndRegexp, options.deletedPostfix+']');
+ $(this).attr('name', name);
+ });
+
+ }
+
+ /**
+ * Checks if a tag is already choosen.
+ *
+ * @param value {string}
+ * @param checkAutocomplete {boolean} optional Check also the autocomplet values
+ * @returns {Array} First item is a boolean, telling if the item should be put to the list, second is optional the ID from autocomplete list
+ */
+ function isNew(value, checkAutocomplete) {
+ checkAutocomplete = typeof checkAutocomplete == 'undefined'? false : checkAutocomplete;
+ var autoCompleteId = null;
+
+ var compareValue = options.checkNewEntriesCaseSensitive == true? value : value.toLowerCase();
+
+ var isNew = true;
+ elements.find('li.tagedit-listelement-old input:hidden').each(function() {
+ var elementValue = options.checkNewEntriesCaseSensitive == true? $(this).val() : $(this).val().toLowerCase();
+ if(elementValue == compareValue) {
+ isNew = false;
+ }
+ });
+
+ if (isNew == true && checkAutocomplete == true && options.autocompleteOptions.source != false) {
+ var result = [];
+ if ($.isArray(options.autocompleteOptions.source)) {
+ result = options.autocompleteOptions.source;
+ }
+ else if ($.isFunction(options.autocompleteOptions.source)) {
+ options.autocompleteOptions.source({term: value}, function (data) {result = data});
+ }
+ else if (typeof options.autocompleteOptions.source === "string") {
+ // Check also autocomplete values
+ var autocompleteURL = options.autocompleteOptions.source;
+ if (autocompleteURL.match(/\?/)) {
+ autocompleteURL += '&';
+ } else {
+ autocompleteURL += '?';
+ }
+ autocompleteURL += 'term=' + value;
+ $.ajax({
+ async: false,
+ url: autocompleteURL,
+ dataType: 'json',
+ complete: function (XMLHttpRequest, textStatus) {
+ result = $.parseJSON(XMLHttpRequest.responseText);
+ }
+ });
+ }
+
+ // If there is an entry for that already in the autocomplete, don't use it (Check could be case sensitive or not)
+ for (var i = 0; i < result.length; i++) {
+ var resultValue = result[i].label? result[i].label : result[i];
+ var label = options.checkNewEntriesCaseSensitive == true? resultValue : resultValue.toLowerCase();
+ if (label == compareValue) {
+ isNew = false;
+ autoCompleteId = typeof result[i] == 'string' ? i : result[i].id;
+ break;
+ }
+ }
+ }
+
+ return new Array(isNew, autoCompleteId);
+ }
+ }
+})(jQuery);
+
+(function($){
+
+// jQuery autoGrowInput plugin by James Padolsey
+// See related thread: http://stackoverflow.com/questions/931207/is-there-a-jquery-autogrow-plugin-for-text-fields
+
+$.fn.autoGrowInput = function(o) {
+
+ o = $.extend({
+ maxWidth: 1000,
+ minWidth: 0,
+ comfortZone: 70
+ }, o);
+
+ this.filter('input:text').each(function(){
+
+ var minWidth = o.minWidth || $(this).width(),
+ val = '',
+ input = $(this),
+ testSubject = $('<tester/>').css({
+ position: 'absolute',
+ top: -9999,
+ left: -9999,
+ width: 'auto',
+ fontSize: input.css('fontSize'),
+ fontFamily: input.css('fontFamily'),
+ fontWeight: input.css('fontWeight'),
+ letterSpacing: input.css('letterSpacing'),
+ whiteSpace: 'nowrap'
+ }),
+ check = function() {
+
+ if (val === (val = input.val())) {return;}
+
+ // Enter new content into testSubject
+ var escaped = val.replace(/&/g, '&amp;').replace(/\s/g,'&nbsp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+ testSubject.html(escaped);
+
+ // Calculate new width + whether to change
+ var testerWidth = testSubject.width(),
+ newWidth = (testerWidth + o.comfortZone) >= minWidth ? testerWidth + o.comfortZone : minWidth,
+ currentWidth = input.width(),
+ isValidWidthChange = (newWidth < currentWidth && newWidth >= minWidth)
+ || (newWidth > minWidth && newWidth < o.maxWidth);
+
+ // Animate width
+ if (isValidWidthChange) {
+ input.width(newWidth);
+ }
+
+ };
+
+ testSubject.insertAfter(input);
+
+ $(this).bind('keyup keydown blur update', check);
+
+ check();
+ });
+
+ return this;
+
+};
+
+})(jQuery); \ No newline at end of file
diff --git a/plugins/jqueryui/themes/larry/jquery-ui-1.10.4.custom.css b/plugins/jqueryui/themes/larry/jquery-ui-1.10.4.custom.css
index 737f4771a..106e24305 100755
--- a/plugins/jqueryui/themes/larry/jquery-ui-1.10.4.custom.css
+++ b/plugins/jqueryui/themes/larry/jquery-ui-1.10.4.custom.css
@@ -1442,21 +1442,23 @@ body .ui-tooltip {
display: none;
}
.ie10 .ui-datepicker .ui-datepicker-title select,
-.webkit .ui-datepicker .ui-datepicker-title select,
-.mozilla .ui-datepicker .ui-datepicker-title select {
+.webkit .ui-datepicker .ui-datepicker-title select {
background-image: url("images/ui-icons-datepicker.png");
background-position: right -18px;
background-repeat: no-repeat;
- padding-right: 14px;
+ padding-right: 16px;
-webkit-appearance: none;
- -moz-appearance: none;
appearance: none;
}
-.mozilla .ui-datepicker .ui-datepicker-title select {
- background-position: right -17px;
- text-indent: 0.01px;
- text-overflow: '';
- padding-right: 0;
+
+@supports (-moz-appearance:none) and (mask-type:alpha) {
+ .mozilla .ui-datepicker .ui-datepicker-title select {
+ background-image: url("images/ui-icons-datepicker.png");
+ background-position: right -14px;
+ background-repeat: no-repeat;
+ padding-right: 16px;
+ -moz-appearance: none;
+ }
}
.ui-datepicker .ui-datepicker-month:focus,
.ui-datepicker .ui-datepicker-year:focus {
diff --git a/plugins/jqueryui/themes/larry/jquery-ui-css.diff b/plugins/jqueryui/themes/larry/jquery-ui-css.diff
index cce990679..e3971ecdb 100644
--- a/plugins/jqueryui/themes/larry/jquery-ui-css.diff
+++ b/plugins/jqueryui/themes/larry/jquery-ui-css.diff
@@ -538,10 +538,10 @@
+ appearance: none;
+}
+.mozilla .ui-datepicker .ui-datepicker-title select {
-+ background-position: right -17px;
++ background-position: right -14px;
+ text-indent: 0.01px;
+ text-overflow: '';
-+ padding-right: 0;
++ padding-right: 10px;
+}
+.ui-datepicker .ui-datepicker-month:focus,
+.ui-datepicker .ui-datepicker-year:focus {
diff --git a/plugins/jqueryui/themes/larry/tagedit.css b/plugins/jqueryui/themes/larry/tagedit.css
new file mode 100644
index 000000000..600481c61
--- /dev/null
+++ b/plugins/jqueryui/themes/larry/tagedit.css
@@ -0,0 +1,122 @@
+/**
+ * Styles of the tagedit inputsforms
+ */
+.tagedit-list {
+ width: 100%;
+ margin: 0;
+ padding: 4px 4px 0 5px;
+ overflow: auto;
+ min-height: 26px;
+ background: #fff;
+ border: 1px solid #b2b2b2;
+ border-radius: 4px;
+ box-shadow: inset 0 0 2px 1px rgba(0,0,0, 0.1);
+ -moz-box-shadow: inset 0 0 2px 1px rgba(0,0,0, 0.1);
+ -webkit-box-shadow: inset 0 0 2px 1px rgba(0,0,0, 0.1);
+ -o-box-shadow: inset 0 0 2px 1px rgba(0,0,0, 0.1);
+}
+.tagedit-list li.tagedit-listelement {
+ list-style-type: none;
+ float: left;
+ margin: 0 4px 4px 0;
+ padding: 0;
+}
+
+/* New Item input */
+.tagedit-list li.tagedit-listelement-new input {
+ border: 0;
+ height: 100%;
+ padding: 4px 1px;
+ width: 15px;
+ background: #fff;
+ border-radius: 0;
+ box-shadow: none;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -o-box-shadow: none;
+}
+.tagedit-list li.tagedit-listelement-new input:focus {
+ box-shadow: none;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -o-box-shadow: none;
+ outline: none;
+}
+.tagedit-list li.tagedit-listelement-new input.tagedit-input-disabled {
+ display: none;
+}
+
+/* Item that is put to the List */
+.tagedit span.tag-element,
+.tagedit-list li.tagedit-listelement-old {
+ padding: 3px 6px 1px 6px;
+ background: #ddeef5;
+ background: -moz-linear-gradient(top, #edf6fa 0%, #d6e9f3 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#edf6fa), color-stop(100%,#d6e9f3));
+ background: -o-linear-gradient(top, #edf6fa 0%, #d6e9f3 100%);
+ background: -ms-linear-gradient(top, #edf6fa 0%, #d6e9f3 100%);
+ background: linear-gradient(top, #edf6fa 0%, #d6e9f3 100%);
+ border: 1px solid #c2dae5;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ color: #0d5165;
+ line-height: 1.3em;
+}
+
+.tagedit-list li.tagedit-listelement-focus {
+ border-color: #4787b1;
+ -moz-box-shadow: 0 0 3px 1px rgba(71,135,177, 0.8);
+ -webkit-box-shadow: 0 0 3px 1px rgba(71,135,177, 0.8);
+ -o-box-shadow: 0 0 3px 1px rgba(71,135,177, 0.8);
+ box-shadow: 0 0 3px 1px rgba(71,135,177, 0.8);
+}
+
+.tagedit span.tag-element {
+ margin-right: 0.6em;
+ padding: 2px 6px;
+/* cursor: pointer; */
+}
+
+.tagedit span.tag-element.inherit {
+ color: #666;
+ background: #f2f2f2;
+ border-color: #ddd;
+}
+
+.tagedit-list li.tagedit-listelement-old a.tagedit-close,
+.tagedit-list li.tagedit-listelement-old a.tagedit-break,
+.tagedit-list li.tagedit-listelement-old a.tagedit-delete,
+.tagedit-list li.tagedit-listelement-old a.tagedit-save {
+ text-indent: -2000px;
+ display: inline-block;
+ position: relative;
+ top: -1px;
+ width: 16px;
+ height: 16px;
+ margin: 0 -4px 0 6px;
+ background: url('data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAOCAYAAAD0f5bSAAAAgUlEQVQoz2NgQAKzdxwWAOIEIG5AwiC+AAM2AJQIAOL3QPwfCwaJB6BrSMChGB0nwDQYwATP3nn4f+Ge4ygKQXyQOJKYAUjTepjAm09fwBimEUTDxJA0rWdANxWmaMXB0xiGwDADurthGkEAmwbqaCLFeWQFBOlBTlbkkp2MSE2wAA8R50rWvqeRAAAAAElFTkSuQmCC') left 1px no-repeat;
+ cursor: pointer;
+}
+
+.tagedit-list li.tagedit-listelement-old span {
+ display: inline-block;
+ height: 15px;
+}
+
+/** Special hacks for IE7 **/
+
+html.ie7 .tagedit span.tag-element,
+html.ie7 .tagedit-list li.tagedit-listelement-old {
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#edf6fa', endColorstr='#d6e9f3', GradientType=0);
+}
+
+html.ie7 .tagedit-list li.tagedit-listelement span {
+ position: relative;
+ top: -3px;
+}
+
+html.ie7 .tagedit-list li.tagedit-listelement-old a.tagedit-close {
+ left: 5px;
+}
+
diff --git a/plugins/managesieve/Changelog b/plugins/managesieve/Changelog
index 3ac7741ad..8ce63c811 100644
--- a/plugins/managesieve/Changelog
+++ b/plugins/managesieve/Changelog
@@ -1,3 +1,12 @@
+- Fix PHP fatal error when visiting Vacation interface and there's no sieve script yet
+
+* version 8.2 [2015-01-14]
+-----------------------------------------------------------
+- Fix bug where actions without if/elseif/else in sieve scripts were skipped
+- Support "not allof" test as a negation of all sub-tests
+- Fix bug where vacation rule was saved to wrong script if managesieve_kolab_master=true
+- Improve procedure of script selection to write a vacation rule
+
* version 8.1 [2014-12-09]
-----------------------------------------------------------
- Added simple API to manage vacation rule
diff --git a/plugins/managesieve/composer.json b/plugins/managesieve/composer.json
index d8c8af4fe..6d640da08 100644
--- a/plugins/managesieve/composer.json
+++ b/plugins/managesieve/composer.json
@@ -3,7 +3,7 @@
"type": "roundcube-plugin",
"description": "Adds a possibility to manage Sieve scripts (incoming mail filters). It's clickable interface which operates on text scripts and communicates with server using managesieve protocol. Adds Filters tab in Settings.",
"license": "GPLv3+",
- "version": "8.1",
+ "version": "8.2",
"authors": [
{
"name": "Aleksander Machniak",
diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
index 25016c878..69ae4b8a6 100644
--- a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
+++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php
@@ -63,7 +63,7 @@ class rcube_sieve_engine
1 => 'notifyimportancehigh'
);
- const VERSION = '8.1';
+ const VERSION = '8.2';
const PROGNAME = 'Roundcube (Managesieve)';
const PORT = 4190;
@@ -220,14 +220,14 @@ class rcube_sieve_engine
*
* @return int Connection status: 0 on success, >0 on failure
*/
- public function load_script($script_name = null)
+ protected function load_script($script_name = null)
{
// Get list of scripts
$list = $this->list_scripts();
if ($script_name === null || $script_name === '') {
// get (first) active script
- if (!empty($this->active[0])) {
+ if (!empty($this->active)) {
$script_name = $this->active[0];
}
else if ($list) {
@@ -1270,8 +1270,11 @@ class rcube_sieve_engine
$out .= $hiddenfields->show();
// 'any' flag
- if (sizeof($scr['tests']) == 1 && $scr['tests'][0]['test'] == 'true' && !$scr['tests'][0]['not'])
+ if ((!isset($this->form) && empty($scr['tests']) && !empty($scr))
+ || (sizeof($scr['tests']) == 1 && $scr['tests'][0]['test'] == 'true' && !$scr['tests'][0]['not'])
+ ) {
$any = true;
+ }
// filter name input
$field_id = '_name';
@@ -1332,7 +1335,7 @@ class rcube_sieve_engine
$out .= sprintf("%s<label for=\"%s\">%s</label>\n",
$input_join, $field_id, rcube::Q($this->plugin->gettext('filterany')));
- $rows_num = isset($scr) ? sizeof($scr['tests']) : 1;
+ $rows_num = !empty($scr['tests']) ? sizeof($scr['tests']) : 1;
$out .= '<div id="rules"'.($any ? ' style="display: none"' : '').'>';
for ($x=0; $x<$rows_num; $x++)
@@ -1463,31 +1466,26 @@ class rcube_sieve_engine
$select_op->add(rcube::Q($this->plugin->gettext('valuenotequals')), 'value-ne');
}
+ $test = self::rule_test($rule);
+ $target = '';
+
// target(s) input
if (in_array($rule['test'], array('header', 'address', 'envelope'))) {
- $test = ($rule['not'] ? 'not' : '').($rule['type'] ? $rule['type'] : 'is');
$target = $rule['arg2'];
}
else if (in_array($rule['test'], array('body', 'date', 'currentdate'))) {
- $test = ($rule['not'] ? 'not' : '').($rule['type'] ? $rule['type'] : 'is');
$target = $rule['arg'];
}
else if ($rule['test'] == 'size') {
- $test = '';
- $target = '';
if (preg_match('/^([0-9]+)(K|M|G)?$/', $rule['arg'], $matches)) {
$sizetarget = $matches[1];
- $sizeitem = $matches[2];
+ $sizeitem = $matches[2];
}
else {
$sizetarget = $rule['arg'];
- $sizeitem = $rule['item'];
+ $sizeitem = $rule['item'];
}
}
- else {
- $test = ($rule['not'] ? 'not' : '').$rule['test'];
- $target = '';
- }
// (current)date part select
if (in_array('date', $this->exts) || in_array('currentdate', $this->exts)) {
@@ -1637,6 +1635,43 @@ class rcube_sieve_engine
return $out;
}
+ private static function rule_test(&$rule)
+ {
+ // first modify value/count tests with 'not' keyword
+ // we'll revert the meaning of operators
+ if ($rule['not'] && preg_match('/^(count|value)-([gteqnl]{2})/', $rule['type'], $m)) {
+ $rule['not'] = false;
+
+ switch ($m[2]) {
+ case 'gt': $rule['type'] = $m[1] . '-le'; break;
+ case 'ge': $rule['type'] = $m[1] . '-lt'; break;
+ case 'lt': $rule['type'] = $m[1] . '-ge'; break;
+ case 'le': $rule['type'] = $m[1] . '-gt'; break;
+ case 'eq': $rule['type'] = $m[1] . '-ne'; break;
+ case 'ne': $rule['type'] = $m[1] . '-eq'; break;
+ }
+ }
+ else if ($rule['not'] && $rule['test'] == 'size') {
+ $rule['not'] = false;
+ $rule['type'] = $rule['type'] == 'over' ? 'under' : 'over';
+ }
+
+ $set = array('header', 'address', 'envelope', 'body', 'date', 'currentdate');
+
+ // build test string supported by select element
+ if ($rule['size']) {
+ $test = $rule['type'];
+ }
+ else if (in_array($rule['test'], $set)) {
+ $test = ($rule['not'] ? 'not' : '') . ($rule['type'] ? $rule['type'] : 'is');
+ }
+ else {
+ $test = ($rule['not'] ? 'not' : '') . $rule['test'];
+ }
+
+ return $test;
+ }
+
function action_div($fid, $id, $div=true)
{
$action = isset($this->form) ? $this->form['actions'][$id] : $this->script[$fid]['actions'][$id];
@@ -2043,7 +2078,6 @@ class rcube_sieve_engine
// Handle active script(s) and list of scripts according to Kolab's KEP:14
if ($this->rc->config->get('managesieve_kolab_master')) {
-
// Skip protected names
foreach ((array)$this->list as $idx => $name) {
$_name = strtoupper($name);
@@ -2071,7 +2105,10 @@ class rcube_sieve_engine
foreach ($rules['actions'] as $action) {
if ($action['type'] == 'include' && empty($action['global'])) {
$name = preg_replace($filename_regex, '', $action['target']);
- $this->active[] = $name;
+ // make sure the script exist
+ if (in_array($name, $this->list)) {
+ $this->active[] = $name;
+ }
}
}
}
@@ -2105,6 +2142,11 @@ class rcube_sieve_engine
}
}
+ // reindex
+ if (!empty($this->list)) {
+ $this->list = array_values($this->list);
+ }
+
return $this->list;
}
@@ -2282,7 +2324,7 @@ class rcube_sieve_engine
$i = 1;
foreach ($this->script as $idx => $filter) {
- if ($filter['type'] != 'if') {
+ if (empty($filter['actions'])) {
continue;
}
$fname = $filter['name'] ? $filter['name'] : "#$i";
@@ -2302,12 +2344,12 @@ class rcube_sieve_engine
*/
protected function init_script()
{
- $this->script = $this->sieve->script->as_array();
-
- if (!$this->script) {
+ if (!$this->sieve->script) {
return;
}
+ $this->script = $this->sieve->script->as_array();
+
$headers = array();
$exceptions = array('date', 'currentdate', 'size', 'body');
diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
index bc62d2ff4..518d79d35 100644
--- a/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
+++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_script.php
@@ -622,6 +622,7 @@ class rcube_sieve_script
$disabled = false;
$join = false;
+ $join_not = false;
// disabled rule (false + comment): if false # .....
if (preg_match('/^\s*false\s+#/i', $content)) {
@@ -650,15 +651,22 @@ class rcube_sieve_script
$not = false;
}
+ // we support "not allof" as a negation of allof sub-tests
+ if ($join_not) {
+ $not = !$not;
+ }
+
switch ($token) {
case 'allof':
- $join = true;
+ $join = true;
+ $join_not = $not;
break;
+
case 'anyof':
break;
case 'size':
- $test = array('test' => 'size', 'not' => $not);
+ $test = array('test' => 'size', 'not' => $not);
$test['arg'] = array_pop($tokens);
@@ -740,16 +748,16 @@ class rcube_sieve_script
break;
case 'exists':
- $tests[] = array('test' => 'exists', 'not' => $not,
+ $tests[] = array('test' => 'exists', 'not' => $not,
'arg' => array_pop($tokens));
break;
case 'true':
- $tests[] = array('test' => 'true', 'not' => $not);
+ $tests[] = array('test' => 'true', 'not' => $not);
break;
case 'false':
- $tests[] = array('test' => 'true', 'not' => !$not);
+ $tests[] = array('test' => 'true', 'not' => !$not);
break;
}
diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php
index 10aaea0e9..8d865008f 100644
--- a/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php
+++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php
@@ -24,6 +24,8 @@
class rcube_sieve_vacation extends rcube_sieve_engine
{
protected $error;
+ protected $script_name;
+ protected $vacation = array();
function actions()
{
@@ -34,6 +36,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$this->vacation_rule();
$this->vacation_post();
}
+
$this->plugin->add_label('vacation.saving');
$this->rc->output->add_handlers(array(
'vacationform' => array($this, 'vacation_form'),
@@ -43,15 +46,90 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$this->rc->output->send('managesieve.vacation');
}
- private function vacation_rule()
+ /**
+ * Find and load sieve script with/for vacation rule
+ *
+ * @return int Connection status: 0 on success, >0 on failure
+ */
+ protected function load_script()
{
- $this->vacation = array();
+ if ($this->script_name !== null) {
+ return 0;
+ }
+
+ $list = $this->list_scripts();
+ $master = $this->rc->config->get('managesieve_kolab_master');
+ $included = array();
+
+ $this->script_name = false;
+
+ // first try the active script(s)...
+ if (!empty($this->active)) {
+ // Note: there can be more than one active script on KEP:14-enabled server
+ foreach ($this->active as $script) {
+ if ($this->sieve->load($script)) {
+ foreach ($this->sieve->script->as_array() as $rule) {
+ if (!empty($rule['actions'])) {
+ if ($rule['actions'][0]['type'] == 'vacation') {
+ $this->script_name = $script;
+ return 0;
+ }
+ else if (empty($master) && $rule['actions'][0]['type'] == 'include') {
+ $included[] = $rule['actions'][0]['target'];
+ }
+ }
+ }
+ }
+ }
+
+ // ...else try scripts included in active script (not for KEP:14)
+ foreach ($included as $script) {
+ if ($this->sieve->load($script)) {
+ foreach ($this->sieve->script->as_array() as $rule) {
+ if (!empty($rule['actions']) && $rule['actions'][0]['type'] == 'vacation') {
+ $this->script_name = $script;
+ return 0;
+ }
+ }
+ }
+ }
+ }
+
+ // try all other scripts
+ if (!empty($list)) {
+ // else try included scripts
+ foreach (array_diff($list, $included, $this->active) as $script) {
+ if ($this->sieve->load($script)) {
+ foreach ($this->sieve->script->as_array() as $rule) {
+ if (!empty($rule['actions']) && $rule['actions'][0]['type'] == 'vacation') {
+ $this->script_name = $script;
+ return 0;
+ }
+ }
+ }
+ }
+
+ // none of the scripts contains existing vacation rule
+ // use any (first) active or just existing script (in that order)
+ if (!empty($this->active)) {
+ $this->sieve->load($this->script_name = $this->active[0]);
+ }
+ else {
+ $this->sieve->load($this->script_name = $list[0]);
+ }
+ }
- if (empty($this->active)) {
+ return $this->sieve->error();
+ }
+
+ private function vacation_rule()
+ {
+ if ($this->script_name === false || $this->script_name === null || !$this->sieve->load($this->script_name)) {
return;
}
- $list = array();
+ $list = array();
+ $active = in_array($this->script_name, $this->active);
// find (first) vacation rule
foreach ($this->script as $idx => $rule) {
@@ -68,14 +146,14 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$this->vacation = array_merge($rule['actions'][0], array(
'idx' => $idx,
- 'disabled' => $rule['disabled'],
+ 'disabled' => $rule['disabled'] || !$active,
'name' => $rule['name'],
'tests' => $rule['tests'],
'action' => $action ?: 'keep',
'target' => $target,
));
}
- else {
+ else if ($active) {
$list[$idx] = $rule['name'];
}
}
@@ -202,8 +280,6 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$vacation_tests = $this->rc->config->get('managesieve_vacation_test', array(array('test' => 'true')));
}
- // @TODO: handle situation when there's no active script
-
if (!$error) {
$rule = $this->vacation;
$rule['type'] = 'if';
@@ -212,6 +288,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$rule['tests'] = $vacation_tests;
$rule['join'] = $date_extension ? count($vacation_tests) > 1 : false;
$rule['actions'] = array($vacation_action);
+ $rule['after'] = $after;
if ($action && $action != 'keep') {
$rule['actions'][] = array(
@@ -221,40 +298,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
);
}
- // reset original vacation rule
- if (isset($this->vacation['idx'])) {
- $this->script[$this->vacation['idx']] = null;
- }
-
- // re-order rules if needed
- if (isset($after) && $after !== '') {
- // add at target position
- if ($after >= count($this->script) - 1) {
- $this->script[] = $rule;
- }
- else {
- $script = array();
-
- foreach ($this->script as $idx => $r) {
- if ($r) {
- $script[] = $r;
- }
-
- if ($idx == $after) {
- $script[] = $rule;
- }
- }
-
- $this->script = $script;
- }
- }
- else {
- array_unshift($this->script, $rule);
- }
-
- $this->sieve->script->content = array_values(array_filter($this->script));
-
- if ($this->save_script()) {
+ if ($this->save_vacation_script($rule)) {
$this->rc->output->show_message('managesieve.vacationsaved', 'confirmation');
$this->rc->output->send();
}
@@ -507,6 +551,99 @@ class rcube_sieve_vacation extends rcube_sieve_engine
}
/**
+ * Saves vacation script (adding some variables)
+ */
+ protected function save_vacation_script($rule)
+ {
+ // if script does not exist create a new one
+ if ($this->script_name === null || $this->script_name === false) {
+ $this->script_name = $this->rc->config->get('managesieve_script_name');
+ if (empty($this->script_name)) {
+ $this->script_name = 'roundcube';
+ }
+
+ // use default script contents
+ if (!$this->rc->config->get('managesieve_kolab_master')) {
+ $script_file = $this->rc->config->get('managesieve_default');
+ if ($script_file && is_readable($script_file)) {
+ $content = file_get_contents($script_file);
+ }
+ }
+
+ // create and load script
+ if ($this->sieve->save_script($this->script_name, $content)) {
+ $this->sieve->load($this->script_name);
+ }
+ }
+
+ $script_active = in_array($this->script_name, $this->active);
+
+ // re-order rules if needed
+ if (isset($rule['after']) && $rule['after'] !== '') {
+ // reset original vacation rule
+ if (isset($this->vacation['idx'])) {
+ $this->script[$this->vacation['idx']] = null;
+ }
+
+ // add at target position
+ if ($rule['after'] >= count($this->script) - 1) {
+ $this->script[] = $rule;
+ }
+ else {
+ $script = array();
+
+ foreach ($this->script as $idx => $r) {
+ if ($r) {
+ $script[] = $r;
+ }
+
+ if ($idx == $rule['after']) {
+ $script[] = $rule;
+ }
+ }
+
+ $this->script = $script;
+ }
+
+ $this->script = array_values(array_filter($this->script));
+ }
+ // update original vacation rule if it exists
+ else if (isset($this->vacation['idx'])) {
+ $this->script[$this->vacation['idx']] = $rule;
+ }
+ // otherwise put vacation rule on top
+ else {
+ array_unshift($this->script, $rule);
+ }
+
+ // if the script was not active, we need to de-activate
+ // all rules except the vacation rule, but only if it is not disabled
+ if (!$script_active && !$rule['disabled']) {
+ foreach ($this->script as $idx => $r) {
+ if (empty($r['actions']) || $r['actions'][0]['type'] != 'vacation') {
+ $this->script[$idx]['disabled'] = true;
+ }
+ }
+ }
+
+ if (!$this->sieve->script) {
+ return false;
+ }
+
+ $this->sieve->script->content = $this->script;
+
+ // save the script
+ $saved = $this->save_script($this->script_name);
+
+ // activate the script
+ if ($saved && !$script_active && !$rule['disabled']) {
+ $this->activate_script($this->script_name);
+ }
+
+ return $saved;
+ }
+
+ /**
* API: get vacation rule
*
* @return array Vacation rule information
@@ -684,8 +821,6 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$vacation_tests = $this->rc->config->get('managesieve_vacation_test', array(array('test' => 'true')));
}
- // @TODO: handle situation when there's no active script
-
$rule = $this->vacation;
$rule['type'] = 'if';
$rule['name'] = $rule['name'] ?: 'Out-of-Office';
@@ -702,16 +837,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
);
}
- // reset original vacation rule
- if (isset($this->vacation['idx'])) {
- $this->script[$this->vacation['idx']] = null;
- }
-
- array_unshift($this->script, $rule);
-
- $this->sieve->script->content = array_values(array_filter($this->script));
-
- return $this->save_script();
+ return $this->save_vacation_script($rule);
}
/**
diff --git a/plugins/managesieve/localization/cs_CZ.inc b/plugins/managesieve/localization/cs_CZ.inc
index 6db6bac91..21e8a6910 100644
--- a/plugins/managesieve/localization/cs_CZ.inc
+++ b/plugins/managesieve/localization/cs_CZ.inc
@@ -23,7 +23,7 @@ $labels['filteradd'] = 'Přidej filtr';
$labels['filterdel'] = 'Smaž filtr';
$labels['moveup'] = 'Posunout nahoru';
$labels['movedown'] = 'Posunout dolů';
-$labels['filterallof'] = 'Odpovídají všechny pravidla';
+$labels['filterallof'] = 'Odpovídají všechna pravidla';
$labels['filteranyof'] = 'Odpovídá kterékoliv pravidlo';
$labels['filterany'] = 'Všechny zprávy';
$labels['filtercontains'] = 'obsahuje';
diff --git a/plugins/managesieve/localization/es_ES.inc b/plugins/managesieve/localization/es_ES.inc
index 62f357bae..2b319daf6 100644
--- a/plugins/managesieve/localization/es_ES.inc
+++ b/plugins/managesieve/localization/es_ES.inc
@@ -19,12 +19,12 @@ $labels['filters'] = 'Filtros';
$labels['managefilters'] = 'Administrar filtros de correo entrante';
$labels['filtername'] = 'Nombre del filtro';
$labels['newfilter'] = 'Nuevo filtro';
-$labels['filteradd'] = 'Agregar filtro';
+$labels['filteradd'] = 'Añadir filtro';
$labels['filterdel'] = 'Eliminar filtro';
$labels['moveup'] = 'Mover arriba';
$labels['movedown'] = 'Mover abajo';
-$labels['filterallof'] = 'coincidir con todas las reglas siguientes';
-$labels['filteranyof'] = 'coincidir con alguna de las reglas siguientes';
+$labels['filterallof'] = 'que coincida con todas las reglas siguientes';
+$labels['filteranyof'] = 'que coincida con cualquiera de las reglas siguientes';
$labels['filterany'] = 'todos los mensajes';
$labels['filtercontains'] = 'contiene';
$labels['filternotcontains'] = 'no contiene';
@@ -38,7 +38,7 @@ $labels['filterregex'] = 'coincide con la expresión regular';
$labels['filternotregex'] = 'no coincide con la expresión regular';
$labels['filterunder'] = 'bajo';
$labels['filterover'] = 'sobre';
-$labels['addrule'] = 'Agregar regla';
+$labels['addrule'] = 'Añadir regla';
$labels['delrule'] = 'Eliminar regla';
$labels['messagemoveto'] = 'Mover mensaje a';
$labels['messageredirect'] = 'Redirigir mensaje a';
@@ -50,7 +50,7 @@ $labels['messagediscard'] = 'Descartar con un mensaje';
$labels['messagekeep'] = 'Mantener el mensaje en la bandeja de entrada';
$labels['messagesrules'] = 'Para el correo entrante:';
$labels['messagesactions'] = '... ejecutar las siguientes acciones:';
-$labels['add'] = 'Agregar';
+$labels['add'] = 'Añadir';
$labels['del'] = 'Eliminar';
$labels['sender'] = 'Remitente';
$labels['recipient'] = 'Destinatario';
@@ -58,7 +58,7 @@ $labels['vacationaddr'] = 'Mis direcciones adicionales de correo electrónico:';
$labels['vacationdays'] = 'Cada cuánto enviar mensajes (en días):';
$labels['vacationinterval'] = 'Cada cuánto enviar mensajes:';
$labels['vacationreason'] = 'Cuerpo del mensaje (razón de vacaciones):';
-$labels['vacationsubject'] = 'Asunto del Mensaje:';
+$labels['vacationsubject'] = 'Asunto del mensaje:';
$labels['days'] = 'días';
$labels['seconds'] = 'segundos';
$labels['rulestop'] = 'Parar de evaluar reglas';
@@ -76,7 +76,7 @@ $labels['active'] = 'activo';
$labels['none'] = 'ninguno';
$labels['fromset'] = 'de conjunto';
$labels['fromfile'] = 'de archivo';
-$labels['filterdisabled'] = 'Filtro desactivado';
+$labels['filterdisabled'] = 'Filtro deshabilitado';
$labels['countisgreaterthan'] = 'contiene más que';
$labels['countisgreaterthanequal'] = 'contiene más o igual que';
$labels['countislessthan'] = 'contiene menos que';
@@ -91,7 +91,7 @@ $labels['valueequals'] = 'el valor es igual que';
$labels['valuenotequals'] = 'el valor no es igual a';
$labels['setflags'] = 'Etiquetar el mensaje';
$labels['addflags'] = 'Agregar etiquetas al mensaje';
-$labels['removeflags'] = 'Eliminar etiquetas al mensaje';
+$labels['removeflags'] = 'Eliminar etiquetas del mensaje';
$labels['flagread'] = 'Leído';
$labels['flagdeleted'] = 'Eliminado';
$labels['flaganswered'] = 'Respondido';
@@ -103,8 +103,8 @@ $labels['setvarvalue'] = 'Valor de la variable:';
$labels['setvarmodifiers'] = 'Modificadores';
$labels['varlower'] = 'minúsculas';
$labels['varupper'] = 'mayúsculas';
-$labels['varlowerfirst'] = 'inicial en minúsculas';
-$labels['varupperfirst'] = 'inicial en mayúsculas';
+$labels['varlowerfirst'] = 'primer caracter en minúsculas';
+$labels['varupperfirst'] = 'primer caracter en mayúsculas';
$labels['varquotewildcard'] = 'entrecomillar caracteres especiales';
$labels['varlength'] = 'longitud';
$labels['notify'] = 'Enviar notificación';
@@ -119,7 +119,7 @@ $labels['notifyimportancehigh'] = 'alta';
$labels['notifymethodmailto'] = 'Correo electrónico';
$labels['notifymethodtel'] = 'Teléfono';
$labels['notifymethodsms'] = 'SMS';
-$labels['filtercreate'] = 'Crear Filtro';
+$labels['filtercreate'] = 'Crear filtro';
$labels['usedata'] = 'Usar los siguientes datos en el filtro:';
$labels['nextstep'] = 'Siguiente paso';
$labels['...'] = '...';
@@ -187,38 +187,38 @@ $labels['ariasummaryfiltersetslist'] = 'Lista de paquetes de filtros';
$labels['filterstitle'] = 'Editar filtros de mensajes entrantes';
$labels['vacationtitle'] = 'Editar la regla fuera-de-la-oficina';
$messages['filterunknownerror'] = 'Error desconocido en el servidor.';
-$messages['filterconnerror'] = 'No se ha podido conectar con el servidor managesieve.';
-$messages['filterdeleteerror'] = 'No se ha podido borrar el filtro. Ha ocurrido un error en el servidor.';
-$messages['filterdeleted'] = 'Filtro borrado satisfactoriamente.';
-$messages['filtersaved'] = 'Filtro guardado satisfactoriamente.';
-$messages['filtersaveerror'] = 'No se ha podido guardar el filtro. Ha ocurrido un error en el servidor.';
+$messages['filterconnerror'] = 'No se pudo conectar con el servidor managesieve.';
+$messages['filterdeleteerror'] = 'No se pudo borrar el filtro. Ha ocurrido un error en el servidor.';
+$messages['filterdeleted'] = 'Filtro borrado correctamente.';
+$messages['filtersaved'] = 'Filtro guardado correctamente.';
+$messages['filtersaveerror'] = 'No se pudo guardar el filtro. Ha ocurrido un error en el servidor.';
$messages['filterdeleteconfirm'] = '¿Realmente desea borrar el filtro seleccionado?';
$messages['ruledeleteconfirm'] = '¿Está seguro de que desea borrar la regla seleccionada?';
$messages['actiondeleteconfirm'] = '¿Está seguro de que desea borrar la acción seleccionada?';
$messages['forbiddenchars'] = 'Caracteres prohibidos en el campo.';
$messages['cannotbeempty'] = 'El campo no puede estar vacío.';
$messages['ruleexist'] = 'Ya existe un filtro con el nombre especificado.';
-$messages['setactivateerror'] = 'No se ha podido activar el conjunto de filtros seleccionado. Ha ocurrido un error en el servidor.';
-$messages['setdeactivateerror'] = 'No se ha podido desactivar el conjunto de filtros seleccionado. Ha ocurrido un error en el servidor.';
-$messages['setdeleteerror'] = 'No se ha podido borrar el conjunto de filtros seleccionado. Ha ocurrido un error en el servidor.';
-$messages['setactivated'] = 'Conjunto de filtros activado satisfactoriamente.';
-$messages['setdeactivated'] = 'Conjunto de filtros desactivado satisfactoriamente.';
-$messages['setdeleted'] = 'Conjunto de filtros borrado satisfactoriamente.';
+$messages['setactivateerror'] = 'No se pudo activar el conjunto de filtros seleccionado. Ha ocurrido un error en el servidor.';
+$messages['setdeactivateerror'] = 'No se pudo desactivar el conjunto de filtros seleccionado. Ha ocurrido un error en el servidor.';
+$messages['setdeleteerror'] = 'No se pudo borrar el conjunto de filtros seleccionado. Ha ocurrido un error en el servidor.';
+$messages['setactivated'] = 'Conjunto de filtros activado correctamente.';
+$messages['setdeactivated'] = 'Conjunto de filtros desactivado correctamente.';
+$messages['setdeleted'] = 'Conjunto de filtros borrado correctamente.';
$messages['setdeleteconfirm'] = '¿Está seguro de que desea borrar el conjunto de filtros seleccionado?';
$messages['setcreateerror'] = 'No se ha podido crear el conjunto de filtros. Ha ocurrido un error en el servidor.';
-$messages['setcreated'] = 'Conjunto de filtros creado satisfactoriamente.';
-$messages['activateerror'] = 'No se han podido habilitar los filtros seleccionados. Ha ocurrido un error en el servidor.';
-$messages['deactivateerror'] = 'No se han podido deshabilitar los filtros seleccionados. Ha ocurrido un error en el servidor.';
+$messages['setcreated'] = 'Conjunto de filtros creado correctamente.';
+$messages['activateerror'] = 'No se pudo habilitar filtro(s) seleccionado(s). Ha ocurrido un error en el servidor.';
+$messages['deactivateerror'] = 'No se pudo deshabilitar filtro(s) seleccionado(s). Ha ocurrido un error en el servidor.';
$messages['deactivated'] = 'Filtro(s) deshabilitado(s) correctamente.';
$messages['activated'] = 'Filtro(s) habilitado(s) correctamente.';
$messages['moved'] = 'Filtro movido correctamente.';
-$messages['moveerror'] = 'No se ha podido mover el filtro seleccionado. Ha ocurrido un error en el servidor.';
+$messages['moveerror'] = 'No se pudo mover el filtro seleccionado. Ha ocurrido un error en el servidor.';
$messages['nametoolong'] = 'Nombre demasiado largo.';
$messages['namereserved'] = 'Nombre reservado.';
$messages['setexist'] = 'El conjunto ya existe.';
$messages['nodata'] = '¡Al menos una posición debe ser seleccionada!';
$messages['invaliddateformat'] = 'Fecha o formato de parte de la fecha no válido';
-$messages['saveerror'] = 'No fue posible guardar los datos. Ha ocurrido un error en el servidor.';
+$messages['saveerror'] = 'No se pudo guardar los datos. Ha ocurrido un error en el servidor.';
$messages['vacationsaved'] = 'Datos de vacaciones guardados correctamente.';
$messages['emptyvacationbody'] = '¡Hace falta un texto en el mensaje de vacaciones!';
?>
diff --git a/plugins/managesieve/localization/fr_FR.inc b/plugins/managesieve/localization/fr_FR.inc
index 6377d12bd..a0a38b089 100644
--- a/plugins/managesieve/localization/fr_FR.inc
+++ b/plugins/managesieve/localization/fr_FR.inc
@@ -25,7 +25,7 @@ $labels['moveup'] = 'Monter';
$labels['movedown'] = 'Descendre';
$labels['filterallof'] = 'correspondant à toutes les règles suivantes';
$labels['filteranyof'] = 'valident au moins une des conditions suivantes';
-$labels['filterany'] = 'tous les messages';
+$labels['filterany'] = 'tous les courriels';
$labels['filtercontains'] = 'contient';
$labels['filternotcontains'] = 'ne contient pas';
$labels['filteris'] = 'est égal à';
@@ -40,14 +40,14 @@ $labels['filterunder'] = 'plus petit que';
$labels['filterover'] = 'plus grand que';
$labels['addrule'] = 'Ajouter une règle';
$labels['delrule'] = 'Supprimer une règle';
-$labels['messagemoveto'] = 'Déplacer le message vers';
-$labels['messageredirect'] = 'Rediriger le message à';
-$labels['messagecopyto'] = 'Copier le message vers';
-$labels['messagesendcopy'] = 'Envoyer une copie du message à';
-$labels['messagereply'] = 'Répondre avec le message';
-$labels['messagedelete'] = 'Supprimer le message';
-$labels['messagediscard'] = 'Rejeter avec le message';
-$labels['messagekeep'] = 'Conserver le message dans la boîte de réception';
+$labels['messagemoveto'] = 'Déplacer le courriel vers';
+$labels['messageredirect'] = 'Rediriger le courriel vers';
+$labels['messagecopyto'] = 'Copier le courriel vers';
+$labels['messagesendcopy'] = 'Envoyer une copie du courriel à';
+$labels['messagereply'] = 'Répondre avec le courriel';
+$labels['messagedelete'] = 'Supprimer le courriel';
+$labels['messagediscard'] = 'Rejeter avec le courriel';
+$labels['messagekeep'] = 'Conserver le courriel dans la boîte de réception';
$labels['messagesrules'] = 'Pour les courriels entrants :';
$labels['messagesactions'] = '...exécuter les actions suivantes :';
$labels['add'] = 'Ajouter';
@@ -55,10 +55,10 @@ $labels['del'] = 'Supprimer';
$labels['sender'] = 'Expéditeur';
$labels['recipient'] = 'Destinataire';
$labels['vacationaddr'] = 'Mes adresses courriel additionnelles :';
-$labels['vacationdays'] = 'Fréquence d\'envoi des messages (en jours) :';
-$labels['vacationinterval'] = 'Fréquence d\'envoi des messages :';
-$labels['vacationreason'] = 'Corps du message (raison de l\'absence) :';
-$labels['vacationsubject'] = 'Objet du message :';
+$labels['vacationdays'] = 'Fréquence d\'envoi des courriels (en jours) :';
+$labels['vacationinterval'] = 'Fréquence d\'envoi des courriels :';
+$labels['vacationreason'] = 'Corps du courriel (raison de l\'absence) :';
+$labels['vacationsubject'] = 'Objet du courriel :';
$labels['days'] = 'jours';
$labels['seconds'] = 'secondes';
$labels['rulestop'] = 'Arrêter l\'évaluation des règles';
@@ -89,9 +89,9 @@ $labels['valueislessthan'] = 'valeur inférieure à';
$labels['valueislessthanequal'] = 'valeur inférieure ou égale à';
$labels['valueequals'] = 'valeur égale à';
$labels['valuenotequals'] = 'la valeur n\'est pas égale à';
-$labels['setflags'] = 'Définir les drapeaux pour le message';
-$labels['addflags'] = 'Ajouter les drapeaux au message';
-$labels['removeflags'] = 'Supprimer les drapeaux du message';
+$labels['setflags'] = 'Définir les drapeaux pour le courriel';
+$labels['addflags'] = 'Ajouter les drapeaux au courriel';
+$labels['removeflags'] = 'Supprimer les drapeaux du courriel';
$labels['flagread'] = 'Lu';
$labels['flagdeleted'] = 'Supprimé';
$labels['flaganswered'] = 'Réponse envoyée';
@@ -109,7 +109,7 @@ $labels['varquotewildcard'] = 'citer les caractères spéciaux';
$labels['varlength'] = 'longueur';
$labels['notify'] = 'Envoyer la notification';
$labels['notifytarget'] = 'Cible de la notification :';
-$labels['notifymessage'] = 'Message de notification (optionnel) :';
+$labels['notifymessage'] = 'Courriel de notification (optionnel) :';
$labels['notifyoptions'] = 'Options de notification (optionnel) :';
$labels['notifyfrom'] = 'Expéditeur de la notification (optionnel) :';
$labels['notifyimportance'] = 'Importance :';
@@ -118,7 +118,7 @@ $labels['notifyimportancenormal'] = 'normale';
$labels['notifyimportancehigh'] = 'haute';
$labels['notifymethodmailto'] = 'Courriel';
$labels['notifymethodtel'] = 'Téléphone';
-$labels['notifymethodsms'] = 'Message texte';
+$labels['notifymethodsms'] = 'Texto';
$labels['filtercreate'] = 'Créer un filtre';
$labels['usedata'] = 'Utiliser les données suivantes dans le filtre :';
$labels['nextstep'] = 'Étape suivante';
@@ -161,7 +161,7 @@ $labels['asciinumeric'] = 'numérique (ascii-numeric)';
$labels['index'] = 'index :';
$labels['indexlast'] = 'à l\'envers';
$labels['vacation'] = 'Vacances';
-$labels['vacation.reply'] = 'Message de réponse';
+$labels['vacation.reply'] = 'Courriel de réponse';
$labels['vacation.advanced'] = 'Paramètres avancés';
$labels['vacation.subject'] = 'Objet';
$labels['vacation.body'] = 'Corps';
@@ -174,7 +174,7 @@ $labels['vacation.addresses'] = 'Mes adresses supplémentaires';
$labels['vacation.interval'] = 'Plage de réponse';
$labels['vacation.after'] = 'Mettre en place la règle de vacances après';
$labels['vacation.saving'] = 'Enregistrement des données...';
-$labels['vacation.action'] = 'Action pour message entrant';
+$labels['vacation.action'] = 'Action pour courriel entrant';
$labels['vacation.keep'] = 'Garder';
$labels['vacation.discard'] = 'Rejeter';
$labels['vacation.redirect'] = 'Réacheminer à';
@@ -220,5 +220,5 @@ $messages['nodata'] = 'Au moins un élément doit être sélectionné !';
$messages['invaliddateformat'] = 'Format de date ou d\'une partie de la date invalide';
$messages['saveerror'] = 'Impossible d\'enregistrer les données. Une erreur du serveur est survenue.';
$messages['vacationsaved'] = 'Les données de vacances ont été enregistrées avec succès.';
-$messages['emptyvacationbody'] = 'Le corps du message de vacances est nécessaire !';
+$messages['emptyvacationbody'] = 'Le corps du courriel de vacances est exigé !';
?>
diff --git a/plugins/managesieve/localization/fy_NL.inc b/plugins/managesieve/localization/fy_NL.inc
new file mode 100644
index 000000000..d507cbf25
--- /dev/null
+++ b/plugins/managesieve/localization/fy_NL.inc
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/managesieve/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Managesieve plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/
+*/
+$labels['none'] = 'gjin';
+$labels['notifyimportance'] = 'Prioriteit:';
+$labels['notifymethodmailto'] = 'E-mail';
+$labels['notifymethodsms'] = 'SMS';
+$labels['...'] = '...';
+$labels['datetest'] = 'Date';
+$labels['year'] = 'jier';
+$labels['month'] = 'moanne';
+$labels['day'] = 'dei';
+$labels['hour'] = 'oerre';
+$labels['minute'] = 'minút';
+$labels['second'] = 'sekonde';
+$labels['time'] = 'tiid (oo:mm:ss)';
+$labels['iso8601'] = 'datum (ISO8601)';
+$labels['std11'] = 'datum (RFC2822)';
+$labels['zone'] = 'tiidsône';
+$labels['text'] = 'tekst';
+$labels['modtype'] = 'type:';
+$labels['domain'] = 'domein';
+$labels['user'] = 'brûker';
+$labels['vacation.status'] = 'Status';
+?>
diff --git a/plugins/managesieve/localization/ia.inc b/plugins/managesieve/localization/ia.inc
index c0177d055..2f417abb9 100644
--- a/plugins/managesieve/localization/ia.inc
+++ b/plugins/managesieve/localization/ia.inc
@@ -16,6 +16,209 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-managesieve/
*/
$labels['filters'] = 'Filtros';
+$labels['managefilters'] = 'Gerer filtros de e-mail entrante';
+$labels['filtername'] = 'Nomine de filtro';
+$labels['newfilter'] = 'Nove filtro';
$labels['filteradd'] = 'Adder filtro';
$labels['filterdel'] = 'Deler filtro';
+$labels['moveup'] = 'Displaciar in alto';
+$labels['movedown'] = 'Displaciar a basso';
+$labels['filterallof'] = 'que satisface tote le sequente regulas';
+$labels['filteranyof'] = 'que satisface un del sequente regulas';
+$labels['filterany'] = 'tote le messages';
+$labels['filtercontains'] = 'contine';
+$labels['filternotcontains'] = 'non contine';
+$labels['filteris'] = 'es equal a';
+$labels['filterisnot'] = 'non es equal a';
+$labels['filterexists'] = 'existe';
+$labels['filternotexists'] = 'non existe';
+$labels['filtermatches'] = 'corresponde al expression';
+$labels['filternotmatches'] = 'non corresponde al expression';
+$labels['filterregex'] = 'corresponde al expression regular';
+$labels['filternotregex'] = 'non corresponde al expression regular';
+$labels['filterunder'] = 'sub';
+$labels['filterover'] = 'super';
+$labels['addrule'] = 'Adder regula';
+$labels['delrule'] = 'Deler regula';
+$labels['messagemoveto'] = 'Displaciar message a';
+$labels['messageredirect'] = 'Rediriger message a';
+$labels['messagecopyto'] = 'Copiar message a';
+$labels['messagesendcopy'] = 'Inviar copia del message a';
+$labels['messagereply'] = 'Responder con message';
+$labels['messagedelete'] = 'Deler message';
+$labels['messagediscard'] = 'Abandonar con message';
+$labels['messagekeep'] = 'Retener message in cassa de entrata';
+$labels['messagesrules'] = 'Pro messages entrante:';
+$labels['messagesactions'] = '...executar le sequente actiones:';
+$labels['add'] = 'Adder';
+$labels['del'] = 'Deler';
+$labels['sender'] = 'Expeditor';
+$labels['recipient'] = 'Destinatario';
+$labels['vacationaddr'] = 'Mi additional adresse(s) de e-mail:';
+$labels['vacationdays'] = 'Frequentia de invio de messages (in dies):';
+$labels['vacationinterval'] = 'Frequentia de invio de messages:';
+$labels['vacationreason'] = 'Texto del message (motivo del absentia):';
+$labels['vacationsubject'] = 'Subjecto del message:';
+$labels['days'] = 'dies';
+$labels['seconds'] = 'secundas';
+$labels['rulestop'] = 'Cessar de evalutar regulas';
+$labels['enable'] = 'Activar/Disactivar';
+$labels['filterset'] = 'Gruppo de filtros';
+$labels['filtersets'] = 'Gruppos de filtros';
+$labels['filtersetadd'] = 'Adder gruppo de filtros';
+$labels['filtersetdel'] = 'Deler le gruppo de filtros actual';
+$labels['filtersetact'] = 'Activar le gruppo de filtros actual';
+$labels['filtersetdeact'] = 'Disactivar le gruppo de filtros actual';
+$labels['filterdef'] = 'Definition del filtro';
+$labels['filtersetname'] = 'Nomine del gruppo de filtros';
+$labels['newfilterset'] = 'Nove gruppo de filtros';
+$labels['active'] = 'active';
+$labels['none'] = 'nulle';
+$labels['fromset'] = 'ab gruppo';
+$labels['fromfile'] = 'ab file';
+$labels['filterdisabled'] = 'Filtro disactivate';
+$labels['countisgreaterthan'] = 'numero es superior a';
+$labels['countisgreaterthanequal'] = 'numero es superior o equal a';
+$labels['countislessthan'] = 'numero es inferior a';
+$labels['countislessthanequal'] = 'numero es inferior o equal a';
+$labels['countequals'] = 'numero es equal a';
+$labels['countnotequals'] = 'numero non es equal a';
+$labels['valueisgreaterthan'] = 'valor es superior a';
+$labels['valueisgreaterthanequal'] = 'valor es superior o equal a';
+$labels['valueislessthan'] = 'valor es inferior a';
+$labels['valueislessthanequal'] = 'valor es inferior o equal a';
+$labels['valueequals'] = 'valor es equal a';
+$labels['valuenotequals'] = 'valor non es equal a';
+$labels['setflags'] = 'Mitter signales al message';
+$labels['addflags'] = 'Adder signales al message';
+$labels['removeflags'] = 'Remover signales del message';
+$labels['flagread'] = 'Legite';
+$labels['flagdeleted'] = 'Delite';
+$labels['flaganswered'] = 'Respondite';
+$labels['flagflagged'] = 'Signalate';
+$labels['flagdraft'] = 'Version provisori';
+$labels['setvariable'] = 'Definir variabile';
+$labels['setvarname'] = 'Nomine del variabile:';
+$labels['setvarvalue'] = 'Valor del variabile:';
+$labels['setvarmodifiers'] = 'Modificatores:';
+$labels['varlower'] = 'minusculas';
+$labels['varupper'] = 'majusculas';
+$labels['varlowerfirst'] = 'prime character es minuscula';
+$labels['varupperfirst'] = 'prime character es majuscula';
+$labels['varquotewildcard'] = 'mitter characteres special inter virgulettas';
+$labels['varlength'] = 'longitude';
+$labels['notify'] = 'Inviar notification';
+$labels['notifytarget'] = 'Scopo del notification:';
+$labels['notifymessage'] = 'Message del notification (optional):';
+$labels['notifyoptions'] = 'Optiones de notification (optional):';
+$labels['notifyfrom'] = 'Expeditor del notification (optional):';
+$labels['notifyimportance'] = 'Importantia:';
+$labels['notifyimportancelow'] = 'basse';
+$labels['notifyimportancenormal'] = 'normal';
+$labels['notifyimportancehigh'] = 'alte';
+$labels['notifymethodmailto'] = 'E-mail';
+$labels['notifymethodtel'] = 'Telephono';
+$labels['notifymethodsms'] = 'SMS';
+$labels['filtercreate'] = 'Crear filtro';
+$labels['usedata'] = 'Usar le sequente datos in le filtro:';
+$labels['nextstep'] = 'Proxime passo';
+$labels['...'] = '...';
+$labels['currdate'] = 'Data actual';
+$labels['datetest'] = 'Data';
+$labels['dateheader'] = 'capite:';
+$labels['year'] = 'anno';
+$labels['month'] = 'mense';
+$labels['day'] = 'die';
+$labels['date'] = 'data (aaaa-mm-dd)';
+$labels['julian'] = 'data (julian)';
+$labels['hour'] = 'hora';
+$labels['minute'] = 'minuta';
+$labels['second'] = 'secunda';
+$labels['time'] = 'hora (hh:mm:ss)';
+$labels['iso8601'] = 'data (ISO8601)';
+$labels['std11'] = 'data (RFC2822)';
+$labels['zone'] = 'fuso horari';
+$labels['weekday'] = 'die del septimana (0-6)';
+$labels['advancedopts'] = 'Optiones avantiate';
+$labels['body'] = 'Texto';
+$labels['address'] = 'adresse';
+$labels['envelope'] = 'inveloppe';
+$labels['modifier'] = 'modificator:';
+$labels['text'] = 'texto';
+$labels['undecoded'] = 'non decodificate (crude)';
+$labels['contenttype'] = 'typo de contento';
+$labels['modtype'] = 'typo:';
+$labels['allparts'] = 'totes';
+$labels['domain'] = 'dominio';
+$labels['localpart'] = 'parte local';
+$labels['user'] = 'usator';
+$labels['detail'] = 'detalio';
+$labels['comparator'] = 'comparator:';
+$labels['default'] = 'predefinite';
+$labels['octet'] = 'stricte (octetto)';
+$labels['asciicasemap'] = 'non sensibile al differentia inter majusculas e minusculas (ascii-casemap)';
+$labels['asciinumeric'] = 'numeric (ascii-numeric)';
+$labels['index'] = 'indice:';
+$labels['indexlast'] = 'a retro';
+$labels['vacation'] = 'Vacantias';
+$labels['vacation.reply'] = 'Message de responsa';
+$labels['vacation.advanced'] = 'Configuration avantiate';
+$labels['vacation.subject'] = 'Subjecto';
+$labels['vacation.body'] = 'Texto';
+$labels['vacation.start'] = 'Initio del vacantias';
+$labels['vacation.end'] = 'Fin del vacantias';
+$labels['vacation.status'] = 'Stato';
+$labels['vacation.on'] = 'Active';
+$labels['vacation.off'] = 'Non active';
+$labels['vacation.addresses'] = 'Mi adresses additional';
+$labels['vacation.interval'] = 'Intervallo de responsa';
+$labels['vacation.after'] = 'Mitter le regula de vacantias post';
+$labels['vacation.saving'] = 'A salveguardar datos...';
+$labels['vacation.action'] = 'Action pro message entrante';
+$labels['vacation.keep'] = 'Retener';
+$labels['vacation.discard'] = 'Abandonar';
+$labels['vacation.redirect'] = 'Rediriger a';
+$labels['vacation.copy'] = 'Inviar copia a';
+$labels['arialabelfiltersetactions'] = 'Actiones de gruppo de filtros';
+$labels['arialabelfilteractions'] = 'Actiones de filtro';
+$labels['arialabelfilterform'] = 'Proprietates de filtro';
+$labels['ariasummaryfilterslist'] = 'Lista de filtros';
+$labels['ariasummaryfiltersetslist'] = 'Lista de gruppos de filtros';
+$labels['filterstitle'] = 'Modificar filtros de e-mail entrante';
+$labels['vacationtitle'] = 'Modificar regula de absentia';
+$messages['filterunknownerror'] = 'Error de servitor incognite.';
+$messages['filterconnerror'] = 'Impossibile connecter al servitor.';
+$messages['filterdeleteerror'] = 'Impossibile deler le filtro. Un error de servitor ha occurrite.';
+$messages['filterdeleted'] = 'Le filtro ha essite delite.';
+$messages['filtersaved'] = 'Le filtro ha essite salveguardate.';
+$messages['filtersaveerror'] = 'Impossibile salveguardar le filtro. Un error de servitor ha occurrite.';
+$messages['filterdeleteconfirm'] = 'Es vos secur de voler deler le filtro seligite?';
+$messages['ruledeleteconfirm'] = 'Es vos secur de voler deler le regula seligite?';
+$messages['actiondeleteconfirm'] = 'Es vos secur de voler deler le action seligite?';
+$messages['forbiddenchars'] = 'Le campo contine characteres interdicte.';
+$messages['cannotbeempty'] = 'Le campo non pote esser vacue.';
+$messages['ruleexist'] = 'Un filtro con le nomine specificate jam existe.';
+$messages['setactivateerror'] = 'Impossibile activar le gruppo de filtros seligite. Un error de servitor ha occurrite.';
+$messages['setdeactivateerror'] = 'Impossibile disactivar le gruppo de filtros seligite. Un error de servitor ha occurrite.';
+$messages['setdeleteerror'] = 'Impossibile deler le gruppo de filtros seligite. Un error de servitor ha occurrite.';
+$messages['setactivated'] = 'Le gruppo de filtros ha essite activate.';
+$messages['setdeactivated'] = 'Le gruppo de filtros ha essite disactivate.';
+$messages['setdeleted'] = 'Le gruppo de filtros ha essite delite.';
+$messages['setdeleteconfirm'] = 'Es vos secur de voler deler le gruppo de filtros seligite?';
+$messages['setcreateerror'] = 'Impossibile crear le gruppo de filtros. Un error de servitor ha occurrite.';
+$messages['setcreated'] = 'Le gruppo de filtros ha essite create.';
+$messages['activateerror'] = 'Impossibile activar le filtro(s) seligite. Un error de servitor ha occurrite.';
+$messages['deactivateerror'] = 'Impossibile disactivar le filtro(s) seligite. Un error de servitor ha occurrite.';
+$messages['deactivated'] = 'Le filtro(s) ha essite disactivate.';
+$messages['activated'] = 'Le filtro(s) ha essite activate.';
+$messages['moved'] = 'Le filtro ha essite displaciate.';
+$messages['moveerror'] = 'Impossibile displaciar le filtro seligite. Un error de servitor ha occurrite.';
+$messages['nametoolong'] = 'Le nomine es troppo longe.';
+$messages['namereserved'] = 'Nomine reservate.';
+$messages['setexist'] = 'Le gruppo jam existe.';
+$messages['nodata'] = 'Al minus un position debe esser seligite.';
+$messages['invaliddateformat'] = 'Le formato del data o del parte de data non es valide';
+$messages['saveerror'] = 'Impossibile salveguardar le datos. Un error de servitor ha occurrite.';
+$messages['vacationsaved'] = 'Le datos del vacantias ha essite salveguardate.';
+$messages['emptyvacationbody'] = 'Le texto del message de vacantias es obligatori.';
?>
diff --git a/plugins/markasjunk/localization/es_ES.inc b/plugins/markasjunk/localization/es_ES.inc
index e1f7f1750..eb7b2740e 100644
--- a/plugins/markasjunk/localization/es_ES.inc
+++ b/plugins/markasjunk/localization/es_ES.inc
@@ -17,5 +17,5 @@
*/
$labels['buttontext'] = 'SPAM';
$labels['buttontitle'] = 'Marcar como SPAM';
-$labels['reportedasjunk'] = 'Mensaje informado como SPAM';
+$labels['reportedasjunk'] = 'Reportado como SPAM, correctamente';
?> \ No newline at end of file
diff --git a/plugins/markasjunk/localization/fy_NL.inc b/plugins/markasjunk/localization/fy_NL.inc
new file mode 100644
index 000000000..3291a962c
--- /dev/null
+++ b/plugins/markasjunk/localization/fy_NL.inc
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/markasjunk/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Mark-As-Junk plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-markasjunk/
+*/
+$labels['buttontext'] = 'Spam';
+?> \ No newline at end of file
diff --git a/plugins/markasjunk/localization/ia.inc b/plugins/markasjunk/localization/ia.inc
new file mode 100644
index 000000000..d6f1c021d
--- /dev/null
+++ b/plugins/markasjunk/localization/ia.inc
@@ -0,0 +1,21 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/markasjunk/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Mark-As-Junk plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-markasjunk/
+*/
+$labels['buttontext'] = 'Messages indesirate';
+$labels['buttontitle'] = 'Marcar como indesirate';
+$labels['reportedasjunk'] = 'Reportate como indesirate con successo';
+?> \ No newline at end of file
diff --git a/plugins/markasjunk/localization/tr_TR.inc b/plugins/markasjunk/localization/tr_TR.inc
index c4230799f..4d46c0b37 100644
--- a/plugins/markasjunk/localization/tr_TR.inc
+++ b/plugins/markasjunk/localization/tr_TR.inc
@@ -16,6 +16,6 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-markasjunk/
*/
$labels['buttontext'] = 'İstenmeyen';
-$labels['buttontitle'] = 'Çöp olarak işaretle';
+$labels['buttontitle'] = 'İstenmeyen olarak işaretle';
$labels['reportedasjunk'] = 'Spam olarak rapor edildi';
?> \ No newline at end of file
diff --git a/plugins/new_user_dialog/localization/es_ES.inc b/plugins/new_user_dialog/localization/es_ES.inc
index 45f55d8f3..b4275b541 100644
--- a/plugins/new_user_dialog/localization/es_ES.inc
+++ b/plugins/new_user_dialog/localization/es_ES.inc
@@ -15,6 +15,6 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-new_user_dialog/
*/
-$labels['identitydialogtitle'] = 'Por favor, complete sus datos personales';
-$labels['identitydialoghint'] = 'Este diálogo sólo aparecerá la primera vez que se conecte al correo.';
+$labels['identitydialogtitle'] = 'Por favor, complete su identidad de remitente';
+$labels['identitydialoghint'] = 'Este diálogo sólo aparece la primera vez que inicia su sesión.';
?> \ No newline at end of file
diff --git a/plugins/new_user_dialog/localization/ia.inc b/plugins/new_user_dialog/localization/ia.inc
new file mode 100644
index 000000000..bf5b749f5
--- /dev/null
+++ b/plugins/new_user_dialog/localization/ia.inc
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/new_user_dialog/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail New User Dialog plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-new_user_dialog/
+*/
+$labels['identitydialogtitle'] = 'Per favor, completa vostre identitate de expeditor';
+$labels['identitydialoghint'] = 'Iste quadro solmente appare un vice al prime apertura de session.';
+?> \ No newline at end of file
diff --git a/plugins/newmail_notifier/localization/es_ES.inc b/plugins/newmail_notifier/localization/es_ES.inc
index 8809aa03c..ef1be741f 100644
--- a/plugins/newmail_notifier/localization/es_ES.inc
+++ b/plugins/newmail_notifier/localization/es_ES.inc
@@ -15,14 +15,14 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-newmail_notifier/
*/
-$labels['basic'] = 'Mostrar notificaciones del navegador cuando llegue un nuevo mensaje';
-$labels['desktop'] = 'Mostrar notificaciones del escritorio cuando llegue un nuevo mensaje';
-$labels['sound'] = 'Reproducir sonido cuando llegue un nuevo mensaje';
+$labels['basic'] = 'Mostrar notificaciones del navegador al recibir un nuevo mensaje';
+$labels['desktop'] = 'Mostrar notificaciones de escritorio al recibir un nuevo mensaje';
+$labels['sound'] = 'Reproducir sonido al recibir un nuevo mensaje';
$labels['test'] = 'Prueba';
$labels['title'] = '¡Mensaje nuevo!';
-$labels['body'] = 'Has recibido un mensaje nuevo.';
-$labels['testbody'] = 'Esta es una notificación de pruebas.';
-$labels['desktopdisabled'] = 'Las notificaciones de escritorio están deshabilitadas en tu navegador.';
-$labels['desktopunsupported'] = 'Tu navegador no soporta notificaciones de escritorio.';
+$labels['body'] = 'Ha recibido un mensaje nuevo.';
+$labels['testbody'] = 'Esta es una notificación de prueba.';
+$labels['desktopdisabled'] = 'Las notificaciones de escritorio están deshabilitadas en su navegador.';
+$labels['desktopunsupported'] = 'Su navegador no soporta notificaciones de escritorio.';
$labels['desktoptimeout'] = 'Cerrar notificación de escritorio';
?>
diff --git a/plugins/newmail_notifier/localization/fr_FR.inc b/plugins/newmail_notifier/localization/fr_FR.inc
index 92ec698c8..f493420d9 100644
--- a/plugins/newmail_notifier/localization/fr_FR.inc
+++ b/plugins/newmail_notifier/localization/fr_FR.inc
@@ -15,9 +15,9 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-newmail_notifier/
*/
-$labels['basic'] = 'Afficher les notifications du navigateur pour les nouveaux messages';
-$labels['desktop'] = 'Afficher les notifications du navigateur pour les nouveaux messages';
-$labels['sound'] = 'Jouer un pour les nouveaux messages';
+$labels['basic'] = 'Afficher les notifications du navigateur pour les nouveaux courriels';
+$labels['desktop'] = 'Afficher les notifications du navigateur pour les nouveaux courriels';
+$labels['sound'] = 'Jouer le son pour les nouveaux courriels';
$labels['test'] = 'Test';
$labels['title'] = 'Nouveau courriel';
$labels['body'] = 'Vous avez reçu un nouveau courriel.';
diff --git a/plugins/newmail_notifier/localization/fy_NL.inc b/plugins/newmail_notifier/localization/fy_NL.inc
new file mode 100644
index 000000000..53347df15
--- /dev/null
+++ b/plugins/newmail_notifier/localization/fy_NL.inc
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/newmail_notifier/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail New Mail Notifier plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-newmail_notifier/
+*/
+$labels['test'] = 'Test';
+$labels['title'] = 'Nije e-mail!';
+?>
diff --git a/plugins/newmail_notifier/localization/ia.inc b/plugins/newmail_notifier/localization/ia.inc
index cf83712ec..d10c6b07d 100644
--- a/plugins/newmail_notifier/localization/ia.inc
+++ b/plugins/newmail_notifier/localization/ia.inc
@@ -15,8 +15,14 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-newmail_notifier/
*/
-$labels['basic'] = 'Monstrar notificationes de navigator in cata nove message';
-$labels['test'] = 'Prova';
-$labels['title'] = 'Nove message!';
-$labels['testbody'] = 'Iste es un notification de prova.';
+$labels['basic'] = 'Presentar notificationes de navigator quando un nove message arriva';
+$labels['desktop'] = 'Presentar notificationes de scriptorio quando un nove message arriva';
+$labels['sound'] = 'Facer sonar un sono quando un nove message arriva';
+$labels['test'] = 'Test';
+$labels['title'] = 'Nove e-mail!';
+$labels['body'] = 'Vos ha recipite un nove message.';
+$labels['testbody'] = 'Iste es un notification de test.';
+$labels['desktopdisabled'] = 'Le notificationes de scriptorio ha essite disactivate in vostre navigator.';
+$labels['desktopunsupported'] = 'Vostre navigator non supporta le notificationes de scriptorio.';
+$labels['desktoptimeout'] = 'Clauder notification de scriptorio';
?>
diff --git a/plugins/newmail_notifier/localization/tr_TR.inc b/plugins/newmail_notifier/localization/tr_TR.inc
index e59c05597..4e4d4ce77 100644
--- a/plugins/newmail_notifier/localization/tr_TR.inc
+++ b/plugins/newmail_notifier/localization/tr_TR.inc
@@ -15,12 +15,12 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-newmail_notifier/
*/
-$labels['basic'] = 'Yeni mesajlarda web tarayıcı bildirimlerini göster';
-$labels['desktop'] = 'Yeni mesajlarda masa üstü bildirimlerini göster';
-$labels['sound'] = 'Yeni mesajlarda müzik çal';
+$labels['basic'] = 'Web tarayıcıda yeni mesajları bildir.';
+$labels['desktop'] = 'Masaüstünde yeni mesajları bildir.';
+$labels['sound'] = 'Yeni mesajlarda ses çal.';
$labels['test'] = 'Deneme';
$labels['title'] = 'Yeni E-posta!';
-$labels['body'] = 'Yeni bir mesaj aldınız';
+$labels['body'] = 'Yeni bir mesajınız var.';
$labels['testbody'] = 'Bu bir test bildirimidir.';
$labels['desktopdisabled'] = 'Web tarayıcınızda masaüstü bildirimi iptal edildi';
$labels['desktopunsupported'] = 'Web tarayıcınız masaüstü bildirimleri desteklemiyor';
diff --git a/plugins/password/drivers/dbmail.php b/plugins/password/drivers/dbmail.php
index d76486021..120728395 100644
--- a/plugins/password/drivers/dbmail.php
+++ b/plugins/password/drivers/dbmail.php
@@ -35,10 +35,23 @@ class rcube_dbmail_password
function save($currpass, $newpass)
{
$curdir = RCUBE_PLUGINS_DIR . 'password/helpers';
- $username = escapeshellcmd($_SESSION['username']);
+ $username = escapeshellarg($_SESSION['username']);
+ $password = escapeshellarg($newpass);
$args = rcmail::get_instance()->config->get('password_dbmail_args', '');
+ $command = "$curdir/chgdbmailusers -c $username -w $password $args";
- exec("$curdir/chgdbmailusers -c $username -w $newpass $args", $output, $returnvalue);
+ if (strlen($command) > 1024) {
+ rcube::raise_error(array(
+ 'code' => 600,
+ 'type' => 'php',
+ 'file' => __FILE__, 'line' => __LINE__,
+ 'message' => "Password plugin: The command is too long."
+ ), true, false);
+
+ return PASSWORD_ERROR;
+ }
+
+ exec($command, $output, $returnvalue);
if ($returnvalue == 0) {
return PASSWORD_SUCCESS;
diff --git a/plugins/password/helpers/chgdbmailusers.c b/plugins/password/helpers/chgdbmailusers.c
index 22793857d..be237556e 100644
--- a/plugins/password/helpers/chgdbmailusers.c
+++ b/plugins/password/helpers/chgdbmailusers.c
@@ -16,7 +16,7 @@
main(int argc, char *argv[])
{
int cnt,rc,cc;
- char cmnd[255];
+ char cmnd[1024];
strcpy(cmnd, CMD);
diff --git a/plugins/password/localization/es_ES.inc b/plugins/password/localization/es_ES.inc
index cededcd8b..2e97e6644 100644
--- a/plugins/password/localization/es_ES.inc
+++ b/plugins/password/localization/es_ES.inc
@@ -15,18 +15,18 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-password/
*/
-$labels['changepasswd'] = 'Cambiar la contraseña';
+$labels['changepasswd'] = 'Cambiar contraseña';
$labels['curpasswd'] = 'Contraseña actual:';
$labels['newpasswd'] = 'Contraseña nueva:';
$labels['confpasswd'] = 'Confirmar contraseña:';
-$messages['nopassword'] = 'Por favor introduzca una contraseña nueva.';
-$messages['nocurpassword'] = 'Por favor introduzca la contraseña actual.';
+$messages['nopassword'] = 'Por favor, introduzca una contraseña nueva.';
+$messages['nocurpassword'] = 'Por favor, introduzca la contraseña actual.';
$messages['passwordincorrect'] = 'La contraseña actual es incorrecta.';
$messages['passwordinconsistency'] = 'Las contraseñas no coinciden. Por favor, inténtelo de nuevo.';
$messages['crypterror'] = 'No se pudo guardar la contraseña nueva. Falta la función de cifrado.';
$messages['connecterror'] = 'No se pudo guardar la contraseña nueva. Error de conexión.';
$messages['internalerror'] = 'No se pudo guardar la contraseña nueva.';
-$messages['passwordshort'] = 'La contraseña debe tener por lo menos $length caracteres.';
+$messages['passwordshort'] = 'La contraseña debe tener al menos $length caracteres.';
$messages['passwordweak'] = 'La contraseña debe incluir al menos un número y un signo de puntuación.';
$messages['passwordforbidden'] = 'La contraseña introducida contiene caracteres no permitidos.';
$messages['firstloginchange'] = 'Este es su primer inicio de sesión. Por favor, cambie su contraseña.';
diff --git a/plugins/password/localization/fy_NL.inc b/plugins/password/localization/fy_NL.inc
new file mode 100644
index 000000000..413a80ce5
--- /dev/null
+++ b/plugins/password/localization/fy_NL.inc
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/password/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Password plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-password/
+*/
+$labels['newpasswd'] = 'Nij wachtwurd:';
+?>
diff --git a/plugins/password/localization/ia.inc b/plugins/password/localization/ia.inc
new file mode 100644
index 000000000..45479634d
--- /dev/null
+++ b/plugins/password/localization/ia.inc
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/password/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Password plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-password/
+*/
+$labels['changepasswd'] = 'Cambiar contrasigno';
+$labels['curpasswd'] = 'Contrasigno actual:';
+$labels['newpasswd'] = 'Nove contrasigno:';
+$labels['confpasswd'] = 'Confirmar nove contrasigno:';
+$messages['nopassword'] = 'Entra un nove contrasigno.';
+$messages['nocurpassword'] = 'Entra le contrasigno actual.';
+$messages['passwordincorrect'] = 'Le contrasigno actual es incorrecte.';
+$messages['passwordinconsistency'] = 'Le contrasignos non es identic. Essaya lo de novo.';
+$messages['crypterror'] = 'Impossibile salveguardar le nove contrasigno. Le function de cryptographia manca.';
+$messages['connecterror'] = 'Impossibile salveguardar le nove contrasigno. Error de connexion.';
+$messages['internalerror'] = 'Impossibile salveguardar le nove contrasigno.';
+$messages['passwordshort'] = 'Le contrasigno debe haber al minus $length characteres.';
+$messages['passwordweak'] = 'Le contrasigno debe includer al minus un numero e un character de punctuation.';
+$messages['passwordforbidden'] = 'Le contrasigno contine characteres interdicte.';
+$messages['firstloginchange'] = 'Iste es vostre prime session. Per favor, cambia vostre contrasigno.';
+?>
diff --git a/plugins/password/localization/tr_TR.inc b/plugins/password/localization/tr_TR.inc
index 37c25c608..f74eed924 100644
--- a/plugins/password/localization/tr_TR.inc
+++ b/plugins/password/localization/tr_TR.inc
@@ -19,15 +19,15 @@ $labels['changepasswd'] = 'Parolayı değiştir';
$labels['curpasswd'] = 'Şimdiki Parola:';
$labels['newpasswd'] = 'Yeni Parola:';
$labels['confpasswd'] = 'Yeni Parolayı Onaylayın:';
-$messages['nopassword'] = 'Lütfen yeni parolayı girin.';
-$messages['nocurpassword'] = 'Lütfen şimdiki parolayı girin.';
+$messages['nopassword'] = 'Yeni parolayı giriniz.';
+$messages['nocurpassword'] = 'Şimdiki parolayı giriniz.';
$messages['passwordincorrect'] = 'Şimdiki parolayı yanlış girdiniz.';
-$messages['passwordinconsistency'] = 'Girdiğiniz parolalar uyuşmuyor. Lütfen tekrar deneyin.';
+$messages['passwordinconsistency'] = 'Girdiğiniz parolalar uyuşmuyor.Tekrar deneyiniz.';
$messages['crypterror'] = 'Yeni parola kaydedilemedi. Şifreleme fonksiyonu mevcut değil.';
-$messages['connecterror'] = 'Yeni parola kaydedilemedi. Bağlantı hatası.';
+$messages['connecterror'] = 'Yeni parola kaydedilemedi. Bağlantı hatası!...';
$messages['internalerror'] = 'Yeni parola kaydedilemedi.';
$messages['passwordshort'] = 'Parola en az $length karakterden oluşmalı.';
$messages['passwordweak'] = 'Parola en az bir sayı ve bir noktalama işareti içermeli.';
$messages['passwordforbidden'] = 'Parola uygunsuz karakter(ler) içeriyor.';
-$messages['firstloginchange'] = 'Bu ilk girişiniz. Lütfen parolanızı değiştirin.';
+$messages['firstloginchange'] = 'Bu ilk girişiniz. Parolanızı değiştiriniz.';
?>
diff --git a/plugins/subscriptions_option/localization/br.inc b/plugins/subscriptions_option/localization/br.inc
new file mode 100644
index 000000000..315402fc5
--- /dev/null
+++ b/plugins/subscriptions_option/localization/br.inc
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/subscriptions_option/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Subscriptions plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-subscriptions_option/
+*/
+$labels['useimapsubscriptions'] = 'Arverañ koumanantoù IMAP';
+?>
diff --git a/plugins/subscriptions_option/localization/ia.inc b/plugins/subscriptions_option/localization/ia.inc
new file mode 100644
index 000000000..9382a5078
--- /dev/null
+++ b/plugins/subscriptions_option/localization/ia.inc
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/subscriptions_option/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Subscriptions plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-subscriptions_option/
+*/
+$labels['useimapsubscriptions'] = 'Usar subscriptiones IMAP';
+?>
diff --git a/plugins/userinfo/localization/es_ES.inc b/plugins/userinfo/localization/es_ES.inc
index 6dde3c59f..25e890058 100644
--- a/plugins/userinfo/localization/es_ES.inc
+++ b/plugins/userinfo/localization/es_ES.inc
@@ -17,6 +17,6 @@
*/
$labels['userinfo'] = 'Información de usuario';
$labels['created'] = 'Creado';
-$labels['lastlogin'] = 'Última conexión';
+$labels['lastlogin'] = 'Último Ingreso';
$labels['defaultidentity'] = 'Identidad predeterminada';
?> \ No newline at end of file
diff --git a/plugins/userinfo/localization/fy_NL.inc b/plugins/userinfo/localization/fy_NL.inc
new file mode 100644
index 000000000..0ca51c51a
--- /dev/null
+++ b/plugins/userinfo/localization/fy_NL.inc
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/userinfo/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Userinfo plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-userinfo/
+*/
+$labels['userinfo'] = 'Brûkersynformaasje';
+?> \ No newline at end of file
diff --git a/plugins/userinfo/localization/ia.inc b/plugins/userinfo/localization/ia.inc
index 4532d9459..89dff2b18 100644
--- a/plugins/userinfo/localization/ia.inc
+++ b/plugins/userinfo/localization/ia.inc
@@ -17,6 +17,6 @@
*/
$labels['userinfo'] = 'Information de usator';
$labels['created'] = 'Create';
-$labels['lastlogin'] = 'Ultime initio de session';
-$labels['defaultidentity'] = 'Identitate predeterminate';
+$labels['lastlogin'] = 'Ultime session';
+$labels['defaultidentity'] = 'Identitate predefinite';
?> \ No newline at end of file
diff --git a/plugins/vcard_attachments/localization/es_ES.inc b/plugins/vcard_attachments/localization/es_ES.inc
index 8c777d2ed..28ea13e84 100644
--- a/plugins/vcard_attachments/localization/es_ES.inc
+++ b/plugins/vcard_attachments/localization/es_ES.inc
@@ -15,6 +15,6 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-vcard_attachments/
*/
-$labels['addvcardmsg'] = 'Añadir la tarjeta a la libreta de direcciones';
-$labels['vcardsavefailed'] = 'No ha sido posible guardar la tarjeta';
+$labels['addvcardmsg'] = 'Añadir tarjeta vCard a la libreta de direcciones';
+$labels['vcardsavefailed'] = 'No se pudo guardar la tarjeta vCard';
?> \ No newline at end of file
diff --git a/plugins/vcard_attachments/localization/ia.inc b/plugins/vcard_attachments/localization/ia.inc
new file mode 100644
index 000000000..7b430f935
--- /dev/null
+++ b/plugins/vcard_attachments/localization/ia.inc
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/vcard_attachments/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Vcard Attachments plugin |
+ | Copyright (C) 2012-2013, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-vcard_attachments/
+*/
+$labels['addvcardmsg'] = 'Adder le vCard al adressario';
+$labels['vcardsavefailed'] = 'Impossibile salveguardar le vCard';
+?> \ No newline at end of file
diff --git a/plugins/zipdownload/localization/fr_FR.inc b/plugins/zipdownload/localization/fr_FR.inc
index 6dd839ae6..57c8bf6ee 100644
--- a/plugins/zipdownload/localization/fr_FR.inc
+++ b/plugins/zipdownload/localization/fr_FR.inc
@@ -15,7 +15,7 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-zipdownload/
*/
-$labels['downloadall'] = 'Télécharger tous les fichiers joints';
+$labels['downloadall'] = 'Télécharger toutes les pièces jointes';
$labels['download'] = 'Télécharger...';
$labels['downloadmbox'] = 'Format mbox (.zip)';
$labels['downloadmaildir'] = 'Format maildir (.zip)';
diff --git a/plugins/zipdownload/localization/fy_NL.inc b/plugins/zipdownload/localization/fy_NL.inc
new file mode 100644
index 000000000..96d69d0a7
--- /dev/null
+++ b/plugins/zipdownload/localization/fy_NL.inc
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/zipdownload/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Zipdownload plugin |
+ | Copyright (C) 2012-2014, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-zipdownload/
+*/
+$labels['downloademl'] = 'Boarne (.eml)';
diff --git a/plugins/zipdownload/localization/ia.inc b/plugins/zipdownload/localization/ia.inc
new file mode 100644
index 000000000..c35619a08
--- /dev/null
+++ b/plugins/zipdownload/localization/ia.inc
@@ -0,0 +1,22 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | plugins/zipdownload/localization/<lang>.inc |
+ | |
+ | Localization file of the Roundcube Webmail Zipdownload plugin |
+ | Copyright (C) 2012-2014, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-zipdownload/
+*/
+$labels['downloadall'] = 'Discargar tote le attachamentos';
+$labels['download'] = 'Discargar...';
+$labels['downloadmbox'] = 'Formato Mbox (.zip)';
+$labels['downloadmaildir'] = 'Formato Maildir (.zip)';
+$labels['downloademl'] = 'Fonte (.eml)';
diff --git a/program/include/iniset.php b/program/include/iniset.php
index 11a29034c..ca1e6ad75 100644
--- a/program/include/iniset.php
+++ b/program/include/iniset.php
@@ -5,7 +5,7 @@
| program/include/iniset.php |
| |
| This file is part of the Roundcube Webmail client |
- | Copyright (C) 2008-2014, The Roundcube Dev Team |
+ | Copyright (C) 2008-2015, The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@@ -21,7 +21,7 @@
*/
// application constants
-define('RCMAIL_VERSION', '1.1-git');
+define('RCMAIL_VERSION', '1.2-git');
define('RCMAIL_START', microtime(true));
if (!defined('INSTALL_PATH')) {
@@ -68,7 +68,7 @@ spl_autoload_register('rcmail_autoload');
// backward compatybility (to be removed)
require_once INSTALL_PATH . 'program/include/bc.php';
-// load the UTF-8 portablity layer from Patchwor
+// load the UTF-8 portablity layer from Patchwork
if (!function_exists('iconv') || !function_exists('utf8_encode') || !extension_loaded('mbstring')) {
\Patchwork\Utf8\Bootup::initAll();
}
diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index 306e5938a..6e74560cb 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -2286,6 +2286,29 @@ class rcmail extends rcube
return $result;
}
+ /**
+ * Get resource file content (with assets_dir support)
+ *
+ * @param string $name File name
+ */
+ public function get_resource_content($name)
+ {
+ if (!strpos($name, '/')) {
+ $name = "program/resources/$name";
+ }
+
+ $assets_dir = $this->config->get('assets_dir');
+
+ if ($assets_dir) {
+ $path = slashify($assets_dir) . $name;
+ if (@file_exists($path)) {
+ $name = $path;
+ }
+ }
+
+ return file_get_contents($name, false);
+ }
+
/************************************************************************
********* Deprecated methods (to be removed) *********
diff --git a/program/include/rcmail_install.php b/program/include/rcmail_install.php
index 2ba90693f..0d5fbc5da 100644
--- a/program/include/rcmail_install.php
+++ b/program/include/rcmail_install.php
@@ -234,10 +234,9 @@ class rcmail_install
else if (is_numeric($value)) {
$value = intval($value);
}
- else if ($prop == 'plugins') {
+ else if ($prop == 'plugins' && !empty($_POST['submit'])) {
$value = array();
- foreach(array_keys($_POST) as $key)
- {
+ foreach (array_keys($_POST) as $key) {
if (preg_match('/^_plugins_*/', $key))
array_push($value, $_POST[$key]);
}
diff --git a/program/js/app.js b/program/js/app.js
index 29a53bb26..e818955bd 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -326,10 +326,7 @@ function rcube_webmail()
this.enable_command('download', 'print', true);
// show printing dialog
else if (this.env.action == 'print' && this.env.uid) {
- if (bw.safari)
- setTimeout('window.print()', 10);
- else
- window.print();
+ this.print_dialog();
}
// get unread count for each mailbox
@@ -440,6 +437,9 @@ function rcube_webmail()
if (this.env.action == 'add' || this.env.action == 'edit' || this.env.action == 'search')
this.init_contact_form();
}
+ else if (this.env.action == 'print') {
+ this.print_dialog();
+ }
break;
@@ -1055,12 +1055,9 @@ function rcube_webmail()
url = {};
if (this.task == 'mail') {
- url._mbox = this.env.mailbox;
+ url = {_mbox: this.env.mailbox, _search: this.env.search_request};
if (props)
url._to = props;
- // also send search request so we can go back to search result after message is sent
- if (this.env.search_request)
- url._search = this.env.search_request;
}
// modify url if we're in addressbook
else if (this.task == 'addressbook') {
@@ -1155,7 +1152,7 @@ function rcube_webmail()
case 'reply-list':
case 'reply':
if (uid = this.get_single_uid()) {
- url = {_reply_uid: uid, _mbox: this.get_message_mailbox(uid)};
+ url = {_reply_uid: uid, _mbox: this.get_message_mailbox(uid), _search: this.env.search_request};
if (command == 'reply-all')
// do reply-list, when list is detected and popup menu wasn't used
url._all = (!props && this.env.reply_all_mode == 1 && this.commands['reply-list'] ? 'list' : 'all');
@@ -1179,7 +1176,15 @@ function rcube_webmail()
break;
case 'print':
- if (this.env.action == 'get') {
+ if (this.task == 'addressbook') {
+ if (uid = this.contact_list.get_single_selection()) {
+ url = '&_action=print&_cid=' + uid;
+ if (this.env.source)
+ url += '&_source=' + urlencode(this.env.source);
+ this.open_window(this.env.comm_path + url, true, true);
+ }
+ }
+ else if (this.env.action == 'get') {
this.gui_objects.messagepartframe.contentWindow.print();
}
else if (uid = this.get_single_uid()) {
@@ -1957,7 +1962,7 @@ function rcube_webmail()
// attach events
$.each(fn, function(i, f) {
row[i].onclick = function(e) { f(e); return rcube_event.cancel(e); };
- if (bw.touch) {
+ if (bw.touch && row[i].addEventListener) {
row[i].addEventListener('touchend', function(e) {
if (e.changedTouches.length == 1) {
f(e);
@@ -2487,6 +2492,16 @@ function rcube_webmail()
selection.push(selected[i]);
this.message_list.selection = selection;
+
+ // reset preview frame, if currently previewed message is not selected (has been removed)
+ try {
+ var win = this.get_frame_window(this.env.contentframe),
+ id = win.rcmail.env.uid;
+
+ if (id && $.inArray(id, selection) < 0)
+ this.show_contentframe(false);
+ }
+ catch (e) {};
};
// expand all threads with unread children
@@ -3781,14 +3796,13 @@ function rcube_webmail()
this.set_draft_id = function(id)
{
- var rc;
-
if (id && id != this.env.draft_id) {
- if (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');
- }
+ var filter = {task: 'mail', action: ''},
+ rc = this.opener(false, filter) || this.opener(true, filter);
+
+ // refresh the drafts folder in the opener window
+ if (rc && rc.env.mailbox == this.env.drafts_mailbox)
+ rc.command('checkmail');
this.env.draft_id = id;
$("input[name='_draft_saveid']").val(id);
@@ -3975,7 +3989,6 @@ function rcube_webmail()
this.local_storage_remove_item('compose.index');
};
-
this.change_identity = function(obj, show_sig)
{
if (!obj || !obj.options)
@@ -4344,6 +4357,7 @@ function rcube_webmail()
(this.env.search_request && (this.env.search_scope || 'base') != 'base');
};
+ // action executed after mail is sent
this.sent_successfully = function(type, msg, folders)
{
this.display_message(msg, type);
@@ -4352,11 +4366,13 @@ function rcube_webmail()
if (this.env.extwin) {
this.lock_form(this.gui_objects.messageform);
- var rc = this.opener();
+ var filter = {task: 'mail', action: ''},
+ rc = this.opener(false, filter) || this.opener(true, filter);
+
if (rc) {
rc.display_message(msg, type);
// refresh the folder where sent message was saved or replied message comes from
- if (folders && rc.env.task == 'mail' && rc.env.action == '' && $.inArray(rc.env.mailbox, folders) >= 0) {
+ if (folders && $.inArray(rc.env.mailbox, folders) >= 0) {
rc.command('checkmail');
}
}
@@ -4713,6 +4729,7 @@ function rcube_webmail()
clearTimeout(this.preview_timer);
var n, id, sid, contact, writable = false,
+ selected = list.selection.length,
source = this.env.source ? this.env.address_sources[this.env.source] : null;
// we don't have dblclick handler here, so use 200 instead of this.dblclick_time
@@ -4721,7 +4738,7 @@ function rcube_webmail()
else if (this.env.contentframe)
this.show_contentframe(false);
- if (list.selection.length) {
+ if (selected) {
list.draggable = false;
// no source = search result, we'll need to detect if any of
@@ -4756,11 +4773,12 @@ function rcube_webmail()
// if a group is currently selected, and there is at least one contact selected
// thend we can enable the group-remove-selected command
- this.enable_command('group-remove-selected', this.env.group && list.selection.length > 0 && writable);
- this.enable_command('compose', this.env.group || list.selection.length > 0);
- this.enable_command('export-selected', 'copy', list.selection.length > 0);
+ this.enable_command('group-remove-selected', this.env.group && selected && writable);
+ this.enable_command('compose', this.env.group || selected);
+ this.enable_command('print', selected == 1);
+ this.enable_command('export-selected', 'copy', selected > 0);
this.enable_command('edit', id && writable);
- this.enable_command('delete', 'move', list.selection.length > 0 && writable);
+ this.enable_command('delete', 'move', selected && writable);
return false;
};
@@ -4774,6 +4792,9 @@ function rcube_webmail()
if (!src)
src = this.env.source;
+ if (refresh)
+ group = this.env.group;
+
if (page && this.current_page == page && src == this.env.source && group == this.env.group)
return false;
@@ -4870,8 +4891,8 @@ function rcube_webmail()
this.contact_list.data = {};
this.contact_list.clear(true);
this.show_contentframe(false);
- this.enable_command('delete', 'move', 'copy', false);
- this.enable_command('compose', this.env.group ? true : false);
+ this.enable_command('delete', 'move', 'copy', 'print', false);
+ this.enable_command('compose', this.env.group);
};
this.set_group_prop = function(prop)
@@ -4911,7 +4932,7 @@ function rcube_webmail()
this.contact_list.clear_selection();
this.enable_command('compose', rec && rec.email);
- this.enable_command('export-selected', rec && rec._type != 'group');
+ this.enable_command('export-selected', 'print', rec && rec._type != 'group');
}
else if (framed)
return false;
@@ -5162,10 +5183,10 @@ function rcube_webmail()
dateFormat: this.env.date_format,
changeMonth: true,
changeYear: true,
- yearRange: '-100:+10',
+ yearRange: '-120:+10',
showOtherMonths: true,
- selectOtherMonths: true,
- onSelect: function(dateText) { $(this).focus().val(dateText) }
+ selectOtherMonths: true
+// onSelect: function(dateText) { $(this).focus().val(dateText); }
});
$('input.datepicker').datepicker();
}
@@ -5796,6 +5817,9 @@ function rcube_webmail()
// on the list when dragging starts (and stops), this is slow, but
// I didn't find a method to check droptarget on over event
accept: function(node) {
+ if (!$(node).is('.mailbox'))
+ return false;
+
var source_folder = ref.folder_id2name($(node).attr('id')),
dest_folder = ref.folder_id2name(this.id),
source = ref.env.subscriptionrows[source_folder],
@@ -5816,7 +5840,7 @@ function rcube_webmail()
this.folder_id2name = function(id)
{
- return ref.html_identifier_decode(id.replace(/^rcmli/, ''));
+ return id ? ref.html_identifier_decode(id.replace(/^rcmli/, '')) : null;
};
this.subscription_select = function(id)
@@ -6724,7 +6748,7 @@ function rcube_webmail()
this.set_quota = function(content)
{
if (this.gui_objects.quotadisplay && content && content.type == 'text')
- $(this.gui_objects.quotadisplay).html(content.percent+'%').attr('title', content.title);
+ $(this.gui_objects.quotadisplay).text((content.percent||0) + '%').attr('title', content.title);
this.triggerEvent('setquota', content);
this.env.quota_content = content;
@@ -7351,7 +7375,7 @@ function rcube_webmail()
this.enable_command('compose', (uid && this.contact_list.rows[uid]));
this.enable_command('delete', 'edit', writable);
this.enable_command('export', (this.contact_list && this.contact_list.rowcount > 0));
- this.enable_command('export-selected', false);
+ this.enable_command('export-selected', 'print', false);
}
case 'move':
@@ -7891,12 +7915,24 @@ function rcube_webmail()
};
// get window.opener.rcmail if available
- this.opener = function()
+ this.opener = function(deep, filter)
{
+ var i, win = window.opener;
+
// catch Error: Permission denied to access property rcmail
try {
- if (window.opener && !opener.closed && opener.rcmail)
- return opener.rcmail;
+ if (win && !win.closed) {
+ // try parent of the opener window, e.g. preview frame
+ if (deep && (!win.rcmail || win.rcmail.env.framed) && win.parent && win.parent.rcmail)
+ win = win.parent;
+
+ if (win.rcmail && filter)
+ for (i in filter)
+ if (win.rcmail.env[i] != filter[i])
+ return;
+
+ return win.rcmail;
+ }
}
catch (e) {}
};
@@ -8063,7 +8099,7 @@ function rcube_webmail()
if (plugin && plugin.enabledPlugin)
return 1;
- if (window.ActiveXObject) {
+ if ('ActiveXObject' in window) {
try {
if (plugin = new ActiveXObject("AcroPDF.PDF"))
return 1;
@@ -8096,7 +8132,7 @@ function rcube_webmail()
if (plugin && plugin.enabledPlugin)
return 1;
- if (window.ActiveXObject) {
+ if ('ActiveXObject' in window) {
try {
if (plugin = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"))
return 1;
@@ -8133,15 +8169,16 @@ function rcube_webmail()
// wrapper for localStorage.getItem(key)
this.local_storage_get_item = function(key, deflt, encrypted)
{
- var item;
+ var item, result;
// TODO: add encryption
try {
item = localStorage.getItem(this.get_local_storage_prefix() + key);
+ result = JSON.parse(item);
}
catch (e) { }
- return item !== null ? JSON.parse(item) : (deflt || null);
+ return result || deflt || null;
};
// wrapper for localStorage.setItem(key, data)
@@ -8171,6 +8208,14 @@ function rcube_webmail()
return false;
}
};
+
+ this.print_dialog = function()
+ {
+ if (bw.safari)
+ setTimeout('window.print()', 10);
+ else
+ window.print();
+ };
} // end object rcube_webmail
@@ -8180,7 +8225,7 @@ rcube_webmail.long_subject_title = function(elem, indent)
if (!elem.title) {
var $elem = $(elem);
if ($elem.width() + (indent || 0) * 15 > $elem.parent().width())
- elem.title = $elem.text();
+ elem.title = rcube_webmail.subject_text(elem);
}
};
@@ -8197,10 +8242,17 @@ rcube_webmail.long_subject_title_ex = function(elem)
tmp.remove();
if (w + $('span.branch', $elem).width() * 15 > $elem.width())
- elem.title = txt;
+ elem.title = rcube_webmail.subject_text(elem);
}
};
+rcube_webmail.subject_text = function(elem)
+{
+ var t = $(elem).clone();
+ t.find('.skip-on-drag').remove();
+ return t.text();
+};
+
rcube_webmail.prototype.get_cookie = getCookie;
// copy event engine prototype
diff --git a/program/js/common.js b/program/js/common.js
index 76643068d..2b96a8a30 100644
--- a/program/js/common.js
+++ b/program/js/common.js
@@ -103,7 +103,7 @@ function roundcube_browser()
this.xmlhttp_test = function()
{
var activeX_test = new Function("try{var o=new ActiveXObject('Microsoft.XMLHTTP');return true;}catch(err){return false;}");
- this.xmlhttp = (window.XMLHttpRequest || (window.ActiveXObject && activeX_test()));
+ this.xmlhttp = window.XMLHttpRequest || (('ActiveXObject' in window) && activeX_test());
return this.xmlhttp;
};
diff --git a/program/js/editor.js b/program/js/editor.js
index 2fc3429ab..92165348a 100644
--- a/program/js/editor.js
+++ b/program/js/editor.js
@@ -213,8 +213,10 @@ function rcube_text_editor(config, id)
content = input.val();
// replace current text signature with temp mark
- if (is_sig)
- content = content.replace(signature.text, sig_mark);
+ if (is_sig) {
+ content = content.replace(/\r\n/, "\n");
+ content = content.replace(signature.text.replace(/\r\n/, "\n"), sig_mark);
+ }
var init_editor = function(data) {
// replace signature mark with html version of the signature
diff --git a/program/js/list.js b/program/js/list.js
index dbc14d6b8..9a7f2840e 100644
--- a/program/js/list.js
+++ b/program/js/list.js
@@ -154,7 +154,7 @@ init_row: function(row)
row.onmousedown = function(e){ return self.drag_row(e, this.uid); };
row.onmouseup = function(e){ if (e.which == 1) return self.click_row(e, this.uid); };
- if (bw.touch) {
+ if (bw.touch && row.addEventListener) {
row.addEventListener('touchstart', function(e) {
if (e.touches.length == 1) {
self.touchmoved = false;
@@ -219,7 +219,7 @@ init_header: function()
if (this.column_fixed == r)
continue;
col = this.thead.rows[0].cells[r];
- col.onmousedown = function(e){ return p.drag_column(e, this); };
+ col.onmousedown = function(e) { return p.drag_column(e, this); };
this.colcount++;
}
}
@@ -240,8 +240,8 @@ init_fixed_header: function()
$(this.list).before(this.fixed_header);
var me = this;
- $(window).resize(function(){ me.resize() });
- $(window).scroll(function(){
+ $(window).resize(function() { me.resize(); });
+ $(window).scroll(function() {
var w = $(window);
me.fixed_header.css('marginLeft', (-w.scrollLeft()) + 'px');
if (!bw.webkit)
@@ -270,14 +270,14 @@ resize: function()
var column_widths = [];
// get column widths from original thead
- $(this.tbody).parent().find('thead tr td').each(function(index) {
+ $(this.tbody).parent().find('thead th,thead td').each(function(index) {
column_widths[index] = $(this).width();
});
// apply fixed widths to fixed table header
$(this.thead).parent().width($(this.tbody).parent().width());
- $(this.thead).find('tr td').each(function(index) {
- $(this).css('width', column_widths[index]);
+ $(this.thead).find('th,td').each(function(index) {
+ $(this).width(column_widths[index]);
});
$(window).scroll();
diff --git a/program/lib/Roundcube/bootstrap.php b/program/lib/Roundcube/bootstrap.php
index af87beb24..24c1f86d4 100644
--- a/program/lib/Roundcube/bootstrap.php
+++ b/program/lib/Roundcube/bootstrap.php
@@ -3,7 +3,7 @@
/*
+-----------------------------------------------------------------------+
| This file is part of the Roundcube PHP suite |
- | Copyright (C) 2005-2014, The Roundcube Dev Team |
+ | Copyright (C) 2005-2015, The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@@ -54,7 +54,7 @@ foreach ($config as $optname => $optval) {
}
// framework constants
-define('RCUBE_VERSION', '1.1-git');
+define('RCUBE_VERSION', '1.2-git');
define('RCUBE_CHARSET', 'UTF-8');
if (!defined('RCUBE_LIB_DIR')) {
@@ -490,8 +490,11 @@ function rcube_autoload($classname)
*/
function rcube_pear_error($err)
{
- error_log(sprintf("%s (%s): %s",
- $err->getMessage(),
- $err->getCode(),
- $err->getUserinfo()), 0);
+ $msg = sprintf("ERROR: %s (%s)", $err->getMessage(), $err->getCode());
+
+ if ($info = $err->getUserinfo()) {
+ $msg .= ': ' . $info;
+ }
+
+ error_log($msg, 0);
}
diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php
index 547e2b4ac..3aca88843 100644
--- a/program/lib/Roundcube/rcube.php
+++ b/program/lib/Roundcube/rcube.php
@@ -215,7 +215,10 @@ class rcube
$this->mc_available = 0;
// add all configured hosts to pool
- $pconnect = $this->config->get('memcache_pconnect', true);
+ $pconnect = $this->config->get('memcache_pconnect', true);
+ $timeout = $this->config->get('memcache_timeout', 1);
+ $retry_interval = $this->config->get('memcache_retry_interval', 15);
+
foreach ($this->config->get('memcache_hosts', array()) as $host) {
if (substr($host, 0, 7) != 'unix://') {
list($host, $port) = explode(':', $host);
@@ -226,7 +229,7 @@ class rcube
}
$this->mc_available += intval($this->memcache->addServer(
- $host, $port, $pconnect, 1, 1, 15, false, array($this, 'memcache_failure')));
+ $host, $port, $pconnect, 1, $timeout, $retry_interval, false, array($this, 'memcache_failure')));
}
// test connection and failover (will result in $this->mc_available == 0 on complete failure)
@@ -1706,7 +1709,7 @@ class rcube
if (!$sent) {
self::raise_error(array('code' => 800, 'type' => 'smtp',
'line' => __LINE__, 'file' => __FILE__,
- 'message' => "SMTP error: ".join("\n", $response)), TRUE, FALSE);
+ 'message' => join("\n", $response)), true, false);
}
}
// send mail using PHP's mail() function
diff --git a/program/lib/Roundcube/rcube_config.php b/program/lib/Roundcube/rcube_config.php
index 3fae931d7..89e45449d 100644
--- a/program/lib/Roundcube/rcube_config.php
+++ b/program/lib/Roundcube/rcube_config.php
@@ -233,8 +233,14 @@ class rcube_config
$this->prop['skin'] = self::DEFAULT_SKIN;
// fix paths
- $this->prop['log_dir'] = $this->prop['log_dir'] ? realpath(unslashify($this->prop['log_dir'])) : RCUBE_INSTALL_PATH . 'logs';
- $this->prop['temp_dir'] = $this->prop['temp_dir'] ? realpath(unslashify($this->prop['temp_dir'])) : RCUBE_INSTALL_PATH . 'temp';
+ foreach (array('log_dir' => 'logs', 'temp_dir' => 'temp') as $key => $dir) {
+ foreach (array($this->prop[$key], '../' . $this->prop[$key], RCUBE_INSTALL_PATH . $dir) as $path) {
+ if ($path && ($realpath = realpath(unslashify($path)))) {
+ $this->prop[$key] = $realpath;
+ break;
+ }
+ }
+ }
// fix default imap folders encoding
foreach (array('drafts_mbox', 'junk_mbox', 'sent_mbox', 'trash_mbox') as $folder) {
diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php
index a1fd87442..d17b33f6e 100644
--- a/program/lib/Roundcube/rcube_imap.php
+++ b/program/lib/Roundcube/rcube_imap.php
@@ -3951,7 +3951,13 @@ class rcube_imap extends rcube_storage
// @TODO: Honor MAXSIZE and DEPTH options
foreach ($queries as $attrib => $entry) {
- if ($result = $this->conn->getAnnotation($folder, $entry, $attrib)) {
+ $result = $this->conn->getAnnotation($folder, $entry, $attrib);
+
+ // an error, invalidate any previous getAnnotation() results
+ if (!is_array($result)) {
+ return null;
+ }
+ else {
foreach ($result as $fldr => $data) {
$res[$fldr] = array_merge((array) $res[$fldr], $data);
}
diff --git a/program/lib/Roundcube/rcube_ldap.php b/program/lib/Roundcube/rcube_ldap.php
index 981f2e841..13d55bde6 100644
--- a/program/lib/Roundcube/rcube_ldap.php
+++ b/program/lib/Roundcube/rcube_ldap.php
@@ -117,13 +117,14 @@ class rcube_ldap extends rcube_addressbook
// fieldmap property is given
if (is_array($p['fieldmap'])) {
+ $p['fieldmap'] = array_filter($p['fieldmap']);
foreach ($p['fieldmap'] as $rf => $lf)
$this->fieldmap[$rf] = $this->_attr_name(strtolower($lf));
}
else if (!empty($p)) {
// read deprecated *_field properties to remain backwards compatible
foreach ($p as $prop => $value)
- if (preg_match('/^(.+)_field$/', $prop, $matches))
+ if (!empty($value) && preg_match('/^(.+)_field$/', $prop, $matches))
$this->fieldmap[$matches[1]] = $this->_attr_name(strtolower($value));
}
diff --git a/program/lib/Roundcube/rcube_message.php b/program/lib/Roundcube/rcube_message.php
index 20329a7f1..8af334446 100644
--- a/program/lib/Roundcube/rcube_message.php
+++ b/program/lib/Roundcube/rcube_message.php
@@ -627,8 +627,19 @@ class rcube_message
$p->ctype_secondary = 'plain';
$p->mimetype = 'text/plain';
$p->realtype = 'multipart/encrypted';
+ $p->mime_id = $structure->mime_id;
$this->parts[] = $p;
+
+ // add encrypted payload part as attachment
+ if (is_array($structure->parts)) {
+ for ($i=0; $i < count($structure->parts); $i++) {
+ $subpart = $structure->parts[$i];
+ if ($subpart->mimetype == 'application/octet-stream' || !empty($subpart->filename)) {
+ $this->attachments[] = $subpart;
+ }
+ }
+ }
}
// this is an S/MIME ecrypted message -> create a plaintext body with the according message
else if ($mimetype == 'application/pkcs7-mime') {
@@ -638,8 +649,13 @@ class rcube_message
$p->ctype_secondary = 'plain';
$p->mimetype = 'text/plain';
$p->realtype = 'application/pkcs7-mime';
+ $p->mime_id = $structure->mime_id;
$this->parts[] = $p;
+
+ if (!empty($structure->filename)) {
+ $this->attachments[] = $structure;
+ }
}
// message contains multiple parts
else if (is_array($structure->parts) && !empty($structure->parts)) {
diff --git a/program/lib/Roundcube/rcube_plugin_api.php b/program/lib/Roundcube/rcube_plugin_api.php
index ba5dffefd..8fd3253e0 100644
--- a/program/lib/Roundcube/rcube_plugin_api.php
+++ b/program/lib/Roundcube/rcube_plugin_api.php
@@ -42,47 +42,15 @@ class rcube_plugin_api
public $allowed_session_prefs = array();
public $active_plugins = array();
- protected $plugins = array();
- protected $tasks = array();
- protected $actions = array();
- protected $actionmap = array();
- protected $objectsmap = array();
+ protected $plugins = array();
+ protected $tasks = array();
+ protected $actions = array();
+ protected $actionmap = array();
+ protected $objectsmap = array();
protected $template_contents = array();
- protected $exec_stack = array();
-
- // Deprecated names of hooks, will be removed after 0.5-stable release
- protected $deprecated_hooks = array(
- 'create_user' => 'user_create',
- 'kill_session' => 'session_destroy',
- 'upload_attachment' => 'attachment_upload',
- 'save_attachment' => 'attachment_save',
- 'get_attachment' => 'attachment_get',
- 'cleanup_attachments' => 'attachments_cleanup',
- 'display_attachment' => 'attachment_display',
- 'remove_attachment' => 'attachment_delete',
- 'outgoing_message_headers' => 'message_outgoing_headers',
- 'outgoing_message_body' => 'message_outgoing_body',
- 'address_sources' => 'addressbooks_list',
- 'get_address_book' => 'addressbook_get',
- 'create_contact' => 'contact_create',
- 'save_contact' => 'contact_update',
- 'contact_save' => 'contact_update',
- 'delete_contact' => 'contact_delete',
- 'manage_folders' => 'folders_list',
- 'list_mailboxes' => 'mailboxes_list',
- 'save_preferences' => 'preferences_save',
- 'user_preferences' => 'preferences_list',
- 'list_prefs_sections' => 'preferences_sections_list',
- 'list_identities' => 'identities_list',
- 'create_identity' => 'identity_create',
- 'delete_identity' => 'identity_delete',
- 'save_identity' => 'identity_update',
- 'identity_save' => 'identity_update',
- // to be removed after 0.8
- 'imap_init' => 'storage_init',
- 'mailboxes_list' => 'storage_folders',
- 'imap_connect' => 'storage_connect',
- );
+ protected $exec_stack = array();
+ protected $deprecated_hooks = array();
+
/**
* This implements the 'singleton' design pattern
@@ -243,7 +211,7 @@ class rcube_plugin_api
true, false);
}
}
- elseif ($require) {
+ else if ($require) {
rcube::raise_error(array('code' => 520, 'type' => 'php',
'file' => __FILE__, 'line' => __LINE__,
'message' => "Failed to load plugin file $fn"), true, false);
@@ -274,130 +242,134 @@ class rcube_plugin_api
*/
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',
- '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',
- 'AGPLv3' => 'http://www.gnu.org/licenses/agpl.html',
- 'AGPLv3+' => 'http://www.gnu.org/licenses/agpl.html',
- 'AGPL-3.0' => 'http://www.gnu.org/licenses/agpl.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) . "/$plugin_name/$plugin_name.php";
- $info = false;
-
- if (!class_exists($plugin_name, false)) {
- if (is_readable($fn))
- include($fn);
- else
- return false;
- }
-
- 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 (is_readable($composer) && ($json = @json_decode(file_get_contents($composer), true))) {
- list($info['vendor'], $info['name']) = explode('/', $json['name']);
- $info['version'] = $json['version'];
- $info['license'] = $json['license'];
- $info['uri'] = $json['homepage'];
- $info['require'] = array_filter(array_keys((array)$json['require']), function($pname) {
- if (strpos($pname, '/') == false)
- return false;
- list($vendor, $name) = explode('/', $pname);
- return !($name == 'plugin-installer' || $vendor == 'pear-pear');
- });
- }
-
- // 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;
+ 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',
+ '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',
+ 'AGPLv3' => 'http://www.gnu.org/licenses/agpl.html',
+ 'AGPLv3+' => 'http://www.gnu.org/licenses/agpl.html',
+ 'AGPL-3.0' => 'http://www.gnu.org/licenses/agpl.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) . "/$plugin_name/$plugin_name.php";
+ $info = false;
+
+ if (!class_exists($plugin_name, false)) {
+ if (is_readable($fn)) {
+ include($fn);
+ }
+ else {
+ return false;
+ }
+ }
+
+ 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 (is_readable($composer) && ($json = @json_decode(file_get_contents($composer), true))) {
+ list($info['vendor'], $info['name']) = explode('/', $json['name']);
+ $info['version'] = $json['version'];
+ $info['license'] = $json['license'];
+ $info['uri'] = $json['homepage'];
+ $info['require'] = array_filter(array_keys((array)$json['require']), function($pname) {
+ if (strpos($pname, '/') == false) {
+ return false;
+ }
+ list($vendor, $name) = explode('/', $pname);
+ return !($name == 'plugin-installer' || $vendor == 'pear-pear');
+ });
+ }
+
+ // 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 (is_readable($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");
-
- // 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['require'][] = $dn;
- }
- }
- }
-
- // At least provide the name
- if (!$info && class_exists($plugin_name)) {
- $info = array('name' => $plugin_name, 'version' => '--');
- }
- else if ($info['license'] && empty($info['license_uri']) && ($license_uri = $license_uris[$info['license']])) {
- $info['license_uri'] = $license_uri;
- }
-
- return $info;
+
+ // 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 (is_readable($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");
+
+ // 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['require'][] = $dn;
+ }
+ }
+ }
+
+ // At least provide the name
+ if (!$info && class_exists($plugin_name)) {
+ $info = array('name' => $plugin_name, 'version' => '--');
+ }
+ else if ($info['license'] && empty($info['license_uri']) && ($license_uri = $license_uris[$info['license']])) {
+ $info['license_uri'] = $license_uri;
+ }
+
+ return $info;
}
/**
@@ -433,9 +405,11 @@ class rcube_plugin_api
*/
public function unregister_hook($hook, $callback)
{
- $callback_id = array_search($callback, $this->handlers[$hook]);
+ $callback_id = array_search($callback, (array) $this->handlers[$hook]);
if ($callback_id !== false) {
- unset($this->handlers[$hook][$callback_id]);
+ // array_splice() removes the element and re-indexes keys
+ // that is required by the 'for' loop in exec_hook() below
+ array_splice($this->handlers[$hook], $callback_id, 1);
}
}
@@ -454,13 +428,14 @@ class rcube_plugin_api
$args = array('arg' => $args);
}
- // TODO: avoid recusion by checking in_array($hook, $this->exec_stack) ?
+ // TODO: avoid recursion by checking in_array($hook, $this->exec_stack) ?
$args += array('abort' => false);
array_push($this->exec_stack, $hook);
- foreach ((array)$this->handlers[$hook] as $callback) {
- $ret = call_user_func($callback, $args);
+ // Use for loop here, so handlers added in the hook will be executed too
+ for ($i = 0; $i < count($this->handlers[$hook]); $i++) {
+ $ret = call_user_func($this->handlers[$hook][$i], $args);
if ($ret && is_array($ret)) {
$args = $ret + $args;
}
diff --git a/program/lib/Roundcube/rcube_smtp.php b/program/lib/Roundcube/rcube_smtp.php
index 70f15dc7b..c3a51467b 100644
--- a/program/lib/Roundcube/rcube_smtp.php
+++ b/program/lib/Roundcube/rcube_smtp.php
@@ -243,8 +243,9 @@ class rcube_smtp
if (PEAR::isError($this->conn->mailFrom($from, $from_params))) {
$err = $this->conn->getResponse();
$this->error = array('label' => 'smtpfromerror', 'vars' => array(
- 'from' => $from, 'code' => $this->conn->_code, 'msg' => $err[1]));
- $this->response[] = "Failed to set sender '$from'";
+ 'from' => $from, 'code' => $err[0], 'msg' => $err[1]));
+ $this->response[] = "Failed to set sender '$from'. "
+ . $err[1] . ' (Code: ' . $err[0] . ')';
$this->reset();
return false;
}
@@ -262,8 +263,9 @@ class rcube_smtp
if (PEAR::isError($this->conn->rcptTo($recipient, $recipient_params))) {
$err = $this->conn->getResponse();
$this->error = array('label' => 'smtptoerror', 'vars' => array(
- 'to' => $recipient, 'code' => $this->conn->_code, 'msg' => $err[1]));
- $this->response[] = "Failed to add recipient '$recipient'";
+ 'to' => $recipient, 'code' => $err[0], 'msg' => $err[1]));
+ $this->response[] = "Failed to add recipient '$recipient'. "
+ . $err[1] . ' (Code: ' . $err[0] . ')';
$this->reset();
return false;
}
@@ -286,7 +288,7 @@ class rcube_smtp
}
// Send the message's headers and the body as SMTP data.
- if (PEAR::isError($result = $this->conn->data($data, $text_headers))) {
+ if (PEAR::isError($this->conn->data($data, $text_headers))) {
$err = $this->conn->getResponse();
if (!in_array($err[0], array(354, 250, 221))) {
$msg = sprintf('[%d] %s', $err[0], $err[1]);
@@ -296,7 +298,7 @@ class rcube_smtp
}
$this->error = array('label' => 'smtperror', 'vars' => array('msg' => $msg));
- $this->response[] = "Failed to send data";
+ $this->response[] = "Failed to send data. " . $msg;
$this->reset();
return false;
}
diff --git a/program/lib/Roundcube/rcube_washtml.php b/program/lib/Roundcube/rcube_washtml.php
index 4bf189e99..e0cce685b 100644
--- a/program/lib/Roundcube/rcube_washtml.php
+++ b/program/lib/Roundcube/rcube_washtml.php
@@ -244,8 +244,8 @@ class rcube_washtml
$t .= ' ' . $key . '="' . htmlspecialchars($value, ENT_QUOTES) . '"';
}
else if ($key == 'style' && ($style = $this->wash_style($value))) {
- $quot = strpos($style, '"') !== false ? "'" : '"';
- $t .= ' style=' . $quot . $style . $quot;
+ // replace double quotes to prevent syntax error and XSS issues (#1490227)
+ $t .= ' style="' . str_replace('"', '&quot;', $style) . '"';
}
else if ($key == 'background'
|| ($key == 'src' && preg_match('/^(img|source)$/i', $node->tagName))
diff --git a/program/localization/bn_BD/labels.inc b/program/localization/bn_BD/labels.inc
index e8572cfa8..edfbaca56 100644
--- a/program/localization/bn_BD/labels.inc
+++ b/program/localization/bn_BD/labels.inc
@@ -208,7 +208,6 @@ $labels['mailboxview'] = 'মেইলবক্স দেখার কায়দ
$labels['mdnrequests'] = 'প্রেরক নোটিশ পাঠালে কি করা হবে?';
$labels['askuser'] = 'আমি গ্রাহক, আমাকে জিজ্ঞাসা করুন';
$labels['autosend'] = 'কম্পুটার নিজেনিজি ফিরতি নোটিশ পাঠায় দেবে';
-$labels['ignore'] = 'পাত্তা দেওয়া হবেনা';
$labels['readwhendeleted'] = 'ফেলে দেবার সময় মেইল/চিঠি পড়া হয়ে গেছে হিসাবে ধরে নেওয়া হবে';
$labels['flagfordeletion'] = 'একেবারেই ফেলে না দিয়ে মেইল/চিঠি গুলোকে দাগিয়ে রাখুন ফেলে দেবার জন্যে';
$labels['skipdeleted'] = 'ফেলে দেওয়া মেইল/চিঠি দেখানোর দরকার নেই';
diff --git a/program/localization/bs_BA/labels.inc b/program/localization/bs_BA/labels.inc
index 6c983fabc..40308480f 100644
--- a/program/localization/bs_BA/labels.inc
+++ b/program/localization/bs_BA/labels.inc
@@ -221,6 +221,7 @@ $labels['resumeediting'] = 'Nastavi uređivanje';
$labels['revertto'] = 'Vrati na';
$labels['restore'] = 'Vrati';
$labels['restoremessage'] = 'Vratiti poruku?';
+$labels['ignore'] = 'Zanemari';
$labels['responses'] = 'Odgovori';
$labels['insertresponse'] = 'Umetni odgovor';
$labels['manageresponses'] = 'Upravljaj odgovorima';
@@ -406,7 +407,7 @@ $labels['askuser'] = 'pitaj korisnika';
$labels['autosend'] = 'pošalji povratnicu';
$labels['autosendknown'] = 'pošalji povratnicu mojim kontaktima, u suprotnom me pitaj';
$labels['autosendknownignore'] = 'pošalji povratnicu mojim kontaktima, u suprotnom zanemari';
-$labels['ignore'] = 'zanemari';
+$labels['ignorerequest'] = 'Zanemari zahtjev';
$labels['readwhendeleted'] = 'Označi poruku kao pročitanu pri brisanju';
$labels['flagfordeletion'] = 'Označi poruku za brisanje umjesto brisanja';
$labels['skipdeleted'] = 'Ne prikazuj obrisane poruke';
diff --git a/program/localization/cs_CZ/messages.inc b/program/localization/cs_CZ/messages.inc
index 3d491e427..79946513f 100644
--- a/program/localization/cs_CZ/messages.inc
+++ b/program/localization/cs_CZ/messages.inc
@@ -98,7 +98,7 @@ $messages['stillsearching'] = 'Stále vyhledávám...';
$messages['nospellerrors'] = 'Nebyly nalezeny žádné chyby';
$messages['folderdeleted'] = 'Složka byla úspěšně vymazána';
$messages['foldersubscribed'] = 'Složka byla úspěšně připojena';
-$messages['folderunsubscribed'] = 'Slažka byla úspěšně odpojena';
+$messages['folderunsubscribed'] = 'Složka byla úspěšně odpojena';
$messages['folderpurged'] = 'Složka byla úspěšně vyprázdněna';
$messages['folderexpunged'] = 'Složka byla úspěšně zkomprimována';
$messages['deletedsuccessfully'] = 'Úspěšně smazáno';
diff --git a/program/localization/de_CH/labels.inc b/program/localization/de_CH/labels.inc
index c9183f84d..e80fe91fc 100644
--- a/program/localization/de_CH/labels.inc
+++ b/program/localization/de_CH/labels.inc
@@ -221,6 +221,7 @@ $labels['resumeediting'] = 'Bearbeitung fortsetzen';
$labels['revertto'] = 'Zurück zu';
$labels['restore'] = 'Wiederherstellen';
$labels['restoremessage'] = 'Nachricht wiederherstellen?';
+$labels['ignore'] = 'Ignorieren';
$labels['responses'] = 'Antworten';
$labels['insertresponse'] = 'Antwort einfügen';
$labels['manageresponses'] = 'Antworten verwalten';
@@ -406,7 +407,7 @@ $labels['askuser'] = 'immer fragen';
$labels['autosend'] = 'automatisch senden';
$labels['autosendknown'] = 'für bekannte Absender, sonst fragen';
$labels['autosendknownignore'] = 'für bekannte Absender, sonst ignorieren';
-$labels['ignore'] = 'ignorieren';
+$labels['ignorerequest'] = 'Anfrage ignorieren';
$labels['readwhendeleted'] = 'Beim Löschen als gelesen markieren';
$labels['flagfordeletion'] = 'Als gelöscht markieren anstatt in den Papierkorb verschieben';
$labels['skipdeleted'] = 'Zeige keine gelöschten Nachrichten an';
diff --git a/program/localization/el_GR/labels.inc b/program/localization/el_GR/labels.inc
index eb3023daa..ecd9397d0 100644
--- a/program/localization/el_GR/labels.inc
+++ b/program/localization/el_GR/labels.inc
@@ -131,12 +131,18 @@ $labels['moreactions'] = 'Περισσότερες ενέργειες...';
$labels['more'] = 'Περισσότερα';
$labels['back'] = 'Επιστροφή';
$labels['options'] = 'Επιλογές';
+$labels['first'] = 'Πρώτο';
+$labels['last'] = 'Τελευταίο';
+$labels['previous'] = 'Προηγούμενο';
+$labels['next'] = 'Επόμενο';
$labels['select'] = 'Επιλέξτε';
$labels['all'] = 'Όλα';
$labels['none'] = 'Κανένα';
$labels['currpage'] = 'Τρέχουσα σελίδα';
+$labels['isread'] = 'Αναγνωσμένο';
$labels['unread'] = 'Μη αναγνωσμένο';
$labels['flagged'] = 'Σημειωμένο';
+$labels['unflagged'] = 'Μη σημειωμένο';
$labels['unanswered'] = 'Αναπάντητο';
$labels['withattachment'] = 'Με επισύναψη';
$labels['deleted'] = 'Διεγραμμένο';
@@ -214,6 +220,7 @@ $labels['resumeediting'] = 'Συνέχεια επεξεργασίας';
$labels['revertto'] = 'Επαναφορά στο';
$labels['restore'] = 'Επαναφορά';
$labels['restoremessage'] = 'Επαναφορά μηνύματος;';
+$labels['ignore'] = 'Παράβλεψη';
$labels['responses'] = 'Απαντήσεις';
$labels['insertresponse'] = 'Εισάγετε μια απάντηση';
$labels['manageresponses'] = 'Διαχείριση απαντήσεων';
@@ -399,7 +406,7 @@ $labels['askuser'] = 'ρώτησέ με';
$labels['autosend'] = 'στείλε αυτόματα την απόδειξη παραλαβής';
$labels['autosendknown'] = 'στείλε αυτόματα αποδείξεις παραλαβής σε όσους έχω στις επαφές, για τους άλλους ρώτα με';
$labels['autosendknownignore'] = 'στείλε αυτόματα αποδείξεις παραλαβής σε όσους έχω στις επαφές, για τους άλλους καμιά ενέργεια';
-$labels['ignore'] = 'αγνόησε';
+$labels['ignorerequest'] = 'παράβλεψη αιτήματος';
$labels['readwhendeleted'] = 'Κατά τη διαγραφή του μηνύματος, μαρκάρισέ το σαν αναγνωσμένο';
$labels['flagfordeletion'] = 'Αντί να το διαγράψεις, απλά και μόνο σημείωσέ το';
$labels['skipdeleted'] = 'Να μην εμφανίζονται τα διαγραμμένα μηνύματα';
@@ -529,6 +536,7 @@ $labels['arialabelmessagessearchfilter'] = 'Φίλτρο λίστας αλληλ
$labels['arialabelmailsearchform'] = 'Φόρμα αναζήτησης μηνύματος e-mail';
$labels['arialabelcontactsearchform'] = 'Φόρμα αναζήτησης επαφών';
$labels['arialabelmailquicksearchbox'] = 'Πεδίο αναζήτησης e-mail';
+$labels['arialabelquicksearchbox'] = 'Αναζήτηση εισόδου';
$labels['arialabelfoldersearchfilter'] = 'Φίλτρο λίστας φακέλων';
$labels['arialabelfoldersearchform'] = 'Φόρμα αναζήτησης φακέλων';
$labels['arialabelfolderlist'] = 'Επιλογή καταλόγου e-mail';
diff --git a/program/localization/en_US/csv2vcard.inc b/program/localization/en_US/csv2vcard.inc
index a2a0c3f9d..67a1757d6 100644
--- a/program/localization/en_US/csv2vcard.inc
+++ b/program/localization/en_US/csv2vcard.inc
@@ -5,7 +5,7 @@
| localization/<lang>/csv2vcard.inc |
| |
| Localization file of the Roundcube Webmail client |
- | Copyright (C) 2005-2013, The Roundcube Dev Team |
+ | Copyright (C) 2005-2015, The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc
index 482c18570..fac52ba1e 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -5,7 +5,7 @@
| localization/<lang>/labels.inc |
| |
| Localization file of the Roundcube Webmail client |
- | Copyright (C) 2005-2013, The Roundcube Dev Team |
+ | Copyright (C) 2005-2015, The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
@@ -343,6 +343,7 @@ $labels['searchresult'] = 'Search result';
$labels['advsearch'] = 'Advanced Search';
$labels['advanced'] = 'Advanced';
$labels['other'] = 'Other';
+$labels['printcontact'] = 'Print contact';
$labels['typehome'] = 'Home';
$labels['typework'] = 'Work';
diff --git a/program/localization/en_US/messages.inc b/program/localization/en_US/messages.inc
index d4fbd6148..e5b368f22 100644
--- a/program/localization/en_US/messages.inc
+++ b/program/localization/en_US/messages.inc
@@ -5,7 +5,7 @@
| localization/<lang>/messages.inc |
| |
| Localization file of the Roundcube Webmail client |
- | Copyright (C) 2005-2014, The Roundcube Dev Team |
+ | Copyright (C) 2005-2015, The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
diff --git a/program/localization/es_ES/labels.inc b/program/localization/es_ES/labels.inc
index 09866900f..fbf677b7c 100644
--- a/program/localization/es_ES/labels.inc
+++ b/program/localization/es_ES/labels.inc
@@ -31,7 +31,7 @@ $labels['trash'] = 'Papelera';
$labels['junk'] = 'SPAM';
$labels['show_real_foldernames'] = 'Mostrar nombres reales para carpetas especiales';
$labels['subject'] = 'Asunto';
-$labels['from'] = 'Remitente';
+$labels['from'] = 'De';
$labels['sender'] = 'Remitente';
$labels['to'] = 'Destinatario';
$labels['cc'] = 'Cc';
@@ -43,7 +43,7 @@ $labels['size'] = 'Tamaño';
$labels['priority'] = 'Prioridad';
$labels['organization'] = 'Organización';
$labels['readstatus'] = 'Estado de lectura';
-$labels['listoptions'] = 'Opciones de listado';
+$labels['listoptions'] = 'Opciones de listado...';
$labels['mailboxlist'] = 'Carpetas';
$labels['messagesfromto'] = 'Mensajes $from a $to de $count';
$labels['threadsfromto'] = 'Hilos $from a $to de $count';
@@ -105,11 +105,11 @@ $labels['compose'] = 'Redactar';
$labels['writenewmessage'] = 'Crear un mensaje nuevo';
$labels['reply'] = 'Responder';
$labels['replytomessage'] = 'Responder al remitente';
-$labels['replytoallmessage'] = 'Responder al emisor y a todos los destinatarios';
-$labels['replyall'] = 'Responder a la lista o al remitente y a todos los destinatarios';
+$labels['replytoallmessage'] = 'Responder a la lista o al remitente y a todos los destinatarios';
+$labels['replyall'] = 'Responder a todos';
$labels['replylist'] = 'Responder a la lista';
$labels['forward'] = 'Reenviar';
-$labels['forwardinline'] = 'Reenviar directamente';
+$labels['forwardinline'] = 'Reenviar entre-líneas';
$labels['forwardattachment'] = 'Reenviar como adjunto';
$labels['forwardmessage'] = 'Reenviar mensaje';
$labels['deletemessage'] = 'Eliminar mensaje';
@@ -125,8 +125,8 @@ $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['markflagged'] = 'Como resaltado';
+$labels['markunflagged'] = 'Como no resaltado';
$labels['moreactions'] = 'Más acciones…';
$labels['more'] = 'Más';
$labels['back'] = 'Volver';
@@ -135,15 +135,15 @@ $labels['first'] = 'Primero';
$labels['last'] = 'Último';
$labels['previous'] = 'Anterior';
$labels['next'] = 'Siguiente';
-$labels['select'] = 'Elija';
+$labels['select'] = 'Seleccionar';
$labels['all'] = 'Todos';
$labels['none'] = 'Ninguno';
$labels['currpage'] = 'Página actual';
$labels['isread'] = 'Leído';
-$labels['unread'] = 'Sin leer';
-$labels['flagged'] = 'Marcado';
-$labels['unflagged'] = 'No marcado';
-$labels['unanswered'] = 'Sin respuesta';
+$labels['unread'] = 'No leído';
+$labels['flagged'] = 'Resaltado';
+$labels['unflagged'] = 'No Resaltado';
+$labels['unanswered'] = 'Sin contestar';
$labels['withattachment'] = 'Con adjunto';
$labels['deleted'] = 'Eliminado';
$labels['undeleted'] = 'No eliminado';
@@ -161,7 +161,7 @@ $labels['autoexpand_threads'] = 'Expandir hilos de mensajes';
$labels['do_expand'] = 'todos los hilos';
$labels['expand_only_unread'] = 'solo con mensajes no leídos';
$labels['fromto'] = 'De/A';
-$labels['flag'] = 'Marca';
+$labels['flag'] = 'Resaltar';
$labels['attachment'] = 'Adjunto';
$labels['nonesort'] = 'Ninguno';
$labels['sentdate'] = 'Fecha de envío';
@@ -169,8 +169,8 @@ $labels['arrival'] = 'Fecha de llegada';
$labels['asc'] = 'ascendente';
$labels['desc'] = 'descendente';
$labels['listcolumns'] = 'Listar columnas';
-$labels['listsorting'] = 'Columna de listado';
-$labels['listorder'] = 'Orden de listado';
+$labels['listsorting'] = 'Columna de ordenación';
+$labels['listorder'] = 'Criterio de ordenación';
$labels['listmode'] = 'Modo de vista de lista';
$labels['folderactions'] = 'Acciones de carpeta...';
$labels['compact'] = 'Compactar';
@@ -197,7 +197,7 @@ $labels['subfolders'] = 'Ésta y subcarpetas';
$labels['allfolders'] = 'Todas las carpetas';
$labels['openinextwin'] = 'Abrir en nueva ventana';
$labels['emlsave'] = 'Descargar (.eml)';
-$labels['changeformattext'] = 'Mostrar en formato de texto sencillo';
+$labels['changeformattext'] = 'Mostrar en formato de texto simple';
$labels['changeformathtml'] = 'Mostrar en formato HTML';
$labels['editasnew'] = 'Editar como nuevo';
$labels['send'] = 'Enviar';
@@ -206,18 +206,18 @@ $labels['savemessage'] = 'Guardar como borrador';
$labels['addattachment'] = 'Adjuntar un archivo';
$labels['charset'] = 'Codificación';
$labels['editortype'] = 'Tipo de editor';
-$labels['returnreceipt'] = 'Acuse de recibo';
+$labels['returnreceipt'] = 'Confirmación de recibo';
$labels['dsn'] = 'Notificación de estado de la entrega';
$labels['mailreplyintro'] = 'El $date, $sender escribió:';
-$labels['originalmessage'] = 'Mensaje original';
-$labels['selectimage'] = 'Elegir una imagen';
-$labels['addimage'] = 'Añadir una imagen';
+$labels['originalmessage'] = 'Mensaje Original';
+$labels['selectimage'] = 'Seleccionar imagen';
+$labels['addimage'] = 'Añadir imagen';
$labels['selectmedia'] = 'Seleccionar película';
$labels['addmedia'] = 'Añadir película';
$labels['editidents'] = 'Editar identidades';
$labels['spellcheck'] = 'Corrector ortográfico';
$labels['checkspelling'] = 'Revisar ortografía';
-$labels['resumeediting'] = 'Segui editando';
+$labels['resumeediting'] = 'Reanudar edición';
$labels['revertto'] = 'Revertir a';
$labels['restore'] = 'Restaurar';
$labels['restoremessage'] = '¿Restaurar el mensaje?';
@@ -233,23 +233,23 @@ $labels['responsename'] = 'Nombre';
$labels['responsetext'] = 'Texto de respuesta';
$labels['attach'] = 'Adjuntar';
$labels['attachments'] = 'Adjuntos';
-$labels['upload'] = 'Subir';
+$labels['upload'] = 'Cargar';
$labels['uploadprogress'] = '$percent ($current de $total)';
$labels['close'] = 'Cerrar';
$labels['messageoptions'] = 'Opciones de mensaje...';
$labels['togglecomposeoptions'] = 'Mostrar opciones de escritura';
-$labels['low'] = 'Bajo';
-$labels['lowest'] = 'El más bajo';
+$labels['low'] = 'Baja';
+$labels['lowest'] = 'La más baja';
$labels['normal'] = 'Normal';
-$labels['high'] = 'Alto';
-$labels['highest'] = 'El más alto';
+$labels['high'] = 'Alta';
+$labels['highest'] = 'La más alta';
$labels['nosubject'] = '(sin asunto)';
$labels['showimages'] = 'Mostrar imágenes';
-$labels['alwaysshow'] = 'Mostrar siempre imágenes de $sender';
-$labels['isdraft'] = 'Esto es un borrador';
+$labels['alwaysshow'] = 'Siempre mostrar imágenes de $sender';
+$labels['isdraft'] = 'Este es un mensaje de borrador.';
$labels['andnmore'] = '$nr más…';
$labels['togglemoreheaders'] = 'Mostrar más encabezados del mensaje';
-$labels['togglefullheaders'] = 'Mostrar u ocultar encabezados de mensajes';
+$labels['togglefullheaders'] = 'Desplegar u ocultar encabezados de mensajes';
$labels['htmltoggle'] = 'HTML';
$labels['plaintoggle'] = 'Sólo texto';
$labels['savesentmessagein'] = 'Guardar mensaje enviado en';
@@ -259,22 +259,22 @@ $labels['addcc'] = 'Añadir Cc';
$labels['addbcc'] = 'Añadir Cco';
$labels['addreplyto'] = 'Añadir Responder a';
$labels['addfollowupto'] = 'Añadir Seguir a';
-$labels['mdnrequest'] = 'El emisor de este mensaje desea ser notificado cuando usted lo lea. ¿Quiere enviar esta notificación?';
-$labels['receiptread'] = 'Devolver un acuse de recibo';
+$labels['mdnrequest'] = 'El remitente de este mensaje desea ser notificado cuando usted lo lea. ¿Desea enviar esta notificación?';
+$labels['receiptread'] = 'Devolver recibo de confirmación (lectura)';
$labels['yourmessage'] = 'Esto es un acuse de recibo de su mensaje';
-$labels['receiptnote'] = 'Nota: Esta notificación sólo significa que su mensaje fue abierto en el ordenador del destinatario. Eso no garantiza que el destinatario haya leído o entendido el contenido del mensaje.';
-$labels['name'] = 'Nombre para mostrar';
+$labels['receiptnote'] = 'Nota: Esta notificación sólo confirma que su mensaje fue abierto en el ordenador del destinatario. Eso no garantiza que el destinatario haya leído o entendido el contenido del mensaje.';
+$labels['name'] = 'Nombre de visualización';
$labels['firstname'] = 'Nombre';
$labels['surname'] = 'Apellido';
$labels['middlename'] = 'Segundo nombre';
$labels['nameprefix'] = 'Prefijo';
$labels['namesuffix'] = 'Sufijo';
$labels['nickname'] = 'Alias';
-$labels['jobtitle'] = 'Cargo';
+$labels['jobtitle'] = 'Título Profesional';
$labels['department'] = 'Departamento';
$labels['gender'] = 'Sexo';
$labels['maidenname'] = 'Apellido de soltera';
-$labels['email'] = 'Correo';
+$labels['email'] = 'Correo electrónico';
$labels['phone'] = 'Teléfono';
$labels['address'] = 'Dirección';
$labels['street'] = 'Calle';
@@ -283,12 +283,12 @@ $labels['zipcode'] = 'Código postal';
$labels['region'] = 'Provincia';
$labels['country'] = 'País';
$labels['birthday'] = 'Cumpleaños';
-$labels['anniversary'] = 'Santo';
+$labels['anniversary'] = 'Aniversario';
$labels['website'] = 'Página web';
$labels['instantmessenger'] = 'Mensajería instantánea';
$labels['notes'] = 'Notas';
-$labels['male'] = 'hombre';
-$labels['female'] = 'mujer';
+$labels['male'] = 'masculino';
+$labels['female'] = 'femenino';
$labels['manager'] = 'Director';
$labels['assistant'] = 'Auxiliar';
$labels['spouse'] = 'Cónyuge';
@@ -305,11 +305,11 @@ $labels['typemobile'] = 'Móvil';
$labels['typemain'] = 'Principal';
$labels['typehomefax'] = 'Fax de casa';
$labels['typeworkfax'] = 'Fax del trabajo';
-$labels['typecar'] = 'Coche';
-$labels['typepager'] = 'Busca';
+$labels['typecar'] = 'Automóvil';
+$labels['typepager'] = 'Paginador';
$labels['typevideo'] = 'Vídeo';
$labels['typeassistant'] = 'Auxiliar';
-$labels['typehomepage'] = 'Inicio';
+$labels['typehomepage'] = 'Página Principal';
$labels['typeblog'] = 'Blog';
$labels['typeprofile'] = 'Perfil';
$labels['addfield'] = 'Añadir campo...';
@@ -335,7 +335,7 @@ $labels['contactsfromto'] = 'Contactos $from a $to de $count';
$labels['print'] = 'Imprimir';
$labels['export'] = 'Exportar';
$labels['exportall'] = 'Exportar todo';
-$labels['exportsel'] = 'Exportar lo seleccionado';
+$labels['exportsel'] = 'Exportar seleccionados';
$labels['exportvcards'] = 'Exportar contactos en formato vCard';
$labels['newgroup'] = 'Crear nuevo grupo';
$labels['addgroup'] = 'Añadir grupo';
@@ -370,48 +370,48 @@ $labels['userpreferences'] = 'Preferencias de usuario';
$labels['editpreferences'] = 'Editar preferencias de usuario';
$labels['identities'] = 'Identidades';
$labels['manageidentities'] = 'Administrar identidades';
-$labels['newidentity'] = 'Create new identity';
+$labels['newidentity'] = 'Crear nueva identidad';
$labels['addidentity'] = 'Añadir identidad';
$labels['editidentity'] = 'Editar identidad';
$labels['preferhtml'] = 'Mostrar HTML';
-$labels['defaultcharset'] = 'Juego de caracteres predeterminado';
+$labels['defaultcharset'] = 'Conjunto de caracteres predeterminado';
$labels['htmlmessage'] = 'Mensaje HTML';
$labels['messagepart'] = 'Parte';
$labels['digitalsig'] = 'Firma digital';
$labels['dateformat'] = 'Formato de fecha';
$labels['timeformat'] = 'Formato de hora';
-$labels['prettydate'] = 'Fecha detallada';
-$labels['setdefault'] = 'Seleccionar opción predeterminada';
+$labels['prettydate'] = 'Fechas detalladas';
+$labels['setdefault'] = 'Establecer como predeterminado';
$labels['autodetect'] = 'Automático';
$labels['language'] = 'Idioma';
$labels['timezone'] = 'Zona horaria';
$labels['pagesize'] = 'Filas por página';
$labels['signature'] = 'Firma';
-$labels['dstactive'] = 'Cambio de horario';
+$labels['dstactive'] = 'Horario de verano';
$labels['showinextwin'] = 'Abrir mensaje en una ventana nueva';
$labels['composeextwin'] = 'Redactar en una ventana nueva';
-$labels['htmleditor'] = 'Componer mensaje en HTML';
-$labels['htmlonreply'] = 'en respuesta a un mensaje HTML';
-$labels['htmlonreplyandforward'] = 'en reenvío o respuesta al mensaje HTML';
+$labels['htmleditor'] = 'Componer mensajes HTML';
+$labels['htmlonreply'] = 'en respuesta a mensaje HTML';
+$labels['htmlonreplyandforward'] = 'en reenvío o respuesta a mensaje HTML';
$labels['htmlsignature'] = 'Firma HTML';
-$labels['showemail'] = 'Mostrar dirección de correo electrónico con nombre';
-$labels['previewpane'] = 'Mostrar vista preliminar';
+$labels['showemail'] = 'Mostrar dirección electrónica con el nombre de visualización';
+$labels['previewpane'] = 'Mostrar panel de vista previa';
$labels['skin'] = 'Apariencia de la interfaz';
-$labels['logoutclear'] = 'Vaciar papelera al cerrar sesión';
-$labels['logoutcompact'] = 'Compactar la bandeja de entrada al cerrar sesión';
-$labels['uisettings'] = 'Interfaz de usuario';
+$labels['logoutclear'] = 'Vaciar Papelera al cerrar sesión';
+$labels['logoutcompact'] = 'Compactar Bandeja de Entrada al cerrar sesión';
+$labels['uisettings'] = 'Interfaz de Usuario';
$labels['serversettings'] = 'Configuración del servidor';
-$labels['mailboxview'] = 'Vista de buzón';
-$labels['mdnrequests'] = 'Cuando se pida acuse de recibo';
+$labels['mailboxview'] = 'Vista de Buzón';
+$labels['mdnrequests'] = 'Cuando se solicite confirmación de recibo';
$labels['askuser'] = 'preguntarme';
-$labels['autosend'] = 'enviar acuse de recibo';
-$labels['autosendknown'] = 'enviar acuse de recibo a mis contactos, con los demás preguntarme';
-$labels['autosendknownignore'] = 'enviar acuse de recibo a mis contactos, no a los demás';
-$labels['ignorerequest'] = 'Ignorar la petición';
+$labels['autosend'] = 'enviar confirmación de recibo';
+$labels['autosendknown'] = 'enviar confirmación de recibo a mis contactos, preguntar por los demás';
+$labels['autosendknownignore'] = 'enviar confirmación de recibo a mis contactos, ignorar los demás';
+$labels['ignorerequest'] = 'Ignorar petición';
$labels['readwhendeleted'] = 'Marcar el mensaje como leído al borrarlo';
$labels['flagfordeletion'] = 'Marcar el mensaje para borrarse en vez de borrarlo';
$labels['skipdeleted'] = 'No mostrar mensajes borrados';
-$labels['deletealways'] = 'Cuando falle trasladar los mensajes a la papelera, borrarlos';
+$labels['deletealways'] = 'Si mover mensajes a la Papelera fracasa, borrarlos';
$labels['deletejunk'] = 'Directamente eliminar mensajes en SPAM';
$labels['showremoteimages'] = 'Mostrar las imágenes externas';
$labels['fromknownsenders'] = 'de remitentes conocidos';
@@ -422,45 +422,45 @@ $labels['everynminutes'] = 'cada $n minuto(s)';
$labels['refreshinterval'] = 'Actualizar (comprobar mensajes nuevos, etc.)';
$labels['never'] = 'nunca';
$labels['immediately'] = 'inmediatamente';
-$labels['messagesdisplaying'] = 'Vista de mensajes';
-$labels['messagescomposition'] = 'Composición de mensajes';
+$labels['messagesdisplaying'] = 'Vista de Mensajes';
+$labels['messagescomposition'] = 'Composición de Mensajes';
$labels['mimeparamfolding'] = 'Nombres de archivos adjuntos';
$labels['2231folding'] = 'RFC 2231 (Thunderbird)';
$labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
$labels['2047folding'] = 'RFC 2047 (otro)';
$labels['force7bit'] = 'Usar codificación MIME para caracteres de 8 bits';
-$labels['savelocalstorage'] = "Guardar (temporalmente) en el almacén local del navegador";
+$labels['savelocalstorage'] = "Guardar (temporalmente) en el almacenamiento local del navegador";
$labels['advancedoptions'] = 'Opciones avanzadas';
-$labels['toggleadvancedoptions'] = 'Mostrar opciones avanzadas';
-$labels['focusonnewmessage'] = 'Activar la ventana del navegador si hay un mensaje nuevo';
-$labels['checkallfolders'] = 'Comprobar en todas las bandejas si hay mensajes nuevos';
+$labels['toggleadvancedoptions'] = 'Desplegar opciones avanzadas';
+$labels['focusonnewmessage'] = 'Enfocar ventana del navegador al recibir nuevo mensaje';
+$labels['checkallfolders'] = 'Revisar todas las carpetas por nuevos mensajes';
$labels['displaynext'] = 'Después de borrar/mover un mensaje, mostrar el siguiente';
-$labels['defaultfont'] = 'Tipo de letra predeterminada del mensaje HTML';
-$labels['mainoptions'] = 'Opciones principales';
+$labels['defaultfont'] = 'Tipo de letra predeterminada de mensaje HTML';
+$labels['mainoptions'] = 'Opciones Principales';
$labels['browseroptions'] = 'Opciones del Navegador';
$labels['section'] = 'Sección';
$labels['maintenance'] = 'Mantenimiento';
-$labels['newmessage'] = 'Nuevo mensaje';
-$labels['signatureoptions'] = 'Opciones de firma';
+$labels['newmessage'] = 'Nuevo Mensaje';
+$labels['signatureoptions'] = 'Opciones de Firma';
$labels['whenreplying'] = 'Al responder';
$labels['replyempty'] = 'no citar el mensaje original';
-$labels['replytopposting'] = 'empezar un mensaje nuevo encima del original';
-$labels['replybottomposting'] = 'empezar un mensaje nuevo debajo del original';
+$labels['replytopposting'] = 'comenzar mensaje nuevo encima del original';
+$labels['replybottomposting'] = 'comenzar mensaje nuevo debajo del original';
$labels['replyremovesignature'] = 'Eliminar la firma original del mensaje al responder';
$labels['autoaddsignature'] = 'Añadir firma automáticamente';
-$labels['newmessageonly'] = 'solamente mensaje nuevo';
+$labels['newmessageonly'] = 'solamente nuevo mensaje';
$labels['replyandforwardonly'] = 'respuestas y reenvíos solamente';
$labels['insertsignature'] = 'Insertar firma';
$labels['previewpanemarkread'] = 'Marcar mensaje previsualizado como leído';
$labels['afternseconds'] = 'después de $n segundos';
-$labels['reqmdn'] = 'Solicitar siempre un acuse de recibo';
-$labels['reqdsn'] = 'Solicitar siempre la entrega de notificaciones de estado';
-$labels['replysamefolder'] = 'Coloque las respuestas en la bandeja del mensaje que se responde';
+$labels['reqmdn'] = 'Siempre solicitar confirmación de recibo';
+$labels['reqdsn'] = 'Siempre solicitar notificación del estado de la entrega';
+$labels['replysamefolder'] = 'Colocar respuestas en la carpeta del mensaje al cual se responde';
$labels['defaultabook'] = 'Libreta de direcciones predeterminada';
-$labels['autocompletesingle'] = 'Omitir direcciones de correo alternativas en autocompletado';
+$labels['autocompletesingle'] = 'Omitir direcciones electrónicas alternas en el autocompletado';
$labels['listnamedisplay'] = 'Listar contactos como';
$labels['spellcheckbeforesend'] = 'Comprobar ortografía antes de enviar un mensaje';
-$labels['spellcheckoptions'] = 'Opciones de ortografía';
+$labels['spellcheckoptions'] = 'Opciones de Revisado de Ortografía';
$labels['spellcheckignoresyms'] = 'Ignorar palabras con símbolos';
$labels['spellcheckignorenums'] = 'Ignorar palabras con números';
$labels['spellcheckignorecaps'] = 'Ignorar palabras con todo mayúsculas';
@@ -468,31 +468,31 @@ $labels['addtodict'] = 'Añadir al diccionario';
$labels['mailtoprotohandler'] = 'Registrar controlador de protocolo para enlaces mailto:';
$labels['standardwindows'] = 'Gestionar ventanas emergentes como ventanas estándar';
$labels['forwardmode'] = 'Reenvío de mensajes';
-$labels['inline'] = 'en línea';
+$labels['inline'] = 'entre-línea';
$labels['asattachment'] = 'como adjunto';
$labels['replyallmode'] = 'Acción predeterminada del botón [Responder a todos]';
$labels['replyalldefault'] = 'responder a todos';
$labels['replyalllist'] = 'responder sólo a la lista de correo (si se encuentra)';
$labels['folder'] = 'Bandeja';
$labels['folders'] = 'Carpetas';
-$labels['foldername'] = 'Nombre de bandeja';
-$labels['subscribed'] = 'Suscrita';
+$labels['foldername'] = 'Nombre de carpeta';
+$labels['subscribed'] = 'Suscrito';
$labels['messagecount'] = 'Mensajes';
$labels['create'] = 'Crear';
-$labels['createfolder'] = 'Crear nueva bandeja';
-$labels['managefolders'] = 'Administrar bandejas';
-$labels['specialfolders'] = 'Bandejas especiales';
+$labels['createfolder'] = 'Crear nueva carpeta';
+$labels['managefolders'] = 'Administrar carpetas';
+$labels['specialfolders'] = 'Carpetas especiales';
$labels['properties'] = 'Propiedades';
-$labels['folderproperties'] = 'Propiedades de bandeja';
-$labels['parentfolder'] = 'Bandeja contenedora';
+$labels['folderproperties'] = 'Propiedades de carpeta';
+$labels['parentfolder'] = 'Carpeta raíz';
$labels['location'] = 'Ubicación';
$labels['info'] = 'Información';
$labels['getfoldersize'] = 'Clic para saber el tamaño de la bandeja';
-$labels['changesubscription'] = 'Clic para cambiar suscripción';
-$labels['foldertype'] = 'Tipo de bandeja';
-$labels['personalfolder'] = 'Bandeja privada';
-$labels['otherfolder'] = 'Bandeja de otro usuario';
-$labels['sharedfolder'] = 'Bandeja pública';
+$labels['changesubscription'] = 'Haga clic para cambiar suscripción';
+$labels['foldertype'] = 'Tipo de Carpeta';
+$labels['personalfolder'] = 'Carpeta Privada';
+$labels['otherfolder'] = 'Carpeta de Otro Usuario';
+$labels['sharedfolder'] = 'Carpeta Pública';
$labels['findfolders'] = 'Encontrar carpetas';
$labels['namespace.personal'] = 'Personal';
$labels['namespace.other'] = 'Otros usuarios';
@@ -513,9 +513,9 @@ $labels['MB'] = 'MB';
$labels['GB'] = 'GB';
$labels['unicode'] = 'Unicode';
$labels['english'] = 'Inglés';
-$labels['westerneuropean'] = 'Europeo occidental';
-$labels['easterneuropean'] = 'Europeo oriental';
-$labels['southeasterneuropean'] = 'Europeo sudoriental';
+$labels['westerneuropean'] = 'Europeo Occidental';
+$labels['easterneuropean'] = 'Europeo Oriental';
+$labels['southeasterneuropean'] = 'Europeo Sudoriental';
$labels['baltic'] = 'Báltico';
$labels['cyrillic'] = 'Cirílico';
$labels['arabic'] = 'Árabe';
diff --git a/program/localization/es_ES/messages.inc b/program/localization/es_ES/messages.inc
index 665df6165..ec8de18f0 100644
--- a/program/localization/es_ES/messages.inc
+++ b/program/localization/es_ES/messages.inc
@@ -26,91 +26,91 @@ $messages['connerror'] = '¡Error de conexión (fallo al intentar alcanzar el se
$messages['dberror'] = '¡Error de base de datos!';
$messages['windowopenerror'] = 'iLa ventana emergente fue bloqueada!';
$messages['requesttimedout'] = 'Ha expirado el tiempo de respuesta';
-$messages['errorreadonly'] = 'Imposible realizar la operación. La bandeja es sólo de lectura.';
-$messages['errornoperm'] = 'Imposible realizar la operación. Permiso denegado.';
-$messages['erroroverquota'] = 'No se pudo completar la operación. No queda espacio en el disco.';
-$messages['erroroverquotadelete'] = 'No queda espacio en el disco. Use Shift+Supr para borrar un mensaje.';
-$messages['invalidrequest'] = '¡Petición no válida! No se han guardado los datos.';
+$messages['errorreadonly'] = 'No se pudo realizar la operación. La carpeta es de sólo lectura.';
+$messages['errornoperm'] = 'No se pudo realizar la operación. Permiso denegado.';
+$messages['erroroverquota'] = 'No se pudo completar la operación. No hay espacio libre en el disco.';
+$messages['erroroverquotadelete'] = 'No hay espacio libre en el disco. Use Shift+Supr para borrar un mensaje.';
+$messages['invalidrequest'] = '¡Petición inválida! No se guardaron los datos.';
$messages['invalidhost'] = 'Nombre de servidor inválido.';
-$messages['nomessagesfound'] = 'No se han encontrado mensajes en esta casilla.';
-$messages['loggedout'] = 'Ha cerrado bien la sesión. ¡Hasta pronto!';
+$messages['nomessagesfound'] = 'No se han encontrado mensajes en este buzón.';
+$messages['loggedout'] = 'Ha terminado correctamente la sesión. ¡Hasta pronto!';
$messages['mailboxempty'] = 'El buzón está vacío';
$messages['nomessages'] = 'No hay mensajes';
$messages['refreshing'] = 'Actualizando…';
$messages['loading'] = 'Cargando...';
-$messages['uploading'] = 'Subiendo archivo...';
-$messages['uploadingmany'] = 'Subiendo archivos…';
+$messages['uploading'] = 'Cargando archivo...';
+$messages['uploadingmany'] = 'Cargando archivos…';
$messages['loadingdata'] = 'Cargando datos...';
$messages['checkingmail'] = 'Verificando si hay nuevos mensajes...';
$messages['sendingmessage'] = 'Enviando mensaje...';
$messages['messagesent'] = 'Mensaje enviado correctamente.';
$messages['savingmessage'] = 'Guardando mensaje...';
-$messages['messagesaved'] = 'Mensaje guardado en borradores.';
+$messages['messagesaved'] = 'Mensaje guardado en Borradores.';
$messages['successfullysaved'] = 'Guardado correctamente.';
$messages['savingresponse'] = 'Guardando texto de respuesta...';
-$messages['deleteresponseconfirm'] = '¿Realmente quieres borrar este texto de respuesta?';
+$messages['deleteresponseconfirm'] = '¿Realmente quiere eliminar este texto de respuesta?';
$messages['addedsuccessfully'] = 'Contacto añadido correctamente a la libreta de direcciones.';
$messages['contactexists'] = 'Ya existe un contacto con esta dirección de correo.';
$messages['contactnameexists'] = 'Ya existe un contacto con el mismo nombre.';
$messages['blockedimages'] = 'Para proteger su privacidad, las imágenes externas de este mensaje han sido bloqueadas.';
-$messages['encryptedmessage'] = 'Este es un mensaje cifrado y no puede ser mostrado. ¡Lo siento!';
+$messages['encryptedmessage'] = 'Este es un mensaje cifrado y no puede ser mostrado. ¡Lo sentimos!';
$messages['nocontactsfound'] = 'No se encontraron contactos.';
$messages['contactnotfound'] = 'El contacto solicitado no existe.';
$messages['contactsearchonly'] = 'Ingrese algún criterio para buscar contactos';
$messages['sendingfailed'] = 'Error al enviar mensaje.';
-$messages['senttooquickly'] = 'Por favor, espere $sec segundo(s) antes de mandar este mensaje.';
+$messages['senttooquickly'] = 'Por favor, espere $sec segundo(s) antes de enviar este mensaje.';
$messages['errorsavingsent'] = 'Ha ocurrido un error al guardar el mensaje enviado.';
$messages['errorsaving'] = 'Ha ocurrido un error al guardar.';
-$messages['errormoving'] = 'No se ha podido mover el/los mensaje(s).';
-$messages['errorcopying'] = 'No se ha podido copiar el/los mensaje(s).';
-$messages['errordeleting'] = 'No se ha podido eliminar el/los mensaje(s).';
-$messages['errormarking'] = 'No se ha podido marcar el/los mensaje(s).';
+$messages['errormoving'] = 'No se pudo mover el/los mensaje(s).';
+$messages['errorcopying'] = 'No se pudo copiar el/los mensaje(s).';
+$messages['errordeleting'] = 'No se pudo eliminar el/los mensaje(s).';
+$messages['errormarking'] = 'No se pudo marcar el/los mensaje(s).';
$messages['deletecontactconfirm'] = '¿Realmente quiere eliminar los contactos seleccionados?';
-$messages['deletegroupconfirm'] = '¿De verdad quiere borrar el grupo seleccionado?';
+$messages['deletegroupconfirm'] = '¿Realmente quiere borrar el grupo seleccionado?';
$messages['deletemessagesconfirm'] = '¿Realmente quiere eliminar los mensajes seleccionados?';
-$messages['deletefolderconfirm'] = '¿Realmente quiere eliminar esta bandeja?';
-$messages['purgefolderconfirm'] = '¿Realmente quiere eliminar todos los mensajes de esta bandeja?';
+$messages['deletefolderconfirm'] = '¿Realmente quiere eliminar esta carpeta?';
+$messages['purgefolderconfirm'] = '¿Realmente quiere eliminar todos los mensajes de esta carpeta?';
$messages['contactdeleting'] = 'Eliminando contacto(s)...';
-$messages['groupdeleting'] = 'Borrando grupo…';
-$messages['folderdeleting'] = 'Borrando bandeja...';
-$messages['foldermoving'] = 'Moviendo bandeja...';
-$messages['foldersubscribing'] = 'Suscribiendo bandeja...';
-$messages['folderunsubscribing'] = 'Anulando suscripción a bandeja...';
-$messages['formincomplete'] = 'No ha rellenado todos los campos del formulario.';
-$messages['noemailwarning'] = 'Por favor, introduzca un email válido.';
+$messages['groupdeleting'] = 'Eliminando grupo…';
+$messages['folderdeleting'] = 'Eliminando carpeta...';
+$messages['foldermoving'] = 'Moviendo carpeta...';
+$messages['foldersubscribing'] = 'Suscribiendo carpeta...';
+$messages['folderunsubscribing'] = 'Anulando suscripción a carpeta...';
+$messages['formincomplete'] = 'No ha completado todos los campos del formulario.';
+$messages['noemailwarning'] = 'Por favor, introduzca un correo electrónico válido.';
$messages['nonamewarning'] = 'Por favor, introduzca un nombre.';
$messages['nopagesizewarning'] = 'Por favor, introduzca un tamaño de página.';
-$messages['nosenderwarning'] = 'Por favor, introduzca el email del emisor.';
+$messages['nosenderwarning'] = 'Por favor, introduzca la dirección de correo del remitente.';
$messages['norecipientwarning'] = 'Por favor, introduzca al menos un destinatario.';
$messages['nosubjectwarning'] = 'El campo "Asunto" está vacío. ¿Desea completarlo en este momento?';
-$messages['nobodywarning'] = '¿Quiere enviar este mensaje sin texto?';
+$messages['nobodywarning'] = '¿Desea enviar este mensaje sin texto?';
$messages['notsentwarning'] = 'El mensaje no ha sido enviado. ¿Desea descartar su mensaje?';
-$messages['restoresavedcomposedata'] = 'Se ha encontrado un mensaje redactado previamente y no enviado.\n\nAsunto: $subject\nGuardado: $date\n\n¿Desea restaurar este mensaje?';
+$messages['restoresavedcomposedata'] = 'Se ha encontrado un mensaje previamente redactado sin enviar.\n\nAsunto: $subject\nGuardado: $date\n\n¿Desea restaurar este mensaje?';
$messages['noldapserver'] = 'Por favor, seleccione un servidor LDAP para buscar.';
-$messages['nosearchname'] = 'Por favor, introduzca un nombre o la dirección de e-mail.';
-$messages['notuploadedwarning'] = 'No se han subido aún todos los adjuntos. Por favor espere o cancele la subida.';
+$messages['nosearchname'] = 'Por favor, ingrese un nombre de contacto o dirección de correo electrónico.';
+$messages['notuploadedwarning'] = 'No todos los adjuntos han sido cargados todavía. Por favor, espere o cancele la carga.';
$messages['searchsuccessful'] = 'Se encontraron $nr mensajes.';
$messages['contactsearchsuccessful'] = 'Encontrados $nr contactos.';
$messages['searchnomatch'] = 'No se obtuvieron resultados.';
$messages['searching'] = 'Buscando...';
$messages['checking'] = 'Revisando...';
-$messages['stillsearching'] = 'Todavía buscando...';
+$messages['stillsearching'] = 'Aún buscando...';
$messages['nospellerrors'] = 'No se encontraron errores ortográficos.';
-$messages['folderdeleted'] = 'Bandeja eliminada correctamente.';
-$messages['foldersubscribed'] = 'Suscrito a bandeja correctamente.';
-$messages['folderunsubscribed'] = 'Suscripción a bandeja anulada correctamente.';
-$messages['folderpurged'] = 'Bandeja purgada correctamente.';
-$messages['folderexpunged'] = 'Bandeja compatada correctamente.';
+$messages['folderdeleted'] = 'Carpeta eliminada correctamente.';
+$messages['foldersubscribed'] = 'Suscrito a carpeta correctamente.';
+$messages['folderunsubscribed'] = 'Suscripción a carpeta anulada correctamente.';
+$messages['folderpurged'] = 'Carpeta purgada correctamente.';
+$messages['folderexpunged'] = 'Carpeta compactada correctamente.';
$messages['deletedsuccessfully'] = 'Eliminado correctamente.';
-$messages['converting'] = 'Quitando el formato del mensaje...';
-$messages['messageopenerror'] = 'No puedo descargar el mensaje del servidor.';
-$messages['fileuploaderror'] = 'Error al subir archivos.';
+$messages['converting'] = 'Eliminando formato de mensaje...';
+$messages['messageopenerror'] = 'No se pudo cargar el mensaje del servidor.';
+$messages['fileuploaderror'] = 'Error al cargar archivos.';
$messages['filesizeerror'] = 'El archivo excede el tamaño máximo ($size).';
$messages['copysuccess'] = '$nr contactos copiados correctamente.';
$messages['movesuccess'] = '$nr contactos movidos correctamente.';
-$messages['copyerror'] = 'No se ha podido copiar ningún contacto.';
-$messages['moveerror'] = 'No se ha podido mover ningún contacto.';
-$messages['sourceisreadonly'] = 'Esta dirección es de sólo lectura.';
+$messages['copyerror'] = 'No se pudo copiar ningún contacto.';
+$messages['moveerror'] = 'No se pudo mover ningún contacto.';
+$messages['sourceisreadonly'] = 'Esta dirección origen es de sólo lectura.';
$messages['errorsavingcontact'] = 'No se pudo guardar la dirección de contacto.';
$messages['movingmessage'] = 'Moviendo mensaje(s)...';
$messages['copyingmessage'] = 'Copiando mensaje(s)...';
@@ -119,62 +119,62 @@ $messages['movingcontact'] = 'Moviendo contacto(s)...';
$messages['deletingmessage'] = 'Eliminando mensaje(s)...';
$messages['markingmessage'] = 'Marcando mensaje(s)...';
$messages['addingmember'] = 'Añadiendo contacto(s) al grupo…';
-$messages['removingmember'] = 'Quitando contacto(s) del grupo…';
-$messages['receiptsent'] = 'La notificación de lectura se ha enviado correctamente.';
-$messages['errorsendingreceipt'] = 'No se ha podido enviar la notificación de lectura.';
+$messages['removingmember'] = 'Eliminando contacto(s) del grupo…';
+$messages['receiptsent'] = 'La confirmación de lectura ha sido enviada correctamente.';
+$messages['errorsendingreceipt'] = 'No se pudo enviar la confirmación de lectura.';
$messages['deleteidentityconfirm'] = '¿Realmente desea eliminar esta identidad?';
-$messages['nodeletelastidentity'] = 'No se puede borrar esta identidad puesto que es la última.';
-$messages['forbiddencharacter'] = 'El nombre de la bandeja contiene un carácter prohibido.';
-$messages['selectimportfile'] = 'Por favor, seleccione un archivo para subir.';
-$messages['addresswriterror'] = 'No se puede escribir en la libreta de direciones seleccionada.';
-$messages['contactaddedtogroup'] = 'Se han añadido correctamente los contactos a este grupo.';
-$messages['contactremovedfromgroup'] = 'Se han borrado correctamente los contactos de este grupo.';
+$messages['nodeletelastidentity'] = 'No se puede eliminar esta identidad puesto a que es la única.';
+$messages['forbiddencharacter'] = 'El nombre de la carpeta contiene un carácter prohibido.';
+$messages['selectimportfile'] = 'Por favor, seleccione un archivo para cargar.';
+$messages['addresswriterror'] = 'La libreta de direcciones seleccionada no admite escritura.';
+$messages['contactaddedtogroup'] = 'Se añadieron los contactos a este grupo correctamente.';
+$messages['contactremovedfromgroup'] = 'Se eliminaron los contactos de este grupo correctamente.';
$messages['nogroupassignmentschanged'] = 'No hay cambios en la asignación de grupos.';
-$messages['importwait'] = 'Importando, espere...';
-$messages['importformaterror'] = '¡La importación falló! El fichero enviado no es un fichero válido de importación de datos';
+$messages['importwait'] = 'Importando, por favor espere...';
+$messages['importformaterror'] = '¡La importación falló! El fichero enviado no es un fichero válido de importación de datos.';
$messages['importconfirm'] = '<b>Se han importado $inserted contactos correctamente</b>';
$messages['importconfirmskipped'] = '<b>Ignoradas $skipped entradas existentes</b>';
-$messages['importmessagesuccess'] = '$nr mensajes importados con éxito';
-$messages['importmessageerror'] = '¡Ha fallado la importación! El fichero subido no es un fichero válido de mensaje o buzón de correo';
+$messages['importmessagesuccess'] = '$nr mensajes importados correctamente';
+$messages['importmessageerror'] = '¡La importación falló! El fichero enviado no es un fichero válido de mensaje o buzón de correo.';
$messages['opnotpermitted'] = '¡Operación no permitida!';
-$messages['nofromaddress'] = 'El contacto seleccionado no tiene dirección de e-mail';
-$messages['editorwarning'] = 'Cambiar el tipo de editor puede ocasionar la pérdida del formato del texto. ¿Desea continuar?';
+$messages['nofromaddress'] = 'Falta dirección electrónica en la identidad seleccionada.';
+$messages['editorwarning'] = 'Al cambiar el tipo de editor puede ocasionar la pérdida de formato del texto. ¿Desea continuar?';
$messages['httpreceivedencrypterror'] = 'Ha ocurrido un error fatal de configuración. Contacte inmediatamente a su administrador. <b>Su mensaje no ha sido enviado.</b>';
$messages['smtpconnerror'] = 'Error SMTP ($code): Ha fallado la conexión al servidor.';
-$messages['smtpautherror'] = 'Error SMTP ($code): Error de autenticación.';
-$messages['smtpfromerror'] = 'Error SMTP ($code): No se ha podido asignar el emisor "$from" ($msg).';
-$messages['smtptoerror'] = 'Error SMTP ($code): No se ha podido establecer destinatario "$to" ($msg).';
+$messages['smtpautherror'] = 'Error SMTP ($code): Ha fallado la autenticación.';
+$messages['smtpfromerror'] = 'Error SMTP ($code): No se pudo asignar el remitente "$from" ($msg).';
+$messages['smtptoerror'] = 'Error SMTP ($code): No se pudo establecer destinatario "$to" ($msg).';
$messages['smtprecipientserror'] = 'Error SMTP: No es posible analizar la lista de destinatarios.';
$messages['smtperror'] = 'Error SMTP: $msg';
-$messages['emailformaterror'] = 'Dirección e-mail incorrecta: $email';
-$messages['toomanyrecipients'] = 'Hay demasiados destinatarios. Reduzca el número de destinatarios a $max.';
+$messages['emailformaterror'] = 'Dirección de correo incorrecta: $email';
+$messages['toomanyrecipients'] = 'Demasiados destinatarios. Reduzca el número de destinatarios a $max.';
$messages['maxgroupmembersreached'] = 'El número de miembros del grupo excede el máximo de $max.';
$messages['internalerror'] = 'Ha ocurrido un error interno. Por favor, inténtelo de nuevo.';
-$messages['contactdelerror'] = 'No se ha podido eliminar el/los contacto(s).';
+$messages['contactdelerror'] = 'No se pudo eliminar el/los contacto(s).';
$messages['contactdeleted'] = 'Contacto(s) eliminado(s) correctamente.';
-$messages['contactrestoreerror'] = 'No se han podido restaurar los contactos borrados.';
-$messages['contactrestored'] = 'Los contactos se han restaurado con éxito.';
+$messages['contactrestoreerror'] = 'No se pudo restaurar contacto(s) eliminado(s).';
+$messages['contactrestored'] = 'Contacto(s) restaurado(s) correctamente.';
$messages['groupdeleted'] = 'Grupo eliminado correctamente.';
$messages['grouprenamed'] = 'Grupo renombrado correctamente.';
$messages['groupcreated'] = 'Grupo creado correctamente.';
-$messages['savedsearchdeleted'] = 'La búsqueda guardada se ha borrado con éxito.';
-$messages['savedsearchdeleteerror'] = 'No se ha podido borrar la búsqueda guardada.';
-$messages['savedsearchcreated'] = 'Se ha guardado correctamente la búsqueda.';
-$messages['savedsearchcreateerror'] = 'No se ha podido guardar la búsqueda.';
+$messages['savedsearchdeleted'] = 'La búsqueda guardada se ha eliminado correctamente.';
+$messages['savedsearchdeleteerror'] = 'No se ha podido eliminar la búsqueda guardada.';
+$messages['savedsearchcreated'] = 'Se ha guardado la búsqueda correctamente.';
+$messages['savedsearchcreateerror'] = 'No se pudo guardar la búsqueda.';
$messages['messagedeleted'] = 'Mensaje(s) eliminado(s) correctamente.';
$messages['messagemoved'] = 'Mensaje(s) movido(s) correctamente.';
$messages['messagecopied'] = 'Mensaje(s) copiado(s) correctamente.';
$messages['messagemarked'] = 'Mensaje(s) marcado(s) correctamente.';
$messages['autocompletechars'] = 'Introduce al menos $min caracteres para autocompletar.';
-$messages['autocompletemore'] = 'Se encontraron mas coincidencias. Favor de ingresar mas caracteres.';
-$messages['namecannotbeempty'] = 'Hay que poner el nombre.';
+$messages['autocompletemore'] = 'Se encontraron más coincidencias. Favor de ingresar más caracteres.';
+$messages['namecannotbeempty'] = 'El nombre no puede estar vacío.';
$messages['nametoolong'] = 'El nombre es demasiado largo.';
-$messages['folderupdated'] = 'Bandeja actualizada correctamente.';
-$messages['foldercreated'] = '.';
+$messages['folderupdated'] = 'Carpeta actualizada correctamente.';
+$messages['foldercreated'] = 'Carpeta creada correctamente.';
$messages['invalidimageformat'] = 'No es un formato de imagen válido.';
$messages['mispellingsfound'] = 'Se han detectado errores ortográficos en el mensaje.';
-$messages['parentnotwritable'] = 'No se puede crear/mover la carpeta a la carpeta superior elegida. No tiene permisos de acceso.';
-$messages['messagetoobig'] = 'Esta parte del mensaje es demasiada grande para procesarla.';
+$messages['parentnotwritable'] = 'No se pudo crear/mover la carpeta a la carpeta superior seleccionada. No tiene permisos de acceso.';
+$messages['messagetoobig'] = 'Esta parte del mensaje es demasiado grande para ser procesado.';
$messages['attachmentvalidationerror'] = '¡ATENCIÓN! Este adjunto es sospechoso porque su tipo no coincide con el tipo declarado en el mensaje. Si no confía en su remitente, no debería abrirlo en su navegador porque podría tener contenido malicioso.<br/<br/> <em>Esperado: $expected; encontrado: $detected</em>';
-$messages['noscriptwarning'] = 'Advertencia: ¡este servicio de webmail necesita Javascript! Para poder usarlo habilite el soporte de Javascript en su navegador, por favor.';
+$messages['noscriptwarning'] = 'Advertencia: ¡Este servicio de webmail necesita Javascript! Para poder usarlo habilite el soporte de Javascript en su navegador, por favor.';
?>
diff --git a/program/localization/et_EE/labels.inc b/program/localization/et_EE/labels.inc
index 7b5f663bb..6c463d920 100644
--- a/program/localization/et_EE/labels.inc
+++ b/program/localization/et_EE/labels.inc
@@ -233,7 +233,6 @@ $labels['responsetext'] = 'Vastuse sisu';
$labels['attach'] = 'Manusta';
$labels['attachments'] = 'Manused';
$labels['upload'] = 'Kinnita manus';
-$labels['uploadprogress'] = '$percent ($current, kokku $total)';
$labels['close'] = 'Sulge';
$labels['messageoptions'] = 'Kirja valikud...';
$labels['low'] = 'Madal';
@@ -403,7 +402,6 @@ $labels['askuser'] = 'küsi kasutajalt';
$labels['autosend'] = 'saada automaatselt';
$labels['autosendknown'] = 'saada automaatselt minu kontaktidele, teised küsi üle';
$labels['autosendknownignore'] = 'saada automaatselt minu kontaktidele, teisi ignoreeri';
-$labels['ignore'] = 'ignoreeri';
$labels['readwhendeleted'] = 'Märgi kiri kustutamisel loetuks';
$labels['flagfordeletion'] = 'Kustutamise asemel märgi kiri kustutatavaks';
$labels['skipdeleted'] = 'Ära näita kustutatud kirju';
diff --git a/program/localization/eu_ES/labels.inc b/program/localization/eu_ES/labels.inc
index 1c21e2a70..b80ab7029 100644
--- a/program/localization/eu_ES/labels.inc
+++ b/program/localization/eu_ES/labels.inc
@@ -221,6 +221,7 @@ $labels['resumeediting'] = 'Editatzen jarraitu';
$labels['revertto'] = 'Itzuli hona';
$labels['restore'] = 'Berrezarri';
$labels['restoremessage'] = 'Leheneratu mezua?';
+$labels['ignore'] = 'Ezikusi';
$labels['responses'] = 'Erantzunak';
$labels['insertresponse'] = 'Txertatu erantzun bat';
$labels['manageresponses'] = 'Kudeatu erantzunak';
@@ -406,6 +407,7 @@ $labels['askuser'] = 'galdetu erabiltzaileari';
$labels['autosend'] = 'bidali jasotze-agiria';
$labels['autosendknown'] = 'bidali jasotze-agiria nire kontaktuei, bestela galdetu niri';
$labels['autosendknownignore'] = 'bidali jasotze-agiria nire kontaktuei, bestela ez ikusi egin';
+$labels['ignorerequest'] = 'Ez ikusi eskaera';
$labels['readwhendeleted'] = 'Markatu mezua irakurrita bezala ezabatzerakoan';
$labels['flagfordeletion'] = 'Markatu mezua ezabatzeko ezabatu beharrean';
$labels['skipdeleted'] = 'Ez erakutsi ezabatutako mezuak';
diff --git a/program/localization/fr_FR/labels.inc b/program/localization/fr_FR/labels.inc
index 7d77b6566..1ee2c2478 100644
--- a/program/localization/fr_FR/labels.inc
+++ b/program/localization/fr_FR/labels.inc
@@ -45,9 +45,9 @@ $labels['organization'] = 'Organisation';
$labels['readstatus'] = 'État de lecture';
$labels['listoptions'] = 'Lister les options...';
$labels['mailboxlist'] = 'Dossiers';
-$labels['messagesfromto'] = 'Messages de $from à $to sur $count';
+$labels['messagesfromto'] = 'Courriels de $from à $to sur $count';
$labels['threadsfromto'] = 'Fils de $from à $to sur $count';
-$labels['messagenrof'] = 'Message $nr sur $count';
+$labels['messagenrof'] = 'Courriel $nr sur $count';
$labels['fromtoshort'] = '$from – $to de $count';
$labels['copy'] = 'Copier';
$labels['move'] = 'Déplacer';
@@ -100,29 +100,29 @@ $labels['longnov'] = 'Novembre';
$labels['longdec'] = 'Décembre';
$labels['today'] = 'Aujourd\'hui';
$labels['refresh'] = 'Rafraîchir';
-$labels['checkmail'] = 'Vérifier les nouveaux messages';
+$labels['checkmail'] = 'Vérifier les nouveaux courriels';
$labels['compose'] = 'Rédiger';
-$labels['writenewmessage'] = 'Créer un nouveau message';
+$labels['writenewmessage'] = 'Créer un nouveau courriel';
$labels['reply'] = 'Répondre';
$labels['replytomessage'] = 'Répondre à l\'expéditeur';
$labels['replytoallmessage'] = 'Répondre à la liste, ou à l\'expéditeur et à tous les destinataires';
$labels['replyall'] = 'Répondre à tous';
$labels['replylist'] = 'Répondre à la liste';
-$labels['forward'] = 'Transférer';
-$labels['forwardinline'] = 'Transférer dans le message';
-$labels['forwardattachment'] = 'Transférer en fichier joint';
-$labels['forwardmessage'] = 'Transférer le message';
-$labels['deletemessage'] = 'Supprimer le message';
-$labels['movemessagetotrash'] = 'Déplacer le message dans la corbeille';
-$labels['printmessage'] = 'Imprimer ce message';
-$labels['previousmessage'] = 'Afficher le message précédent';
-$labels['firstmessage'] = 'Afficher le premier message';
-$labels['nextmessage'] = 'Afficher le message suivant';
-$labels['lastmessage'] = 'Afficher le dernier message';
-$labels['backtolist'] = 'Retourner à la liste des messages';
+$labels['forward'] = 'Réacheminer';
+$labels['forwardinline'] = 'Réacheminer dans le courriel';
+$labels['forwardattachment'] = 'Réacheminer comme pièce jointe';
+$labels['forwardmessage'] = 'Réacheminer le courriel';
+$labels['deletemessage'] = 'Supprimer le courriel';
+$labels['movemessagetotrash'] = 'Déplacer le courriel vers la corbeille';
+$labels['printmessage'] = 'Imprimer ce courriel';
+$labels['previousmessage'] = 'Afficher le courriel précédent';
+$labels['firstmessage'] = 'Afficher le premier courriel';
+$labels['nextmessage'] = 'Afficher le courriel suivant';
+$labels['lastmessage'] = 'Afficher le dernier courriel';
+$labels['backtolist'] = 'Retourner à la liste des courriels';
$labels['viewsource'] = 'Afficher la source';
$labels['mark'] = 'Marquer';
-$labels['markmessages'] = 'Marquer les messages';
+$labels['markmessages'] = 'Marquer les courriels';
$labels['markread'] = 'Comme lu';
$labels['markunread'] = 'Comme non lu';
$labels['markflagged'] = 'Comme signalé';
@@ -144,11 +144,11 @@ $labels['unread'] = 'Non lu';
$labels['flagged'] = 'Signalé';
$labels['unflagged'] = 'Non signalé';
$labels['unanswered'] = 'Non répondu';
-$labels['withattachment'] = 'Avec fichier joint';
+$labels['withattachment'] = 'Avec pièce jointe';
$labels['deleted'] = 'Supprimé';
$labels['undeleted'] = 'Non supprimé';
$labels['replied'] = 'Réponse faite';
-$labels['forwarded'] = 'Transféré';
+$labels['forwarded'] = 'Réacheminé';
$labels['invert'] = 'Inverser';
$labels['filter'] = 'Filtrer';
$labels['list'] = 'Lister';
@@ -157,12 +157,12 @@ $labels['expand-all'] = 'Tout afficher';
$labels['expand-unread'] = 'Afficher non-lu(s)';
$labels['collapse-all'] = 'Fermer tous';
$labels['threaded'] = 'Par fil';
-$labels['autoexpand_threads'] = 'Développer les fils de message';
+$labels['autoexpand_threads'] = 'Développer les fils de courriel';
$labels['do_expand'] = 'Tous les fils';
-$labels['expand_only_unread'] = 'seulement avec des messages non lus';
+$labels['expand_only_unread'] = 'seulement avec des courriels non lus';
$labels['fromto'] = 'De/à';
$labels['flag'] = 'Signaler';
-$labels['attachment'] = 'Fichier joint';
+$labels['attachment'] = 'Pièce jointe';
$labels['nonesort'] = 'Aucun';
$labels['sentdate'] = 'Date d\'envoi';
$labels['arrival'] = 'Date d\'arrivée';
@@ -175,7 +175,7 @@ $labels['listmode'] = 'Mode d\'affichage en liste';
$labels['folderactions'] = 'Actions du dossier...';
$labels['compact'] = 'Compacter';
$labels['empty'] = 'Vider';
-$labels['importmessages'] = 'Importer des messages';
+$labels['importmessages'] = 'Importer des courriels';
$labels['quota'] = 'Utilisation du disque';
$labels['unknown'] = 'inconnue';
$labels['unlimited'] = 'illimitée';
@@ -183,11 +183,11 @@ $labels['quotatype'] = 'Type de quota';
$labels['quotatotal'] = 'Limite';
$labels['quotaused'] = 'Utilisé';
$labels['quotastorage'] = 'Espace disque';
-$labels['quotamessage'] = 'Nombre de messages';
+$labels['quotamessage'] = 'Nombre de courriels';
$labels['quicksearch'] = 'Recherche rapide';
$labels['resetsearch'] = 'Réinitialiser la recherche';
$labels['searchmod'] = 'Modificateurs de recherche';
-$labels['msgtext'] = 'Message entier';
+$labels['msgtext'] = 'Courriel entier';
$labels['body'] = 'Corps';
$labels['type'] = 'Type';
$labels['namex'] = 'Nom';
@@ -201,7 +201,7 @@ $labels['changeformattext'] = 'Afficher au format texte en clair';
$labels['changeformathtml'] = 'Afficher au format HTML';
$labels['editasnew'] = 'Éditer comme nouveau';
$labels['send'] = 'Envoyer';
-$labels['sendmessage'] = 'Envoyer un message';
+$labels['sendmessage'] = 'Envoyer un courriel';
$labels['savemessage'] = 'Enregistrer comme brouillon';
$labels['addattachment'] = 'Joindre un fichier';
$labels['charset'] = 'Jeu de caractères';
@@ -209,7 +209,7 @@ $labels['editortype'] = 'Type d\'éditeur';
$labels['returnreceipt'] = 'Accusé de réception';
$labels['dsn'] = 'Notification d\'état de distribution';
$labels['mailreplyintro'] = 'Le $date, $sender a écrit :';
-$labels['originalmessage'] = 'Message original';
+$labels['originalmessage'] = 'Courriel original';
$labels['selectimage'] = 'Sélectionner l\'image';
$labels['addimage'] = 'Ajouter une image';
$labels['selectmedia'] = 'Choisir un film';
@@ -220,7 +220,7 @@ $labels['checkspelling'] = 'Vérification de l\'orthographe';
$labels['resumeediting'] = 'Retourner à l\'édition';
$labels['revertto'] = 'Revenir à';
$labels['restore'] = 'Restaurer';
-$labels['restoremessage'] = 'Restaurer le message ?';
+$labels['restoremessage'] = 'Restaurer le courriel ?';
$labels['ignore'] = 'Ignorer';
$labels['responses'] = 'Réponses';
$labels['insertresponse'] = 'Insérer une réponse';
@@ -232,11 +232,11 @@ $labels['editresponses'] = 'Éditer les réponses';
$labels['responsename'] = 'Nom';
$labels['responsetext'] = 'Texte de la réponse';
$labels['attach'] = 'Joindre';
-$labels['attachments'] = 'Fichiers joints';
+$labels['attachments'] = 'Pièces jointes';
$labels['upload'] = 'Téléverser';
$labels['uploadprogress'] = '$percent ($current de $total)';
$labels['close'] = 'Fermer';
-$labels['messageoptions'] = 'Options du message...';
+$labels['messageoptions'] = 'Options de courriel..';
$labels['togglecomposeoptions'] = 'Activer/désactiver les options de rédaction';
$labels['low'] = 'Basse';
$labels['lowest'] = 'La plus basse';
@@ -248,21 +248,21 @@ $labels['showimages'] = 'Afficher les images';
$labels['alwaysshow'] = 'Toujours afficher les images de $sender';
$labels['isdraft'] = 'Ceci est un brouillon.';
$labels['andnmore'] = '$nr de plus...';
-$labels['togglemoreheaders'] = 'Afficher plus d\'en-têtes de messages';
-$labels['togglefullheaders'] = 'Afficher/masquer les en-têtes brutes de messages';
+$labels['togglemoreheaders'] = 'Afficher plus d\'en-têtes de courriels';
+$labels['togglefullheaders'] = 'Afficher/masquer les en-têtes brutes de courriels';
$labels['htmltoggle'] = 'HTML';
$labels['plaintoggle'] = 'Texte en clair';
-$labels['savesentmessagein'] = 'Enregistrer le message envoyé dans';
+$labels['savesentmessagein'] = 'Enregistrer le courriel envoyé dans';
$labels['dontsave'] = 'ne pas enregistrer';
$labels['maxuploadsize'] = 'La taille de fichier maximum autorisée est $size';
$labels['addcc'] = 'Ajouter Cc';
$labels['addbcc'] = 'Ajouter Cci';
$labels['addreplyto'] = 'Ajouter Répondre à';
$labels['addfollowupto'] = 'Ajouter Transférer à';
-$labels['mdnrequest'] = 'L\'expéditeur de ce message a demandé d\'être prévenu quand vous lirez ce message. Souhaitez-vous prévenir l\'expéditeur ?';
+$labels['mdnrequest'] = 'L\'expéditeur de ce courriel a demandé d\'être prévenu quand vous le lirez. Souhaitez-vous prévenir l\'expéditeur ?';
$labels['receiptread'] = 'Accusé de réception (lu)';
-$labels['yourmessage'] = 'Ceci est un accusé de réception pour votre message';
-$labels['receiptnote'] = 'Note : cet accusé indique seulement que le message a été affiché sur l\'ordinateur du destinataire. Il n\'y a aucune garantie que le destinataire ait lu ou compris le contenu du message.';
+$labels['yourmessage'] = 'Ceci est un accusé de réception pour votre courriel';
+$labels['receiptnote'] = 'Note : cet accusé indique seulement que le courriel a été affiché sur l\'ordinateur du destinataire. Il n\'y a aucune garantie que le destinataire ait lu ou compris le contenu du courriel.';
$labels['name'] = 'Nom à afficher';
$labels['firstname'] = 'Prénom';
$labels['surname'] = 'Nom de famille';
@@ -330,7 +330,7 @@ $labels['replacephoto'] = 'Remplacer';
$labels['uploadphoto'] = 'Téléverser une photo';
$labels['newcontact'] = 'Créer un nouveau contact';
$labels['deletecontact'] = 'Supprimer les contacts sélectionnés';
-$labels['composeto'] = 'Rédiger un message à';
+$labels['composeto'] = 'Rédiger un courriel à';
$labels['contactsfromto'] = 'Contacts de $from à $to sur $count';
$labels['print'] = 'Imprimer';
$labels['export'] = 'Exporter';
@@ -375,7 +375,7 @@ $labels['addidentity'] = 'Ajouter une identité';
$labels['editidentity'] = 'Modifier l\'identité';
$labels['preferhtml'] = 'Afficher en HTML';
$labels['defaultcharset'] = 'Jeu de caractère par défaut';
-$labels['htmlmessage'] = 'Message en HTML';
+$labels['htmlmessage'] = 'Courriel HTML';
$labels['messagepart'] = 'Partie';
$labels['digitalsig'] = 'Signature numérique';
$labels['dateformat'] = 'Format de la date';
@@ -388,43 +388,43 @@ $labels['timezone'] = 'Fuseau horaire';
$labels['pagesize'] = 'Lignes par page';
$labels['signature'] = 'Signature';
$labels['dstactive'] = 'Heure avancée';
-$labels['showinextwin'] = 'Ouvrir le message dans une nouvelle fenêtre';
+$labels['showinextwin'] = 'Ouvrir le courriel dans une nouvelle fenêtre';
$labels['composeextwin'] = 'Rédiger dans une nouvelle fenêtre';
-$labels['htmleditor'] = 'Rédiger un message au format HTML';
-$labels['htmlonreply'] = 'en réponse à un message en HTML';
-$labels['htmlonreplyandforward'] = 'lors d\'un transfert ou en réponse à un message en HTML';
+$labels['htmleditor'] = 'Rédiger un courriel au format HTML';
+$labels['htmlonreply'] = 'en réponse à un courriel en HTML';
+$labels['htmlonreplyandforward'] = 'lors d\'un réacheminement ou en réponse à un courriel en HTML';
$labels['htmlsignature'] = 'Signature HTML';
$labels['showemail'] = 'Montrer l\'adresse courriel avec le nom d\'affichage';
-$labels['previewpane'] = 'Afficher le panneau d\'aperçu';
+$labels['previewpane'] = 'Afficher le volet de visualisation';
$labels['skin'] = 'Habillage de l\'interface';
$labels['logoutclear'] = 'Vider la corbeille à la déconnexion';
$labels['logoutcompact'] = 'Compacter la boite de réception à la déconnexion';
$labels['uisettings'] = 'Interface utilisateur';
$labels['serversettings'] = 'Paramètres du serveur';
-$labels['mailboxview'] = 'Affichage de la boîte de courrier';
+$labels['mailboxview'] = 'Affichage de la boîte de courriel';
$labels['mdnrequests'] = 'À la demande d\'un accusé de réception';
$labels['askuser'] = 'me demander';
$labels['autosend'] = 'envoyer l\'accusé';
$labels['autosendknown'] = 'envoyer un accusé de réception à mes contacts, autrement me demander';
$labels['autosendknownignore'] = 'envoyer un accusé à mes contacts, sinon ignorer';
$labels['ignorerequest'] = 'ignorer la demande';
-$labels['readwhendeleted'] = 'Marquer le message comme lu à la suppression';
-$labels['flagfordeletion'] = 'Signaler le message pour la suppression au lieu de le supprimer';
-$labels['skipdeleted'] = 'Ne pas montrer les messages supprimés';
-$labels['deletealways'] = 'Si le déplacement des messages à la corbeille échoue, les supprimer';
+$labels['readwhendeleted'] = 'Marquer le courriel comme lu à la suppression';
+$labels['flagfordeletion'] = 'Signaler le courriel pour la suppression au lieu de le supprimer';
+$labels['skipdeleted'] = 'Ne pas montrer les courriels supprimés';
+$labels['deletealways'] = 'Si le déplacement des courriels à la corbeille échoue, les supprimer';
$labels['deletejunk'] = 'Supprimer directement les pourriels';
-$labels['showremoteimages'] = 'Afficher les images distantes des messages';
+$labels['showremoteimages'] = 'Afficher les images distantes des courriels';
$labels['fromknownsenders'] = 'provenant d\'expéditeurs connus';
$labels['always'] = 'toujours';
-$labels['showinlineimages'] = 'Afficher les images jointes sous le message';
+$labels['showinlineimages'] = 'Afficher les images jointes sous le corps du courriel';
$labels['autosavedraft'] = 'Enregistrer automatiquement le brouillon';
$labels['everynminutes'] = 'toutes les $n minute(s)';
-$labels['refreshinterval'] = 'Rafraîchir (vérifier les nouveaux messages, etc.)';
+$labels['refreshinterval'] = 'Rafraîchir (vérifier les nouveaux courriels, etc.)';
$labels['never'] = 'jamais';
$labels['immediately'] = 'Immédiatement';
-$labels['messagesdisplaying'] = 'Affichage des messages';
-$labels['messagescomposition'] = 'Rédaction des messages';
-$labels['mimeparamfolding'] = 'Noms des fichiers joints';
+$labels['messagesdisplaying'] = 'Affichage des courriels';
+$labels['messagescomposition'] = 'Rédaction de courriels';
+$labels['mimeparamfolding'] = 'Noms des pièces jointes';
$labels['2231folding'] = 'RFC 2231 complet (Thunderbird)';
$labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
$labels['2047folding'] = 'RFC 2047 complet (autre)';
@@ -432,34 +432,34 @@ $labels['force7bit'] = 'Utiliser l\'encodage MIME pour les caractères 8 bits';
$labels['savelocalstorage'] = "Enregistrer dans le stockage local du navigateur (temporaire)";
$labels['advancedoptions'] = 'Options avancées';
$labels['toggleadvancedoptions'] = 'Activer/désactiver les options avancées';
-$labels['focusonnewmessage'] = 'Cibler la fenêtre du navigateur quand un nouveau message arrive';
-$labels['checkallfolders'] = 'Vérifier les nouveaux messages dans tous les dossiers';
-$labels['displaynext'] = 'Après avoir supprimé/déplacé un message, afficher le suivant';
-$labels['defaultfont'] = 'Police par défaut des messages en HTML';
+$labels['focusonnewmessage'] = 'Cibler la fenêtre du navigateur quand un nouveau courriel arrive';
+$labels['checkallfolders'] = 'Vérifier les nouveaux courriels dans tous les dossiers';
+$labels['displaynext'] = 'Après avoir supprimé/déplacé un courriel, afficher le suivant';
+$labels['defaultfont'] = 'Police par défaut des courriels en HTML';
$labels['mainoptions'] = 'Options principales';
$labels['browseroptions'] = 'Options du navigateur';
$labels['section'] = 'Section';
$labels['maintenance'] = 'Maintenance';
-$labels['newmessage'] = 'Nouveau message';
+$labels['newmessage'] = 'Nouveau courriel';
$labels['signatureoptions'] = 'Options de signature';
$labels['whenreplying'] = 'Lors d\'une réponse';
-$labels['replyempty'] = 'ne pas citer le message original';
-$labels['replytopposting'] = 'commencer le nouveau message au-dessus de la citation';
-$labels['replybottomposting'] = 'commencer le nouveau message en-dessous de la citation';
-$labels['replyremovesignature'] = 'Lors de la réponse, supprimer la signature originale du message ';
+$labels['replyempty'] = 'ne pas citer le courriel original';
+$labels['replytopposting'] = 'commencer le nouveau courriel au-dessus de la citation';
+$labels['replybottomposting'] = 'commencer le nouveau courriel en-dessous de la citation';
+$labels['replyremovesignature'] = 'Lors de la réponse, supprimer la signature originale du courriel ';
$labels['autoaddsignature'] = 'Ajouter automatiquement la signature';
-$labels['newmessageonly'] = 'nouveau message seulement';
-$labels['replyandforwardonly'] = 'réponses et transferts seulement';
+$labels['newmessageonly'] = 'nouveau courriel seulement';
+$labels['replyandforwardonly'] = 'réponses et réacheminements seulement';
$labels['insertsignature'] = 'Insérer la signature';
-$labels['previewpanemarkread'] = 'Marquer les messages prévisualisés comme lus';
+$labels['previewpanemarkread'] = 'Marquer les courriels prévisualisés comme lus';
$labels['afternseconds'] = 'après $n secondes';
$labels['reqmdn'] = 'Toujours demander un accusé de réception';
$labels['reqdsn'] = 'Toujours demander une notification d\'état de distribution';
-$labels['replysamefolder'] = 'Placer les réponses dans le dossier du message auquel il est répondu';
+$labels['replysamefolder'] = 'Placer les réponses dans le dossier du courriel auquel il est répondu';
$labels['defaultabook'] = 'Carnet d\'adresses par défaut';
$labels['autocompletesingle'] = 'Ignorer les adresses de courriel alternatives du remplissage automatique';
$labels['listnamedisplay'] = 'Lister les contacts comme';
-$labels['spellcheckbeforesend'] = 'Vérifier l’orthographe avant d\'envoyer un message';
+$labels['spellcheckbeforesend'] = 'Vérifier l’orthographe avant d\'envoyer un courriel';
$labels['spellcheckoptions'] = 'Options du vérificateur d\'orthographe';
$labels['spellcheckignoresyms'] = 'Ignorer les mots avec des symboles';
$labels['spellcheckignorenums'] = 'Ignorer les mots avec des nombres';
@@ -467,9 +467,9 @@ $labels['spellcheckignorecaps'] = 'Ignorer les mots entièrement en majuscule';
$labels['addtodict'] = 'Ajouter au dictionnaire';
$labels['mailtoprotohandler'] = 'Enregistrer le gestionnaire de protocole pour les liens mailto:';
$labels['standardwindows'] = 'Considérer les fenêtres intempestives comme des fenêtres habituelles';
-$labels['forwardmode'] = 'Transfert des messages';
-$labels['inline'] = 'dans le message';
-$labels['asattachment'] = 'en fichier joint';
+$labels['forwardmode'] = 'Réacheminement de courriels';
+$labels['inline'] = 'dans le courriel';
+$labels['asattachment'] = 'en pièce jointe';
$labels['replyallmode'] = 'Action par défaut du bouton [Répondre à tous]';
$labels['replyalldefault'] = 'répondre à tous';
$labels['replyalllist'] = 'répondre seulement à la liste de diffusion (si trouvée)';
@@ -477,7 +477,7 @@ $labels['folder'] = 'Dossier';
$labels['folders'] = 'Dossiers';
$labels['foldername'] = 'Nom du dossier';
$labels['subscribed'] = 'Abonné';
-$labels['messagecount'] = 'Messages';
+$labels['messagecount'] = 'Courriels';
$labels['create'] = 'Créer';
$labels['createfolder'] = 'Créer un nouveau dossier';
$labels['managefolders'] = 'Gérer les dossiers';
@@ -534,34 +534,34 @@ $labels['arialabeltasknav'] = 'Tâches de l\'application';
$labels['arialabeltoolbar'] = 'Barre d\'outils de l\'application';
$labels['arialabelactivetask'] = 'Tâche active';
$labels['arialabelmessagessearchfilter'] = 'Filtre de listage des courriels';
-$labels['arialabelmailsearchform'] = 'Formulaire de recherche des courriels';
+$labels['arialabelmailsearchform'] = 'Formulaire de recherche de courriels';
$labels['arialabelcontactsearchform'] = 'Formulaire de recherche des contacts';
$labels['arialabelmailquicksearchbox'] = 'Saisie de la recherche de courriels';
$labels['arialabelquicksearchbox'] = 'Saisie de la recherche';
$labels['arialabelfoldersearchfilter'] = 'Filtre de listage des dossiers';
$labels['arialabelfoldersearchform'] = 'Formulaire de recherche de dossiers';
$labels['arialabelfolderlist'] = 'Sélection du dossier des courriels';
-$labels['arialabelmessagelist'] = 'Listage des courriels';
-$labels['arialabelmailpreviewframe'] = 'Aperçu des messages';
+$labels['arialabelmessagelist'] = 'Listage de courriels';
+$labels['arialabelmailpreviewframe'] = 'Prévisualisation des courriels';
$labels['arialabelmailboxmenu'] = 'Menu d\'action des dossiers';
$labels['arialabellistselectmenu'] = 'Menu de sélection des listes';
$labels['arialabelthreadselectmenu'] = 'Menu de listage des fils';
-$labels['arialabelmessagelistoptions'] = 'Options d\'affichage et de tri des listes de messages';
-$labels['arialabelmailimportdialog'] = 'Fenêtre d\'Importation des messages';
-$labels['arialabelmessagenav'] = 'Parcourir les message';
-$labels['arialabelmessagebody'] = 'Corps des messages';
-$labels['arialabelmessageactions'] = 'Actions sur les messages';
+$labels['arialabelmessagelistoptions'] = 'Options d\'affichage et de tri des listes de courriels';
+$labels['arialabelmailimportdialog'] = 'Fenêtre d\'importation des courriels';
+$labels['arialabelmessagenav'] = 'Parcourir les courriels';
+$labels['arialabelmessagebody'] = 'Corps des courriels';
+$labels['arialabelmessageactions'] = 'Actions sur les courriels';
$labels['arialabelcontactquicksearch'] = 'Formulaire de recherche de contacts';
$labels['arialabelcontactsearchbox'] = 'Saisie de la recherche de contacts';
-$labels['arialabelmessageheaders'] = 'En-tête des messages';
+$labels['arialabelmessageheaders'] = 'En-tête des courriels';
$labels['arialabelforwardingoptions'] = 'Options de réacheminement';
$labels['arialabelreplyalloptions'] = 'Options de réponse à tous';
-$labels['arialabelmoremessageactions'] = 'Actions supplémentaires sur le message';
-$labels['arialabelmarkmessagesas'] = 'Marquer les messages sélectionnés comme...';
+$labels['arialabelmoremessageactions'] = 'Actions de courriel supplémentaires';
+$labels['arialabelmarkmessagesas'] = 'Marquer les courriels sélectionnés comme...';
$labels['arialabelcomposeoptions'] = 'Options de rédaction';
$labels['arialabelresponsesmenu'] = 'Menu des réponses pré-déterminées';
-$labels['arialabelattachmentuploadform'] = 'Formulaire de téléversement de fichiers joints';
-$labels['arialabelattachmentpreview'] = 'Aperçu des fichiers joints';
+$labels['arialabelattachmentuploadform'] = 'Formulaire de téléversement de pièce jointe';
+$labels['arialabelattachmentpreview'] = 'Prévisualisation des pièces jointes';
$labels['ariasummarycomposecontacts'] = 'Liste des contacts et des groupes à sélectionner comme destinataires';
$labels['arialabelcontactexportoptions'] = 'Options d\'exportation des contacts';
$labels['arialabelabookgroupoptions'] = 'Options du carnet d\'adresses/groupes';
@@ -575,8 +575,8 @@ Espace : sélectionner la rangée ciblée.
Maj + haut/bas : Sélectionner des rangées supplémentaires
au-dessus/en-dessous.
Ctl + espace : ajouter la rangée ciblée à la sélection/enlever la rangée ciblée de la sélection.";
-$labels['helplistkeyboardnavmessages'] = "Flèche droite/gauche : déplier/replier les fils de messages (en mode fils seulement).
-Entrée : ouvrir le message sélectionné/cible.
-Suppr : déplacer les messages sélectionnés vers la corbeille.";
+$labels['helplistkeyboardnavmessages'] = "Flèche droite/gauche : déplier/replier les fils de courriel (en mode fils seulement).
+Entrée : ouvrir le courriel sélectionné/cible.
+Suppr : déplacer les courriels sélectionnés vers la corbeille.";
$labels['helplistkeyboardnavcontacts'] = "Entrée : ouvrir le contact sélectionné/cible.";
?>
diff --git a/program/localization/fr_FR/messages.inc b/program/localization/fr_FR/messages.inc
index 8eb888ed9..9b7212aaf 100644
--- a/program/localization/fr_FR/messages.inc
+++ b/program/localization/fr_FR/messages.inc
@@ -29,47 +29,47 @@ $messages['requesttimedout'] = 'Délai de la requête expiré';
$messages['errorreadonly'] = 'Impossible d\'effectuer l\'opération. Le dossier est en lecture seule.';
$messages['errornoperm'] = 'Impossible d\'effectuer l\'opération. Permission refusée.';
$messages['erroroverquota'] = 'Impossible d\'effectuer l\'opération. Aucun espace disque libre.';
-$messages['erroroverquotadelete'] = 'Aucun espace disque libre. Utiliser Maj+Suppr pour supprimer un message.';
+$messages['erroroverquotadelete'] = 'Aucun espace disque libre. Utiliser Maj+Suppr pour supprimer un courriel.';
$messages['invalidrequest'] = 'Requête invalide ! Aucune donnée n\'a été enregistrée.';
$messages['invalidhost'] = 'Nom du serveur invalide.';
-$messages['nomessagesfound'] = 'Aucun message trouvé dans cette boîte de courriel';
+$messages['nomessagesfound'] = 'Aucun courriel trouvé dans cette boîte de courriel';
$messages['loggedout'] = 'Vous avez correctement terminé cette session. Au revoir !';
$messages['mailboxempty'] = 'La boîte de courriel est vide';
-$messages['nomessages'] = 'Aucun message';
+$messages['nomessages'] = 'Aucun courriel';
$messages['refreshing'] = 'Rafraîchissement...';
$messages['loading'] = 'Chargement...';
$messages['uploading'] = 'Téléversement du fichier...';
$messages['uploadingmany'] = 'Téléversement des fichiers...';
$messages['loadingdata'] = 'Chargement des données...';
-$messages['checkingmail'] = 'Vérification des nouveaux messages...';
-$messages['sendingmessage'] = 'Envoi du message...';
-$messages['messagesent'] = 'Le message a été envoyé avec succès.';
-$messages['savingmessage'] = 'Enregistrement du message...';
-$messages['messagesaved'] = 'Message sauvegardé dans Brouillons.';
+$messages['checkingmail'] = 'Vérification des nouveaux courriels...';
+$messages['sendingmessage'] = 'Envoi du courriel...';
+$messages['messagesent'] = 'Le courriel a été envoyé avec succès.';
+$messages['savingmessage'] = 'Enregistrement du courriel...';
+$messages['messagesaved'] = 'Courriel sauvegardé dans Brouillons.';
$messages['successfullysaved'] = 'Enregistré avec succès.';
$messages['savingresponse'] = 'Enregistrement du texte de réponse...';
$messages['deleteresponseconfirm'] = 'Voulez-vous vraiment supprimer ce texte de réponse ?';
$messages['addedsuccessfully'] = 'Le contact a été ajouté avec succès au carnet d\'adresses.';
$messages['contactexists'] = 'Un contact avec la même adresse courriel existe déjà.';
$messages['contactnameexists'] = 'Un contact avec le même nom existe déjà.';
-$messages['blockedimages'] = 'Pour protéger votre confidentialité, les images distantes sont bloquées dans ce message.';
-$messages['encryptedmessage'] = 'Ce message est chiffré et ne peut pas être affiché. Désolé !';
+$messages['blockedimages'] = 'Pour protéger votre confidentialité, les images distantes sont bloquées dans ce courriel.';
+$messages['encryptedmessage'] = 'Ce courriel est chiffré et ne peut pas être affiché. Désolé !';
$messages['nocontactsfound'] = 'Aucun contact n\'a été trouvé.';
$messages['contactnotfound'] = 'Le contact demandé n\'a pas été trouvé.';
$messages['contactsearchonly'] = 'Saisir des termes d\'interrogation pour trouver des contacts.';
-$messages['sendingfailed'] = 'Échec lors de l\'envoi du message.';
-$messages['senttooquickly'] = 'Veuillez patienter $sec s avant d\'envoyer ce message.';
-$messages['errorsavingsent'] = 'Une erreur est survenue durant l\'enregistrement du message envoyé.';
+$messages['sendingfailed'] = 'Échec lors de l\'envoi du courriel.';
+$messages['senttooquickly'] = 'Veuillez patienter $sec s avant d\'envoyer ce courriel.';
+$messages['errorsavingsent'] = 'Une erreur est survenue durant l\'enregistrement du courriel envoyé.';
$messages['errorsaving'] = 'Une erreur est survenue durant l\'enregistrement.';
-$messages['errormoving'] = 'Impossible de déplacer le(s) message(s).';
-$messages['errorcopying'] = 'Impossible de copier le(s) message(s).';
-$messages['errordeleting'] = 'Impossible de supprimer le(s) message(s).';
-$messages['errormarking'] = 'Impossible de marquer le(s) message(s).';
+$messages['errormoving'] = 'Impossible de déplacer le/les courriel(s).';
+$messages['errorcopying'] = 'Impossible de copier le/les courriel(s).';
+$messages['errordeleting'] = 'Impossible de supprimer le/les courriel(s).';
+$messages['errormarking'] = 'Impossible de marquer le/les courriel(s).';
$messages['deletecontactconfirm'] = 'Voulez-vous vraiment supprimer le(s) contact(s) sélectionné(s) ?';
$messages['deletegroupconfirm'] = 'Voulez-vous vraiment supprimer le groupe sélectionné ?';
-$messages['deletemessagesconfirm'] = 'Voulez-vous vraiment supprimer le(s) message(s) sélectionné(s) ?';
+$messages['deletemessagesconfirm'] = 'Voulez-vous vraiment supprimer le/les courriel(s) sélectionné(s) ?';
$messages['deletefolderconfirm'] = 'Voulez-vous vraiment supprimer ce dossier ?';
-$messages['purgefolderconfirm'] = 'Voulez-vous vraiment supprimer tous les messages dans ce dossier ?';
+$messages['purgefolderconfirm'] = 'Voulez-vous vraiment supprimer tous les courriels dans ce dossier ?';
$messages['contactdeleting'] = 'Suppression des contacts...';
$messages['groupdeleting'] = 'Suppression du groupe...';
$messages['folderdeleting'] = 'Suppression du dossier...';
@@ -83,13 +83,13 @@ $messages['nopagesizewarning'] = 'Veuillez saisir une taille de page.';
$messages['nosenderwarning'] = 'Veuillez saisir l\'adresse courriel de l\'expéditeur.';
$messages['norecipientwarning'] = 'Veuillez saisir au moins un destinataire.';
$messages['nosubjectwarning'] = 'Le champ « Objet » est vide. Voudriez-vous le saisir maintenant ?';
-$messages['nobodywarning'] = 'Envoyer ce message sans texte ?';
-$messages['notsentwarning'] = 'Le message n\'a pas été envoyé. Voulez-vous abandonner ce message ?';
-$messages['restoresavedcomposedata'] = 'Un message précédemment rédigé mais non envoyé a été trouvé.\n\nObjet : $subject\nEnregistré le : $date\n\nVoulez-vous restaurer ce message ?';
+$messages['nobodywarning'] = 'Envoyer ce courriel sans texte ?';
+$messages['notsentwarning'] = 'Le courriel n\'a pas été envoyé. Voulez-vous abandonner ce courriel ?';
+$messages['restoresavedcomposedata'] = 'Un courriel rédigé précédemment mais non envoyé a été trouvé.\n\nObjet : $subject\nEnregistré le : $date\n\nVoulez-vous restaurer ce courriel ?';
$messages['noldapserver'] = 'Veuillez choisir un serveur ldap à rechercher.';
$messages['nosearchname'] = 'Veuillez saisir un nom de contact ou une adresse de courriel.';
-$messages['notuploadedwarning'] = 'Tous les fichiers joints n\'ont pas encore été téléversés. Veuillez patienter ou annuler le téléversement.';
-$messages['searchsuccessful'] = '$nr messages trouvés.';
+$messages['notuploadedwarning'] = 'Toutes les pièces jointes n\'ont pas encore été téléversées. Veuillez patienter ou annuler le téléversement.';
+$messages['searchsuccessful'] = '$nr courriels trouvés.';
$messages['contactsearchsuccessful'] = '$nr contacts trouvés.';
$messages['searchnomatch'] = 'La recherche n\'a retourné aucun résultat.';
$messages['searching'] = 'Recherche...';
@@ -103,7 +103,7 @@ $messages['folderpurged'] = 'Le dossier a été vidé avec succès.';
$messages['folderexpunged'] = 'Le dossier a été compacté avec succès.';
$messages['deletedsuccessfully'] = 'Supprimé avec succès.';
$messages['converting'] = 'Suppression de la mise en forme...';
-$messages['messageopenerror'] = 'Impossible de charger le message depuis le serveur.';
+$messages['messageopenerror'] = 'Impossible de charger le courriel depuis le serveur.';
$messages['fileuploaderror'] = 'Échec lors du téléversement du fichier';
$messages['filesizeerror'] = 'Le fichier téléversé dépasse la taille maximale de $size.';
$messages['copysuccess'] = '$nr contacts copiés avec succès.';
@@ -112,12 +112,12 @@ $messages['copyerror'] = 'Aucun contact n\'a pu être copié.';
$messages['moveerror'] = 'Aucun contact n\'a pu être déplacé.';
$messages['sourceisreadonly'] = 'Cette source d\'adresse est en lecture seule.';
$messages['errorsavingcontact'] = 'Impossible d\'enregistrer l\'adresse du contact.';
-$messages['movingmessage'] = 'Déplacement des messages...';
-$messages['copyingmessage'] = 'Copie des messages...';
+$messages['movingmessage'] = 'Déplacement du/des courriel(s)...';
+$messages['copyingmessage'] = 'Copie des courriels...';
$messages['copyingcontact'] = 'Copie des contacts...';
$messages['movingcontact'] = 'Déplacement des contacts...';
-$messages['deletingmessage'] = 'Suppression des messages...';
-$messages['markingmessage'] = 'Marquage des messages...';
+$messages['deletingmessage'] = 'Suppression du/des courriel(s)...';
+$messages['markingmessage'] = 'Marquage du/des courriel(s)...';
$messages['addingmember'] = 'Ajout des contacts au groupe...';
$messages['removingmember'] = 'Suppression des contacts du groupe...';
$messages['receiptsent'] = 'L\'accusé de lecture a été avec succès.';
@@ -134,12 +134,12 @@ $messages['importwait'] = 'Importation, veuillez patienter...';
$messages['importformaterror'] = 'Échec lors de l\'importation ! Le fichier téléversé n\'est pas un fichier d\'importation de données valide.';
$messages['importconfirm'] = '<b>Les $inserted contacts ont été importés avec succès</b>';
$messages['importconfirmskipped'] = '<b>Les $skipped entrées existantes ont été ignorées</b>';
-$messages['importmessagesuccess'] = '$nr messages importés avec succès';
-$messages['importmessageerror'] = 'L\'importation a échoué ! Le fichier téléversé n\'est pas un message valide ou un fichier de boîte de courriel.';
+$messages['importmessagesuccess'] = '$nr courriels importés avec succès';
+$messages['importmessageerror'] = 'L\'importation a échoué ! Le fichier téléversé n\'est pas un courriel valide ou un fichier de boîte de courriel.';
$messages['opnotpermitted'] = 'Opération non permise !';
$messages['nofromaddress'] = 'Adresse courriel manquante dans l\'identité choisie.';
$messages['editorwarning'] = 'Changer de type d\'éditeur pourrait causer la perte du formatage du texte. Souhaitez-vous continuer ?';
-$messages['httpreceivedencrypterror'] = 'Une erreur fatale de configuration est survenue. Contactez votre administrateur immédiatement. <b>Votre message ne peut pas être envoyé.</b>';
+$messages['httpreceivedencrypterror'] = 'Une erreur fatale de configuration est survenue. Contactez votre administrateur immédiatement. <b>Votre courriel ne peut pas être envoyé.</b>';
$messages['smtpconnerror'] = 'Erreur SMTP ($code) : échec lors de la connexion au serveur.';
$messages['smtpautherror'] = 'Erreur SMTP ($code) : échec lors de l\'authentification.';
$messages['smtpfromerror'] = 'Erreur SMTP ($code) : impossible de définir l\'expéditeur « $from » ($msg)';
@@ -161,10 +161,10 @@ $messages['savedsearchdeleted'] = 'Recherche enregistrée supprimée avec succè
$messages['savedsearchdeleteerror'] = 'Impossible de supprimer la recherche enregistrée.';
$messages['savedsearchcreated'] = 'Recherche enregistrée créée avec succès.';
$messages['savedsearchcreateerror'] = 'Impossible de créer la recherche enregistrée.';
-$messages['messagedeleted'] = 'Messages supprimés avec succès.';
-$messages['messagemoved'] = 'Messages déplacés avec succès.';
-$messages['messagecopied'] = 'Messages copiés avec succès.';
-$messages['messagemarked'] = 'Messages marqués avec succès.';
+$messages['messagedeleted'] = 'Courriel(s) supprimé(s) avec succès.';
+$messages['messagemoved'] = 'Courriel(s) déplacé(s) avec succès.';
+$messages['messagecopied'] = 'Courriel(s) copié(s) avec succès.';
+$messages['messagemarked'] = 'Courriel(s) marqué(s) avec succès.';
$messages['autocompletechars'] = 'Saisir au moins $min caractères pour le remplissage automatique.';
$messages['autocompletemore'] = 'Plusieurs entrées concordantes trouvées. Veuillez taper plus de caractères.';
$messages['namecannotbeempty'] = 'Le nom ne peut pas être vide.';
@@ -172,9 +172,9 @@ $messages['nametoolong'] = 'Le nom est trop long.';
$messages['folderupdated'] = 'Dossier mis à jour avec succès.';
$messages['foldercreated'] = 'Dossier créé avec succès.';
$messages['invalidimageformat'] = 'N\'est pas un format d\'image valide.';
-$messages['mispellingsfound'] = 'Fautes d\'orthographe détectées dans le message.';
+$messages['mispellingsfound'] = 'Fautes d\'orthographe détectées dans le courriel.';
$messages['parentnotwritable'] = 'Impossible de créer/déplacer le dossier dans le dossier parent choisi. Aucun droit d\'accès.';
$messages['messagetoobig'] = 'La partie message est trop grosse pour être traité.';
-$messages['attachmentvalidationerror'] = 'AVERTISSEMENT ! Ce fichier joint est suspect parce que son type ne correspond pas au type déclaré dans le message. Si vous ne faites pas confiance à l\'expéditeur, vous ne devriez pas l\'ouvrir dans le navigateur car son contenu peut être malveillant.<br/><br/><em>Attendu : $expected ; trouvé : $detected</em>';
+$messages['attachmentvalidationerror'] = 'AVERTISSEMENT ! Cette pièce jointe est suspecte car son type ne correspond pas au type déclaré dans le courriel. Si vous ne faites pas confiance à l\'expéditeur, vous ne devriez pas l\'ouvrir dans le navigateur car son contenu peut être malveillant.<br/><br/><em>Attendu : $expected ; trouvé : $detected</em>';
$messages['noscriptwarning'] = 'Avertissement : Ce service de courriel Web exige Javascript ! Afin de l\'utiliser, veuillez activer Javascript dans les paramètres de votre navigateur.';
?>
diff --git a/program/localization/fy_NL/labels.inc b/program/localization/fy_NL/labels.inc
index b2787579c..86d158ff3 100644
--- a/program/localization/fy_NL/labels.inc
+++ b/program/localization/fy_NL/labels.inc
@@ -15,17 +15,19 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/labels/
*/
+$labels['welcome'] = 'Wolkom by $product';
$labels['username'] = 'Brûkersnamme';
$labels['password'] = 'Wachtwurd';
$labels['server'] = 'Server';
$labels['login'] = 'Ynlogge';
$labels['logout'] = 'Ôfmelde';
-$labels['mail'] = 'Mail';
+$labels['mail'] = 'E-mail';
$labels['settings'] = 'Ynstellingen';
$labels['addressbook'] = 'Adresboek';
$labels['drafts'] = 'Konsepten';
$labels['sent'] = 'Stjoerd';
$labels['trash'] = 'Jiskefet';
+$labels['junk'] = 'Spam';
$labels['subject'] = 'Ûnderwerp';
$labels['from'] = 'Fan';
$labels['to'] = 'Oan';
@@ -34,20 +36,24 @@ $labels['bcc'] = 'Bcc';
$labels['replyto'] = 'Antwurd oan';
$labels['followupto'] = 'Oanslutend oan';
$labels['date'] = 'Datum';
+$labels['size'] = 'Grutte';
+$labels['priority'] = 'Prioriteit';
$labels['organization'] = 'Organisaasje';
$labels['mailboxlist'] = 'Mappen';
+$labels['messagenrof'] = 'Berjocht $nr fan $count';
$labels['copy'] = 'Kopieare';
$labels['move'] = 'Ferplaatse';
$labels['download'] = 'Delhelje';
$labels['showattachment'] = 'Toane';
+$labels['filename'] = 'Triemnamme';
$labels['filesize'] = 'Triemgrutte';
-$labels['sun'] = 'sne';
-$labels['mon'] = 'moa';
-$labels['tue'] = 'tii';
-$labels['wed'] = 'woa';
-$labels['thu'] = 'toa';
-$labels['fri'] = 'fre';
-$labels['sat'] = 'sno';
+$labels['sun'] = 'si';
+$labels['mon'] = 'mo';
+$labels['tue'] = 'ti';
+$labels['wed'] = 'wo';
+$labels['thu'] = 'to';
+$labels['fri'] = 'fr';
+$labels['sat'] = 'so';
$labels['sunday'] = 'snein';
$labels['monday'] = 'moandei';
$labels['tuesday'] = 'tiisdei';
@@ -59,7 +65,7 @@ $labels['jan'] = 'jan';
$labels['feb'] = 'feb';
$labels['mar'] = 'mrt';
$labels['apr'] = 'apr';
-$labels['may'] = 'maaie';
+$labels['may'] = 'mai';
$labels['jun'] = 'jun';
$labels['jul'] = 'jul';
$labels['aug'] = 'aug';
@@ -82,5 +88,50 @@ $labels['longdec'] = 'desimber';
$labels['today'] = 'Hjoed';
$labels['refresh'] = 'Ferfarskje';
$labels['reply'] = 'Beäntwurdzje';
+$labels['more'] = 'Mear';
+$labels['back'] = 'Werom';
+$labels['options'] = 'Opsjes';
+$labels['previous'] = 'Foarige';
+$labels['next'] = 'Folgjende';
+$labels['select'] = 'Selektearje';
+$labels['all'] = 'Alle';
+$labels['none'] = 'Gjin';
+$labels['attachment'] = 'Taheakke';
+$labels['nonesort'] = 'Gjin';
+$labels['type'] = 'Type';
+$labels['namex'] = 'Namme';
+$labels['selectmedia'] = 'Fideo selektearje';
+$labels['responsename'] = 'Namme';
+$labels['andnmore'] = '$nr mear...';
+$labels['htmltoggle'] = 'HTML';
+$labels['country'] = 'Lân';
+$labels['edit'] = 'Bewurkje';
+$labels['cancel'] = 'Annulearje';
+$labels['addphoto'] = 'Tafoegje';
+$labels['addgroup'] = 'Groep tafoegje';
+$labels['groupdelete'] = 'Groep fuortsmite';
+$labels['group'] = 'Groep';
+$labels['done'] = 'Klear';
+$labels['about'] = 'Oer';
+$labels['preferences'] = 'Foarkarren';
+$labels['htmlmessage'] = 'HTML-berjocht';
+$labels['language'] = 'Taal';
+$labels['timezone'] = 'Tiidsône';
+$labels['newmessage'] = 'Nij berjocht';
$labels['folders'] = 'Mappen';
+$labels['messagecount'] = 'Berjochten';
+$labels['version'] = 'Ferzje';
+$labels['source'] = 'Boarne';
+$labels['license'] = 'Lisinsje';
+$labels['B'] = 'B';
+$labels['KB'] = 'KB';
+$labels['MB'] = 'MB';
+$labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Ingelsk';
+$labels['greek'] = 'Gryksk';
+$labels['turkish'] = 'Turksk';
+$labels['japanese'] = 'Japansk';
+$labels['korean'] = 'Koreaansk';
+$labels['chinese'] = 'Sineesk';
?>
diff --git a/program/localization/fy_NL/messages.inc b/program/localization/fy_NL/messages.inc
new file mode 100644
index 000000000..bfad068ab
--- /dev/null
+++ b/program/localization/fy_NL/messages.inc
@@ -0,0 +1,20 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | localization/<lang>/messages.inc |
+ | |
+ | Localization file of the Roundcube Webmail client |
+ | Copyright (C) 2005-2014, The Roundcube Dev Team |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ +-----------------------------------------------------------------------+
+
+ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/messages/
+*/
+$messages['servererror'] = 'Serverflater!';
+$messages['dberror'] = 'Databaseflater!';
+?>
diff --git a/program/localization/he_IL/labels.inc b/program/localization/he_IL/labels.inc
index 8256302f2..8c1b4526e 100644
--- a/program/localization/he_IL/labels.inc
+++ b/program/localization/he_IL/labels.inc
@@ -221,6 +221,7 @@ $labels['resumeediting'] = 'המשך עריכה';
$labels['revertto'] = 'חזור למצב קודם';
$labels['restore'] = 'שיחזור';
$labels['restoremessage'] = 'לשחזר הודעה?';
+$labels['ignore'] = 'להתעלם';
$labels['responses'] = 'תגובות';
$labels['insertresponse'] = 'הכנסת תגובה';
$labels['manageresponses'] = 'ניהול תגובות';
@@ -408,6 +409,7 @@ $labels['askuser'] = 'שאל את המשתמש';
$labels['autosend'] = 'שליחה אוטומטית';
$labels['autosendknown'] = 'משלוח אישור קבלה רק לאנשי הקשר שלי';
$labels['autosendknownignore'] = 'משלוח אישור קבלה לאנשי הקשר שלי בלבד ולהתעלם מאחרים';
+$labels['ignorerequest'] = 'להתעלם מהבקשה';
$labels['readwhendeleted'] = 'סימון הודעה כנקראה לאחר מחיקה';
$labels['flagfordeletion'] = 'סימון הודעה כמחוקה במקום מחיקה';
$labels['skipdeleted'] = 'הסתרת הודעות שנמחקו';
diff --git a/program/localization/hu_HU/labels.inc b/program/localization/hu_HU/labels.inc
index d39703b50..657b45a09 100644
--- a/program/localization/hu_HU/labels.inc
+++ b/program/localization/hu_HU/labels.inc
@@ -220,6 +220,7 @@ $labels['resumeediting'] = 'Helyesírás-ellenőrzés vége';
$labels['revertto'] = 'Visszaállítás erre';
$labels['restore'] = 'Visszaállítás';
$labels['restoremessage'] = 'Üzenet visszaállítás';
+$labels['ignore'] = 'figyelmen kivül hagy';
$labels['responses'] = 'Válaszok';
$labels['insertresponse'] = 'Egy válasz beillesztése';
$labels['manageresponses'] = 'Válaszok kezelése';
@@ -291,6 +292,7 @@ $labels['assistant'] = 'Asszisztens';
$labels['spouse'] = 'Házastárs';
$labels['allfields'] = 'Összes mező';
$labels['search'] = 'Keresés';
+$labels['searchresult'] = 'Keresés eredménye';
$labels['advsearch'] = 'Részletes keresés';
$labels['advanced'] = 'Haladó';
$labels['other'] = 'Egyéb';
@@ -333,6 +335,8 @@ $labels['export'] = 'Exportálás';
$labels['exportall'] = 'Összes exportálása';
$labels['exportsel'] = 'Kijelöltek exportálása';
$labels['exportvcards'] = 'Kapcsolatok exportálása vCard formátumban';
+$labels['newgroup'] = 'Új csoport létrehozása';
+$labels['addgroup'] = 'Csoport hozzáadása';
$labels['grouprename'] = 'Csoport átnevezése';
$labels['groupdelete'] = 'Csoport törlése';
$labels['groupremoveselected'] = 'A kijelölt partnerek törlése a csopotból';
@@ -365,6 +369,8 @@ $labels['editpreferences'] = 'Felhasználói beállítások szerkesztése';
$labels['identities'] = 'Azonosítók';
$labels['manageidentities'] = 'Azonosítók kezelése';
$labels['newidentity'] = 'Új azonosító létrehozása';
+$labels['addidentity'] = 'Azonosító hozzáadása';
+$labels['editidentity'] = 'Azonosító szerkesztése';
$labels['preferhtml'] = 'HTML megjelenítés';
$labels['defaultcharset'] = 'Alapértelmezett karakterkódolás';
$labels['htmlmessage'] = 'HTML üzenet';
@@ -399,7 +405,7 @@ $labels['askuser'] = 'kérdezzen rá';
$labels['autosend'] = 'automatikus küldés';
$labels['autosendknown'] = 'küldés csak a címjegyzékben lévő kapcsolataimnak, egyéb esetben kérdezzen rá';
$labels['autosendknownignore'] = 'küldés csak a címjegyzékben lévő kapcsolataimnak, egyéb esetben nem';
-$labels['ignore'] = 'hagyja figyelmen kívül';
+$labels['ignorerequest'] = 'a kérés figyelmen kivül hagyása';
$labels['readwhendeleted'] = 'Üzenet olvasottként jelölése törléskor';
$labels['flagfordeletion'] = 'Üzenet törlendőnek jelölése törlés helyett';
$labels['skipdeleted'] = 'Törölt üzenetek ne legyenek megjelenítve';
@@ -484,6 +490,10 @@ $labels['foldertype'] = 'Mappa típusa';
$labels['personalfolder'] = 'Privát mappa';
$labels['otherfolder'] = 'Más felhasználó(k) mappája';
$labels['sharedfolder'] = 'Megosztott mappa';
+$labels['findfolders'] = 'Mappa kerésése';
+$labels['namespace.personal'] = 'Személyes';
+$labels['namespace.other'] = 'Más felhasználók';
+$labels['namespace.shared'] = 'Megosztva';
$labels['sortby'] = 'Rendezés';
$labels['sortasc'] = 'növekvő';
$labels['sortdesc'] = 'csökkenő';
@@ -516,4 +526,5 @@ $labels['vietnamese'] = 'Vietnámi';
$labels['japanese'] = 'Japán';
$labels['korean'] = 'Koreai';
$labels['chinese'] = 'Kínai';
+$labels['arialabelactivetask'] = 'Aktiv feladat';
?>
diff --git a/program/localization/ia/labels.inc b/program/localization/ia/labels.inc
index 71e13f5c1..d40aba076 100644
--- a/program/localization/ia/labels.inc
+++ b/program/localization/ia/labels.inc
@@ -19,32 +19,44 @@ $labels['welcome'] = 'Benvenite a $product';
$labels['username'] = 'Nomine de usator';
$labels['password'] = 'Contrasigno';
$labels['server'] = 'Servitor';
-$labels['login'] = 'Apertura de session';
+$labels['login'] = 'Aperir session';
$labels['logout'] = 'Clauder session';
-$labels['mail'] = 'E-posta';
+$labels['mail'] = 'E-mail';
$labels['settings'] = 'Configurationes';
$labels['addressbook'] = 'Adressario';
$labels['inbox'] = 'Cassa de entrata';
+$labels['drafts'] = 'Versiones provisori';
$labels['sent'] = 'Inviate';
+$labels['trash'] = 'Corbe a papiro';
+$labels['junk'] = 'Posta indesirate';
+$labels['show_real_foldernames'] = 'Monstrar nomines real pro dossieres special';
$labels['subject'] = 'Subjecto';
-$labels['from'] = 'Ex';
+$labels['from'] = 'De';
$labels['sender'] = 'Expeditor';
$labels['to'] = 'A';
$labels['cc'] = 'Cc';
$labels['bcc'] = 'Bcc';
$labels['replyto'] = 'Responder a';
+$labels['followupto'] = 'Continuar discussion in';
$labels['date'] = 'Data';
$labels['size'] = 'Dimension';
$labels['priority'] = 'Prioritate';
$labels['organization'] = 'Organisation';
+$labels['readstatus'] = 'Stato de lectura';
+$labels['listoptions'] = 'Optiones de lista...';
$labels['mailboxlist'] = 'Dossieres';
+$labels['messagesfromto'] = 'Messages $from a $to de $count';
+$labels['threadsfromto'] = 'Topicos $from a $to de $count';
$labels['messagenrof'] = 'Message $nr de $count';
$labels['fromtoshort'] = '$from – $to de $count';
$labels['copy'] = 'Copiar';
-$labels['move'] = 'Mover';
-$labels['moveto'] = 'Mover a';
+$labels['move'] = 'Displaciar';
+$labels['moveto'] = 'Displaciar a...';
+$labels['copyto'] = 'Copiar a...';
$labels['download'] = 'Discargar';
+$labels['open'] = 'Aperir';
$labels['showattachment'] = 'Monstrar';
+$labels['showanyway'] = 'Monstrar lo in omne caso';
$labels['filename'] = 'Nomine de file';
$labels['filesize'] = 'Dimension del file';
$labels['addtoaddressbook'] = 'Adder al adressario';
@@ -55,89 +67,177 @@ $labels['wed'] = 'mer';
$labels['thu'] = 'jov';
$labels['fri'] = 'ven';
$labels['sat'] = 'sab';
-$labels['sunday'] = 'Dominica';
-$labels['monday'] = 'Lunedi';
-$labels['tuesday'] = 'Martedi';
-$labels['wednesday'] = 'Mercuridi';
-$labels['thursday'] = 'Jovedi';
-$labels['friday'] = 'Venerdi';
-$labels['saturday'] = 'Sabbato';
-$labels['jan'] = 'Jan';
-$labels['feb'] = 'Feb';
-$labels['mar'] = 'Mar';
-$labels['apr'] = 'Apr';
-$labels['may'] = 'Mai';
-$labels['jun'] = 'Jun';
-$labels['jul'] = 'Jul';
-$labels['aug'] = 'Aug';
-$labels['sep'] = 'Sep';
-$labels['oct'] = 'Oct';
-$labels['nov'] = 'Nov';
-$labels['dec'] = 'Dec';
+$labels['sunday'] = 'dominica';
+$labels['monday'] = 'lunedi';
+$labels['tuesday'] = 'martedi';
+$labels['wednesday'] = 'mercuridi';
+$labels['thursday'] = 'jovedi';
+$labels['friday'] = 'venerdi';
+$labels['saturday'] = 'sabbato';
+$labels['jan'] = 'jan';
+$labels['feb'] = 'feb';
+$labels['mar'] = 'mar';
+$labels['apr'] = 'apr';
+$labels['may'] = 'mai';
+$labels['jun'] = 'jun';
+$labels['jul'] = 'jul';
+$labels['aug'] = 'aug';
+$labels['sep'] = 'sep';
+$labels['oct'] = 'oct';
+$labels['nov'] = 'nov';
+$labels['dec'] = 'dec';
$labels['longjan'] = 'januario';
-$labels['longfeb'] = 'Februario';
-$labels['longmar'] = 'Martio';
-$labels['longapr'] = 'April';
-$labels['longmay'] = 'Mai';
-$labels['longjun'] = 'Junio';
-$labels['longjul'] = 'Julio';
-$labels['longaug'] = 'Augusto';
-$labels['longsep'] = 'Septembre';
-$labels['longoct'] = 'Octobre';
-$labels['longnov'] = 'Novembre';
-$labels['longdec'] = 'Decembre';
-$labels['today'] = 'Hodie';
+$labels['longfeb'] = 'februario';
+$labels['longmar'] = 'martio';
+$labels['longapr'] = 'april';
+$labels['longmay'] = 'mai';
+$labels['longjun'] = 'junio';
+$labels['longjul'] = 'julio';
+$labels['longaug'] = 'augusto';
+$labels['longsep'] = 'septembre';
+$labels['longoct'] = 'octobre';
+$labels['longnov'] = 'novembre';
+$labels['longdec'] = 'decembre';
+$labels['today'] = 'hodie';
$labels['refresh'] = 'Refrescar';
-$labels['checkmail'] = 'Verificar nove messages';
+$labels['checkmail'] = 'Verificar si il ha nove messages';
$labels['compose'] = 'Componer';
$labels['writenewmessage'] = 'Crear un nove message';
$labels['reply'] = 'Responder';
+$labels['replytomessage'] = 'Responder al expeditor';
+$labels['replytoallmessage'] = 'Responder al lista o al expeditor e tote le destinatarios';
$labels['replyall'] = 'Responder a totes';
-$labels['replylist'] = 'Responder a lista';
+$labels['replylist'] = 'Responder al lista';
+$labels['forward'] = 'Reinviar';
+$labels['forwardinline'] = 'Reinviar in texto de message';
+$labels['forwardattachment'] = 'Reinviar como attachamento';
+$labels['forwardmessage'] = 'Reinviar le message';
$labels['deletemessage'] = 'Deler messsage';
+$labels['movemessagetotrash'] = 'Jectar message in corbe';
$labels['printmessage'] = 'Imprimer iste message';
+$labels['previousmessage'] = 'Monstrar previe message';
+$labels['firstmessage'] = 'Monstrar prime message';
+$labels['nextmessage'] = 'Monstrar proxime message';
+$labels['lastmessage'] = 'Monstrar ultime message';
+$labels['backtolist'] = 'Retornar al lista de messages';
$labels['viewsource'] = 'Monstrar fonte';
$labels['mark'] = 'Marcar';
$labels['markmessages'] = 'Marcar messages';
+$labels['markread'] = 'Como legite';
+$labels['markunread'] = 'Como non legite';
+$labels['markflagged'] = 'Como signalate';
+$labels['markunflagged'] = 'Como non signalate';
+$labels['moreactions'] = 'Altere actiones...';
$labels['more'] = 'Plus';
$labels['back'] = 'Retornar';
$labels['options'] = 'Optiones';
+$labels['first'] = 'Prime';
+$labels['last'] = 'Ultime';
+$labels['previous'] = 'Previe';
+$labels['next'] = 'Proxime';
$labels['select'] = 'Seliger';
$labels['all'] = 'Totes';
-$labels['none'] = 'Necun';
+$labels['none'] = 'Nulle';
+$labels['currpage'] = 'Pagina actual';
+$labels['isread'] = 'Legite';
$labels['unread'] = 'Non legite';
-$labels['flagged'] = 'Marcate';
-$labels['deleted'] = 'Delete';
+$labels['flagged'] = 'Signalate';
+$labels['unflagged'] = 'Non signalate';
+$labels['unanswered'] = 'Non respondite';
+$labels['withattachment'] = 'Con attachamento';
+$labels['deleted'] = 'Delite';
+$labels['undeleted'] = 'Non delite';
+$labels['replied'] = 'Respondite';
+$labels['forwarded'] = 'Reinviate';
$labels['invert'] = 'Inverter';
$labels['filter'] = 'Filtro';
$labels['list'] = 'Lista';
$labels['threads'] = 'Topicos';
-$labels['flag'] = 'Marcar';
+$labels['expand-all'] = 'Displicar totes';
+$labels['expand-unread'] = 'Displicar non legite';
+$labels['collapse-all'] = 'Plicar totes';
+$labels['threaded'] = 'Vista arborescente';
+$labels['autoexpand_threads'] = 'Displicar topicos de messages';
+$labels['do_expand'] = 'tote le topicos';
+$labels['expand_only_unread'] = 'solmente con messages non legite';
+$labels['fromto'] = 'De/A';
+$labels['flag'] = 'Signalar';
$labels['attachment'] = 'Attachamento';
-$labels['nonesort'] = 'Necun';
+$labels['nonesort'] = 'Nulle';
+$labels['sentdate'] = 'Data de invio';
+$labels['arrival'] = 'Data de arrivata';
+$labels['asc'] = 'ascendente';
+$labels['desc'] = 'descendente';
+$labels['listcolumns'] = 'Columnas de lista';
+$labels['listsorting'] = 'Columna clave';
+$labels['listorder'] = 'Ordinamento';
+$labels['listmode'] = 'Visualisation de lista';
$labels['folderactions'] = 'Actiones de dossier...';
$labels['compact'] = 'Compacte';
$labels['empty'] = 'Vacue';
+$labels['importmessages'] = 'Importar messages';
+$labels['quota'] = 'Spatio occupate';
$labels['unknown'] = 'incognite';
-$labels['quicksearch'] = 'Cerca rapide';
-$labels['resetsearch'] = 'Reinitialisar cerca';
+$labels['unlimited'] = 'sin limite';
+$labels['quotatype'] = 'Typo de quota';
+$labels['quotatotal'] = 'Limite';
+$labels['quotaused'] = 'Usate';
+$labels['quotastorage'] = 'Spatio de immagazinage';
+$labels['quotamessage'] = 'Numero de messages';
+$labels['quicksearch'] = 'Recerca rapide';
+$labels['resetsearch'] = 'Reinitialisar recerca';
+$labels['searchmod'] = 'Modificatores de recerca';
$labels['msgtext'] = 'Message complete';
+$labels['body'] = 'Texto';
+$labels['type'] = 'Typo';
+$labels['namex'] = 'Nomine';
+$labels['searchscope'] = 'Ambito';
+$labels['currentfolder'] = 'Dossier actual';
+$labels['subfolders'] = 'Iste e subdossieres';
+$labels['allfolders'] = 'Tote le dossieres';
$labels['openinextwin'] = 'Aperir in nove fenestra';
+$labels['emlsave'] = 'Discargar (.eml)';
+$labels['changeformattext'] = 'Monstrar in formato de texto simple';
+$labels['changeformathtml'] = 'Monstrar in formato HTML';
$labels['editasnew'] = 'Modificar como nove';
+$labels['send'] = 'Inviar';
$labels['sendmessage'] = 'Inviar message';
$labels['savemessage'] = 'Salveguardar como version provisori';
$labels['addattachment'] = 'Attachar un file';
-$labels['charset'] = 'Insimul de Characteres';
+$labels['charset'] = 'Codification de characteres';
$labels['editortype'] = 'Typo de editor';
+$labels['returnreceipt'] = 'Confirmation de reception';
+$labels['dsn'] = 'Notification de stato de livration';
+$labels['mailreplyintro'] = 'Le $date, $sender ha scribite:';
$labels['originalmessage'] = 'Message original';
+$labels['selectimage'] = 'Seliger imagine';
+$labels['addimage'] = 'Adder imagine';
+$labels['selectmedia'] = 'Seliger film';
+$labels['addmedia'] = 'Adder film';
$labels['editidents'] = 'Modificar identitates';
$labels['spellcheck'] = 'Orthographia';
$labels['checkspelling'] = 'Verificar orthographia';
+$labels['resumeediting'] = 'Continuar le modification';
+$labels['revertto'] = 'Reverter a';
+$labels['restore'] = 'Restaurar';
+$labels['restoremessage'] = 'Restaurar le message?';
+$labels['ignore'] = 'Ignorar';
+$labels['responses'] = 'Responsas';
+$labels['insertresponse'] = 'Inserer un responsa';
+$labels['manageresponses'] = 'Gerer responsas';
+$labels['newresponse'] = 'Crear nove responsa';
+$labels['addresponse'] = 'Adder responsa';
+$labels['editresponse'] = 'Modificar responsa';
+$labels['editresponses'] = 'Modificar responsas';
+$labels['responsename'] = 'Nomine';
+$labels['responsetext'] = 'Texto del responsa';
$labels['attach'] = 'Attachar';
$labels['attachments'] = 'Attachamentos';
$labels['upload'] = 'Incargar';
+$labels['uploadprogress'] = '$percent ($current de $total)';
$labels['close'] = 'Clauder';
$labels['messageoptions'] = 'Optiones de message...';
+$labels['togglecomposeoptions'] = 'Alternar optiones de composition';
$labels['low'] = 'Basse';
$labels['lowest'] = 'Minimal';
$labels['normal'] = 'Normal';
@@ -145,20 +245,36 @@ $labels['high'] = 'Alte';
$labels['highest'] = 'Maximal';
$labels['nosubject'] = '(sin subjecto)';
$labels['showimages'] = 'Monstrar imagines';
-$labels['plaintoggle'] = 'Texto plan';
+$labels['alwaysshow'] = 'Sempre monstrar imagines de $sender';
+$labels['isdraft'] = 'Iste es un message provisori.';
+$labels['andnmore'] = '$nr alteres...';
+$labels['togglemoreheaders'] = 'Monstrar plus capites de message';
+$labels['togglefullheaders'] = 'Monstrar/celar capites crude';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Texto simple';
$labels['savesentmessagein'] = 'Salveguardar message inviate in';
$labels['dontsave'] = 'non salveguardar';
$labels['maxuploadsize'] = 'Le dimension maximal de iste file es $size';
-$labels['addcc'] = 'Adder Cc';
-$labels['addbcc'] = 'Adder Bcc';
-$labels['name'] = 'Monstrar nomine';
-$labels['firstname'] = 'Nomine';
+$labels['addcc'] = 'Adder "Cc:"';
+$labels['addbcc'] = 'Adder "Bcc:"';
+$labels['addreplyto'] = 'Adder "Responder a:"';
+$labels['addfollowupto'] = 'Adder "Continuar discussion in:"';
+$labels['mdnrequest'] = 'Le expeditor de iste message ha demandate de reciper un notification quando vos lege iste message. Desira vos notificar le expeditor?';
+$labels['receiptread'] = 'Confirmation de reception (legite)';
+$labels['yourmessage'] = 'Iste es un confirmation del reception de vostre message';
+$labels['receiptnote'] = 'Nota ben: Iste recepta solmente confirma que le message ha essite visualisate sur le computator del destinatario. Il non ha garantia que le destinatario ha legite o comprendite le contento del message.';
+$labels['name'] = 'Nomine de presentation';
+$labels['firstname'] = 'Prenomine';
$labels['surname'] = 'Nomine de familia';
+$labels['middlename'] = 'Secunde nomine';
$labels['nameprefix'] = 'Prefixo';
+$labels['namesuffix'] = 'Suffixo';
$labels['nickname'] = 'Pseudonymo';
+$labels['jobtitle'] = 'Titulo professional';
$labels['department'] = 'Departimento';
-$labels['gender'] = 'Sexo:';
-$labels['email'] = 'E-posta';
+$labels['gender'] = 'Sexo';
+$labels['maidenname'] = 'Nomine de puera';
+$labels['email'] = 'E-mail';
$labels['phone'] = 'Telephono';
$labels['address'] = 'Adresse';
$labels['street'] = 'Strata';
@@ -166,7 +282,7 @@ $labels['locality'] = 'Citate';
$labels['zipcode'] = 'Codice postal';
$labels['region'] = 'Provincia o stato';
$labels['country'] = 'Pais';
-$labels['birthday'] = 'Anniversario de nativitate';
+$labels['birthday'] = 'Data de nascentia';
$labels['anniversary'] = 'Anniversario';
$labels['website'] = 'Sito web';
$labels['instantmessenger'] = 'MI';
@@ -178,16 +294,18 @@ $labels['assistant'] = 'Assistente';
$labels['spouse'] = 'Sposo/a';
$labels['allfields'] = 'Omne campos';
$labels['search'] = 'Cercar';
-$labels['advsearch'] = 'Cerca avantiate';
+$labels['searchresult'] = 'Resultato del recerca';
+$labels['advsearch'] = 'Recerca avantiate';
$labels['advanced'] = 'Avantiate';
$labels['other'] = 'Altere';
-$labels['typehome'] = 'Domo';
+$labels['typehome'] = 'Domicilio';
$labels['typework'] = 'Labor';
$labels['typeother'] = 'Altere';
$labels['typemobile'] = 'Mobile';
$labels['typemain'] = 'Principal';
-$labels['typehomefax'] = 'Fax de domo';
-$labels['typeworkfax'] = 'Fax de labor';
+$labels['typehomefax'] = 'Fax a domicilio';
+$labels['typeworkfax'] = 'Fax a labor';
+$labels['typecar'] = 'Auto';
$labels['typepager'] = 'Pager';
$labels['typevideo'] = 'Video';
$labels['typeassistant'] = 'Assistente';
@@ -195,10 +313,13 @@ $labels['typehomepage'] = 'Pagina principal';
$labels['typeblog'] = 'Blog';
$labels['typeprofile'] = 'Profilo';
$labels['addfield'] = 'Adder campo...';
+$labels['addcontact'] = 'Adder contacto';
$labels['editcontact'] = 'Modificar contacto';
$labels['contacts'] = 'Contactos';
$labels['contactproperties'] = 'Proprietates de contacto';
+$labels['contactnameandorg'] = 'Nomine e organisation';
$labels['personalinfo'] = 'Information personal';
+$labels['contactphoto'] = 'Photo del contacto';
$labels['edit'] = 'Modificar';
$labels['cancel'] = 'Cancellar';
$labels['save'] = 'Salveguardar';
@@ -206,19 +327,41 @@ $labels['delete'] = 'Deler';
$labels['rename'] = 'Renominar';
$labels['addphoto'] = 'Adder';
$labels['replacephoto'] = 'Reimplaciar';
+$labels['uploadphoto'] = 'Incargar photo';
+$labels['newcontact'] = 'Crear nove contacto';
$labels['deletecontact'] = 'Deler contactos seligite';
+$labels['composeto'] = 'Componer message a';
+$labels['contactsfromto'] = 'Contacts $from a $to de $count';
$labels['print'] = 'Imprimer';
$labels['export'] = 'Exportar';
+$labels['exportall'] = 'Exportar totes';
+$labels['exportsel'] = 'Exportar seligite';
+$labels['exportvcards'] = 'Exportar contactos in formato vCard';
+$labels['newgroup'] = 'Crear nove gruppo';
+$labels['addgroup'] = 'Adder gruppo';
$labels['grouprename'] = 'Renominar gruppo';
$labels['groupdelete'] = 'Deler gruppo';
+$labels['groupremoveselected'] = 'Remover contactos seligite del gruppo';
+$labels['uponelevel'] = 'Un nivello in alto';
+$labels['previouspage'] = 'Monstrar previe pagina';
+$labels['firstpage'] = 'Monstrar prime pagina';
+$labels['nextpage'] = 'Monstrar proxime pagina';
+$labels['lastpage'] = 'Monstrar ultime pagina';
$labels['group'] = 'Gruppo';
$labels['groups'] = 'Gruppos';
+$labels['listgroup'] = 'Listar membros del gruppo';
$labels['personaladrbook'] = 'Adresses personal';
-$labels['searchsave'] = 'Salveguardar cerca';
-$labels['searchdelete'] = 'Deler cerca';
+$labels['searchsave'] = 'Salveguardar recerca';
+$labels['searchdelete'] = 'Deler recerca';
$labels['import'] = 'Importar';
$labels['importcontacts'] = 'Importar contactos';
$labels['importfromfile'] = 'Importar ex file:';
+$labels['importtarget'] = 'Adder contactos a';
+$labels['importreplace'] = 'Reimplaciar tote le adressario';
+$labels['importgroups'] = 'Importar assignationes de gruppo';
+$labels['importgroupsall'] = 'Totes (crear gruppos si necessari)';
+$labels['importgroupsexisting'] = 'Solmente pro gruppos existente';
+$labels['importdesc'] = 'Vos pote incargar le contactos de un adressario existente.<br/>Il es actualmente possibile importar adresses in formato <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> o CSV (datos separate per commas).';
$labels['done'] = 'Facite';
$labels['settingsfor'] = 'Configurationes pro';
$labels['about'] = 'A proposito';
@@ -226,35 +369,110 @@ $labels['preferences'] = 'Preferentias';
$labels['userpreferences'] = 'Preferentias de usator';
$labels['editpreferences'] = 'Modificar preferentias de usator';
$labels['identities'] = 'Identitates';
+$labels['manageidentities'] = 'Gerer identitates';
+$labels['newidentity'] = 'Crear nove identitate';
+$labels['addidentity'] = 'Adder identitate';
+$labels['editidentity'] = 'Modifiar identitate';
$labels['preferhtml'] = 'Monstrar HTML';
+$labels['defaultcharset'] = 'Codification de characteres predefinite';
$labels['htmlmessage'] = 'Message HTML';
+$labels['messagepart'] = 'Parte';
+$labels['digitalsig'] = 'Signatura digital';
$labels['dateformat'] = 'Formato de data';
-$labels['timeformat'] = 'Formato de tempore';
-$labels['setdefault'] = 'Fixar predeterminate';
+$labels['timeformat'] = 'Formato de hora';
+$labels['prettydate'] = 'Imbellir datas';
+$labels['setdefault'] = 'Fixar como predefinite';
$labels['autodetect'] = 'Auto';
$labels['language'] = 'Lingua';
$labels['timezone'] = 'Fuso horari';
+$labels['pagesize'] = 'Lineas per pagina';
$labels['signature'] = 'Signatura';
+$labels['dstactive'] = 'Hora estive';
+$labels['showinextwin'] = 'Aperir message in nove fenestra';
+$labels['composeextwin'] = 'Componer in un nove fenestra';
+$labels['htmleditor'] = 'Componer messages in HTML';
+$labels['htmlonreply'] = 'quando responder a un message HTML';
+$labels['htmlonreplyandforward'] = 'quando reinviar o responder a un message HTML';
$labels['htmlsignature'] = 'Signatura HTML';
+$labels['showemail'] = 'Monstrar adresse de e-mail con nomine de presentation';
+$labels['previewpane'] = 'Monstrar quadro de previsualisation';
$labels['skin'] = 'Apparentia de interfacie';
+$labels['logoutclear'] = 'Vacuar le corbe a papiro al clausura de session';
+$labels['logoutcompact'] = 'Compactar le cassa de entrata al clausura de session';
$labels['uisettings'] = 'Interfacie de usator';
$labels['serversettings'] = 'Configurationes de servitor';
-$labels['ignore'] = 'ignorar';
+$labels['mailboxview'] = 'Vista de cassa postal';
+$labels['mdnrequests'] = 'Quando on requesta un confirmation de reception';
+$labels['askuser'] = 'demanda me lo';
+$labels['autosend'] = 'invia un recepta';
+$labels['autosendknown'] = 'invia un recepta a mi contactos, alteremente demanda me lo';
+$labels['autosendknownignore'] = 'invia un recepta a mi contactos, alteremente ignora lo';
+$labels['ignorerequest'] = 'ignora le requesta';
+$labels['readwhendeleted'] = 'Marcar le message como legite al deletion';
+$labels['flagfordeletion'] = 'Marcar le message pro deletion in vice de deler lo';
+$labels['skipdeleted'] = 'Non monstrar messages delite';
+$labels['deletealways'] = 'Si le displaciamento de messages al corbe a papiro non succede, deler los';
+$labels['deletejunk'] = 'Directemente deler le messages indesirate';
+$labels['showremoteimages'] = 'Visualisar imagines incorporate a distantia';
+$labels['fromknownsenders'] = 'de expeditores cognite';
$labels['always'] = 'sempre';
+$labels['showinlineimages'] = 'Monstrar imagines attachate sub le message';
+$labels['autosavedraft'] = 'Automaticamente salveguardar version provisori';
$labels['everynminutes'] = 'cata $n minuta(s)';
+$labels['refreshinterval'] = 'Refrescar (verificar si il ha nove messages, etc.)';
$labels['never'] = 'nunquam';
+$labels['immediately'] = 'immediatemente';
$labels['messagesdisplaying'] = 'Inviar me_ssages';
+$labels['messagescomposition'] = 'Composition de messages';
$labels['mimeparamfolding'] = 'Nomines de attachamento';
+$labels['2231folding'] = 'RFC 2231 complete (Thunderbird)';
+$labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
+$labels['2047folding'] = 'RFC 2047 complete (altere)';
+$labels['force7bit'] = 'Usar le codification MIME pro characteres a 8 bits';
+$labels['savelocalstorage'] = "Salveguardar in le immagazinage local del navigator (temporarimente)";
$labels['advancedoptions'] = 'Optiones avantiate';
+$labels['toggleadvancedoptions'] = 'Monstrar/celar optiones avantiate';
+$labels['focusonnewmessage'] = 'Focalisar le fenestra del navigator sur le nove message';
+$labels['checkallfolders'] = 'Verificar in tote le dossieres si il ha nove messages';
+$labels['displaynext'] = 'Post deler/displaciar un message, monstrar le proxime message';
+$labels['defaultfont'] = 'Typo de litteras predefinite pro messages HTML';
$labels['mainoptions'] = 'Optiones principal';
+$labels['browseroptions'] = 'Optiones de navigator';
$labels['section'] = 'Section';
$labels['maintenance'] = 'Mantenimento';
$labels['newmessage'] = 'Nove message';
$labels['signatureoptions'] = 'Optiones de signatura';
+$labels['whenreplying'] = 'Quando responder';
+$labels['replyempty'] = 'non citar le message original';
+$labels['replytopposting'] = 'comenciar le nove message super le citation';
+$labels['replybottomposting'] = 'comenciar le nove message sub le citation';
+$labels['replyremovesignature'] = 'Quando responder, remover le signatura del citation';
$labels['autoaddsignature'] = 'Automaticamente inserta signatura';
+$labels['newmessageonly'] = 'nove message solmente';
+$labels['replyandforwardonly'] = 'responsas e reinvios solmente';
$labels['insertsignature'] = 'Insertar signatura';
+$labels['previewpanemarkread'] = 'Marcar messages previsualisate como legite';
+$labels['afternseconds'] = 'post $n secundas';
+$labels['reqmdn'] = 'Sempre requestar un confirmation de reception';
+$labels['reqdsn'] = 'Sempre requestar un notification de stato de livration';
+$labels['replysamefolder'] = 'Placiar responsas in le dossier del message respondite';
+$labels['defaultabook'] = 'Adressario predefinite';
+$labels['autocompletesingle'] = 'Saltar adresses de e-mail altenrative in autocompletion';
+$labels['listnamedisplay'] = 'Listar contactos como';
+$labels['spellcheckbeforesend'] = 'Verificar orthographia ante inviar un message';
$labels['spellcheckoptions'] = 'Optiones de verification orthographic';
+$labels['spellcheckignoresyms'] = 'Ignorar parolas con symbolos';
+$labels['spellcheckignorenums'] = 'Ignorar parolas con numeros';
+$labels['spellcheckignorecaps'] = 'Ignorar parolas toto in majusculas';
$labels['addtodict'] = 'Adder al dictionario';
+$labels['mailtoprotohandler'] = 'Registrar un gestor de protocollo pro ligamines mailto:';
+$labels['standardwindows'] = 'Gerer pop-ups como fenestras normal';
+$labels['forwardmode'] = 'Reinvio de messages';
+$labels['inline'] = 'in texto';
+$labels['asattachment'] = 'como attachamento';
+$labels['replyallmode'] = 'Action predefinite del button [Responder a totes]';
+$labels['replyalldefault'] = 'responder a totes';
+$labels['replyalllist'] = 'responder solmente al lista de diffusion (si trovate)';
$labels['folder'] = 'Dossier';
$labels['folders'] = 'Dossieres';
$labels['foldername'] = 'Nomine de dossier';
@@ -263,20 +481,101 @@ $labels['messagecount'] = 'Messages';
$labels['create'] = 'Crear';
$labels['createfolder'] = 'Crear un nove dossier';
$labels['managefolders'] = 'Gerer le dossieres';
+$labels['specialfolders'] = 'Dossieres special';
$labels['properties'] = 'Proprietates';
$labels['folderproperties'] = 'Proprietates de dossier';
+$labels['parentfolder'] = 'Dossier genitor';
$labels['location'] = 'Location';
$labels['info'] = 'Information';
+$labels['getfoldersize'] = 'Clicca pro obtener le dimension del dossier';
+$labels['changesubscription'] = 'Clicca pro cambiar le subscription';
$labels['foldertype'] = 'Typo de dossier';
$labels['personalfolder'] = 'Dossier private';
+$labels['otherfolder'] = 'Dossier de altere usator';
$labels['sharedfolder'] = 'Dossier public';
+$labels['findfolders'] = 'Cercar dossieres';
+$labels['namespace.personal'] = 'Personal';
+$labels['namespace.other'] = 'Altere usatores';
+$labels['namespace.shared'] = 'Commun';
$labels['sortby'] = 'Ordinar per';
+$labels['sortasc'] = 'Mitter in ordine ascendente';
+$labels['sortdesc'] = 'Mitter in ordine descendente';
+$labels['undo'] = 'Disfacer';
+$labels['installedplugins'] = 'Plug-ins installate';
+$labels['plugin'] = 'Plug-in';
+$labels['version'] = 'Version';
$labels['source'] = 'Fonte';
$labels['license'] = 'Licentia';
-$labels['support'] = 'Obtener supporte';
+$labels['support'] = 'Obtener supporto';
+$labels['B'] = 'B';
+$labels['KB'] = 'KB';
+$labels['MB'] = 'MB';
+$labels['GB'] = 'GB';
$labels['unicode'] = 'Unicode';
$labels['english'] = 'Anglese';
+$labels['westerneuropean'] = 'Europa del west';
+$labels['easterneuropean'] = 'Europa del est';
+$labels['southeasterneuropean'] = 'Europa del sud-est';
+$labels['baltic'] = 'Baltic';
+$labels['cyrillic'] = 'Cyrillic';
+$labels['arabic'] = 'Arabe';
+$labels['greek'] = 'Grec';
+$labels['hebrew'] = 'Hebraic';
+$labels['turkish'] = 'Turc';
+$labels['nordic'] = 'Nordic';
+$labels['thai'] = 'Thai';
+$labels['celtic'] = 'Celtic';
+$labels['vietnamese'] = 'Vietnamese';
$labels['japanese'] = 'Japonese';
$labels['korean'] = 'Coreano';
$labels['chinese'] = 'Chinese';
+$labels['arialabeltopnav'] = 'Controlo de fenestras';
+$labels['arialabeltasknav'] = 'Cargas de application';
+$labels['arialabeltoolbar'] = 'Instrumentario de application';
+$labels['arialabelactivetask'] = 'Carga active';
+$labels['arialabelmessagessearchfilter'] = 'Filtro de lista de e-mail';
+$labels['arialabelmailsearchform'] = 'Formulario de recerca de message de e-mail';
+$labels['arialabelcontactsearchform'] = 'Formulario de recerca de contactos';
+$labels['arialabelmailquicksearchbox'] = 'Entrata de recerca de e-mail';
+$labels['arialabelquicksearchbox'] = 'Entrata de recerca';
+$labels['arialabelfoldersearchfilter'] = 'Filtro de lista de dossieres';
+$labels['arialabelfoldersearchform'] = 'Formulario de recerca de dossieres';
+$labels['arialabelfolderlist'] = 'Selection de dossier de e-mail';
+$labels['arialabelmessagelist'] = 'Lista de messages de e-mail';
+$labels['arialabelmailpreviewframe'] = 'Previsualisation de message';
+$labels['arialabelmailboxmenu'] = 'Menu de actiones de dossier';
+$labels['arialabellistselectmenu'] = 'Menu de selection de lista';
+$labels['arialabelthreadselectmenu'] = 'Menu de listas de topicos';
+$labels['arialabelmessagelistoptions'] = 'Optiones de visualisation e ordinamento de lista de messages';
+$labels['arialabelmailimportdialog'] = 'Dialogo de importation de messages';
+$labels['arialabelmessagenav'] = 'Navigation inter messages';
+$labels['arialabelmessagebody'] = 'Texto de message';
+$labels['arialabelmessageactions'] = 'Actiones de message';
+$labels['arialabelcontactquicksearch'] = 'Formulario de recerca de contactos';
+$labels['arialabelcontactsearchbox'] = 'Entrata de recerca de contactos';
+$labels['arialabelmessageheaders'] = 'Capites de message';
+$labels['arialabelforwardingoptions'] = 'Optiones de reinvio';
+$labels['arialabelreplyalloptions'] = 'Optiones pro responder a totes';
+$labels['arialabelmoremessageactions'] = 'Altere actiones de message';
+$labels['arialabelmarkmessagesas'] = 'Marcar le messages seligite como...';
+$labels['arialabelcomposeoptions'] = 'Optiones de composition';
+$labels['arialabelresponsesmenu'] = 'Menu de responsas prefabricate';
+$labels['arialabelattachmentuploadform'] = 'Formulario de incargamento de attachamentos';
+$labels['arialabelattachmentpreview'] = 'Previsualisation de attachamento';
+$labels['ariasummarycomposecontacts'] = 'Lista de contactos e gruppos a seliger como destinatarios';
+$labels['arialabelcontactexportoptions'] = 'Optiones de exportation de contactos';
+$labels['arialabelabookgroupoptions'] = 'Optiones de adressario/gruppo';
+$labels['arialabelpreferencesform'] = 'Formulario de preferentias';
+$labels['arialabelidentityeditfrom'] = 'Formulario de modification de identitate';
+$labels['arialabelresonseeditfrom'] = 'Formulario de modification de responsa';
+$labels['arialabelsearchterms'] = 'Terminos de recerca';
+$labels['helplistnavigation'] = 'Lista de claves de navigation';
+$labels['helplistkeyboardnavigation'] = "Flechas in alto/basso: Focalisar un altere linea.
+Barra de spatio: Seliger le linea focalisate.
+Shift + alto/basso: Seliger un linea additional supra/infra.
+Ctrl + barra de spatio: Adder/subtraher le linea focalisate al selection.";
+$labels['helplistkeyboardnavmessages'] = "Flechas a dextra/sinistra: Displicar/plicar un topico de messages (solmente in vista arborescente).
+Enter: Aperir le message seligite/focalisate.
+Delete: Jectar le messages seligite in le corbe a papiro.";
+$labels['helplistkeyboardnavcontacts'] = "Enter: Aperir le contacto seligite/focalisate.";
?>
diff --git a/program/localization/ia/messages.inc b/program/localization/ia/messages.inc
index 32733f21d..3100493c5 100644
--- a/program/localization/ia/messages.inc
+++ b/program/localization/ia/messages.inc
@@ -15,27 +15,166 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/messages/
*/
-$messages['loginfailed'] = 'Initio de session fallite';
-$messages['servererror'] = 'Error de servitor!';
-$messages['dberror'] = 'Error de base de datos!';
-$messages['loading'] = 'Cargante ...';
-$messages['uploadingmany'] = 'Incargante files...';
-$messages['loadingdata'] = 'Cargante datos...';
-$messages['sendingmessage'] = 'Inviante message...';
+$messages['errortitle'] = 'Un error ha occurrite.';
+$messages['loginfailed'] = 'Apertura de session fallite.';
+$messages['cookiesdisabled'] = 'Vostre navigator non accepta cookies.';
+$messages['sessionerror'] = 'Le session es invalide o ha expirate.';
+$messages['storageerror'] = 'Le connexion al servitor de immagazinage ha fallite.';
+$messages['servererror'] = 'Error de servitor.';
+$messages['servererrormsg'] = 'Error de sevitor: $msg';
+$messages['connerror'] = 'Error de connexion (impossibile attinger le servitor).';
+$messages['dberror'] = 'Error de base de datos.';
+$messages['windowopenerror'] = 'Le fenestra pop-up ha essite blocate.';
+$messages['requesttimedout'] = 'Requesta expirate';
+$messages['errorreadonly'] = 'Impossibile exequer le operation. Le dossier es in modo lectura sol.';
+$messages['errornoperm'] = 'Impossibile exequer le operation. Permission refusate.';
+$messages['erroroverquota'] = 'Impossibile exequer le operation. Nulle spatio libere sur disco.';
+$messages['erroroverquotadelete'] = 'Nulle spatio libere sur disco. Preme SHIFT+DEL pro deler un message.';
+$messages['invalidrequest'] = 'Requesta non valide. Le datos non ha essite salveguardate.';
+$messages['invalidhost'] = 'Nomine de servitor non valide.';
+$messages['nomessagesfound'] = 'Nulle message trovate in iste cassa postal.';
+$messages['loggedout'] = 'Vos ha terminate le session. A revider!';
+$messages['mailboxempty'] = 'Le cassa postal es vacue';
+$messages['nomessages'] = 'Nulle message';
+$messages['refreshing'] = 'A refrescar...';
+$messages['loading'] = 'A cargar...';
+$messages['uploading'] = 'A incargar un file...';
+$messages['uploadingmany'] = 'A incargar files...';
+$messages['loadingdata'] = 'A cargar datos...';
+$messages['checkingmail'] = 'A verificar si il ha nove messages...';
+$messages['sendingmessage'] = 'A inviar le message...';
+$messages['messagesent'] = 'Message inviate con successo.';
+$messages['savingmessage'] = 'A salveguardar le message...';
+$messages['messagesaved'] = 'Message salveguardate in "Versiones provisori".';
$messages['successfullysaved'] = 'Salveguardate con successo.';
-$messages['nocontactsfound'] = 'Nulle contactos trovate.';
-$messages['sendingfailed'] = 'Falleva in inviar le message.';
-$messages['errormoving'] = 'Non pote mover le message(s)';
-$messages['errordeleting'] = 'Il non pote deler le message(s).';
-$messages['nonamewarning'] = 'Per favor inserta nomine.';
+$messages['savingresponse'] = 'A salveguardar le texto del responsa...';
+$messages['deleteresponseconfirm'] = 'Es vos secur de voler deler iste texto de responsa?';
+$messages['addedsuccessfully'] = 'Le contacto ha essite addite al adressario.';
+$messages['contactexists'] = 'Un contacto con le mesme adresse de e-mail jam existe.';
+$messages['contactnameexists'] = 'Un contacto con le mesme nomine jam existe.';
+$messages['blockedimages'] = 'Pro proteger vostre vita private, le imagines a distantia es blocate in iste message.';
+$messages['encryptedmessage'] = 'Iste message ha essite cryptate e non pote esser monstrate.';
+$messages['nocontactsfound'] = 'Nulle contacto trovate.';
+$messages['contactnotfound'] = 'Le contacto requestate non ha essite trovate.';
+$messages['contactsearchonly'] = 'Entra parolas a cercar in contactos';
+$messages['sendingfailed'] = 'Le invio del message ha fallite.';
+$messages['senttooquickly'] = 'Per favor, attende $sec secunda(s) ante inviar iste message.';
+$messages['errorsavingsent'] = 'Un error ha occurrite durante le salveguarda del message inviate.';
+$messages['errorsaving'] = 'Un error ha occurrite durante le salveguarda.';
+$messages['errormoving'] = 'Impossibile displaciar le message(s).';
+$messages['errorcopying'] = 'Impossibile copiar le message(s).';
+$messages['errordeleting'] = 'Impossibile deler le message(s).';
+$messages['errormarking'] = 'Impossibile marcar le message(s).';
+$messages['deletecontactconfirm'] = 'Es vos secur de voler deler le contacto(s) seligite?';
+$messages['deletegroupconfirm'] = 'Es vos secur de voler deler le gruppo seligite?';
+$messages['deletemessagesconfirm'] = 'Es vos secur de voler deler le message(s) seligite?';
+$messages['deletefolderconfirm'] = 'Es vos secur de voler deler le dossier seligite?';
+$messages['purgefolderconfirm'] = 'Es vos secur de voler deler tote le messages in iste dossier?';
+$messages['contactdeleting'] = 'A deler contacto(s)...';
+$messages['groupdeleting'] = 'A deler le gruppo...';
+$messages['folderdeleting'] = 'A deler le dossier...';
+$messages['foldermoving'] = 'A displaciar le dossier...';
+$messages['foldersubscribing'] = 'A subscriber se al dossier...';
+$messages['folderunsubscribing'] = 'A cancellar le subscription al dossier...';
+$messages['formincomplete'] = 'Le formulario non ha essite totalmente completate.';
+$messages['noemailwarning'] = 'Per favor, specifica un adresse de e-mail valide.';
+$messages['nonamewarning'] = 'Per favor, specifica un nomine.';
+$messages['nopagesizewarning'] = 'Per favor, specifica un dimension de pagina.';
+$messages['nosenderwarning'] = 'Per favor, specifica le adresse de e-mail del expeditor.';
+$messages['norecipientwarning'] = 'Per favor, specifica al minus un destinatario.';
+$messages['nosubjectwarning'] = 'Le campo "Subjecto" es vacue. Vole vos specificar un subjecto ora?';
+$messages['nobodywarning'] = 'Inviar iste message sin texto?';
+$messages['notsentwarning'] = 'Le message non ha essite inviate. Vole vos abandonar vostre message?';
+$messages['restoresavedcomposedata'] = 'Un message anteriormente componite ma non inviate ha essite trovate.\n\nSubjecto: $subject\nSalveguardate: $date\n\nVole vos restaurar iste message?';
+$messages['noldapserver'] = 'Per favor, selige un servitor LDAP in le qual cercar.';
+$messages['nosearchname'] = 'Per favor, specifica le nomine o adresse de e-mail de un contacto.';
+$messages['notuploadedwarning'] = 'Non tote le attachamentos ha ancora essite incargate. Per favor, attende o cancella le incargamento.';
$messages['searchsuccessful'] = '$nr messages trovate.';
$messages['contactsearchsuccessful'] = '$nr contactos trovate.';
-$messages['searching'] = 'Cercante...';
+$messages['searchnomatch'] = 'Le recerca non ha producite resultatos.';
+$messages['searching'] = 'A cercar...';
$messages['checking'] = 'A verificar...';
+$messages['stillsearching'] = 'A continuar le recerca...';
+$messages['nospellerrors'] = 'Nulle error de orthographia trovate.';
+$messages['folderdeleted'] = 'Le dossier ha essite delite.';
+$messages['foldersubscribed'] = 'Le subscription al dossier ha succedite.';
+$messages['folderunsubscribed'] = 'Le subscription al dossier ha essite cancellate.';
+$messages['folderpurged'] = 'Le dossier ha essite vacuate.';
+$messages['folderexpunged'] = 'Le dossier ha essite compactate.';
$messages['deletedsuccessfully'] = 'Delete con successo.';
+$messages['converting'] = 'A remover le formatation...';
+$messages['messageopenerror'] = 'Impossibile cargar le message ab le servitor.';
$messages['fileuploaderror'] = 'Incargamento de file falleva.';
+$messages['filesizeerror'] = 'Le file incargate excede le dimension maxime de $size.';
+$messages['copysuccess'] = '$nr contactos ha essite copiate.';
+$messages['movesuccess'] = '$nr contactos ha essite displaciate.';
+$messages['copyerror'] = 'Impossibile copiar le contactos.';
+$messages['moveerror'] = 'Impossibile displaciar le contactos.';
+$messages['sourceisreadonly'] = 'Iste fonte de adresses es pro lectura solmente.';
+$messages['errorsavingcontact'] = 'Impossibile salveguardar le adresse del contacto.';
+$messages['movingmessage'] = 'A displaciar le message(s)...';
+$messages['copyingmessage'] = 'A copiar le message(s)...';
+$messages['copyingcontact'] = 'A copiar le contacto(s)...';
+$messages['movingcontact'] = 'A mover le contacto(s)...';
+$messages['deletingmessage'] = 'A deler le message(s)...';
+$messages['markingmessage'] = 'A marcar le message(s)...';
+$messages['addingmember'] = 'A adder contacto(s) al gruppo...';
+$messages['removingmember'] = 'A remover contacto(s) del gruppo...';
+$messages['receiptsent'] = 'Un confirmation de lectura ha essite inviate.';
+$messages['errorsendingreceipt'] = 'Impossibile inviar le confirmation.';
+$messages['deleteidentityconfirm'] = 'Es vos secur de voler deler iste identitate?';
+$messages['nodeletelastidentity'] = 'Vos non pote deler iste identitate; illo es vostre ultime.';
+$messages['forbiddencharacter'] = 'Le nomine del dossier contine un character interdicte.';
$messages['selectimportfile'] = 'Per favor tu selige le file a incargar.';
+$messages['addresswriterror'] = 'Le adressario seligite non permitte le scriptura.';
+$messages['contactaddedtogroup'] = 'Le contactos ha essite addite a iste gruppo.';
+$messages['contactremovedfromgroup'] = 'Le contactos ha essite removite de iste gruppo.';
+$messages['nogroupassignmentschanged'] = 'Nulle assignation de gruppo ha essite cambiate.';
+$messages['importwait'] = 'A importar, un momento...';
+$messages['importformaterror'] = 'Importation fallite. Le file incargate non es un file de datos de importation valide.';
+$messages['importconfirm'] = '<b>$inserted contactos ha essite importate</b>';
+$messages['importconfirmskipped'] = '<b>$skipped entratas existente ha essite saltate</b>';
+$messages['importmessagesuccess'] = '$nr messages ha essite importate';
+$messages['importmessageerror'] = 'Importation fallite. Le file incargate non es un file de cassa postal o message valide.';
+$messages['opnotpermitted'] = 'Operation non permittite.';
+$messages['nofromaddress'] = 'Le adresse de e-mail manca in le identitate seligite.';
+$messages['editorwarning'] = 'Si vos cambia de typo de editor, le formato del texto pote esser perdite. Desira vos continuar?';
+$messages['httpreceivedencrypterror'] = 'Un error fatal de configuration ha occurrite. Contacta immediatemente vostre administrator.<b>Vostre message non pote esser inviate.</b>';
+$messages['smtpconnerror'] = 'Error SMTP ($code): Le connexion al servitor ha fallite.';
+$messages['smtpautherror'] = 'Error SMTP ($code): Authentication fallite.';
+$messages['smtpfromerror'] = 'Error SMTP ($code): Impossibile fixar le expeditor "$from" ($msg).';
+$messages['smtptoerror'] = 'Error SMTP ($code): Impossibile adder le destinatario "$to" ($msg).';
+$messages['smtprecipientserror'] = 'Error SMTP: Impossibile interpretar le lista de destinatarios.';
+$messages['smtperror'] = 'Error SMTP: $msg';
$messages['emailformaterror'] = 'Adresse de e-mail invalide: $email';
+$messages['toomanyrecipients'] = 'Troppo de destinatarios. Reduce le numero de destinatarios a $max.';
+$messages['maxgroupmembersreached'] = 'Le numero de membros del gruppo excede le maximo de $max.';
+$messages['internalerror'] = 'Un error interne ha occurrite. Per favor, essaya lo de novo.';
+$messages['contactdelerror'] = 'Impossibile deler le contacto(s).';
+$messages['contactdeleted'] = 'Le contacto(s) ha essite delite.';
+$messages['contactrestoreerror'] = 'Impossibile restaurar le contacto(s) delite.';
+$messages['contactrestored'] = 'Le contacto(s) ha essite restaurate.';
+$messages['groupdeleted'] = 'Le gruppo ha essite delite.';
+$messages['grouprenamed'] = 'Le gruppo ha essite renominate.';
+$messages['groupcreated'] = 'Le gruppo ha essite create.';
+$messages['savedsearchdeleted'] = 'Le recerca salveguardate ha essite delite.';
+$messages['savedsearchdeleteerror'] = 'Impossibile deler le recerca salveguardate.';
+$messages['savedsearchcreated'] = 'Le recerca salveguardate ha essite create.';
+$messages['savedsearchcreateerror'] = 'Impossibile crear le recerca salveguardate.';
+$messages['messagedeleted'] = 'Le message(s) ha essite delite.';
+$messages['messagemoved'] = 'Le message(s) ha essite displaciate.';
+$messages['messagecopied'] = 'Le message(s) ha essite copiate.';
+$messages['messagemarked'] = 'Le message(s) ha essite marcate.';
+$messages['autocompletechars'] = 'Specifica al minus $min characteres pro autocompletion.';
+$messages['autocompletemore'] = 'Plure entratas corresponde. Per favor, specifica plus characteres.';
$messages['namecannotbeempty'] = 'Le nomine non pote esser vacue.';
$messages['nametoolong'] = 'Le nomine es troppo longe.';
+$messages['folderupdated'] = 'Le dossier ha essite actualisate.';
+$messages['foldercreated'] = 'Le dossier ha essite create.';
+$messages['invalidimageformat'] = 'Non es un formato de imagine valide.';
+$messages['mispellingsfound'] = 'Errores de orthographia ha essite detegite in le message.';
+$messages['parentnotwritable'] = 'Impossibile crear/displaciar le dossier in le dossier genitor seligite. Nulle permission de accesso.';
+$messages['messagetoobig'] = 'Le parte del message es troppo grande pro tractar lo.';
+$messages['attachmentvalidationerror'] = 'ATTENTION! Iste attachamento es suspecte perque su typo non corresponde al typo declarate in le message. Si vos non ha confidentia in le expeditor, vos non deberea aperir lo in le navigator perque illo pote haber contento nocive.<br/><br/><em>Expectate: $expected; trovate: $detected</em>';
+$messages['noscriptwarning'] = 'Attention: Iste servicio webmail require JavaScript. Pro usar lo, per favor activa JavaScript in le configuration de vostre navigator.';
?>
diff --git a/program/localization/it_IT/labels.inc b/program/localization/it_IT/labels.inc
index 0cceeb938..e622d58f9 100644
--- a/program/localization/it_IT/labels.inc
+++ b/program/localization/it_IT/labels.inc
@@ -234,6 +234,7 @@ $labels['responsetext'] = 'Testo della Risposta';
$labels['attach'] = 'Allega';
$labels['attachments'] = 'Allegati';
$labels['upload'] = 'Aggiungi';
+$labels['uploadprogress'] = '$percent ($current su $total)';
$labels['close'] = 'Chiudi';
$labels['messageoptions'] = 'Opzioni messaggi...';
$labels['togglecomposeoptions'] = 'Passa alla impostazioni di composizione';
diff --git a/program/localization/mk_MK/messages.inc b/program/localization/mk_MK/messages.inc
index 3a03429ba..bfb15cb88 100644
--- a/program/localization/mk_MK/messages.inc
+++ b/program/localization/mk_MK/messages.inc
@@ -25,11 +25,21 @@ $messages['servererrormsg'] = 'Грешка со серверот: $msg';
$messages['connerror'] = 'Грешка со конекција (Неуспешно конектирање со серверот)!';
$messages['dberror'] = 'Грешка со датабазата!';
$messages['windowopenerror'] = 'Popup прозорецот беше блокиран!';
+$messages['requesttimedout'] = 'Сесијата за барањето истече';
+$messages['errorreadonly'] = 'Операцијата неможе да се изврши. Папката може само да се прегледува.';
+$messages['errornoperm'] = 'Операцијата неможе да се изврши. Немате доволно пермисии.';
+$messages['erroroverquota'] = 'Операцијата неможе да се изврши. Нема слободно место.';
+$messages['erroroverquotadelete'] = 'Немате повеќе слободно место. Користете SHIFT+DEL да избришете порака.';
$messages['invalidrequest'] = 'Неважечко барање! Податоците не се зачувани.';
+$messages['invalidhost'] = 'Името на серверот не е валидно.';
$messages['nomessagesfound'] = 'Немате писма во ова сандаче';
$messages['loggedout'] = 'Успешно се одјавивте. Ви благодариме и довидување!';
+$messages['mailboxempty'] = 'Поштенското сандаче е празно.';
+$messages['nomessages'] = 'Нема пораки';
+$messages['refreshing'] = 'Освежување...';
$messages['loading'] = 'Вчитувам...';
$messages['uploading'] = 'Ја подигам податотеката...';
+$messages['uploadingmany'] = 'Датотеките се прикачуваат...';
$messages['loadingdata'] = 'Ги вчитувам податоците...';
$messages['checkingmail'] = 'Проверувам нова пошта...';
$messages['sendingmessage'] = 'Ја испраќам пораката...';
@@ -37,21 +47,30 @@ $messages['messagesent'] = 'Пораката е успешно испратен
$messages['savingmessage'] = 'Ја зачувувам пораката...';
$messages['messagesaved'] = 'Пораката е зачувана во Непратени';
$messages['successfullysaved'] = 'Успешно зачувано';
+$messages['savingresponse'] = 'Одговорот се снима...';
+$messages['deleteresponseconfirm'] = 'Избриши го одговорот?';
$messages['addedsuccessfully'] = 'Името е успешно додадено во Именикот';
$messages['contactexists'] = 'Веќе постои име со зададената Е-поштенска адреса';
+$messages['contactnameexists'] = 'Контакт со истото име веќе постои.';
$messages['blockedimages'] = 'За да се заштити вашата приватност, сликите во оваа порака не се прикажани.';
$messages['encryptedmessage'] = 'Оваа порака е кодирана и не може да се прикаже. Жалиме!';
$messages['nocontactsfound'] = 'Нема пронајдено имиња.';
$messages['contactnotfound'] = 'Бараното име не е пронајдено';
+$messages['contactsearchonly'] = 'Внесете според што да се пребаруваат контактите.';
$messages['sendingfailed'] = 'Не упеав да го испратам писмото';
$messages['senttooquickly'] = 'Почекајте $sec секунда/и пред да го испратите писмото';
+$messages['errorsavingsent'] = 'Се случи грешка при снимањето на испратената порака.';
+$messages['errorsaving'] = 'Се случи грешка при снимањето.';
$messages['errormoving'] = 'Не можев да го преместам писмото';
+$messages['errorcopying'] = 'Пораката (пораките) не е успешно ископрана.';
$messages['errordeleting'] = 'Не можев да го избришам писмото';
$messages['errormarking'] = 'Не можев да го обележам писмото';
$messages['deletecontactconfirm'] = 'Дали сте сигурни дека сакате да го избришете одбраното(те) име(ња)?';
+$messages['deletegroupconfirm'] = 'Избриши ја изберената група?';
$messages['deletemessagesconfirm'] = 'Дали сте сигурни дека сакате да го(и) избришете обележаниот(те) писмо(а)?';
$messages['deletefolderconfirm'] = 'Дали сте сигурни дека сакате да ја избришете оваа папка?';
$messages['purgefolderconfirm'] = 'Дали сте сигурни дека сакате да ги избршете сите писма во оваа папка?';
+$messages['contactdeleting'] = 'Контактот (контактите) се брише....';
$messages['folderdeleting'] = 'Ја бришам папката...';
$messages['foldermoving'] = 'Ја преместувам папката...';
$messages['formincomplete'] = 'Имате изоставено непополнети информации';
diff --git a/program/localization/ro_RO/labels.inc b/program/localization/ro_RO/labels.inc
index b98f5b1a3..e814af0ed 100644
--- a/program/localization/ro_RO/labels.inc
+++ b/program/localization/ro_RO/labels.inc
@@ -131,6 +131,8 @@ $labels['moreactions'] = 'Mai multe acțiuni...';
$labels['more'] = 'Mai multe';
$labels['back'] = 'Înapoi';
$labels['options'] = 'Opţiuni';
+$labels['first'] = 'Primul';
+$labels['last'] = 'Ultimul';
$labels['select'] = 'Selectează';
$labels['all'] = 'Toate';
$labels['none'] = 'Niciunul';
@@ -210,7 +212,6 @@ $labels['responsetext'] = 'Textul răspunsului';
$labels['attach'] = 'Ataşează';
$labels['attachments'] = 'Ataşamente';
$labels['upload'] = 'Încarcă';
-$labels['uploadprogress'] = '$percent ($current din $total)';
$labels['close'] = 'Închide';
$labels['messageoptions'] = 'Opţiuni mesaj...';
$labels['low'] = 'Mică';
@@ -370,7 +371,6 @@ $labels['askuser'] = 'întreabă-mă';
$labels['autosend'] = 'trimite automat';
$labels['autosendknown'] = 'trimite confirmarea de primire către contactele mele, în rest întreabă-mă';
$labels['autosendknownignore'] = 'trimite confirmarea de primire către contactele mele, în rest ignoră';
-$labels['ignore'] = 'ignoră';
$labels['readwhendeleted'] = 'Marchează mesajul ca citit la ştergere';
$labels['flagfordeletion'] = 'Marchează mesajul pentru ştergere în loc de a-l şterge direct';
$labels['skipdeleted'] = 'Nu arăta mesajele şterse';
@@ -486,4 +486,5 @@ $labels['vietnamese'] = 'Vietnamez';
$labels['japanese'] = 'Japonez';
$labels['korean'] = 'Coreean';
$labels['chinese'] = 'Chinezesc';
+$labels['arialabelsearchterms'] = 'Termenii căutării';
?>
diff --git a/program/localization/ru_RU/labels.inc b/program/localization/ru_RU/labels.inc
index d7b89e3d2..7da10ed4a 100644
--- a/program/localization/ru_RU/labels.inc
+++ b/program/localization/ru_RU/labels.inc
@@ -147,6 +147,7 @@ $labels['unanswered'] = 'Неотвеченные';
$labels['withattachment'] = 'С вложением';
$labels['deleted'] = 'Удаленные';
$labels['undeleted'] = 'Не удаленные';
+$labels['replied'] = 'Отвечено';
$labels['forwarded'] = 'Пересланные';
$labels['invert'] = 'Инвертировать';
$labels['filter'] = 'Фильтр';
@@ -220,6 +221,7 @@ $labels['resumeediting'] = 'Продолжить редактирование';
$labels['revertto'] = 'Отменить правки';
$labels['restore'] = 'Восстановить';
$labels['restoremessage'] = 'Восстановить сообщение?';
+$labels['ignore'] = 'Пропустить';
$labels['responses'] = 'Ответы';
$labels['insertresponse'] = 'Вставить ответ';
$labels['manageresponses'] = 'Управление ответами';
@@ -235,6 +237,7 @@ $labels['upload'] = 'Загрузить';
$labels['uploadprogress'] = '$percent ($current из $total)';
$labels['close'] = 'Закрыть';
$labels['messageoptions'] = 'Настройки сообщений...';
+$labels['togglecomposeoptions'] = 'Параметры создания';
$labels['low'] = 'Низкий';
$labels['lowest'] = 'Низший';
$labels['normal'] = 'Норм.';
@@ -404,7 +407,7 @@ $labels['askuser'] = 'спросить перед отправкой';
$labels['autosend'] = 'отправлять автоматически';
$labels['autosendknown'] = 'отправлять уведомления контактам из адресной книги, в противном случае спросить';
$labels['autosendknownignore'] = 'отправлять уведомления только контактам из адресной книги, остальных игнорировать';
-$labels['ignore'] = 'игнорировать';
+$labels['ignorerequest'] = 'пропустить запрос';
$labels['readwhendeleted'] = 'Помечать как прочитанное при удалении';
$labels['flagfordeletion'] = 'Помечать для удаления вместо удаления';
$labels['skipdeleted'] = 'Не показывать удаленные сообщения';
@@ -426,7 +429,9 @@ $labels['2231folding'] = 'RFC 2231 (только для новейших про
$labels['miscfolding'] = 'RFC 2047/2231 (наибольшая совместимость)';
$labels['2047folding'] = 'RFC 2047 (для старых программ)';
$labels['force7bit'] = 'Использовать MIME для 8-битных символов';
+$labels['savelocalstorage'] = "Сохранить в локальном хранилище веб-обозревателя (временно)";
$labels['advancedoptions'] = 'Дополнительные настройки';
+$labels['toggleadvancedoptions'] = 'Дополнительные параметры';
$labels['focusonnewmessage'] = 'Фокусировать окно браузера при новом сообщении';
$labels['checkallfolders'] = 'Проверять новые сообщения во всех папках';
$labels['displaynext'] = 'Показать следующее сообщение, после удаления или перемещения данного';
@@ -524,16 +529,36 @@ $labels['japanese'] = 'Японский';
$labels['korean'] = 'Корейский';
$labels['chinese'] = 'Китайский';
$labels['arialabeltopnav'] = 'Управление окном';
+$labels['arialabeltasknav'] = 'Задачи приложения';
+$labels['arialabeltoolbar'] = 'Панель инструментов приложения';
$labels['arialabelactivetask'] = 'Активная задача';
+$labels['arialabelmessagessearchfilter'] = 'Фильтр перечня сообщений';
+$labels['arialabelmailsearchform'] = 'Форма поиска в сообщении';
$labels['arialabelcontactsearchform'] = 'Форма поиска контактов';
+$labels['arialabelmailquicksearchbox'] = 'Ввод поискового запроса адресов эл.почты';
+$labels['arialabelquicksearchbox'] = 'Поисковый запрос';
+$labels['arialabelfoldersearchfilter'] = 'Фильтр перечня папок';
+$labels['arialabelfoldersearchform'] = 'Форма поиска папок';
+$labels['arialabelfolderlist'] = 'Выбор папки эл.почты';
+$labels['arialabelmessagelist'] = 'Перечень сообщений эл.почты';
$labels['arialabelmailpreviewframe'] = 'Предпросмотр сообщений';
+$labels['arialabelmailboxmenu'] = 'Меню действий над папкой';
+$labels['arialabellistselectmenu'] = 'Меню выделения списка';
+$labels['arialabelthreadselectmenu'] = 'Меню списка тем';
+$labels['arialabelmessagelistoptions'] = 'Параметры отображение списка сообщений и упорядочивания';
$labels['arialabelmailimportdialog'] = 'Диалог импорта сообщения';
+$labels['arialabelmessagenav'] = 'Навигация по сообщениям';
$labels['arialabelmessagebody'] = 'Тело сообщения';
+$labels['arialabelmessageactions'] = 'Действия над сообщением';
$labels['arialabelcontactquicksearch'] = 'Форма поиска контактов';
+$labels['arialabelcontactsearchbox'] = 'Ввод поискового запроса контакта';
$labels['arialabelmessageheaders'] = 'Заголовки сообщений';
$labels['arialabelforwardingoptions'] = 'Опции пересылки';
+$labels['arialabelreplyalloptions'] = 'Параметры ответа всем';
$labels['arialabelmoremessageactions'] = 'Дополнительные действия с сообщением';
$labels['arialabelmarkmessagesas'] = 'Отметить выделенные сообщения как...';
+$labels['arialabelcomposeoptions'] = 'Параметры создания';
+$labels['arialabelattachmentuploadform'] = 'Форма выгрузки вложения';
$labels['arialabelattachmentpreview'] = 'Предпросмотр вложений';
$labels['arialabelcontactexportoptions'] = 'Параметры экспорта контактов';
?>
diff --git a/program/localization/ur_PK/labels.inc b/program/localization/ur_PK/labels.inc
index 797c98f11..a13c545ab 100644
--- a/program/localization/ur_PK/labels.inc
+++ b/program/localization/ur_PK/labels.inc
@@ -16,9 +16,18 @@
For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/labels/
*/
$labels['welcome'] = ' $product میں خوش آمدید';
+$labels['username'] = 'صارف';
+$labels['password'] = 'پاسورڈ';
$labels['server'] = 'سَروَر';
+$labels['logout'] = 'لاگ آؤٹ';
$labels['mail'] = 'میل';
$labels['settings'] = 'ترتیبات';
+$labels['addressbook'] = 'ایڈریس بک';
+$labels['inbox'] = 'ان باکس';
+$labels['drafts'] = 'ڈرافٹ';
+$labels['subject'] = 'مضمون';
+$labels['from'] = 'از';
+$labels['sender'] = 'بھیجنے والا';
$labels['download'] = 'ڈاؤن لوڈ';
$labels['showanyway'] = 'جیسا بھی ہے ظاہر کر دیں';
$labels['markread'] = 'جیسے پڑھ لیا ہو';
diff --git a/program/steps/addressbook/export.inc b/program/steps/addressbook/export.inc
index a6d3af978..c2f22cbe2 100644
--- a/program/steps/addressbook/export.inc
+++ b/program/steps/addressbook/export.inc
@@ -133,8 +133,14 @@ function prepare_for_export(&$record, $source = null)
foreach ($record as $key => $values) {
list($field, $section) = explode(':', $key);
- foreach ((array)$values as $value) {
- if (is_array($value) || @strlen($value)) {
+ // avoid unwanted casting of DateTime objects to an array
+ // (same as in rcube_contacts::convert_save_data())
+ if (is_object($values) && is_a($values, 'DateTime')) {
+ $values = array($values);
+ }
+
+ foreach ((array) $values as $value) {
+ if (is_array($value) || is_a($value, 'DateTime') || @strlen($value)) {
$vcard->set($field, $value, strtoupper($section));
}
}
diff --git a/program/steps/addressbook/func.inc b/program/steps/addressbook/func.inc
index c40b517dc..594c2a695 100644
--- a/program/steps/addressbook/func.inc
+++ b/program/steps/addressbook/func.inc
@@ -518,12 +518,13 @@ function rcmail_contact_form($form, $record, $attrib = null)
$plugin = $RCMAIL->plugins->exec_hook('contact_form', array(
'form' => $form, 'record' => $record));
- $form = $plugin['form'];
- $record = $plugin['record'];
- $edit_mode = $RCMAIL->action != 'show';
+ $form = $plugin['form'];
+ $record = $plugin['record'];
+ $edit_mode = $RCMAIL->action != 'show' && $RCMAIL->action != 'print';
$del_button = $attrib['deleteicon'] ? html::img(array('src' => $RCMAIL->output->get_skin_file($attrib['deleteicon']), 'alt' => $RCMAIL->gettext('delete'))) : $RCMAIL->gettext('delete');
+ $out = '';
+
unset($attrib['deleteicon']);
- $out = '';
// get default coltypes
$coltypes = $GLOBALS['CONTACT_COLTYPES'];
@@ -544,8 +545,9 @@ function rcmail_contact_form($form, $record, $attrib = null)
foreach ($form as $section => $fieldset) {
// skip empty sections
- if (empty($fieldset['content']))
+ if (empty($fieldset['content'])) {
continue;
+ }
$select_add = new html_select(array('class' => 'addfieldmenu', 'rel' => $section));
$select_add->add($RCMAIL->gettext('addfield'), '');
@@ -555,18 +557,20 @@ function rcmail_contact_form($form, $record, $attrib = null)
$content = '';
// unset display name if it is composed from name parts
- if ($record['name'] == rcube_addressbook::compose_display_name(array('name' => '') + (array)$record))
- unset($record['name']);
+ if ($record['name'] == rcube_addressbook::compose_display_name(array('name' => '') + (array)$record)) {
+ unset($record['name']);
+ }
// group fields
$field_blocks = array(
- 'names' => array('prefix','firstname','middlename','surname','suffix'),
- 'displayname' => array('name'),
- 'nickname' => array('nickname'),
+ 'names' => array('prefix','firstname','middlename','surname','suffix'),
+ 'displayname' => array('name'),
+ 'nickname' => array('nickname'),
'organization' => array('organization'),
- 'department' => array('department'),
- 'jobtitle' => array('jobtitle'),
+ 'department' => array('department'),
+ 'jobtitle' => array('jobtitle'),
);
+
foreach ($field_blocks as $blockname => $colnames) {
$fields = '';
foreach ($colnames as $col) {
@@ -574,11 +578,16 @@ function rcmail_contact_form($form, $record, $attrib = null)
if (!$coltypes[$col])
continue;
+ // skip cols not listed in the form definition
+ if (is_array($fieldset['content']) && !in_array($col, array_keys($fieldset['content']))) {
+ continue;
+ }
+
// only string values are expected here
if (is_array($record[$col]))
$record[$col] = join(' ', $record[$col]);
- if ($RCMAIL->action == 'show') {
+ if (!$edit_mode) {
if (!empty($record[$col]))
$fields .= html::span('namefield ' . $col, rcube::Q($record[$col])) . " ";
}
@@ -611,11 +620,15 @@ function rcmail_contact_form($form, $record, $attrib = null)
$fullkey = $col.':'.$subtype;
// skip cols unknown to the backend
- if (!$coltypes[$field])
+ if (!$coltypes[$field] && empty($colprop['value'])) {
continue;
+ }
// merge colprop with global coltype configuration
- $colprop += $coltypes[$field];
+ if ($coltypes[$field]) {
+ $colprop += $coltypes[$field];
+ }
+
$label = isset($colprop['label']) ? $colprop['label'] : $RCMAIL->gettext($col);
// prepare subtype selector in edit mode
@@ -624,8 +637,9 @@ function rcmail_contact_form($form, $record, $attrib = null)
$select_subtype = new html_select(array('name' => '_subtype_'.$col.'[]', 'class' => 'contactselectsubtype', 'title' => $colprop['label'] . ' ' . $RCMAIL->gettext('type')));
$select_subtype->add($subtype_names, $colprop['subtypes']);
}
- else
+ else {
$select_subtype = null;
+ }
if (!empty($colprop['value'])) {
$values = (array)$colprop['value'];
@@ -729,12 +743,21 @@ function rcmail_contact_form($form, $record, $attrib = null)
// display row with label
if ($label) {
+ if ($RCMAIL->action == 'print') {
+ $_label = rcube::Q($colprop['label'] . ($label != $colprop['label'] ? ' (' . $label . ')' : ''));
+ }
+ else {
+ $_label = $select_subtype ? $select_subtype->show($subtype) : html::label($colprop['id'], rcube::Q($label));
+ }
+
$rows .= html::div('row',
- html::div('contactfieldlabel label', $select_subtype ? $select_subtype->show($subtype) : html::label($colprop['id'], rcube::Q($label))) .
+ html::div('contactfieldlabel label', $_label) .
html::div('contactfieldcontent '.$colprop['type'], $val));
}
- else // row without label
+ // row without label
+ else {
$rows .= html::div('row', html::div('contactfield', $val));
+ }
}
// add option to the add-field menu
@@ -745,9 +768,13 @@ function rcmail_contact_form($form, $record, $attrib = null)
// wrap rows in fieldgroup container
if ($rows) {
- $content .= html::tag('fieldset', array('class' => 'contactfieldgroup ' . ($colprop['subtypes'] ? 'contactfieldgroupmulti ' : '') . 'contactcontroller' . $col, 'style' => ($rows ? null : 'display:none')),
- ($colprop['subtypes'] ? html::tag('legend', null, rcube::Q($colprop['label'])) : ' ') .
- $rows);
+ $c_class = 'contactfieldgroup ' . ($colprop['subtypes'] ? 'contactfieldgroupmulti ' : '') . 'contactcontroller' . $col;
+ $with_label = $colprop['subtypes'] && $RCMAIL->action != 'print';
+ $content .= html::tag(
+ 'fieldset',
+ array('class' => $c_class, 'style' => ($rows ? null : 'display:none')),
+ ($with_label ? html::tag('legend', null, rcube::Q($colprop['label'])) : ' ') . $rows
+ );
}
}
@@ -769,9 +796,9 @@ function rcmail_contact_form($form, $record, $attrib = null)
}
if ($edit_mode) {
- $RCMAIL->output->set_env('coltypes', $coltypes + $coltype_labels);
- $RCMAIL->output->set_env('delbutton', $del_button);
- $RCMAIL->output->add_label('delete');
+ $RCMAIL->output->set_env('coltypes', $coltypes + $coltype_labels);
+ $RCMAIL->output->set_env('delbutton', $del_button);
+ $RCMAIL->output->add_label('delete');
}
return $out;
diff --git a/program/steps/addressbook/print.inc b/program/steps/addressbook/print.inc
new file mode 100644
index 000000000..c9460d44f
--- /dev/null
+++ b/program/steps/addressbook/print.inc
@@ -0,0 +1,138 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/addressbook/print.inc |
+ | |
+ | This file is part of the Roundcube Webmail client |
+ | Copyright (C) 2005-2015, The Roundcube Dev Team |
+ | Copyright (C) 2011-2015, Kolab Systems AG |
+ | |
+ | Licensed under the GNU General Public License version 3 or |
+ | any later version with exceptions for skins & plugins. |
+ | See the README file for a full license statement. |
+ | |
+ | PURPOSE: |
+ | Print contact details |
+ | |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com> |
+ | Author: Aleksander Machniak <machniak@kolabsys.com> |
+ +-----------------------------------------------------------------------+
+*/
+
+// Get contact ID and source ID from request
+$cids = rcmail_get_cids();
+$source = key($cids);
+$cid = $cids ? array_shift($cids[$source]) : null;
+
+// Initialize addressbook source
+$CONTACTS = rcmail_contact_source($source, true);
+$SOURCE_ID = $source;
+
+// read contact record
+if ($cid && $CONTACTS) {
+ $record = $CONTACTS->get_record($cid, true);
+}
+
+$OUTPUT->add_handlers(array(
+ 'contacthead' => 'rcmail_contact_head',
+ 'contactdetails' => 'rcmail_contact_details',
+ 'contactphoto' => 'rcmail_contact_photo',
+));
+
+$OUTPUT->send('contactprint');
+
+
+
+function rcmail_contact_head($attrib)
+{
+ global $CONTACTS, $RCMAIL;
+
+ // check if we have a valid result
+ if (!(($result = $CONTACTS->get_result()) && ($record = $result->first()))) {
+ $RCMAIL->output->show_message('contactnotfound', 'error');
+ return false;
+ }
+
+ $form = array(
+ 'head' => array( // section 'head' is magic!
+ 'name' => $RCMAIL->gettext('contactnameandorg'),
+ 'content' => array(
+ 'prefix' => array(),
+ 'name' => array(),
+ 'firstname' => array(),
+ 'middlename' => array(),
+ 'surname' => array(),
+ 'suffix' => array(),
+ ),
+ ),
+ );
+
+ unset($attrib['name']);
+ return rcmail_contact_form($form, $record, $attrib);
+}
+
+
+function rcmail_contact_details($attrib)
+{
+ global $CONTACTS, $RCMAIL, $CONTACT_COLTYPES;
+
+ // check if we have a valid result
+ if (!(($result = $CONTACTS->get_result()) && ($record = $result->first()))) {
+ return false;
+ }
+
+ $i_size = !empty($attrib['size']) ? $attrib['size'] : 40;
+
+ $form = array(
+ 'contact' => array(
+ 'name' => $RCMAIL->gettext('properties'),
+ 'content' => array(
+ 'organization' => array(),
+ 'department' => array(),
+ 'jobtitle' => array(),
+ 'email' => array(),
+ 'phone' => array(),
+ 'address' => array(),
+ 'website' => array(),
+ 'im' => array(),
+ 'groups' => array('value' => 'sdfsdfs', 'label' => $RCMAIL->gettext('groups')),
+ ),
+ ),
+ 'personal' => array(
+ 'name' => $RCMAIL->gettext('personalinfo'),
+ 'content' => array(
+ 'nickname' => array(),
+ 'gender' => array(),
+ 'maidenname' => array(),
+ 'birthday' => array(),
+ 'anniversary' => array(),
+ 'manager' => array(),
+ 'assistant' => array(),
+ 'spouse' => array(),
+ ),
+ ),
+ );
+
+ if (isset($CONTACT_COLTYPES['notes'])) {
+ $form['notes'] = array(
+ 'name' => $RCMAIL->gettext('notes'),
+ 'content' => array(
+ 'notes' => array('type' => 'textarea', 'label' => false),
+ ),
+ );
+ }
+
+ if ($CONTACTS->groups) {
+ $groups = $CONTACTS->get_record_groups($record['ID']);
+ if (!empty($groups)) {
+ $form['contact']['content']['groups'] = array(
+ 'value' => rcube::Q(implode(', ', $groups)),
+ 'label' => $RCMAIL->gettext('groups')
+ );
+ }
+ }
+
+ return rcmail_contact_form($form, $record);
+}
diff --git a/program/steps/addressbook/save.inc b/program/steps/addressbook/save.inc
index 4f30fd4b7..518625cb5 100644
--- a/program/steps/addressbook/save.inc
+++ b/program/steps/addressbook/save.inc
@@ -226,13 +226,15 @@ else {
$plugin = $RCMAIL->plugins->exec_hook('group_addmembers', array(
'group_id' => $CONTACTS->group_id, 'ids' => $insert_id, 'source' => $source));
- $counts = $CONTACTS->count();
-
if (!$plugin['abort']) {
- 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($plugin['group_id'], $plugin['ids']);
+ if (($maxnum = $RCMAIL->config->get('max_group_members', 0)) && ($CONTACTS->count()->count + 1 > $maxnum)) {
+ // @FIXME: should we remove the contact?
+ $msgtext = $RCMAIL->gettext(array('name' => 'maxgroupmembersreached', 'vars' => array('max' => $maxnum)));
+ $OUTPUT->command('parent.display_message', $msgtext, 'warning');
+ }
+ else {
+ $CONTACTS->add_to_group($plugin['group_id'], $plugin['ids']);
+ }
}
}
diff --git a/program/steps/addressbook/show.inc b/program/steps/addressbook/show.inc
index 5835ce7e5..d1bc8594d 100644
--- a/program/steps/addressbook/show.inc
+++ b/program/steps/addressbook/show.inc
@@ -66,11 +66,16 @@ function rcmail_contact_head($attrib)
'head' => array( // section 'head' is magic!
'name' => $RCMAIL->gettext('contactnameandorg'),
'content' => array(
- 'prefix' => array('type' => 'text'),
- 'firstname' => array('type' => 'text'),
- 'middlename' => array('type' => 'text'),
- 'surname' => array('type' => 'text'),
- 'suffix' => array('type' => 'text'),
+ 'prefix' => array('type' => 'text'),
+ 'firstname' => array('type' => 'text'),
+ 'middlename' => array('type' => 'text'),
+ 'surname' => array('type' => 'text'),
+ 'suffix' => array('type' => 'text'),
+ 'name' => array('type' => 'text'),
+ 'nickname' => array('type' => 'text'),
+ 'organization' => array('type' => 'text'),
+ 'department' => array('type' => 'text'),
+ 'jobtitle' => array('type' => 'text'),
),
),
);
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 92296e525..db4efc7ce 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -53,13 +53,14 @@ if (!is_array($COMPOSE)) {
}
$COMPOSE_ID = uniqid(mt_rand());
+ $params = rcube_utils::request2param(rcube_utils::INPUT_GET, 'task|action', true);
+
$_SESSION['compose_data_'.$COMPOSE_ID] = array(
'id' => $COMPOSE_ID,
- 'param' => rcube_utils::request2param(rcube_utils::INPUT_GET, 'task|action', true),
- 'mailbox' => $RCMAIL->storage->get_folder(),
+ 'param' => $params,
+ 'mailbox' => $params['mbox'] ?: $RCMAIL->storage->get_folder(),
);
$COMPOSE =& $_SESSION['compose_data_'.$COMPOSE_ID];
-
rcmail_process_compose_params($COMPOSE);
// check if folder for saving sent messages exists and is subscribed (#1486802)
@@ -322,13 +323,18 @@ foreach ($parts as $header) {
$fvalue = $mailfollowup;
else if ($mailreplyto)
$fvalue = $mailreplyto;
- else if (!empty($MESSAGE->headers->replyto))
- $fvalue = $MESSAGE->headers->replyto;
+ else if (!empty($MESSAGE->headers->replyto)) {
+ $fvalue = $MESSAGE->headers->replyto;
+ $replyto = true;
+ }
else if (!empty($MESSAGE->headers->from))
$fvalue = $MESSAGE->headers->from;
// Reply to message sent by yourself (#1487074, #1489230)
- if (!empty($ident) && in_array($ident['ident'], array($fvalue, $MESSAGE->headers->from))) {
+ // Reply-To address need to be unset (#1490233)
+ if (!empty($ident) && empty($replyto)
+ && in_array($ident['ident'], array($fvalue, $MESSAGE->headers->from))
+ ) {
$fvalue = $MESSAGE->headers->to;
}
}
@@ -419,7 +425,8 @@ $OUTPUT->add_handlers(array(
'filedroparea' => 'compose_file_drop_area',
'priorityselector' => 'rcmail_priority_selector',
'editorselector' => 'rcmail_editor_selector',
- 'receiptcheckbox' => 'rcmail_receipt_checkbox',
+ 'receiptcheckbox' => 'rcmail_mdn_checkbox', // deprecated
+ 'mdncheckbox' => 'rcmail_mdn_checkbox',
'dsncheckbox' => 'rcmail_dsn_checkbox',
'storetarget' => 'rcmail_store_target_selection',
'addressbooks' => 'rcmail_addressbook_list',
@@ -780,12 +787,13 @@ function rcmail_prepare_message_body()
unset($plugin);
// add blocked.gif attachment (#1486516)
- if ($isHtml && preg_match('#<img src="\./program/resources/blocked\.gif"#', $body)) {
- if ($attachment = rcmail_save_image('program/resources/blocked.gif', 'image/gif')) {
+ if ($isHtml && preg_match('#<img src="program/resources/blocked\.gif"#', $body)) {
+ $content = $RCMAIL->get_resource_content('blocked.gif');
+ if ($content && ($attachment = rcmail_save_image('blocked.gif', 'image/gif', $content))) {
$COMPOSE['attachments'][$attachment['id']] = $attachment;
$url = sprintf('%s&_id=%s&_action=display-attachment&_file=rcmfile%s',
$RCMAIL->comm_path, $COMPOSE['id'], $attachment['id']);
- $body = preg_replace('#\./program/resources/blocked\.gif#', $url, $body);
+ $body = preg_replace('#program/resources/blocked\.gif#', $url, $body);
}
}
@@ -1399,18 +1407,31 @@ function rcmail_save_attachment(&$message, $pid)
return false;
}
-function rcmail_save_image($path, $mimetype='')
+function rcmail_save_image($path, $mimetype = '', $data = null)
{
global $COMPOSE;
// handle attachments in memory
- $data = file_get_contents($path);
+ if (empty($data)) {
+ $data = file_get_contents($path);
+ $is_file = true;
+ }
+
$name = rcmail_basename($path);
+ if (empty($mimetype)) {
+ if ($is_file) {
+ $mimetype = rcube_mime::file_content_type($path, $name);
+ }
+ else {
+ $mimetype = rcube_mime::file_content_type($data, $name, 'application/octet-stream', true);
+ }
+ }
+
$attachment = array(
'group' => $COMPOSE['id'],
'name' => $name,
- 'mimetype' => $mimetype ? $mimetype : rcube_mime::file_content_type($path, $name),
+ 'mimetype' => $mimetype,
'data' => $data,
'size' => strlen($data),
);
@@ -1642,7 +1663,7 @@ function rcmail_priority_selector($attrib)
}
-function rcmail_receipt_checkbox($attrib)
+function rcmail_mdn_checkbox($attrib)
{
global $RCMAIL, $MESSAGE, $compose_mode;
@@ -1652,13 +1673,13 @@ function rcmail_receipt_checkbox($attrib)
if (!isset($attrib['id']))
$attrib['id'] = 'receipt';
- $attrib['name'] = '_receipt';
+ $attrib['name'] = '_mdn';
$attrib['value'] = '1';
$checkbox = new html_checkbox($attrib);
- if (isset($_POST['_receipt']))
- $mdn_default = $_POST['_receipt'];
+ if (isset($_POST['_mdn']))
+ $mdn_default = $_POST['_mdn'];
else if (in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT)))
$mdn_default = (bool) $MESSAGE->headers->mdn_to;
else
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index 6423636f0..48d989954 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -815,7 +815,7 @@ function rcmail_wash_html($html, $p, $cid_replaces)
$wash_opts = array(
'show_washed' => false,
'allow_remote' => $p['safe'],
- 'blocked_src' => "./program/resources/blocked.gif",
+ 'blocked_src' => 'program/resources/blocked.gif',
'charset' => RCUBE_CHARSET,
'cid_map' => $cid_replaces,
'html_elements' => array('body'),
diff --git a/program/steps/mail/get.inc b/program/steps/mail/get.inc
index 775349d1c..256af52b7 100644
--- a/program/steps/mail/get.inc
+++ b/program/steps/mail/get.inc
@@ -150,22 +150,22 @@ else if (strlen($part_id)) {
// accept text/plain with any extension
if ($real_mimetype == 'text/plain' && $real_mimetype == $mimetype) {
- $file_extension = 'txt';
+ $valid_extension = true;
}
-
// ignore differences in text/* mimetypes. Filetype detection isn't very reliable here
- if ($real_ctype_primary == 'text' && strpos($mimetype, $real_ctype_primary) === 0) {
- $real_mimetype = $mimetype;
+ else if ($real_ctype_primary == 'text' && strpos($mimetype, $real_ctype_primary) === 0) {
+ $real_mimetype = $mimetype;
+ $valid_extension = true;
}
-
- // get valid file extensions
- $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']) {
+ else if (!empty($_REQUEST['_mimeclass']) && $real_ctype_primary == $_REQUEST['_mimeclass']) {
$valid_extension = true;
}
+ else {
+ // get valid file extensions
+ $extensions = rcube_mime::get_mime_extensions($real_mimetype);
+ $valid_extension = (!$file_extension || in_array($file_extension, (array)$extensions));
+ }
// fix mimetype for images wrongly declared as octet-stream
if ($mimetype == 'application/octet-stream' && strpos($real_mimetype, 'image/') === 0 && $valid_extension) {
@@ -183,10 +183,12 @@ else if (strlen($part_id)) {
// 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.
+ $content = $RCMAIL->get_resource_content('blocked.gif');
$OUTPUT->nocacheing_headers();
header("Content-Type: image/gif");
header("Content-Transfer-Encoding: binary");
- readfile(INSTALL_PATH . 'program/resources/blocked.gif');
+ header("Content-Length: " . strlen($content));
+ echo $content;
}
else { // html warning with a button to load the file anyway
$OUTPUT = new rcmail_html_page();
diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc
index c55e40064..5843de43f 100644
--- a/program/steps/mail/sendmail.inc
+++ b/program/steps/mail/sendmail.inc
@@ -144,7 +144,7 @@ if ($RCMAIL->config->get('http_received_header')) {
$http_header .= $nldlm . ' via ';
}
- $host = $_SERVER['REMOTE_ADDR'];
+ $host = $_SERVER['REMOTE_ADDR'];
$hostname = gethostbyaddr($host);
if ($encrypt) {
@@ -171,7 +171,7 @@ if ($RCMAIL->config->get('http_received_header')) {
$headers['Date'] = $RCMAIL->user_date();
$headers['From'] = rcube_charset::convert($from_string, RCUBE_CHARSET, $message_charset);
-$headers['To'] = $mailto;
+$headers['To'] = $mailto;
// additional recipients
if (!empty($mailcc)) {
@@ -188,6 +188,10 @@ if (($max_recipients = (int) $RCMAIL->config->get('max_recipients')) > 0) {
}
}
+$dont_override = (array) $RCMAIL->config->get('dont_override');
+$mdn_enabled = in_array('mdn_default', $dont_override) ? $RCMAIL->config->get('mdn_default') : !empty($_POST['_mdn']);
+$dsn_enabled = in_array('dsn_default', $dont_override) ? $RCMAIL->config->get('dsn_default') : !empty($_POST['_dsn']);
+
// add subject
$headers['Subject'] = trim(rcube_utils::get_input_value('_subject', rcube_utils::INPUT_POST, TRUE, $message_charset));
@@ -228,7 +232,7 @@ if (!empty($_POST['_priority'])) {
}
}
-if (!empty($_POST['_receipt'])) {
+if ($mdn_enabled) {
$headers['Return-Receipt-To'] = $from_string;
$headers['Disposition-Notification-To'] = $from_string;
}
@@ -520,9 +524,7 @@ if (!$savedraft) {
}
// Handle Delivery Status Notification request
- if (!empty($_POST['_dsn'])) {
- $smtp_opts['dsn'] = true;
- }
+ $smtp_opts['dsn'] = $dsn_enabled;
$sent = $RCMAIL->deliver_message($MAIL_MIME, $from, $mailto,
$smtp_error, $mailbody_file, $smtp_opts);
@@ -682,11 +684,16 @@ if ($savedraft) {
$OUTPUT->command('auto_save_start');
}
else {
+ // Collect folders which could contain the composed message,
+ // we'll refresh the list if currently opened folder is one of them (#1490238)
$folders = array();
- if ($COMPOSE['mode'] == 'reply' || $COMPOSE['mode'] == 'forward') {
+ if (in_array($COMPOSE['mode'], array('reply', 'forward', 'draft'))) {
$folders[] = $COMPOSE['mailbox'];
}
+ if (!empty($COMPOSE['param']['draft_uid']) && $drafts_mbox) {
+ $folders[] = $drafts_mbox;
+ }
rcmail_compose_cleanup($COMPOSE_ID);
$OUTPUT->command('remove_compose_data', $COMPOSE_ID);
@@ -758,8 +765,10 @@ function rcmail_fix_emoticon_paths($mime_message)
// remove any null-byte characters before parsing
$body = preg_replace('/\x00/', '', $body);
- $searchstr = 'program/js/tinymce/plugins/emoticons/img/';
- $offset = 0;
+ $searchstr = 'program/js/tinymce/plugins/emoticons/img/';
+ $assets_dir = $RCMAIL->config->get('assets_dir');
+ $path = ($assets_dir ?: INSTALL_PATH) . '/' . $searchstr;
+ $offset = 0;
// keep track of added images, so they're only added once
$included_images = array();
@@ -772,12 +781,14 @@ function rcmail_fix_emoticon_paths($mime_message)
// sanitize image name so resulting attachment doesn't leave images dir
$image_name = preg_replace('/[^a-zA-Z0-9_\.\-]/i', '', $image_name);
- $img_file = INSTALL_PATH . '/' . $searchstr . $image_name;
+ $img_file = $path . $image_name;
- if (! in_array($image_name, $included_images)) {
+ if (!in_array($image_name, $included_images)) {
// add the image to the MIME message
- if (!$mime_message->addHTMLImage($img_file, 'image/gif', '', true, $image_name)) {
+ $res = $mime_message->addHTMLImage($img_file, 'image/gif', '', true, $image_name);
+ if (PEAR::isError($res)) {
$RCMAIL->output->show_message("emoticonerror", 'error');
+ continue;
}
array_push($included_images, $image_name);
diff --git a/program/steps/settings/edit_identity.inc b/program/steps/settings/edit_identity.inc
index cd7ba5fa6..298822d66 100644
--- a/program/steps/settings/edit_identity.inc
+++ b/program/steps/settings/edit_identity.inc
@@ -109,6 +109,11 @@ function rcube_identity_form($attrib)
$IDENTITY_RECORD['signature'] = htmlspecialchars($IDENTITY_RECORD['signature'], ENT_NOQUOTES, RCUBE_CHARSET);
}
+ // hide "default" checkbox if only one identity is allowed
+ if (IDENTITIES_LEVEL > 1) {
+ unset($form['addressing']['content']['standard']);
+ }
+
// disable some field according to access level
if (IDENTITIES_LEVEL == 1 || IDENTITIES_LEVEL == 3) {
$form['addressing']['content']['email']['disabled'] = true;
diff --git a/program/steps/settings/save_identity.inc b/program/steps/settings/save_identity.inc
index de0c84c91..ac7ef8708 100644
--- a/program/steps/settings/save_identity.inc
+++ b/program/steps/settings/save_identity.inc
@@ -49,6 +49,11 @@ foreach ($a_boolean_cols as $col) {
}
}
+// make the identity a "default" if only one identity is allowed
+if (IDENTITIES_LEVEL > 1) {
+ $save_data['standard'] = 1;
+}
+
// unset email address if user has no rights to change it
if (IDENTITIES_LEVEL == 1 || IDENTITIES_LEVEL == 3) {
unset($save_data['email']);
diff --git a/skins/classic/addressbook.css b/skins/classic/addressbook.css
index 90438aa70..b54f057c8 100644
--- a/skins/classic/addressbook.css
+++ b/skins/classic/addressbook.css
@@ -43,6 +43,16 @@
background-position: -32px -32px;
}
+#abooktoolbar a.print {
+ background: url(images/mail_toolbar.png) 0 0 no-repeat transparent;
+ background-position: -256px 0;
+}
+
+#abooktoolbar a.printSel {
+ background: url(images/mail_toolbar.png) 0 0 no-repeat transparent;
+ background-position: -256px -32px;
+}
+
#abooktoolbar a.delete {
background-position: -64px 0;
}
diff --git a/skins/classic/common.css b/skins/classic/common.css
index 0a8edd5c7..4d54f4992 100644
--- a/skins/classic/common.css
+++ b/skins/classic/common.css
@@ -156,6 +156,11 @@ img
color: #999999;
}
+.voice
+{
+ display: none;
+}
+
/* fixes vertical alignment of checkboxes and labels */
label input,
label span
diff --git a/skins/classic/print.css b/skins/classic/print.css
index 349b224cb..4d7fb246e 100644
--- a/skins/classic/print.css
+++ b/skins/classic/print.css
@@ -159,3 +159,67 @@ p.image-attachment .attachment-links
{
display: none;
}
+
+/* contact print */
+#contact-details fieldset {
+ color: #666;
+ border: 1px solid #999;
+ margin-top: 5px;
+}
+
+#contact-details fieldset.contactfieldgroup {
+ border: 0;
+ padding: 0;
+ margin: 0;
+}
+
+#contact-details div.row {
+ padding: 2px 0;
+}
+
+#contact-details .contactfieldlabel {
+ display: inline-block;
+ vertical-align: top;
+ width: 150px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+#contact-details .contactfieldcontent {
+ display: inline-block;
+ vertical-align: top;
+ font-weight: bold;
+}
+
+#contact-details #contactphoto {
+ float: left;
+ margin: 5px 15px 5px 3px;
+ width: 112px;
+ border: 0;
+ padding: 0;
+}
+
+#contact-details #contactpic {
+ width: 112px;
+ background: white;
+}
+
+#contact-details #contactpic img {
+ max-width: 112px;
+ visibility: inherit;
+}
+
+#contact-details #contacthead {
+ border: 0;
+ margin: 0 16em 0 0;
+ padding: 0;
+}
+
+#contact-details #contacthead > legend {
+ display: none;
+}
+
+#contact-details #contacthead .names span.namefield {
+ font-size: 140%;
+ font-weight: bold;
+}
diff --git a/skins/classic/templates/about.html b/skins/classic/templates/about.html
index 36fb65739..0aeacd706 100644
--- a/skins/classic/templates/about.html
+++ b/skins/classic/templates/about.html
@@ -20,7 +20,7 @@
<div id="license">
<roundcube:object name="aboutcontent" />
<h2 class="sysname">Roundcube Webmail <roundcube:object name="version" /></h2>
-<p class="copyright">Copyright &copy; 2005-2014, The Roundcube Dev Team</p>
+<p class="copyright">Copyright &copy; 2005-2015, The Roundcube Dev Team</p>
<p class="license">This program is free software; you can redistribute it and/or modify
it under the terms of the <a href="http://www.gnu.org/licenses/gpl.html" target="_blank">GNU General Public License</a>
as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.<br/>
diff --git a/skins/classic/templates/addressbook.html b/skins/classic/templates/addressbook.html
index 0af5e4317..6fb8bf599 100644
--- a/skins/classic/templates/addressbook.html
+++ b/skins/classic/templates/addressbook.html
@@ -21,6 +21,7 @@
<div id="abooktoolbar">
<roundcube:button command="add" type="link" class="buttonPas addcontact" classAct="button addcontact" classSel="button addcontactSel" title="newcontact" content=" " />
<roundcube:button command="compose" type="link" class="buttonPas compose" classAct="button compose" classSel="button composeSel" title="composeto" content=" " />
+<roundcube:button command="print" type="link" class="buttonPas print" classAct="button print" classSel="button printSel" label="print" title="printcontact" content=" " />
<roundcube:button command="delete" type="link" class="buttonPas delete" classAct="button delete" classSel="button deleteSel" title="deletecontact" content=" " />
<span class="separator">&nbsp;</span>
<roundcube:button command="import" type="link" class="buttonPas import" classAct="button import" classSel="button importSel" title="importcontacts" content=" " />
diff --git a/skins/classic/templates/compose.html b/skins/classic/templates/compose.html
index 1515eeb06..805032504 100644
--- a/skins/classic/templates/compose.html
+++ b/skins/classic/templates/compose.html
@@ -174,11 +174,13 @@
<div id="composeoptionsmenu" class="popupmenu">
<table>
+ <roundcube:if condition="!in_array('mdn_default', (array)config:dont_override)" />
<tr>
<td><label for="rcmcomposereceipt"><roundcube:label name="returnreceipt" />:</label></td>
- <td><roundcube:object name="receiptCheckBox" form="form" id="rcmcomposereceipt" /></td>
+ <td><roundcube:object name="mdnCheckBox" form="form" id="rcmcomposereceipt" /></td>
</tr>
- <roundcube:if condition="config:smtp_server != ''" />
+ <roundcube:endif />
+ <roundcube:if condition="config:smtp_server != '' and !in_array('dsn_default', (array)config:dont_override)" />
<tr>
<td><label for="rcmcomposedsn"><roundcube:label name="dsn" />:</label></td>
<td><roundcube:object name="dsnCheckBox" form="form" id="rcmcomposedsn" /></td>
diff --git a/skins/classic/templates/contactprint.html b/skins/classic/templates/contactprint.html
new file mode 100644
index 000000000..81794f5a1
--- /dev/null
+++ b/skins/classic/templates/contactprint.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<link rel="shortcut icon" href="/images/favicon.ico"/>
+<link rel="stylesheet" type="text/css" href="/print.css" />
+</head>
+<body>
+
+<roundcube:object name="logo" src="/images/roundcube_logo.png" id="logo" border="0" />
+
+<div id="contact-details">
+ <div id="contactphoto"><roundcube:object name="contactphoto" id="contactpic" placeholder="/images/contactpic.png" placeholderGroup="/images/contactgroup.png" /></div>
+ <roundcube:object name="contacthead" id="contacthead" />
+ <div style="clear:both"></div>
+ <roundcube:object name="contactdetails" />
+</div>
+
+</body>
+</html>
diff --git a/skins/larry/print.css b/skins/larry/print.css
index d3a6cd802..4b67bcc07 100644
--- a/skins/larry/print.css
+++ b/skins/larry/print.css
@@ -143,3 +143,66 @@ p.image-attachment .attachment-links {
display: none;
}
+/* contact print */
+#contact-details fieldset {
+ color: #666;
+ border: 1px solid #999;
+ margin-top: 5px;
+}
+
+#contact-details fieldset.contactfieldgroup {
+ border: 0;
+ padding: 0;
+ margin: 0;
+}
+
+#contact-details div.row {
+ padding: 2px 0;
+}
+
+#contact-details .contactfieldlabel {
+ display: inline-block;
+ vertical-align: top;
+ width: 150px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+#contact-details .contactfieldcontent {
+ display: inline-block;
+ vertical-align: top;
+ font-weight: bold;
+}
+
+#contact-details #contactphoto {
+ float: left;
+ margin: 5px 15px 5px 3px;
+ width: 112px;
+ border: 0;
+ padding: 0;
+}
+
+#contact-details #contactpic {
+ width: 112px;
+ background: white;
+}
+
+#contact-details #contactpic img {
+ max-width: 112px;
+ visibility: inherit;
+}
+
+#contact-details #contacthead {
+ border: 0;
+ margin: 0 16em 0 0;
+ padding: 0;
+}
+
+#contact-details #contacthead > legend {
+ display: none;
+}
+
+#contact-details #contacthead .names span.namefield {
+ font-size: 140%;
+ font-weight: bold;
+}
diff --git a/skins/larry/styles.css b/skins/larry/styles.css
index 51dfba717..c8c9a038a 100644
--- a/skins/larry/styles.css
+++ b/skins/larry/styles.css
@@ -3081,3 +3081,7 @@ ul.toolbarmenu li span.copy {
line-height: 16px !important;
vertical-align: text-top !important;
}
+
+_:not(), _:-moz-handler-blocked, .mozilla .mce-btn-small i {
+ line-height: 20px !important;
+} \ No newline at end of file
diff --git a/skins/larry/templates/about.html b/skins/larry/templates/about.html
index b0d36d177..9cc646b7d 100644
--- a/skins/larry/templates/about.html
+++ b/skins/larry/templates/about.html
@@ -14,7 +14,7 @@
<roundcube:object name="aboutcontent" />
<h2 class="sysname">Roundcube Webmail <roundcube:object name="version" /></h2>
-<p class="copyright">Copyright &copy; 2005-2014, The Roundcube Dev Team</p>
+<p class="copyright">Copyright &copy; 2005-2015, The Roundcube Dev Team</p>
<p class="license">This program is free software; you can redistribute it and/or modify
it under the terms of the <a href="http://www.gnu.org/licenses/gpl.html" target="_blank">GNU General Public License</a>
as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.<br/>
diff --git a/skins/larry/templates/addressbook.html b/skins/larry/templates/addressbook.html
index 62bca3c84..7f358f51d 100644
--- a/skins/larry/templates/addressbook.html
+++ b/skins/larry/templates/addressbook.html
@@ -23,6 +23,7 @@
<span class="spacer"></span>
<roundcube:button command="compose" type="link" class="button compose disabled" classAct="button compose" classSel="button compose pressed" label="compose" title="writenewmessage" />
+ <roundcube:button command="print" type="link" class="button print disabled" classAct="button print" classSel="button print pressed" label="print" title="printcontact" />
<roundcube:button command="advanced-search" type="link" class="button search disabled" classAct="button search" classSel="button search pressed" label="advanced" title="advsearch" />
<roundcube:container name="toolbar" id="addressbooktoolbar" />
diff --git a/skins/larry/templates/compose.html b/skins/larry/templates/compose.html
index 04a987f89..3e2eaac6a 100644
--- a/skins/larry/templates/compose.html
+++ b/skins/larry/templates/compose.html
@@ -146,10 +146,12 @@
<label for="rcmcomposepriority"><roundcube:label name="priority" />
<roundcube:object name="prioritySelector" form="form" id="rcmcomposepriority" tabindex="4" /></label>
</span>
+ <roundcube:if condition="!in_array('mdn_default', (array)config:dont_override)" />
<span class="composeoption">
- <label><roundcube:object name="receiptCheckBox" form="form" id="rcmcomposereceipt" tabindex="4" /> <roundcube:label name="returnreceipt" /></label>
+ <label><roundcube:object name="mdnCheckBox" form="form" id="rcmcomposereceipt" tabindex="4" /> <roundcube:label name="returnreceipt" /></label>
</span>
- <roundcube:if condition="config:smtp_server != ''" />
+ <roundcube:endif />
+ <roundcube:if condition="config:smtp_server != '' and !in_array('dsn_default', (array)config:dont_override)" />
<span class="composeoption">
<label><roundcube:object name="dsnCheckBox" form="form" id="rcmcomposedsn" tabindex="4" /> <roundcube:label name="dsn" /></label>
</span>
diff --git a/skins/larry/templates/contactprint.html b/skins/larry/templates/contactprint.html
new file mode 100644
index 000000000..f3f169ec2
--- /dev/null
+++ b/skins/larry/templates/contactprint.html
@@ -0,0 +1,20 @@
+<roundcube:object name="doctype" value="html5" />
+<html>
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<link rel="shortcut icon" href="/images/favicon.ico"/>
+<link rel="stylesheet" type="text/css" href="/print.css" />
+</head>
+<body>
+
+<div id="header"><roundcube:object name="logo" src="/images/roundcube_logo.png" id="toplogo" border="0" alt="Logo" /></div>
+
+<div id="contact-details" class="boxcontent">
+ <div id="contactphoto"><roundcube:object name="contactphoto" id="contactpic" placeholder="/images/contactpic.png" placeholderGroup="/images/contactgroup.png" /></div>
+ <roundcube:object name="contacthead" id="contacthead" />
+ <br style="clear:both" />
+ <roundcube:object name="contactdetails" />
+</div>
+
+</body>
+</html>
diff --git a/skins/larry/ui.js b/skins/larry/ui.js
index fb7ca318c..a4c29fd9e 100644
--- a/skins/larry/ui.js
+++ b/skins/larry/ui.js
@@ -1,5 +1,3 @@
-// @license http://creativecommons.org/publicdomain/zero/1.0/legalcode CC0
-
/**
* Roundcube functions for default skin interface
*
@@ -9,6 +7,8 @@
* License. It is allowed to copy, distribute, transmit and to adapt the work
* by keeping credits to the original autors in the README file.
* See http://creativecommons.org/licenses/by-sa/3.0/ for details.
+ *
+ * @license magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt CC0-1.0
*/
function rcube_mail_ui()
@@ -277,19 +277,22 @@ function rcube_mail_ui()
orientation:'v', relative:true, start:266, min:180, size:12 }).init();
}
else if (rcmail.env.action == 'edit-prefs') {
- $('<a href="#toggle"></a>')
+ var legend = $('#preferences-details fieldset.advanced legend'),
+ toggle = $('<a href="#toggle"></a>')
.text(env.toggleoptions)
.attr('title', env.toggleoptions)
- .addClass('advanced-toggle')
- .appendTo('#preferences-details fieldset.advanced legend');
-
- $('#preferences-details fieldset.advanced legend').click(function(e){
- var collapsed = $(this).hasClass('collapsed'),
- toggle = $('.advanced-toggle', this).html(collapsed ? '&#9650;' : '&#9660;');
- $(this)
- .toggleClass('collapsed')
- .closest('fieldset').children('.propform').toggle()
- }).addClass('collapsed')
+ .addClass('advanced-toggle');
+
+ legend.click(function(e) {
+ toggle.html($(this).hasClass('collapsed') ? '&#9650;' : '&#9660;');
+
+ $(this).toggleClass('collapsed')
+ .closest('fieldset').children('.propform').toggle()
+ }).append(toggle).addClass('collapsed')
+
+ // this magically fixes incorrect position of toggle link created above in Firefox 3.6
+ if (bw.mz)
+ legend.parents('form').css('display', 'inline');
}
}
/*** addressbook task ***/
diff --git a/tests/Framework/Washtml.php b/tests/Framework/Washtml.php
index f041504d7..e4e3de41f 100644
--- a/tests/Framework/Washtml.php
+++ b/tests/Framework/Washtml.php
@@ -159,7 +159,7 @@ class Framework_Washtml extends PHPUnit_Framework_TestCase
$washer = new rcube_washtml;
$washed = $washer->wash($html);
- $this->assertRegExp('|style=\'font-family: "新細明體","serif"; color: red\'|', $washed, "Unicode chars in style attribute - quoted (#1489697)");
+ $this->assertRegExp('|style="font-family: \&quot;新細明體\&quot;,\&quot;serif\&quot;; color: red"|', $washed, "Unicode chars in style attribute - quoted (#1489697)");
$html = "<html><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
<body><span style='font-family:新細明體;color:red'>test</span></body></html>";
@@ -183,4 +183,26 @@ class Framework_Washtml extends PHPUnit_Framework_TestCase
$this->assertRegExp('|line-height: 1;|', $washed, "Untouched line-height (#1489917)");
$this->assertRegExp('|; height: 10px|', $washed, "Fixed height units");
}
+
+ /**
+ * Test invalid style cleanup - XSS prevention (#1490227)
+ */
+ function test_style_wash_xss()
+ {
+ $html = "<img style=aaa:'\"/onerror=alert(1)//'>";
+ $exp = "<img style=\"aaa: '&quot;/onerror=alert(1)//'\" />";
+
+ $washer = new rcube_washtml;
+ $washed = $washer->wash($html);
+
+ $this->assertTrue(strpos($washed, $exp) !== false, "Style quotes XSS issue (#1490227)");
+
+ $html = "<img style=aaa:'&quot;/onerror=alert(1)//'>";
+ $exp = "<img style=\"aaa: '&quot;/onerror=alert(1)//'\" />";
+
+ $washer = new rcube_washtml;
+ $washed = $washer->wash($html);
+
+ $this->assertTrue(strpos($washed, $exp) !== false, "Style quotes XSS issue (#1490227)");
+ }
}
diff --git a/tests/MailFunc.php b/tests/MailFunc.php
index 7fb78ef9e..2baeedf17 100644
--- a/tests/MailFunc.php
+++ b/tests/MailFunc.php
@@ -45,7 +45,7 @@ class MailFunc extends PHPUnit_Framework_TestCase
$html = rcmail_html4inline(rcmail_print_body($part->body, $part, array('safe' => false)), 'foo');
$this->assertRegExp('/src="'.$part->replaces['ex1.jpg'].'"/', $html, "Replace reference to inline image");
- $this->assertRegExp('#background="./program/resources/blocked.gif"#', $html, "Replace external background image");
+ $this->assertRegExp('#background="program/resources/blocked.gif"#', $html, "Replace external background image");
$this->assertNotRegExp('/ex3.jpg/', $html, "No references to external images");
$this->assertNotRegExp('/<meta [^>]+>/', $html, "No meta tags allowed");
//$this->assertNoPattern('/<style [^>]+>/', $html, "No style tags allowed");