diff options
65 files changed, 440 insertions, 246 deletions
diff --git a/.gitignore b/.gitignore index f55131f8c..c410c9b8b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,9 @@ logs/* temp/* config/* -plugins/*/config.inc.php
\ No newline at end of file +plugins/*/config.inc.php + +# composer-related +composer.phar +composer.lock +vendor @@ -1,6 +1,13 @@ CHANGELOG Roundcube Webmail =========================== +- Add option to disable saving sent mail in Sent folder - no_save_sent_messages (#1488686) +- Fix handling dont_override with message_sort_col and message_sort_order settings (#1488760) +- Fix HTML part detection in messages with attachments (#1488769) +- Fix bug where wrong words were highlighted on spell-before-send check +- Fix handling of URLs with asterisk characters (#1488759) +- Remove automatic to-lowercase conversion of usernames (#1488715) +- Fix scrolling quirk in email preview frame using Opera 12 (#1488763) - Fix displaying of multipart/alternative messages with empty parts (#1488750) - Fix threaded list sorting on PHP < 5.2.9 (#1488748) - Plugin API: Add 'email_list' argument for identities data in user_create hook diff --git a/composer.json-dist b/composer.json-dist new file mode 100644 index 000000000..104b572c4 --- /dev/null +++ b/composer.json-dist @@ -0,0 +1,33 @@ +{ + "name": "roundcube/roundcubemail", + "description": "The Roundcube Webmail suite", + "license": "GPL-3.0", + "repositories": [ + { + "packagist": false + }, + { + "type": "pear", + "url": "http://pear.php.net/" + }, + { + "type": "package", + "package": { + "name": "Net_SMTP", + "version": "dev-master", + "source": { + "url": "http://github.com/pear/Net_SMTP", + "type": "git", + "reference": "master" + } + } + } + ], + "require" : { + "pear-pear/Mail_Mime": ">=1.8.1", + "pear-pear/Mail_mimeDecode": ">=1.5.5", + "Net_SMTP": "dev-master", + "pear-pear/Net_IDNA2": ">=0.1.1", + "pear-pear/Auth_SASL": ">=1.0.6" + } +} diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist index 15052c332..dafee72f1 100644 --- a/config/main.inc.php.dist +++ b/config/main.inc.php.dist @@ -182,6 +182,9 @@ $rcmail_config['smtp_timeout'] = 0; // ONLY ENABLE IT IF YOU'RE REALLY SURE WHAT YOU'RE DOING! $rcmail_config['enable_installer'] = false; +// don't allow these settings to be overriden by the user +$rcmail_config['dont_override'] = array(); + // provide an URL where a user can get support for this Roundcube installation // PLEASE DO NOT LINK TO THE ROUNDCUBE.NET WEBSITE HERE! $rcmail_config['support_url'] = ''; @@ -226,10 +229,10 @@ $rcmail_config['login_autocomplete'] = 0; // Forces conversion of logins to lower case. // 0 - disabled, 1 - only domain part, 2 - domain and local part. -// If users authentication is not case-sensitive this must be enabled. -// After enabling it all user records need to be updated, e.g. with query: -// UPDATE users SET username = LOWER(username); -$rcmail_config['login_lc'] = 0; +// If users authentication is case-insensitive this must be enabled. +// Note: After enabling it all user records need to be updated, e.g. with query: +// UPDATE users SET username = LOWER(username); +$rcmail_config['login_lc'] = 2; // Includes should be interpreted as PHP files $rcmail_config['skin_include_php'] = false; @@ -349,9 +352,6 @@ $rcmail_config['line_length'] = 72; // send plaintext messages as format=flowed $rcmail_config['send_format_flowed'] = true; -// don't allow these settings to be overriden by the user -$rcmail_config['dont_override'] = array(); - // Set identities access level: // 0 - many identities with possibility to edit all params // 1 - many identities with possibility to edit all params but not email address @@ -379,6 +379,10 @@ $rcmail_config['contact_photo_size'] = 160; // Enable DNS checking for e-mail address validation $rcmail_config['email_dns_check'] = false; +// Disables saving sent messages in Sent folder (like gmail) (Default: false) +// Note: useful when SMTP server stores sent mail in user mailbox +$rcmail_config['no_save_sent_messages'] = false; + // ---------------------------------- // PLUGINS // ---------------------------------- @@ -514,10 +518,12 @@ $rcmail_config['undo_timeout'] = 0; // ---------------------------------- // This indicates which type of address book to use. Possible choises: -// 'sql' (default) and 'ldap'. +// 'sql' (default), 'ldap' and ''. // If set to 'ldap' then it will look at using the first writable LDAP // address book as the primary address book and it will not display the // SQL address book in the 'Address Book' view. +// If set to '' then no address book will be displayed or only the +// addressbook which is created by a plugin (like CardDAV). $rcmail_config['address_book_type'] = 'sql'; // In order to enable public ldap search, configure an array like the Verisign diff --git a/plugins/jqueryui/themes/larry/jquery-ui-1.8.18.custom.css b/plugins/jqueryui/themes/larry/jquery-ui-1.8.18.custom.css index 370ed9ce8..b2619efd4 100755 --- a/plugins/jqueryui/themes/larry/jquery-ui-1.8.18.custom.css +++ b/plugins/jqueryui/themes/larry/jquery-ui-1.8.18.custom.css @@ -466,6 +466,7 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad background: -o-linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); background: -ms-linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); background: linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9', endColorstr='#e6e6e6', GradientType=0); box-shadow: 0 1px 1px 0 rgba(140, 140, 140, 0.3); -o-box-shadow: 0 1px 1px 0 rgba(140, 140, 140, 0.3); -webkit-box-shadow: 0 1px 1px 0 rgba(140, 140, 140, 0.3); @@ -492,7 +493,7 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad background: -o-linear-gradient(top, #e6e6e6 0%, #f9f9f9 100%); background: -ms-linear-gradient(top, #e6e6e6 0%, #f9f9f9 100%); background: linear-gradient(top, #e6e6e6 0%, #f9f9f9 100%); - + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6e6e6', endColorstr='#f9f9f9', GradientType=0); } /* @@ -536,6 +537,7 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad background: -o-linear-gradient(top, #019bc6 0%, #017cb4 100%); background: -ms-linear-gradient(top, #019bc6 0%, #017cb4 100%); background: linear-gradient(top, #019bc6 0%, #017cb4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#019bc6', endColorstr='#017cb4', GradientType=0); }; .ui-slider-horizontal { height: .8em; } @@ -559,11 +561,11 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad */ .ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ .ui-tabs .ui-tabs-nav { margin: 0; padding: 0; border: 0; background: transparent; height: 44px; } -.ui-tabs .ui-tabs-nav li { list-style: none; display: inline; border: 0; border-radius: 0; margin: 0; border-bottom: 0 !important; padding: 15px 1px 15px 0; white-space: nowrap; background: #f8f8f8; background: -moz-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(50%,#d3d3d3), color-stop(100%,#f8f8f8)); background: -webkit-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: -o-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: -ms-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); } +.ui-tabs .ui-tabs-nav li { list-style: none; display: inline; border: 0; border-radius: 0; margin: 0; border-bottom: 0 !important; padding: 15px 1px 15px 0; white-space: nowrap; background: #f8f8f8; background: -moz-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(50%,#d3d3d3), color-stop(100%,#f8f8f8)); background: -webkit-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: -o-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: -ms-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); background: linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#d3d3d3', GradientType=0); } .ui-tabs .ui-tabs-nav li a { display: inline-block; padding: 15px; text-decoration: none; font-size: 12px; color: #999; background: #fafafa; border-right: 1px solid #fafafa; } .ui-dialog-content .tabsbar .tablink a { background: #fafafa; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected { } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-dialog-content .tabsbar .tablink.selected a { color: #004458; background: #efefef; background: -moz-linear-gradient(top, #fafafa 40%, #e4e4e4 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(40%,#fff), color-stop(100%,#e4e4e4)); background: -o-linear-gradient(top, #fafafa 40%, #e4e4e4 100%); background: -ms-linear-gradient(top, #fafafa 40%, #e4e4e4 100%); background: linear-gradient(top, #fafafa 40%, #e4e4e4 100%); } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-dialog-content .tabsbar .tablink.selected a { color: #004458; background: #efefef; background: -moz-linear-gradient(top, #fafafa 40%, #e4e4e4 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(40%,#fff), color-stop(100%,#e4e4e4)); background: -o-linear-gradient(top, #fafafa 40%, #e4e4e4 100%); background: -ms-linear-gradient(top, #fafafa 40%, #e4e4e4 100%); background: linear-gradient(top, #fafafa 40%, #e4e4e4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa', endColorstr='#e4e4e4', GradientType=0); } .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } .ui-tabs .ui-tabs-nav li:last-child { background: none; } .ui-tabs .ui-tabs-nav li:last-child a { border: 0; } diff --git a/plugins/managesieve/Changelog b/plugins/managesieve/Changelog index ce9386154..dceac7602 100644 --- a/plugins/managesieve/Changelog +++ b/plugins/managesieve/Changelog @@ -1,3 +1,5 @@ +- Fixed filter activation/deactivation confirmation message (#1488765) + * version 6.0 [2012-10-03] ----------------------------------------------------------- - Fixed issue with DBMail bug [http://pear.php.net/bugs/bug.php?id=19077] (#1488594) diff --git a/plugins/managesieve/localization/bs_BA.inc b/plugins/managesieve/localization/bs_BA.inc index 438d99e9c..106fe6d75 100644 --- a/plugins/managesieve/localization/bs_BA.inc +++ b/plugins/managesieve/localization/bs_BA.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Nije moguće kreirati se filtera. Desila se servers $labels['setcreated'] = 'Set filtera je uspješno kreiran.'; $labels['activateerror'] = 'Nije moguće omogućiti označene filtere. Desila se serverska greška.'; $labels['deactivateerror'] = 'Nije moguće onemogućiti označene filtere. Desila se serverska greška.'; -$labels['activated'] = 'Filteri su uspješno onemogućeni.'; -$labels['deactivated'] = 'Filteri su uspješno omogućeni.'; +$labels['deactivated'] = 'Filteri su uspješno onemogućeni.'; +$labels['activated'] = 'Filteri su uspješno omogućeni.'; $labels['moved'] = 'Filteri su uspješno premješteni.'; $labels['moveerror'] = 'Nije moguće premjestiti označeni filter. Desila se serverska greška.'; $labels['nametoolong'] = 'Ime je predugo.'; diff --git a/plugins/managesieve/localization/ca_ES.inc b/plugins/managesieve/localization/ca_ES.inc index d7e8b67be..ad03bdf0c 100644 --- a/plugins/managesieve/localization/ca_ES.inc +++ b/plugins/managesieve/localization/ca_ES.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'No s\'ha pogut crear el conjunt de filtres. Hi ha h $labels['setcreated'] = 'S\'ha creat correctament el conjunt de filtres.'; $labels['activateerror'] = 'No s\'ha pogut habilitar el(s) filtre(s) seleccionat(s). Hi ha hagut un error al servidor.'; $labels['deactivateerror'] = 'No s\'ha pogut deshabilitar el(s) filtre(s) seleccionat(s). Hi ha hagut un error al servidor.'; -$labels['activated'] = 'Filtre(s) deshabilitat(s) correctament.'; -$labels['deactivated'] = 'Filtre(s) habilitat(s) correctament.'; +$labels['deactivated'] = 'Filtre(s) deshabilitat(s) correctament.'; +$labels['activated'] = 'Filtre(s) habilitat(s) correctament.'; $labels['moved'] = 'S\'ha mogut correctament el filtre.'; $labels['moveerror'] = 'No s\'ha pogut moure el filtre seleccionat. Hi ha hagut un error al servidor.'; $labels['nametoolong'] = 'El nom és massa llarg.'; diff --git a/plugins/managesieve/localization/cs_CZ.inc b/plugins/managesieve/localization/cs_CZ.inc index 0790eae9c..c3448ab47 100644 --- a/plugins/managesieve/localization/cs_CZ.inc +++ b/plugins/managesieve/localization/cs_CZ.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Nelze vytvořit sadu filtrů. Došlo k chybě serve $labels['setcreated'] = 'Sada filtrů úspěšně vytvořena.'; $labels['activateerror'] = 'Nelze zapnout vybrané filtr/y. Došlo k chybě serveru.'; $labels['deactivateerror'] = 'Nelze vypnout vybrané filtr/y. Došlo k chybě serveru.'; -$labels['activated'] = 'Filtr/y úspěšne vypnuty.'; -$labels['deactivated'] = 'Filtr/y úspěšně zapnuty.'; +$labels['deactivated'] = 'Filtr/y úspěšne vypnuty.'; +$labels['activated'] = 'Filtr/y úspěšně zapnuty.'; $labels['moved'] = 'Filtr byl úspěšně přesunut.'; $labels['moveerror'] = 'Nelze přesunout vybraný filtr. Došlo k chybě na serveru.'; $labels['nametoolong'] = 'Příliš dlouhý název.'; diff --git a/plugins/managesieve/localization/cy_GB.inc b/plugins/managesieve/localization/cy_GB.inc index bace9be6e..4ca1efdd6 100644 --- a/plugins/managesieve/localization/cy_GB.inc +++ b/plugins/managesieve/localization/cy_GB.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Methwyd creu set hidlydd. Cafwyd gwall gweinydd.'; $labels['setcreated'] = 'Crëuwyd y set hidlydd yn llwyddiannus.'; $labels['activateerror'] = 'Methwyd galluogi y hidlydd(ion) dewiswyd. Cafwyd gwall gweinydd.'; $labels['deactivateerror'] = 'Methwyd analluogi y hidlydd(ion) dewiswyd. Cafwyd gwall gweinydd.'; -$labels['activated'] = 'Analluogwyd y hidlydd(ion) yn llwyddiannus.'; -$labels['deactivated'] = 'Galluogwyd y hidlydd(ion) yn llwyddiannus.'; +$labels['deactivated'] = 'Analluogwyd y hidlydd(ion) yn llwyddiannus.'; +$labels['activated'] = 'Galluogwyd y hidlydd(ion) yn llwyddiannus.'; $labels['moved'] = 'Symudwyd y hidlydd yn llwyddiannus.'; $labels['moveerror'] = 'Methwyd symud y hidlydd dewiswyd. Cafwyd gwall gweinydd.'; $labels['nametoolong'] = 'Enw yn rhy hir.'; diff --git a/plugins/managesieve/localization/da_DK.inc b/plugins/managesieve/localization/da_DK.inc index 91bc18dd7..8c96a1420 100644 --- a/plugins/managesieve/localization/da_DK.inc +++ b/plugins/managesieve/localization/da_DK.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Kan ikke oprette filter sæt. Server fejl.'; $labels['setcreated'] = 'Filter sæt oprettet.'; $labels['activateerror'] = 'Kan ikek aktivere valgt filter sæt. Server fejl.'; $labels['deactivateerror'] = 'Kan ikke deaktivere valgt filter sæt. Server fejl.'; -$labels['activated'] = 'Filter(filtre) deaktiveret.'; -$labels['deactivated'] = 'Filter(filtre) aktiveret.'; +$labels['deactivated'] = 'Filter(filtre) deaktiveret.'; +$labels['activated'] = 'Filter(filtre) aktiveret.'; $labels['moved'] = 'Filter flyttet.'; $labels['moveerror'] = 'Kan ikke flytte valgt filter. Server fejl.'; $labels['nametoolong'] = 'Navn er for langt.'; diff --git a/plugins/managesieve/localization/de_CH.inc b/plugins/managesieve/localization/de_CH.inc index 963d1a6a2..ceb7475ad 100644 --- a/plugins/managesieve/localization/de_CH.inc +++ b/plugins/managesieve/localization/de_CH.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Filtersatz kann nicht erstellt werden. Serverfehler $labels['setcreated'] = 'Filter erfolgreich erstellt.'; $labels['activateerror'] = 'Filter kann nicht aktiviert werden. Serverfehler.'; $labels['deactivateerror'] = 'Filter kann nicht deaktiviert werden. Serverfehler.'; -$labels['activated'] = 'Filter erfolgreich deaktiviert.'; -$labels['deactivated'] = 'Filter erfolgreich aktiviert.'; +$labels['deactivated'] = 'Filter erfolgreich deaktiviert.'; +$labels['activated'] = 'Filter erfolgreich aktiviert.'; $labels['moved'] = 'Filter erfolgreich verschoben.'; $labels['moveerror'] = 'Filter kann nicht verschoben werden. Serverfehler.'; $labels['nametoolong'] = 'Filtersatz kann nicht erstellt werden. Name zu lang.'; diff --git a/plugins/managesieve/localization/en_US.inc b/plugins/managesieve/localization/en_US.inc index cb223c18f..9336390d1 100644 --- a/plugins/managesieve/localization/en_US.inc +++ b/plugins/managesieve/localization/en_US.inc @@ -145,8 +145,8 @@ $messages['setcreateerror'] = 'Unable to create filters set. Server error occure $messages['setcreated'] = 'Filters set created successfully.'; $messages['activateerror'] = 'Unable to enable selected filter(s). Server error occured.'; $messages['deactivateerror'] = 'Unable to disable selected filter(s). Server error occured.'; -$messages['activated'] = 'Filter(s) disabled successfully.'; -$messages['deactivated'] = 'Filter(s) enabled successfully.'; +$messages['deactivated'] = 'Filter(s) disabled successfully.'; +$messages['activated'] = 'Filter(s) enabled successfully.'; $messages['moved'] = 'Filter moved successfully.'; $messages['moveerror'] = 'Unable to move selected filter. Server error occured.'; $messages['nametoolong'] = 'Name too long.'; diff --git a/plugins/managesieve/localization/es_ES.inc b/plugins/managesieve/localization/es_ES.inc index 75965ae56..a171ec4b0 100644 --- a/plugins/managesieve/localization/es_ES.inc +++ b/plugins/managesieve/localization/es_ES.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Imposible crear el conjunto de filtros. Ha ocurrido $labels['setcreated'] = 'Conjunto de filtros creado satisfactoriamente'; $labels['activateerror'] = 'No se ha podido habilitar el filtro(s) seleccionado. Se ha producido un error de servidor.'; $labels['deactivateerror'] = 'No se ha podido deshabilitar el filtro(s) seleccionado. Se ha producido un error de servidor.'; -$labels['activated'] = 'Filtro(s) deshabilitado(s) correctamente.'; -$labels['deactivated'] = 'Filtro(s) habilitado(s) correctamente.'; +$labels['deactivated'] = 'Filtro(s) deshabilitado(s) correctamente.'; +$labels['activated'] = 'Filtro(s) habilitado(s) correctamente.'; $labels['moved'] = 'Filtro movido correctamente'; $labels['moveerror'] = 'No se ha podido mover el filtro seleccionado. Ha ocurrido un error de servidor.'; $labels['nametoolong'] = 'Imposible crear el conjunto de filtros. Nombre demasiado largo'; diff --git a/plugins/managesieve/localization/et_EE.inc b/plugins/managesieve/localization/et_EE.inc index fab96639c..67501f8d3 100644 --- a/plugins/managesieve/localization/et_EE.inc +++ b/plugins/managesieve/localization/et_EE.inc @@ -130,8 +130,8 @@ $labels['cannotbeempty'] = 'Väli ei või tühi olla'; $labels['ruleexist'] = 'Määratud nimega filter on juba olemas'; $labels['activateerror'] = 'Valitud filtrite lubamine nurjus. Ilmnes serveri tõrge.'; $labels['deactivateerror'] = 'Valitud filtrite keelamine nurjus. Ilmnes serveri tõrge.'; -$labels['activated'] = 'Filter edukalt keelatud.'; -$labels['deactivated'] = 'Filter edukalt lubatud.'; +$labels['deactivated'] = 'Filter edukalt keelatud.'; +$labels['activated'] = 'Filter edukalt lubatud.'; $labels['moved'] = 'Filter edukalt liigutatud.'; $labels['moveerror'] = 'Valitud filtri liigutamine nurjus. Ilmnes serveri tõrge.'; $labels['nametoolong'] = 'Nimi on liiga pikk.'; diff --git a/plugins/managesieve/localization/fa_IR.inc b/plugins/managesieve/localization/fa_IR.inc index e4abb3f2a..9f20dab54 100644 --- a/plugins/managesieve/localization/fa_IR.inc +++ b/plugins/managesieve/localization/fa_IR.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'ناتوانی در ایجاد مجموعه صاف $labels['setcreated'] = 'مجموعه صافیها با موفقیت ایجاد شد.'; $labels['activateerror'] = 'ناتوانی در فعال کردن صافی(های) انتخاب شده. خطای سرور رخ داد.'; $labels['deactivateerror'] = 'ناتوانی در غیرفعال کردن صافی(های) انتخاب شده. خطای سرور رخ داد.'; -$labels['activated'] = 'صافی(ها) با موفقیت غیرفعال شدند.'; -$labels['deactivated'] = 'صافی(ها) با موفقیت فعال شدند.'; +$labels['deactivated'] = 'صافی(ها) با موفقیت غیرفعال شدند.'; +$labels['activated'] = 'صافی(ها) با موفقیت فعال شدند.'; $labels['moved'] = 'صافی با موفقیت منتقل شد.'; $labels['moveerror'] = 'ناتوانی در انتقال صافی انتخاب شده. خطای سرور رخ داد.'; $labels['nametoolong'] = 'نام خیلی بلند.'; diff --git a/plugins/managesieve/localization/fi_FI.inc b/plugins/managesieve/localization/fi_FI.inc index cee71428f..5a0c30954 100644 --- a/plugins/managesieve/localization/fi_FI.inc +++ b/plugins/managesieve/localization/fi_FI.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Suodatinlistan luonti epäonnistui. Palvelin virhe. $labels['setcreated'] = 'Suodatinlistan luonti onnistui.'; $labels['activateerror'] = 'Suodatinlistan päälle kytkeminen epäonnistui. Palvelin virhe.'; $labels['deactivateerror'] = 'Suodatinlistan pois päältä kytkeminen epäonnistui. Palvelin virhe.'; -$labels['activated'] = 'Suodatinlista(t) kytketty pois päältä onnistuneesti.'; -$labels['deactivated'] = 'Suodatinlista(t) kytketty päälle onnistuneesti.'; +$labels['deactivated'] = 'Suodatinlista(t) kytketty pois päältä onnistuneesti.'; +$labels['activated'] = 'Suodatinlista(t) kytketty päälle onnistuneesti.'; $labels['moved'] = 'Suodatin siirretty onnistuneesti.'; $labels['moveerror'] = 'Valitun suodattimen siirto epäonnistui palvelinvirheen vuoksi.'; $labels['nametoolong'] = 'Nimi on liian pitkä.'; diff --git a/plugins/managesieve/localization/fr_FR.inc b/plugins/managesieve/localization/fr_FR.inc index 4151f6340..b0a4089d1 100644 --- a/plugins/managesieve/localization/fr_FR.inc +++ b/plugins/managesieve/localization/fr_FR.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Impossible de créer le groupe de filtres. Le serve $labels['setcreated'] = 'Le groupe de filtres a bien été créé.'; $labels['activateerror'] = 'Impossible d\'activer le(s) filtre(s) sélectionné(s). Une erreur serveur s\'est produite.'; $labels['deactivateerror'] = 'Impossible de désactiver le(s) filtre(s) sélectionné(s). Une erreur serveur s\'est produite.'; -$labels['activated'] = 'Filtre(s) désactivé(s) avec succès'; -$labels['deactivated'] = 'Filtre(s) activé(s) avec succès'; +$labels['deactivated'] = 'Filtre(s) désactivé(s) avec succès'; +$labels['activated'] = 'Filtre(s) activé(s) avec succès'; $labels['moved'] = 'Filtre déplacé avec succès.'; $labels['moveerror'] = 'Déplacement du filtre sélectionné impossible. Le serveur a renvoyé une erreur.'; $labels['nametoolong'] = 'Nom trop long.'; diff --git a/plugins/managesieve/localization/he_IL.inc b/plugins/managesieve/localization/he_IL.inc index b44088bcb..2262841c1 100644 --- a/plugins/managesieve/localization/he_IL.inc +++ b/plugins/managesieve/localization/he_IL.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'לא ניתן ליצור ערכת מסננים. א $labels['setcreated'] = 'ערכת המסננים נוצרה בהצלחה.'; $labels['activateerror'] = 'לא ניתן להפעיל את המסננים הנבחרים. אירעה שגיאה בצד השרת.'; $labels['deactivateerror'] = 'לא ניתן לנטרל את המסננים הנבחרים. אירעה שגיאה בצד השרת.'; -$labels['activated'] = 'המסננים נוטרלו בהצלחה.'; -$labels['deactivated'] = 'המסננים הופעלו בהצלחה.'; +$labels['deactivated'] = 'המסננים נוטרלו בהצלחה.'; +$labels['activated'] = 'המסננים הופעלו בהצלחה.'; $labels['moved'] = 'המסנן הועבר בהצלחה.'; $labels['moveerror'] = 'לא ניתן להעביר את המסנן הנבחר. אירעה שגיאה בצד השרת.'; $labels['nametoolong'] = 'השם ארוך מדי.'; diff --git a/plugins/managesieve/localization/hr_HR.inc b/plugins/managesieve/localization/hr_HR.inc index c4eaec0c3..4e0211868 100644 --- a/plugins/managesieve/localization/hr_HR.inc +++ b/plugins/managesieve/localization/hr_HR.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Nemoguće stvoriti grupu filtera. Greška na poslu $labels['setcreated'] = 'Grupa filtera je uspješno stvorena'; $labels['activateerror'] = 'Nije moguće omogućiti odabrani filter(e). Greška poslužitelja.'; $labels['deactivateerror'] = 'Nije moguće onemogučiti odabrane filter(e). Greška poslužitelja.'; -$labels['activated'] = 'Filter(i) onemogućen(i) uspješno.'; -$labels['deactivated'] = 'Filter(i) omogućen(i) uspješno.'; +$labels['deactivated'] = 'Filter(i) onemogućen(i) uspješno.'; +$labels['activated'] = 'Filter(i) omogućen(i) uspješno.'; $labels['moved'] = 'Filter uspješno premješten.'; $labels['moveerror'] = 'Nije moguće premjestiti odabrani filter. Greška poslužitelja.'; $labels['nametoolong'] = 'Nemoguće napraviti grupu filtera. Naziv je predugačak'; diff --git a/plugins/managesieve/localization/hu_HU.inc b/plugins/managesieve/localization/hu_HU.inc index 117315812..179510087 100644 --- a/plugins/managesieve/localization/hu_HU.inc +++ b/plugins/managesieve/localization/hu_HU.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Nem sikerült létrehozni a szűrő készletet. Sze $labels['setcreated'] = 'A szűrő készlet sikeresen létrejött.'; $labels['activateerror'] = 'Nem sikerült engedélyezni a kiválasztott szűrö(k)et. Szerver hiba történt.'; $labels['deactivateerror'] = 'Nem sikerült kikapcsolni a kiválasztott szűrő(ke)t. Szerver hiba történt.'; -$labels['activated'] = 'Szűrő(k) sikeresen kikapcsolva.'; -$labels['deactivated'] = 'Szűrő(k) sikeresen bekapcsolva.'; +$labels['deactivated'] = 'Szűrő(k) sikeresen kikapcsolva.'; +$labels['activated'] = 'Szűrő(k) sikeresen bekapcsolva.'; $labels['moved'] = 'A szűrő sikeresen áthelyezve.'; $labels['moveerror'] = 'Az áthelyezés nem sikerült. Szerver hiba történt.'; $labels['nametoolong'] = 'Túll hosszu név'; diff --git a/plugins/managesieve/localization/hy_AM.inc b/plugins/managesieve/localization/hy_AM.inc index ea4e982ea..be7d0fbd8 100644 --- a/plugins/managesieve/localization/hy_AM.inc +++ b/plugins/managesieve/localization/hy_AM.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Սերվերի սխալ։ Զտիչների համա $labels['setcreated'] = 'Զտիչների համալիրը ստեղծված է։'; $labels['activateerror'] = 'Սերվերի սխալ։ Նշված զտիչի միացման ձախողում։'; $labels['deactivateerror'] = 'Սերվերի սխալ։ Նշված զտիչի անջատման ձախողում։'; -$labels['activated'] = 'Զտիչի անջատված է։'; -$labels['deactivated'] = 'Զտիչի միացված է։'; +$labels['deactivated'] = 'Զտիչի անջատված է։'; +$labels['activated'] = 'Զտիչի միացված է։'; $labels['moved'] = 'Զտիչի տեղափոխված է։'; $labels['moveerror'] = 'Սերվերի սխալ։ Նշված զտիչի տեղափոխման ձախողում։'; $labels['nametoolong'] = 'Անունը չափազանց երկար է։'; diff --git a/plugins/managesieve/localization/id_ID.inc b/plugins/managesieve/localization/id_ID.inc index 1fe121a32..b9fe47659 100644 --- a/plugins/managesieve/localization/id_ID.inc +++ b/plugins/managesieve/localization/id_ID.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Tidak bisa membuat kumpulan penyaringan. Terjadi ga $labels['setcreated'] = 'Kumpulan penyaringan berhasul dibuat.'; $labels['activateerror'] = 'Tidak bisa menghidupkan penyaringan terpilih. terjadi galat pada server.'; $labels['deactivateerror'] = 'Tidak bisa mematikan penyaringan terpilih. Terjadi galat pada server.'; -$labels['activated'] = 'Berhasil mematikan penyaringan.'; -$labels['deactivated'] = 'Berhasil menghidupkan penyaringan.'; +$labels['deactivated'] = 'Berhasil mematikan penyaringan.'; +$labels['activated'] = 'Berhasil menghidupkan penyaringan.'; $labels['moved'] = 'Berhasil memindahkan penyaringan.'; $labels['moveerror'] = 'Tidak bisa memindahkan penyaringan terpilih. Terjadi galat pada server.'; $labels['nametoolong'] = 'Kepanjangan nama.'; diff --git a/plugins/managesieve/localization/it_IT.inc b/plugins/managesieve/localization/it_IT.inc index 53e7d0998..553377ab9 100644 --- a/plugins/managesieve/localization/it_IT.inc +++ b/plugins/managesieve/localization/it_IT.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Impossibile creare il gruppo. Errore del server'; $labels['setcreated'] = 'Gruppo di filtri creato'; $labels['activateerror'] = 'impossibile selezionare il filtro (server error)'; $labels['deactivateerror'] = 'impossibile disabilitare il filtro (server error)'; -$labels['activated'] = 'filtro disabilitato'; -$labels['deactivated'] = 'filtro abilitato'; +$labels['deactivated'] = 'filtro disabilitato'; +$labels['activated'] = 'filtro abilitato'; $labels['moved'] = 'filtro spostato'; $labels['moveerror'] = 'impossibile spostare il filtro (server error)'; $labels['nametoolong'] = 'Impossibile creare il gruppo: Nome troppo lungo'; diff --git a/plugins/managesieve/localization/ja_JP.inc b/plugins/managesieve/localization/ja_JP.inc index f7b96b7d1..5bb75f882 100644 --- a/plugins/managesieve/localization/ja_JP.inc +++ b/plugins/managesieve/localization/ja_JP.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'フィルターセットを作成できませんで $labels['setcreated'] = 'フィルターセットを作成しました。'; $labels['activateerror'] = '選択したフィルターを有効にできませんでした。サーバーでエラーが発生しました。'; $labels['deactivateerror'] = '選択したフィルターを無効にできませんでした。サーバーでエラーが発生しました。'; -$labels['activated'] = 'フィルターを無効にしました。'; -$labels['deactivated'] = 'フィルターを有効にしました。'; +$labels['deactivated'] = 'フィルターを無効にしました。'; +$labels['activated'] = 'フィルターを有効にしました。'; $labels['moved'] = 'フィルターを移動しました。'; $labels['moveerror'] = '選択したフィルターを移動できませんでした。サーバーでエラーが発生しました。'; $labels['nametoolong'] = '名前が長すぎます。'; diff --git a/plugins/managesieve/localization/ko_KR.inc b/plugins/managesieve/localization/ko_KR.inc index c3fff4115..8a20a17e4 100644 --- a/plugins/managesieve/localization/ko_KR.inc +++ b/plugins/managesieve/localization/ko_KR.inc @@ -120,8 +120,8 @@ $labels['setcreateerror'] = '필터 묶음을 생성할 수 없음. 서버 에 $labels['setcreated'] = '필터 묶음을 성공적으로 생성 함.'; $labels['activateerror'] = '선택한 필터(들)을 동작하게 할 수 없음. 서버 에러 발생 함.'; $labels['deactivateerror'] = '선택한 필터(들)을 동작하지 않게 할 수 없음. 서버 에러 발생 함.'; -$labels['activated'] = '필터(들)을 동작하지 않게 하는데 성공하였음.'; -$labels['deactivated'] = '필터(들)을 동작하게 하는데 성공하였음.'; +$labels['deactivated'] = '필터(들)을 동작하지 않게 하는데 성공하였음.'; +$labels['activated'] = '필터(들)을 동작하게 하는데 성공하였음.'; $labels['moved'] = '필터를 이동하는 데 성공하였음.'; $labels['moveerror'] = '선택한 필터를 이동할 수 없음. 서버 에러 발생 함.'; $labels['nametoolong'] = '이름이 너무 김.'; diff --git a/plugins/managesieve/localization/ml_IN.inc b/plugins/managesieve/localization/ml_IN.inc index ed3d7675c..012278ec8 100644 --- a/plugins/managesieve/localization/ml_IN.inc +++ b/plugins/managesieve/localization/ml_IN.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'അരിപ്പയുടെ കൂട്ടത $labels['setcreated'] = 'അരിപ്പകളുടെ കൂട്ടത്തെ വിജയകരമായി നിര്മ്മിച്ചു.'; $labels['activateerror'] = 'അരിപ്പ (കള്) പ്രവര്ത്തനസജ്ജം ആക്കാന് സാധിച്ചില്ല. സേവകനില് കുഴപ്പം!'; $labels['deactivateerror'] = 'അരിപ്പ (കള്) നിര്വീര്യം ആക്കാന് സാധിച്ചില്ല. സേവകനില് കുഴപ്പം!'; -$labels['activated'] = 'അരിപ്പകള് നിര്വീര്യം ആക്കപ്പെട്ടിരിക്കുന്നു'; -$labels['deactivated'] = 'അരിപ്പ വിജകരമായി പ്രവര്ത്തനസജ്ജമാക്കി.'; +$labels['deactivated'] = 'അരിപ്പകള് നിര്വീര്യം ആക്കപ്പെട്ടിരിക്കുന്നു'; +$labels['activated'] = 'അരിപ്പ വിജകരമായി പ്രവര്ത്തനസജ്ജമാക്കി.'; $labels['moved'] = 'അരിപ്പ വിജകരമായി മാറ്റി.'; $labels['moveerror'] = 'തെരഞ്ഞെടുത്ത അരിപ്പ മാറ്റാന് സാധിച്ചില്ല. സേവകനില് കുഴപ്പം.'; $labels['nametoolong'] = 'പേരിന് നീളം കൂടുതല്.'; diff --git a/plugins/managesieve/localization/nb_NO.inc b/plugins/managesieve/localization/nb_NO.inc index b172685a2..ee6d578b7 100644 --- a/plugins/managesieve/localization/nb_NO.inc +++ b/plugins/managesieve/localization/nb_NO.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Kunne ikke opprette filtersettet. Det oppsto en tje $labels['setcreated'] = 'Filtersett opprettet.'; $labels['activateerror'] = 'Kunne ikke skru på valgte filter. Det oppsto en tjenerfeil.'; $labels['deactivateerror'] = 'Kunne ikke skru av valgte filter. Det oppsto en tjenerfeil.'; -$labels['activated'] = 'Filter skrudd av.'; -$labels['deactivated'] = 'Filter ble skrudd på.'; +$labels['deactivated'] = 'Filter skrudd av.'; +$labels['activated'] = 'Filter ble skrudd på.'; $labels['moved'] = 'Filter ble flyttet.'; $labels['moveerror'] = 'Kunne ikke flytte valgte filter. Det oppsto en tjenerfeil.'; $labels['nametoolong'] = 'Navnet er for langt.'; diff --git a/plugins/managesieve/localization/nl_NL.inc b/plugins/managesieve/localization/nl_NL.inc index 8ee5e2bbf..56b1c95ee 100644 --- a/plugins/managesieve/localization/nl_NL.inc +++ b/plugins/managesieve/localization/nl_NL.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Filterverzameling kon niet aangemaakt worden. Er tr $labels['setcreated'] = 'Filterverzameling succesvol aangemaakt.'; $labels['activateerror'] = 'Geselecteerde filter(s) konden niet ingeschakeld worden. Er trad een serverfout op.'; $labels['deactivateerror'] = 'Geselecteerde filter(s) konden niet uitgeschakeld worden. Er trad een serverfout op.'; -$labels['activated'] = 'Filter(s) succesvol uitgeschakeld.'; -$labels['deactivated'] = 'Filter(s) succesvol ingeschakeld.'; +$labels['deactivated'] = 'Filter(s) succesvol uitgeschakeld.'; +$labels['activated'] = 'Filter(s) succesvol ingeschakeld.'; $labels['moved'] = 'Filter succesvol verplaatst.'; $labels['moveerror'] = 'Geselecteerde filter(s) konden niet verplaatst worden. Er trad een serverfout op.'; $labels['nametoolong'] = 'Naam is te lang.'; diff --git a/plugins/managesieve/localization/pl_PL.inc b/plugins/managesieve/localization/pl_PL.inc index 734a4ebcf..e078f4944 100644 --- a/plugins/managesieve/localization/pl_PL.inc +++ b/plugins/managesieve/localization/pl_PL.inc @@ -158,8 +158,8 @@ $labels['setcreateerror'] = 'Nie można utworzyć zbioru filtrów. Błąd serwer $labels['setcreated'] = 'Zbiór filtrów został utworzony pomyślnie.'; $labels['activateerror'] = 'Nie można włączyć wybranych filtrów. Błąd serwera.'; $labels['deactivateerror'] = 'Nie można wyłączyć wybranych filtrów. Błąd serwera.'; -$labels['activated'] = 'Filtr(y) wyłączono pomyślnie.'; -$labels['deactivated'] = 'Filtr(y) włączono pomyślnie.'; +$labels['deactivated'] = 'Filtr(y) wyłączono pomyślnie.'; +$labels['activated'] = 'Filtr(y) włączono pomyślnie.'; $labels['moved'] = 'Filter został przeniesiony pomyślnie.'; $labels['moveerror'] = 'Nie można przenieść wybranego filtra. Błąd serwera.'; $labels['nametoolong'] = 'Zbyt długa nazwa.'; diff --git a/plugins/managesieve/localization/pt_BR.inc b/plugins/managesieve/localization/pt_BR.inc index f0e890d86..f4b64584a 100644 --- a/plugins/managesieve/localization/pt_BR.inc +++ b/plugins/managesieve/localization/pt_BR.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Não foi possível criar o conjunto de filtros. Oco $labels['setcreated'] = 'Conjunto de filtros criado com sucesso.'; $labels['activateerror'] = 'Não foi possível habilitar o(s) filtro(s) selecionado(s). Ocorreu um erro no servidor.'; $labels['deactivateerror'] = 'Não foi possível desabilitar o(s) filtro(s) selecionado(s). Ocorreu um erro no servidor.'; -$labels['activated'] = 'Filtro(s) desabilitado(s) com sucesso.'; -$labels['deactivated'] = 'Filtro(s) habilitado(s) com sucesso.'; +$labels['deactivated'] = 'Filtro(s) desabilitado(s) com sucesso.'; +$labels['activated'] = 'Filtro(s) habilitado(s) com sucesso.'; $labels['moved'] = 'Filtro movido com sucesso.'; $labels['moveerror'] = 'Não foi possível mover o filtro selecionado. Ocorreu um erro no servidor.'; $labels['nametoolong'] = 'Nome muito longo.'; diff --git a/plugins/managesieve/localization/pt_PT.inc b/plugins/managesieve/localization/pt_PT.inc index bb0c781a1..8a0a1da3e 100644 --- a/plugins/managesieve/localization/pt_PT.inc +++ b/plugins/managesieve/localization/pt_PT.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Não foi possível criar o conjunto de filtros. Oco $labels['setcreated'] = 'Conjunto de filtros criado com sucesso.'; $labels['activateerror'] = 'Não foi possível ativar os filtros selecionados. Ocorreu um erro no servidor.'; $labels['deactivateerror'] = 'Não foi possível desativar os filtros selecionados. Ocorreu um erro no servidor.'; -$labels['activated'] = 'Filtro(s) desativado(s) com sucesso.'; -$labels['deactivated'] = 'Filtro(s) ativado(s) com sucesso.'; +$labels['deactivated'] = 'Filtro(s) desativado(s) com sucesso.'; +$labels['activated'] = 'Filtro(s) ativado(s) com sucesso.'; $labels['moved'] = 'Filtro movido com sucesso.'; $labels['moveerror'] = 'Não foi possível mover o filtro selecionado. Ocorreu um erro no servidor.'; $labels['nametoolong'] = 'Nome demasiado longo.'; diff --git a/plugins/managesieve/localization/ro_RO.inc b/plugins/managesieve/localization/ro_RO.inc index 755ee03f0..888985233 100644 --- a/plugins/managesieve/localization/ro_RO.inc +++ b/plugins/managesieve/localization/ro_RO.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Nu am putut crea setul de filtre. S-a produs o eroa $labels['setcreated'] = 'Setul de filtre creat cu succes.'; $labels['activateerror'] = 'Nu am putut activa filtrele selectate. S-a produs o eroare la server.'; $labels['deactivateerror'] = 'Nu am putut dezactiva filtrele selectate. S-a produs o eroare la server.'; -$labels['activated'] = 'Filtrele au fost dezactivate cu succes.'; -$labels['deactivated'] = 'Filtrele au fost activate cu succes.'; +$labels['deactivated'] = 'Filtrele au fost dezactivate cu succes.'; +$labels['activated'] = 'Filtrele au fost activate cu succes.'; $labels['moved'] = 'Filtrele au fost mutate cu succes.'; $labels['moveerror'] = 'Nu am putut muta filtreele selectate. S-a produs o eroare la server.'; $labels['nametoolong'] = 'Numele este prea lung.'; diff --git a/plugins/managesieve/localization/ru_RU.inc b/plugins/managesieve/localization/ru_RU.inc index cfc2ac1e4..0689bd884 100644 --- a/plugins/managesieve/localization/ru_RU.inc +++ b/plugins/managesieve/localization/ru_RU.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Невозможно создать набор фи $labels['setcreated'] = 'Набор фильтров успешно создан.'; $labels['activateerror'] = 'Невозможно включить выбранный(е) фильтр(ы). Ошибка сервера.'; $labels['deactivateerror'] = 'Невозможно выключить выбранный(е) фильтр(ы). Ошибка сервера.'; -$labels['activated'] = 'Фильтр(ы) успешно отключен(ы).'; -$labels['deactivated'] = 'Фильтр(ы) успешно включен(ы).'; +$labels['deactivated'] = 'Фильтр(ы) успешно отключен(ы).'; +$labels['activated'] = 'Фильтр(ы) успешно включен(ы).'; $labels['moved'] = 'Фильтр успешно перемещён.'; $labels['moveerror'] = 'Невозможно переместить фильтр. Ошибка сервера.'; $labels['nametoolong'] = 'Невозможно создать набор фильтров. Название слишком длинное.'; diff --git a/plugins/managesieve/localization/sk_SK.inc b/plugins/managesieve/localization/sk_SK.inc index 7d78c7fd2..337dfa690 100644 --- a/plugins/managesieve/localization/sk_SK.inc +++ b/plugins/managesieve/localization/sk_SK.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Nepodarilo sa vytvoriť sadu filtrov, server ohlás $labels['setcreated'] = 'Sada filtrov bola vytvorená'; $labels['activateerror'] = 'Nepodarilo sa povoliť vybraný filter(e). Chyba servera.'; $labels['deactivateerror'] = 'Nepodarilo sa vypnúť vybraný filter(e). Chyba servera.'; -$labels['activated'] = 'Filter(e) úspešne vypnutý.'; -$labels['deactivated'] = 'Filter(e) povolený.'; +$labels['deactivated'] = 'Filter(e) úspešne vypnutý.'; +$labels['activated'] = 'Filter(e) povolený.'; $labels['moved'] = 'Filter presunutý.'; $labels['moveerror'] = 'Nemôžem presunúť zvolený filter. Chyba servera.'; $labels['nametoolong'] = 'Názov sady filtrov je príliš dlhý'; diff --git a/plugins/managesieve/localization/sl_SI.inc b/plugins/managesieve/localization/sl_SI.inc index a0b61e70e..f29522568 100644 --- a/plugins/managesieve/localization/sl_SI.inc +++ b/plugins/managesieve/localization/sl_SI.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Filtra ni bilo mogoče ustvariti. Prišlo je do nap $labels['setcreated'] = 'Filter je bil uspešno ustvarjen.'; $labels['activateerror'] = 'Izbranega/ih filtra/ov ni bilo mogoče vključiti. Prišlo je do napake na strežniku.'; $labels['deactivateerror'] = 'Izbranega/ih fitra/ov ni bilo mogoče izključiti. Prišlo je do napake na strežniku.'; -$labels['activated'] = 'Filtri so bili uspešno onemogočeni.'; -$labels['deactivated'] = 'Filtri so bili uspešno omogočeni.'; +$labels['deactivated'] = 'Filtri so bili uspešno onemogočeni.'; +$labels['activated'] = 'Filtri so bili uspešno omogočeni.'; $labels['moved'] = 'Filter je bil uspešno premaknjen.'; $labels['moveerror'] = 'Izbranega filtra ni bilo mogoče premakniti. Prišlo je do napake na strežniku.'; $labels['nametoolong'] = 'Ime je predolgo.'; diff --git a/plugins/managesieve/localization/sv_SE.inc b/plugins/managesieve/localization/sv_SE.inc index 0dc8ce8fe..d7c1c76a1 100644 --- a/plugins/managesieve/localization/sv_SE.inc +++ b/plugins/managesieve/localization/sv_SE.inc @@ -139,8 +139,8 @@ $labels['setcreateerror'] = 'Filtergruppen kunde inte läggas till på grund av $labels['setcreated'] = 'Filtergruppen har lagts till'; $labels['activateerror'] = 'Kunde inte aktivera filter på grund av serverfel.'; $labels['deactivateerror'] = 'Kunde inte deaktivera filter på grund av serverfel.'; -$labels['activated'] = 'Filter deaktiverat.'; -$labels['deactivated'] = 'Filter aktiverat.'; +$labels['deactivated'] = 'Filter deaktiverat.'; +$labels['activated'] = 'Filter aktiverat.'; $labels['moved'] = 'Filter flyttat.'; $labels['moveerror'] = 'Kunde inte flytta filter på grund av serverfel.'; $labels['nametoolong'] = 'Filtergruppen kan inte läggas till med för långt namn'; diff --git a/plugins/managesieve/localization/tr_TR.inc b/plugins/managesieve/localization/tr_TR.inc index 14dd44b19..9c3eb7e60 100644 --- a/plugins/managesieve/localization/tr_TR.inc +++ b/plugins/managesieve/localization/tr_TR.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Filtre setleri oluşturulamadı. Sunucuda hata olu $labels['setcreated'] = 'Filtre setleri başarıyla oluşturuldu.'; $labels['activateerror'] = 'Seçilen filtre(ler) etkinleştirilemedi. Sunucuda hata oluştu.'; $labels['deactivateerror'] = 'Seçilen filtre(ler) pasifleştirilemedi. Sunucuda hata oluştu.'; -$labels['activated'] = 'Filtre(ler) başarıyla iptal edildi.'; -$labels['deactivated'] = 'Filtre(ler) başarıyla etkinleştirildi.'; +$labels['deactivated'] = 'Filtre(ler) başarıyla iptal edildi.'; +$labels['activated'] = 'Filtre(ler) başarıyla etkinleştirildi.'; $labels['moved'] = 'Filtre başarıyla taşındı.'; $labels['moveerror'] = 'Seçilen filtre(ler) taşınamadı. Sunucuda hata oluştu.'; $labels['nametoolong'] = 'İsim çok uzun.'; diff --git a/plugins/managesieve/localization/vi_VN.inc b/plugins/managesieve/localization/vi_VN.inc index d358960ad..14e098dce 100644 --- a/plugins/managesieve/localization/vi_VN.inc +++ b/plugins/managesieve/localization/vi_VN.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = 'Không thể tạo thiết lập bộ lọc. Có l $labels['setcreated'] = 'Thiết lập bộ lọc được tạo thành công'; $labels['activateerror'] = 'Không thể khởi động bộ lọc được chọn. Có lỗi xuất hiện ở máy chủ'; $labels['deactivateerror'] = 'Không thể tắt bộ lọc đã chọn. Có lỗi xuất hiện ở máy chủ'; -$labels['activated'] = 'Bộ lọc được tắt thành công'; -$labels['deactivated'] = 'Bộ lọc được khởi động thành công'; +$labels['deactivated'] = 'Bộ lọc được tắt thành công'; +$labels['activated'] = 'Bộ lọc được khởi động thành công'; $labels['moved'] = 'Bộ lọc được chuyển đi thành công'; $labels['moveerror'] = 'Không thể chuyển bộc lọc đã chọn. Có lỗi xuất hiện ở máy chủ'; $labels['nametoolong'] = 'Tên quá dài'; diff --git a/plugins/managesieve/localization/zh_CN.inc b/plugins/managesieve/localization/zh_CN.inc index 8cbe48778..e44fe07a8 100644 --- a/plugins/managesieve/localization/zh_CN.inc +++ b/plugins/managesieve/localization/zh_CN.inc @@ -138,8 +138,8 @@ $labels['setcreateerror'] = '无法创建过滤器,服务器错误。'; $labels['setcreated'] = '过滤器成功创建。'; $labels['activateerror'] = '无法启用选中的过滤器,因为服务器发生错误。'; $labels['deactivateerror'] = '无法禁用选中的过滤器,因为服务器发生错误。'; -$labels['activated'] = '禁用过滤器成功。'; -$labels['deactivated'] = '启用过滤器成功。'; +$labels['deactivated'] = '禁用过滤器成功。'; +$labels['activated'] = '启用过滤器成功。'; $labels['moved'] = '过滤器移动成功。'; $labels['moveerror'] = '无法移动选中的过滤器,因为服务器发生错误。'; $labels['nametoolong'] = '名称太长。'; diff --git a/plugins/managesieve/localization/zh_TW.inc b/plugins/managesieve/localization/zh_TW.inc index db2292b9a..4899d162b 100644 --- a/plugins/managesieve/localization/zh_TW.inc +++ b/plugins/managesieve/localization/zh_TW.inc @@ -126,8 +126,8 @@ $labels['setcreateerror'] = '無法建立篩選器集合。 伺服器發生錯 $labels['setcreated'] = '篩選器集合成功建立'; $labels['activateerror'] = '無法啟用選擇的篩選器。伺服器錯誤'; $labels['deactivateerror'] = '無法停用選擇的篩選器。伺服器錯誤'; -$labels['activated'] = '篩選器已停用'; -$labels['deactivated'] = '篩選器已啟用'; +$labels['deactivated'] = '篩選器已停用'; +$labels['activated'] = '篩選器已啟用'; $labels['moved'] = '篩選器已移動'; $labels['moveerror'] = '無法移動選擇的篩選器。伺服器錯誤'; $labels['nametoolong'] = '無法建立篩選器集合。 名稱太長'; diff --git a/program/include/html.php b/program/include/html.php index 234985241..880873ddc 100644 --- a/program/include/html.php +++ b/program/include/html.php @@ -334,7 +334,7 @@ class html */ public static function quote($str) { - return htmlspecialchars($str, ENT_COMPAT, RCMAIL_CHARSET); + return @htmlspecialchars($str, ENT_COMPAT, RCMAIL_CHARSET); } } diff --git a/program/include/iniset.php b/program/include/iniset.php index a2f43b380..82278c9f8 100644 --- a/program/include/iniset.php +++ b/program/include/iniset.php @@ -34,7 +34,9 @@ $config = array( ); foreach ($config as $optname => $optval) { if ($optval != ini_get($optname) && @ini_set($optname, $optval) === false) { - die("ERROR: Wrong '$optname' option value. Read REQUIREMENTS section in INSTALL file or use Roundcube Installer, please!"); + die("ERROR: Wrong '$optname' option value and it wasn't possible to set it to required value ($optval).\n" + ."Check your PHP configuration (including php_admin_flag).\n" + ."Read REQUIREMENTS section in INSTALL file or use Roundcube Installer!"); } } diff --git a/program/include/rcmail.php b/program/include/rcmail.php index ec3d537ec..c2f76b388 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -258,8 +258,8 @@ class rcmail extends rcube $autocomplete = (array) $this->config->get('autocomplete_addressbooks'); $list = array(); - // We are using the DB address book - if ($abook_type != 'ldap') { + // We are using the DB address book or a plugin address book + if ($abook_type != 'ldap' && $abook_type != '') { if (!isset($this->address_books['0'])) $this->address_books['0'] = new rcube_contacts($this->db, $this->get_user_id()); $list['0'] = array( @@ -452,6 +452,10 @@ class rcmail extends rcube $username .= '@'.rcube_utils::parse_host($config['username_domain'], $host); } + if (!isset($config['login_lc'])) { + $config['login_lc'] = 2; // default + } + // Convert username to lowercase. If storage backend // is case-insensitive we need to store always the same username (#1487113) if ($config['login_lc']) { @@ -483,21 +487,7 @@ class rcmail extends rcube $storage = $this->get_storage(); // try to log in - if (!($login = $storage->connect($host, $username, $pass, $port, $ssl))) { - // try with lowercase - $username_lc = mb_strtolower($username); - if ($username_lc != $username) { - // try to find user record again -> overwrite username - if (!$user && ($user = rcube_user::query($username_lc, $host))) - $username_lc = $user->data['username']; - - if ($login = $storage->connect($host, $username_lc, $pass, $port, $ssl)) - $username = $username_lc; - } - } - - // exit if login failed - if (!$login) { + if (!$storage->connect($host, $username, $pass, $port, $ssl)) { return false; } @@ -2112,8 +2102,7 @@ class rcmail extends rcube if (!$storage->connect($host, $user, $pass, $port, $ssl)) { if (is_object($this->output)) { - $error = $storage->get_error_code() == -1 ? 'storageerror' : 'sessionerror'; - $this->output->show_message($error, 'error'); + $this->output->show_message('storageerror', 'error'); } } else { diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php index 1e6cf360b..a89fd164d 100644 --- a/program/include/rcube_imap.php +++ b/program/include/rcube_imap.php @@ -4119,6 +4119,11 @@ class rcube_imap extends rcube_storage return $this->delete_folder($folder); } + function clear_mailbox($folder = null) + { + return $this->clear_folder($folder); + } + public function mailbox_exists($folder, $subscription=false) { return $this->folder_exists($folder, $subscription); diff --git a/program/include/rcube_message.php b/program/include/rcube_message.php index c189df57d..38d18171c 100644 --- a/program/include/rcube_message.php +++ b/program/include/rcube_message.php @@ -372,9 +372,10 @@ class rcube_message foreach ($structure->parts as $p => $sub_part) { $sub_mimetype = $sub_part->mimetype; - // skip empty parts - if (!$sub_part->size) + // skip empty text parts + if (!$sub_part->size && preg_match('#^text/(plain|html|enriched)$#', $sub_mimetype)) { continue; + } // check if sub part is if ($sub_mimetype == 'text/plain') diff --git a/program/include/rcube_output.php b/program/include/rcube_output.php index 9aa7c9eba..5c582e67c 100644 --- a/program/include/rcube_output.php +++ b/program/include/rcube_output.php @@ -44,7 +44,7 @@ abstract class rcube_output */ public function __construct($task = null, $framed = false) { - $this->app = rcmail::get_instance(); + $this->app = rcube::get_instance(); $this->config = $this->app->config; $this->browser = new rcube_browser(); } diff --git a/program/include/rcube_output_html.php b/program/include/rcube_output_html.php index 616ab3883..d42171869 100644 --- a/program/include/rcube_output_html.php +++ b/program/include/rcube_output_html.php @@ -33,7 +33,7 @@ class rcube_output_html extends rcube_output protected $js_env = array(); protected $js_labels = array(); protected $js_commands = array(); - protected $plugin_skin_path; + protected $skin_paths = array(); protected $template_name; protected $scripts_path = ''; protected $script_files = array(); @@ -164,9 +164,27 @@ class rcube_output_html extends rcube_output $this->config->set('skin_path', $skin_path); + // register skin path(s) + $this->skin_paths = array(); + $this->load_skin($skin_path); + return $valid; } + /** + * Helper method to recursively read skin meta files and register search paths + */ + private function load_skin($skin_path) + { + $this->skin_paths[] = $skin_path; + + // read meta file and check for dependecies + $meta = @json_decode(@file_get_contents($skin_path.'/meta.json'), true); + if ($meta['extends'] && is_dir('skins/' . $meta['extends'])) { + $this->load_skin('skins/' . $meta['extends']); + } + } + /** * Check if a specific template exists @@ -176,8 +194,14 @@ class rcube_output_html extends rcube_output */ public function template_exists($name) { - $filename = $this->config->get('skin_path') . '/templates/' . $name . '.html'; - return (is_file($filename) && is_readable($filename)) || ($this->deprecated_templates[$name] && $this->template_exists($this->deprecated_templates[$name])); + $found = false; + foreach ($this->skin_paths as $skin_path) { + $filename = $skin_path . '/templates/' . $name . '.html'; + $found = (is_file($filename) && is_readable($filename)) || ($this->deprecated_templates[$name] && $this->template_exists($this->deprecated_templates[$name])); + if ($found) + break; + } + return $found; } @@ -364,41 +388,60 @@ class rcube_output_html extends rcube_output */ function parse($name = 'main', $exit = true, $write = true) { - $skin_path = $this->config->get('skin_path'); $plugin = false; $realname = $name; - $temp = explode('.', $name, 2); - - $this->plugin_skin_path = null; - $this->template_name = $realname; + $this->template_name = $realname; + $temp = explode('.', $name, 2); if (count($temp) > 1) { $plugin = $temp[0]; $name = $temp[1]; $skin_dir = $plugin . '/skins/' . $this->config->get('skin'); - $skin_path = $this->plugin_skin_path = $this->app->plugins->dir . $skin_dir; - // fallback to default skin - if (!is_dir($skin_path)) { + // apply skin search escalation list to plugin directory + $plugin_skin_paths = array(); + foreach ($this->skin_paths as $skin_path) { + $plugin_skin_paths[] = $this->app->plugins->dir . $plugin . '/' . $skin_path; + } + + // add fallback to default skin + if (is_dir($this->app->plugins->dir . $plugin . '/skins/default')) { $skin_dir = $plugin . '/skins/default'; - $skin_path = $this->plugin_skin_path = $this->app->plugins->dir . $skin_dir; + $plugin_skin_paths[] = $this->app->plugins->dir . $skin_dir; } + + // add plugin skin paths to search list + $this->skin_paths = array_merge($plugin_skin_paths, $this->skin_paths); } - $path = "$skin_path/templates/$name.html"; + // find skin template + $path = false; + foreach ($this->skin_paths as $skin_path) { + $path = "$skin_path/templates/$name.html"; - if (!is_readable($path) && $this->deprecated_templates[$realname]) { - $path = "$skin_path/templates/".$this->deprecated_templates[$realname].".html"; - if (is_readable($path)) - rcube::raise_error(array('code' => 502, 'type' => 'php', + // fallback to deprecated template names + if (!is_readable($path) && $this->deprecated_templates[$realname]) { + $path = "$skin_path/templates/" . $this->deprecated_templates[$realname] . ".html"; + rcube::raise_error(array( + 'code' => 502, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, - 'message' => "Using deprecated template '".$this->deprecated_templates[$realname] - ."' in $skin_path/templates. Please rename to '".$realname."'"), - true, false); + 'message' => "Using deprecated template '" . $this->deprecated_templates[$realname] + . "' in $skin_path/templates. Please rename to '$realname'"), + true, false); + } + + if (is_readable($path)) { + $this->config->set('skin_path', $skin_path); + $this->base_path = $skin_path; + break; + } + else { + $path = false; + } } // read template file - if (($templ = @file_get_contents($path)) === false) { + if (!$path || ($templ = @file_get_contents($path)) === false) { rcube::raise_error(array( 'code' => 501, 'type' => 'php', @@ -426,7 +469,7 @@ class rcube_output_html extends rcube_output $output = $hook['content']; unset($hook['content']); - $output = $this->parse_with_globals($output); + $output = $this->parse_with_globals($this->fix_paths($output)); // make sure all <form> tags have a valid request token $output = preg_replace_callback('/<form\s+([^>]+)>/Ui', array($this, 'alter_form_tag'), $output); @@ -498,7 +541,7 @@ class rcube_output_html extends rcube_output public function abs_url($str) { if ($str[0] == '/') - return $this->config->get('skin_path') . $str; + return $this->base_path . $str; else return $str; } @@ -532,7 +575,7 @@ class rcube_output_html extends rcube_output { $GLOBALS['__version'] = html::quote(RCMAIL_VERSION); $GLOBALS['__comm_path'] = html::quote($this->app->comm_path); - $GLOBALS['__skin_path'] = html::quote($this->config->get('skin_path')); + $GLOBALS['__skin_path'] = html::quote($this->base_path); return preg_replace_callback('/\$(__[a-z0-9_\-]+)/', array($this, 'globals_callback'), $input); @@ -549,6 +592,43 @@ class rcube_output_html extends rcube_output /** + * Correct absolute paths in images and other tags + * add timestamp to .js and .css filename + */ + protected function fix_paths($output) + { + return preg_replace_callback( + '!(src|href|background)=(["\']?)([a-z0-9/_.-]+)(["\'\s>])!i', + array($this, 'file_callback'), $output); + } + + + /** + * Callback function for preg_replace_callback in write() + * + * @return string Parsed string + */ + protected function file_callback($matches) + { + $file = $matches[3]; + + // correct absolute paths + if ($file[0] == '/') { + $file = $this->base_path . $file; + } + + // add file modification timestamp + if (preg_match('/\.(js|css)$/', $file)) { + if ($fs = @filemtime($file)) { + $file .= '?s=' . $fs; + } + } + + return $matches[1] . '=' . $matches[2] . $file . $matches[4]; + } + + + /** * Public wrapper to dipp into template parsing. * * @param string $input @@ -710,6 +790,9 @@ class rcube_output_html extends rcube_output // show a label case 'label': + if ($attrib['expression']) + $attrib['name'] = eval("return " . $this->parse_expression($attrib['expression']) .";"); + if ($attrib['name'] || $attrib['command']) { // @FIXME: 'noshow' is useless, remove? if ($attrib['noshow']) { @@ -741,8 +824,17 @@ class rcube_output_html extends rcube_output // include a file case 'include': - if (!$this->plugin_skin_path || !is_file($path = realpath($this->plugin_skin_path . $attrib['file']))) - $path = realpath(($attrib['skin_path'] ? $attrib['skin_path'] : $this->config->get('skin_path')).$attrib['file']); + $old_base_path = $this->base_path; + $skin_paths = $this->skin_paths; + if ($attrib['skin_path']) + array_unshift($skin_paths, $attrib['skin_path']); + foreach ($skin_paths as $skin_path) { + $path = realpath($skin_path . $attrib['file']); + if (is_file($path)) { + $this->base_path = $skin_path; + break; + } + } if (is_readable($path)) { if ($this->config->get('skin_include_php')) { @@ -752,14 +844,16 @@ class rcube_output_html extends rcube_output $incl = file_get_contents($path); } $incl = $this->parse_conditions($incl); - return $this->parse_xml($incl); + $incl = $this->parse_xml($incl); + $incl = $this->fix_paths($incl); + $this->base_path = $old_base_path; + return $incl; } break; case 'plugin.include': $hook = $this->app->plugins->exec_hook("template_plugin_include", $attrib); return $hook['content']; - break; // define a container block case 'container': @@ -1239,14 +1333,6 @@ class rcube_output_html extends rcube_output $output = substr_replace($output, $css, $pos, 0); } - $this->base_path = $base_path; - - // correct absolute paths in images and other tags - // add timestamp to .js and .css filename - $output = preg_replace_callback( - '!(src|href|background)=(["\']?)([a-z0-9/_.-]+)(["\'\s>])!i', - array($this, 'file_callback'), $output); - // trigger hook with final HTML content to be sent $hook = $this->app->plugins->exec_hook("send_page", array('content' => $output)); if (!$hook['abort']) { @@ -1261,31 +1347,6 @@ class rcube_output_html extends rcube_output /** - * Callback function for preg_replace_callback in write() - * - * @return string Parsed string - */ - protected function file_callback($matches) - { - $file = $matches[3]; - - // correct absolute paths - if ($file[0] == '/') { - $file = $this->base_path . $file; - } - - // add file modification timestamp - if (preg_match('/\.(js|css)$/', $file)) { - if ($fs = @filemtime($file)) { - $file .= '?s=' . $fs; - } - } - - return $matches[1] . '=' . $matches[2] . $file . $matches[4]; - } - - - /** * Returns iframe object, registers some related env variables * * @param array $attrib HTML attributes diff --git a/program/include/rcube_plugin.php b/program/include/rcube_plugin.php index c1035733b..45088850a 100644 --- a/program/include/rcube_plugin.php +++ b/program/include/rcube_plugin.php @@ -202,7 +202,7 @@ abstract class rcube_plugin foreach ($texts as $key => $value) $add[$domain.'.'.$key] = $value; - $rcmail = rcmail::get_instance(); + $rcmail = rcube::get_instance(); $rcmail->load_language($lang, $add); // add labels to client diff --git a/program/include/rcube_plugin_api.php b/program/include/rcube_plugin_api.php index 9ef68cab9..107c81026 100644 --- a/program/include/rcube_plugin_api.php +++ b/program/include/rcube_plugin_api.php @@ -31,7 +31,7 @@ if (!defined('RCMAIL_PLUGINS_DIR')) */ class rcube_plugin_api { - static private $instance; + static protected $instance; public $dir; public $url = 'plugins/'; @@ -39,16 +39,16 @@ class rcube_plugin_api public $output; public $handlers = array(); - private $plugins = array(); - private $tasks = array(); - private $actions = array(); - private $actionmap = array(); - private $objectsmap = array(); - private $template_contents = array(); - private $active_hook = false; + protected $plugins = array(); + protected $tasks = array(); + protected $actions = array(); + protected $actionmap = array(); + protected $objectsmap = array(); + protected $template_contents = array(); + protected $active_hook = false; // Deprecated names of hooks, will be removed after 0.5-stable release - private $deprecated_hooks = array( + protected $deprecated_hooks = array( 'create_user' => 'user_create', 'kill_session' => 'session_destroy', 'upload_attachment' => 'attachment_upload', @@ -98,7 +98,7 @@ class rcube_plugin_api /** * Private constructor */ - private function __construct() + protected function __construct() { $this->dir = slashify(RCMAIL_PLUGINS_DIR); } @@ -470,7 +470,7 @@ class rcube_plugin_api * @param array $attrib * @return array */ - private function template_container_hook($attrib) + protected function template_container_hook($attrib) { $container = $attrib['name']; return array('content' => $attrib['content'] . $this->template_contents[$container]); @@ -483,7 +483,7 @@ class rcube_plugin_api * @param string $fn Filename * @return string */ - private function resource_url($fn) + protected function resource_url($fn) { if ($fn[0] != '/' && !preg_match('|^https?://|i', $fn)) return $this->url . $fn; diff --git a/program/include/rcube_string_replacer.php b/program/include/rcube_string_replacer.php index c29f0e476..edb2ac34f 100644 --- a/program/include/rcube_string_replacer.php +++ b/program/include/rcube_string_replacer.php @@ -37,16 +37,16 @@ class rcube_string_replacer { // Simplified domain expression for UTF8 characters handling // Support unicode/punycode in top-level domain part - $utf_domain = '[^?&@"\'\\/()\s\r\t\n]+\\.([^\\x00-\\x2f\\x3b-\\x40\\x5b-\\x60\\x7b-\\x7f]{2,}|xn--[a-z0-9]{2,})'; + $utf_domain = '[^?&@"\'\\/()\s\r\t\n]+\\.?([^\\x00-\\x2f\\x3b-\\x40\\x5b-\\x60\\x7b-\\x7f]{2,}|xn--[a-zA-Z0-9]{2,})'; $url1 = '.:;,'; - $url2 = 'a-z0-9%=#@+?!&\\/_~\\[\\]{}-'; + $url2 = 'a-zA-Z0-9%=#$@+?!&\\/_~\\[\\]{}\*-'; - $this->link_pattern = "/([\w]+:\/\/|\Wwww\.)($utf_domain([$url1]?[$url2]+)*)/i"; + $this->link_pattern = "/([\w]+:\/\/|\W[Ww][Ww][Ww]\.|^[Ww][Ww][Ww]\.)($utf_domain([$url1]?[$url2]+)*)/"; $this->mailto_pattern = "/(" ."[-\w!\#\$%&\'*+~\/^`|{}=]+(?:\.[-\w!\#\$%&\'*+~\/^`|{}=]+)*" // local-part ."@$utf_domain" // domain-part ."(\?[$url1$url2]+)?" // e.g. ?subject=test... - .")/i"; + .")/"; } /** @@ -81,11 +81,11 @@ class rcube_string_replacer $i = -1; $scheme = strtolower($matches[1]); - if (preg_match('!^(http|ftp|file)s?://!', $scheme)) { + if (preg_match('!^(http|ftp|file)s?://!i', $scheme)) { $url = $matches[1] . $matches[2]; } - else if (preg_match('/^(\W)www\.$/', $matches[1], $m)) { - $url = 'www.' . $matches[2]; + else if (preg_match('/^(\W*)(www\.)$/i', $matches[1], $m)) { + $url = $m[2] . $matches[2]; $url_prefix = 'http://'; $prefix = $m[1]; } @@ -134,6 +134,22 @@ class rcube_string_replacer } /** + * Replace all defined (link|mailto) patterns with replacement string + * + * @param string $str Text + * + * @return string Text + */ + public function replace($str) + { + // search for patterns like links and e-mail addresses + $str = preg_replace_callback($this->link_pattern, array($this, 'link_callback'), $str); + $str = preg_replace_callback($this->mailto_pattern, array($this, 'mailto_callback'), $str); + + return $str; + } + + /** * Replace substituted strings with original values */ public function resolve($str) diff --git a/program/include/rcube_user.php b/program/include/rcube_user.php index 5a65a519d..b92187ad4 100644 --- a/program/include/rcube_user.php +++ b/program/include/rcube_user.php @@ -449,6 +449,7 @@ class rcube_user 'user_name' => $user_name, 'user_email' => $user_email, 'email_list' => $email_list, + 'language' => $_SESSION['language'], )); // plugin aborted this operation @@ -462,13 +463,17 @@ class rcube_user " VALUES (".$dbh->now().", ".$dbh->now().", ?, ?, ?)", strip_newlines($data['user']), strip_newlines($data['host']), - strip_newlines($data['language'] ? $data['language'] : $_SESSION['language'])); + strip_newlines($data['language'])); if ($user_id = $dbh->insert_id('users')) { // create rcube_user instance to make plugin hooks work - $user_instance = new rcube_user($user_id); - $rcube->user = $user_instance; - + $user_instance = new rcube_user($user_id, array( + 'user_id' => $user_id, + 'username' => $data['user'], + 'mail_host' => $data['host'], + 'language' => $data['language'], + )); + $rcube->user = $user_instance; $mail_domain = $rcube->config->mail_domain($data['host']); $user_name = $data['user_name']; $user_email = $data['user_email']; diff --git a/program/js/app.js b/program/js/app.js index b80422983..783936c56 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -615,12 +615,11 @@ function rcube_webmail() break; case 'sort': - var sort_order, sort_col = props; + var sort_order = this.env.sort_order, + sort_col = !this.env.disabled_sort_col ? props : this.env.sort_col; - if (this.env.sort_col==sort_col) - sort_order = this.env.sort_order=='ASC' ? 'DESC' : 'ASC'; - else - sort_order = 'ASC'; + if (!this.env.disabled_sort_order) + sort_order = this.env.sort_col == sort_col && sort_order == 'ASC' ? 'DESC' : 'ASC'; // set table header and update env this.set_list_sorting(sort_col, sort_order); @@ -5806,13 +5805,11 @@ function rcube_webmail() col = this.env.coltypes[n]; if ((cell = thead.rows[0].cells[n]) && (col == 'from' || col == 'to' || col == 'fromto')) { cell.id = 'rcm'+col; + $('span,a', cell).text(this.get_label(col == 'fromto' ? smart_col : col)); // if we have links for sorting, it's a bit more complicated... - if (cell.firstChild && cell.firstChild.tagName.toLowerCase()=='a') { - cell = cell.firstChild; - cell.onclick = function(){ return rcmail.command('sort', this.__col, this); }; - cell.__col = col; - } - cell.innerHTML = this.get_label(col == 'fromto' ? smart_col : col); + $('a', cell).click(function(){ + return rcmail.command('sort', this.id.replace(/^rcm/, ''), this); + }); } } } diff --git a/program/localization/en_GB/labels.inc b/program/localization/en_GB/labels.inc index cb9c25c97..4129fba63 100644 --- a/program/localization/en_GB/labels.inc +++ b/program/localization/en_GB/labels.inc @@ -95,7 +95,7 @@ $labels['longdec'] = 'December'; $labels['today'] = 'Today'; $labels['refresh'] = 'Refresh'; $labels['checkmail'] = 'Check for new messages'; -$labels['compose'] = 'Compose a message'; +$labels['compose'] = 'Compose'; $labels['writenewmessage'] = 'Create a new message'; $labels['reply'] = 'Reply'; $labels['replytomessage'] = 'Reply to sender'; diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index 24cd5e425..2d45105c2 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -1539,6 +1539,11 @@ function rcmail_check_sent_folder($folder, $create=false) { global $RCMAIL; + // we'll not save the message, so it doesn't matter + if ($RCMAIL->config->get('no_save_sent_messages')) { + return true; + } + if ($RCMAIL->storage->folder_exists($folder, true)) { return true; } diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index c18d2cd13..47d1a484a 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -374,6 +374,8 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE, $a_show_cols=null */ function rcmail_message_list_head($attrib, $a_show_cols) { + global $RCMAIL; + $skin_path = $_SESSION['skin_path']; $image_tag = html::img(array('src' => "%s%s", 'alt' => "%s")); @@ -381,8 +383,18 @@ function rcmail_message_list_head($attrib, $a_show_cols) $sort_col = $_SESSION['sort_col']; $sort_order = $_SESSION['sort_order']; + $dont_override = (array)$RCMAIL->config->get('dont_override'); + $disabled_sort = in_array('message_sort_col', $dont_override); + $disabled_order = in_array('message_sort_order', $dont_override); + + $RCMAIL->output->set_env('disabled_sort_col', $disabled_sort); + $RCMAIL->output->set_env('disabled_sort_order', $disabled_order); + // define sortable columns - $a_sort_cols = array('subject', 'date', 'from', 'to', 'fromto', 'size', 'cc'); + if ($disabled_sort) + $a_sort_cols = $sort_col && !$disabled_order ? array($sort_col) : array(); + else + $a_sort_cols = array('subject', 'date', 'from', 'to', 'fromto', 'size', 'cc'); if (!empty($attrib['optionsmenuicon'])) { $onclick = 'return ' . JS_OBJECT_NAME . ".command('menu-open', 'messagelistmenu')"; @@ -432,7 +444,7 @@ function rcmail_message_list_head($attrib, $a_show_cols) else if ($col_name[0] != '<') $col_name = '<span class="' . $col .'">' . $col_name . '</span>'; - $sort_class = $col == $sort_col ? " sorted$sort_order" : ''; + $sort_class = $col == $sort_col && !$disabled_order ? " sorted$sort_order" : ''; $class_name = $col.$sort_class; // put it all together @@ -779,9 +791,8 @@ function rcmail_plain_body($body, $flowed=false) // make links and email-addresses clickable $replacer = new rcube_string_replacer; - // search for patterns like links and e-mail addresses - $body = preg_replace_callback($replacer->link_pattern, array($replacer, 'link_callback'), $body); - $body = preg_replace_callback($replacer->mailto_pattern, array($replacer, 'mailto_callback'), $body); + // search for patterns like links and e-mail addresses and replace with tokens + $body = $replacer->replace($body); // split body into single lines $body = preg_split('/\r?\n/', $body); diff --git a/program/steps/mail/list.inc b/program/steps/mail/list.inc index b5d579d7d..b433f81fc 100644 --- a/program/steps/mail/list.inc +++ b/program/steps/mail/list.inc @@ -23,27 +23,33 @@ if (!$OUTPUT->ajax_call) { return; } +$save_arr = array(); +$dont_override = (array) $RCMAIL->config->get('dont_override'); + // is there a sort type for this request? -if ($sort = get_input_value('_sort', RCUBE_INPUT_GET)) -{ +if ($sort = get_input_value('_sort', RCUBE_INPUT_GET)) { // yes, so set the sort vars list($sort_col, $sort_order) = explode('_', $sort); // set session vars for sort (so next page and task switch know how to sort) - $save_arr = array(); - $_SESSION['sort_col'] = $save_arr['message_sort_col'] = $sort_col; - $_SESSION['sort_order'] = $save_arr['message_sort_order'] = $sort_order; + if (!in_array('message_sort_col', $dont_override)) { + $_SESSION['sort_col'] = $save_arr['message_sort_col'] = $sort_col; + } + if (!in_array('message_sort_order', $dont_override)) { + $_SESSION['sort_order'] = $save_arr['message_sort_order'] = $sort_order; + } } // is there a set of columns for this request? -if ($cols = get_input_value('_cols', RCUBE_INPUT_GET)) -{ - $save_arr = array(); - $save_arr['list_cols'] = explode(',', $cols); +if ($cols = get_input_value('_cols', RCUBE_INPUT_GET)) { + if (!in_array('list_cols', $dont_override)) { + $save_arr['list_cols'] = explode(',', $cols); + } } -if ($save_arr) +if (!empty($save_arr)) { $RCMAIL->user->save_prefs($save_arr); +} $mbox_name = $RCMAIL->storage->get_folder(); $threading = (bool) $RCMAIL->storage->get_threading(); @@ -52,8 +58,7 @@ $threading = (bool) $RCMAIL->storage->get_threading(); $RCMAIL->storage->folder_sync($mbox_name); // initialize searching result if search_filter is used -if ($_SESSION['search_filter'] && $_SESSION['search_filter'] != 'ALL') -{ +if ($_SESSION['search_filter'] && $_SESSION['search_filter'] != 'ALL') { $search_request = md5($mbox_name.$_SESSION['search_filter']); $RCMAIL->storage->search($mbox_name, $_SESSION['search_filter'], RCMAIL_CHARSET, rcmail_sort_column()); $_SESSION['search'] = $RCMAIL->storage->get_search_set(); @@ -76,7 +81,6 @@ else if (empty($_REQUEST['_search']) && isset($_SESSION['search'])) { $RCMAIL->session->remove('search'); } - // empty result? we'll skip UNSEEN counting in rcmail_send_unread_count() if (empty($search_request) && empty($a_headers)) { $unseen = 0; @@ -96,10 +100,10 @@ $OUTPUT->command('set_mailboxname', rcmail_get_mailbox_name_text()); // add message rows rcmail_js_message_list($a_headers, FALSE, $cols); -if (isset($a_headers) && count($a_headers)) -{ - if ($search_request) +if (isset($a_headers) && count($a_headers)) { + if ($search_request) { $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $count)); + } } else { // handle IMAP errors (e.g. #1486905) diff --git a/program/steps/mail/list_contacts.inc b/program/steps/mail/list_contacts.inc index 7c99a1309..9347190da 100644 --- a/program/steps/mail/list_contacts.inc +++ b/program/steps/mail/list_contacts.inc @@ -69,11 +69,14 @@ if ($CONTACTS && $CONTACTS->ready) { $name = rcube_addressbook::compose_list_name($row); // add record for every email address of the contact - foreach ($CONTACTS->get_col_values('email', $row, true) as $i => $email) { + $emails = $CONTACTS->get_col_values('email', $row, true); + foreach ($emails as $i => $email) { $row_id = $row['ID'].$i; $jsresult[$row_id] = format_email_recipient($email, $name); $OUTPUT->command('add_contact_row', $row_id, array( - 'contact' => html::span(array('title' => $email), Q($name ? $name : $email))), 'person'); + 'contact' => html::span(array('title' => $email), Q($name ? $name : $email) . + ($name && count($emails) > 1 ? ' ' . html::span('email', Q($email)) : '') + )), 'person'); } } } diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index a0c049682..4fac872d1 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -49,7 +49,7 @@ if (!$savedraft) { if(!empty($CONFIG['sendmail_delay'])) { $wait_sec = time() - intval($CONFIG['sendmail_delay']) - intval($CONFIG['last_message_time']); - if($wait_sec < 0) { + if ($wait_sec < 0) { $OUTPUT->show_message('senttooquickly', 'error', array('sec' => $wait_sec * -1)); $OUTPUT->send('iframe'); } @@ -72,13 +72,19 @@ function rcmail_encrypt_header($what) // get identity record function rcmail_get_identity($id) { - global $RCMAIL, $OUTPUT; + global $RCMAIL, $message_charset; + global $RCMAIL; if ($sql_arr = $RCMAIL->user->get_identity($id)) { $out = $sql_arr; + + if ($message_charset != RCMAIL_CHARSET) { + foreach ($out as $k => $v) + $out[$k] = rcube_charset_convert($v, RCMAIL_CHARSET, $message_charset); + } + $out['mailto'] = $sql_arr['email']; - $out['string'] = format_email_recipient($sql_arr['email'], - rcube_charset_convert($sql_arr['name'], RCMAIL_CHARSET, $OUTPUT->get_charset())); + $out['string'] = format_email_recipient($sql_arr['email'], $sql_arr['name']); return $out; } @@ -96,7 +102,7 @@ function rcmail_get_identity($id) */ function rcmail_fix_emoticon_paths($mime_message) { - global $CONFIG; + global $RCMAIL; $body = $mime_message->getHTMLBody(); @@ -121,8 +127,9 @@ function rcmail_fix_emoticon_paths($mime_message) 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)) - $OUTPUT->show_message("emoticonerror", 'error'); + if (!$mime_message->addHTMLImage($img_file, 'image/gif', '', true, $image_name)) { + $RCMAIL->output->show_message("emoticonerror", 'error'); + } array_push($included_images, $image_name); } @@ -468,6 +475,7 @@ if (!$savedraft) { if ($CONFIG['spellcheck_before_send'] && $CONFIG['enable_spellcheck'] && empty($COMPOSE['spell_checked']) && !empty($message_body) ) { + $message_body = str_replace("\r\n", "\n", $message_body); $spellchecker = new rcube_spellchecker(get_input_value('_lang', RCUBE_INPUT_GPC)); $spell_result = $spellchecker->check($message_body, $isHtml); @@ -668,19 +676,18 @@ if (!$savedraft) $smtp_error, $mailbody_file, $smtp_opts); // return to compose page if sending failed - if (!$sent) - { + if (!$sent) { // remove temp file if ($mailbody_file) { unlink($mailbody_file); - } + } if ($smtp_error) $OUTPUT->show_message($smtp_error['label'], 'error', $smtp_error['vars']); else $OUTPUT->show_message('sendingfailed', 'error'); $OUTPUT->send('iframe'); - } + } // save message sent time if (!empty($CONFIG['sendmail_delay'])) @@ -698,7 +705,7 @@ if (!$savedraft) // Determine which folder to save message if ($savedraft) $store_target = $CONFIG['drafts_mbox']; -else +else if (!$RCMAIL->config->get('no_save_sent_messages')) $store_target = isset($_POST['_store_target']) ? get_input_value('_store_target', RCUBE_INPUT_POST) : $CONFIG['sent_mbox']; if ($store_target) { diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc index e94630635..d5ccbb2d7 100644 --- a/program/steps/settings/func.inc +++ b/program/steps/settings/func.inc @@ -198,9 +198,6 @@ function rcmail_user_prefs($current=null) $select_timezone->add('(GMT ' . $offset . ') ' . strtr($tzs, '_', ' '), $tzs); } - if (is_numeric($config['timezone'])) - timezone_name_from_abbr("", $config['timezone'] * 3600, 0); - $blocks['main']['options']['timezone'] = array( 'title' => html::label($field_id, Q(rcube_label('timezone'))), 'content' => $select_timezone->show((string)$config['timezone']), diff --git a/skins/classic/mail.css b/skins/classic/mail.css index 08d1266f1..7408d49f1 100644 --- a/skins/classic/mail.css +++ b/skins/classic/mail.css @@ -305,7 +305,6 @@ bottom: 0px; border: 1px solid #999999; background-color: #F9F9F9; - overflow: hidden; } #messagecontframe @@ -365,7 +364,6 @@ bottom: 0; border: 1px solid #999; background-color: #F9F9F9; - overflow: hidden; } #mailboxlist diff --git a/skins/classic/templates/compose.html b/skins/classic/templates/compose.html index 985e62e86..e2164659c 100644 --- a/skins/classic/templates/compose.html +++ b/skins/classic/templates/compose.html @@ -151,10 +151,10 @@ </tr><tr> <td><label for="rcmcomposepriority"><roundcube:label name="priority" />:</label></td> <td><roundcube:object name="prioritySelector" form="form" id="rcmcomposepriority" /></td> - </tr><tr> + </tr><roundcube:if condition="!config:no_save_sent_messages" /><tr> <td><label><roundcube:label name="savesentmessagein" />:</label></td> <td><roundcube:object name="storetarget" maxlength="30" /></td> - </tr> + </tr><roundcube:endif /> </table> </div> diff --git a/skins/larry/mail.css b/skins/larry/mail.css index 6d350d714..20a13f62f 100644 --- a/skins/larry/mail.css +++ b/skins/larry/mail.css @@ -421,12 +421,15 @@ a.iconbutton.threadmode.selected { border-left: 0; } - #messagelist tr td.size { width: 60px; text-align: right; } +#messagelist thead tr td.size { + text-align: left; +} + #messagelist tr td.fromto, #messagelist tr td.from, #messagelist tr td.to, @@ -1110,6 +1113,13 @@ div.message-part blockquote blockquote blockquote { display: block; } +#contacts-table td span.email { + display: inline; + color: #69939e; + font-style: italic; + margin-left: 0.5em; +} + #compose-contacts li a, #contacts-table td { background: url(images/listicons.png) -100px 0 no-repeat; overflow: hidden; diff --git a/skins/larry/templates/compose.html b/skins/larry/templates/compose.html index 2612685a9..de3b5bfff 100644 --- a/skins/larry/templates/compose.html +++ b/skins/larry/templates/compose.html @@ -136,9 +136,11 @@ <span class="composeoption"> <label><roundcube:object name="dsnCheckBox" form="form" id="rcmcomposedsn" /> <roundcube:label name="dsn" /></label> </span> + <roundcube:if condition="!config:no_save_sent_messages" /> <span class="composeoption"> <label><roundcube:label name="savesentmessagein" /> <roundcube:object name="storetarget" maxlength="30" style="max-width:12em" /></label> </span> + <roundcube:endif /> <roundcube:container name="composeoptions" id="composeoptions" /> </div> diff --git a/tests/Framework/StringReplacer.php b/tests/Framework/StringReplacer.php index 11210c0da..a76ba00ee 100644 --- a/tests/Framework/StringReplacer.php +++ b/tests/Framework/StringReplacer.php @@ -17,4 +17,30 @@ class Framework_StringReplacer extends PHPUnit_Framework_TestCase $this->assertInstanceOf('rcube_string_replacer', $sr, "Class constructor"); } + + /** + * Data for test_replace() + */ + function data_replace() + { + return array( + array('http://domain.tld/path*path2', '<a href="http://domain.tld/path*path2" target="_blank">http://domain.tld/path*path2</a>'), + array("Click this link:\nhttps://mail.xn--brderli-o2a.ch/rc/ EOF", "Click this link:\n<a href=\"https://mail.xn--brderli-o2a.ch/rc/\" target=\"_blank\">https://mail.xn--brderli-o2a.ch/rc/</a> EOF"), + array('Start http://localhost/?foo End', 'Start <a href="http://localhost/?foo" target="_blank">http://localhost/?foo</a> End'), + array('www.domain.tld', '<a href="http://www.domain.tld" target="_blank">www.domain.tld</a>'), + array('WWW.DOMAIN.TLD', '<a href="http://WWW.DOMAIN.TLD" target="_blank">WWW.DOMAIN.TLD</a>'), + ); + } + + /** + * @dataProvider data_replace + */ + function test_replace($input, $output) + { + $replacer = new rcube_string_replacer; + $result = $replacer->replace($input); + $result = $replacer->resolve($result); + + $this->assertEquals($output, $result); + } } |