diff options
171 files changed, 1465 insertions, 1070 deletions
@@ -1,27 +1,68 @@ CHANGELOG Roundcube Webmail =========================== -- Fix handling of some conditional comment tags in HTML message (#1489004) +- Fix min_refresh_interval handling on preferences save (#1489073) +- Fix PDF support detection for Firefox PDF.js (#1488972) +- Fix messages list focus issue in Internet Explorer (#1489058) +- Add db_prefix configuration option in place of db_table_*/db_sequence_* options +- Make possible to use db_prefix for schema initialization in Installer (#1489067) +- Fix updatedb.sh script so it recognizes also table prefix for external DDL files +- Fix possible collision in generated thumbnail cache key (#1489069) +- Fix exit code on bootsrap errors in CLI mode (#1489044) +- Fix error handling in CLI mode, use STDERR and non-empty exit code (#1489043) +- Fix error when using check_referer=true +- Fix incorrect handling of some specific links (#1489060) +- Fix incorrect handling of leading spaces in text wrapping +- Fix unintentional messages list jumps on click in Internet Explorer (#1489056) +- Fix list of required configuration options (#1489055) +- Fix DB error when creating a new contact and a group is selected (#1489051) +- Fix handling of deprecated boolean value of reply_mode option (#1489052) +- Fix parsing invalid date string (#1489035) +- Add "with attachment" option to messages list filter (#1485382) +- Call resize handler in intervals to prevent lags and double onresize calls in Chrome (#1489005) - Add rel="noreferrer" for links in displayed messages (#1484686) -- Fix so forward as attachment works if additional attachment is added by message_compose hook (#1489000) - Add ability to toggle between HTML and text while viewing a message (#1486939) +- Remove "HTML message" from attachments list while viewing a message in text mode (#1486939) +- Support IMAP MOVE extension [RFC 6851] +- Add attachment menu with Open and Download options (#1488975) +- Display user-friendly message on IMAP "over quota" errors (#1484164) +- Extended archive plugin with user-configurable options to store messages into subfolders +- Fix export of selected contacts from search result (#1488905) +- Feature to export only selected contacts from addressbook (by Phil Weir) + +RELEASE 0.9.0 +------------- +- Fix display of HTML entities in protected folder name (#1489042) +- Set minimal permissions to temp files (#1488996) +- Improve content check for embedded images without filename (#1489029) +- Fix handling of invalid characters in message headers and output (#1489032) +- Fix selecting collapsed rows on select-all (#1489036) +- Avoid race-conditions with concurrent attachment uploads (#1488422) +- Fix possible header duplicates when using additional headers (#1489033) +- Fix session issues with use_https=true (#1488986) +- Fix blockquote width in sent mail (#1489031) +- Fix keyboard events on list widgets in Internet Explorer (#1489025) + +RELEASE 0.9-rc2 +--------------- +- Fix security issue in save-pref command +- Remove sig_above configuration option, use reply_mode only (#1489001) +- Refresh current folder in opener window after draft save or message sent (#1488997) +- Fix saving draft just after entering compose window (#1489012) +- Fix javascript error in IE9 when loading form with placeholders into an iframe (#1489008) +- Fix handling of some conditional comment tags in HTML message (#1489004) +- Fix so forward as attachment works if additional attachment is added by message_compose hook (#1489000) - Better handling of session errors in ajax requests (#1488960) - Fix HTML part detection for some specific message structures (#1488992) - Don't show fake address - phishing prevention (#1488981) - Fix forward as attachment bug with editormode != 1 (#1488991) - Fix LIMIT/OFFSET queries handling on MS SQL Server (#1488984) - Fix so task name can really contain all from a-z0-9_- characters (#1488941) -- Support IMAP MOVE extension [RFC 6851] - Fix javascript errors when working in a page opened with taget="_blank" - Mention SQLite database format change in UPGRADING file (#1488983) - Increase maxlength to 254 chars for email input fields in addressbook (#1488987) -- Add attachment menu with Open and Download options (#1488975) - Fix thumbnail size when GD extension is used for image resize (#1488985) -- Display user-friendly message on IMAP "over quota" errors (#1484164) - Display notice that message is encrypted also for application/pkcs7-mime messages (#1488526) -- Extended archive plugin with user-configurable options to store messages into subfolders -- Fix export of selected contacts from search result (#1488905) -- Feature to export only selected contacts from addressbook (by Phil Weir) RELEASE 0.9-rc -------------- @@ -129,9 +129,15 @@ versions don't have a -O option for the createdb, so if you are using that version you'll have to change ownership of the DB later. +* Microsoft SQL Server +---------------------- +Language/locale of the database must be set to us_english (1033). More info +on this at http://trac.roundcube.net/ticket/1488918. + + Database cleaning ----------------- -Do keep your database slick and clean we recommend to periodically execute +To keep your database slick and clean we recommend to periodically execute bin/cleandb.sh which finally removes all records that are marked as deleted. Best solution is to install a cronjob running this script daily. diff --git a/SQL/mssql.initial.sql b/SQL/mssql.initial.sql index 9139509a5..d43676ff9 100644 --- a/SQL/mssql.initial.sql +++ b/SQL/mssql.initial.sql @@ -371,6 +371,6 @@ CREATE TRIGGER [contact_delete_member] ON [dbo].[contacts] WHERE [contact_id] IN (SELECT [contact_id] FROM deleted)
GO
-INSERT INTO [dbo].[system] ([name], [value]) VALUES ('roundcube-version', '2013011700')
+INSERT INTO [dbo].[system] ([name], [value]) VALUES ('roundcube-version', '2013042700')
GO
\ No newline at end of file diff --git a/SQL/mssql/2013042700.sql b/SQL/mssql/2013042700.sql new file mode 100644 index 000000000..fe6741a02 --- /dev/null +++ b/SQL/mssql/2013042700.sql @@ -0,0 +1 @@ +-- empty
\ No newline at end of file diff --git a/SQL/mysql.initial.sql b/SQL/mysql.initial.sql index cb750c5ea..5a86dd8f8 100644 --- a/SQL/mysql.initial.sql +++ b/SQL/mysql.initial.sql @@ -196,4 +196,4 @@ CREATE TABLE `system` ( /*!40014 SET FOREIGN_KEY_CHECKS=1 */; -INSERT INTO system (name, value) VALUES ('roundcube-version', '2013011700'); +INSERT INTO system (name, value) VALUES ('roundcube-version', '2013042700'); diff --git a/SQL/mysql/2013011000.sql b/SQL/mysql/2013011000.sql index f0b5e6a03..d1ea001db 100644 --- a/SQL/mysql/2013011000.sql +++ b/SQL/mysql/2013011000.sql @@ -1,6 +1,6 @@ -- Upgrade from 0.9-beta -CREATE TABLE `system` ( +CREATE TABLE IF NOT EXISTS `system` ( `name` varchar(64) NOT NULL, `value` mediumtext, PRIMARY KEY(`name`) diff --git a/SQL/mysql/2013042700.sql b/SQL/mysql/2013042700.sql new file mode 100644 index 000000000..fe6741a02 --- /dev/null +++ b/SQL/mysql/2013042700.sql @@ -0,0 +1 @@ +-- empty
\ No newline at end of file diff --git a/SQL/postgres.initial.sql b/SQL/postgres.initial.sql index 32d8edee8..f3b368f7d 100644 --- a/SQL/postgres.initial.sql +++ b/SQL/postgres.initial.sql @@ -1,11 +1,11 @@ -- Roundcube Webmail initial database structure -- --- Sequence "user_ids" --- Name: user_ids; Type: SEQUENCE; Schema: public; Owner: postgres +-- Sequence "users_seq" +-- Name: users_seq; Type: SEQUENCE; Schema: public; Owner: postgres -- -CREATE SEQUENCE user_ids +CREATE SEQUENCE users_seq INCREMENT BY 1 NO MAXVALUE NO MINVALUE @@ -17,7 +17,7 @@ CREATE SEQUENCE user_ids -- CREATE TABLE users ( - user_id integer DEFAULT nextval('user_ids'::text) PRIMARY KEY, + user_id integer DEFAULT nextval('users_seq'::text) PRIMARY KEY, username varchar(128) DEFAULT '' NOT NULL, mail_host varchar(128) DEFAULT '' NOT NULL, created timestamp with time zone DEFAULT now() NOT NULL, @@ -45,11 +45,11 @@ CREATE INDEX session_changed_idx ON session (changed); -- --- Sequence "identity_ids" --- Name: identity_ids; Type: SEQUENCE; Schema: public; Owner: postgres +-- Sequence "identities_seq" +-- Name: identities_seq; Type: SEQUENCE; Schema: public; Owner: postgres -- -CREATE SEQUENCE identity_ids +CREATE SEQUENCE identities_seq START WITH 1 INCREMENT BY 1 NO MAXVALUE @@ -62,7 +62,7 @@ CREATE SEQUENCE identity_ids -- CREATE TABLE identities ( - identity_id integer DEFAULT nextval('identity_ids'::text) PRIMARY KEY, + identity_id integer DEFAULT nextval('identities_seq'::text) PRIMARY KEY, user_id integer NOT NULL REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE, changed timestamp with time zone DEFAULT now() NOT NULL, @@ -82,11 +82,11 @@ CREATE INDEX identities_email_idx ON identities (email, del); -- --- Sequence "contact_ids" --- Name: contact_ids; Type: SEQUENCE; Schema: public; Owner: postgres +-- Sequence "contacts_seq" +-- Name: contacts_seq; Type: SEQUENCE; Schema: public; Owner: postgres -- -CREATE SEQUENCE contact_ids +CREATE SEQUENCE contacts_seq START WITH 1 INCREMENT BY 1 NO MAXVALUE @@ -99,7 +99,7 @@ CREATE SEQUENCE contact_ids -- CREATE TABLE contacts ( - contact_id integer DEFAULT nextval('contact_ids'::text) PRIMARY KEY, + contact_id integer DEFAULT nextval('contacts_seq'::text) PRIMARY KEY, user_id integer NOT NULL REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE, changed timestamp with time zone DEFAULT now() NOT NULL, @@ -115,11 +115,11 @@ CREATE TABLE contacts ( CREATE INDEX contacts_user_id_idx ON contacts (user_id, del); -- --- Sequence "contactgroups_ids" --- Name: contactgroups_ids; Type: SEQUENCE; Schema: public; Owner: postgres +-- Sequence "contactgroups_seq" +-- Name: contactgroups_seq; Type: SEQUENCE; Schema: public; Owner: postgres -- -CREATE SEQUENCE contactgroups_ids +CREATE SEQUENCE contactgroups_seq INCREMENT BY 1 NO MAXVALUE NO MINVALUE @@ -131,7 +131,7 @@ CREATE SEQUENCE contactgroups_ids -- CREATE TABLE contactgroups ( - contactgroup_id integer DEFAULT nextval('contactgroups_ids'::text) PRIMARY KEY, + contactgroup_id integer DEFAULT nextval('contactgroups_seq'::text) PRIMARY KEY, user_id integer NOT NULL REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE, changed timestamp with time zone DEFAULT now() NOT NULL, @@ -238,11 +238,11 @@ CREATE TABLE dictionary ( ); -- --- Sequence "searches_ids" --- Name: searches_ids; Type: SEQUENCE; Schema: public; Owner: postgres +-- Sequence "searches_seq" +-- Name: searches_seq; Type: SEQUENCE; Schema: public; Owner: postgres -- -CREATE SEQUENCE search_ids +CREATE SEQUENCE searches_seq INCREMENT BY 1 NO MAXVALUE NO MINVALUE @@ -254,7 +254,7 @@ CREATE SEQUENCE search_ids -- CREATE TABLE searches ( - search_id integer DEFAULT nextval('search_ids'::text) PRIMARY KEY, + search_id integer DEFAULT nextval('searches_seq'::text) PRIMARY KEY, user_id integer NOT NULL REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE, "type" smallint DEFAULT 0 NOT NULL, @@ -274,4 +274,4 @@ CREATE TABLE "system" ( value text ); -INSERT INTO system (name, value) VALUES ('roundcube-version', '2013011700'); +INSERT INTO system (name, value) VALUES ('roundcube-version', '2013042700'); diff --git a/SQL/postgres/2013042700.sql b/SQL/postgres/2013042700.sql new file mode 100644 index 000000000..bbd567515 --- /dev/null +++ b/SQL/postgres/2013042700.sql @@ -0,0 +1,14 @@ +ALTER SEQUENCE user_ids RENAME TO users_seq; +ALTER TABLE users ALTER COLUMN user_id SET DEFAULT nextval('users_seq'::text); + +ALTER SEQUENCE identity_ids RENAME TO identities_seq; +ALTER TABLE identities ALTER COLUMN identity_id SET DEFAULT nextval('identities_seq'::text); + +ALTER SEQUENCE contact_ids RENAME TO contacts_seq; +ALTER TABLE contacts ALTER COLUMN contact_id SET DEFAULT nextval('contacts_seq'::text); + +ALTER SEQUENCE contactgroups_ids RENAME TO contactgroups_seq; +ALTER TABLE contactgroups ALTER COLUMN contactgroup_id SET DEFAULT nextval('contactgroups_seq'::text); + +ALTER SEQUENCE search_ids RENAME TO searches_seq; +ALTER TABLE searches ALTER COLUMN search_id SET DEFAULT nextval('searches_seq'::text); diff --git a/SQL/sqlite.initial.sql b/SQL/sqlite.initial.sql index 83874ce7c..d9bafb7e0 100644 --- a/SQL/sqlite.initial.sql +++ b/SQL/sqlite.initial.sql @@ -209,4 +209,4 @@ CREATE TABLE system ( value text NOT NULL ); -INSERT INTO system (name, value) VALUES ('roundcube-version', '2013011700'); +INSERT INTO system (name, value) VALUES ('roundcube-version', '2013042700'); diff --git a/SQL/sqlite/2013011000.sql b/SQL/sqlite/2013011000.sql index 2c66ef95e..ec261a635 100644 --- a/SQL/sqlite/2013011000.sql +++ b/SQL/sqlite/2013011000.sql @@ -1,6 +1,6 @@ -- Updates from version 0.9-beta -CREATE TABLE system ( +CREATE TABLE IF NOT EXISTS system ( name varchar(64) NOT NULL PRIMARY KEY, value text NOT NULL ); diff --git a/SQL/sqlite/2013042700.sql b/SQL/sqlite/2013042700.sql new file mode 100644 index 000000000..fe6741a02 --- /dev/null +++ b/SQL/sqlite/2013042700.sql @@ -0,0 +1 @@ +-- empty
\ No newline at end of file diff --git a/bin/cleandb.sh b/bin/cleandb.sh index ecf258320..ea905c873 100755 --- a/bin/cleandb.sh +++ b/bin/cleandb.sh @@ -34,8 +34,9 @@ $RCMAIL = rcmail::get_instance(); $db = $RCMAIL->get_dbh(); $db->db_connect('w'); -if (!$db->is_connected() || $db->is_error()) - die("No DB connection\n"); +if (!$db->is_connected() || $db->is_error()) { + rcube::raise_error("No DB connection", false, true); +} if (!empty($_SERVER['argv'][1])) $days = intval($_SERVER['argv'][1]); diff --git a/bin/decrypt.sh b/bin/decrypt.sh index 95fdefc42..ff7c43038 100755 --- a/bin/decrypt.sh +++ b/bin/decrypt.sh @@ -19,7 +19,7 @@ +-----------------------------------------------------------------------+ */ -/*- +/** * If http_received_header_encrypt is configured, the IP address and the * host name of the added Received: header is encrypted with 3DES, to * protect information that some could consider sensitve, yet their @@ -28,8 +28,8 @@ * Such an encrypted Received: header might look like: * * Received: from DzgkvJBO5+bw+oje5JACeNIa/uSI4mRw2cy5YoPBba73eyBmjtyHnQ== - * [my0nUbjZXKtl7KVBZcsvWOxxtyVFxza4] - * with HTTP/1.1 (POST); Thu, 14 May 2009 19:17:28 +0200 + * [my0nUbjZXKtl7KVBZcsvWOxxtyVFxza4] + * with HTTP/1.1 (POST); Thu, 14 May 2009 19:17:28 +0200 * * In this example, the two encrypted components are the sender host name * (DzgkvJBO5+bw+oje5JACeNIa/uSI4mRw2cy5YoPBba73eyBmjtyHnQ==) and the IP @@ -48,7 +48,7 @@ * * If (most likely binary) junk is shown, then * - either the encryption password has, between the time the mail was sent - * and `now', changed, or + * and 'now', changed, or * - you are dealing with counterfeit header data. */ diff --git a/bin/indexcontacts.sh b/bin/indexcontacts.sh index a9a5a952a..c85a535a7 100755 --- a/bin/indexcontacts.sh +++ b/bin/indexcontacts.sh @@ -30,17 +30,18 @@ $RCMAIL = rcmail::get_instance(); $db = $RCMAIL->get_dbh(); $db->db_connect('w'); -if (!$db->is_connected() || $db->is_error()) - die("No DB connection\n"); +if (!$db->is_connected() || $db->is_error()) { + rcube::raise_error("No DB connection", false, true); +} // iterate over all users -$sql_result = $db->query("SELECT user_id FROM " . $RCMAIL->config->get('db_table_users', 'users')." WHERE 1=1"); +$sql_result = $db->query("SELECT user_id FROM " . $db->table_name('users') . " ORDER BY user_id"); while ($sql_result && ($sql_arr = $db->fetch_assoc($sql_result))) { echo "Indexing contacts for user " . $sql_arr['user_id'] . "..."; - + $contacts = new rcube_contacts($db, $sql_arr['user_id']); $contacts->set_pagesize(9999); - + $result = $contacts->list_records(); while ($result->count && ($row = $result->next())) { unset($row['words']); diff --git a/bin/installto.sh b/bin/installto.sh index e6cf79d7d..8e1ab1fbf 100755 --- a/bin/installto.sh +++ b/bin/installto.sh @@ -26,17 +26,17 @@ require_once INSTALL_PATH . 'program/include/clisetup.php'; $target_dir = unslashify($_SERVER['argv'][1]); if (empty($target_dir) || !is_dir(realpath($target_dir))) - die("Invalid target: not a directory\nUsage: installto.sh <TARGET>\n"); + rcube::raise_error("Invalid target: not a directory\nUsage: installto.sh <TARGET>", false, true); // read version from iniset.php $iniset = @file_get_contents($target_dir . '/program/include/iniset.php'); if (!preg_match('/define\(.RCMAIL_VERSION.,\s*.([0-9.]+[a-z-]*)/', $iniset, $m)) - die("No valid Roundcube installation found at $target_dir\n"); + rcube::raise_error("No valid Roundcube installation found at $target_dir", false, true); $oldversion = $m[1]; if (version_compare(version_parse($oldversion), version_parse(RCMAIL_VERSION), '>=')) - die("Installation at target location is up-to-date!\n"); + rcube::raise_error("Installation at target location is up-to-date!", false, true); echo "Upgrading from $oldversion. Do you want to continue? (y/N)\n"; $input = trim(fgets(STDIN)); diff --git a/bin/moduserprefs.sh b/bin/moduserprefs.sh index b8ba98578..9bbc885a6 100755 --- a/bin/moduserprefs.sh +++ b/bin/moduserprefs.sh @@ -2,7 +2,7 @@ <?php /* +-----------------------------------------------------------------------+ - | bin/moduserprefs.sh | + | bin/moduserprefs.sh | | | | This file is part of the Roundcube Webmail client | | Copyright (C) 2012, The Roundcube Dev Team | @@ -61,7 +61,7 @@ if ($args['user']) $query = 'user_id=' . intval($args['user']); // iterate over all users -$sql_result = $db->query("SELECT * FROM " . $rcmail->config->get('db_table_users', 'users')." WHERE $query"); +$sql_result = $db->query("SELECT * FROM " . $db->table_name('users') . " WHERE $query"); while ($sql_result && ($sql_arr = $db->fetch_assoc($sql_result))) { echo "Updating prefs for user " . $sql_arr['user_id'] . "..."; diff --git a/bin/msgimport.sh b/bin/msgimport.sh index 41bcd7e53..1fcc34680 100755 --- a/bin/msgimport.sh +++ b/bin/msgimport.sh @@ -33,8 +33,7 @@ else if (!($args['host'] && $args['file'])) } else if (!is_file($args['file'])) { - print "Cannot read message file\n"; - exit; + rcube::raise_error("Cannot read message file.", false, true); } // prompt for username if not set @@ -87,7 +86,7 @@ if ($IMAP->connect($host, $args['user'], $args['pass'], $imap_port, $imap_ssl)) if ($IMAP->save_message($args['mbox'], rtrim($message))) $count++; else - die("Failed to save message to {$args['mbox']}\n"); + rcube::raise_error("Failed to save message to {$args['mbox']}", false, true); $message = ''; } continue; @@ -108,7 +107,7 @@ if ($IMAP->connect($host, $args['user'], $args['pass'], $imap_port, $imap_ssl)) } else { - print "IMAP login failed.\n"; + rcube::raise_error("IMAP login failed.", false, true); } ?> diff --git a/bin/updatedb.sh b/bin/updatedb.sh index 1c7e1c7a1..b4ed8b7ba 100755 --- a/bin/updatedb.sh +++ b/bin/updatedb.sh @@ -31,18 +31,15 @@ $opts = rcube_utils::get_opt(array( )); if (empty($opts['dir'])) { - echo "ERROR: Database schema directory not specified (--dir).\n"; - exit(1); + rcube::raise_error("Database schema directory not specified (--dir).", false, true); } if (empty($opts['package'])) { - echo "ERROR: Database schema package name not specified (--package).\n"; - exit(1); + rcube::raise_error("Database schema package name not specified (--package).", false, true); } // Check if directory exists if (!file_exists($opts['dir'])) { - echo "ERROR: Specified database schema directory doesn't exist.\n"; - exit(1); + rcube::raise_error("Specified database schema directory doesn't exist.", false, true); } $RC = rcube::get_instance(); @@ -51,8 +48,7 @@ $DB = rcube_db::factory($RC->config->get('db_dsnw')); // Connect to database $DB->db_connect('w'); if (!$DB->is_connected()) { - echo "Error connecting to database: " . $DB->is_error() . ".\n"; - exit(1); + rcube::raise_error("Error connecting to database: " . $DB->is_error(), false, true); } // Read DB schema version from database (if 'system' table exists) @@ -90,6 +86,7 @@ if (!$version && $opts['version']) { '0.7.1' => 2011111600, '0.7.2' => 2011111600, '0.7.3' => 2011111600, + '0.7.4' => 2011111600, '0.8-beta' => 2011121400, '0.8-rc' => 2011121400, '0.8.0' => 2011121400, @@ -97,6 +94,8 @@ if (!$version && $opts['version']) { '0.8.2' => 2011121400, '0.8.3' => 2011121400, '0.8.4' => 2011121400, + '0.8.5' => 2011121400, + '0.8.6' => 2011121400, '0.9-beta' => 2012080700, ); @@ -110,8 +109,7 @@ if (empty($version)) { $dir = $opts['dir'] . DIRECTORY_SEPARATOR . $DB->db_provider; if (!file_exists($dir)) { - echo "DDL Upgrade files for " . $DB->db_provider . " driver not found.\n"; - exit(1); + rcube::raise_error("DDL Upgrade files for " . $DB->db_provider . " driver not found.", false, true); } $dh = opendir($dir); @@ -129,13 +127,12 @@ foreach ($result as $v) { $error = update_db_schema($opts['package'], $v, $dir . DIRECTORY_SEPARATOR . "$v.sql"); if ($error) { - echo "\nError in DDL upgrade $v: $error\n"; - exit(1); + echo "[FAILED]\n"; + rcube::raise_error("Error in DDL upgrade $v: $error", false, true); } echo "[OK]\n"; } -exit(0); function update_db_schema($package, $version, $file) { @@ -183,15 +180,48 @@ function update_db_schema($package, $version, $file) function fix_table_names($sql) { - global $DB; + global $DB, $RC, $dir; + static $tables; + static $sequences; + + $prefix = $RC->config->get('db_prefix'); + $engine = $DB->db_provider; + + if (empty($prefix)) { + return $sql; + } + + if ($tables === null) { + $tables = array(); + $sequences = array(); + + // read complete schema (initial) file + $filename = "$dir/../$engine.initial.sql"; + $schema = @file_get_contents($filename); - foreach (array('users','identities','contacts','contactgroups','contactgroupmembers','session','cache','cache_index','cache_index','cache_messages','dictionary','searches','system') as $table) { - $real_table = $DB->table_name($table); - if ($real_table != $table) { - $sql = preg_replace("/([^a-z0-9_])$table([^a-z0-9_])/i", "\\1$real_table\\2", $sql); + // find table names + if (preg_match_all('/CREATE TABLE (\[dbo\]\.|IF NOT EXISTS )?[`"\[\]]*([^`"\[\] \r\n]+)/i', $schema, $matches)) { + foreach ($matches[2] as $table) { + $tables[$table] = $prefix . $table; + } + } + // find sequence names + if ($engine == 'postgres' && preg_match_all('/CREATE SEQUENCE (IF NOT EXISTS )?"?([^" \n\r]+)/i', $schema, $matches)) { + foreach ($matches[2] as $sequence) { + $sequences[$sequence] = $prefix . $sequence; + } } } + // replace table names + foreach ($tables as $table => $real_table) { + $sql = preg_replace("/([^a-zA-Z0-9_])$table([^a-zA-Z0-9_])/", "\\1$real_table\\2", $sql); + } + // replace sequence names + foreach ($sequences as $sequence => $real_sequence) { + $sql = preg_replace("/([^a-zA-Z0-9_])$sequence([^a-zA-Z0-9_])/", "\\1$real_sequence\\2", $sql); + } + return $sql; } diff --git a/composer.json-dist b/composer.json-dist index 846f742eb..1c2ac80bd 100644 --- a/composer.json-dist +++ b/composer.json-dist @@ -1,35 +1,16 @@ { "name": "roundcube/roundcubemail", "description": "The Roundcube Webmail suite", - "license": "GPL-3.0", + "license": "GPL-3.0+", "repositories": [ { "type": "composer", "url": "http://plugins.roundcube.net/" - }, - { - "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" + "php": ">=5.3.0", + "roundcube/plugin-installer": ">=0.1.2" }, "minimum-stability": "dev" } diff --git a/config/db.inc.php.dist b/config/db.inc.php.dist index 9bbf7d75b..17a273a0c 100644 --- a/config/db.inc.php.dist +++ b/config/db.inc.php.dist @@ -36,27 +36,7 @@ $rcmail_config['db_dsnr'] = ''; // see: http://www.php.net/manual/en/features.persistent-connections.php $rcmail_config['db_persistent'] = FALSE; -// you can define specific table names used to store webmail data -$rcmail_config['db_table_users'] = 'users'; -$rcmail_config['db_table_identities'] = 'identities'; -$rcmail_config['db_table_contacts'] = 'contacts'; -$rcmail_config['db_table_contactgroups'] = 'contactgroups'; -$rcmail_config['db_table_contactgroupmembers'] = 'contactgroupmembers'; -$rcmail_config['db_table_session'] = 'session'; -$rcmail_config['db_table_cache'] = 'cache'; -$rcmail_config['db_table_cache_index'] = 'cache_index'; -$rcmail_config['db_table_cache_thread'] = 'cache_thread'; -$rcmail_config['db_table_cache_messages'] = 'cache_messages'; -$rcmail_config['db_table_dictionary'] = 'dictionary'; -$rcmail_config['db_table_searches'] = 'searches'; -$rcmail_config['db_table_system'] = 'system'; - -// you can define specific sequence names used in PostgreSQL -$rcmail_config['db_sequence_users'] = 'user_ids'; -$rcmail_config['db_sequence_identities'] = 'identity_ids'; -$rcmail_config['db_sequence_contacts'] = 'contact_ids'; -$rcmail_config['db_sequence_contactgroups'] = 'contactgroups_ids'; -$rcmail_config['db_sequence_searches'] = 'search_ids'; - +// you can define specific table (and sequence) names prefix +$rcmail_config['db_prefix'] = ''; // end db config file diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist index b113b41a8..5a652a5b1 100644 --- a/config/main.inc.php.dist +++ b/config/main.inc.php.dist @@ -835,9 +835,6 @@ $rcmail_config['strip_existing_sig'] = true; // 3 - Forwards and Replies only $rcmail_config['show_sig'] = 1; -// When replying or forwarding place sender's signature above existing message -$rcmail_config['sig_above'] = false; - // Use MIME encoding (quoted-printable) for 8bit characters in message body $rcmail_config['force_7bit'] = false; @@ -161,7 +161,7 @@ if ($RCMAIL->task == 'login' && $RCMAIL->action == 'login') { } // end session (after optional referer check) -else if ($RCMAIL->task == 'logout' && isset($_SESSION['user_id']) && (!$RCMAIL->config->get('referer_check') || rcmail::check_referer())) { +else if ($RCMAIL->task == 'logout' && isset($_SESSION['user_id']) && (!$RCMAIL->config->get('referer_check') || rcube_utils::check_referer())) { $userdata = array( 'user' => $_SESSION['username'], 'host' => $_SESSION['storage_host'], @@ -236,7 +236,7 @@ else { } // check referer if configured - if ($RCMAIL->config->get('referer_check') && !rcmail::check_referer()) { + if ($RCMAIL->config->get('referer_check') && !rcube_utils::check_referer()) { raise_error(array( 'code' => 403, 'type' => 'php', 'message' => "Referer check failed"), true, true); diff --git a/installer/check.php b/installer/check.php index 14fc4f06e..fcf35025e 100644 --- a/installer/check.php +++ b/installer/check.php @@ -64,12 +64,12 @@ $source_urls = array( 'Intl' => 'http://www.php.net/manual/en/book.intl.php', 'Exif' => 'http://www.php.net/manual/en/book.exif.php', 'PDO' => 'http://www.php.net/manual/en/book.pdo.php', - 'pdo_mysql' => 'http://www.php.net/manual/en/book.pdo-mysql.php', - 'pdo_pgsql' => 'http://www.php.net/manual/en/book.pdo-pgsql.php', - 'pdo_sqlite' => 'http://www.php.net/manual/en/book.pdo-sqlite.php', - 'pdo_sqlite2' => 'http://www.php.net/manual/en/book.pdo-sqlite.php', - 'pdo_sqlsrv' => 'http://www.php.net/manual/en/book.pdo-sqlsrv.php', - 'pdo_dblib' => 'http://www.php.net/manual/en/book.pdo-dblib.php', + 'pdo_mysql' => 'http://www.php.net/manual/en/ref.pdo-mysql.php', + 'pdo_pgsql' => 'http://www.php.net/manual/en/ref.pdo-pgsql.php', + 'pdo_sqlite' => 'http://www.php.net/manual/en/ref.pdo-sqlite.php', + 'pdo_sqlite2' => 'http://www.php.net/manual/en/ref.pdo-sqlite.php', + 'pdo_sqlsrv' => 'http://www.php.net/manual/en/ref.pdo-sqlsrv.php', + 'pdo_dblib' => 'http://www.php.net/manual/en/ref.pdo-dblib.php', 'PEAR' => 'http://pear.php.net', 'Net_SMTP' => 'http://pear.php.net/package/Net_SMTP', 'Mail_mime' => 'http://pear.php.net/package/Mail_mime', diff --git a/installer/config.php b/installer/config.php index d6846edc7..b9a051ba0 100644 --- a/installer/config.php +++ b/installer/config.php @@ -301,6 +301,18 @@ echo '<label for="cfgdbpass">Database password (omit for sqlite)</label><br />'; ?> </dd> + +<dt class="propname">db_prefix</dt> +<dd> +<?php + +$input_prefix = new html_inputfield(array('name' => '_db_prefix', 'size' => 20, 'id' => "cfgdbprefix")); +echo $input_prefix->show($RCI->getprop('db_prefix')); + +?> +<div>Optional prefix that will be added to database object names (tables and sequences).</div> +</dd> + </dl> </fieldset> diff --git a/installer/rcube_install.php b/installer/rcube_install.php index d5811ded1..32b6a5dd7 100644 --- a/installer/rcube_install.php +++ b/installer/rcube_install.php @@ -46,8 +46,7 @@ class rcube_install // these config options are required for a working system var $required_config = array( - 'db_dsnw', 'db_table_contactgroups', 'db_table_contactgroupmembers', - 'des_key', 'session_lifetime', 'support_url', + 'db_dsnw', 'des_key', 'session_lifetime', ); // list of supported database drivers @@ -288,7 +287,7 @@ class rcube_install if ($this->config['log_driver'] == 'syslog') { if (!function_exists('openlog')) { $out['dependencies'][] = array('prop' => 'log_driver', - 'explain' => 'This requires the <tt>sylog</tt> extension which could not be loaded.'); + 'explain' => 'This requires the <tt>syslog</tt> extension which could not be loaded.'); } if (empty($this->config['syslog_id'])) { $out['dependencies'][] = array('prop' => 'syslog_id', @@ -373,7 +372,7 @@ class rcube_install $existing_tables = $DB->list_tables(); foreach ($db_schema as $table => $cols) { - $table = !empty($this->config['db_table_'.$table]) ? $this->config['db_table_'.$table] : $table; + $table = $this->config['db_prefix'] . $table; if (!in_array($table, $existing_tables)) { $errors[] = "Missing table '".$table."'"; } @@ -452,11 +451,11 @@ class rcube_install '0.2-alpha', '0.2-beta', '0.2-stable', '0.3-stable', '0.3.1', '0.4-beta', '0.4.2', - '0.5-beta', '0.5', '0.5.1', + '0.5-beta', '0.5', '0.5.1', '0.5.2', '0.5.3', '0.5.4', '0.6-beta', '0.6', - '0.7-beta', '0.7', '0.7.1', '0.7.2', '0.7.3', - '0.8-beta', '0.8-rc', '0.8.0', '0.8.1', '0.8.2', '0.8.3', '0.8.4', '0.8.5', - '0.9-beta', '0.9-rc', + '0.7-beta', '0.7', '0.7.1', '0.7.2', '0.7.3', '0.7.4', + '0.8-beta', '0.8-rc', '0.8.0', '0.8.1', '0.8.2', '0.8.3', '0.8.4', '0.8.5', '0.8.6', + '0.9-beta', '0.9-rc', '0.9-rc2', '0.9.0', )); return $select; } @@ -638,8 +637,10 @@ class rcube_install */ function update_db($version) { - system(INSTALL_PATH . "bin/updatedb.sh --package=roundcube --version=" . $version - . " --dir=" . INSTALL_PATH . "SQL", $result); + system(INSTALL_PATH . "bin/updatedb.sh --package=roundcube" + . " --version=" . escapeshellarg($version) + . " --dir=" . INSTALL_PATH . "SQL" + . " 2>&1", $result); return !$result; } @@ -654,6 +655,7 @@ class rcube_install */ function exec_sql($sql, $DB) { + $sql = $this->fix_table_names($sql, $DB); $buff = ''; foreach (explode("\n", $sql) as $line) { if (preg_match('/^--/', $line) || trim($line) == '') @@ -673,6 +675,35 @@ class rcube_install /** + * Parse SQL file and fix table names according to db_prefix + * Note: This need to be a complete database initial file + */ + private function fix_table_names($sql, $DB) + { + if (empty($this->config['db_prefix'])) { + return $sql; + } + + // replace table names + if (preg_match_all('/CREATE TABLE (\[dbo\]\.|IF NOT EXISTS )?[`"\[\]]*([^`"\[\] \r\n]+)/i', $sql, $matches)) { + foreach ($matches[2] as $table) { + $real_table = $this->config['db_prefix'] . $table; + $sql = preg_replace("/([^a-zA-Z0-9_])$table([^a-zA-Z0-9_])/", "\\1$real_table\\2", $sql); + } + } + // replace sequence names + if ($DB->db_provider == 'postgres' && preg_match_all('/CREATE SEQUENCE (IF NOT EXISTS )?"?([^" \n\r]+)/i', $sql, $matches)) { + foreach ($matches[2] as $sequence) { + $real_sequence = $this->config['db_prefix'] . $sequence; + $sql = preg_replace("/([^a-zA-Z0-9_])$sequence([^a-zA-Z0-9_])/", "\\1$real_sequence\\2", $sql); + } + } + + return $sql; + } + + + /** * Handler for Roundcube errors */ function raise_error($p) diff --git a/installer/test.php b/installer/test.php index bd49ac523..fb3e7e937 100644 --- a/installer/test.php +++ b/installer/test.php @@ -24,7 +24,7 @@ else if (!$read_main) { } echo '<br />'; -if ($read_db && !empty($RCI->config['db_table_users'])) { +if ($read_db && !empty($RCI->config['db_dsnw'])) { $RCI->pass('db.inc.php'); } else if ($read_db) { @@ -38,13 +38,13 @@ if ($RCI->configured && ($messages = $RCI->check_config())) { if (is_array($messages['missing'])) { echo '<h3 class="warning">Missing config options</h3>'; - echo '<p class="hint">The following config options are not present in the current configuration.<br/>'; - echo 'Please check the default config files and add the missing properties to your local config files.</p>'; - - echo '<ul class="configwarings">'; + echo '<p class="hint">The following config options are not set (not present or empty) in the current configuration.<br/>'; + echo 'Please check the default config files and set the missing properties in your local config files.</p>'; + + echo '<ul class="configwarnings">'; foreach ($messages['missing'] as $msg) { echo html::tag('li', null, html::span('propname', $msg['prop']) . ($msg['name'] ? ': ' . $msg['name'] : '')); - } + } echo '</ul>'; } @@ -171,7 +171,7 @@ else if ($db_working && $_POST['updatedb']) { // test database if ($db_working) { - $db_read = $DB->query("SELECT count(*) FROM {$RCI->config['db_table_users']}"); + $db_read = $DB->query("SELECT count(*) FROM {$RCI->config['db_prefix']}users"); if ($DB->is_error()) { $RCI->fail('DB Schema', "Database not initialized"); echo '<p><input type="submit" name="initdb" value="Initialize database" /></p>'; @@ -195,11 +195,11 @@ if ($db_working) { if ($db_working) { // write test $insert_id = md5(uniqid()); - $db_write = $DB->query("INSERT INTO {$RCI->config['db_table_session']} (sess_id, created, ip, vars) VALUES (?, ".$DB->now().", '127.0.0.1', 'foo')", $insert_id); + $db_write = $DB->query("INSERT INTO {$RCI->config['db_prefix']}session (sess_id, created, ip, vars) VALUES (?, ".$DB->now().", '127.0.0.1', 'foo')", $insert_id); if ($db_write) { $RCI->pass('DB Write'); - $DB->query("DELETE FROM {$RCI->config['db_table_session']} WHERE sess_id=?", $insert_id); + $DB->query("DELETE FROM {$RCI->config['db_prefix']}session WHERE sess_id=?", $insert_id); } else { $RCI->fail('DB Write', $RCI->get_error()); diff --git a/plugins/acl/localization/ko_KR.inc b/plugins/acl/localization/ko_KR.inc index 85e33725d..524427a4e 100644 --- a/plugins/acl/localization/ko_KR.inc +++ b/plugins/acl/localization/ko_KR.inc @@ -19,81 +19,81 @@ $labels['sharing'] = 'ê³µìœ '; $labels['myrights'] = 'ì ‘ê·¼ 권한'; $labels['username'] = '사용ìž:'; -$labels['advanced'] = 'advanced mode'; +$labels['advanced'] = 'ê³ ê¸‰ 모드'; $labels['newuser'] = '엔트리 추가'; -$labels['actions'] = 'Access right actions...'; -$labels['anyone'] = 'All users (anyone)'; -$labels['anonymous'] = 'Guests (anonymous)'; +$labels['actions'] = 'ì ‘ê·¼ 권한 ë™ìž‘...'; +$labels['anyone'] = 'ëª¨ë“ ì‚¬ìš©ìž (아무나)'; +$labels['anonymous'] = 'ë°©ë¬¸ìž (ìµëª…)'; $labels['identifier'] = 'ì‹ë³„ìž'; -$labels['acll'] = 'Lookup'; -$labels['aclr'] = 'Read messages'; +$labels['acll'] = '조회'; +$labels['aclr'] = 'ì½ì€ 메시지'; $labels['acls'] = 'ì½ì€ ìƒíƒœë¡œ ìœ ì§€'; -$labels['aclw'] = 'Write flags'; -$labels['acli'] = 'Insert (Copy into)'; +$labels['aclw'] = '쓰기 깃발'; +$labels['acli'] = '삽입 (ë³µì‚¬í• ìœ„ì¹˜)'; $labels['aclp'] = '게시'; $labels['aclc'] = '하위 í´ë” 만들기'; $labels['aclk'] = '하위 í´ë” 만들기'; $labels['acld'] = '메시지 ì‚ì œ'; $labels['aclt'] = '메시지 ì‚ì œ'; -$labels['acle'] = 'Expunge'; +$labels['acle'] = 'ì˜êµ¬ ì œê±°'; $labels['aclx'] = 'í´ë” ì‚ì œ'; $labels['acla'] = '관리ìž'; -$labels['aclfull'] = 'Full control'; -$labels['aclother'] = 'Other'; -$labels['aclread'] = 'Read'; -$labels['aclwrite'] = 'Write'; -$labels['acldelete'] = 'Delete'; +$labels['aclfull'] = 'ì „ì²´ ì œì–´ê¶Œ'; +$labels['aclother'] = '기타'; +$labels['aclread'] = 'ì½ê¸°'; +$labels['aclwrite'] = '쓰기'; +$labels['acldelete'] = 'ì‚ì œ'; -$labels['shortacll'] = 'Lookup'; -$labels['shortaclr'] = 'Read'; -$labels['shortacls'] = 'Keep'; -$labels['shortaclw'] = 'Write'; -$labels['shortacli'] = 'Insert'; +$labels['shortacll'] = '조회'; +$labels['shortaclr'] = 'ì½ê¸°'; +$labels['shortacls'] = 'ë³´ê´€'; +$labels['shortaclw'] = '쓰기'; +$labels['shortacli'] = '삽입'; $labels['shortaclp'] = '게시'; -$labels['shortaclc'] = 'Create'; -$labels['shortaclk'] = 'Create'; -$labels['shortacld'] = 'Delete'; -$labels['shortaclt'] = 'Delete'; -$labels['shortacle'] = 'Expunge'; +$labels['shortaclc'] = 'ìƒì„±'; +$labels['shortaclk'] = 'ìƒì„±'; +$labels['shortacld'] = 'ì‚ì œ'; +$labels['shortaclt'] = 'ì‚ì œ'; +$labels['shortacle'] = '지움'; $labels['shortaclx'] = 'í´ë” ì‚ì œ'; -$labels['shortacla'] = '관리ìž'; +$labels['shortacla'] = '관리'; -$labels['shortaclother'] = 'Other'; -$labels['shortaclread'] = 'Read'; -$labels['shortaclwrite'] = 'Write'; -$labels['shortacldelete'] = 'Delete'; +$labels['shortaclother'] = '기타'; +$labels['shortaclread'] = 'ì½ê¸°'; +$labels['shortaclwrite'] = '쓱'; +$labels['shortacldelete'] = 'ì‚ì œ'; -$labels['longacll'] = 'The folder is visible on lists and can be subscribed to'; -$labels['longaclr'] = 'The folder can be opened for reading'; -$labels['longacls'] = 'Messages Seen flag can be changed'; -$labels['longaclw'] = 'Messages flags and keywords can be changed, except Seen and Deleted'; -$labels['longacli'] = 'í´ë”ì— ë©”ì‹œì§€ë¥¼ 복사하거나 ìž‘ì„±í• ìˆ˜ 있ìŒ'; -$labels['longaclp'] = 'ì´ í´ë”ë¡œ 메시지를 ê²Œì‹œí• ìˆ˜ 있ìŒ'; -$labels['longaclc'] = 'ì´ í´ë”ì˜ ë°”ë¡œ ë°‘ì— í´ë”를 ìƒì„±(ë˜ëŠ” ì´ë¦„ 변경)í• ìˆ˜ 있ìŒ'; -$labels['longaclk'] = 'ì´ í´ë”ì˜ ë°”ë¡œ ë°‘ì— í´ë”를 ìƒì„±(ë˜ëŠ” ì´ë¦„ 변경)í• ìˆ˜ 있ìŒ'; -$labels['longacld'] = '메시지 ì‚ì œ 플래그가 변경ë 수 있ìŒ'; -$labels['longaclt'] = '메시지 ì‚ì œ 플래그가 변경ë 수 있ìŒ'; -$labels['longacle'] = 'Messages can be expunged'; -$labels['longaclx'] = 'í´ë”를 ì‚ì œí•˜ê±°ë‚˜ ì´ë¦„ 변경 í• ìˆ˜ 있ìŒ'; +$labels['longacll'] = 'í´ë”ê°€ 목ë¡ì— ë‚˜íƒ€ë‚˜ê³ ë‹¤ìŒ ì‚¬ìš©ìžê°€ 구ë…í• ìˆ˜ 있ìŒ:'; +$labels['longaclr'] = 'ì½ê¸° 위해 í´ë”를 ì—´ 수 있ìŒ'; +$labels['longacls'] = 'ì½ì€ 메시지 ê¹ƒë°œì´ ë³€ê²½ë 수 있ìŒ'; +$labels['longaclw'] = '메시지 깃발 ë° í‚¤ì›Œë“œë¥¼ ë³€ê²½í• ìˆ˜ 있ìŒ, 다만 ì½ìŒ ë° ì‚ì œë¨ì€ ì œì™¸'; +$labels['longacli'] = '메시지를 í´ë”ì— ë³µì‚¬í•˜ê±°ë‚˜ ìž‘ì„±í• ìˆ˜ 있ìŒ'; +$labels['longaclp'] = '메시지를 ì´ í´ë”ë¡œ ê²Œì‹œí• ìˆ˜ 있ìŒ'; +$labels['longaclc'] = 'ì´ í´ë”ì˜ ë°”ë¡œ ì•„ëž˜ì— í´ë”를 ìƒì„±(ë˜ëŠ” ì´ë¦„ 변경)í• ìˆ˜ 있ìŒ'; +$labels['longaclk'] = 'ì´ í´ë”ì˜ ë°”ë¡œ ì•„ëž˜ì— í´ë”를 ìƒì„±(ë˜ëŠ” ì´ë¦„ 변경)í• ìˆ˜ 있ìŒ'; +$labels['longacld'] = '메시지 ì‚ì œ ê¹ƒë°œì´ ë³€ê²½ë 수 있ìŒ'; +$labels['longaclt'] = '메시지 ì‚ì œ ê¹ƒë°œì´ ë³€ê²½ë 수 있ìŒ'; +$labels['longacle'] = '메시지가 ì˜êµ¬ ì œê±°ë 수 있ìŒ'; +$labels['longaclx'] = 'í´ë”를 ì‚ì œí•˜ê±°ë‚˜ ì´ë¦„ì„ ë³€ê²½ í• ìˆ˜ 있ìŒ'; $labels['longacla'] = 'í´ë”ì˜ ì ‘ê·¼ ê¶Œí•œì„ ë³€ê²½í• ìˆ˜ 있ìŒ'; $labels['longaclfull'] = 'í´ë” 관리를 í¬í•¨í•œ ëª¨ë“ ì œì–´ê¶Œ'; -$labels['longaclread'] = 'The folder can be opened for reading'; -$labels['longaclwrite'] = 'ë©”ì‹œì§€ì— í‘œì‹œí•˜ê±°ë‚˜, í´ë”ë¡œ 메시지를 복사하거나 ìž‘ì„±í• ìˆ˜ 있ìŒ'; +$labels['longaclread'] = 'í´ë”를 ì—´ì–´ ì½ì„ 수 있ìŒ'; +$labels['longaclwrite'] = 'ë©”ì‹œì§€ì— í‘œì‹œí•˜ê±°ë‚˜, í´ë”ë¡œ ì´ë™í•˜ê±°ë‚˜ ë³µì‚¬í• ìˆ˜ 있ìŒ'; $labels['longacldelete'] = '메시지를 ì‚ì œí• ìˆ˜ 있ìŒ'; -$messages['deleting'] = 'ì ‘ê·¼ 권한 ì‚ì œ 중...'; -$messages['saving'] = 'ì ‘ê·¼ 권한 ì €ìž¥ 중...'; -$messages['updatesuccess'] = 'ì ‘ê·¼ ê¶Œí•œì„ ë³€ê²½í•˜ëŠ”ë° ì„±ê³µ 함.'; -$messages['deletesuccess'] = 'ì ‘ê·¼ ê¶Œí•œì„ ì‚ì œí•˜ëŠ”ë° ì„±ê³µ 함.'; -$messages['createsuccess'] = 'ì ‘ê·¼ ê¶Œí•œì„ ì¶”ê°€í•˜ëŠ”ë° ì„±ê³µ 함.'; -$messages['updateerror'] = 'ì ‘ê·¼ ê¶Œí•œì„ ê°±ì‹ í• ìˆ˜ ì—†ìŒ.'; +$messages['deleting'] = 'ì ‘ê·¼ ê¶Œí•œì„ ì‚ì œí•˜ëŠ” 중...'; +$messages['saving'] = 'ì ‘ê·¼ ê¶Œí•œì„ ì €ìž¥í•˜ëŠ” 중...'; +$messages['updatesuccess'] = 'ì ‘ê·¼ ê¶Œí•œì„ ì„±ê³µì 으로 변경함.'; +$messages['deletesuccess'] = 'ì ‘ê·¼ ê¶Œí•œì„ ì„±ê³µì 으로 ì‚ì œí•¨.'; +$messages['createsuccess'] = 'ì ‘ê·¼ ê¶Œí•œì„ ì„±ê³µì 으로 추가함.'; +$messages['updateerror'] = 'ì ‘ê·¼ ê¶Œí•œì„ ì—…ë°ì´íŠ¸í• 수 ì—†ìŒ.'; $messages['deleteerror'] = 'ì ‘ê·¼ ê¶Œí•œì„ ì‚ì œí• ìˆ˜ ì—†ìŒ.'; $messages['createerror'] = 'ì ‘ê·¼ ê¶Œí•œì„ ì¶”ê°€í• ìˆ˜ ì—†ìŒ.'; -$messages['deleteconfirm'] = 'ì„ íƒí•œ 사용ìž(들)ì˜ ì ‘ê·¼ ê¶Œí•œì„ ì‚ì œí•˜ê³ ìž í•˜ëŠ” ê²ƒì´ í™•ì‹¤ 합니까?'; +$messages['deleteconfirm'] = 'ì •ë§ë¡œ ì„ íƒí•œ 사용ìžì˜ ì ‘ê·¼ ê¶Œí•œì„ ì‚ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?'; $messages['norights'] = 'ì§€ì •ëœ ê¶Œí•œì´ ì—†ìŒ!'; -$messages['nouser'] = 'ì§€ì •ëœ usernameì´ ì—†ìŒ!'; +$messages['nouser'] = 'ì§€ì •ëœ ì‚¬ìš©ìžëª…ì´ ì—†ìŒ!'; ?> diff --git a/plugins/archive/localization/az_AZ.inc b/plugins/archive/localization/az_AZ.inc index 8aab6f2da..19a409d41 100644 --- a/plugins/archive/localization/az_AZ.inc +++ b/plugins/archive/localization/az_AZ.inc @@ -20,15 +20,15 @@ $labels = array(); $labels['buttontext'] = 'Arxiv'; $labels['buttontitle'] = 'Mesajı arxivÉ™ göndÉ™r'; $labels['archived'] = 'ArxivÉ™ göndÉ™rildi'; -$labels['archivedreload'] = 'Successfully archived. Reload the page to see the new archive folders.'; -$labels['archiveerror'] = 'Some messages could not be archived'; +$labels['archivedreload'] = 'MüvÉ™ffÉ™qiyyÉ™tlÉ™ arxivləşdirildi. Yeni arxiv qovluqlarını görmÉ™k üçün sÉ™hifÉ™ni yenilÉ™yin.'; +$labels['archiveerror'] = 'BÉ™zi mÉ™ktublar arxivləşdirilÉ™ bilinmirlÉ™r'; $labels['archivefolder'] = 'Arxiv'; -$labels['settingstitle'] = 'Archive'; -$labels['archivetype'] = 'Divide archive by'; -$labels['archivetypeyear'] = 'Year (e.g. Archive/2012)'; -$labels['archivetypemonth'] = 'Month (e.g. Archive/2012/06)'; -$labels['archivetypefolder'] = 'Original folder'; -$labels['archivetypesender'] = 'Sender email'; -$labels['unkownsender'] = 'unknown'; +$labels['settingstitle'] = 'Arxiv'; +$labels['archivetype'] = 'Arxivi böl: '; +$labels['archivetypeyear'] = 'Ä°l (mÉ™s. Arxiv/2012)'; +$labels['archivetypemonth'] = 'Ay (mÉ™s. Arxiv/2012/06)'; +$labels['archivetypefolder'] = 'Orijinal qovluq'; +$labels['archivetypesender'] = 'GöndÉ™rÉ™nin E-Poçtu'; +$labels['unkownsender'] = 'namÉ™lum'; ?> diff --git a/plugins/archive/localization/es_AR.inc b/plugins/archive/localization/es_AR.inc index ad9e84add..5fb082497 100644 --- a/plugins/archive/localization/es_AR.inc +++ b/plugins/archive/localization/es_AR.inc @@ -20,15 +20,15 @@ $labels = array(); $labels['buttontext'] = 'Archivo'; $labels['buttontitle'] = 'Archivar este mensaje'; $labels['archived'] = 'Mensaje Archivado'; -$labels['archivedreload'] = 'Successfully archived. Reload the page to see the new archive folders.'; -$labels['archiveerror'] = 'Some messages could not be archived'; +$labels['archivedreload'] = 'Archivado satisfactoriamente. Recarga la página para ver las nuevas capetas archivadas.'; +$labels['archiveerror'] = 'Algunos mensajes no pudieron archivarse'; $labels['archivefolder'] = 'Archivo'; -$labels['settingstitle'] = 'Archive'; -$labels['archivetype'] = 'Divide archive by'; -$labels['archivetypeyear'] = 'Year (e.g. Archive/2012)'; -$labels['archivetypemonth'] = 'Month (e.g. Archive/2012/06)'; -$labels['archivetypefolder'] = 'Original folder'; -$labels['archivetypesender'] = 'Sender email'; -$labels['unkownsender'] = 'unknown'; +$labels['settingstitle'] = 'Archivo'; +$labels['archivetype'] = 'Separar archivo por'; +$labels['archivetypeyear'] = 'Año (ej. Archivo/2012)'; +$labels['archivetypemonth'] = 'Mes (ej. Archivo/2012/06)'; +$labels['archivetypefolder'] = 'Carpeta original'; +$labels['archivetypesender'] = 'Remitente del correo'; +$labels['unkownsender'] = 'desconocido'; ?> diff --git a/plugins/archive/localization/ko_KR.inc b/plugins/archive/localization/ko_KR.inc index 96a7ac404..4226420a0 100644 --- a/plugins/archive/localization/ko_KR.inc +++ b/plugins/archive/localization/ko_KR.inc @@ -19,16 +19,16 @@ $labels = array(); $labels['buttontext'] = 'ë³´ê´€'; $labels['buttontitle'] = 'ì´ ë©”ì‹œì§€ë¥¼ ë³´ê´€'; -$labels['archived'] = '성공ì 으로 ë³´ê´€ ë¨'; -$labels['archivedreload'] = 'Successfully archived. Reload the page to see the new archive folders.'; -$labels['archiveerror'] = 'Some messages could not be archived'; +$labels['archived'] = '성공ì 으로 ë³´ê´€ë¨'; +$labels['archivedreload'] = '성공ì 으로 ë³´ê´€ë¨. 페ì´ì§€ë¥¼ 다시 불러와서 새 ë³´ê´€ í´ë”를 확ì¸í•˜ì„¸ìš”.'; +$labels['archiveerror'] = 'ì¼ë¶€ 메시지가 ë³´ê´€ë˜ì§€ ì•ŠìŒ'; $labels['archivefolder'] = 'ë³´ê´€'; -$labels['settingstitle'] = 'Archive'; -$labels['archivetype'] = 'Divide archive by'; -$labels['archivetypeyear'] = 'Year (e.g. Archive/2012)'; -$labels['archivetypemonth'] = 'Month (e.g. Archive/2012/06)'; -$labels['archivetypefolder'] = 'Original folder'; -$labels['archivetypesender'] = 'Sender email'; -$labels['unkownsender'] = 'unknown'; +$labels['settingstitle'] = 'ë³´ê´€'; +$labels['archivetype'] = 'ë³´ê´€ëœ ë©”ì‹œì§€ ì •ë¦¬ 기준'; +$labels['archivetypeyear'] = 'ì—°ë„ (예: ë³´ê´€ 편지함/2012)'; +$labels['archivetypemonth'] = 'ì›” (예: ë³´ê´€ 편지함/2012/06)'; +$labels['archivetypefolder'] = 'ì›ë³¸ í´ë”'; +$labels['archivetypesender'] = 'ë°œì‹ ì¸ ì´ë©”ì¼'; +$labels['unkownsender'] = 'ì•Œ 수 ì—†ìŒ'; ?> diff --git a/plugins/archive/localization/lt_LT.inc b/plugins/archive/localization/lt_LT.inc index 36046277a..069a65665 100644 --- a/plugins/archive/localization/lt_LT.inc +++ b/plugins/archive/localization/lt_LT.inc @@ -20,15 +20,15 @@ $labels = array(); $labels['buttontext'] = 'Archyvuoti'; $labels['buttontitle'] = 'Perkelti šį laiÅ¡kÄ… į archyvÄ…'; $labels['archived'] = 'LaiÅ¡kas sÄ—kmingai perkeltas į archyvÄ…'; -$labels['archivedreload'] = 'Successfully archived. Reload the page to see the new archive folders.'; -$labels['archiveerror'] = 'Some messages could not be archived'; +$labels['archivedreload'] = 'SÄ—kmingai perkelta į archyvÄ…. IÅ¡ naujo įkelkite puslapį, kad pamatytumÄ—t pasikeitimus.'; +$labels['archiveerror'] = 'Ä® archyvÄ… nepavyko perkelti keleto laiÅ¡kų.'; $labels['archivefolder'] = 'Archyvuoti'; -$labels['settingstitle'] = 'Archive'; -$labels['archivetype'] = 'Divide archive by'; -$labels['archivetypeyear'] = 'Year (e.g. Archive/2012)'; -$labels['archivetypemonth'] = 'Month (e.g. Archive/2012/06)'; -$labels['archivetypefolder'] = 'Original folder'; -$labels['archivetypesender'] = 'Sender email'; -$labels['unkownsender'] = 'unknown'; +$labels['settingstitle'] = 'Archyvuoti'; +$labels['archivetype'] = 'Padalinti archyvÄ… pagal'; +$labels['archivetypeyear'] = 'Metai (pvz. Archyvas/2012)'; +$labels['archivetypemonth'] = 'MÄ—nesis (pvz. Archyvas/2012/06)'; +$labels['archivetypefolder'] = 'Tikrasis aplankas'; +$labels['archivetypesender'] = 'SiuntÄ—jo el. paÅ¡to adresas'; +$labels['unkownsender'] = 'nežinomas'; ?> diff --git a/plugins/archive/localization/tr_TR.inc b/plugins/archive/localization/tr_TR.inc index 765498301..b6960ea89 100644 --- a/plugins/archive/localization/tr_TR.inc +++ b/plugins/archive/localization/tr_TR.inc @@ -20,15 +20,15 @@ $labels = array(); $labels['buttontext'] = 'ArÅŸiv'; $labels['buttontitle'] = 'Bu postayı arÅŸivle'; $labels['archived'] = 'BaÅŸarıyla arÅŸivlendi'; -$labels['archivedreload'] = 'Successfully archived. Reload the page to see the new archive folders.'; -$labels['archiveerror'] = 'Some messages could not be archived'; +$labels['archivedreload'] = 'BaÅŸarıyla arÅŸivlendi. Yeni arÅŸiv dosyalarını görmek için sayfayı yenileyin.'; +$labels['archiveerror'] = 'Bazı mesajlar arÅŸivlenemedi.'; $labels['archivefolder'] = 'ArÅŸiv'; -$labels['settingstitle'] = 'Archive'; -$labels['archivetype'] = 'Divide archive by'; -$labels['archivetypeyear'] = 'Year (e.g. Archive/2012)'; -$labels['archivetypemonth'] = 'Month (e.g. Archive/2012/06)'; -$labels['archivetypefolder'] = 'Original folder'; -$labels['archivetypesender'] = 'Sender email'; -$labels['unkownsender'] = 'unknown'; +$labels['settingstitle'] = 'ArÅŸiv'; +$labels['archivetype'] = 'ArÅŸivi bunla böl'; +$labels['archivetypeyear'] = 'Yıl (ArÅŸiv/2012)'; +$labels['archivetypemonth'] = 'Ay(ArÅŸiv/2012/06)'; +$labels['archivetypefolder'] = 'Özgün dosya'; +$labels['archivetypesender'] = 'E-Posta Göndericisi'; +$labels['unkownsender'] = 'bilinmeyen'; ?> diff --git a/plugins/filesystem_attachments/filesystem_attachments.php b/plugins/filesystem_attachments/filesystem_attachments.php index fa147795f..d952e5a75 100644 --- a/plugins/filesystem_attachments/filesystem_attachments.php +++ b/plugins/filesystem_attachments/filesystem_attachments.php @@ -60,6 +60,7 @@ class filesystem_attachments extends rcube_plugin $args['id'] = $this->file_id(); $args['path'] = $tmpfname; $args['status'] = true; + @chmod($tmpfname, 0600); // set correct permissions (#1488996) // Note the file for later cleanup $_SESSION['plugins']['filesystem_attachments'][$group][] = $tmpfname; diff --git a/plugins/help/localization/ko_KR.inc b/plugins/help/localization/ko_KR.inc index a589d0ce1..836da6639 100644 --- a/plugins/help/localization/ko_KR.inc +++ b/plugins/help/localization/ko_KR.inc @@ -19,6 +19,6 @@ $labels = array(); $labels['help'] = 'ë„움ë§'; $labels['about'] = 'ì •ë³´'; -$labels['license'] = 'ë¼ì´ì„¼ìŠ¤'; +$labels['license'] = 'ë¼ì´ì„ 스'; ?> diff --git a/plugins/managesieve/localization/bs_BA.inc b/plugins/managesieve/localization/bs_BA.inc index 6d1ec8d2c..7d21dbd9f 100644 --- a/plugins/managesieve/localization/bs_BA.inc +++ b/plugins/managesieve/localization/bs_BA.inc @@ -57,9 +57,9 @@ $labels['sender'] = 'PoÅ¡iljaoc'; $labels['recipient'] = 'Primaoc'; $labels['vacationaddresses'] = 'Moje dodatne email adrese (odvojite zarezima):'; $labels['vacationdays'] = 'Frekvencija slanja poruka (u danima):'; -$labels['vacationinterval'] = 'How often send messages:'; -$labels['days'] = 'days'; -$labels['seconds'] = 'seconds'; +$labels['vacationinterval'] = 'Frekvencija slanja poruka:'; +$labels['days'] = 'dana'; +$labels['seconds'] = 'sekundi'; $labels['vacationreason'] = 'Tijelo poruke (razlog za odmor):'; $labels['vacationsubject'] = 'Naslov poruke:'; $labels['rulestop'] = 'Prestani procjenjivati pravila'; diff --git a/plugins/new_user_dialog/localization/ko_KR.inc b/plugins/new_user_dialog/localization/ko_KR.inc index 82240f37d..d9b519475 100644 --- a/plugins/new_user_dialog/localization/ko_KR.inc +++ b/plugins/new_user_dialog/localization/ko_KR.inc @@ -17,7 +17,7 @@ */ $labels = array(); -$labels['identitydialogtitle'] = 'ìˆ˜ì‹ ìžì˜ ì‹ ì›ì„ 채우기 ë°”ëžë‹ˆë‹¤.'; -$labels['identitydialoghint'] = 'ì´ ë°•ìŠ¤ëŠ” 최초로 로그ì¸í• 때만 나타납니다.'; +$labels['identitydialogtitle'] = 'ìˆ˜ì‹ ì¸ì˜ ì‹ ì›ì„ 완성하시기 ë°”ëžë‹ˆë‹¤.'; +$labels['identitydialoghint'] = 'ì´ ìƒìžëŠ” 최초로 로그ì¸í• 때만 나타납니다.'; ?>
\ No newline at end of file diff --git a/plugins/new_user_dialog/localization/nl_NL.inc b/plugins/new_user_dialog/localization/nl_NL.inc index 4d5d41185..c5d392f98 100644 --- a/plugins/new_user_dialog/localization/nl_NL.inc +++ b/plugins/new_user_dialog/localization/nl_NL.inc @@ -17,7 +17,7 @@ */ $labels = array(); -$labels['identitydialogtitle'] = 'Vul uw correcte identiteitgegevens in a.u.b.'; -$labels['identitydialoghint'] = 'Dit scherm verschijnt enkel bij uw eerste login.'; +$labels['identitydialogtitle'] = 'Vul alstublieft uw afzendergegevens in.'; +$labels['identitydialoghint'] = 'Dit scherm verschijnt eenmalig bij uw eerste aanmelding.'; ?>
\ No newline at end of file diff --git a/plugins/new_user_dialog/new_user_dialog.php b/plugins/new_user_dialog/new_user_dialog.php index 871384e47..8d641c946 100644 --- a/plugins/new_user_dialog/new_user_dialog.php +++ b/plugins/new_user_dialog/new_user_dialog.php @@ -126,7 +126,7 @@ class new_user_dialog extends rcube_plugin ); // don't let the user alter the e-mail address if disabled by config - if ($identities_level == 1 || $identities_level == 3) + if (in_array($identities_level, array(1,3,4))) $save_data['email'] = $identity['email']; else $save_data['email'] = rcube_utils::idn_to_ascii($save_data['email']); @@ -141,5 +141,3 @@ class new_user_dialog extends rcube_plugin } } - -?> diff --git a/plugins/new_user_dialog/package.xml b/plugins/new_user_dialog/package.xml index 0bca1d9d4..c9f1965de 100644 --- a/plugins/new_user_dialog/package.xml +++ b/plugins/new_user_dialog/package.xml @@ -13,10 +13,9 @@ <email>roundcube@gmail.com</email> <active>yes</active> </lead> - <date>2012-01-16</date> - <time>17:00</time> + <date>2013-04-16</date> <version> - <release>1.5</release> + <release>1.6</release> <api>1.0</api> </version> <stability> @@ -25,8 +24,7 @@ </stability> <license uri="http://www.gnu.org/licenses/gpl.html">GNU GPLv3+</license> <notes> -- Use jquery UI to render the dialog -- Fixed IDNA encoding/decoding of e-mail addresses (#1487909) +- Fix handling of identities_level=4 </notes> <contents> <dir baseinstalldir="/" name="/"> @@ -150,5 +148,22 @@ <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license> <notes>- Use jquery UI to render the dialog</notes> </release> + <release> + <date>2012-01-16</date> + <time>17:00</time> + <version> + <release>1.5</release> + <api>1.0</api> + </version> + <stability> + <release>stable</release> + <api>stable</api> + </stability> + <license uri="http://www.gnu.org/licenses/gpl.html">GNU GPLv3+</license> + <notes> +- Use jquery UI to render the dialog +- Fixed IDNA encoding/decoding of e-mail addresses (#1487909) + </notes> + </release> </changelog> </package> diff --git a/plugins/newmail_notifier/localization/nl_NL.inc b/plugins/newmail_notifier/localization/nl_NL.inc index e18a6ff2d..01f97e4ce 100644 --- a/plugins/newmail_notifier/localization/nl_NL.inc +++ b/plugins/newmail_notifier/localization/nl_NL.inc @@ -16,14 +16,14 @@ For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-newmail_notifier/ */ -$labels['basic'] = 'Toon browsermelding bij nieuw bericht'; -$labels['desktop'] = 'Toon desktopmelding bij nieuw bericht'; -$labels['sound'] = 'Speel geluid bij nieuw bericht'; +$labels['basic'] = 'Toon melding in browser bij nieuw bericht'; +$labels['desktop'] = 'Toon melding op bureaublad bij nieuw bericht'; +$labels['sound'] = 'Geluid afspelen bij nieuw bericht'; $labels['test'] = 'Test'; $labels['title'] = 'Nieuwe e-mail!'; $labels['body'] = 'U heeft een nieuw bericht ontvangen.'; $labels['testbody'] = 'Dit is een testmelding.'; -$labels['desktopdisabled'] = 'Desktopmeldingen zijn uitgeschakeld in uw browser.'; -$labels['desktopunsupported'] = 'Uw browser ondersteunt geen desktopmeldingen.'; +$labels['desktopdisabled'] = 'Bureaubladmeldingen zijn uitgeschakeld in uw browser.'; +$labels['desktopunsupported'] = 'Uw browser ondersteunt geen bureaubladmeldingen.'; ?> diff --git a/plugins/password/README b/plugins/password/README index 25af8cbcd..2c57e0cf6 100644 --- a/plugins/password/README +++ b/plugins/password/README @@ -192,8 +192,12 @@ 2.6. cPanel (cpanel) -------------------- - You can specify parameters for HTTP connection to cPanel's admin - interface. See config.inc.php.dist file for more info. + Install cPanel XMLAPI Client Class into Roundcube program/lib directory + or any other place in PHP include path. You can get the class from + https://raw.github.com/CpanelInc/xmlapi-php/master/xmlapi.php + + You can configure parameters for connection to cPanel's API interface. + See config.inc.php.dist file for more info. 2.7. XIMSS/Communigate (ximms) diff --git a/plugins/password/config.inc.php.dist b/plugins/password/config.inc.php.dist index e2d8eeb10..9256829aa 100644 --- a/plugins/password/config.inc.php.dist +++ b/plugins/password/config.inc.php.dist @@ -269,13 +269,7 @@ $rcmail_config['password_cpanel_username'] = 'username'; $rcmail_config['password_cpanel_password'] = 'password'; // The cPanel port to use -$rcmail_config['password_cpanel_port'] = 2082; - -// Using ssl for cPanel connections? -$rcmail_config['password_cpanel_ssl'] = true; - -// The cPanel theme in use -$rcmail_config['password_cpanel_theme'] = 'x'; +$rcmail_config['password_cpanel_port'] = 2087; // XIMSS (Communigate server) Driver options diff --git a/plugins/password/drivers/cpanel.php b/plugins/password/drivers/cpanel.php index 79887109b..b71c33ec1 100644 --- a/plugins/password/drivers/cpanel.php +++ b/plugins/password/drivers/cpanel.php @@ -4,95 +4,43 @@ * cPanel Password Driver * * Driver that adds functionality to change the users cPanel password. - * The cPanel PHP API code has been taken from: http://www.phpclasses.org/browse/package/3534.html + * Originally written by Fulvio Venturelli <fulvio@venturelli.org> * - * This driver has been tested with Hostmonster hosting and seems to work fine. + * Completely rewritten using the cPanel API2 call Email::passwdpop + * as opposed to the original coding against the UI, which is a fragile method that + * makes the driver to always return a failure message for any language other than English + * see http://trac.roundcube.net/ticket/1487015 * - * @version 2.0 - * @author Fulvio Venturelli <fulvio@venturelli.org> + * This driver has been tested with o2switch hosting and seems to work fine. + * + * @version 3.0 + * @author Christian Chech <christian@chech.fr> */ class rcube_cpanel_password { public function save($curpas, $newpass) { + require_once 'xmlapi.php'; + $rcmail = rcmail::get_instance(); - // Create a cPanel email object - $cPanel = new emailAccount($rcmail->config->get('password_cpanel_host'), - $rcmail->config->get('password_cpanel_username'), - $rcmail->config->get('password_cpanel_password'), - $rcmail->config->get('password_cpanel_port'), - $rcmail->config->get('password_cpanel_ssl'), - $rcmail->config->get('password_cpanel_theme'), - $_SESSION['username'] ); + $this->cuser = $rcmail->config->get('password_cpanel_username'); + + // Setup the xmlapi connection + $this->xmlapi = new xmlapi($rcmail->config->get('password_cpanel_host')); + $this->xmlapi->set_port($rcmail->config->get('password_cpanel_port')); + $this->xmlapi->password_auth($this->cuser, $rcmail->config->get('password_cpanel_password')); + $this->xmlapi->set_output('json'); + $this->xmlapi->set_debug(0); - if ($cPanel->setPassword($newpass)) { + if ($this->setPassword($_SESSION['username'], $newpass)) { return PASSWORD_SUCCESS; } else { return PASSWORD_ERROR; } } -} - - -class HTTP -{ - function HTTP($host, $username, $password, $port, $ssl, $theme) - { - $this->ssl = $ssl ? 'ssl://' : ''; - $this->username = $username; - $this->password = $password; - $this->theme = $theme; - $this->auth = base64_encode($username . ':' . $password); - $this->port = $port; - $this->host = $host; - $this->path = '/frontend/' . $theme . '/'; - } - - function getData($url, $data = '') - { - $url = $this->path . $url; - if (is_array($data)) { - $url = $url . '?'; - foreach ($data as $key => $value) { - $url .= urlencode($key) . '=' . urlencode($value) . '&'; - } - $url = substr($url, 0, -1); - } - - $response = ''; - $fp = fsockopen($this->ssl . $this->host, $this->port); - if (!$fp) { - return false; - } - - $out = 'GET ' . $url . ' HTTP/1.0' . "\r\n"; - $out .= 'Authorization: Basic ' . $this->auth . "\r\n"; - $out .= 'Connection: Close' . "\r\n\r\n"; - fwrite($fp, $out); - while (!feof($fp)) { - $response .= @fgets($fp); - } - fclose($fp); - return $response; - } -} - - -class emailAccount -{ - function emailAccount($host, $username, $password, $port, $ssl, $theme, $address) - { - $this->HTTP = new HTTP($host, $username, $password, $port, $ssl, $theme); - if (strpos($address, '@')) { - list($this->email, $this->domain) = explode('@', $address); - } - else { - list($this->email, $this->domain) = array($address, ''); - } - } /** * Change email account password @@ -101,16 +49,24 @@ class emailAccount * @param string $password email account password * @return bool */ - function setPassword($password) + function setPassword($address, $password) { - $data['email'] = $this->email; - $data['domain'] = $this->domain; + if (strpos($address, '@')) { + list($data['email'], $data['domain']) = explode('@', $address); + } + else { + list($data['email'], $data['domain']) = array($address, ''); + } + $data['password'] = $password; - $response = $this->HTTP->getData('mail/dopasswdpop.html', $data); - if (strpos($response, 'success') && !strpos($response, 'failure')) { + $query = $this->xmlapi->api2_query($this->cuser, 'Email', 'passwdpop', $data); + $query = json_decode($query, true); + + if ($query['cpanelresult']['data'][0]['result'] == 1) { return true; } + return false; } } diff --git a/plugins/password/localization/nl_NL.inc b/plugins/password/localization/nl_NL.inc index c2c4599bc..e5b634602 100644 --- a/plugins/password/localization/nl_NL.inc +++ b/plugins/password/localization/nl_NL.inc @@ -17,21 +17,21 @@ */ $labels = array(); -$labels['changepasswd'] = 'Wijzig Wachtwoord'; -$labels['curpasswd'] = 'Huidig Wachtwoord:'; -$labels['newpasswd'] = 'Nieuw Wachtwoord:'; -$labels['confpasswd'] = 'Bevestig Nieuw Wachtwoord:'; +$labels['changepasswd'] = 'Wachtwoord wijzigen'; +$labels['curpasswd'] = 'Huidig wachtwoord:'; +$labels['newpasswd'] = 'Nieuw wachtwoord:'; +$labels['confpasswd'] = 'Bevestig nieuw wachtwoord:'; $messages = array(); -$messages['nopassword'] = 'Vul een wachtwoord in.'; -$messages['nocurpassword'] = 'vul het huidige wachtwoord in.'; +$messages['nopassword'] = 'Vul uw nieuwe wachtwoord in.'; +$messages['nocurpassword'] = 'Vul uw huidige wachtwoord in.'; $messages['passwordincorrect'] = 'Huidig wachtwoord is onjuist.'; $messages['passwordinconsistency'] = 'Wachtwoorden komen niet overeen, probeer het opnieuw.'; -$messages['crypterror'] = 'De server mist een functie om uw wachtwoord et beveiligen.'; -$messages['connecterror'] = 'Kan het nieuwe wachtwoord niet opslaan. Verbindingsfout.'; -$messages['internalerror'] = 'Uw wachtwoord kan niet worden opgeslagen.'; +$messages['crypterror'] = 'Nieuwe wachtwoord kan niet opgeslagen worden; de server mist een versleutelfunctie.'; +$messages['connecterror'] = 'Nieuwe wachtwoord kan niet opgeslagen worden; verbindingsfout.'; +$messages['internalerror'] = 'Uw nieuwe wachtwoord kan niet worden opgeslagen.'; $messages['passwordshort'] = 'Het wachtwoord moet minimaal $length tekens lang zijn.'; -$messages['passwordweak'] = 'Het wachtwoord moet minimaal één nummer en één leesteken bevatten.'; +$messages['passwordweak'] = 'Het wachtwoord moet minimaal één cijfer en één leesteken bevatten.'; $messages['passwordforbidden'] = 'Het wachtwoord bevat tekens die niet toegestaan zijn.'; ?> diff --git a/plugins/password/package.xml b/plugins/password/package.xml index 9a056dec6..be917917f 100644 --- a/plugins/password/package.xml +++ b/plugins/password/package.xml @@ -15,9 +15,9 @@ <email>alec@alec.pl</email> <active>yes</active> </lead> - <date>2012-11-15</date> + <date>2013-03-30</date> <version> - <release>3.2</release> + <release>3.3</release> <api>2.0</api> </version> <stability> @@ -26,8 +26,7 @@ </stability> <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license> <notes> -- Fix wrong (non-specific) error message on crypt or connection error (#1488808) -- Added option to define IMAP hosts that support password changes - password_hosts +Added new cPanel driver - fixes localization related issues (#1487015) </notes> <contents> <dir baseinstalldir="/" name="/"> @@ -347,5 +346,21 @@ - Added Samba password (#1488364) </notes> </release> + <release> + <date>2012-11-15</date> + <version> + <release>3.2</release> + <api>2.0</api> + </version> + <stability> + <release>stable</release> + <api>stable</api> + </stability> + <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license> + <notes> +- Fix wrong (non-specific) error message on crypt or connection error (#1488808) +- Added option to define IMAP hosts that support password changes - password_hosts + </notes> + </release> </changelog> </package> diff --git a/plugins/userinfo/localization/nl_NL.inc b/plugins/userinfo/localization/nl_NL.inc index 8c636e700..8c46ca6c4 100644 --- a/plugins/userinfo/localization/nl_NL.inc +++ b/plugins/userinfo/localization/nl_NL.inc @@ -19,7 +19,7 @@ $labels = array(); $labels['userinfo'] = 'Gebruikersinformatie'; $labels['created'] = 'Aangemaakt'; -$labels['lastlogin'] = 'Laatste login'; +$labels['lastlogin'] = 'Laatste aanmelding'; $labels['defaultidentity'] = 'Standaardidentiteit'; ?>
\ No newline at end of file diff --git a/plugins/virtuser_query/virtuser_query.php b/plugins/virtuser_query/virtuser_query.php index 675eb7c1b..9e3dc9071 100644 --- a/plugins/virtuser_query/virtuser_query.php +++ b/plugins/virtuser_query/virtuser_query.php @@ -59,7 +59,7 @@ class virtuser_query extends rcube_plugin { $dbh = $this->get_dbh(); - $sql_result = $dbh->query(preg_replace('/%u/', $dbh->escapeSimple($p['user']), $this->config['email'])); + $sql_result = $dbh->query(preg_replace('/%u/', $dbh->escape($p['user']), $this->config['email'])); while ($sql_arr = $dbh->fetch_array($sql_result)) { if (strpos($sql_arr[0], '@')) { @@ -78,8 +78,9 @@ class virtuser_query extends rcube_plugin $result[] = $sql_arr[0]; } - if ($p['first']) + if ($p['first']) { break; + } } } @@ -95,7 +96,7 @@ class virtuser_query extends rcube_plugin { $dbh = $this->get_dbh(); - $sql_result = $dbh->query(preg_replace('/%m/', $dbh->escapeSimple($p['email']), $this->config['user'])); + $sql_result = $dbh->query(preg_replace('/%m/', $dbh->escape($p['email']), $this->config['user'])); if ($sql_arr = $dbh->fetch_array($sql_result)) { $p['user'] = $sql_arr[0]; @@ -111,7 +112,7 @@ class virtuser_query extends rcube_plugin { $dbh = $this->get_dbh(); - $sql_result = $dbh->query(preg_replace('/%u/', $dbh->escapeSimple($p['user']), $this->config['host'])); + $sql_result = $dbh->query(preg_replace('/%u/', $dbh->escape($p['user']), $this->config['host'])); if ($sql_arr = $dbh->fetch_array($sql_result)) { $p['host'] = $sql_arr[0]; diff --git a/program/include/bc.php b/program/include/bc.php index d8356338d..df018320c 100644 --- a/program/include/bc.php +++ b/program/include/bc.php @@ -287,7 +287,7 @@ function rcmail_remote_ip() function rcube_check_referer() { - return rcmail::check_referer(); + return rcube_utils::check_referer(); } function rcube_timer() diff --git a/program/include/iniset.php b/program/include/iniset.php index b32ae4e8e..919cc7682 100644 --- a/program/include/iniset.php +++ b/program/include/iniset.php @@ -24,21 +24,6 @@ define('RCMAIL_VERSION', '1.0-git'); define('RCMAIL_START', microtime(true)); -$config = array( - // Some users are not using Installer, so we'll check some - // critical PHP settings here. Only these, which doesn't provide - // an error/warning in the logs later. See (#1486307). - 'suhosin.session.encrypt' => 0, - 'session.auto_start' => 0, - 'file_uploads' => 1, -); -foreach ($config as $optname => $optval) { - if ($optval != ini_get($optname) && @ini_set($optname, $optval) === false) { - die("ERROR: Wrong '$optname' option value and it wasn't possible to set it to required value ($optval).\n" - ."Check your PHP configuration (including php_admin_flag)."); - } -} - if (!defined('INSTALL_PATH')) { define('INSTALL_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/'); } @@ -75,6 +60,11 @@ require_once 'Roundcube/bootstrap.php'; // register autoloader for rcmail app classes spl_autoload_register('rcmail_autoload'); +// include composer autoloader (if available) +if (file_exists('vendor/autoload.php')) { + require 'vendor/autoload.php'; +} + // backward compatybility (to be removed) require_once INSTALL_PATH . 'program/include/bc.php'; diff --git a/program/include/rcmail_output_html.php b/program/include/rcmail_output_html.php index 6100269b9..d8996edbf 100644 --- a/program/include/rcmail_output_html.php +++ b/program/include/rcmail_output_html.php @@ -873,6 +873,7 @@ class rcmail_output_html extends rcmail_output // include a file case 'include': $old_base_path = $this->base_path; + if (!empty($attrib['skin_path'])) $attrib['skinpath'] = $attrib['skin_path']; if ($path = $this->get_skin_file($attrib['file'], $skin_path, $attrib['skinpath'])) { $this->base_path = preg_replace('!plugins/\w+/!', '', $skin_path); // set base_path to core skin directory (not plugin's skin) $path = realpath($path); diff --git a/program/js/app.js b/program/js/app.js index 0f1a72448..58810c24a 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -314,7 +314,7 @@ function rcube_webmail() } // detect browser capabilities - if (!this.is_framed()) + if (!this.is_framed() && !this.env.extwin) this.browser_capabilities_check(); break; @@ -980,8 +980,8 @@ function rcube_webmail() // Reset the auto-save timer clearTimeout(this.save_timer); - // compose form did not change - if (this.cmp_hash == this.compose_field_hash()) { + // compose form did not change (and draft wasn't saved already) + if (this.env.draft_id && this.cmp_hash == this.compose_field_hash()) { this.auto_save_start(); break; } @@ -1637,7 +1637,7 @@ function rcube_webmail() l = (screen.width - w) / 2 + (screen.left || 0), t = Math.max(0, (screen.height - h) / 2 + (screen.top || 0) - 20), wname = 'rcmextwin' + new Date().getTime(), - extwin = window.open(url + '&_extwin=1', wname, + extwin = window.open(url + (url.match(/\?/) ? '&' : '?') + '_extwin=1', wname, 'width='+w+',height='+h+',top='+t+',left='+l+',resizable=yes,toolbar=no,status=no,location=no'); // write loading... message to empty windows @@ -3297,6 +3297,15 @@ function rcube_webmail() this.set_draft_id = function(id) { + var rc; + + if (!this.env.draft_id && id && (rc = this.opener())) { + // refresh the drafts folder in opener window + if (rc.env.task == 'mail' && rc.env.action == '' && rc.env.mailbox == this.env.drafts_mailbox) + rc.command('checkmail'); + } + + this.env.draft_id = id; $("input[name='_draft_saveid']").val(id); }; @@ -3362,7 +3371,7 @@ function rcube_webmail() sig = this.env.signatures[sig].text; sig = sig.replace(/\r\n/g, '\n'); - p = this.env.sig_above ? message.indexOf(sig) : message.lastIndexOf(sig); + p = this.env.top_posting ? message.indexOf(sig) : message.lastIndexOf(sig); if (p >= 0) message = message.substring(0, p) + message.substring(p+sig.length, message.length); } @@ -3371,7 +3380,7 @@ function rcube_webmail() sig = this.env.signatures[id].text; sig = sig.replace(/\r\n/g, '\n'); - if (this.env.sig_above) { + if (this.env.top_posting) { if (p >= 0) { // in place of removed signature message = message.substring(0, p) + sig + message.substring(p, message.length); cursor_pos = p - 1; @@ -3415,7 +3424,7 @@ function rcube_webmail() sigElem = doc.createElement('div'); sigElem.setAttribute('id', '_rc_sig'); - if (this.env.sig_above) { + if (this.env.top_posting) { // if no existing sig and top posting then insert at caret pos editor.getWin().focus(); // correct focus in IE & Chrome @@ -3672,15 +3681,19 @@ function rcube_webmail() this.env.search_id = null; }; - this.sent_successfully = function(type, msg) + this.sent_successfully = function(type, msg, target) { this.display_message(msg, type); if (this.env.extwin) { - var opener_rc = this.opener(); + var rc = this.opener(); this.lock_form(this.gui_objects.messageform); - if (opener_rc) - opener_rc.display_message(msg, type); + if (rc) { + rc.display_message(msg, type); + // refresh the folder where sent message was saved + if (target && rc.env.task == 'mail' && rc.env.action == '' && rc.env.mailbox == target) + rc.command('checkmail'); + } setTimeout(function(){ window.close() }, 1000); } else { @@ -6708,6 +6721,15 @@ function rcube_webmail() return 1; } + // this will detect any pdf plugin including PDF.js in Firefox + var obj = document.createElement('OBJECT'); + obj.onload = function() { rcmail.env.browser_capabilities.pdf = 1; }; + obj.onerror = function() { rcmail.env.browser_capabilities.pdf = 0; }; + obj.style.display = 'none'; + obj.type = 'application/pdf'; + obj.data = 'program/resources/blank.pdf'; + document.body.appendChild(obj); + return 0; }; diff --git a/program/js/common.js b/program/js/common.js index f9e945c05..f7c0a7536 100644 --- a/program/js/common.js +++ b/program/js/common.js @@ -717,13 +717,15 @@ if (bw.ie) { // jQuery plugin to emulate HTML5 placeholder attributes on input elements jQuery.fn.placeholder = function(text) { return this.each(function() { - var elem = $(this); + var active = false, elem = $(this); this.title = text; + // Try HTML5 placeholder attribute first if ('placeholder' in this) { - elem.attr('placeholder', text); // Try HTML5 placeholder attribute first + elem.attr('placeholder', text); } - else { // Fallback to Javascript emulation of placeholder + // Fallback to Javascript emulation of placeholder + else { this._placeholder = text; elem.blur(function(e) { if ($.trim(elem.val()) == "") @@ -740,7 +742,9 @@ jQuery.fn.placeholder = function(text) { elem[(active ? 'addClass' : 'removeClass')]('placeholder').attr('spellcheck', active); }); - if (this != document.activeElement) // Do not blur currently focused element + // Do not blur currently focused element (catch exception: #1489008) + try { active = this == document.activeElement; } catch(e) {} + if (!active) elem.blur(); } }); diff --git a/program/js/list.js b/program/js/list.js index 9a531eaea..c6b0d3fb8 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -231,7 +231,8 @@ focus: function(e) // Un-focus already focused elements (#1487123, #1487316, #1488600, #1488620) $(':focus:not(body)').blur(); - $('iframe').each(function() { this.blur(); }); + // un-focus iframe bodies (#1489058), this doesn't work in Opera and Chrome + $('iframe').contents().find('body').blur(); if (e || (e = window.event)) rcube_event.cancel(e); @@ -779,10 +780,16 @@ shift_select: function(id, control) if (!this.rows[this.shift_start] || !this.selection.length) this.shift_start = id; - var n, from_rowIndex = this.rows[this.shift_start].obj.rowIndex, - to_rowIndex = this.rows[id].obj.rowIndex, - i = ((from_rowIndex < to_rowIndex)? from_rowIndex : to_rowIndex), - j = ((from_rowIndex > to_rowIndex)? from_rowIndex : to_rowIndex); + var n, i, j, to_row = this.rows[id], + from_rowIndex = this.rows[this.shift_start].obj.rowIndex, + to_rowIndex = to_row.obj.rowIndex; + + if (!to_row.expanded && to_row.has_children) + if (to_row = this.rows[(this.row_children(id)).pop()]) + to_rowIndex = to_row.obj.rowIndex; + + i = ((from_rowIndex < to_rowIndex) ? from_rowIndex : to_rowIndex), + j = ((from_rowIndex > to_rowIndex) ? from_rowIndex : to_rowIndex); // iterate through the entire message list for (n in this.rows) { @@ -828,7 +835,7 @@ select_all: function(filter) for (n in this.rows) { if (!filter || this.rows[n][filter] == true) { this.last_selected = n; - this.highlight_row(n, true); + this.highlight_row(n, true, true); } else { $(this.rows[n].obj).removeClass('selected').removeClass('unfocused'); @@ -923,7 +930,7 @@ get_single_selection: function() /** * Highlight/unhighlight a row */ -highlight_row: function(id, multiple) +highlight_row: function(id, multiple, norecur) { if (!this.rows[id]) return; @@ -939,7 +946,7 @@ highlight_row: function(id, multiple) if (!this.in_selection(id)) { // select row this.selection.push(id); $(this.rows[id].obj).addClass('selected'); - if (!this.rows[id].expanded) + if (!norecur && !this.rows[id].expanded) this.highlight_children(id, true); } else { // unselect row @@ -949,7 +956,7 @@ highlight_row: function(id, multiple) this.selection = a_pre.concat(a_post); $(this.rows[id].obj).removeClass('selected').removeClass('unfocused'); - if (!this.rows[id].expanded) + if (!norecur && !this.rows[id].expanded) this.highlight_children(id, false); } } @@ -967,7 +974,7 @@ highlight_children: function(id, status) for (i=0; i<len; i++) { selected = this.in_selection(children[i]); if ((status && !selected) || (!status && selected)) - this.highlight_row(children[i], true); + this.highlight_row(children[i], true, true); } }, @@ -1228,7 +1235,7 @@ drag_mouse_up: function(e) // remove temp divs this.del_dragfix(); - this.triggerEvent('dragend'); + this.triggerEvent('dragend', e); return rcube_event.cancel(e); }, @@ -1341,7 +1348,7 @@ column_drag_mouse_up: function(e) } } - this.triggerEvent('column_dragend'); + this.triggerEvent('column_dragend', e); return rcube_event.cancel(e); }, diff --git a/program/lib/Roundcube/bootstrap.php b/program/lib/Roundcube/bootstrap.php index 0640a9448..b7e69cb2a 100644 --- a/program/lib/Roundcube/bootstrap.php +++ b/program/lib/Roundcube/bootstrap.php @@ -31,16 +31,25 @@ $config = array( // critical PHP settings here. Only these, which doesn't provide // an error/warning in the logs later. See (#1486307). 'mbstring.func_overload' => 0, - 'suhosin.session.encrypt' => 0, - 'session.auto_start' => 0, - 'file_uploads' => 1, 'magic_quotes_runtime' => 0, 'magic_quotes_sybase' => 0, // #1488506 ); + +// check these additional ini settings if not called via CLI +if (php_sapi_name() != 'cli') { + $config += array( + 'suhosin.session.encrypt' => 0, + 'session.auto_start' => 0, + 'file_uploads' => 1, + ); +} + foreach ($config as $optname => $optval) { if ($optval != ini_get($optname) && @ini_set($optname, $optval) === false) { - die("ERROR: Wrong '$optname' option value and it wasn't possible to set it to required value ($optval).\n" - ."Check your PHP configuration (including php_admin_flag)."); + $error = "ERROR: Wrong '$optname' option value and it wasn't possible to set it to required value ($optval).\n" + . "Check your PHP configuration (including php_admin_flag)."; + if (defined('STDERR')) fwrite(STDERR, $error); else echo $error; + exit(1); } } diff --git a/program/lib/Roundcube/html.php b/program/lib/Roundcube/html.php index 592720308..dbc9ca51f 100644 --- a/program/lib/Roundcube/html.php +++ b/program/lib/Roundcube/html.php @@ -35,6 +35,7 @@ class html public static $common_attrib = array('id','class','style','title','align'); public static $containers = array('iframe','div','span','p','h1','h2','h3','form','textarea','table','thead','tbody','tr','th','td','style','script'); + /** * Constructor * @@ -217,7 +218,7 @@ class html $attr = array('src' => $attr); } return self::tag('iframe', $attr, $cont, array_merge(self::$common_attrib, - array('src','name','width','height','border','frameborder'))); + array('src','name','width','height','border','frameborder','onload'))); } /** @@ -332,7 +333,16 @@ class html */ public static function quote($str) { - return @htmlspecialchars($str, ENT_COMPAT, RCUBE_CHARSET); + static $flags; + + if (!$flags) { + $flags = ENT_COMPAT; + if (defined('ENT_SUBSTITUTE')) { + $flags |= ENT_SUBSTITUTE; + } + } + + return @htmlspecialchars($str, $flags, RCUBE_CHARSET); } } diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php index 3ae511e1e..b681f0531 100644 --- a/program/lib/Roundcube/rcube.php +++ b/program/lib/Roundcube/rcube.php @@ -405,6 +405,7 @@ class rcube $sess_domain = $this->config->get('session_domain'); $sess_path = $this->config->get('session_path'); $lifetime = $this->config->get('session_lifetime', 0) * 60; + $is_secure = $this->config->get('use_https') || rcube_utils::https_check(); // set session domain if ($sess_domain) { @@ -419,7 +420,7 @@ class rcube ini_set('session.gc_maxlifetime', $lifetime * 2); } - ini_set('session.cookie_secure', rcube_utils::https_check()); + ini_set('session.cookie_secure', $is_secure); ini_set('session.name', $sess_name ? $sess_name : 'roundcube_sessid'); ini_set('session.use_cookies', 1); ini_set('session.use_only_cookies', 1); @@ -1081,6 +1082,9 @@ class rcube 'message' => $arg->getMessage(), ); } + else if (is_string($arg)) { + $arg = array('message' => $arg, 'type' => 'php'); + } if (empty($arg['code'])) { $arg['code'] = 500; @@ -1093,14 +1097,24 @@ class rcube return; } - if (($log || $terminate) && $arg['type'] && $arg['message']) { + $cli = php_sapi_name() == 'cli'; + + if (($log || $terminate) && !$cli && $arg['type'] && $arg['message']) { $arg['fatal'] = $terminate; self::log_bug($arg); } - // display error page and terminate script - if ($terminate && is_object(self::$instance->output)) { - self::$instance->output->raise_error($arg['code'], $arg['message']); + // terminate script + if ($terminate) { + // display error page + if (is_object(self::$instance->output)) { + self::$instance->output->raise_error($arg['code'], $arg['message']); + } + else if ($cli) { + fwrite(STDERR, 'ERROR: ' . $arg['message']); + } + + exit(1); } } @@ -1139,7 +1153,7 @@ class rcube if (!self::write_log('errors', $log_entry)) { // send error to PHPs error handler if write_log didn't succeed - trigger_error($arg_arr['message']); + trigger_error($arg_arr['message'], E_USER_WARNING); } } diff --git a/program/lib/Roundcube/rcube_contacts.php b/program/lib/Roundcube/rcube_contacts.php index c66e98687..e4fd7dc10 100644 --- a/program/lib/Roundcube/rcube_contacts.php +++ b/program/lib/Roundcube/rcube_contacts.php @@ -626,10 +626,6 @@ class rcube_contacts extends rcube_addressbook $insert_id = $this->db->insert_id($this->db_name); } - // also add the newly created contact to the active group - if ($insert_id && $this->group_id) - $this->add_to_group($this->group_id, $insert_id); - $this->cache = null; return $insert_id; diff --git a/program/lib/Roundcube/rcube_db.php b/program/lib/Roundcube/rcube_db.php index 49bbe5c6e..d86e3dd98 100644 --- a/program/lib/Roundcube/rcube_db.php +++ b/program/lib/Roundcube/rcube_db.php @@ -444,17 +444,20 @@ class rcube_db * * @param mixed $result Optional query handle * @return mixed Number of rows or false on failure + * @deprecated This method shows very poor performance and should be avoided. */ public function num_rows($result = null) { if ($result || ($result === null && ($result = $this->last_result))) { // repeat query with SELECT COUNT(*) ... - if (preg_match('/^SELECT\s+(?:ALL\s+|DISTINCT\s+)?(?:.*?)\s+FROM\s+(.*)$/i', $result->queryString, $m)) { + if (preg_match('/^SELECT\s+(?:ALL\s+|DISTINCT\s+)?(?:.*?)\s+FROM\s+(.*)$/ims', $result->queryString, $m)) { $query = $this->dbh->query('SELECT COUNT(*) FROM ' . $m[1], PDO::FETCH_NUM); return $query ? intval($query->fetchColumn(0)) : false; } else { - return count($result->fetchAll()); + $num = count($result->fetchAll()); + $result->execute(); // re-execute query because there's no seek(0) + return $num; } } @@ -631,6 +634,22 @@ class rcube_db } /** + * Escapes a string so it can be safely used in a query + * + * @param string $str A string to escape + * + * @return string Escaped string for use in a query + */ + public function escape($str) + { + if (is_null($str)) { + return 'NULL'; + } + + return substr($this->quote($str), 1, -1); + } + + /** * Quotes a string so it can be safely used as a table or column name * * @param string $str Value to quote @@ -645,6 +664,20 @@ class rcube_db } /** + * Escapes a string so it can be safely used in a query + * + * @param string $str A string to escape + * + * @return string Escaped string for use in a query + * @deprecated Replaced by rcube_db::escape + * @see rcube_db::escape + */ + public function escapeSimple($str) + { + return $this->escape($str); + } + + /** * Quotes a string so it can be safely used as a table or column name * * @param string $str Value to quote @@ -813,11 +846,9 @@ class rcube_db { $rcube = rcube::get_instance(); - // return table name if configured - $config_key = 'db_table_'.$table; - - if ($name = $rcube->config->get($config_key)) { - return $name; + // add prefix to the table name if configured + if ($prefix = $rcube->config->get('db_prefix')) { + return $prefix . $table; } return $table; diff --git a/program/lib/Roundcube/rcube_db_pgsql.php b/program/lib/Roundcube/rcube_db_pgsql.php index cf23c5e48..adfd2207b 100644 --- a/program/lib/Roundcube/rcube_db_pgsql.php +++ b/program/lib/Roundcube/rcube_db_pgsql.php @@ -53,19 +53,20 @@ class rcube_db_pgsql extends rcube_db /** * Return correct name for a specific database sequence * - * @param string $sequence Secuence name + * @param string $table Table name * * @return string Translated sequence name */ - protected function sequence_name($sequence) + protected function sequence_name($table) { - $rcube = rcube::get_instance(); + // Note: we support only one sequence per table + // Note: The sequence name must be <table_name>_seq + $sequence = $table . '_seq'; + $rcube = rcube::get_instance(); // return sequence name if configured - $config_key = 'db_sequence_'.$sequence; - - if ($name = $rcube->config->get($config_key)) { - return $name; + if ($prefix = $rcube->config->get('db_prefix')) { + return $prefix . $sequence; } return $sequence; diff --git a/program/lib/Roundcube/rcube_image.php b/program/lib/Roundcube/rcube_image.php index a55ba1600..735a0df01 100644 --- a/program/lib/Roundcube/rcube_image.php +++ b/program/lib/Roundcube/rcube_image.php @@ -124,6 +124,7 @@ class rcube_image } if ($result === '') { + @chmod($filename, 0600); return $type; } } @@ -183,6 +184,7 @@ class rcube_image } if ($result) { + @chmod($filename, 0600); return $type; } } @@ -223,6 +225,7 @@ class rcube_image $result = rcube::exec($convert . ' 2>&1 -colorspace RGB -quality 75 {in} {type}:{out}', $p); if ($result === '') { + @chmod($filename, 0600); return true; } } @@ -256,6 +259,7 @@ class rcube_image } if ($result) { + @chmod($filename, 0600); return true; } } diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 0aa059c26..c67985186 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -3372,7 +3372,6 @@ class rcube_imap extends rcube_storage { if (!empty($this->options['fetch_headers'])) { $headers = explode(' ', $this->options['fetch_headers']); - $headers = array_map('strtoupper', $headers); } else { $headers = array(); @@ -3382,7 +3381,7 @@ class rcube_imap extends rcube_storage $headers = array_merge($headers, $this->all_headers); } - return implode(' ', array_unique($headers)); + return $headers; } diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index 2ac1355fd..460e6cc92 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -2265,24 +2265,53 @@ class rcube_imap_generic return $result; } - function fetchHeaders($mailbox, $message_set, $is_uid = false, $bodystr = false, $add = '') + /** + * Returns message(s) data (flags, headers, etc.) + * + * @param string $mailbox Mailbox name + * @param mixed $message_set Message(s) sequence identifier(s) or UID(s) + * @param bool $is_uid True if $message_set contains UIDs + * @param bool $bodystr Enable to add BODYSTRUCTURE data to the result + * @param array $add_headers List of additional headers + * + * @return bool|array List of rcube_message_header elements, False on error + */ + function fetchHeaders($mailbox, $message_set, $is_uid = false, $bodystr = false, $add_headers = array()) { $query_items = array('UID', 'RFC822.SIZE', 'FLAGS', 'INTERNALDATE'); - if ($bodystr) + $headers = array('DATE', 'FROM', 'TO', 'SUBJECT', 'CONTENT-TYPE', 'CC', 'REPLY-TO', + 'LIST-POST', 'DISPOSITION-NOTIFICATION-TO', 'X-PRIORITY'); + + if (!empty($add_headers)) { + $add_headers = array_map('strtoupper', $add_headers); + $headers = array_unique(array_merge($headers, $add_headers)); + } + + if ($bodystr) { $query_items[] = 'BODYSTRUCTURE'; - $query_items[] = 'BODY.PEEK[HEADER.FIELDS (' - . 'DATE FROM TO SUBJECT CONTENT-TYPE CC REPLY-TO LIST-POST DISPOSITION-NOTIFICATION-TO X-PRIORITY' - . ($add ? ' ' . trim($add) : '') - . ')]'; + } + + $query_items[] = 'BODY.PEEK[HEADER.FIELDS (' . implode(' ', $headers) . ')]'; $result = $this->fetch($mailbox, $message_set, $is_uid, $query_items); return $result; } - function fetchHeader($mailbox, $id, $uidfetch=false, $bodystr=false, $add='') + /** + * Returns message data (flags, headers, etc.) + * + * @param string $mailbox Mailbox name + * @param int $id Message sequence identifier or UID + * @param bool $is_uid True if $id is an UID + * @param bool $bodystr Enable to add BODYSTRUCTURE data to the result + * @param array $add_headers List of additional headers + * + * @return bool|rcube_message_header Message data, False on error + */ + function fetchHeader($mailbox, $id, $is_uid = false, $bodystr = false, $add_headers = array()) { - $a = $this->fetchHeaders($mailbox, $id, $uidfetch, $bodystr, $add); + $a = $this->fetchHeaders($mailbox, $id, $is_uid, $bodystr, $add_headers); if (is_array($a)) { return array_shift($a); } @@ -3638,8 +3667,20 @@ class rcube_imap_generic */ static function strToTime($date) { - // support non-standard "GMTXXXX" literal - $date = preg_replace('/GMT\s*([+-][0-9]+)/', '\\1', $date); + // Clean malformed data + $date = preg_replace( + array( + '/GMT\s*([+-][0-9]+)/', // support non-standard "GMTXXXX" literal + '/[^a-z0-9\x20\x09:+-]/i', // remove any invalid characters + '/\s*(Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*/i', // remove weekday names + ), + array( + '\\1', + '', + '', + ), $date); + + $date = trim($date); // if date parsing fails, we have a date in non-rfc format // remove token from the end and try again diff --git a/program/lib/Roundcube/rcube_message.php b/program/lib/Roundcube/rcube_message.php index 42d7b9bbe..9db1fa30a 100644 --- a/program/lib/Roundcube/rcube_message.php +++ b/program/lib/Roundcube/rcube_message.php @@ -85,12 +85,13 @@ class rcube_message $this->headers = $this->storage->get_message($uid); - if (!$this->headers) + if (!$this->headers) { return; + } $this->mime = new rcube_mime($this->headers->charset); - $this->subject = $this->mime->decode_mime_string($this->headers->subject); + $this->subject = $this->headers->get('subject'); list(, $this->sender) = each($this->mime->decode_address_list($this->headers->from, 1)); $this->set_safe((intval($_GET['_safe']) || $_SESSION['safe_messages'][$this->folder.':'.$uid])); @@ -125,15 +126,11 @@ class rcube_message */ public function get_header($name, $raw = false) { - if (empty($this->headers)) + if (empty($this->headers)) { return null; + } - if ($this->headers->$name) - $value = $this->headers->$name; - else if ($this->headers->others[$name]) - $value = $this->headers->others[$name]; - - return $raw ? $value : $this->mime->decode_header($value); + return $this->headers->get($name, !$raw); } @@ -152,12 +149,13 @@ class rcube_message * Compose a valid URL for getting a message part * * @param string $mime_id Part MIME-ID + * @param mixed $embed Mimetype class for parts to be embedded * @return string URL or false if part does not exist */ public function get_part_url($mime_id, $embed = false) { if ($this->mime_parts[$mime_id]) - return $this->opt['get_url'] . '&_part=' . $mime_id . ($embed ? '&_embed=1' : ''); + return $this->opt['get_url'] . '&_part=' . $mime_id . ($embed ? '&_embed=1&_mimeclass=' . $embed : ''); else return false; } @@ -364,7 +362,7 @@ class rcube_message // parse headers from message/rfc822 part if (!isset($structure->headers['subject']) && !isset($structure->headers['from'])) { - list($headers, $dump) = explode("\r\n\r\n", $this->get_part_content($structure->mime_id, null, true, 8192)); + list($headers, $dump) = explode("\r\n\r\n", $this->get_part_content($structure->mime_id, null, true, 32768)); $structure->headers = rcube_mime::parse_headers($headers); } } @@ -372,7 +370,8 @@ class rcube_message $mimetype = $structure->mimetype; // show message headers - if ($recursive && is_array($structure->headers) && (isset($structure->headers['subject']) || isset($structure->headers['from']))) { + if ($recursive && is_array($structure->headers) && + (isset($structure->headers['subject']) || $structure->headers['from'] || $structure->headers['to'])) { $c = new stdClass; $c->type = 'headers'; $c->headers = $structure->headers; @@ -486,14 +485,6 @@ class rcube_message $this->parts[] = $c; } - // add html part as attachment - if ($html_part !== null && $structure->parts[$html_part] !== $print_part) { - $html_part = $structure->parts[$html_part]; - $html_part->mimetype = 'text/html'; - - $this->attachments[] = $html_part; - } - // add unsupported/unrecognized parts to attachments list if ($attach_part) { $this->attachments[] = $structure->parts[$attach_part]; @@ -578,10 +569,6 @@ class rcube_message if (!empty($mail_part->filename)) { $this->attachments[] = $mail_part; } - // list html part as attachment (here the part is most likely inside a multipart/related part) - else if ($this->parse_alternative && ($secondary_type == 'html' && !$this->opt['prefer_html'])) { - $this->attachments[] = $mail_part; - } } // part message/* else if ($primary_type == 'message') { @@ -657,7 +644,7 @@ class rcube_message $img_regexp = '/^image\/(gif|jpe?g|png|tiff|bmp|svg)/'; foreach ($this->inline_parts as $inline_object) { - $part_url = $this->get_part_url($inline_object->mime_id, true); + $part_url = $this->get_part_url($inline_object->mime_id, $inline_object->ctype_primary); if (isset($inline_object->content_id)) $a_replaces['cid:'.$inline_object->content_id] = $part_url; if ($inline_object->content_location) { diff --git a/program/lib/Roundcube/rcube_message_header.php b/program/lib/Roundcube/rcube_message_header.php index 274ae7f9f..2c5e2b6c8 100644 --- a/program/lib/Roundcube/rcube_message_header.php +++ b/program/lib/Roundcube/rcube_message_header.php @@ -215,7 +215,12 @@ class rcube_message_header $value = $this->others[$name]; } - return $decode ? rcube_mime::decode_header($value, $this->charset) : $value; + if ($decode) { + $value = rcube_mime::decode_header($value, $this->charset); + $value = rcube_charset::clean($value); + } + + return $value; } /** diff --git a/program/lib/Roundcube/rcube_mime.php b/program/lib/Roundcube/rcube_mime.php index b70d681c9..96296a57c 100644 --- a/program/lib/Roundcube/rcube_mime.php +++ b/program/lib/Roundcube/rcube_mime.php @@ -564,82 +564,122 @@ class rcube_mime /** - * Improved wordwrap function. + * Improved wordwrap function with multibyte support. + * The code is based on Zend_Text_MultiByte::wordWrap(). * - * @param string $string Text to wrap - * @param int $width Line width - * @param string $break Line separator - * @param bool $cut Enable to cut word - * @param string $charset Charset of $string + * @param string $string Text to wrap + * @param int $width Line width + * @param string $break Line separator + * @param bool $cut Enable to cut word + * @param string $charset Charset of $string + * @param bool $wrap_quoted When enabled quoted lines will not be wrapped * * @return string Text */ - public static function wordwrap($string, $width=75, $break="\n", $cut=false, $charset=null) + public static function wordwrap($string, $width=75, $break="\n", $cut=false, $charset=null, $wrap_quoted=true) { - if ($charset && function_exists('mb_internal_encoding')) { - mb_internal_encoding($charset); + if (!$charset) { + $charset = RCUBE_CHARSET; } - $para = preg_split('/\r?\n/', $string); - $string = ''; - - while (count($para)) { - $line = array_shift($para); - if ($line[0] == '>') { - $string .= $line . (count($para) ? $break : ''); - continue; + // detect available functions + $strlen_func = function_exists('iconv_strlen') ? 'iconv_strlen' : 'mb_strlen'; + $strpos_func = function_exists('iconv_strpos') ? 'iconv_strpos' : 'mb_strpos'; + $strrpos_func = function_exists('iconv_strrpos') ? 'iconv_strrpos' : 'mb_strrpos'; + $substr_func = function_exists('iconv_substr') ? 'iconv_substr' : 'mb_substr'; + + // Convert \r\n to \n, this is our line-separator + $string = str_replace("\r\n", "\n", $string); + $separator = "\n"; // must be 1 character length + $result = array(); + + while (($stringLength = $strlen_func($string, $charset)) > 0) { + $breakPos = $strpos_func($string, $separator, 0, $charset); + + // quoted line (do not wrap) + if ($wrap_quoted && $string[0] == '>') { + if ($breakPos === $stringLength - 1 || $breakPos === false) { + $subString = $string; + $cutLength = null; + } + else { + $subString = $substr_func($string, 0, $breakPos, $charset); + $cutLength = $breakPos + 1; + } + } + // next line found and current line is shorter than the limit + else if ($breakPos !== false && $breakPos < $width) { + if ($breakPos === $stringLength - 1) { + $subString = $string; + $cutLength = null; + } + else { + $subString = $substr_func($string, 0, $breakPos, $charset); + $cutLength = $breakPos + 1; + } } + else { + $subString = $substr_func($string, 0, $width, $charset); - $list = explode(' ', $line); - $len = 0; - while (count($list)) { - $line = array_shift($list); - $l = mb_strlen($line); - $space = $len ? 1 : 0; - $newlen = $len + $l + $space; - - if ($newlen <= $width) { - $string .= ($space ? ' ' : '').$line; - $len += ($space + $l); + // last line + if ($breakPos === false && $subString === $string) { + $cutLength = null; } else { - if ($l > $width) { - if ($cut) { - $start = 0; - while ($l) { - $str = mb_substr($line, $start, $width); - $strlen = mb_strlen($str); - $string .= ($len ? $break : '').$str; - $start += $strlen; - $l -= $strlen; - $len = $strlen; - } + $nextChar = $substr_func($string, $width, 1, $charset); + + if ($nextChar === ' ' || $nextChar === $separator) { + $afterNextChar = $substr_func($string, $width + 1, 1, $charset); + + if ($afterNextChar === false) { + $subString .= $nextChar; + } + + $cutLength = $strlen_func($subString, $charset) + 1; + } + else { + if ($strrpos_func[0] == 'm') { + $spacePos = $strrpos_func($subString, ' ', 0, $charset); } else { - $string .= ($len ? $break : '').$line; - if (count($list)) { - $string .= $break; + $spacePos = $strrpos_func($subString, ' ', $charset); + } + + if ($spacePos !== false) { + $subString = $substr_func($subString, 0, $spacePos, $charset); + $cutLength = $spacePos + 1; + } + else if ($cut === false) { + $spacePos = $strpos_func($string, ' ', 0, $charset); + + if ($spacePos !== false && $spacePos < $breakPos) { + $subString = $substr_func($string, 0, $spacePos, $charset); + $cutLength = $spacePos + 1; + } + else { + $subString = $string; + $cutLength = null; } - $len = 0; } - } - else { - $string .= $break.$line; - $len = $l; + else { + $subString = $substr_func($subString, 0, $width, $charset); + $cutLength = $width; + } } } } - if (count($para)) { - $string .= $break; - } - } + $result[] = $subString; - if ($charset && function_exists('mb_internal_encoding')) { - mb_internal_encoding(RCUBE_CHARSET); + if ($cutLength !== null) { + $string = $substr_func($string, $cutLength, ($stringLength - $cutLength), $charset); + } + else { + break; + } } - return $string; + return implode($break, $result); } @@ -769,11 +809,35 @@ class rcube_mime // fallback to some well-known types most important for daily emails if (empty($mime_types)) { - $mime_extensions = @include(RCUBE_CONFIG_DIR . '/mimetypes.php'); - $mime_extensions += array('gif' => 'image/gif', 'png' => 'image/png', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'tif' => 'image/tiff'); + $mime_extensions = (array) @include(RCUBE_CONFIG_DIR . '/mimetypes.php'); - foreach ($mime_extensions as $ext => $mime) + foreach ($mime_extensions as $ext => $mime) { $mime_types[$mime][] = $ext; + } + } + + // Add some known aliases that aren't included by some mime.types (#1488891) + // the order is important here so standard extensions have higher prio + $aliases = array( + 'image/gif' => array('gif'), + 'image/png' => array('png'), + 'image/x-png' => array('png'), + 'image/jpeg' => array('jpg', 'jpeg', 'jpe'), + 'image/jpg' => array('jpg', 'jpeg', 'jpe'), + 'image/pjpeg' => array('jpg', 'jpeg', 'jpe'), + 'image/tiff' => array('tif'), + 'message/rfc822' => array('eml'), + 'text/x-mail' => array('eml'), + ); + + foreach ($aliases as $mime => $exts) { + $mime_types[$mime] = array_unique(array_merge((array) $mime_types[$mime], $exts)); + + foreach ($exts as $ext) { + if (!isset($mime_extensions[$ext])) { + $mime_extensions[$ext] = $mime; + } + } } return $mimetype ? $mime_types[$mimetype] : $mime_extensions; diff --git a/program/lib/Roundcube/rcube_plugin.php b/program/lib/Roundcube/rcube_plugin.php index 9ea0f73d3..d24a2693c 100644 --- a/program/lib/Roundcube/rcube_plugin.php +++ b/program/lib/Roundcube/rcube_plugin.php @@ -60,6 +60,14 @@ abstract class rcube_plugin */ public $noframe = false; + /** + * A list of config option names that can be modified + * by the user via user interface (with save-prefs command) + * + * @var array + */ + public $allowed_prefs; + protected $home; protected $urlbase; private $mytask; @@ -84,6 +92,16 @@ abstract class rcube_plugin abstract function init(); /** + * Provide information about this + * + * @return array Meta information about a plugin or false if not implemented + */ + public static function info() + { + return false; + } + + /** * Attempt to load the given plugin which is required for the current plugin * * @param string Plugin name diff --git a/program/lib/Roundcube/rcube_plugin_api.php b/program/lib/Roundcube/rcube_plugin_api.php index 111c177d9..4bb6c6677 100644 --- a/program/lib/Roundcube/rcube_plugin_api.php +++ b/program/lib/Roundcube/rcube_plugin_api.php @@ -36,6 +36,7 @@ class rcube_plugin_api public $task = ''; public $output; public $handlers = array(); + public $allowed_prefs = array(); protected $plugins = array(); protected $tasks = array(); @@ -202,6 +203,11 @@ class rcube_plugin_api $plugin->init(); $this->plugins[$plugin_name] = $plugin; } + + if (!empty($plugin->allowed_prefs)) { + $this->allowed_prefs = array_merge($this->allowed_prefs, $plugin->allowed_prefs); + } + return true; } } @@ -222,6 +228,120 @@ class rcube_plugin_api } /** + * Get information about a specific plugin. + * This is either provided my a plugin's info() method or extracted from a package.xml or a composer.json file + * + * @param string Plugin name + * @return array Meta information about a plugin or False if plugin was not found + */ + public function get_info($plugin_name) + { + static $composer_lock, $license_uris = array( + 'Apache' => 'http://www.apache.org/licenses/LICENSE-2.0.html', + 'Apache-2' => 'http://www.apache.org/licenses/LICENSE-2.0.html', + 'Apache-1' => 'http://www.apache.org/licenses/LICENSE-1.0', + 'Apache-1.1' => 'http://www.apache.org/licenses/LICENSE-1.1', + 'GPL' => 'http://www.gnu.org/licenses/gpl.html', + 'GPLv2' => 'http://www.gnu.org/licenses/gpl-2.0.html', + 'GPL-2.0' => 'http://www.gnu.org/licenses/gpl-2.0.html', + 'GPLv3' => 'http://www.gnu.org/licenses/gpl-3.0.html', + 'GPL-3.0' => 'http://www.gnu.org/licenses/gpl-3.0.html', + 'GPL-3.0+' => 'http://www.gnu.org/licenses/gpl.html', + 'GPL-2.0+' => 'http://www.gnu.org/licenses/gpl.html', + 'LGPL' => 'http://www.gnu.org/licenses/lgpl.html', + 'LGPLv2' => 'http://www.gnu.org/licenses/lgpl-2.0.html', + 'LGPLv2.1' => 'http://www.gnu.org/licenses/lgpl-2.1.html', + 'LGPLv3' => 'http://www.gnu.org/licenses/lgpl.html', + 'LGPL-2.0' => 'http://www.gnu.org/licenses/lgpl-2.0.html', + 'LGPL-2.1' => 'http://www.gnu.org/licenses/lgpl-2.1.html', + 'LGPL-3.0' => 'http://www.gnu.org/licenses/lgpl.html', + 'LGPL-3.0+' => 'http://www.gnu.org/licenses/lgpl.html', + 'BSD' => 'http://opensource.org/licenses/bsd-license.html', + 'BSD-2-Clause' => 'http://opensource.org/licenses/BSD-2-Clause', + 'BSD-3-Clause' => 'http://opensource.org/licenses/BSD-3-Clause', + 'FreeBSD' => 'http://opensource.org/licenses/BSD-2-Clause', + 'MIT' => 'http://www.opensource.org/licenses/mit-license.php', + 'PHP' => 'http://opensource.org/licenses/PHP-3.0', + 'PHP-3' => 'http://www.php.net/license/3_01.txt', + 'PHP-3.0' => 'http://www.php.net/license/3_0.txt', + 'PHP-3.01' => 'http://www.php.net/license/3_01.txt', + ); + + $dir = dir($this->dir); + $fn = unslashify($dir->path) . DIRECTORY_SEPARATOR . $plugin_name . DIRECTORY_SEPARATOR . $plugin_name . '.php'; + $info = false; + + if (!class_exists($plugin_name)) + include($fn); + + if (class_exists($plugin_name)) + $info = $plugin_name::info(); + + // fall back to composer.json file + if (!$info) { + $composer = INSTALL_PATH . "/plugins/$plugin_name/composer.json"; + if (file_exists($composer) && ($json = @json_decode(file_get_contents($composer), true))) { + list($info['vendor'], $info['name']) = explode('/', $json['name']); + $info['license'] = $json['license']; + if ($license_uri = $license_uris[$info['license']]) + $info['license_uri'] = $license_uri; + } + + // read local composer.lock file (once) + if (!isset($composer_lock)) { + $composer_lock = @json_decode(@file_get_contents(INSTALL_PATH . "/composer.lock"), true); + if ($composer_lock['packages']) { + foreach ($composer_lock['packages'] as $i => $package) { + $composer_lock['installed'][$package['name']] = $package; + } + } + } + + // load additional information from local composer.lock file + if ($lock = $composer_lock['installed'][$json['name']]) { + $info['version'] = $lock['version']; + $info['uri'] = $lock['homepage'] ? $lock['homepage'] : $lock['source']['uri']; + $info['src_uri'] = $lock['dist']['uri'] ? $lock['dist']['uri'] : $lock['source']['uri']; + } + } + + // fall back to package.xml file + if (!$info) { + $package = INSTALL_PATH . "/plugins/$plugin_name/package.xml"; + if (file_exists($package) && ($file = file_get_contents($package))) { + $doc = new DOMDocument(); + $doc->loadXML($file); + $xpath = new DOMXPath($doc); + $xpath->registerNamespace('rc', "http://pear.php.net/dtd/package-2.0"); + $data = array(); + + // XPaths of plugin metadata elements + $metadata = array( + 'name' => 'string(//rc:package/rc:name)', + 'version' => 'string(//rc:package/rc:version/rc:release)', + 'license' => 'string(//rc:package/rc:license)', + 'license_uri' => 'string(//rc:package/rc:license/@uri)', + 'src_uri' => 'string(//rc:package/rc:srcuri)', + 'uri' => 'string(//rc:package/rc:uri)', + ); + + foreach ($metadata as $key => $path) { + $info[$key] = $xpath->evaluate($path); + } + + // dependent required plugins (can be used, but not included in config) + $deps = $xpath->evaluate('//rc:package/rc:dependencies/rc:required/rc:package/rc:name'); + for ($i = 0; $i < $deps->length; $i++) { + $dn = $deps->item($i)->nodeValue; + $info['requires'][] = $dn; + } + } + } + + return $info; + } + + /** * Allows a plugin object to register a callback for a certain hook * * @param string $hook Hook name diff --git a/program/lib/Roundcube/rcube_session.php b/program/lib/Roundcube/rcube_session.php index 82ff8a804..dedde2284 100644 --- a/program/lib/Roundcube/rcube_session.php +++ b/program/lib/Roundcube/rcube_session.php @@ -203,10 +203,15 @@ class rcube_session if (is_array($a_oldvars)) { // remove unset keys on oldvars foreach ((array)$this->unsets as $var) { - $path = explode('.', $var); - $k = array_pop($path); - $node = &$this->get_node($path, $a_oldvars); - unset($node[$k]); + if (isset($a_oldvars[$var])) { + unset($a_oldvars[$var]); + } + else { + $path = explode('.', $var); + $k = array_pop($path); + $node = &$this->get_node($path, $a_oldvars); + unset($node[$k]); + } } $newvars = $this->serialize(array_merge( @@ -402,7 +407,7 @@ class rcube_session /** * Unset a session variable * - * @param string Varibale name (can be a path denoting a certain node in the session array, e.g. compose.attachments.5) + * @param string Variable name (can be a path denoting a certain node in the session array, e.g. compose.attachments.5) * @return boolean True on success */ public function remove($var=null) @@ -413,10 +418,15 @@ class rcube_session $this->unsets[] = $var; - $path = explode('.', $var); - $key = array_pop($path); - $node = &$this->get_node($path, $_SESSION); - unset($node[$key]); + if (isset($_SESSION[$var])) { + unset($_SESSION[$var]); + } + else { + $path = explode('.', $var); + $key = array_pop($path); + $node = &$this->get_node($path, $_SESSION); + unset($node[$key]); + } return true; } diff --git a/program/lib/Roundcube/rcube_string_replacer.php b/program/lib/Roundcube/rcube_string_replacer.php index b8768bc98..0fc90a55a 100644 --- a/program/lib/Roundcube/rcube_string_replacer.php +++ b/program/lib/Roundcube/rcube_string_replacer.php @@ -95,12 +95,12 @@ class rcube_string_replacer $attrib = (array)$this->options['link_attribs']; $attrib['href'] = $url_prefix . $url; - $i = $this->add($prefix . html::a($attrib, rcube::Q($url)) . $suffix); + $i = $this->add(html::a($attrib, rcube::Q($url)) . $suffix); } // Return valid link for recognized schemes, otherwise // return the unmodified string for unrecognized schemes. - return $i >= 0 ? $this->get_replacement($i) : $matches[0]; + return $i >= 0 ? $prefix . $this->get_replacement($i) : $matches[0]; } /** diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php index 1ae782a25..fabe0f060 100644 --- a/program/lib/Roundcube/rcube_utils.php +++ b/program/lib/Roundcube/rcube_utils.php @@ -729,8 +729,20 @@ class rcube_utils return $date; } - // support non-standard "GMTXXXX" literal - $date = preg_replace('/GMT\s*([+-][0-9]+)/', '\\1', $date); + // Clean malformed data + $date = preg_replace( + array( + '/GMT\s*([+-][0-9]+)/', // support non-standard "GMTXXXX" literal + '/[^a-z0-9\x20\x09:+-]/i', // remove any invalid characters + '/\s*(Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*/i', // remove weekday names + ), + array( + '\\1', + '', + '', + ), $date); + + $date = trim($date); // if date parsing fails, we have a date in non-rfc format. // remove token from the end and try again diff --git a/program/lib/Roundcube/rcube_vcard.php b/program/lib/Roundcube/rcube_vcard.php index de28767f8..54bb9521d 100644 --- a/program/lib/Roundcube/rcube_vcard.php +++ b/program/lib/Roundcube/rcube_vcard.php @@ -491,7 +491,9 @@ class rcube_vcard if (preg_match('/^END:VCARD$/i', $line)) { // parse vcard $obj = new rcube_vcard(self::cleanup($vcard_block), $charset, true, self::$fieldmap); - if (!empty($obj->displayname) || !empty($obj->email)) { + // FN and N is required by vCard format (RFC 2426) + // on import we can be less restrictive, let's addressbook decide + if (!empty($obj->displayname) || !empty($obj->surname) || !empty($obj->firstname) || !empty($obj->email)) { $out[] = $obj; } diff --git a/program/localization/ar_SA/labels.inc b/program/localization/ar_SA/labels.inc index 7dc8c15ad..cc023c31c 100644 --- a/program/localization/ar_SA/labels.inc +++ b/program/localization/ar_SA/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'الصÙØØ© الØالية'; $labels['unread'] = 'غير المقروءة'; $labels['flagged'] = 'موسوم'; $labels['unanswered'] = 'بلا رد'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Ù…ØذوÙ'; $labels['undeleted'] = 'غير Ù…ØذوÙØ©'; $labels['invert'] = 'عكس'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'إزالة التوقيع من الرسالة $labels['autoaddsignature'] = 'إضاÙØ© التوقيع آلياً'; $labels['newmessageonly'] = 'الرسالة الجديدة Ùقط'; $labels['replyandforwardonly'] = 'الردود والتمريرات Ùقط'; -$labels['replysignaturepos'] = 'إضاÙØ© التوقيع عند الرد أو التمرير'; -$labels['belowquote'] = 'بعد الاقتباس'; -$labels['abovequote'] = 'قبل الاقتباس'; $labels['insertsignature'] = 'إضاÙØ© التوقيع'; $labels['previewpanemarkread'] = 'تØديد الرسائل المÙعاينة كمقروءة'; $labels['afternseconds'] = 'بعد $n ثواني'; diff --git a/program/localization/ast/labels.inc b/program/localization/ast/labels.inc index 996c6043f..c6207c0d7 100644 --- a/program/localization/ast/labels.inc +++ b/program/localization/ast/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'Ensin lleer'; $labels['flagged'] = 'Marcáu'; $labels['unanswered'] = 'Ensin contestar'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Desaniciáu'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invertir'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/az_AZ/labels.inc b/program/localization/az_AZ/labels.inc index 60e861177..7d25c9234 100644 --- a/program/localization/az_AZ/labels.inc +++ b/program/localization/az_AZ/labels.inc @@ -64,7 +64,7 @@ $labels['copy'] = 'Kopyala'; $labels['move'] = 'Köçür'; $labels['moveto'] = 'Burada köçür...'; $labels['download'] = 'Endir'; -$labels['open'] = 'Open'; +$labels['open'] = 'Aç'; $labels['showattachment'] = 'GöstÉ™r'; $labels['showanyway'] = 'Ä°stÉ™nilÉ™n halda göstÉ™r'; @@ -162,6 +162,7 @@ $labels['currpage'] = 'Hazırki sÉ™hifÉ™ni'; $labels['unread'] = 'Oxunmamışları'; $labels['flagged'] = 'Ä°ÅŸarÉ™lilÉ™ri'; $labels['unanswered'] = 'Cavabsızları'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'SilinmiÅŸlÉ™ri'; $labels['undeleted'] = 'SilinmÉ™yib'; $labels['invert'] = 'Ä°nvertlilÉ™ri'; @@ -205,8 +206,8 @@ $labels['body'] = 'MÉ™tn'; $labels['openinextwin'] = 'Yeni pÉ™ncÉ™rÉ™dÉ™ aç'; $labels['emlsave'] = 'Saxla (.eml)'; -$labels['changeformattext'] = 'Display in plain text format'; -$labels['changeformathtml'] = 'Display in HTML format'; +$labels['changeformattext'] = 'SadÉ™ mÉ™tn formatında göstÉ™r'; +$labels['changeformathtml'] = 'HTML formatında göstÉ™r'; // message compose $labels['editasnew'] = 'Yeni kimi redaktÉ™ et'; @@ -338,8 +339,8 @@ $labels['composeto'] = 'SeçilmiÅŸ ünvanlara mÉ™ktub yaz'; $labels['contactsfromto'] = '$count ünvanının $from - $to arası'; $labels['print'] = 'Çap et'; $labels['export'] = 'Ä°xrac et'; -$labels['exportall'] = 'Export all'; -$labels['exportsel'] = 'Export selected'; +$labels['exportall'] = 'Hamısını Ä°xrac et'; +$labels['exportsel'] = 'SeçilmiÅŸlÉ™ri Ä°xrac et'; $labels['exportvcards'] = 'Ãœnvanları vCards formatında ixrac et'; $labels['newcontactgroup'] = 'Ãœnvanlar qrupunu yarat'; $labels['grouprename'] = 'QruÄŸun adını dÉ™yiÅŸdir'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Cavab zamanı imzanı sil'; $labels['autoaddsignature'] = 'Ä°mzanı avtomatik É™lavÉ™ et'; $labels['newmessageonly'] = 'yalnız yeni mÉ™ktublarda'; $labels['replyandforwardonly'] = 'Yalnız cavab vÉ™ yönÉ™ldilÉ™nlÉ™rdÉ™'; -$labels['replysignaturepos'] = 'Cavab vÉ™ yönÉ™ltmÉ™ zamanı imzanı bÉ™rkid'; -$labels['belowquote'] = 'sitatdan sonra'; -$labels['abovequote'] = 'sitatdan É™vvÉ™l'; $labels['insertsignature'] = 'Ä°mza É™lavÉ™ et'; $labels['previewpanemarkread'] = 'Baxılmış ÅŸÉ™killÉ™ri oxunmuÅŸ kimi qeyd et'; $labels['afternseconds'] = '$n saniyÉ™dÉ™n sonra'; diff --git a/program/localization/az_AZ/messages.inc b/program/localization/az_AZ/messages.inc index 939827247..418f270be 100644 --- a/program/localization/az_AZ/messages.inc +++ b/program/localization/az_AZ/messages.inc @@ -17,20 +17,22 @@ */ $messages = array(); -$messages['errortitle'] = 'XÉ™ta baÅŸ verib!'; -$messages['loginfailed'] = 'GiriÅŸ uÄŸursuz oldu'; -$messages['cookiesdisabled'] = 'Sizin brauzer kukilÉ™ri qÉ™bul etmir'; -$messages['sessionerror'] = 'Sizin sessiya köhnÉ™lib'; -$messages['storageerror'] = 'IMAP serverlÉ™ baÄŸlantı alınmadı'; -$messages['servererror'] = 'Server xÉ™tası!'; -$messages['servererrormsg'] = 'Server xÉ™tası: $msg'; -$messages['dberror'] = 'MÉ™lumatlar bazasında xÉ™ta!'; +$messages['errortitle'] = 'XÉ™ta baÅŸ verdi!'; +$messages['loginfailed'] = 'GiriÅŸ uÄŸursuz oldu.'; +$messages['cookiesdisabled'] = 'Sizin brauzer kukilÉ™ri qÉ™bul etmir.'; +$messages['sessionerror'] = 'Sizin sessiya köhnÉ™lib.'; +$messages['storageerror'] = 'IMAP serverlÉ™ baÄŸlantı alınmadı.'; +$messages['servererror'] = 'Server XÉ™tası!'; +$messages['servererrormsg'] = 'Server XÉ™tası: $msg'; +$messages['dberror'] = 'MÉ™lumatlar Bazasında XÉ™ta!'; $messages['requesttimedout'] = 'SorÄŸunun gözlÉ™mÉ™ müddÉ™ti bitdi'; -$messages['errorreadonly'] = 'ÆmÉ™liyyatı etmÉ™k mümkün deyil. Qovluq yalnız oxunuÅŸ üçündür.'; +$messages['errorreadonly'] = 'ÆmÉ™liyyatı icra etmÉ™k mümkün deyil. Qovluq yalnız oxunuÅŸ üçündür.'; $messages['errornoperm'] = 'ÆmÉ™liyyatı etmÉ™k mümkün deyil. GiriÅŸ qadaÄŸandır.'; +$messages['erroroverquota'] = 'ÆmÉ™liyyat icra edilÉ™ bilinmir. BoÅŸ disk hÉ™cmi yoxdur.'; +$messages['erroroverquotadelete'] = 'BoÅŸ disk hÉ™cmi yoxdur. MÉ™ktubu silmÉ™k üçün SHIFT+DEL düymÉ™sini istifadÉ™ edin.'; $messages['invalidrequest'] = 'SÉ™hv sorÄŸu! MÉ™lumat yaddaÅŸda qalmadı.'; -$messages['invalidhost'] = 'SÉ™hv server adı'; -$messages['nomessagesfound'] = 'Poçt qutusunda mÉ™ktub tapılmadı'; +$messages['invalidhost'] = 'SÉ™hv server adı.'; +$messages['nomessagesfound'] = 'Poçt qutusunda mÉ™ktub tapılmadı.'; $messages['loggedout'] = 'Çıxış uÄŸurlu oldu. SaÄŸ olun!'; $messages['mailboxempty'] = 'Poçt qutusu boÅŸdur'; $messages['refreshing'] = 'YenilÉ™nmÉ™...'; diff --git a/program/localization/be_BE/labels.inc b/program/localization/be_BE/labels.inc index db3893ced..3bb5c4436 100644 --- a/program/localization/be_BE/labels.inc +++ b/program/localization/be_BE/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'Unread'; $labels['flagged'] = 'Flagged'; $labels['unanswered'] = 'Unanswered'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/bg_BG/labels.inc b/program/localization/bg_BG/labels.inc index fa92ec042..dfe9d2d26 100644 --- a/program/localization/bg_BG/labels.inc +++ b/program/localization/bg_BG/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Страница'; $labels['unread'] = 'Ðови'; $labels['flagged'] = 'ОтбелÑзано'; $labels['unanswered'] = 'Без отговор'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Изтрито'; $labels['undeleted'] = 'Ðе е изтрит'; $labels['invert'] = 'Инвертирай'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Премахване на Ð¿Ñ€ÐµÐ´Ð¸ÑˆÐ½Ð¸Ñ $labels['autoaddsignature'] = 'Ðвтоматично добавÑне на подпиÑ'; $labels['newmessageonly'] = 'Ñамо на нови ÑъобщениÑ'; $labels['replyandforwardonly'] = 'Ñамо на отговори и препратени'; -$labels['replysignaturepos'] = 'ПоÑтавÑне на Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ð¿Ñ€Ð¸ отговор или препращане'; -$labels['belowquote'] = 'над цитатът'; -$labels['abovequote'] = 'под цитатът'; $labels['insertsignature'] = 'Вмъкване на подпиÑ'; $labels['previewpanemarkread'] = 'Маркиране на прегледаните ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÐ°Ñ‚Ð¾ прочетени'; $labels['afternseconds'] = 'Ñлед $n Ñекунди'; diff --git a/program/localization/bn_BD/labels.inc b/program/localization/bn_BD/labels.inc index 0f20bba37..58f4467d3 100644 --- a/program/localization/bn_BD/labels.inc +++ b/program/localization/bn_BD/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'নাদেখা (unread)'; $labels['flagged'] = 'দাগানো (flagged)'; $labels['unanswered'] = 'উতà§à¦¤à¦° না দেওয়া গà§à¦²à§‹'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/br/labels.inc b/program/localization/br/labels.inc index 95756e393..0755a6d9b 100644 --- a/program/localization/br/labels.inc +++ b/program/localization/br/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'Na lennet'; $labels['flagged'] = 'Flagged'; $labels['unanswered'] = 'Unanswered'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/bs_BA/labels.inc b/program/localization/bs_BA/labels.inc index f2a871cdd..d81d97320 100644 --- a/program/localization/bs_BA/labels.inc +++ b/program/localization/bs_BA/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Trenutna stranica'; $labels['unread'] = 'NeproÄitano'; $labels['flagged'] = 'Važno'; $labels['unanswered'] = 'Neodgovoreno'; +$labels['withattachment'] = 'Sa prilogom'; $labels['deleted'] = 'Obrisano'; $labels['undeleted'] = 'Nije obrisano'; $labels['invert'] = 'Izokreni'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Prilikom odgovaranja na poruku, ukloni origin $labels['autoaddsignature'] = 'Automatski dodaj potpis'; $labels['newmessageonly'] = 'samo za nove poruke'; $labels['replyandforwardonly'] = 'samo za odgovore i prosljeÄ‘ivanja'; -$labels['replysignaturepos'] = 'Prilikom odgovaranja ili prosljeÄ‘ivanja potpis ubaci'; -$labels['belowquote'] = 'ispod citata'; -$labels['abovequote'] = 'iznad citata'; $labels['insertsignature'] = 'Umetni potpis'; $labels['previewpanemarkread'] = 'Obilježi prikazane poruke kao proÄitane'; $labels['afternseconds'] = 'nakon $n sekundi'; diff --git a/program/localization/ca_ES/labels.inc b/program/localization/ca_ES/labels.inc index 1bcb526ea..25dbb1155 100644 --- a/program/localization/ca_ES/labels.inc +++ b/program/localization/ca_ES/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Pà gina actual'; $labels['unread'] = 'No llegits'; $labels['flagged'] = 'Marcat'; $labels['unanswered'] = 'No respost'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Suprimit'; $labels['undeleted'] = 'No s\'ha suprimit'; $labels['invert'] = 'Inverteix'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Quan es contesti, suprimeix la signatura orig $labels['autoaddsignature'] = 'Afegeix la signatura automà ticament'; $labels['newmessageonly'] = 'només si és un missatge nou'; $labels['replyandforwardonly'] = 'només a respostes i reenviaments'; -$labels['replysignaturepos'] = 'Quan es contesti o reenviï, posa-hi la signatura'; -$labels['belowquote'] = 'sota les cometes'; -$labels['abovequote'] = 'sobre les cometes'; $labels['insertsignature'] = 'Inserta la signatura'; $labels['previewpanemarkread'] = 'Marca els missatges previsualitzats com a llegits'; $labels['afternseconds'] = 'després de $n segons'; diff --git a/program/localization/cs_CZ/labels.inc b/program/localization/cs_CZ/labels.inc index 2240065e7..cb94c71c9 100644 --- a/program/localization/cs_CZ/labels.inc +++ b/program/localization/cs_CZ/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Aktuálnà stránka'; $labels['unread'] = 'NepÅ™eÄtené'; $labels['flagged'] = 'OznaÄené'; $labels['unanswered'] = 'NeoznaÄené'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Smazané'; $labels['undeleted'] = 'Nesmazáno'; $labels['invert'] = 'PÅ™evrátit'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'PÅ™i odpovÃdánà odstranit ze zprávy půvo $labels['autoaddsignature'] = 'Automaticky pÅ™idat podpis'; $labels['newmessageonly'] = 'pouze k novým zprávám'; $labels['replyandforwardonly'] = 'jen k odpovÄ›di a pÅ™eposÃlané zprávÄ›'; -$labels['replysignaturepos'] = 'PÅ™i odpovÃdánà nebo pÅ™eposÃlánà zprávy vložit podpis'; -$labels['belowquote'] = 'pod citaci'; -$labels['abovequote'] = 'nad citaci'; $labels['insertsignature'] = 'Vložit podpis'; $labels['previewpanemarkread'] = 'OznaÄit zobrazené zprávy jako pÅ™eÄtené'; $labels['afternseconds'] = 'po $n sekundách'; diff --git a/program/localization/cy_GB/labels.inc b/program/localization/cy_GB/labels.inc index 9b695e140..2a22827bf 100644 --- a/program/localization/cy_GB/labels.inc +++ b/program/localization/cy_GB/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Tudalen gyfredol'; $labels['unread'] = 'Heb eu darllen'; $labels['flagged'] = 'Nodwyd'; $labels['unanswered'] = 'Heb ei ateb'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Dilewyd'; $labels['undeleted'] = 'Heb ei ddileu'; $labels['invert'] = 'Gwrth-droi'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Wrth ateb, dileu\'r llofnod gwreiddiol o\'r n $labels['autoaddsignature'] = 'Ychwanegu llofnod yn awtomatig'; $labels['newmessageonly'] = 'negeseuon newydd yn unig'; $labels['replyandforwardonly'] = 'atebion a danfon ymlaen yn unig'; -$labels['replysignaturepos'] = 'Wrth ateb neu ddanfon ymlaen, rhoi\'r llofnod'; -$labels['belowquote'] = 'o dan y dyfynniad'; -$labels['abovequote'] = 'uwchben y dyfynniad'; $labels['insertsignature'] = 'Mewnosod llofnod'; $labels['previewpanemarkread'] = 'Nodi negeseuon rhagolwg fel darllenwyd'; $labels['afternseconds'] = 'ar ôl $n eiliad'; diff --git a/program/localization/da_DK/labels.inc b/program/localization/da_DK/labels.inc index cb4e3b55c..da92c2fcc 100644 --- a/program/localization/da_DK/labels.inc +++ b/program/localization/da_DK/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Aktuel side'; $labels['unread'] = 'Ulæste'; $labels['flagged'] = 'Markeret'; $labels['unanswered'] = 'Ubesvaret'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Slettede'; $labels['undeleted'] = 'Ikke slettet'; $labels['invert'] = 'Invertér'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Fjern original signatur fra besked, nÃ¥r der $labels['autoaddsignature'] = 'Indsæt automatisk signatur'; $labels['newmessageonly'] = 'kun pÃ¥ nye beskeder'; $labels['replyandforwardonly'] = 'kun pÃ¥ svar og videresendelse af beskeder'; -$labels['replysignaturepos'] = 'NÃ¥r beskeder besvares eller videresendes; indsæt signatur'; -$labels['belowquote'] = 'under det citerede'; -$labels['abovequote'] = 'over det citerede'; $labels['insertsignature'] = 'Indsæt signatur'; $labels['previewpanemarkread'] = 'Markér forhÃ¥ndsviste beskeder som læst'; $labels['afternseconds'] = 'efter $n sekunder'; diff --git a/program/localization/de_CH/labels.inc b/program/localization/de_CH/labels.inc index 98bbd8837..82cee4fe2 100644 --- a/program/localization/de_CH/labels.inc +++ b/program/localization/de_CH/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Aktuelle Seite'; $labels['unread'] = 'Ungelesene'; $labels['flagged'] = 'Markierte'; $labels['unanswered'] = 'Unbeantwortete'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Gelöschte'; $labels['undeleted'] = 'Nicht gelöscht'; $labels['invert'] = 'Umkehren'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Beim Antworten die Signatur der Originalnachr $labels['autoaddsignature'] = 'Signatur automatisch einfügen'; $labels['newmessageonly'] = 'nur bei neuen Nachrichten'; $labels['replyandforwardonly'] = 'nur bei Antworten und Weiterleitungen'; -$labels['replysignaturepos'] = 'Beim Antworten oder Weiterleiten die Signatur'; -$labels['belowquote'] = 'unter der Originalnachricht einfügen'; -$labels['abovequote'] = 'über der Originalnachricht einfügen'; $labels['insertsignature'] = 'Signatur einfügen'; $labels['previewpanemarkread'] = 'Nachricht in Vorschau als gelesen markieren'; $labels['afternseconds'] = 'nach $n Sekunden'; diff --git a/program/localization/de_DE/labels.inc b/program/localization/de_DE/labels.inc index 956e32aa4..211607288 100644 --- a/program/localization/de_DE/labels.inc +++ b/program/localization/de_DE/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Aktuelle Seite'; $labels['unread'] = 'Ungelesene'; $labels['flagged'] = 'Markierte'; $labels['unanswered'] = 'Unbeantwortete'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Gelöschte'; $labels['undeleted'] = 'Nicht gelöscht'; $labels['invert'] = 'Invertieren'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Beim Antworten Signatur der Originalnachricht $labels['autoaddsignature'] = 'Signatur automatisch einfügen'; $labels['newmessageonly'] = 'nur bei neuen Nachrichten'; $labels['replyandforwardonly'] = 'nur bei Antworten und Weiterleitungen'; -$labels['replysignaturepos'] = 'Beim Antworten die Signatur'; -$labels['belowquote'] = 'unter der Originalnachricht einfügen'; -$labels['abovequote'] = 'über der Originalnachricht einfügen'; $labels['insertsignature'] = 'Signatur einfügen'; $labels['previewpanemarkread'] = 'Nachricht in Vorschau als gelesen markieren'; $labels['afternseconds'] = 'nach $n Sekunden'; diff --git a/program/localization/el_GR/labels.inc b/program/localization/el_GR/labels.inc index b3166730f..4e1db7002 100644 --- a/program/localization/el_GR/labels.inc +++ b/program/localization/el_GR/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'ΤÏÎχουσα σελίδα'; $labels['unread'] = 'Μη αναγνωσμÎνο'; $labels['flagged'] = 'ΣημειωμÎνο'; $labels['unanswered'] = 'Αναπάντητο'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'ΔιεγÏαμμÎνο'; $labels['undeleted'] = 'Μη διεγÏαμμÎνο'; $labels['invert'] = 'ΑναστÏοφή'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Όταν το μήνυμα είναι απάΠ$labels['autoaddsignature'] = 'Η υπογÏαφή να Ï€Ïοστίθεται αυτόματα'; $labels['newmessageonly'] = 'μόνο στα νÎα μηνÏματα'; $labels['replyandforwardonly'] = 'μόνο στις απαντήσεις και Ï€Ïοωθήσεις'; -$labels['replysignaturepos'] = 'Όταν γίνεται απάντηση ή Ï€Ïοώθηση, η υπογÏαφή να τοποθετείτε'; -$labels['belowquote'] = 'πάνω από την παÏάθεση'; -$labels['abovequote'] = 'κάτω από την παÏάθεση'; $labels['insertsignature'] = 'Î Ïοσθήκη υπογÏαφής'; $labels['previewpanemarkread'] = 'Στα μηνÏματα που Îγινε Ï€Ïοεπισκόπηση να μαÏκάÏονται σαν αναγνωσμÎνα'; $labels['afternseconds'] = 'μετά από $n δευτεÏόλεπτα'; diff --git a/program/localization/en_GB/labels.inc b/program/localization/en_GB/labels.inc index 49b6be519..8d5509b64 100644 --- a/program/localization/en_GB/labels.inc +++ b/program/localization/en_GB/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'Unread'; $labels['flagged'] = 'Flagged'; $labels['unanswered'] = 'Unanswered'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc index 252e0ce68..3e1bde0a5 100644 --- a/program/localization/en_US/labels.inc +++ b/program/localization/en_US/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'Unread'; $labels['flagged'] = 'Flagged'; $labels['unanswered'] = 'Unanswered'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/eo/labels.inc b/program/localization/eo/labels.inc index 823fc25cb..bb678479e 100644 --- a/program/localization/eo/labels.inc +++ b/program/localization/eo/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Nuna paÄo'; $labels['unread'] = 'Nelegitan'; $labels['flagged'] = 'Markita'; $labels['unanswered'] = 'Nerespondita'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Forigita'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Inversigu'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/es_AR/labels.inc b/program/localization/es_AR/labels.inc index 3e6793e51..b4b318053 100644 --- a/program/localization/es_AR/labels.inc +++ b/program/localization/es_AR/labels.inc @@ -41,7 +41,7 @@ $labels['junk'] = 'Basura'; // message listing $labels['subject'] = 'Asunto'; $labels['from'] = 'Remitente'; -$labels['sender'] = 'Sender'; +$labels['sender'] = 'Remitente'; $labels['to'] = 'Destinatario'; $labels['cc'] = 'Copia'; $labels['bcc'] = 'Cco'; @@ -52,21 +52,21 @@ $labels['size'] = 'Tamaño'; $labels['priority'] = 'Prioridad'; $labels['organization'] = 'Organización'; $labels['readstatus'] = 'Read status'; -$labels['listoptions'] = 'List options...'; +$labels['listoptions'] = 'Listar opciones...'; $labels['mailboxlist'] = 'Carpetas'; $labels['messagesfromto'] = 'Mensajes $from a $to de $count'; -$labels['threadsfromto'] = 'Threads $from to $to of $count'; +$labels['threadsfromto'] = '$from a $to de $count conversaciones'; $labels['messagenrof'] = 'Mensaje $nr de $count'; -$labels['fromtoshort'] = '$from – $to of $count'; +$labels['fromtoshort'] = '$from – $to de $count'; $labels['copy'] = 'Copiar'; $labels['move'] = 'Mover'; $labels['moveto'] = 'Mover a...'; $labels['download'] = 'Descargar'; $labels['open'] = 'Open'; -$labels['showattachment'] = 'Show'; -$labels['showanyway'] = 'Show it anyway'; +$labels['showattachment'] = 'Mostrar'; +$labels['showanyway'] = 'Mostrar esto siempre'; $labels['filename'] = 'Nombre del archivo'; $labels['filesize'] = 'Tamaño del archivo'; @@ -122,18 +122,18 @@ $labels['longdec'] = 'Diciembre'; $labels['today'] = 'Hoy'; // toolbar buttons -$labels['refresh'] = 'Refresh'; +$labels['refresh'] = 'Actualizar'; $labels['checkmail'] = 'Revisar si hay nuevos mensajes'; $labels['compose'] = 'Escribir un mensaje'; $labels['writenewmessage'] = 'Crear nuevo mensaje'; -$labels['reply'] = 'Reply'; +$labels['reply'] = 'Responder'; $labels['replytomessage'] = 'Responder mensaje'; $labels['replytoallmessage'] = 'Responder al emisor y a todos los destinatarios'; -$labels['replyall'] = 'Reply all'; -$labels['replylist'] = 'Reply list'; -$labels['forward'] = 'Forward'; -$labels['forwardinline'] = 'Forward inline'; -$labels['forwardattachment'] = 'Forward as attachment'; +$labels['replyall'] = 'Responder a todos'; +$labels['replylist'] = 'Responder a lista'; +$labels['forward'] = 'Reenviar'; +$labels['forwardinline'] = 'Reenviar en linea'; +$labels['forwardattachment'] = 'Reenviar como adjunto'; $labels['forwardmessage'] = 'Reenviar mensaje'; $labels['deletemessage'] = 'Eliminar mensaje'; $labels['movemessagetotrash'] = 'Mover mensaje a la papelera'; @@ -144,16 +144,16 @@ $labels['nextmessage'] = 'Mostrar siguente mensaje'; $labels['lastmessage'] = 'Mostrar último mensaje'; $labels['backtolist'] = 'Volver a la lista de mensajes'; $labels['viewsource'] = 'Mostrar código'; -$labels['mark'] = 'Mark'; +$labels['mark'] = 'Marcar'; $labels['markmessages'] = 'Marcar mensajes'; $labels['markread'] = 'Como leÃdo'; $labels['markunread'] = 'Como no leÃdo'; $labels['markflagged'] = 'Como marcado'; $labels['markunflagged'] = 'Como no marcado'; -$labels['moreactions'] = 'More actions...'; -$labels['more'] = 'More'; -$labels['back'] = 'Back'; -$labels['options'] = 'Options'; +$labels['moreactions'] = 'Mas acciones...'; +$labels['more'] = 'Más'; +$labels['back'] = 'Atrás'; +$labels['options'] = 'Opciones'; $labels['select'] = 'Elija'; $labels['all'] = 'Todos'; @@ -162,34 +162,35 @@ $labels['currpage'] = 'Página actual'; $labels['unread'] = 'Sin leer'; $labels['flagged'] = 'Marcado'; $labels['unanswered'] = 'Sin respuesta'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Eliminado'; -$labels['undeleted'] = 'Not deleted'; +$labels['undeleted'] = 'No eliminado'; $labels['invert'] = 'Invertir'; $labels['filter'] = 'Filtrar'; -$labels['list'] = 'List'; -$labels['threads'] = 'Threads'; +$labels['list'] = 'Lista'; +$labels['threads'] = 'Conversaciones'; $labels['expand-all'] = 'Expandir Todos'; $labels['expand-unread'] = 'Expandir No Leidos'; $labels['collapse-all'] = 'Colapsar Todos'; -$labels['threaded'] = 'Threaded'; +$labels['threaded'] = 'Como conversaciones'; -$labels['autoexpand_threads'] = 'Expand message threads'; -$labels['do_expand'] = 'all threads'; +$labels['autoexpand_threads'] = 'Expandir mensajes en conversación'; +$labels['do_expand'] = 'todas las conversaciones'; $labels['expand_only_unread'] = 'solo con mensajes no leÃdos'; -$labels['fromto'] = 'From/To'; -$labels['flag'] = 'Flag'; +$labels['fromto'] = 'De/A'; +$labels['flag'] = 'Marca'; $labels['attachment'] = 'Adjunto'; $labels['nonesort'] = 'Ninguno'; $labels['sentdate'] = 'Fecha de Enviado'; $labels['arrival'] = 'Fecha de Recepción'; $labels['asc'] = 'Ascendente'; $labels['desc'] = 'Descendente'; -$labels['listcolumns'] = 'List columns'; -$labels['listsorting'] = 'Sorting column'; -$labels['listorder'] = 'Sorting order'; +$labels['listcolumns'] = 'Listar columnas'; +$labels['listsorting'] = 'Ordenar por'; +$labels['listorder'] = 'Ordenado por'; $labels['listmode'] = 'List view mode'; -$labels['folderactions'] = 'Folder actions...'; +$labels['folderactions'] = 'Acciones de carpeta...'; $labels['compact'] = 'Compactar'; $labels['empty'] = 'Vaciar'; @@ -210,29 +211,29 @@ $labels['changeformathtml'] = 'Display in HTML format'; // message compose $labels['editasnew'] = 'Editar como nuevo'; -$labels['send'] = 'Send'; +$labels['send'] = 'Enviar'; $labels['sendmessage'] = 'Enviar ahora el mensaje'; $labels['savemessage'] = 'Guardar como borrador'; $labels['addattachment'] = 'Añadir un archivo'; $labels['charset'] = 'Codificación'; $labels['editortype'] = 'Tipo de editor'; $labels['returnreceipt'] = 'Acuse de recibo'; -$labels['dsn'] = 'Delivery status notification'; -$labels['mailreplyintro'] = 'On $date, $sender wrote:'; -$labels['originalmessage'] = 'Original Message'; +$labels['dsn'] = 'Notificación de estado del envÃo'; +$labels['mailreplyintro'] = 'El $date, $sender escribió:'; +$labels['originalmessage'] = 'Mensaje original'; -$labels['editidents'] = 'Edit identities'; -$labels['spellcheck'] = 'Spell'; +$labels['editidents'] = 'Editar identidades'; +$labels['spellcheck'] = 'Gramática'; $labels['checkspelling'] = 'Revisar ortografÃa'; $labels['resumeediting'] = 'Continuar edición'; $labels['revertto'] = 'Revertir a'; -$labels['attach'] = 'Attach'; +$labels['attach'] = 'Adjuntar'; $labels['attachments'] = 'Adjuntos'; $labels['upload'] = 'Agregar'; -$labels['uploadprogress'] = '$percent ($current from $total)'; +$labels['uploadprogress'] = '$percent ($current de $total)'; $labels['close'] = 'Cerrar'; -$labels['messageoptions'] = 'Message options...'; +$labels['messageoptions'] = 'Opciones de mensaje...'; $labels['low'] = 'Bajo'; $labels['lowest'] = 'BajÃsimo'; @@ -243,9 +244,9 @@ $labels['highest'] = 'AltÃsimo'; $labels['nosubject'] = '(sin asunto)'; $labels['showimages'] = 'Mostrar imágenes'; $labels['alwaysshow'] = 'Siempre mostrar imágenes de $sender'; -$labels['isdraft'] = 'This is a draft message.'; -$labels['andnmore'] = '$nr more...'; -$labels['togglemoreheaders'] = 'Show more message headers'; +$labels['isdraft'] = 'Este es un borrador.'; +$labels['andnmore'] = '$nr más...'; +$labels['togglemoreheaders'] = 'Mostrarme más encabezados de mensaje'; $labels['togglefullheaders'] = 'Toggle raw message headers'; $labels['htmltoggle'] = 'HTML'; @@ -269,68 +270,68 @@ $labels['receiptnote'] = 'Nota: Esta notificación sólo significa que su mensaj $labels['name'] = 'Nombre completo'; $labels['firstname'] = 'Nombre'; $labels['surname'] = 'Apellido'; -$labels['middlename'] = 'Middle Name'; -$labels['nameprefix'] = 'Prefix'; -$labels['namesuffix'] = 'Suffix'; -$labels['nickname'] = 'Nickname'; -$labels['jobtitle'] = 'Job Title'; -$labels['department'] = 'Department'; -$labels['gender'] = 'Gender'; -$labels['maidenname'] = 'Maiden Name'; +$labels['middlename'] = 'Segundo nombre'; +$labels['nameprefix'] = 'Prefijo'; +$labels['namesuffix'] = 'Subfijo'; +$labels['nickname'] = 'Sobre nombre'; +$labels['jobtitle'] = 'Puesto'; +$labels['department'] = 'Departamento'; +$labels['gender'] = 'Sexo'; +$labels['maidenname'] = 'Apellido de soltera'; $labels['email'] = 'Correo'; -$labels['phone'] = 'Phone'; -$labels['address'] = 'Address'; -$labels['street'] = 'Street'; -$labels['locality'] = 'City'; -$labels['zipcode'] = 'ZIP Code'; -$labels['region'] = 'State/Province'; -$labels['country'] = 'Country'; -$labels['birthday'] = 'Birthday'; -$labels['anniversary'] = 'Anniversary'; -$labels['website'] = 'Website'; -$labels['instantmessenger'] = 'IM'; -$labels['notes'] = 'Notes'; -$labels['male'] = 'male'; -$labels['female'] = 'female'; -$labels['manager'] = 'Manager'; -$labels['assistant'] = 'Assistant'; -$labels['spouse'] = 'Spouse'; -$labels['allfields'] = 'All fields'; -$labels['search'] = 'Search'; -$labels['advsearch'] = 'Advanced Search'; -$labels['advanced'] = 'Advanced'; -$labels['other'] = 'Other'; - -$labels['typehome'] = 'Home'; -$labels['typework'] = 'Work'; -$labels['typeother'] = 'Other'; -$labels['typemobile'] = 'Mobile'; -$labels['typemain'] = 'Main'; -$labels['typehomefax'] = 'Home Fax'; -$labels['typeworkfax'] = 'Work Fax'; -$labels['typecar'] = 'Car'; +$labels['phone'] = 'Teléfono'; +$labels['address'] = 'Dirección'; +$labels['street'] = 'Calle'; +$labels['locality'] = 'Ciudad'; +$labels['zipcode'] = 'Código Postal'; +$labels['region'] = 'Estado/Provincia'; +$labels['country'] = 'PaÃs'; +$labels['birthday'] = 'Cumpleaños'; +$labels['anniversary'] = 'Aniversario'; +$labels['website'] = 'Sitio Web'; +$labels['instantmessenger'] = 'MensajerÃa Instantanea'; +$labels['notes'] = 'Notas'; +$labels['male'] = 'masculino'; +$labels['female'] = 'femenino'; +$labels['manager'] = 'Administrador'; +$labels['assistant'] = 'Asistente'; +$labels['spouse'] = 'Cónygue'; +$labels['allfields'] = 'Todos los campos'; +$labels['search'] = 'Buscar'; +$labels['advsearch'] = 'Búsqueda Avanzada'; +$labels['advanced'] = 'Avanzado'; +$labels['other'] = 'Otro'; + +$labels['typehome'] = 'Particular'; +$labels['typework'] = 'Laboral'; +$labels['typeother'] = 'Otro'; +$labels['typemobile'] = 'Móvil'; +$labels['typemain'] = 'Principal'; +$labels['typehomefax'] = 'Fax Particular'; +$labels['typeworkfax'] = 'Fax Laboral'; +$labels['typecar'] = 'Auto'; $labels['typepager'] = 'Pager'; $labels['typevideo'] = 'Video'; -$labels['typeassistant'] = 'Assistant'; -$labels['typehomepage'] = 'Home Page'; +$labels['typeassistant'] = 'Asistente'; +$labels['typehomepage'] = 'Página Personal'; $labels['typeblog'] = 'Blog'; -$labels['typeprofile'] = 'Profile'; +$labels['typeprofile'] = 'Perfil'; -$labels['addfield'] = 'Add field...'; +$labels['addfield'] = 'Agregar campo...'; $labels['addcontact'] = 'Añadir nuevo contacto'; $labels['editcontact'] = 'Editar contacto'; -$labels['contacts'] = 'Contacts'; -$labels['contactproperties'] = 'Contact properties'; -$labels['personalinfo'] = 'Personal information'; +$labels['contacts'] = 'Contactos'; +$labels['contactproperties'] = 'Propiedades del contacto'; +$labels['personalinfo'] = 'Información personal'; $labels['edit'] = 'Editar'; $labels['cancel'] = 'Cancelar'; $labels['save'] = 'Guardar'; $labels['delete'] = 'Eliminar'; -$labels['rename'] = 'Rename'; -$labels['addphoto'] = 'Add'; -$labels['replacephoto'] = 'Replace'; -$labels['uploadphoto'] = 'Upload photo'; +$labels['rename'] = 'Renombrar'; +$labels['addphoto'] = 'Agregar'; +$labels['replacephoto'] = 'Reemplazar'; +$labels['uploadphoto'] = 'Subir foto'; $labels['newcontact'] = 'Añadir nuevo contacto'; $labels['deletecontact'] = 'Eliminar contactos seleccionados'; @@ -342,9 +343,9 @@ $labels['exportall'] = 'Export all'; $labels['exportsel'] = 'Export selected'; $labels['exportvcards'] = 'Exportar contactos en format vCard'; $labels['newcontactgroup'] = 'Crear Nuevo Grupo de Contacto'; -$labels['grouprename'] = 'Rename group'; -$labels['groupdelete'] = 'Delete group'; -$labels['groupremoveselected'] = 'Remove selected contacts from group'; +$labels['grouprename'] = 'Renombrar grupo'; +$labels['groupdelete'] = 'Eliminar grupo'; +$labels['groupremoveselected'] = 'Remover del grupo los contactos seleccionados'; $labels['previouspage'] = 'Mostrar grupo anterior'; $labels['firstpage'] = 'Mostrar primer grupo'; @@ -355,20 +356,20 @@ $labels['group'] = 'Grupo'; $labels['groups'] = 'Grupos'; $labels['personaladrbook'] = 'Direcciones personales'; -$labels['searchsave'] = 'Save search'; -$labels['searchdelete'] = 'Delete search'; +$labels['searchsave'] = 'Guardar búsqueda'; +$labels['searchdelete'] = 'Eliminar búsqueda'; $labels['import'] = 'Importar'; $labels['importcontacts'] = 'Importar contactos'; $labels['importfromfile'] = 'Importar desde el archivo:'; -$labels['importtarget'] = 'Add new contacts to address book:'; +$labels['importtarget'] = 'Agregar nuevos contactos a la libreta de direcciones:'; $labels['importreplace'] = 'Reemplazar completamente la lista de contactos'; -$labels['importdesc'] = 'You can upload contacts from an existing address book.<br/>We currently support importing addresses from the <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> or CSV (comma-separated) data format.'; +$labels['importdesc'] = 'Puedes subir contactos desde una libreta de direcciones existente.<br/>Actualmente soportamos la importación de direcciones utilizando el formato <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> o CSV (Valores Separados por Coma).'; $labels['done'] = 'Hecho'; // settings $labels['settingsfor'] = 'Configuración para'; -$labels['about'] = 'About'; +$labels['about'] = 'Acerca de'; $labels['preferences'] = 'Preferencias'; $labels['userpreferences'] = 'Preferencias de usuario'; $labels['editpreferences'] = 'Editar preferencias de usuario'; @@ -385,8 +386,8 @@ $labels['defaultcharset'] = 'Juego de Caracteres por Defecto'; $labels['htmlmessage'] = 'Mensaje HTML'; $labels['messagepart'] = 'Part'; $labels['digitalsig'] = 'Digital Signature'; -$labels['dateformat'] = 'Date format'; -$labels['timeformat'] = 'Time format'; +$labels['dateformat'] = 'Formato de fecha'; +$labels['timeformat'] = 'Formato de tiempo'; $labels['prettydate'] = 'Fecha detallada'; $labels['setdefault'] = 'Seleccionar opción por defecto'; $labels['autodetect'] = 'Automático'; @@ -395,11 +396,11 @@ $labels['timezone'] = 'Zona horaria'; $labels['pagesize'] = 'Filas por página'; $labels['signature'] = 'Firma'; $labels['dstactive'] = 'Cambio de horario'; -$labels['showinextwin'] = 'Open message in a new window'; -$labels['composeextwin'] = 'Compose in a new window'; +$labels['showinextwin'] = 'Abrir mensaje en nueva ventana'; +$labels['composeextwin'] = 'Redactar en nueva ventana'; $labels['htmleditor'] = 'Componer mensaje en HTML'; -$labels['htmlonreply'] = 'on reply to HTML message'; -$labels['htmlonreplyandforward'] = 'on forward or reply to HTML message'; +$labels['htmlonreply'] = 'al responder un mensaje HTML'; +$labels['htmlonreplyandforward'] = 'al reenviar o responder un mensaje HTML'; $labels['htmlsignature'] = 'Firma HTML'; $labels['previewpane'] = 'Mostrar vista preliminar'; $labels['skin'] = 'Apariencia de la interfaz'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Al responder, eliminar la firma del mensaje o $labels['autoaddsignature'] = 'Agregar la firma automáticamente'; $labels['newmessageonly'] = 'nuevos mensajes solamente'; $labels['replyandforwardonly'] = 'respuestas o reenvios solamente'; -$labels['replysignaturepos'] = 'Agregar firma al responder o reenviar'; -$labels['belowquote'] = 'debajo de la cita'; -$labels['abovequote'] = 'sobre la cita'; $labels['insertsignature'] = 'Insertar firma'; $labels['previewpanemarkread'] = 'Marcar mensajes previsualizados como leidos'; $labels['afternseconds'] = 'despues de $n segundos'; diff --git a/program/localization/es_ES/labels.inc b/program/localization/es_ES/labels.inc index cbee58b6e..451b762b6 100644 --- a/program/localization/es_ES/labels.inc +++ b/program/localization/es_ES/labels.inc @@ -64,7 +64,7 @@ $labels['copy'] = 'Copiar'; $labels['move'] = 'Mover'; $labels['moveto'] = 'Mover a…'; $labels['download'] = 'Descargar'; -$labels['open'] = 'Open'; +$labels['open'] = 'Abrir'; $labels['showattachment'] = 'Mostrar'; $labels['showanyway'] = 'Mostrarlo de todos modos'; @@ -162,6 +162,7 @@ $labels['currpage'] = 'Página actual'; $labels['unread'] = 'Sin leer'; $labels['flagged'] = 'Señalado'; $labels['unanswered'] = 'Sin respuesta'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Eliminado'; $labels['undeleted'] = 'No eliminado'; $labels['invert'] = 'Invertir'; @@ -205,8 +206,8 @@ $labels['body'] = 'Cuerpo'; $labels['openinextwin'] = 'Abrir en nueva ventana'; $labels['emlsave'] = 'Descargar (.eml)'; -$labels['changeformattext'] = 'Display in plain text format'; -$labels['changeformathtml'] = 'Display in HTML format'; +$labels['changeformattext'] = 'Mostrar en formato de texto sencillo'; +$labels['changeformathtml'] = 'Mostrar en formato HTML'; // message compose $labels['editasnew'] = 'Editar como nuevo'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Eliminar la firma original del mensaje al res $labels['autoaddsignature'] = 'Añadir firma automáticamente'; $labels['newmessageonly'] = 'solamente mensaje nuevo'; $labels['replyandforwardonly'] = 'respuestas y reenvÃos solamente'; -$labels['replysignaturepos'] = 'Colocar firma al responder o reenviar'; -$labels['belowquote'] = 'abajo del texto seleccionado'; -$labels['abovequote'] = 'arriba del texto seleccionado'; $labels['insertsignature'] = 'Insertar firma'; $labels['previewpanemarkread'] = 'Marcar mensaje previsualizado como leÃdo'; $labels['afternseconds'] = 'después de $n segundos'; diff --git a/program/localization/et_EE/labels.inc b/program/localization/et_EE/labels.inc index cb184b086..ad47c15f1 100644 --- a/program/localization/et_EE/labels.inc +++ b/program/localization/et_EE/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Praegune leht'; $labels['unread'] = 'Lugemata'; $labels['flagged'] = 'Märgistatud'; $labels['unanswered'] = 'Vastamata'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Kustutatud'; $labels['undeleted'] = 'Pole kustutatud'; $labels['invert'] = 'Vaheta'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Vastates eemalda kirjast esialgne allkiri'; $labels['autoaddsignature'] = 'Lisa allkiri automaatselt'; $labels['newmessageonly'] = 'ainult uutele'; $labels['replyandforwardonly'] = 'ainult vastates ja edastades'; -$labels['replysignaturepos'] = 'Vastates või edastades aseta allkiri'; -$labels['belowquote'] = 'tsiteeritu alla'; -$labels['abovequote'] = 'tsiteeritu kohale'; $labels['insertsignature'] = 'Sisesta allkiri'; $labels['previewpanemarkread'] = 'Märgi eelvaadatud kirjad loetuks'; $labels['afternseconds'] = '$n sekundi pärast'; diff --git a/program/localization/eu_ES/labels.inc b/program/localization/eu_ES/labels.inc index eb61f4c8c..f6b3cfba6 100644 --- a/program/localization/eu_ES/labels.inc +++ b/program/localization/eu_ES/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Uneko orrialdea'; $labels['unread'] = 'Irakurri gabeak'; $labels['flagged'] = 'Banderaduna'; $labels['unanswered'] = 'Unanswered'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Ezabatuak'; $labels['undeleted'] = 'Ezabatu gabeak'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/fa_AF/labels.inc b/program/localization/fa_AF/labels.inc index 6a4904d7e..c8eab1d2c 100644 --- a/program/localization/fa_AF/labels.inc +++ b/program/localization/fa_AF/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'ناخوانده'; $labels['flagged'] = 'نشانی شده'; $labels['unanswered'] = 'پیامهای جواب نداده شده'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/fa_IR/labels.inc b/program/localization/fa_IR/labels.inc index 8bba66c26..a1c45fb36 100644 --- a/program/localization/fa_IR/labels.inc +++ b/program/localization/fa_IR/labels.inc @@ -22,7 +22,7 @@ $labels = array(); $labels['welcome'] = 'به $product خوش آمدید'; $labels['username'] = 'نام کاربری'; $labels['password'] = 'گذرواژه'; -$labels['server'] = 'سرور'; +$labels['server'] = 'سرویس‌دهنده'; $labels['login'] = 'ورود'; // taskbar @@ -34,8 +34,8 @@ $labels['addressbook'] = 'دÙتر نشانی'; // mailbox names $labels['inbox'] = 'صندوق ورودی'; $labels['drafts'] = 'پیش‌نویس‌ها'; -$labels['sent'] = 'ارسال شده'; -$labels['trash'] = 'زباله‌دان'; +$labels['sent'] = 'Ùرستاده شده'; +$labels['trash'] = 'سطل آشغال'; $labels['junk'] = 'بنجل'; // message listing @@ -162,6 +162,7 @@ $labels['currpage'] = 'صÙØÙ‡ جاری'; $labels['unread'] = 'خوانده‌نشده'; $labels['flagged'] = 'پرچم‌دار'; $labels['unanswered'] = 'پاسخ داده نشده'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Øذ٠شده'; $labels['undeleted'] = 'Øذ٠نشده'; $labels['invert'] = 'وارونه'; @@ -205,8 +206,8 @@ $labels['body'] = 'بدنه'; $labels['openinextwin'] = 'باز کردن در پنجره‌ی جدید'; $labels['emlsave'] = 'بارگیری (.eml)'; -$labels['changeformattext'] = 'Display in plain text format'; -$labels['changeformathtml'] = 'Display in HTML format'; +$labels['changeformattext'] = 'نمایش در قالب متنی'; +$labels['changeformathtml'] = 'نمایش در قالب اچ‌تی‌ام‌ال'; // message compose $labels['editasnew'] = 'ویرایش به عنوان جدید'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'هنگام پاسخ امضاء اصلی را $labels['autoaddsignature'] = 'اضاÙÙ‡ کردن خودکار امضاء'; $labels['newmessageonly'] = 'Ùقط پیغام جدید'; $labels['replyandforwardonly'] = 'Ùقط پاسخ‌ها Ùˆ ارجاع‌ها'; -$labels['replysignaturepos'] = 'هنگام پاسخ یا ارجاع امضاء را قرار داده شود'; -$labels['belowquote'] = 'زیر نقل‌قول'; -$labels['abovequote'] = 'بالای نقل‌قول'; $labels['insertsignature'] = 'درج امضاء'; $labels['previewpanemarkread'] = 'نشانه‌گذاری پیغام‌های پیش مرور شده به عنوان خوانده شده'; $labels['afternseconds'] = 'بعد از $s ثانیه'; diff --git a/program/localization/fi_FI/labels.inc b/program/localization/fi_FI/labels.inc index 62c2d6b07..ccf14da93 100644 --- a/program/localization/fi_FI/labels.inc +++ b/program/localization/fi_FI/labels.inc @@ -64,6 +64,7 @@ $labels['copy'] = 'Kopioi'; $labels['move'] = 'Siirrä'; $labels['moveto'] = 'siirrä kansioon...'; $labels['download'] = 'lataa'; +$labels['open'] = 'Avaa'; $labels['showattachment'] = 'Näytä'; $labels['showanyway'] = 'Näytä silti'; @@ -161,6 +162,7 @@ $labels['currpage'] = 'Nykyinen sivu'; $labels['unread'] = 'Lukemattomat'; $labels['flagged'] = 'Korostettu'; $labels['unanswered'] = 'Vastaamaton'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Poistettu'; $labels['undeleted'] = 'Ei poistettu'; $labels['invert'] = 'Käännä'; @@ -204,6 +206,8 @@ $labels['body'] = 'Runko'; $labels['openinextwin'] = 'Avaa uudessa ikkunassa'; $labels['emlsave'] = 'Tallenna (.eml)'; +$labels['changeformattext'] = 'Näytä raakatekstimuodossa'; +$labels['changeformathtml'] = 'Näytä HTML-muodossa'; // message compose $labels['editasnew'] = 'Muokkaa uutena'; @@ -360,7 +364,7 @@ $labels['importcontacts'] = 'Tuo yhteystiedot'; $labels['importfromfile'] = 'Tuo tiedostosta:'; $labels['importtarget'] = 'Lisää uudet yhteystiedot osoitekirjaan:'; $labels['importreplace'] = 'Korvaa koko osoitekirja'; -$labels['importdesc'] = 'You can upload contacts from an existing address book.<br/>We currently support importing addresses from the <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> or CSV (comma-separated) data format.'; +$labels['importdesc'] = 'Voit tuoda yhteystietoja olemassa olevasta osoitekirjasta.<br/>Tuettuja muotoja ovat <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> ja CSV (pilkuin erotetut arvot).'; $labels['done'] = 'Valmis'; // settings @@ -451,9 +455,6 @@ $labels['replyremovesignature'] = 'Vastattaessa poista alkuperäinen allekirjoit $labels['autoaddsignature'] = 'Lisää allekirjoitus automaattisesti'; $labels['newmessageonly'] = 'vain uuteen viestiin'; $labels['replyandforwardonly'] = 'vain vastauksiin ja välityksiin'; -$labels['replysignaturepos'] = 'Vastattaessa tai välitettäessä laita allekirjoitus'; -$labels['belowquote'] = 'lainauksen alle'; -$labels['abovequote'] = 'lainauksen ylle'; $labels['insertsignature'] = 'Lisää allekirjoitus'; $labels['previewpanemarkread'] = 'Merkitse esikatsellut viestit luetuiksi'; $labels['afternseconds'] = '$n sekunnin jälkeen'; diff --git a/program/localization/fr_FR/labels.inc b/program/localization/fr_FR/labels.inc index 4a78e565f..bc1078e8d 100644 --- a/program/localization/fr_FR/labels.inc +++ b/program/localization/fr_FR/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Page courante'; $labels['unread'] = 'Non lus'; $labels['flagged'] = 'Marqué'; $labels['unanswered'] = 'Non répondu'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Supprimé'; $labels['undeleted'] = 'Non supprimé'; $labels['invert'] = 'Inverser'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'En répondant, supprimer la signature d\'orig $labels['autoaddsignature'] = 'Ajouter la signature automatiquement'; $labels['newmessageonly'] = 'nouveau message uniquement'; $labels['replyandforwardonly'] = 'réponses et transferts uniquement'; -$labels['replysignaturepos'] = 'En répondant ou en transférant, placer la signature'; -$labels['belowquote'] = 'en-dessous de la citation'; -$labels['abovequote'] = 'au-dessus de la citation'; $labels['insertsignature'] = 'Insérer la signature'; $labels['previewpanemarkread'] = 'Marquer les messages prévisualisés comme lus'; $labels['afternseconds'] = 'après $n secondes'; diff --git a/program/localization/fy_NL/labels.inc b/program/localization/fy_NL/labels.inc index d04d7e89c..1db0fe384 100644 --- a/program/localization/fy_NL/labels.inc +++ b/program/localization/fy_NL/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'Unread'; $labels['flagged'] = 'Flagged'; $labels['unanswered'] = 'Unanswered'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/ga_IE/labels.inc b/program/localization/ga_IE/labels.inc index 7169a8800..39541bff8 100755 --- a/program/localization/ga_IE/labels.inc +++ b/program/localization/ga_IE/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'Na rudaà nach bhuil corraithe'; $labels['flagged'] = 'Flagged'; $labels['unanswered'] = 'Unanswered'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/gl_ES/labels.inc b/program/localization/gl_ES/labels.inc index 13fdfa793..49c5f5b68 100644 --- a/program/localization/gl_ES/labels.inc +++ b/program/localization/gl_ES/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Páxina actual'; $labels['unread'] = 'Non lidas'; $labels['flagged'] = 'Marcadas'; $labels['unanswered'] = 'Non respostadas'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Marcadas como eliminadas'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Inverter'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Eliminar a firma do remitente ao respostar'; $labels['autoaddsignature'] = 'Engadir firma automáticamente'; $labels['newmessageonly'] = 'só nas mensaxes novas'; $labels['replyandforwardonly'] = 'só nas respostas e reenvÃos'; -$labels['replysignaturepos'] = 'Ao respostar ou reenviar colocar a firma'; -$labels['belowquote'] = 'embaixo do texto citado'; -$labels['abovequote'] = 'enriba do texto citado'; $labels['insertsignature'] = 'Engadir firma'; $labels['previewpanemarkread'] = 'Marcar como lidas as mensaxes previsualizadas'; $labels['afternseconds'] = 'logo de $n segundos'; diff --git a/program/localization/he_IL/labels.inc b/program/localization/he_IL/labels.inc index 698b73493..5176a5f5a 100644 --- a/program/localization/he_IL/labels.inc +++ b/program/localization/he_IL/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'דף × ×•×›×—×™'; $labels['unread'] = '×œ× × ×§×¨×ו'; $labels['flagged'] = 'מסומן'; $labels['unanswered'] = '×œ× × ×¢× ×”'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = '× ×ž×—×§'; $labels['undeleted'] = '×œ× × ×ž×—×§'; $labels['invert'] = 'היפוך הסימון'; @@ -456,9 +457,6 @@ $labels['replyremovesignature'] = 'החתימה תוסר מההודעה המקו $labels['autoaddsignature'] = 'הוספה ×וטומטית של חתימה'; $labels['newmessageonly'] = 'הודעה חדשה בלבד'; $labels['replyandforwardonly'] = '×ž×¢× ×” והעברת הודעה בלבד'; -$labels['replysignaturepos'] = '×‘×ž×¢× ×” ×ו בהעברת הודעה, החתימה תופיע'; -$labels['belowquote'] = 'בסוף ההודעה המקורית'; -$labels['abovequote'] = 'בתחילת ההודעה המקורית'; $labels['insertsignature'] = 'שיבוץ חתימה'; $labels['previewpanemarkread'] = 'סימון הודעה ×©× ×¦×¤×ª×” ×›× ×§×¨××”'; $labels['afternseconds'] = 'ל×חר $n ×©× ×™×•×ª'; diff --git a/program/localization/hi_IN/labels.inc b/program/localization/hi_IN/labels.inc index 4564e1226..f446a3e65 100644 --- a/program/localization/hi_IN/labels.inc +++ b/program/localization/hi_IN/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'अनदेखी'; $labels['flagged'] = 'Flagged'; $labels['unanswered'] = 'Unanswered'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/hr_HR/labels.inc b/program/localization/hr_HR/labels.inc index bf5364653..fe85feccc 100644 --- a/program/localization/hr_HR/labels.inc +++ b/program/localization/hr_HR/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Trenutna stranica'; $labels['unread'] = 'NeproÄitane'; $labels['flagged'] = 'OznaÄene'; $labels['unanswered'] = 'Neodgovrene'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Obrisano'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Obrni'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Kod odgovaranja, makni originalni potpis iz p $labels['autoaddsignature'] = 'Automatski dodaj potpis'; $labels['newmessageonly'] = 'samo nova poruka'; $labels['replyandforwardonly'] = 'samo odgovori i proslijeÄ‘ivanja'; -$labels['replysignaturepos'] = 'Kod downloada ili proslijeÄ‘ivanja postavi potpis'; -$labels['belowquote'] = 'ispod citata'; -$labels['abovequote'] = 'iznad citata'; $labels['insertsignature'] = 'Umetni potpis'; $labels['previewpanemarkread'] = 'Obilježi pregledane poruke kao proÄitane'; $labels['afternseconds'] = 'nakon $n sekundi'; diff --git a/program/localization/hu_HU/labels.inc b/program/localization/hu_HU/labels.inc index 96c43d146..03846cdff 100644 --- a/program/localization/hu_HU/labels.inc +++ b/program/localization/hu_HU/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Aktuális oldal'; $labels['unread'] = 'Olvasatlan'; $labels['flagged'] = 'Megjelölt'; $labels['unanswered'] = 'Megválaszolatlan'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Törölt'; $labels['undeleted'] = 'Nem lett törölve'; $labels['invert'] = 'Invertálás'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Válasznál az eredeti aláÃrás eltávolÃt $labels['autoaddsignature'] = 'AláÃrás automatikus hozzáadása'; $labels['newmessageonly'] = 'csak új üzenetnél'; $labels['replyandforwardonly'] = 'válasznál és továbbÃtásnál'; -$labels['replysignaturepos'] = 'Válasznál és továbbÃtásnál kerüljön az aláÃrás'; -$labels['belowquote'] = 'az idézett szöveg alá'; -$labels['abovequote'] = 'az idézett szöveg fölé'; $labels['insertsignature'] = 'AláÃrás beillesztése'; $labels['previewpanemarkread'] = 'ElÅ‘nézetben megjelent üzenetek megjelölése olvasottként'; $labels['afternseconds'] = '$n másodperc elteltével'; diff --git a/program/localization/hy_AM/labels.inc b/program/localization/hy_AM/labels.inc index 3612dc974..a27a19a9d 100644 --- a/program/localization/hy_AM/labels.inc +++ b/program/localization/hy_AM/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Ô±Õ¼Õ¯Õ¡ Õ§Õ»'; $labels['unread'] = 'Õ‰Õ¯Õ¡Ö€Õ¤Õ¡ÖÕ¡Õ®Õ¨'; $labels['flagged'] = 'Õ†Õ·Õ¾Õ¡Õ®'; $labels['unanswered'] = 'Ô±Õ¶ÕºÕ¡Õ¿Õ¡Õ½ÕÕ¡Õ¶'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Õ‹Õ¶Õ»Õ¾Õ¡Õ®'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Õ“Õ¸ÕÕ¡Õ¿Õ¥Õ²Õ¥Õ¬'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'ÕŠÕ¡Õ¿Õ¡Õ½ÕÕ¡Õ¶Õ¥Õ¬Õ«Õ½ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ°Õ $labels['autoaddsignature'] = 'Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ½Õ¿Õ¸Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶'; $labels['newmessageonly'] = 'Õ´Õ«Õ¡ÕµÕ¶ Õ¶Õ¸Ö€ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¸Ö‚Õ´'; $labels['replyandforwardonly'] = 'ÕºÕ¡Õ¿Õ¡Õ½ÕÕ¡Õ¶Õ¶Õ¥Ö€Õ¸Ö‚Õ´ Ö‡ ÖƒÕ¸ÕÕ¡Õ¶ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¸Ö‚Õ´'; -$labels['replysignaturepos'] = 'Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ½Õ¿Õ¸Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ ÕºÕ¡Õ¿Õ¡Õ½ÕÕ¡Õ¶Õ¥Õ¬Õ«Õ½ Õ¯Õ¡Õ´ ÖƒÕ¸ÕÕ¡Õ¶ÖÕ¥Õ¬Õ«Õ½'; -$labels['belowquote'] = 'Õ„Õ¥Õ»Õ¢Õ¥Ö€Õ´Õ¡Õ¶ Õ¶Õ¥Ö€Ö„Ö‡Õ¸Ö‚Õ´'; -$labels['abovequote'] = 'Õ„Õ¥Õ»Õ¢Õ¥Ö€Õ´Õ¡Õ¶ Õ¾Õ¥Ö€Ö‡Õ¸Ö‚Õ´'; $labels['insertsignature'] = 'Õ†Õ¥Ö€Õ¤Õ¶Õ¥Õ¬ Õ½Õ¿Õ¸Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨'; $labels['previewpanemarkread'] = 'Õ†Õ·Õ¥Õ¬ Õ¶Õ¡ÕÕ¡Õ¤Õ«Õ¿Õ¾Õ¡Õ® Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ¸Ö€ÕºÕ¥Õ½ Õ¨Õ¶Õ©Õ¥Ö€ÖÕ¾Õ¡Õ®'; $labels['afternseconds'] = '$n Õ¾Õ¡Ö€Õ¯ÕµÕ¡Õ¶ Õ°Õ¥Õ¿Õ¸'; diff --git a/program/localization/ia/labels.inc b/program/localization/ia/labels.inc index 89273c147..55e7fc2ad 100644 --- a/program/localization/ia/labels.inc +++ b/program/localization/ia/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'Non legite'; $labels['flagged'] = 'Marcate'; $labels['unanswered'] = 'Unanswered'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Delete'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Inverter'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automaticamente inserta signatura'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insertar signatura'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/id_ID/labels.inc b/program/localization/id_ID/labels.inc index 4877434ed..c75c27196 100644 --- a/program/localization/id_ID/labels.inc +++ b/program/localization/id_ID/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Halaman sekarang'; $labels['unread'] = 'Belum terbaca'; $labels['flagged'] = 'Ditandai'; $labels['unanswered'] = 'Belum terjawab'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Terhapus'; $labels['undeleted'] = 'Tidak terhapus'; $labels['invert'] = 'Sebaliknya'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'ketika membalas pesan hapus tanda tangan dari $labels['autoaddsignature'] = 'Otomatis tambahkan tanda tangan'; $labels['newmessageonly'] = 'Hanya untuk pesan baru'; $labels['replyandforwardonly'] = 'Hanya untuk dijawab dan diteruskan'; -$labels['replysignaturepos'] = 'ketika membalas atau meneruskan pesan tambahkan tanda tangan'; -$labels['belowquote'] = 'Dibawah kutipan'; -$labels['abovequote'] = 'Diatas kutipan'; $labels['insertsignature'] = 'Isi tanda tangan'; $labels['previewpanemarkread'] = 'Tandai pesan yang sudah dilihat'; $labels['afternseconds'] = 'setelah $n detik'; diff --git a/program/localization/is_IS/labels.inc b/program/localization/is_IS/labels.inc index c8d49bf23..b9d3fbc90 100644 --- a/program/localization/is_IS/labels.inc +++ b/program/localization/is_IS/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Núverandi sÃða'; $labels['unread'] = 'Ólesið'; $labels['flagged'] = 'Flaggað'; $labels['unanswered'] = 'Ósvarað'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Eytt'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Umhverfa'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Þegar svarað fjarlægja upphaflega undirskr $labels['autoaddsignature'] = 'Bæta undirskrift við sjálfkrafa'; $labels['newmessageonly'] = 'ný skeyti eingöngu'; $labels['replyandforwardonly'] = 'svör og áframsendingar eingöngu'; -$labels['replysignaturepos'] = 'Þegar skeytum er svarað eða áframsend setja undirskrift'; -$labels['belowquote'] = 'undir tilvitnun'; -$labels['abovequote'] = 'fyrir ofan tilvitnun'; $labels['insertsignature'] = 'Bæta undirskrift við'; $labels['previewpanemarkread'] = 'Merka forskoðuð skeyti sem lesin'; $labels['afternseconds'] = 'eftir $n sekúndur'; diff --git a/program/localization/it_IT/labels.inc b/program/localization/it_IT/labels.inc index 97be929cf..29b708ec7 100644 --- a/program/localization/it_IT/labels.inc +++ b/program/localization/it_IT/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Pagina corrente'; $labels['unread'] = 'Non letti'; $labels['flagged'] = 'Contrassegnato'; $labels['unanswered'] = 'Senza risposta'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Cancellato'; $labels['undeleted'] = 'Non eliminato'; $labels['invert'] = 'Inverti'; @@ -205,8 +206,8 @@ $labels['body'] = 'Body'; $labels['openinextwin'] = 'Apri in una nuova finestra'; $labels['emlsave'] = 'Scarica (.eml)'; -$labels['changeformattext'] = 'Display in plain text format'; -$labels['changeformathtml'] = 'Display in HTML format'; +$labels['changeformattext'] = 'Visualizza nel formato testo semplice'; +$labels['changeformathtml'] = 'Visualizza nel formato HTML'; // message compose $labels['editasnew'] = 'Modifica come nuovo'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Quando rispondi, rimuovi la firma dal messagg $labels['autoaddsignature'] = 'Aggiungi automaticamente la firma'; $labels['newmessageonly'] = 'solo ai nuovi messaggi'; $labels['replyandforwardonly'] = 'solo alle risposte e inoltri'; -$labels['replysignaturepos'] = 'In risposta o inoltro, posiziona la firma'; -$labels['belowquote'] = 'sotto la citazione'; -$labels['abovequote'] = 'sopra la citazione'; $labels['insertsignature'] = 'Inserisci firma'; $labels['previewpanemarkread'] = 'Segna i messagi in anteprima come letti'; $labels['afternseconds'] = 'dopo $n secondi'; diff --git a/program/localization/ja_JP/labels.inc b/program/localization/ja_JP/labels.inc index 685dba0b3..6f1597593 100644 --- a/program/localization/ja_JP/labels.inc +++ b/program/localization/ja_JP/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'ç¾åœ¨ã®ãƒšãƒ¼ã‚¸'; $labels['unread'] = '未èª'; $labels['flagged'] = 'フラグ付ã'; $labels['unanswered'] = '未返信'; +$labels['withattachment'] = '添付ファイルã‚ã‚Š'; $labels['deleted'] = '削除済ã¿'; $labels['undeleted'] = '削除済ã¿ã§ãªã„'; $labels['invert'] = 'å転'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = '返信時ã«å…ƒã®ç½²åをメッセージ㋠$labels['autoaddsignature'] = '自動的ã«ç½²åã‚’ä»˜åŠ '; $labels['newmessageonly'] = 'æ–°ã—ã„メッセージã ã‘'; $labels['replyandforwardonly'] = '返信ã¨è»¢é€ã ã‘'; -$labels['replysignaturepos'] = '返信や転é€ã§ç½²åを挿入ã™ã‚‹ä½ç½®'; -$labels['belowquote'] = '引用ã®å¾Œ'; -$labels['abovequote'] = '引用ã®å‰'; $labels['insertsignature'] = 'ç½²åを挿入'; $labels['previewpanemarkread'] = 'プレビューã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ—¢èªã«è¨å®š'; $labels['afternseconds'] = '$n秒後'; diff --git a/program/localization/ka_GE/labels.inc b/program/localization/ka_GE/labels.inc index b3a712515..eb95c8264 100755 --- a/program/localization/ka_GE/labels.inc +++ b/program/localization/ka_GE/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'მიმდინáƒáƒ ე გვერდი'; $labels['unread'] = 'წáƒáƒ£áƒ™áƒ˜áƒ—ხáƒáƒ•áƒ˜'; $labels['flagged'] = 'მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜'; $labels['unanswered'] = 'უპáƒáƒ¡áƒ£áƒ®áƒ'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'შებრუნებული'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'წáƒáƒ˜áƒ¨áƒáƒšáƒáƒ¡ ხელმáƒáƒ¬áƒ $labels['autoaddsignature'] = 'áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ დáƒáƒ”მáƒáƒ¢áƒáƒ¡ ხელმáƒáƒ¬áƒ”რáƒ'; $labels['newmessageonly'] = 'მხáƒáƒšáƒáƒ“ áƒáƒ®áƒáƒšáƒ˜ შეტყáƒáƒ‘ინებáƒ'; $labels['replyandforwardonly'] = 'მხáƒáƒšáƒáƒ“ გáƒáƒ“áƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ დრპáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜'; -$labels['replysignaturepos'] = 'მხáƒáƒšáƒáƒ“ პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ áƒáƒœ გáƒáƒ“áƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜ გáƒáƒ§áƒ•áƒ”ს ხელმáƒáƒ¬áƒ”რáƒ'; -$labels['belowquote'] = 'ციტáƒáƒ¢áƒ˜áƒ¡ შემდეგ'; -$labels['abovequote'] = 'ციტáƒáƒ¢áƒáƒ›áƒ“ე'; $labels['insertsignature'] = 'ხელმáƒáƒªáƒ”რის ჩáƒáƒ¡áƒ›áƒ'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = '$n წáƒáƒ›áƒ˜áƒ¡ შემდეგ'; diff --git a/program/localization/km_KH/labels.inc b/program/localization/km_KH/labels.inc index a344e60c2..f9d57812b 100644 --- a/program/localization/km_KH/labels.inc +++ b/program/localization/km_KH/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'ទំពáŸážšáž“áŸáŸ‡'; $labels['unread'] = 'មិនទាន់អាន'; $labels['flagged'] = 'មានកំណážáŸ‹ážŸáŸ†áž‚ាល់ដោយផ្កាយ'; $labels['unanswered'] = 'មិនទាន់ឆ្លើយážáž”'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'បានលុបរួច'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'បញ្ច្រស់'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'នៅ​ពáŸáž›â€‹áž†áŸ’លើយ​ážáž” $labels['autoaddsignature'] = 'បញ្ចូលហážáŸ’ážáž›áŸážáž¶ážŠáŸ„យស្វáŸáž™áž”្រវážáŸ’ážáž·'; $labels['newmessageonly'] = 'សំរាប់សំបុážáŸ’ážšážáŸ’មីážáŸ‚ប៉ុណ្ណោះ'; $labels['replyandforwardonly'] = 'សំរាប់ឆើ្លយážáž”​និងផ្ញើបន្ážážáŸ‚​ប៉ុណ្ណោះ'; -$labels['replysignaturepos'] = 'បញ្ចូលហážáŸ’ážáž›áŸážáž¶áž“ៅពáŸáž›áž†áž¾áŸ’លយážáž”​និងផ្ញើបន្áž'; -$labels['belowquote'] = 'ពីក្រោមសម្រង់អážáŸ’ážáž”áž‘'; -$labels['abovequote'] = 'ពីលើសម្រង់អážáŸ’ážáž”áž‘'; $labels['insertsignature'] = 'បញ្ចូលហážáŸ’ážáž›áŸážáž¶'; $labels['previewpanemarkread'] = 'កំណážáŸ‹ážŸáŸ†áž”áž»ážáŸ’រ​ដែល​បាន​បង្ហាញ​​ជា​សំបុážáŸ’របាន​អាន​រួច'; $labels['afternseconds'] = 'ក្រោយពី $n វិនាទី'; diff --git a/program/localization/ko_KR/labels.inc b/program/localization/ko_KR/labels.inc index 667fb422a..c1e54590a 100644 --- a/program/localization/ko_KR/labels.inc +++ b/program/localization/ko_KR/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = '현재 페ì´ì§€'; $labels['unread'] = 'ì½ì§€ ì•ŠìŒ'; $labels['flagged'] = '깃발로 표시ë¨'; $labels['unanswered'] = '답장하지 ì•ŠìŒ'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'ì‚ì œë¨'; $labels['undeleted'] = 'ì‚ì œë˜ì§€ ì•ŠìŒ'; $labels['invert'] = 'ë°˜ì „'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'íšŒì‹ ì‹œ 메시지ì—ì„œ ì›ë¬¸ ì„œëª…ì„ ì $labels['autoaddsignature'] = '서명 ìžë™ìœ¼ë¡œ 추가'; $labels['newmessageonly'] = '새로운 메시지ì—만'; $labels['replyandforwardonly'] = 'íšŒì‹ ë° ì „ë‹¬ ì‹œì—만'; -$labels['replysignaturepos'] = 'íšŒì‹ ë˜ëŠ” ì „ë‹¬ ì‹œ 서명 추가'; -$labels['belowquote'] = 'ì¸ìš©ë¬¸ 하단'; -$labels['abovequote'] = 'ì¸ìš©ë¬¸ ìƒë‹¨'; $labels['insertsignature'] = '서명 삽입'; $labels['previewpanemarkread'] = '미리 본 메시지를 ì½ìŒìœ¼ë¡œ 표시'; $labels['afternseconds'] = '$nì´ˆ 후'; diff --git a/program/localization/ku/labels.inc b/program/localization/ku/labels.inc index 5c6786502..d4544de91 100644 --- a/program/localization/ku/labels.inc +++ b/program/localization/ku/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'Nexwendî'; $labels['flagged'] = 'Flagged'; $labels['unanswered'] = 'Unanswered'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/lt_LT/labels.inc b/program/localization/lt_LT/labels.inc index 376f9c771..0d6776550 100644 --- a/program/localization/lt_LT/labels.inc +++ b/program/localization/lt_LT/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'matomus Å¡iame puslapyje'; $labels['unread'] = 'neskaitytus'; $labels['flagged'] = 'su gairele'; $labels['unanswered'] = 'neatsakytus'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'paÅ¡alintus'; $labels['undeleted'] = 'NeiÅ¡trintas'; $labels['invert'] = 'invertuoti'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'PaÅ¡alinti cituojamame laiÅ¡ke esantį paraÅ¡ $labels['autoaddsignature'] = 'AutomatiÅ¡kai pridÄ—ti paraÅ¡Ä…'; $labels['newmessageonly'] = 'tik naujuose laiÅ¡kuose'; $labels['replyandforwardonly'] = 'tik atsakymuose ir persiunÄiamuose laiÅ¡kuose'; -$labels['replysignaturepos'] = 'Atsakant ir persiunÄiant laiÅ¡kus, paraÅ¡Ä… pridÄ—ti'; -$labels['belowquote'] = 'po citata'; -$labels['abovequote'] = 'virÅ¡ citatos'; $labels['insertsignature'] = 'PridÄ—ti paraÅ¡Ä…'; $labels['previewpanemarkread'] = 'PeržiÅ«ros polangyje parodytus laiÅ¡kus žymÄ—ti skaitytais'; $labels['afternseconds'] = 'praÄ—jus $n sek.'; diff --git a/program/localization/lv_LV/labels.inc b/program/localization/lv_LV/labels.inc index a71d5e554..70369b4dd 100644 --- a/program/localization/lv_LV/labels.inc +++ b/program/localization/lv_LV/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'PaÅ¡reizÄ“jÄ lapa'; $labels['unread'] = 'nelasÄ«tÄs'; $labels['flagged'] = 'iezÄ«mÄ“tÄs'; $labels['unanswered'] = 'neatbildÄ“tÄs'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'dzÄ“stÄs'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'invertÄ“t'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Atbildot izņemt oriÄ£inÄlo parakstu no vÄ“s $labels['autoaddsignature'] = 'AutomÄtiski pievienot parakstu'; $labels['newmessageonly'] = 'tikai jaunas vÄ“stules'; $labels['replyandforwardonly'] = 'tikai atbildes un pÄrsÅ«tÄ«jumi'; -$labels['replysignaturepos'] = 'Atbildot vai pÄrsÅ«tot ievietot parakstu'; -$labels['belowquote'] = 'zem citÄta'; -$labels['abovequote'] = 'virs citÄta'; $labels['insertsignature'] = 'Ievietot parakstu'; $labels['previewpanemarkread'] = 'AtzÄ«mÄ“t priekÅ¡skatÄ«tÄs vÄ“stules kÄ lasÄ«tas'; $labels['afternseconds'] = 'pÄ“c $n sekundÄ“m'; diff --git a/program/localization/mk_MK/labels.inc b/program/localization/mk_MK/labels.inc index c8190276e..dc11b98cc 100755 --- a/program/localization/mk_MK/labels.inc +++ b/program/localization/mk_MK/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'Ðепрочитани'; $labels['flagged'] = 'Обележано'; $labels['unanswered'] = 'Ðеодговорено'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Избришано'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Обратно'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'При одговарање отÑтрани $labels['autoaddsignature'] = 'ÐвтоматÑки додавај потпиÑ'; $labels['newmessageonly'] = 'Ñамо нови пиÑма'; $labels['replyandforwardonly'] = 'Ñамо одгорови и препраќања'; -$labels['replysignaturepos'] = 'При одговарање или препраќање Ñтави потпиÑ'; -$labels['belowquote'] = 'под цитираното'; -$labels['abovequote'] = 'над цитираното'; $labels['insertsignature'] = 'Вметни потпиÑ'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/ml_IN/labels.inc b/program/localization/ml_IN/labels.inc index 463256c0e..145d90b83 100644 --- a/program/localization/ml_IN/labels.inc +++ b/program/localization/ml_IN/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'നിലവിലàµà´³à´³ പേജàµ'; $labels['unread'] = 'വായികàµà´•à´¾à´¤àµà´¤à´¤àµ'; $labels['flagged'] = 'അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´µ'; $labels['unanswered'] = 'മറàµà´ªà´Ÿà´¿ കൊടàµà´•àµà´•à´¾à´¤àµà´¤'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'മായàµà´šàµà´šà´µ'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'തലതിരികàµà´•àµà´•'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'à´ªàµà´¤à´¿à´¯ സനàµà´¦àµ‡à´¶à´‚ മാതàµà´°à´‚'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'ഉദàµà´§à´¾à´°à´£à´¤àµà´¤à´¿à´¨àµ താഴെ'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = '$n നിമിഷങàµà´™à´³àµâ€ à´•à´´à´¿à´žàµà´žàµàµ'; diff --git a/program/localization/mr_IN/labels.inc b/program/localization/mr_IN/labels.inc index 804fb5651..e0143b293 100755 --- a/program/localization/mr_IN/labels.inc +++ b/program/localization/mr_IN/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'सधà¥â€à¤¯à¤¾à¤šà¥‡ पान'; $labels['unread'] = 'न वाचलेले'; $labels['flagged'] = 'खूण लावलेले'; $labels['unanswered'] = 'उतà¥à¤¤à¤° न दिलेले'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'काढून टाकलेला(ले)'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'उलट करा'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'उतà¥â€à¤¤à¤° देताना मà¥à $labels['autoaddsignature'] = 'आपोआप सही करा'; $labels['newmessageonly'] = 'फकà¥â€à¤¤ नवीन संदेश'; $labels['replyandforwardonly'] = 'फकà¥â€à¤¤ उतà¥â€à¤¤à¤°à¥‡ आâ€à¤£à¥€ पà¥à¤¢à¥‡ पाठवलेले संदेश'; -$labels['replysignaturepos'] = 'उतà¥â€à¤¤à¤° देताना किंवा पà¥à¤¢à¥‡ पाठवताना सही करा'; -$labels['belowquote'] = 'उतारया खाली'; -$labels['abovequote'] = 'उतारयाचà¥â€à¤¯à¤¾ वर'; $labels['insertsignature'] = 'सही मधà¥â€à¤¯à¥‡ टाका'; $labels['previewpanemarkread'] = 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ संदेश पाहीले अशी खà¥à¤£ करा'; $labels['afternseconds'] = '$n कà¥à¤·à¤£à¤¾à¤¨à¤‚तर'; diff --git a/program/localization/ms_MY/labels.inc b/program/localization/ms_MY/labels.inc index 43884e986..dae5caada 100644 --- a/program/localization/ms_MY/labels.inc +++ b/program/localization/ms_MY/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Muka terkini'; $labels['unread'] = 'Belum dibaca'; $labels['flagged'] = 'Ditanda'; $labels['unanswered'] = 'Belum dijawab'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Telah dipadam'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Songsangkan'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/nb_NO/labels.inc b/program/localization/nb_NO/labels.inc index ecbe8545e..de71714c6 100644 --- a/program/localization/nb_NO/labels.inc +++ b/program/localization/nb_NO/labels.inc @@ -41,7 +41,7 @@ $labels['junk'] = 'Spam'; // message listing $labels['subject'] = 'Emne'; $labels['from'] = 'Avsender'; -$labels['sender'] = 'Sender'; +$labels['sender'] = 'Avsender'; $labels['to'] = 'Mottaker'; $labels['cc'] = 'Kopi til'; $labels['bcc'] = 'Blindkopi til'; @@ -64,6 +64,7 @@ $labels['copy'] = 'Kopier'; $labels['move'] = 'Flytt'; $labels['moveto'] = 'flytt til...'; $labels['download'] = 'last ned'; +$labels['open'] = 'Open'; $labels['showattachment'] = 'Vis'; $labels['showanyway'] = 'Vis likevel'; @@ -161,6 +162,7 @@ $labels['currpage'] = 'Gjeldende side'; $labels['unread'] = 'Uleste'; $labels['flagged'] = 'Flagget'; $labels['unanswered'] = 'Ubesvarte'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Slettet'; $labels['undeleted'] = 'Ikke slettet'; $labels['invert'] = 'Inverter'; @@ -200,10 +202,12 @@ $labels['quicksearch'] = 'Hurtigsøk'; $labels['resetsearch'] = 'Nullstill søk'; $labels['searchmod'] = 'Søke felt'; $labels['msgtext'] = 'Hele meldingen'; -$labels['body'] = 'Body'; +$labels['body'] = 'Meldingstekst'; $labels['openinextwin'] = 'Ã…pne i nytt vindu'; $labels['emlsave'] = 'Last ned (.eml)'; +$labels['changeformattext'] = 'Display in plain text format'; +$labels['changeformathtml'] = 'Display in HTML format'; // message compose $labels['editasnew'] = 'Rediger som ny'; @@ -335,8 +339,8 @@ $labels['composeto'] = 'Skriv e-post til'; $labels['contactsfromto'] = 'Kontakter $from til $to av $count'; $labels['print'] = 'Skriv ut'; $labels['export'] = 'Eksporter'; -$labels['exportall'] = 'Export all'; -$labels['exportsel'] = 'Export selected'; +$labels['exportall'] = 'Eksporter alle'; +$labels['exportsel'] = 'Eksporter valgte'; $labels['exportvcards'] = 'Eksporter kontakter i vCard-format'; $labels['newcontactgroup'] = 'Opprett ny kontaktgruppe'; $labels['grouprename'] = 'Endre navn pÃ¥ gruppe'; @@ -380,7 +384,7 @@ $labels['edititem'] = 'Rediger punkt'; $labels['preferhtml'] = 'Foretrekk HTML'; $labels['defaultcharset'] = 'Standard tegnsett'; $labels['htmlmessage'] = 'HTML-melding'; -$labels['messagepart'] = 'Part'; +$labels['messagepart'] = 'Del'; $labels['digitalsig'] = 'Digital signatur'; $labels['dateformat'] = 'Datoformat'; $labels['timeformat'] = 'Tidsformat'; @@ -451,9 +455,6 @@ $labels['replyremovesignature'] = 'Fjern orginalsignaturen i svar pÃ¥ melding'; $labels['autoaddsignature'] = 'Legg til signatur'; $labels['newmessageonly'] = 'kun pÃ¥ nye meldinger'; $labels['replyandforwardonly'] = 'kun i svar og videresendinger'; -$labels['replysignaturepos'] = 'Plassering av signatur ved svar eller videresending'; -$labels['belowquote'] = 'over sitert melding'; -$labels['abovequote'] = 'under sitert melding'; $labels['insertsignature'] = 'Sett inn signatur'; $labels['previewpanemarkread'] = 'Merk forhÃ¥ndsviste meldinger som lest'; $labels['afternseconds'] = 'etter $n sekunder'; diff --git a/program/localization/ne_NP/labels.inc b/program/localization/ne_NP/labels.inc index 26be68f35..10aa1e2b7 100644 --- a/program/localization/ne_NP/labels.inc +++ b/program/localization/ne_NP/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'नपढिà¤à¤•à¤¾ |'; $labels['flagged'] = 'Flagged'; $labels['unanswered'] = 'Unanswered'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/nl_BE/labels.inc b/program/localization/nl_BE/labels.inc index 82cf3a023..c9f07fa35 100644 --- a/program/localization/nl_BE/labels.inc +++ b/program/localization/nl_BE/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Huidige pagina'; $labels['unread'] = 'Ongelezen'; $labels['flagged'] = 'Geselecteerd'; $labels['unanswered'] = 'Onbeantwoord'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Verwijderd'; $labels['undeleted'] = 'Niet verwijderd'; $labels['invert'] = 'Selectie omkeren'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Verwijder handtekening uit het origneel bij b $labels['autoaddsignature'] = 'Handtekening automatisch toevoegen'; $labels['newmessageonly'] = 'alleen bij nieuwe berichten'; $labels['replyandforwardonly'] = 'alleen bij beantwoorden en doorsturen'; -$labels['replysignaturepos'] = 'Ondertekening plaatsen bij beantwoorden of doorsturen'; -$labels['belowquote'] = 'onder het citaat'; -$labels['abovequote'] = 'boven het citaat'; $labels['insertsignature'] = 'Handtekening invoegen'; $labels['previewpanemarkread'] = 'Markeer voorbeeldbericht als gelezen'; $labels['afternseconds'] = 'Na $n seconden'; diff --git a/program/localization/nl_NL/labels.inc b/program/localization/nl_NL/labels.inc index 2d34a5135..042879b4b 100644 --- a/program/localization/nl_NL/labels.inc +++ b/program/localization/nl_NL/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Huidige pagina'; $labels['unread'] = 'Ongelezen'; $labels['flagged'] = 'Gemarkeerd'; $labels['unanswered'] = 'Onbeantwoord'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Verwijderd'; $labels['undeleted'] = 'Niet verwijderd'; $labels['invert'] = 'Selectie omkeren'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Verwijder oorspronkelijke ondertekening van b $labels['autoaddsignature'] = 'Ondertekening automatisch toevoegen'; $labels['newmessageonly'] = 'alleen bij nieuwe berichten'; $labels['replyandforwardonly'] = 'alleen bij antwoorden en doorsturen'; -$labels['replysignaturepos'] = 'Ondertekening plaatsen bij antwoorden of doorsturen'; -$labels['belowquote'] = 'onder het citaat'; -$labels['abovequote'] = 'boven het citaat'; $labels['insertsignature'] = 'Ondertekening invoegen'; $labels['previewpanemarkread'] = 'Markeer voorbeeldberichten als gelezen'; $labels['afternseconds'] = 'na $n seconden'; diff --git a/program/localization/nn_NO/labels.inc b/program/localization/nn_NO/labels.inc index 725919d14..8fd281c97 100644 --- a/program/localization/nn_NO/labels.inc +++ b/program/localization/nn_NO/labels.inc @@ -64,6 +64,7 @@ $labels['copy'] = 'Kopier'; $labels['move'] = 'Flytt'; $labels['moveto'] = 'flytt til …'; $labels['download'] = 'Last ned'; +$labels['open'] = 'Open'; $labels['showattachment'] = 'Vis'; $labels['showanyway'] = 'Vis likevel'; @@ -161,6 +162,7 @@ $labels['currpage'] = 'Gjeldande side'; $labels['unread'] = 'Uleste'; $labels['flagged'] = 'Flagga'; $labels['unanswered'] = 'Ikkje svara'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Sletta'; $labels['undeleted'] = 'Ikkje sletta'; $labels['invert'] = 'Inverter'; @@ -204,6 +206,8 @@ $labels['body'] = 'Meldingstekst'; $labels['openinextwin'] = 'Opna i nytt vindauga'; $labels['emlsave'] = 'Last ned (.eml)'; +$labels['changeformattext'] = 'Display in plain text format'; +$labels['changeformathtml'] = 'Display in HTML format'; // message compose $labels['editasnew'] = 'Rediger som ny'; @@ -335,8 +339,8 @@ $labels['composeto'] = 'Ny melding til'; $labels['contactsfromto'] = 'Kontaktar $from til $to av $count'; $labels['print'] = 'Skriv ut'; $labels['export'] = 'Eksport'; -$labels['exportall'] = 'Export all'; -$labels['exportsel'] = 'Export selected'; +$labels['exportall'] = 'Eksporter alle'; +$labels['exportsel'] = 'Eksporter valde'; $labels['exportvcards'] = 'Eksporter kontaktar i vCard-format'; $labels['newcontactgroup'] = 'Lag ny kontaktgruppe'; $labels['grouprename'] = 'Endre namn pÃ¥ gruppe'; @@ -451,9 +455,6 @@ $labels['replyremovesignature'] = 'Fjern den original signatur frÃ¥ eposten nÃ¥r $labels['autoaddsignature'] = 'Legg signatur til automatisk'; $labels['newmessageonly'] = 'berre pÃ¥ nye epostar'; $labels['replyandforwardonly'] = 'berre pÃ¥ svar og vidaresending'; -$labels['replysignaturepos'] = 'NÃ¥r du svarar eller sender vidare, plasser signaturen'; -$labels['belowquote'] = 'nedanfor siteringa'; -$labels['abovequote'] = 'oppanfor siteringa'; $labels['insertsignature'] = 'Sett inn signatur'; $labels['previewpanemarkread'] = 'Merk forehandsviste epostar som leste'; $labels['afternseconds'] = 'etter $n sekund'; diff --git a/program/localization/pl_PL/labels.inc b/program/localization/pl_PL/labels.inc index 7a4248830..eb6fe9b9a 100644 --- a/program/localization/pl_PL/labels.inc +++ b/program/localization/pl_PL/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Bieżąca strona'; $labels['unread'] = 'Nieprzeczytane'; $labels['flagged'] = 'Oznaczone'; $labels['unanswered'] = 'Bez odpowiedzi'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'UsuniÄ™te'; $labels['undeleted'] = 'NieusuniÄ™te'; $labels['invert'] = 'Odwróć'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Podczas odpowiedzi usuÅ„ podpis z cytowanej t $labels['autoaddsignature'] = 'Automatycznie wstaw podpis'; $labels['newmessageonly'] = 'tylko dla nowych wiadomoÅ›ci'; $labels['replyandforwardonly'] = 'tylko dla przekazywania i odpowiedzi'; -$labels['replysignaturepos'] = 'Podczas odpowiedzi wstaw podpis'; -$labels['belowquote'] = 'poniżej cytowanej treÅ›ci'; -$labels['abovequote'] = 'ponad cytowanÄ… treÅ›ciÄ…'; $labels['insertsignature'] = 'Wstaw podpis'; $labels['previewpanemarkread'] = 'Oznacz podglÄ…dane wiadomoÅ›ci jako przeczytane'; $labels['afternseconds'] = 'po $n sekundach'; diff --git a/program/localization/ps/labels.inc b/program/localization/ps/labels.inc index 05f6c3d32..f4f2f5380 100755 --- a/program/localization/ps/labels.inc +++ b/program/localization/ps/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'نالوستي'; $labels['flagged'] = 'Ø¨Û Ú©Ø§Ø±Ù‡'; $labels['unanswered'] = 'ناÚواب شوي'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/pt_BR/labels.inc b/program/localization/pt_BR/labels.inc index 55068df5b..858fcbe7c 100644 --- a/program/localization/pt_BR/labels.inc +++ b/program/localization/pt_BR/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Página atual'; $labels['unread'] = 'Não lidas'; $labels['flagged'] = 'Marcadas'; $labels['unanswered'] = 'Não respondidas'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'ExcluÃdas'; $labels['undeleted'] = 'Não excluÃdas'; $labels['invert'] = 'Inverter'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Remover assinatura original da mensagem ao re $labels['autoaddsignature'] = 'Adicionar assinatura automaticamente'; $labels['newmessageonly'] = 'somente em novas mensagens'; $labels['replyandforwardonly'] = 'somente em respostas e encaminhamentos'; -$labels['replysignaturepos'] = 'Inserir assinatura ao responder ou encaminhar'; -$labels['belowquote'] = 'abaixo da citação'; -$labels['abovequote'] = 'acima da citação'; $labels['insertsignature'] = 'Inserir assinatura'; $labels['previewpanemarkread'] = 'Marcar mensagens pré-visualizadas como lidas'; $labels['afternseconds'] = 'depois de $n segundos'; diff --git a/program/localization/pt_PT/labels.inc b/program/localization/pt_PT/labels.inc index 62fa8bbb4..17cae3795 100644 --- a/program/localization/pt_PT/labels.inc +++ b/program/localization/pt_PT/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Página actual'; $labels['unread'] = 'Não lidas'; $labels['flagged'] = 'Sinalizadas'; $labels['unanswered'] = 'Não respondidas'; +$labels['withattachment'] = 'Com anexo'; $labels['deleted'] = 'Eliminadas'; $labels['undeleted'] = 'Não eliminada'; $labels['invert'] = 'Inverter selecção'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Ao responder, remover a assinatura original d $labels['autoaddsignature'] = 'Adicionar assinatura automaticamente'; $labels['newmessageonly'] = 'apenas em novas mensagens'; $labels['replyandforwardonly'] = 'apenas em respostas e reenvios'; -$labels['replysignaturepos'] = 'Ao responder ou reencaminhar colocar assinatura'; -$labels['belowquote'] = 'depois da citação'; -$labels['abovequote'] = 'antes da citação'; $labels['insertsignature'] = 'Inserir assinatura'; $labels['previewpanemarkread'] = 'Marcar mensagem como lida'; $labels['afternseconds'] = 'após $n segundos'; diff --git a/program/localization/ro_RO/labels.inc b/program/localization/ro_RO/labels.inc index 0dcd97919..7f458a543 100644 --- a/program/localization/ro_RO/labels.inc +++ b/program/localization/ro_RO/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Pagina curentă'; $labels['unread'] = 'Necitite'; $labels['flagged'] = 'Marcat'; $labels['unanswered'] = 'Fără răspuns'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Åžterse'; $labels['undeleted'] = 'Nu a fost È™ters'; $labels['invert'] = 'Inversează'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Când răspundeÅ£i, se ÅŸterge semnătura ori $labels['autoaddsignature'] = 'Adăugarea automată a semnăturii'; $labels['newmessageonly'] = 'numai la mesajele noi'; $labels['replyandforwardonly'] = 'numai la răspunsuri si cele trimise mai departe'; -$labels['replysignaturepos'] = 'Când răspundeÅ£i sau trimiteÅ£i mai departe, semnătura se va plasa'; -$labels['belowquote'] = 'dedesubtul citatului'; -$labels['abovequote'] = 'deasupra citatului'; $labels['insertsignature'] = 'Introduce o semnătură'; $labels['previewpanemarkread'] = 'Marchează mesajele previzualizate ca citite'; $labels['afternseconds'] = 'după $n secunde'; diff --git a/program/localization/ru_RU/labels.inc b/program/localization/ru_RU/labels.inc index 6b6d0c6bd..970e30b88 100644 --- a/program/localization/ru_RU/labels.inc +++ b/program/localization/ru_RU/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ñтраница'; $labels['unread'] = 'Ðепрочитанные'; $labels['flagged'] = 'Помеченные'; $labels['unanswered'] = 'Ðеотвеченные'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Удаленное'; $labels['undeleted'] = 'Ðе удалено'; $labels['invert'] = 'Инвертное'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Удалить подпиÑÑŒ при отве $labels['autoaddsignature'] = 'ÐвтоматичеÑки добавлÑÑ‚ÑŒ подпиÑÑŒ'; $labels['newmessageonly'] = 'только в новых ÑообщениÑÑ…'; $labels['replyandforwardonly'] = 'только в ответах и переÑылках'; -$labels['replysignaturepos'] = 'Прикрепить подпиÑÑŒ при ответе и переÑылке'; -$labels['belowquote'] = 'поÑле цитаты'; -$labels['abovequote'] = 'до цитаты'; $labels['insertsignature'] = 'Ð’Ñтавить подпиÑÑŒ'; $labels['previewpanemarkread'] = 'Отмечать проÑмотренные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÐ°Ðº прочитанные'; $labels['afternseconds'] = 'через $n Ñекунд'; diff --git a/program/localization/si_LK/labels.inc b/program/localization/si_LK/labels.inc index eddc01b57..be091f4cf 100644 --- a/program/localization/si_LK/labels.inc +++ b/program/localization/si_LK/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'දà·à¶±à¶§ ඇà¶à·’ පිටුව'; $labels['unread'] = 'නොකියවූ'; $labels['flagged'] = 'Flagged'; $labels['unanswered'] = 'Unanswered'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'මක෠දà·à¶¸à·–'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'ස්වයංක්â€à¶»à·“යව අà¶à·Šà·ƒà¶± ඇà¶à·”ලà¶à·Š කරන්න'; $labels['newmessageonly'] = 'අලුà¶à·Š පණිවිඩය පමණක්'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'අà¶à·Šà·ƒà¶± ඇà¶à·”ලà¶à·Š කරන්න'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'à¶à¶à·Šà¶´à¶» $nකට පසු'; diff --git a/program/localization/sk_SK/labels.inc b/program/localization/sk_SK/labels.inc index 7b993e77a..a48d265e8 100644 --- a/program/localization/sk_SK/labels.inc +++ b/program/localization/sk_SK/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Aktuálna stránka'; $labels['unread'] = 'NepreÄÃtané'; $labels['flagged'] = 'OznaÄené'; $labels['unanswered'] = 'NeoznaÄené'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Zmazané'; $labels['undeleted'] = 'Nevymazané'; $labels['invert'] = 'PrevrátiÅ¥'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Pri odpovedanà odstrániÅ¥ zo správy pôvod $labels['autoaddsignature'] = 'Automaticky pridaÅ¥ podpis'; $labels['newmessageonly'] = 'iba k novým správam'; $labels['replyandforwardonly'] = 'len k odpovede a preposÃlanej správe'; -$labels['replysignaturepos'] = 'Pri odpovedanà alebo preposielanie správy vložiÅ¥ podpis'; -$labels['belowquote'] = 'nad citáciu'; -$labels['abovequote'] = 'pod citáciu'; $labels['insertsignature'] = 'Vložit podpis'; $labels['previewpanemarkread'] = 'OznaÄiÅ¥ zobrazenej správy ako preÄÃtané'; $labels['afternseconds'] = 'po $n sekundách'; diff --git a/program/localization/sl_SI/labels.inc b/program/localization/sl_SI/labels.inc index 70150e4d9..8542acb9a 100644 --- a/program/localization/sl_SI/labels.inc +++ b/program/localization/sl_SI/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Trenutna stran'; $labels['unread'] = 'Neprebrano'; $labels['flagged'] = 'OznaÄeno'; $labels['unanswered'] = 'NeoznaÄeno'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Izbrisano'; $labels['undeleted'] = 'Ni izbrisano'; $labels['invert'] = 'Zamenjaj'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Pri odgovoru na sporoÄilo odstrani izvorni p $labels['autoaddsignature'] = 'Samodejno dodaj podpis'; $labels['newmessageonly'] = 'samo novim sporoÄilom'; $labels['replyandforwardonly'] = 'samo k odgovorom in posredovanim sporoÄilom'; -$labels['replysignaturepos'] = 'Pri odgovoru ali posredovanju sporoÄila vstavi podpis'; -$labels['belowquote'] = 'pod citiran tekst'; -$labels['abovequote'] = 'nad citiran tekst'; $labels['insertsignature'] = 'Vstavi podpis'; $labels['previewpanemarkread'] = 'OznaÄi predogledana sporoÄila kot prebrana'; $labels['afternseconds'] = 'po $n sekundah'; diff --git a/program/localization/sq_AL/labels.inc b/program/localization/sq_AL/labels.inc index 52ff45cd6..0c61af687 100644 --- a/program/localization/sq_AL/labels.inc +++ b/program/localization/sq_AL/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'Palexuar'; $labels['flagged'] = 'Flagged'; $labels['unanswered'] = 'Unanswered'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Deleted'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'Automatically add signature'; $labels['newmessageonly'] = 'new message only'; $labels['replyandforwardonly'] = 'replies and forwards only'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'Insert signature'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/sr_CS/labels.inc b/program/localization/sr_CS/labels.inc index 1e84735e6..15de82e52 100644 --- a/program/localization/sr_CS/labels.inc +++ b/program/localization/sr_CS/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Тренутна Ñтраница'; $labels['unread'] = 'Ðепрочитане'; $labels['flagged'] = 'Означено'; $labels['unanswered'] = 'Ðеодговорено'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'ОбриÑано'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'Уведи'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'При одговору одÑтрани ор $labels['autoaddsignature'] = 'ÐутоматÑки додај потпиÑ'; $labels['newmessageonly'] = 'Ñамо нове поруке'; $labels['replyandforwardonly'] = 'Ñамо одговори и проÑлеђивања'; -$labels['replysignaturepos'] = 'При одговору или проÑлеђивању додај потпиÑ'; -$labels['belowquote'] = 'иÑпод квоте'; -$labels['abovequote'] = 'изнад квоте'; $labels['insertsignature'] = 'Убаци потпиÑ'; $labels['previewpanemarkread'] = 'Прегледану поруку означи као прочитану'; $labels['afternseconds'] = 'након $n Ñекунди'; diff --git a/program/localization/sv_SE/labels.inc b/program/localization/sv_SE/labels.inc index c1a91cf82..e9def21f6 100644 --- a/program/localization/sv_SE/labels.inc +++ b/program/localization/sv_SE/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Sida'; $labels['unread'] = 'Olästa'; $labels['flagged'] = 'Flaggade'; $labels['unanswered'] = 'Obesvarade'; +$labels['withattachment'] = 'Med bilaga'; $labels['deleted'] = 'Borttagna'; $labels['undeleted'] = 'Inte borttaget'; $labels['invert'] = 'Invertera'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Ta bort befintlig signatur frÃ¥n meddelandet $labels['autoaddsignature'] = 'Infoga signatur automatiskt'; $labels['newmessageonly'] = 'Vid nytt meddelande'; $labels['replyandforwardonly'] = 'Vid svar och vidarebefordran'; -$labels['replysignaturepos'] = 'Vid svar eller vidarebefordran infoga signatur'; -$labels['belowquote'] = 'Nedanför befintligt meddelande'; -$labels['abovequote'] = 'Ovanför befintligt meddelande'; $labels['insertsignature'] = 'Infoga signatur'; $labels['previewpanemarkread'] = 'Märk meddelande som läst vid visning'; $labels['afternseconds'] = 'Efter $n sekunder'; diff --git a/program/localization/ta_IN/labels.inc b/program/localization/ta_IN/labels.inc index 1cbffb588..ff0f5e0cc 100644 --- a/program/localization/ta_IN/labels.inc +++ b/program/localization/ta_IN/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Current page'; $labels['unread'] = 'படிகà¯à®•à®¾à®¤à®¤à¯'; $labels['flagged'] = 'நடà¯à®šà®¤à¯à®¤à®¿à®°à®®à®¿à®Ÿà¯à®Ÿà®¤à¯'; $labels['unanswered'] = 'பதிலளிகà¯à®•à®¾à®¤à®¤à¯'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'நீகà¯à®•à®¿à®¯à®¤à¯'; $labels['undeleted'] = 'Not deleted'; $labels['invert'] = 'தலைகீழà¯'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'பதிலளிகà¯à®•à¯à®®à¯ பே஠$labels['autoaddsignature'] = 'தானாக கையொபà¯à®ªà®¤à¯à®¤à¯ˆ சேரà¯'; $labels['newmessageonly'] = 'பà¯à®¤à¯ செயà¯à®¤à®¿ மடà¯à®Ÿà¯à®®à¯'; $labels['replyandforwardonly'] = 'பதிலளிபà¯à®ªà¯ à®®à¯à®©à¯à®…னà¯à®ªà¯à®ªà¯ மடà¯à®Ÿà¯à®®à¯'; -$labels['replysignaturepos'] = 'பதிலளிகà¯à®•à¯à®®à¯ போதà¯à®®à¯ à®®à¯à®©à¯à®…னà¯à®ªà¯à®ªà¯à®®à¯ போதà¯à®®à¯ கையோபà¯à®ªà®®à®¿à®Ÿà¯'; -$labels['belowquote'] = 'மேறà¯à®•à¯‹à®³à¯à®•à¯à®•à¯ கீழே'; -$labels['abovequote'] = 'மேறà¯à®•à¯‹à®³à¯à®•à¯à®•à¯ மேலே'; $labels['insertsignature'] = 'கையோபà¯à®ªà®®à®¿à®Ÿà¯'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/th_TH/labels.inc b/program/localization/th_TH/labels.inc index 93f2304e1..7853cdd9d 100644 --- a/program/localization/th_TH/labels.inc +++ b/program/localization/th_TH/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'หน้าปัจจุบัน'; $labels['unread'] = 'จดหมายที่ไม่ได้à¸à¹ˆà¸²à¸™'; $labels['flagged'] = 'Flagged'; $labels['unanswered'] = 'ยังไม่ได้ตà¸à¸š'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'ลบà¹à¸¥à¹‰à¸§'; $labels['undeleted'] = 'ยังไม่ได้ลบ'; $labels['invert'] = 'Invert'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'When replying remove original signature from $labels['autoaddsignature'] = 'เพิ่มลายเซ็นต์เข้าไปà¸à¸±à¸•à¹‚นมัติ'; $labels['newmessageonly'] = 'เฉพาะข้à¸à¸„วามใหม่เท่านั้น'; $labels['replyandforwardonly'] = 'ตà¸à¸šà¸à¸¥à¸±à¸šà¹à¸¥à¸°à¸ªà¹ˆà¸‡à¸•à¹ˆà¸à¹€à¸—่านั้น'; -$labels['replysignaturepos'] = 'When replying or forwarding place signature'; -$labels['belowquote'] = 'below the quote'; -$labels['abovequote'] = 'above the quote'; $labels['insertsignature'] = 'à¹à¸—รà¸à¸¥à¸²à¸¢à¹€à¸‹à¹‡à¸™à¸•à¹Œ'; $labels['previewpanemarkread'] = 'Mark previewed messages as read'; $labels['afternseconds'] = 'after $n seconds'; diff --git a/program/localization/tr_TR/labels.inc b/program/localization/tr_TR/labels.inc index d8e9e20cf..0b525ff55 100644 --- a/program/localization/tr_TR/labels.inc +++ b/program/localization/tr_TR/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Åžimdiki sayfa'; $labels['unread'] = 'Okunmamışları'; $labels['flagged'] = 'Ä°ÅŸaretlenmiÅŸleri'; $labels['unanswered'] = 'Yanıtlanmamışları'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'SilinmiÅŸleri'; $labels['undeleted'] = 'SilinmemiÅŸ'; $labels['invert'] = 'Seçimi Tersine Çevir'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'Yanıtlarken önceki imzaları sil'; $labels['autoaddsignature'] = 'Otomatik olarak imza ekle'; $labels['newmessageonly'] = 'sadece yeni postalarda'; $labels['replyandforwardonly'] = 'sadece yanıtlar ve yönlendirmelerde'; -$labels['replysignaturepos'] = 'Yanıtlarken veya yönlendirirken imzayı yerleÅŸtir'; -$labels['belowquote'] = 'alıntının altına'; -$labels['abovequote'] = 'alıntının üstüne'; $labels['insertsignature'] = 'Ä°mza ekle'; $labels['previewpanemarkread'] = 'Önzilemede görünen postaları okunmuÅŸ iÅŸaretle'; $labels['afternseconds'] = '$n saniye sonra'; diff --git a/program/localization/uk_UA/labels.inc b/program/localization/uk_UA/labels.inc index 35be96cab..67ca0ed31 100644 --- a/program/localization/uk_UA/labels.inc +++ b/program/localization/uk_UA/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'Поточна Ñторінка'; $labels['unread'] = 'Ðепрочитані'; $labels['flagged'] = 'Із зірочкою'; $labels['unanswered'] = 'Без відповіді'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Видалені'; $labels['undeleted'] = 'Ðе видалено'; $labels['invert'] = 'Інвертувати виділеннÑ'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = 'При відповіді видалÑти п $labels['autoaddsignature'] = 'Ðвтоматично додавати підпиÑ'; $labels['newmessageonly'] = 'тільки до нових лиÑтів'; $labels['replyandforwardonly'] = 'тільки при відповідÑÑ… та переÑилках'; -$labels['replysignaturepos'] = 'При відповідÑÑ… чи переÑилках додавати підпиÑ'; -$labels['belowquote'] = 'піÑÐ»Ñ Ñ†Ð¸Ñ‚Ð°Ñ‚Ð¸'; -$labels['abovequote'] = 'перед цитатою'; $labels['insertsignature'] = 'Додати підпиÑ'; $labels['previewpanemarkread'] = 'Позначити переглÑнуті лиÑти Ñк прочитані'; $labels['afternseconds'] = 'через $n Ñекунд'; diff --git a/program/localization/vi_VN/labels.inc b/program/localization/vi_VN/labels.inc index 00d04b46b..bece2f47d 100644 --- a/program/localization/vi_VN/labels.inc +++ b/program/localization/vi_VN/labels.inc @@ -64,6 +64,7 @@ $labels['copy'] = 'Sao chép'; $labels['move'] = 'Di Chuyển'; $labels['moveto'] = 'Di chuyển tá»›i...'; $labels['download'] = 'Tải vá»'; +$labels['open'] = 'Open'; $labels['showattachment'] = 'Hiển thị'; $labels['showanyway'] = 'Tiếp tục hiển thị'; @@ -161,6 +162,7 @@ $labels['currpage'] = 'Trang hiện tại'; $labels['unread'] = 'ChÆ°a Ä‘á»c'; $labels['flagged'] = 'Äã đánh dấu'; $labels['unanswered'] = 'ChÆ°a trả lá»i'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'Äã xóa'; $labels['undeleted'] = 'ChÆ°a xóa được'; $labels['invert'] = 'Äảo ngược'; @@ -204,6 +206,8 @@ $labels['body'] = 'Ná»™i dung thÆ°'; $labels['openinextwin'] = 'Mở trong khung cá»a má»›i'; $labels['emlsave'] = 'Tải vá» theo định dạng .eml'; +$labels['changeformattext'] = 'Display in plain text format'; +$labels['changeformathtml'] = 'Display in HTML format'; // message compose $labels['editasnew'] = 'Sá»a nhÆ° má»™t email má»›i'; @@ -335,8 +339,8 @@ $labels['composeto'] = 'Soạn thÆ° cho'; $labels['contactsfromto'] = 'Liên hệ từ $from - $to / $count'; $labels['print'] = 'In ra'; $labels['export'] = 'TrÃch xuất'; -$labels['exportall'] = 'Export all'; -$labels['exportsel'] = 'Export selected'; +$labels['exportall'] = 'Xuất tất cả'; +$labels['exportsel'] = 'Xuất mục chá»n'; $labels['exportvcards'] = 'Tải dữ liệu máy theo định dạng vCard'; $labels['newcontactgroup'] = 'Tạo nhóm liên lạc má»›i'; $labels['grouprename'] = 'Äổi tên nhóm'; @@ -451,9 +455,6 @@ $labels['replyremovesignature'] = 'Khi trả lá»i bá» chữ ký cÅ© khá»i ná» $labels['autoaddsignature'] = 'Tá»± Ä‘á»™ng thêm chữ ký'; $labels['newmessageonly'] = 'chỉ thÆ° má»›i'; $labels['replyandforwardonly'] = 'chỉ trả lá»i và chuyển tiếp thÆ°'; -$labels['replysignaturepos'] = 'Khi trả lá»i hoặc chuyển tiếp thÆ° thêm và o chữ ký'; -$labels['belowquote'] = 'DÆ°á»›i phần ná»™i dung cÅ©'; -$labels['abovequote'] = 'trên phần ná»™i dung cÅ©'; $labels['insertsignature'] = 'Chèn chữ ký'; $labels['previewpanemarkread'] = 'Äánh dẫu thÆ° xem thá» là đã Ä‘á»c'; $labels['afternseconds'] = 'sau $n giây'; diff --git a/program/localization/zh_CN/labels.inc b/program/localization/zh_CN/labels.inc index 9b79283b1..2d896d7c3 100644 --- a/program/localization/zh_CN/labels.inc +++ b/program/localization/zh_CN/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = '当å‰é¡µ'; $labels['unread'] = '未读邮件'; $labels['flagged'] = 'å·²æ ‡è®°é‚®ä»¶'; $labels['unanswered'] = '未回å¤é‚®ä»¶'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = 'å·²åˆ é™¤é‚®ä»¶'; $labels['undeleted'] = 'æœªåˆ é™¤é‚®ä»¶'; $labels['invert'] = 'å选'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = '当回å¤æ—¶ä»Žé‚®ä»¶ç§»é™¤åŽŸå§‹ç¾å'; $labels['autoaddsignature'] = '自动æ’å…¥ç¾å'; $labels['newmessageonly'] = '仅新邮件'; $labels['replyandforwardonly'] = '仅回å¤å’Œè½¬å‘邮件'; -$labels['replysignaturepos'] = '当回å¤æˆ–转å‘æ—¶æ’å…¥ç¾å'; -$labels['belowquote'] = 'ä½äºŽåŽŸæ–‡ä¸‹æ–¹'; -$labels['abovequote'] = 'ä½äºŽåŽŸæ–‡ä¸Šæ–¹'; $labels['insertsignature'] = 'æ’å…¥ç¾å'; $labels['previewpanemarkread'] = 'æ ‡è®°é¢„è§ˆé‚®ä»¶ä¸ºå·²è¯»'; $labels['afternseconds'] = '$n 秒之åŽ'; diff --git a/program/localization/zh_TW/labels.inc b/program/localization/zh_TW/labels.inc index 488a7ab2d..f53a5a969 100644 --- a/program/localization/zh_TW/labels.inc +++ b/program/localization/zh_TW/labels.inc @@ -162,6 +162,7 @@ $labels['currpage'] = 'ç›®å‰é é¢'; $labels['unread'] = '未讀å–的郵件'; $labels['flagged'] = 'å·²åŠ æ¨™è¨˜çš„éƒµä»¶'; $labels['unanswered'] = '未回覆的郵件'; +$labels['withattachment'] = 'With attachment'; $labels['deleted'] = '已刪除的郵件'; $labels['undeleted'] = '未刪除的郵件'; $labels['invert'] = 'åé¸'; @@ -454,9 +455,6 @@ $labels['replyremovesignature'] = '回覆時移除原有簽å檔'; $labels['autoaddsignature'] = 'è‡ªå‹•é™„åŠ ç°½å'; $labels['newmessageonly'] = 'åªæœ‰æ–°è¨Šæ¯'; $labels['replyandforwardonly'] = 'åªæœ‰å›žè¦†æˆ–轉寄'; -$labels['replysignaturepos'] = '當回覆或轉寄時附上簽å檔'; -$labels['belowquote'] = '引用的下方'; -$labels['abovequote'] = '引用的上方'; $labels['insertsignature'] = 'æ’入簽å檔'; $labels['previewpanemarkread'] = '標示已é 覽訊æ¯ç‚ºå·²è®€å–'; $labels['afternseconds'] = '$n 秒之後'; diff --git a/program/resources/blank.pdf b/program/resources/blank.pdf Binary files differnew file mode 100644 index 000000000..7bf83e390 --- /dev/null +++ b/program/resources/blank.pdf diff --git a/program/steps/addressbook/export.inc b/program/steps/addressbook/export.inc index 15bf8b0d4..761f26b75 100644 --- a/program/steps/addressbook/export.inc +++ b/program/steps/addressbook/export.inc @@ -138,7 +138,9 @@ header('Content-Disposition: attachment; filename="contacts.vcf"'); while ($result && ($row = $result->next())) { // we already have a vcard record if ($row['vcard'] && $row['name']) { - $row['vcard'] = preg_replace('/\r?\n/', rcube_vcard::$eol, $row['vcard']); + // fix folding and end-of-line chars + $row['vcard'] = preg_replace('/\r|\n\s+/', '', $row['vcard']); + $row['vcard'] = preg_replace('/\n/', rcube_vcard::$eol, $row['vcard']); echo rcube_vcard::rfc2425_fold($row['vcard']) . rcube_vcard::$eol; } // copy values into vcard object diff --git a/program/steps/addressbook/import.inc b/program/steps/addressbook/import.inc index df07d64bc..72da15078 100644 --- a/program/steps/addressbook/import.inc +++ b/program/steps/addressbook/import.inc @@ -209,6 +209,15 @@ if (is_array($_FILES['_file'])) { foreach ($vcards as $vcard) { $a_record = $vcard->get_assoc(); + // Generate contact's display name (must be before validation), the same we do in save.inc + if (empty($a_record['name'])) { + $a_record['name'] = rcube_addressbook::compose_display_name($a_record, true); + // Reset it if equals to email address (from compose_display_name()) + if ($a_record['name'] == $a_record['email'][0]) { + $a_record['name'] = ''; + } + } + // skip invalid (incomplete) entries if (!$CONTACTS->validate($a_record, true)) { $IMPORT_STATS->invalid++; @@ -250,7 +259,7 @@ if (is_array($_FILES['_file'])) { if ($success) { $IMPORT_STATS->inserted++; - $IMPORT_STATS->names[] = $vcard->displayname ? $vcard->displayname : $email; + $IMPORT_STATS->names[] = $a_record['name'] ? $a_record['name'] : $email; } else { $IMPORT_STATS->errors++; diff --git a/program/steps/addressbook/save.inc b/program/steps/addressbook/save.inc index 8cab6e817..25bfbd48b 100644 --- a/program/steps/addressbook/save.inc +++ b/program/steps/addressbook/save.inc @@ -192,7 +192,7 @@ else { if (($maxnum = $RCMAIL->config->get('max_group_members', 0)) && ($counts->count + 1 > $maxnum)) $OUTPUT->show_message('maxgroupmembersreached', 'warning', array('max' => $maxnum)); - $CONTACTS->add_to_group($gid, $plugin['ids']); + $CONTACTS->add_to_group($plugin['group_id'], $plugin['ids']); } } else diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index c166eb74e..81b598377 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -139,7 +139,6 @@ if (!empty($CONFIG['drafts_mbox'])) { } // set current mailbox in client environment $OUTPUT->set_env('mailbox', $RCMAIL->storage->get_folder()); -$OUTPUT->set_env('sig_above', $RCMAIL->config->get('sig_above', false)); $OUTPUT->set_env('top_posting', intval($RCMAIL->config->get('reply_mode')) > 0); $OUTPUT->set_env('recipients_separator', trim($RCMAIL->config->get('recipients_separator', ','))); @@ -152,6 +151,7 @@ if ($font && !is_array($font)) { // get reference message and set compose mode if ($msg_uid = $COMPOSE['param']['draft_uid']) { $compose_mode = RCUBE_COMPOSE_DRAFT; + $OUTPUT->set_env('draft_id', $msg_uid); $RCMAIL->storage->set_folder($CONFIG['drafts_mbox']); } else if ($msg_uid = $COMPOSE['param']['reply_uid']) { @@ -220,9 +220,9 @@ if (!empty($msg_uid) && empty($COMPOSE['as_attachment'])) } } else if ($compose_mode == RCUBE_COMPOSE_DRAFT) { - if ($MESSAGE->headers->others['x-draft-info']) { + if ($draft_info = $MESSAGE->headers->get('x-draft-info')) { // get reply_uid/forward_uid to flag the original message when sending - $info = rcmail_draftinfo_decode($MESSAGE->headers->others['x-draft-info']); + $info = rcmail_draftinfo_decode($draft_info); if ($info['type'] == 'reply') $COMPOSE['reply_uid'] = $info['uid']; @@ -239,8 +239,8 @@ if (!empty($msg_uid) && empty($COMPOSE['as_attachment'])) } } - if ($MESSAGE->headers->in_reply_to) - $COMPOSE['reply_msgid'] = '<'.$MESSAGE->headers->in_reply_to.'>'; + if ($in_reply_to = $MESSAGE->headers->get('in-reply-to')) + $COMPOSE['reply_msgid'] = '<' . $in_reply_to . '>'; $COMPOSE['references'] = $MESSAGE->headers->references; } @@ -461,7 +461,7 @@ function rcmail_compose_header_from($attrib) if (count($MESSAGE->identities)) { $a_signatures = array(); - $separator = $RCMAIL->config->get('sig_above') + $separator = intval($RCMAIL->config->get('reply_mode')) > 0 && ($compose_mode == RCUBE_COMPOSE_REPLY || $compose_mode == RCUBE_COMPOSE_FORWARD) ? '---' : '-- '; $field_attrib['onchange'] = JS_OBJECT_NAME.".change_identity(this)"; @@ -571,7 +571,7 @@ function rcmail_prepare_message_body() rcmail_write_forward_attachments(); } // reply/edit/draft/forward - else if ($compose_mode && ($compose_mode != RCUBE_COMPOSE_REPLY || $RCMAIL->config->get('reply_mode') != -1)) { + else if ($compose_mode && ($compose_mode != RCUBE_COMPOSE_REPLY || intval($RCMAIL->config->get('reply_mode')) != -1)) { $isHtml = rcmail_compose_editor_mode(); if (!empty($MESSAGE->parts)) { @@ -997,10 +997,12 @@ function rcmail_write_compose_attachments(&$message, $bodyIsHtml) foreach ((array)$message->mime_parts as $pid => $part) { if ($part->disposition == 'attachment' || ($part->disposition == 'inline' && $bodyIsHtml) || $part->filename) { - if (($part->ctype_primary == 'message' && $bodyIsHtml) || $part->ctype_primary == 'multipart') { + // skip parts that aren't valid attachments + if ($part->ctype_primary == 'multipart' || $part->mimetype == 'application/ms-tnef') { continue; } - if ($part->mimetype == 'application/ms-tnef') { + // skip message attachments in reply mode + if ($part->ctype_primary == 'message' && $compose_mode == RCUBE_COMPOSE_REPLY) { continue; } // skip inline images when forwarding in plain text diff --git a/program/steps/mail/copy.inc b/program/steps/mail/copy.inc index a72378b0e..876657485 100644 --- a/program/steps/mail/copy.inc +++ b/program/steps/mail/copy.inc @@ -24,10 +24,10 @@ if (!$OUTPUT->ajax_call) return; // move messages -if (!empty($_POST['_uid']) && !empty($_POST['_target_mbox'])) { - $uids = get_input_value('_uid', RCUBE_INPUT_POST); +if (!empty($_POST['_uid']) && strlen($_POST['_target_mbox'])) { + $uids = get_input_value('_uid', RCUBE_INPUT_POST); $target = get_input_value('_target_mbox', RCUBE_INPUT_POST, true); - $mbox = get_input_value('_mbox', RCUBE_INPUT_POST, true); + $mbox = get_input_value('_mbox', RCUBE_INPUT_POST, true); $copied = $RCMAIL->storage->copy_message($uids, $target, $mbox); @@ -47,7 +47,7 @@ if (!empty($_POST['_uid']) && !empty($_POST['_target_mbox'])) { } // unknown action or missing query param else { - exit; + $OUTPUT->show_message('internalerror', 'error'); } // send response diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 274c40b5c..60db3f310 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -896,7 +896,7 @@ function rcmail_washtml_callback($tagname, $attrib, $content, $washtml) * return table with message headers */ function rcmail_message_headers($attrib, $headers=null) - { +{ global $OUTPUT, $MESSAGE, $PRINT_MODE, $RCMAIL; static $sa_attrib; @@ -1194,7 +1194,7 @@ function rcmail_message_body($attrib) html::a($show_link + array('class' => 'image-link', 'style' => sprintf('width:%dpx', $thumbnail_size)), html::img(array( 'class' => 'image-thumbnail', - 'src' => $MESSAGE->get_part_url($attach_prop->mime_id, true) . '&_thumb=1', + 'src' => $MESSAGE->get_part_url($attach_prop->mime_id, 'image') . '&_thumb=1', 'title' => $attach_prop->filename, 'alt' => $attach_prop->filename, 'style' => sprintf('max-width:%dpx; max-height:%dpx', $thumbnail_size, $thumbnail_size), @@ -1214,7 +1214,7 @@ function rcmail_message_body($attrib) html::tag('legend', 'image-filename', Q($attach_prop->filename)) . html::p(array('align' => "center"), html::img(array( - 'src' => $MESSAGE->get_part_url($attach_prop->mime_id, true), + 'src' => $MESSAGE->get_part_url($attach_prop->mime_id, 'image'), 'title' => $attach_prop->filename, 'alt' => $attach_prop->filename, ))) @@ -1897,13 +1897,15 @@ function rcmail_search_filter($attrib) $attrib['onchange'] = JS_OBJECT_NAME.'.filter_mailbox(this.value)'; - /* - RFC3501 (6.4.4): 'ALL', 'RECENT', - 'ANSWERED', 'DELETED', 'FLAGGED', 'SEEN', - 'UNANSWERED', 'UNDELETED', 'UNFLAGGED', 'UNSEEN', - 'NEW', // = (RECENT UNSEEN) - 'OLD' // = NOT RECENT - */ + // Content-Type values of messages with attachments + // the same as in app.js:add_message_row() + $ctypes = array('application/', 'multipart/m', 'multipart/signed', 'multipart/report'); + + // Build search string of "with attachment" filter + $attachment = str_repeat(' OR', count($ctypes)-1); + foreach ($ctypes as $type) { + $attachment .= ' HEADER Content-Type ' . rcube_imap_generic::escape($type); + } $select_filter = new html_select($attrib); $select_filter->add(rcube_label('all'), 'ALL'); @@ -1914,6 +1916,7 @@ function rcmail_search_filter($attrib) $select_filter->add(rcube_label('deleted'), 'DELETED'); $select_filter->add(rcube_label('undeleted'), 'UNDELETED'); } + $select_filter->add(rcube_label('withattachment'), $attachment); $select_filter->add(rcube_label('priority').': '.rcube_label('highest'), 'HEADER X-PRIORITY 1'); $select_filter->add(rcube_label('priority').': '.rcube_label('high'), 'HEADER X-PRIORITY 2'); $select_filter->add(rcube_label('priority').': '.rcube_label('normal'), 'NOT HEADER X-PRIORITY 1 NOT HEADER X-PRIORITY 2 NOT HEADER X-PRIORITY 4 NOT HEADER X-PRIORITY 5'); diff --git a/program/steps/mail/get.inc b/program/steps/mail/get.inc index 23dc22b7c..bcc6f11bc 100644 --- a/program/steps/mail/get.inc +++ b/program/steps/mail/get.inc @@ -22,7 +22,7 @@ // show loading page if (!empty($_GET['_preload'])) { - $url = preg_replace('/([&?]+)_preload=/', '\\1_embed=', $_SERVER['REQUEST_URI']); + $url = preg_replace('/([&?]+)_preload=/', '\\1_mimewarning=1&_embed=', $_SERVER['REQUEST_URI']); $message = rcube_label('loadingdata'); header('Content-Type: text/html; charset=' . RCMAIL_CHARSET); @@ -62,9 +62,10 @@ else if ($_GET['_thumb']) { $thumbnail_size = $RCMAIL->config->get('image_thumbnail_size', 240); $temp_dir = $RCMAIL->config->get('temp_dir'); list(,$ext) = explode('/', $part->mimetype); - $cache_basename = $temp_dir . '/' . md5($MESSAGE->headers->messageID . $part->mime_id . ':' . $RCMAIL->user->ID . ':' . $thumbnail_size); - $cache_file = $cache_basename . '.' . $ext; $mimetype = $part->mimetype; + $file_ident = $MESSAGE->headers->messageID . ':' . $part->mime_id . ':' . $part->size . ':' . $part->mimetype; + $cache_basename = $temp_dir . '/' . md5($file_ident . ':' . $RCMAIL->user->ID . ':' . $thumbnail_size); + $cache_file = $cache_basename . '.' . $ext; // render thumbnail image if not done yet if (!is_file($cache_file)) { @@ -118,7 +119,7 @@ else if (strlen($pid = get_input_value('_part', RCUBE_INPUT_GET))) { $file_extension = strtolower(pathinfo($part->filename, PATHINFO_EXTENSION)); // 1. compare filename suffix with expected suffix derived from mimetype - $valid = $file_extension && in_array($file_extension, (array)$extensions); + $valid = $file_extension && in_array($file_extension, (array)$extensions) || !empty($_REQUEST['_mimeclass']); // 2. detect the real mimetype of the attachment part and compare it with the stated mimetype and filename extension if ($valid || !$file_extension || $mimetype == 'application/octet-stream' || $mimetype == 'text/plain') { @@ -145,6 +146,10 @@ else if (strlen($pid = get_input_value('_part', RCUBE_INPUT_GET))) { $extensions = rcube_mime::get_mime_extensions($real_mimetype); $valid_extension = (!$file_extension || in_array($file_extension, (array)$extensions)); + // ignore filename extension if mimeclass matches (#1489029) + if (!empty($_REQUEST['_mimeclass']) && $real_ctype_primary == $_REQUEST['_mimeclass']) + $valid_extension = true; + // fix mimetype for images wrongly declared as octet-stream if ($mimetype == 'application/octet-stream' && strpos($real_mimetype, 'image/') === 0 && $valid_extension) $mimetype = $real_mimetype; @@ -157,22 +162,32 @@ else if (strlen($pid = get_input_value('_part', RCUBE_INPUT_GET))) { // show warning if validity checks failed if (!$valid) { - $OUTPUT = new rcmail_html_page(); - $OUTPUT->write(html::tag('html', null, html::tag('body', 'embed', - html::div(array('class' => 'rcmail-inline-message rcmail-inline-warning'), - rcube_label(array( - 'name' => 'attachmentvalidationerror', - 'vars' => array( - 'expected' => $mimetype . ($file_extension ? "(.$file_extension)" : ''), - 'detected' => $real_mimetype . ($extensions[0] ? "(.$extensions[0])" : ''), + // send blocked.gif for expected images + if (empty($_REQUEST['_mimewarning']) && strpos($mimetype, 'image/') === 0) { + // Do not cache. Failure might be the result of a misconfiguration, thus real content should be returned once fixed. + $OUTPUT->nocacheing_headers(); + header("Content-Type: image/gif"); + header("Content-Transfer-Encoding: binary"); + readfile(INSTALL_PATH . 'program/resources/blocked.gif'); + } + else { // html warning with a button to load the file anyway + $OUTPUT = new rcmail_html_page(); + $OUTPUT->write(html::tag('html', null, html::tag('body', 'embed', + html::div(array('class' => 'rcmail-inline-message rcmail-inline-warning'), + rcube_label(array( + 'name' => 'attachmentvalidationerror', + 'vars' => array( + 'expected' => $mimetype . ($file_extension ? "(.$file_extension)" : ''), + 'detected' => $real_mimetype . ($extensions[0] ? "(.$extensions[0])" : ''), + ) + )) . + html::p(array('class' => 'rcmail-inline-buttons'), + html::tag('button', + array('onclick' => "location.href='" . $RCMAIL->url(array_merge($_GET, array('_nocheck' => 1))) . "'"), + rcube_label('showanyway'))) ) - )) . - html::p(array('class' => 'rcmail-inline-buttons'), - html::tag('button', - array('onclick' => "location.href='" . $RCMAIL->url(array_merge($_GET, array('_nocheck' => 1))) . "'"), - rcube_label('showanyway'))) - ) - ))); + ))); + } exit; } } diff --git a/program/steps/mail/mark.inc b/program/steps/mail/mark.inc index c220fc5c4..dfc892ea1 100644 --- a/program/steps/mail/mark.inc +++ b/program/steps/mail/mark.inc @@ -113,7 +113,7 @@ if (($uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_va $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($msg_count), $mbox); if ($threading) { - $count = get_input_value('_count', RCUBE_INPUT_POST); + $count = get_input_value('_count', RCUBE_INPUT_POST); } // add new rows from next page (if any) @@ -125,9 +125,9 @@ if (($uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_va } } } - - $OUTPUT->send(); +} +else { + $OUTPUT->show_message('internalerror', 'error'); } -exit; - +$OUTPUT->send(); diff --git a/program/steps/mail/move_del.inc b/program/steps/mail/move_del.inc index 3fc6ac5a7..e21ba2c6b 100644 --- a/program/steps/mail/move_del.inc +++ b/program/steps/mail/move_del.inc @@ -74,6 +74,8 @@ else if ($RCMAIL->action=='delete' && !empty($_POST['_uid'])) { } // unknown action or missing query param else { + $OUTPUT->show_message('internalerror', 'error'); + $OUTPUT->send(); exit; } diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index eb0ba89c6..2f96e930f 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -255,6 +255,33 @@ function rcmail_email_input_format($mailto, $count=false, $check=true) } +function rcmail_generic_message_footer($isHtml) +{ + global $CONFIG; + + if ($isHtml && !empty($CONFIG['generic_message_footer_html'])) { + $file = $CONFIG['generic_message_footer_html']; + $html_footer = true; + } + else { + $file = $CONFIG['generic_message_footer']; + $html_footer = false; + } + + if ($file && realpath($file)) { + // sanity check + if (!preg_match('/\.(php|ini|conf)$/', $file) && strpos($file, '/etc/') === false) { + $footer = file_get_contents($file); + if ($isHtml && !$html_footer) + $footer = '<pre>' . $footer . '</pre>'; + return $footer; + } + } + + return false; +} + + /****** compose message ********/ if (strlen($_POST['_draft_saveid']) > 3) @@ -466,7 +493,7 @@ if (!$savedraft) { $message_body = preg_replace('/\s*id="_rc_sig"/', '', $message_body); // add inline css for blockquotes - $bstyle = 'padding-left:5px; border-left:#1010ff 2px solid; margin-left:5px; width:100%'; + $bstyle = 'padding-left:5px; border-left:#1010ff 2px solid; margin-left:5px'; $message_body = preg_replace('/<blockquote>/', '<blockquote type="cite" style="'.$bstyle.'">', $message_body); } @@ -490,19 +517,10 @@ if (!$savedraft) { } // generic footer for all messages - if ($isHtml && !empty($CONFIG['generic_message_footer_html'])) { - $footer = file_get_contents(realpath($CONFIG['generic_message_footer_html'])); - $footer = rcube_charset_convert($footer, RCMAIL_CHARSET, $message_charset); - } - else if (!empty($CONFIG['generic_message_footer'])) { - $footer = file_get_contents(realpath($CONFIG['generic_message_footer'])); + if ($footer = rcmail_generic_message_footer($isHtml)) { $footer = rcube_charset_convert($footer, RCMAIL_CHARSET, $message_charset); - if ($isHtml) - $footer = '<pre>'.$footer.'</pre>'; - } - - if ($footer) $message_body .= "\r\n" . $footer; + } } if ($isHtml) { @@ -820,6 +838,6 @@ else { if ($store_folder && !$saved) $OUTPUT->command('sent_successfully', 'error', rcube_label('errorsavingsent')); else - $OUTPUT->command('sent_successfully', 'confirmation', rcube_label('messagesent')); + $OUTPUT->command('sent_successfully', 'confirmation', rcube_label('messagesent'), $store_target); $OUTPUT->send('iframe'); } diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc index 552c180f5..1947c0f29 100644 --- a/program/steps/mail/show.inc +++ b/program/steps/mail/show.inc @@ -109,7 +109,7 @@ if ($uid) { $OUTPUT->set_env('skip_deleted', true); if ($CONFIG['display_next']) $OUTPUT->set_env('display_next', true); - if ($MESSAGE->headers->others['list-post']) + if ($MESSAGE->headers->get('list-post', false)) $OUTPUT->set_env('list_post', true); if ($CONFIG['forward_attachment']) $OUTPUT->set_env('forward_attachment', true); diff --git a/program/steps/settings/about.inc b/program/steps/settings/about.inc index 9b13402f1..0fdefddda 100644 --- a/program/steps/settings/about.inc +++ b/program/steps/settings/about.inc @@ -40,17 +40,28 @@ function rcmail_plugins_list($attrib) $attrib['id'] = 'rcmpluginlist'; $plugins = array_filter((array) $RCMAIL->config->get('plugins')); - $plugins = array_flip($plugins); + $plugin_info = array(); - foreach ($plugins as $name => $plugin) { - rcube_plugin_data($name, $plugins); + foreach ($plugins as $name) { + if ($info = $RCMAIL->plugins->get_info($name)) + $plugin_info[$name] = $info; } - if (empty($plugins)) { + // load info from required plugins, too + foreach ($plugin_info as $name => $info) { + if (is_array($info['required']) && !empty($info['required'])) { + foreach ($info['required'] as $req_name) { + if (!isset($plugin_info[$req_name]) && ($req_info = $RCMAIL->plugins->get_info($req_name))) + $plugin_info[$req_name] = $req_info; + } + } + } + + if (empty($plugin_info)) { return ''; } - ksort($plugins, SORT_LOCALE_STRING); + ksort($plugin_info, SORT_LOCALE_STRING); $table = new html_table($attrib); @@ -60,8 +71,8 @@ function rcmail_plugins_list($attrib) $table->add_header('license', rcube_label('license')); $table->add_header('source', rcube_label('source')); - foreach ($plugins as $name => $data) { - $uri = $data['srcuri'] ? $data['srcuri'] : $data['uri']; + foreach ($plugin_info as $name => $data) { + $uri = $data['src_uri'] ? $data['src_uri'] : $data['uri']; if ($uri && stripos($uri, 'http') !== 0) { $uri = 'http://' . $uri; } @@ -78,48 +89,6 @@ function rcmail_plugins_list($attrib) return $table->show(); } -function rcube_plugin_data($name, &$plugins = array()) -{ - // XPaths of plugin metadata elements - $metadata = array( - 'name' => 'string(//rc:package/rc:name)', - 'version' => 'string(//rc:package/rc:version/rc:release)', - 'license' => 'string(//rc:package/rc:license)', - 'license_uri' => 'string(//rc:package/rc:license/@uri)', - 'srcuri' => 'string(//rc:package/rc:srcuri)', - 'uri' => 'string(//rc:package/rc:uri)', - ); - - $package = INSTALL_PATH . "/plugins/$name/package.xml"; - if (file_exists($package) && ($file = file_get_contents($package))) { - $doc = new DOMDocument(); - $doc->loadXML($file); - $xpath = new DOMXPath($doc); - $xpath->registerNamespace('rc', "http://pear.php.net/dtd/package-2.0"); - $data = array(); - - foreach ($metadata as $key => $path) { - $data[$key] = $xpath->evaluate($path); - } - - $plugins[$name] = $data; - - // dependent required plugins (can be used, but not included in config) - $deps = $xpath->evaluate('//rc:package/rc:dependencies/rc:required/rc:package/rc:name'); - $cnt = $deps->length; - - for ($i=0; $i<$cnt; $i++) { - $dn = $deps->item($i)->nodeValue; - if (!array_key_exists($dn, $plugins)) { - rcube_plugin_data($dn, $plugins); - } - } - } - else { - unset($plugins[$name]); - } -} - $OUTPUT->set_pagetitle(rcube_label('about')); diff --git a/program/steps/settings/edit_folder.inc b/program/steps/settings/edit_folder.inc index cd2372790..fdb38e602 100644 --- a/program/steps/settings/edit_folder.inc +++ b/program/steps/settings/edit_folder.inc @@ -78,7 +78,7 @@ function rcmail_folder_form($attrib) // Location (name) if ($options['protected']) { - $foldername = Q(str_replace($delimiter, ' » ', rcmail_localize_folderpath($mbox_imap))); + $foldername = str_replace($delimiter, ' » ', Q(rcmail_localize_folderpath($mbox_imap))); } else if ($options['norename']) { $foldername = Q($folder); diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc index 2f726c7e8..319c58db9 100644 --- a/program/steps/settings/func.inc +++ b/program/steps/settings/func.inc @@ -581,8 +581,7 @@ function rcmail_user_prefs($current=null) if (!isset($no_override['reply_mode'])) { $field_id = 'rcmfd_reply_mode'; - $select_replymode = new html_select(array('name' => '_reply_mode', 'id' => $field_id, - 'onchange' => "\$('#rcmfd_sig_above').attr('disabled',this.selectedIndex<2)")); + $select_replymode = new html_select(array('name' => '_reply_mode', 'id' => $field_id)); $select_replymode->add(rcube_label('replyempty'), -1); $select_replymode->add(rcube_label('replybottomposting'), 0); $select_replymode->add(rcube_label('replytopposting'), 1); @@ -631,18 +630,6 @@ function rcmail_user_prefs($current=null) ); } - if (!isset($no_override['sig_above'])) { - $field_id = 'rcmfd_sig_above'; - $select_sigabove = new html_select(array('name' => '_sig_above', 'id' => $field_id, 'disabled' => $config['reply_mode'] < 1)); - $select_sigabove->add(rcube_label('belowquote'), 0); - $select_sigabove->add(rcube_label('abovequote'), 1); - - $blocks['sig']['options']['sig_above'] = array( - 'title' => html::label($field_id, Q(rcube_label('replysignaturepos'))), - 'content' => $select_sigabove->show($config['sig_above']?1:0), - ); - } - if (!isset($no_override['strip_existing_sig'])) { $field_id = 'rcmfd_strip_existing_sig'; $input_stripexistingsig = new html_checkbox(array('name' => '_strip_existing_sig', 'id' => $field_id, 'value' => 1)); diff --git a/program/steps/settings/save_prefs.inc b/program/steps/settings/save_prefs.inc index 5daab0d24..dfb2b13ac 100644 --- a/program/steps/settings/save_prefs.inc +++ b/program/steps/settings/save_prefs.inc @@ -86,7 +86,6 @@ switch ($CURR_SECTION) 'show_sig' => isset($_POST['_show_sig']) ? intval($_POST['_show_sig']) : 1, 'reply_mode' => isset($_POST['_reply_mode']) ? intval($_POST['_reply_mode']) : 0, 'strip_existing_sig' => isset($_POST['_strip_existing_sig']), - 'sig_above' => !empty($_POST['_sig_above']) && $_POST['_reply_mode'] > 0, 'default_font' => get_input_value('_default_font', RCUBE_INPUT_POST), 'forward_attachment' => !empty($_POST['_forward_attachment']), ); @@ -158,7 +157,7 @@ switch ($CURR_SECTION) $a_user_prefs['timezone'] = (string) $a_user_prefs['timezone']; if (isset($a_user_prefs['refresh_interval']) && !empty($CONFIG['min_refresh_interval'])) { - if ($a_user_prefs['refresh_interval'] > $CONFIG['min_refresh_interval']) { + if ($a_user_prefs['refresh_interval'] < $CONFIG['min_refresh_interval']) { $a_user_prefs['refresh_interval'] = $CONFIG['min_refresh_interval']; } } diff --git a/program/steps/utils/save_pref.inc b/program/steps/utils/save_pref.inc index b550ad7ef..7def8733d 100644 --- a/program/steps/utils/save_pref.inc +++ b/program/steps/utils/save_pref.inc @@ -21,6 +21,22 @@ $name = get_input_value('_name', RCUBE_INPUT_POST); $value = get_input_value('_value', RCUBE_INPUT_POST); +$whitelist = array( + 'preview_pane', + 'list_cols', + 'collapsed_folders', + 'collapsed_abooks', +); + +if (!in_array($name, array_merge($whitelist, $RCMAIL->plugins->allowed_prefs))) { + raise_error(array('code' => 500, 'type' => 'php', + 'file' => __FILE__, 'line' => __LINE__, + 'message' => sprintf("Hack attempt detected (user: %s)", $RCMAIL->get_user_name())), + true, false); + + $OUTPUT->reset(); + $OUTPUT->send(); +} // save preference value $RCMAIL->user->save_prefs(array($name => $value)); diff --git a/skins/classic/embed.css b/skins/classic/embed.css index b9715c77c..6d2c63c6a 100644 --- a/skins/classic/embed.css +++ b/skins/classic/embed.css @@ -14,12 +14,16 @@ font-size: 14px; color: #000; margin-bottom: .8em; - min-height: 20px; + min-height: 30px; padding: 10px 10px 6px 46px; background: url(images/display/icons.png) 6px 3px no-repeat #F7FDCB; border: 1px solid #C2D071; } +.rcmail-inline-warning { + background-position: 6px -92px; +} + .rcmail-inline-message > button { margin-left: 1em; vertical-align: baseline; diff --git a/skins/classic/templates/addressbook.html b/skins/classic/templates/addressbook.html index 9d959d5ef..ba119891c 100644 --- a/skins/classic/templates/addressbook.html +++ b/skins/classic/templates/addressbook.html @@ -9,6 +9,7 @@ #addresslist { width: <roundcube:exp expression="!empty(cookie:addressviewsplitter) ? cookie:addressviewsplitter-5 : 245" />px; } #contacts-box { left: <roundcube:exp expression="!empty(cookie:addressviewsplitter) ? cookie:addressviewsplitter+5 : 255" />px; <roundcube:exp expression="browser:ie ? ('width:expression((parseInt(this.parentNode.offsetWidth)-'.(!empty(cookie:addressviewsplitter) ? cookie:addressviewsplitter+5 : 255).')+\\'px\\');') : ''" /> +} #directorylistbox { width: <roundcube:exp expression="!empty(cookie:addressviewsplitterd) ? cookie:addressviewsplitterd-5 : 195" />px; } #addressscreen { left: <roundcube:exp expression="!empty(cookie:addressviewsplitterd) ? cookie:addressviewsplitterd+5 : 205" />px; <roundcube:exp expression="browser:ie ? ('width:expression((parseInt(this.parentNode.offsetWidth)-'.(!empty(cookie:addressviewsplitterd) ? cookie:addressviewsplitterd+5 : 205).')+\\'px\\');') : ''" /> diff --git a/skins/larry/mail.css b/skins/larry/mail.css index b5f0822a3..b2f1d786a 100644 --- a/skins/larry/mail.css +++ b/skins/larry/mail.css @@ -868,7 +868,7 @@ div.more-headers { } div.hide-headers { - background-position: center -1600px; + background-position: center -1590px; } #all-headers { diff --git a/skins/larry/templates/message.html b/skins/larry/templates/message.html index 0e19afa40..ba8fc0f29 100644 --- a/skins/larry/templates/message.html +++ b/skins/larry/templates/message.html @@ -88,7 +88,7 @@ </div><!-- end mainscreen --> -<div id="attachmentmenu" class="popupmenu dropdown"> +<div id="attachmentmenu" class="popupmenu"> <ul class="toolbarmenu"> <li><roundcube:button command="open-attachment" id="attachmenuopen" type="link" label="open" class="icon" classAct="icon active" innerclass="icon extwin" /></li> <li><roundcube:button command="download-attachment" id="attachmenudownload" type="link" label="download" class="icon" classAct="icon active" innerclass="icon download" /></li> diff --git a/skins/larry/templates/messagepreview.html b/skins/larry/templates/messagepreview.html index b2af03485..f69f65125 100644 --- a/skins/larry/templates/messagepreview.html +++ b/skins/larry/templates/messagepreview.html @@ -62,7 +62,7 @@ </div> </div> -<div id="attachmentmenu" class="popupmenu dropdown"> +<div id="attachmentmenu" class="popupmenu"> <ul class="toolbarmenu"> <li><roundcube:button command="open-attachment" id="attachmenuopen" type="link" label="open" class="icon" classAct="icon active" innerclass="icon extwin" /></li> <li><roundcube:button command="download-attachment" id="attachmenudownload" type="link" label="download" class="icon" classAct="icon active" innerclass="icon download" /></li> diff --git a/skins/larry/ui.js b/skins/larry/ui.js index b787dbb8d..1c76f9108 100644 --- a/skins/larry/ui.js +++ b/skins/larry/ui.js @@ -38,6 +38,7 @@ function rcube_mail_ui() this.init_tabs = init_tabs; this.show_about = show_about; this.show_popup = show_popup; + this.add_popup = add_popup; this.set_searchmod = set_searchmod; this.show_uploadform = show_uploadform; this.show_header_row = show_header_row; @@ -95,7 +96,7 @@ function rcube_mail_ui() if (rcmail.env.action == 'show' || rcmail.env.action == 'preview') { rcmail.addEventListener('aftershow-headers', function() { layout_messageview(); }); rcmail.addEventListener('afterhide-headers', function() { layout_messageview(); }); - $('#previewheaderstoggle').click(function(e){ toggle_preview_headers(this); return false }); + $('#previewheaderstoggle').click(function(e){ toggle_preview_headers(); return false }); // add menu link for each attachment $('#attachment-list > li').each(function() { @@ -287,28 +288,36 @@ function rcube_mail_ui() /** * Update UI on window resize */ - function resize() + function resize(e) { - if (rcmail.env.task == 'mail') { - if (rcmail.env.action == 'show' || rcmail.env.action == 'preview') - layout_messageview(); - else if (rcmail.env.action == 'compose') - layout_composeview(); - } + // resize in intervals to prevent lags and double onresize calls in Chrome (#1489005) + var interval = e ? 10 : 0; + + if (rcmail.resize_timeout) + window.clearTimeout(rcmail.resize_timeout); - // make iframe footer buttons float if scrolling is active - $('body.iframe .footerleft').each(function(){ - var footer = $(this), - body = $(document.body), - floating = footer.hasClass('floating'), - overflow = body.outerHeight(true) > $(window).height(); - - if (overflow != floating) { - var action = overflow ? 'addClass' : 'removeClass'; - footer[action]('floating'); - body[action]('floatingbuttons'); + rcmail.resize_timeout = window.setTimeout(function() { + if (rcmail.env.task == 'mail') { + if (rcmail.env.action == 'show' || rcmail.env.action == 'preview') + layout_messageview(); + else if (rcmail.env.action == 'compose') + layout_composeview(); } - }); + + // make iframe footer buttons float if scrolling is active + $('body.iframe .footerleft').each(function(){ + var footer = $(this), + body = $(document.body), + floating = footer.hasClass('floating'), + overflow = body.outerHeight(true) > $(window).height(); + + if (overflow != floating) { + var action = overflow ? 'addClass' : 'removeClass'; + footer[action]('floating'); + body[action]('floatingbuttons'); + } + }); + }, interval); } /** @@ -422,13 +431,25 @@ function rcube_mail_ui() /** + * Register a popup menu + */ + function add_popup(popup, config) + { + var obj = popups[popup] = $('#'+popup); + obj.appendTo(document.body); // move it to top for proper absolute positioning + + if (obj.length) + popupconfig[popup] = $.extend(popupconfig[popup] || {}, config || {}); + } + + /** * Trigger for popup menus */ function show_popup(popup, show, config) { // auto-register menu object if (config || !popupconfig[popup]) - popupconfig[popup] = $.extend(popupconfig[popup] || {}, config); + add_popup(popup, config); var visible = show_popupmenu(popup, show), config = popupconfig[popup]; @@ -553,7 +574,7 @@ function rcube_mail_ui() /** * Switch between short and full headers display in message preview */ - function toggle_preview_headers(button) + function toggle_preview_headers() { $('#preview-shortheaders').toggle(); var full = $('#preview-allheaders').toggle(), diff --git a/tests/Framework/Mime.php b/tests/Framework/Mime.php index 1f9a8c58f..61123dd85 100644 --- a/tests/Framework/Mime.php +++ b/tests/Framework/Mime.php @@ -142,4 +142,54 @@ class Framework_Mime extends PHPUnit_Framework_TestCase $this->assertEquals($unfolded, rcube_mime::unfold_flowed($flowed), "Test correct unfolding of quoted lines"); } + + /** + * Test wordwrap() + */ + function test_wordwrap() + { + $samples = array( + array( + array("aaaa aaaa\n aaaa"), + "aaaa aaaa\n aaaa", + ), + array( + array("123456789 123456789 123456789 123", 29), + "123456789 123456789 123456789\n123", + ), + array( + array("123456789 3456789 123456789", 29), + "123456789 3456789 123456789", + ), + array( + array("123456789 123456789 123456789 123", 29), + "123456789 123456789 123456789\n 123", + ), + array( + array("abc", 1, "\n", true), + "a\nb\nc", + ), + array( + array("ąść", 1, "\n", true, 'UTF-8'), + "Ä…\nÅ›\nć", + ), + array( + array(">abc\n>def", 2, "\n", true), + ">abc\n>def", + ), + array( + array("abc def", 3, "-"), + "abc-def", + ), + array( + array("----------------------------------------------------------------------------------------\nabc def123456789012345", 76), + "----------------------------------------------------------------------------------------\nabc def123456789012345", + ), + ); + + foreach ($samples as $sample) { + $this->assertEquals($sample[1], call_user_func_array(array('rcube_mime', 'wordwrap'), $sample[0]), "Test text wrapping"); + } + } + } diff --git a/tests/Framework/StringReplacer.php b/tests/Framework/StringReplacer.php index 95c59221b..dc7638734 100644 --- a/tests/Framework/StringReplacer.php +++ b/tests/Framework/StringReplacer.php @@ -37,6 +37,8 @@ class Framework_StringReplacer extends PHPUnit_Framework_TestCase array('http://link.com?(link)', '<a href="http://link.com?(link)">http://link.com?(link)</a>'), array('http://<test>', 'http://<test>'), array('http://', 'http://'), + array('1@1.com www.domain.tld', '<a href="mailto:1@1.com">1@1.com</a> <a href="http://www.domain.tld">www.domain.tld</a>'), + array(' www.domain.tld ', ' <a href="http://www.domain.tld">www.domain.tld</a> '), ); } |