diff options
61 files changed, 987 insertions, 652 deletions
@@ -35,7 +35,7 @@ INSTALLATION - /temp - /logs 3. Create a new database and a database user for RoundCube (see DATABASE SETUP) -4. Point your browser to http:///url-to-roundcube/installer/ +4. Point your browser to http://url-to-roundcube/installer/ 5. Follow the instructions of the install script (or see MANUAL CONFINGURATION) 6. After creating and testing the configuration, remove the installer directory 7. Done! diff --git a/SQL/mysql.initial.sql b/SQL/mysql.initial.sql index 926a83eab..ae195e438 100644 --- a/SQL/mysql.initial.sql +++ b/SQL/mysql.initial.sql @@ -1,5 +1,5 @@ -- RoundCube Webmail initial database structure --- Version 0.1-rc1 +-- Version 0.1 -- -- -------------------------------------------------------- @@ -16,9 +16,7 @@ CREATE TABLE `cache` ( `created` datetime NOT NULL default '0000-00-00 00:00:00', `data` longtext NOT NULL, PRIMARY KEY (`cache_id`), - KEY `user_id` (`user_id`), - KEY `cache_key` (`cache_key`), - KEY `session_id` (`session_id`) + INDEX `user_cache_index` (`user_id`,`cache_key`) ); -- -------------------------------------------------------- @@ -118,10 +116,7 @@ CREATE TABLE `messages` ( `size` int(11) unsigned NOT NULL default '0', `headers` text NOT NULL, `structure` text, - PRIMARY KEY (`message_id`), - KEY `user_id` (`user_id`), - KEY `idx` (`idx`), - KEY `uid` (`uid`), + PRIMARY KEY (`message_id`), UNIQUE `uniqueness` (`user_id`, `cache_key`, `uid`) ); diff --git a/SQL/mysql.update-0.1a.sql b/SQL/mysql.update-0.1a.sql deleted file mode 100644 index 60f22b3d6..000000000 --- a/SQL/mysql.update-0.1a.sql +++ /dev/null @@ -1,51 +0,0 @@ --- RoundCube Webmail update script for MySQL databases --- Updates from version 0.1-20051007 - - -ALTER TABLE `session` ADD `ip` VARCHAR(40) NOT NULL AFTER changed; -ALTER TABLE `users` ADD `alias` VARCHAR(128) NOT NULL AFTER mail_host; - - - --- RoundCube Webmail update script for MySQL databases --- Updates from version 0.1-20051021 - -ALTER TABLE `session` CHANGE `sess_id` `sess_id` VARCHAR(40) NOT NULL; - -ALTER TABLE `contacts` CHANGE `del` `del` TINYINT(1) NOT NULL; -ALTER TABLE `contacts` ADD `changed` DATETIME NOT NULL AFTER `user_id`; - -UPDATE `contacts` SET `del`=0 WHERE `del`=1; -UPDATE `contacts` SET `del`=1 WHERE `del`=2; - -ALTER TABLE `identities` CHANGE `default` `standard` TINYINT(1) NOT NULL; -ALTER TABLE `identities` CHANGE `del` `del` TINYINT(1) NOT NULL; - -UPDATE `identities` SET `del`=0 WHERE `del`=1; -UPDATE `identities` SET `del`=1 WHERE `del`=2; -UPDATE `identities` SET `standard`=0 WHERE `standard`=1; -UPDATE `identities` SET `standard`=1 WHERE `standard`=2; - -CREATE TABLE `messages` ( - `message_id` int(11) unsigned NOT NULL auto_increment, - `user_id` int(11) unsigned NOT NULL default '0', - `del` tinyint(1) NOT NULL default '0', - `cache_key` varchar(128) NOT NULL default '', - `created` datetime NOT NULL default '0000-00-00 00:00:00', - `idx` int(11) unsigned NOT NULL default '0', - `uid` int(11) unsigned NOT NULL default '0', - `subject` varchar(255) NOT NULL default '', - `from` varchar(255) NOT NULL default '', - `to` varchar(255) NOT NULL default '', - `cc` varchar(255) NOT NULL default '', - `date` datetime NOT NULL default '0000-00-00 00:00:00', - `size` int(11) unsigned NOT NULL default '0', - `headers` text NOT NULL, - `structure` text, - PRIMARY KEY (`message_id`), - KEY `user_id` (`user_id`), - KEY `idx` (`idx`), - KEY `uid` (`uid`), - UNIQUE `uniqueness` (`cache_key`, `uid`) -) TYPE=MyISAM; - diff --git a/SQL/mysql.update.sql b/SQL/mysql.update.sql index e904be278..11e744cfa 100644 --- a/SQL/mysql.update.sql +++ b/SQL/mysql.update.sql @@ -1,21 +1,17 @@ -- RoundCube Webmail update script for MySQL databases --- Updates from version 0.1-beta and 0.1-beta2 +-- Updates from version 0.1-stable to 0.1.1 TRUNCATE TABLE `messages`; ALTER TABLE `messages` - DROP `body`, - DROP INDEX `cache_key`, - ADD `structure` TEXT, - ADD UNIQUE `uniqueness` (`user_id`, `cache_key`, `uid`); + DROP INDEX `idx`, + DROP INDEX `uid` -ALTER TABLE `identities` - ADD `html_signature` tinyint(1) default 0 NOT NULL; +ALTER TABLE `cache` + DROP INDEX `cache_key`, + DROP INDEX `session_id`, + ADD INDEX `user_cache_index` (`user_id`,`cache_key`); -ALTER TABLE `session` CHANGE `ip` `ip` VARCHAR(40) - --- Uncomment these lines if you're using MySQL 4.1 or higher --- ALTER TABLE `users` --- DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci, --- CHANGE `username` `username` VARCHAR( 128 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, --- CHANGE `alias` `alias` VARCHAR( 128 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL; +ALTER TABLE `users` + ADD INDEX `username_index` (`username`), + ADD INDEX `alias_index` (`alias`); diff --git a/SQL/mysql5.initial.sql b/SQL/mysql5.initial.sql index 1a6ef1990..881344b98 100644 --- a/SQL/mysql5.initial.sql +++ b/SQL/mysql5.initial.sql @@ -1,5 +1,5 @@ -- RoundCube Webmail initial database structure --- Version 0.1-rc1 +-- Version 0.1 -- -------------------------------------------------------- @@ -15,7 +15,7 @@ CREATE TABLE `session` ( `ip` varchar(40) NOT NULL, `vars` text NOT NULL, PRIMARY KEY(`sess_id`) -) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci; +) TYPE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci; -- Table structure for table `users` @@ -29,8 +29,10 @@ CREATE TABLE `users` ( `last_login` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `language` varchar(5) NOT NULL DEFAULT 'en', `preferences` text, - PRIMARY KEY(`user_id`) -) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci; + PRIMARY KEY(`user_id`), + INDEX `username_index` (`username`), + INDEX `alias_index` (`alias`) +) TYPE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci; -- Table structure for table `messages` @@ -52,14 +54,12 @@ CREATE TABLE `messages` ( `headers` text NOT NULL, `structure` text, PRIMARY KEY(`message_id`), - INDEX `idx`(`idx`), - INDEX `uid`(`uid`), UNIQUE `uniqueness` (`user_id`, `cache_key`, `uid`), CONSTRAINT `user_id_fk_messages` FOREIGN KEY (`user_id`) REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE -) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci; +) TYPE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci; -- Table structure for table `cache` @@ -72,13 +72,12 @@ CREATE TABLE `cache` ( `data` longtext NOT NULL, `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY(`cache_id`), - INDEX `cache_key`(`cache_key`), - INDEX `session_id`(`session_id`), + INDEX `user_cache_index` (`user_id`,`cache_key`), CONSTRAINT `user_id_fk_cache` FOREIGN KEY (`user_id`) REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE -) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci; +) TYPE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci; -- Table structure for table `contacts` @@ -98,7 +97,7 @@ CREATE TABLE `contacts` ( REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE -) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci; +) TYPE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci; -- Table structure for table `identities` @@ -120,7 +119,7 @@ CREATE TABLE `identities` ( REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE -) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci; +) TYPE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci; SET FOREIGN_KEY_CHECKS=1; diff --git a/SQL/postgres.initial.sql b/SQL/postgres.initial.sql index 356a579fc..ff239cbf8 100644 --- a/SQL/postgres.initial.sql +++ b/SQL/postgres.initial.sql @@ -26,7 +26,6 @@ CREATE TABLE users ( ); - -- -- Table "session" -- Name: session; Type: TABLE; Schema: public; Owner: postgres @@ -61,7 +60,7 @@ CREATE SEQUENCE identity_ids CREATE TABLE identities ( identity_id integer DEFAULT nextval('identity_ids'::text) PRIMARY KEY, - user_id integer NOT NULL REFERENCES users (user_id), + user_id integer NOT NULL REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE, del integer DEFAULT 0 NOT NULL, standard integer DEFAULT 0 NOT NULL, name character varying(128) NOT NULL, @@ -73,6 +72,7 @@ CREATE TABLE identities ( html_signature integer DEFAULT 0 NOT NULL ); +CREATE INDEX identities_user_id_idx ON identities (user_id); -- @@ -94,7 +94,7 @@ CREATE SEQUENCE contact_ids CREATE TABLE contacts ( contact_id integer DEFAULT nextval('contact_ids'::text) PRIMARY KEY, - user_id integer NOT NULL REFERENCES users (user_id), + user_id integer NOT NULL REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE, changed timestamp with time zone DEFAULT now() NOT NULL, del integer DEFAULT 0 NOT NULL, name character varying(128) DEFAULT ''::character varying NOT NULL, @@ -104,7 +104,7 @@ CREATE TABLE contacts ( vcard text ); - +CREATE INDEX contacts_user_id_idx ON contacts (user_id); -- -- Sequence "cache_ids" @@ -124,14 +124,14 @@ CREATE SEQUENCE cache_ids CREATE TABLE "cache" ( cache_id integer DEFAULT nextval('cache_ids'::text) PRIMARY KEY, - user_id integer NOT NULL REFERENCES users (user_id), + user_id integer NOT NULL REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE, session_id character varying(40) REFERENCES "session" (sess_id), cache_key character varying(128) DEFAULT ''::character varying NOT NULL, created timestamp with time zone DEFAULT now() NOT NULL, data text NOT NULL ); - +CREATE INDEX cache_user_id_idx ON "cache" (user_id, cache_key); -- -- Sequence "message_ids" @@ -151,7 +151,7 @@ CREATE SEQUENCE message_ids CREATE TABLE "messages" ( message_id integer DEFAULT nextval('message_ids'::text) PRIMARY KEY, - user_id integer NOT NULL REFERENCES users (user_id), + user_id integer NOT NULL REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE, del integer DEFAULT 0 NOT NULL, cache_key character varying(128) DEFAULT ''::character varying NOT NULL, created timestamp with time zone DEFAULT now() NOT NULL, diff --git a/SQL/postgres.update.sql b/SQL/postgres.update.sql index 0d63cf934..ff1ce12e4 100644 --- a/SQL/postgres.update.sql +++ b/SQL/postgres.update.sql @@ -1,12 +1,16 @@ --- RoundCube Webmail update script for Postres databases --- Updates from version 0.1-beta and older +-- RoundCube Webmail update script for Postgres databases +-- Updates from version 0.1-stable to 0.1.1 -ALTER TABLE "messages" DROP body; -ALTER TABLE "messages" ADD structure TEXT; -ALTER TABLE "messages" ADD UNIQUE (user_id, cache_key, uid); - -ALTER TABLE "identities" ADD html_signature INTEGER; -ALTER TABLE "identities" ALTER html_signature SET DEFAULT 0; -UPDATE identities SET html_signature = 0; -ALTER TABLE "identities" ALTER html_signature SET NOT NULL; +CREATE INDEX cache_user_id_idx ON cache (user_id, cache_key); +CREATE INDEX contacts_user_id_idx ON contacts (user_id); +CREATE INDEX identities_user_id_idx ON identities (user_id); +-- added ON DELETE/UPDATE actions +ALTER TABLE messages DROP CONSTRAINT messages_user_id_fkey; +ALTER TABLE messages ADD FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE identities DROP CONSTRAINT identities_user_id_fkey; +ALTER TABLE identities ADD FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE contacts DROP CONSTRAINT contacts_user_id_fkey; +ALTER TABLE contacts ADD FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE cache DROP CONSTRAINT cache_user_id_fkey; +ALTER TABLE cache ADD FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/SQL/sqlite.initial.sql b/SQL/sqlite.initial.sql index 4ae752983..041696b1d 100644 --- a/SQL/sqlite.initial.sql +++ b/SQL/sqlite.initial.sql @@ -1,5 +1,5 @@ -- RoundCube Webmail initial database structure --- Version 0.1-rc1 +-- Version 0.1 -- -- -------------------------------------------------------- @@ -17,9 +17,7 @@ CREATE TABLE cache ( data longtext NOT NULL ); -CREATE INDEX ix_cache_user_id ON cache(user_id); -CREATE INDEX ix_cache_cache_key ON cache(cache_key); -CREATE INDEX ix_cache_session_id ON cache(session_id); +CREATE INDEX ix_cache_user_cache_key ON cache(user_id, cache_key); -- -------------------------------------------------------- @@ -82,7 +80,6 @@ CREATE TABLE users ( preferences text NOT NULL default '' ); - -- -------------------------------------------------------- -- @@ -115,14 +112,11 @@ CREATE TABLE messages ( subject varchar(255) NOT NULL default '', "from" varchar(255) NOT NULL default '', "to" varchar(255) NOT NULL default '', - cc varchar(255) NOT NULL default '', - date datetime NOT NULL default '0000-00-00 00:00:00', + "cc" varchar(255) NOT NULL default '', + "date" datetime NOT NULL default '0000-00-00 00:00:00', size integer NOT NULL default '0', headers text NOT NULL, structure text ); -CREATE INDEX ix_messages_user_id ON messages(user_id); -CREATE INDEX ix_messages_cache_key ON messages(cache_key); -CREATE INDEX ix_messages_idx ON messages(idx); -CREATE INDEX ix_messages_uid ON messages(uid); +CREATE INDEX ix_messages_user_cache_uid ON messages(user_id,cache_key,uid); diff --git a/SQL/sqlite.update.sql b/SQL/sqlite.update.sql index e725729ad..f609a3693 100644 --- a/SQL/sqlite.update.sql +++ b/SQL/sqlite.update.sql @@ -1,5 +1,5 @@ -- RoundCube Webmail update script for SQLite databases --- Updates from version 0.1-beta2 and older +-- Updates from version 0.1-stable to 0.1.1 DROP TABLE messages; @@ -14,14 +14,11 @@ CREATE TABLE messages ( subject varchar(255) NOT NULL default '', "from" varchar(255) NOT NULL default '', "to" varchar(255) NOT NULL default '', - cc varchar(255) NOT NULL default '', - date datetime NOT NULL default '0000-00-00 00:00:00', + "cc" varchar(255) NOT NULL default '', + "date" datetime NOT NULL default '0000-00-00 00:00:00', size integer NOT NULL default '0', headers text NOT NULL, structure text ); -CREATE INDEX ix_messages_user_id ON messages(user_id); -CREATE INDEX ix_messages_cache_key ON messages(cache_key); -CREATE INDEX ix_messages_idx ON messages(idx); -CREATE INDEX ix_messages_uid ON messages(uid); +CREATE INDEX ix_messages_user_cache_uid ON messages(user_id,cache_key,uid); diff --git a/config/db.inc.php.dist b/config/db.inc.php.dist index 442ef6ed4..151439a54 100644 --- a/config/db.inc.php.dist +++ b/config/db.inc.php.dist @@ -15,7 +15,7 @@ $rcmail_config = array(); // PEAR database DSN for read/write operations -// format is db_provider://user:password@host/databse +// format is db_provider://user:password@host/database // currently supported db_providers: mysql, mysqli, pgsql, sqlite, mssql $rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail'; diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist index 8475c816d..962fb4e2f 100644 --- a/config/main.inc.php.dist +++ b/config/main.inc.php.dist @@ -180,6 +180,9 @@ $rcmail_config['flag_for_deletion'] = TRUE; // 0 = ask the user, 1 = send automatically, 2 = ignore (never send or ask) $rcmail_config['mdn_requests'] = 0; +// Use this charset as fallback for message decoding +$rcmail_config['default_charset'] = 'ISO-8859-1'; + // Make use of the built-in spell checker. It is based on GoogieSpell. // Since Google only accepts connections over https your PHP installatation // requires to be compiled with Open SSL support @@ -200,6 +203,9 @@ $rcmail_config['spellcheck_languages'] = NULL; // paths are relative to the RoundCube root folder $rcmail_config['generic_message_footer'] = ''; +// add a received header to outgoing mails containing the creators IP and hostname +$rcmail_config['http_received_header'] = false; + // this string is used as a delimiter for message headers when sending // leave empty for auto-detection $rcmail_config['mail_header_delimiter'] = NULL; @@ -238,7 +244,11 @@ $rcmail_config['dont_override'] = array(); $rcmail_config['javascript_config'] = array('read_when_deleted', 'flag_for_deletion'); // try to load host-specific configuration -$rcmail_config['include_host_config'] = FALSE; +$rcmail_config['include_host_config'] = false; + +// THIS OPTION WILL ALLOW THE INSTALLER TO RUN AND CAN EXPOSE SENSITIVE CONFIG DATA. +// ONLY ENABLE IT IF YOU'RE REALLY SURE WHAT YOU'RE DOING! +$rcmail_config['enable_installer'] = false; /***** these settings can be overwritten by user's preferences *****/ @@ -2,9 +2,9 @@ /* +-----------------------------------------------------------------------+ | RoundCube Webmail IMAP Client | - | Version 0.1-stable | + | Version 0.1.1 | | | - | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland | + | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland | | Licensed under the GNU GPL | | | | Redistribution and use in source and binary forms, with or without | @@ -41,7 +41,7 @@ */ // application constants -define('RCMAIL_VERSION', '0.1'); +define('RCMAIL_VERSION', '0.1.1'); define('RCMAIL_CHARSET', 'UTF-8'); define('JS_OBJECT_NAME', 'rcmail'); @@ -103,8 +103,12 @@ if (empty($_task) || !in_array($_task, $MAIN_TASKS)) if ($_action != 'get' && $_action != 'viewsource') { // use gzip compression if supported - if (function_exists('ob_gzhandler') && !ini_get('zlib.output_compression')) + if (function_exists('ob_gzhandler') + && !ini_get('zlib.output_compression') + && ini_get('output_handler') != 'ob_gzhandler') + { ob_start('ob_gzhandler'); + } else ob_start(); } @@ -156,7 +160,7 @@ if ($_action=='login' && $_task=='mail') $OUTPUT->show_message("cookiesdisabled", 'warning'); } else if ($_SESSION['temp'] && !empty($_POST['_user']) && isset($_POST['_pass']) && - rcmail_login(get_input_value('_user', RCUBE_INPUT_POST), + rcmail_login(trim(get_input_value('_user', RCUBE_INPUT_POST), ' '), get_input_value('_pass', RCUBE_INPUT_POST, true, 'ISO-8859-1'), $host)) { // create new session ID @@ -241,7 +245,7 @@ if (!empty($_action)) if (empty($USER->ID)) { // check if installer is still active - if (is_file('./installer/index.php')) + if ($CONFIG['enable_installer'] && is_readable('./installer/index.php')) $OUTPUT->add_footer(' <div style="background:#ef9398; border:2px solid #dc5757; padding:0.5em; margin:2em auto; width:50em"> <h2 style="margin-top:0.2em">Installer script is still accessible</h2> diff --git a/installer/check.php b/installer/check.php index 8352364f5..e671c06bd 100644 --- a/installer/check.php +++ b/installer/check.php @@ -1,7 +1,7 @@ <form action="index.php" method="get"> <?php -$required_php_exts = array('PCRE' => 'pcre', 'Session' => 'session', 'Sockets' => 'sockets'); +$required_php_exts = array('PCRE' => 'pcre', 'Session' => 'session'); $optional_php_exts = array('FileInfo' => 'fileinfo', 'Libiconv' => 'iconv', 'Multibyte' => 'mbstring', 'OpenSSL' => 'openssl', 'Mcrypt' => 'mcrypt', 'GD' => 'gd'); @@ -37,13 +37,13 @@ echo '<input type="hidden" name="_step" value="' . ($RCI->configured ? 3 : 2) . <h3>Checking PHP version</h3> <?php -if (phpversion() > 4.3) { - $RCI->pass('Version', 'PHP ' . phpversion() . ' detected'); +define('MIN_PHP_VERSION', '4.3.1'); +if (version_compare(PHP_VERSION, MIN_PHP_VERSION, '>=')) { + $RCI->pass('Version', 'PHP ' . PHP_VERSION . ' detected'); } else { - $RCI->fail('Version', 'PHP Version 4.3.1 or greater is required'); + $RCI->fail('Version', 'PHP Version ' . MIN_PHP_VERSION . ' or greater is required ' . PHP_VERSION . ' detected'); } - ?> <h3>Checking PHP extensions</h3> @@ -65,7 +65,7 @@ foreach ($required_php_exts AS $name => $ext) { ?> -<p class="hint">These extensions are <em>optional</em> but recommended to get the best performance:</p> +<p class="hint">The next couple of extensions are <em>optional</em> but recommended to get the best performance:</p> <?php foreach ($optional_php_exts AS $name => $ext) { diff --git a/installer/config.php b/installer/config.php index 5b365a5a5..dc85faa6c 100644 --- a/installer/config.php +++ b/installer/config.php @@ -20,10 +20,14 @@ $RCI->config_props = array( 'htmleditor' => 1, ); +// allow the current user to get to the next step +$_SESSION['allowinstaller'] = true; + if (!empty($_POST['submit'])) { echo '<p class="notice">Copy the following configurations and save them in two files (names above the text box)'; - echo ' within the <tt>config/</tt> directory of your RoundCube installation.</p>'; + echo ' within the <tt>config/</tt> directory of your RoundCube installation.<br/>'; + echo ' Make sure that there are no characters outside the <tt><?php ?></tt> brackets when saving the files.</p>'; $textbox = new textarea(array('rows' => 16, 'cols' => 60, 'class' => "configfile")); diff --git a/installer/index.php b/installer/index.php index 264cefcca..69e33f870 100644 --- a/installer/index.php +++ b/installer/index.php @@ -22,12 +22,11 @@ <div id="content"> -<h1>RoundCube Webmail Installer</h1> - <?php - ini_set('error_reporting', E_ALL&~E_NOTICE); ini_set('display_errors', 1); + + session_start(); $docroot = realpath(dirname(__FILE__) . '/../'); $include_path = $docroot . '/program/lib' . PATH_SEPARATOR . $docroot . '/program' . PATH_SEPARATOR . ini_get('include_path'); @@ -36,9 +35,20 @@ require_once 'rcube_install.php'; $RCI = rcube_install::get_instance(); $RCI->load_config(); + + // exit if installation is complete + if ($RCI->configured && !$RCI->getprop('enable_installer') && !$_SESSION['allowinstaller']) { + header("HTTP/1.0 404 Not Found"); + echo '<h2 class="error">The installer is disabled!</h2>'; + echo '<p>To enable it again, set <tt>$rcmail_config[\'enable_installer\'] = true;</tt> in config/main.inc.php</p>'; + echo '</div></body></html>'; + exit; + } ?> +<h1>RoundCube Webmail Installer</h1> + <ol id="progress"> <?php @@ -51,7 +61,6 @@ </ol> <?php - $include_steps = array('welcome.html', 'check.php', 'config.php', 'test.php'); if ($include_steps[$RCI->step]) { diff --git a/installer/rcube_install.php b/installer/rcube_install.php index 8caa79d02..12cd5c10d 100644 --- a/installer/rcube_install.php +++ b/installer/rcube_install.php @@ -171,7 +171,7 @@ class rcube_install $out); } - return $out; + return trim($out); } @@ -305,6 +305,8 @@ class rcube_install if (eregi(';$', trim($line))) { $DB->query($buff); $buff = ''; + if ($this->get_error()) + break; } } } diff --git a/installer/test.php b/installer/test.php index 7e9903991..5be343a31 100644 --- a/installer/test.php +++ b/installer/test.php @@ -31,11 +31,38 @@ else if (!$read_db) { ?> +<h3>Check if directories are writable</h3> +<p>RoundCube may need to write/save files into these directories</p> +<?php + +if ($RCI->configured) { + $pass = false; + foreach (array($RCI->config['temp_dir'],$RCI->config['log_dir']) as $dir) { + $dirpath = $dir{0} == '/' ? $dir : $docroot . '/' . $dir; + if (is_writable(realpath($dirpath))) { + $RCI->pass($dir); + $pass = true; + } + else { + $RCI->fail($dir, 'not writeable for the webserver'); + } + echo '<br />'; + } + + if (!$pass) + echo '<p class="hint">Use <tt>chmod</tt> or <tt>chown</tt> to grant write privileges to the webserver</p>'; +} +else { + $RCI->fail('Config', 'Could not read config files'); +} + +?> + <h3>Check configured database settings</h3> <?php $db_working = false; -if (!empty($RCI->config)) { +if ($RCI->configured) { if (!empty($RCI->config['db_backend']) && !empty($RCI->config['db_dsnw'])) { echo 'Backend: '; @@ -53,7 +80,7 @@ if (!empty($RCI->config)) { } else { $RCI->fail('DSN (write)', $db_error_msg); - echo '<p class="hint">Make sure that the configured database extists and that the user as write privileges<br />'; + echo '<p class="hint">Make sure that the configured database exists and that the user has write privileges<br />'; echo 'DSN: ' . $RCI->config['db_dsnw'] . '</p>'; if ($RCI->config['db_backend'] == 'mdb2') echo '<p class="hint">There are known problems with MDB2 running on PHP 4. Try setting <tt>db_backend</tt> to \'db\' instead</p>'; @@ -93,12 +120,12 @@ if ($db_working) { // more database tests if ($db_working) { // write test - $db_write = $DB->query("INSERT INTO {$RCI->config['db_table_cache']} (session_id, cache_key, data, user_id) VALUES (?, ?, ?, 0)", '1234567890abcdef', 'test', 'test'); - $insert_id = $DB->insert_id($RCI->config['db_sequence_cache']); - - if ($db_write && $insert_id) { + $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); + + if ($db_write) { $RCI->pass('DB Write'); - $DB->query("DELETE FROM {$RCI->config['db_table_cache']} WHERE cache_id=?", $insert_id); + $DB->query("DELETE FROM {$RCI->config['db_table_session']} WHERE sess_id=?", $insert_id); } else { $RCI->fail('DB Write', $RCI->get_error()); @@ -137,11 +164,11 @@ if ($RCI->getprop('smtp_server')) { $pass = $RCI->getprop('smtp_pass', '(none)'); if ($user == '%u') { - $user_field = new textfield(array('name' => '_user')); - $user = $user_field->show($_POST['_user']); + $user_field = new textfield(array('name' => '_smtp_user')); + $user = $user_field->show($_POST['_smtp_user']); } if ($pass == '%p') { - $pass_field = new passwordfield(array('name' => '_pass')); + $pass_field = new passwordfield(array('name' => '_smtp_pass')); $pass = $pass_field->show(); } @@ -168,8 +195,8 @@ if (isset($_POST['sendmail']) && !empty($_POST['_from']) && !empty($_POST['_to'] preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_to']))) { $headers = array( - 'From' => trim($_POST['_from']), - 'To' => trim($_POST['_to']), + 'From' => trim($_POST['_from']), + 'To' => trim($_POST['_to']), 'Subject' => 'Test message from RoundCube', ); @@ -180,11 +207,13 @@ if (isset($_POST['sendmail']) && !empty($_POST['_from']) && !empty($_POST['_to'] if ($RCI->getprop('smtp_server')) { $CONFIG = $RCI->config; - if (!empty($_POST['_user'])) - $CONFIG['smtp_user'] = $_POST['_user']; - if (!empty($_POST['_pass'])) - $CONFIG['smtp_pass'] = $_POST['_pass']; - + if (!empty($_POST['_smtp_user'])) { + $CONFIG['smtp_user'] = $_POST['_smtp_user']; + } + if (!empty($_POST['_smtp_pass'])) { + $CONFIG['smtp_pass'] = $_POST['_smtp_pass']; + } + $mail_object = new rc_mail_mime(); $send_headers = $mail_object->headers($headers); diff --git a/installer/welcome.html b/installer/welcome.html index a0c88e5e9..200f680f3 100644 --- a/installer/welcome.html +++ b/installer/welcome.html @@ -10,7 +10,6 @@ <ul> <li>PCRE (perl compatible regular expression)</li> <li>Session support</li> - <li>Sockets enabled</li> <li>Libiconv (recommended)</li> <li>OpenSSL (recommended)</li> <li>FileInfo (optional)</li> diff --git a/program/include/main.inc b/program/include/main.inc index f3d0e263b..1d35682ce 100644 --- a/program/include/main.inc +++ b/program/include/main.inc @@ -74,6 +74,7 @@ function rcmail_startup($task='mail') $DB = new $dbclass($CONFIG['db_dsnw'], $CONFIG['db_dsnr'], $CONFIG['db_persistent']); $DB->sqlite_initials = $INSTALL_PATH.'SQL/sqlite.initial.sql'; + $DB->set_debug((bool)$CONFIG['sql_debug']); $DB->db_connect('w'); // use database for storing session data @@ -289,6 +290,9 @@ function rcmail_imap_init($connect=FALSE) function rcmail_set_imap_prop() { global $CONFIG, $IMAP; + + if (!empty($CONFIG['default_charset'])) + $IMAP->set_charset($CONFIG['default_charset']); // set root dir from config if (!empty($CONFIG['imap_root'])) @@ -955,22 +959,23 @@ function rcube_charset_convert($str, $from, $to=NULL) 'X-USER-DEFINED' => 'ISO-8859-15', 'ISO-8859-8-I' => 'ISO-8859-8', 'KS_C_5601-1987' => 'EUC-KR', - 'GB2312' => 'GB18030' ); // convert charset using iconv module if (function_exists('iconv') && $from != 'UTF-7' && $to != 'UTF-7') { + $aliases['GB2312'] = 'GB18030'; return iconv(($aliases[$from] ? $aliases[$from] : $from), ($aliases[$to] ? $aliases[$to] : $to) . "//IGNORE", $str); } // convert charset using mbstring module if ($MBSTRING) { - $mb_map = $aliases + array('UTF-7' => 'UTF7-IMAP'); + $aliases['UTF-7'] = 'UTF7-IMAP'; + $aliases['WINDOWS-1257'] = 'ISO-8859-13'; // return if convert succeeded - if (($out = mb_convert_encoding($str, ($mb_map[$to] ? $mb_map[$to] : $to), ($mb_map[$from] ? $mb_map[$from] : $from))) != '') + if (($out = mb_convert_encoding($str, ($aliases[$to] ? $aliases[$to] : $to), ($aliases[$from] ? $aliases[$from] : $from))) != '') return $out; } @@ -1372,6 +1377,7 @@ function rcmail_mail_domain($host) /** * Replace all css definitions with #container [def] + * and remove css-inlined scripting * * @param string CSS source code * @param string Container ID to use as prefix @@ -1381,6 +1387,10 @@ function rcmail_mod_css_styles($source, $container_id, $base_url = '') { $a_css_values = array(); $last_pos = 0; + + // ignore the whole block if evil styles are detected + if (stristr($source, 'expression') || stristr($source, 'behavior')) + return ''; // cut out all contents between { and } while (($pos = strpos($source, '{', $last_pos)) && ($pos2 = strpos($source, '}', $pos))) @@ -1391,7 +1401,7 @@ function rcmail_mod_css_styles($source, $container_id, $base_url = '') $last_pos = $pos+2; } - // remove html commends and add #container to each tag selector. + // remove html comments and add #container to each tag selector. // also replace body definition because we also stripped off the <body> tag $styles = preg_replace( array( @@ -1562,7 +1572,10 @@ function format_date($date, $format=NULL) function format_email_recipient($email, $name='') { if ($name && $name != $email) - return sprintf('%s <%s>', strpos($name, ",") ? '"'.$name.'"' : $name, $email); + { + // Special chars as defined by RFC 822 need to in quoted string (or escaped). + return sprintf('%s <%s>', preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $name) ? '"'.addcslashes($name, '"').'"' : $name, $email); + } else return $email; } @@ -1787,10 +1800,6 @@ function rcmail_render_folder_tree_html(&$arrFolders, &$mbox_name, $maxlength, $ } } - // add unread message count display - if ($unread_count = $IMAP->messagecount($folder['id'], 'RECENT', ($folder['id']==$mbox_name))) - $foldername .= sprintf(' (%d)', $unread_count); - // make folder name safe for ids and class names $folder_id = preg_replace('/[^A-Za-z0-9\-_]/', '', $folder['id']); $class_name = preg_replace('/[^a-z0-9\-_]/', '', $folder_class ? $folder_class : strtolower($folder['id'])); diff --git a/program/include/rcube_db.inc b/program/include/rcube_db.inc index 4c3e9fc62..63c6759b9 100644 --- a/program/include/rcube_db.inc +++ b/program/include/rcube_db.inc @@ -153,8 +153,18 @@ class rcube_db $this->db_handle = $this->dsn_connect($dsn); $this->db_connected = $this->db_handle ? TRUE : FALSE; } + + + /** + * Activate/deactivate debug mode + * (not implemented) + */ + function set_debug($dbg = true) + { - + } + + /** * Getter for error state * diff --git a/program/include/rcube_imap.inc b/program/include/rcube_imap.inc index dce778968..9a594854c 100644 --- a/program/include/rcube_imap.inc +++ b/program/include/rcube_imap.inc @@ -51,6 +51,7 @@ class rcube_imap var $sort_order = 'DESC'; var $delimiter = NULL; var $caching_enabled = FALSE; + var $default_charset = 'ISO-8859-1'; var $default_folders = array('INBOX'); var $default_folders_lc = array('inbox'); var $cache = array(); @@ -204,6 +205,20 @@ class rcube_imap /** + * Set default message charset + * + * This will be used for message decoding if a charset specification is not available + * + * @param string Charset string + * @access public + */ + function set_charset($cs) + { + $this->default_charset = $ch; + } + + + /** * This list of folders will be listed above all other folders * * @param array Indexed list of folder names @@ -1146,7 +1161,7 @@ class rcube_imap // normalize filename property if ($filename_mime = $struct->d_parameters['filename'] ? $struct->d_parameters['filename'] : $struct->ctype_parameters['name']) - $struct->filename = $this->decode_mime_string($filename_mime); + $struct->filename = rcube_imap::decode_mime_string($filename_mime, $this->default_charset); else if ($filename_encoded = $struct->d_parameters['filename*'] ? $struct->d_parameters['filename*'] : $struct->ctype_parameters['name*']) { // decode filename according to RFC 2231, Section 4 @@ -1154,7 +1169,7 @@ class rcube_imap $struct->filename = rcube_charset_convert(urldecode($filename_urlencoded), $filename_charset); } else if (!empty($struct->headers['content-description'])) - $struct->filename = $this->decode_mime_string($struct->headers['content-description']); + $struct->filename = rcube_imap::decode_mime_string($struct->headers['content-description'], $this->default_charset); return $struct; } @@ -1241,9 +1256,9 @@ class rcube_imap // convert charset (if text or message part) if ($o_part->ctype_primary=='text' || $o_part->ctype_primary=='message') { - // assume ISO-8859-1 if no charset specified + // assume default if no charset specified if (empty($o_part->charset)) - $o_part->charset = 'ISO-8859-1'; + $o_part->charset = $this->default_charset; $body = rcube_charset_convert($body, $o_part->charset); } @@ -1633,16 +1648,14 @@ class rcube_imap /** * Subscribe to a specific mailbox(es) * - * @param string Mailbox name(s) + * @param array Mailbox name(s) * @return boolean True on success */ - function subscribe($mbox_name) + function subscribe($a_mboxes) { - if (is_array($mbox_name)) - $a_mboxes = $mbox_name; - else if (is_string($mbox_name) && strlen($mbox_name)) - $a_mboxes = explode(',', $mbox_name); - + if (!is_array($a_mboxes)) + $a_mboxes = array($a_mboxes); + // let this common function do the main work return $this->_change_subscription($a_mboxes, 'subscribe'); } @@ -1651,15 +1664,13 @@ class rcube_imap /** * Unsubscribe mailboxes * - * @param string Mailbox name(s) + * @param array Mailbox name(s) * @return boolean True on success */ - function unsubscribe($mbox_name) + function unsubscribe($a_mboxes) { - if (is_array($mbox_name)) - $a_mboxes = $mbox_name; - else if (is_string($mbox_name) && strlen($mbox_name)) - $a_mboxes = explode(',', $mbox_name); + if (!is_array($a_mboxes)) + $a_mboxes = array($a_mboxes); // let this common function do the main work return $this->_change_subscription($a_mboxes, 'unsubscribe'); @@ -2213,6 +2224,9 @@ class rcube_imap */ function remove_message_cache($key, $index) { + if (!$this->caching_enabled) + return; + $this->db->query( "DELETE FROM ".get_table_name('messages')." WHERE user_id=? @@ -2228,6 +2242,9 @@ class rcube_imap */ function clear_message_cache($key, $start_index=1) { + if (!$this->caching_enabled) + return; + $this->db->query( "DELETE FROM ".get_table_name('messages')." WHERE user_id=? @@ -2257,6 +2274,8 @@ class rcube_imap { $a = $this->_parse_address_list($input, $decode); $out = array(); + // Special chars as defined by RFC 822 need to in quoted string (or escaped). + $special_chars = '[\(\)\<\>\\\.\[\]@,;:"]'; if (!is_array($a)) return $out; @@ -2270,7 +2289,7 @@ class rcube_imap $address = $val['address']; $name = preg_replace(array('/^[\'"]/', '/[\'"]$/'), '', trim($val['name'])); if ($name && $address && $name != $address) - $string = sprintf('%s <%s>', strpos($name, ',')!==FALSE ? '"'.$name.'"' : $name, $address); + $string = sprintf('%s <%s>', preg_match("/$special_chars/", $name) ? '"'.addcslashes($name, '"').'"' : $name, $address); else if ($address) $string = $address; else if ($name) @@ -2297,7 +2316,7 @@ class rcube_imap */ function decode_header($input, $remove_quotes=FALSE) { - $str = $this->decode_mime_string((string)$input); + $str = rcube_imap::decode_mime_string((string)$input, $this->default_charset); if ($str{0}=='"' && $remove_quotes) $str = str_replace('"', '', $str); @@ -2320,6 +2339,10 @@ class rcube_imap $pos = strpos($input, '=?'); if ($pos !== false) { + // rfc: all line breaks or other characters not found in the Base64 Alphabet must be ignored by decoding software + // delete all blanks between MIME-lines, differently we can receive unnecessary blanks and broken utf-8 symbols + $input = preg_replace("/\?=\s+=\?/", '?==?', $input); + $out = substr($input, 0, $pos); $end_cs_pos = strpos($input, "?", $pos+2); @@ -2414,7 +2437,7 @@ class rcube_imap return rcube_charset_convert($body, $ctype_param['charset']); // defaults to what is specified in the class header - return rcube_charset_convert($body, 'ISO-8859-1'); + return rcube_charset_convert($body, $this->default_charset); } diff --git a/program/include/rcube_ldap.inc b/program/include/rcube_ldap.inc index 29e7faa6b..969101b2a 100644 --- a/program/include/rcube_ldap.inc +++ b/program/include/rcube_ldap.inc @@ -119,20 +119,20 @@ class rcube_ldap */ function bind($dn, $pass) { - if (!$this->conn) + if (!$this->conn) { return false; + } - if (@ldap_bind($this->conn, $dn, $pass)) + if (ldap_bind($this->conn, $dn, $pass)) { return true; - else - { - raise_error(array( + } + + raise_error(array( 'code' => ldap_errno($this->conn), 'type' => 'ldap', 'message' => "Bind failed for dn=$dn: ".ldap_error($this->conn)), - true); - } - + true); + return false; } diff --git a/program/include/rcube_mdb2.inc b/program/include/rcube_mdb2.inc index 63d156a08..72d906664 100644 --- a/program/include/rcube_mdb2.inc +++ b/program/include/rcube_mdb2.inc @@ -48,6 +48,7 @@ class rcube_mdb2 var $db_handle = 0; // Connection handle var $db_error = false; var $db_error_msg = ''; + var $debug_mode = false; var $a_query_results = array('dummy'); var $last_res_id = 0; @@ -94,8 +95,11 @@ class rcube_mdb2 function dsn_connect($dsn) { // Use persistent connections if available - $dbh = MDB2::connect($dsn, - array('persistent' => $this->db_pconn, + $dbh = MDB2::connect($dsn, array( + 'persistent' => $this->db_pconn, + 'emulate_prepared' => $this->debug_mode, + 'debug' => $this->debug_mode, + 'debug_handler' => 'mdb2_debug_handler', 'portability' => MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_EMPTY_TO_NULL)); if (MDB2::isError($dbh)) @@ -156,6 +160,21 @@ class rcube_mdb2 } + /** + * Activate/deactivate debug mode + * + * @param boolean True if SQL queries should be logged + */ + function set_debug($dbg = true) + { + $this->debug_mode = $dbg; + if ($this->db_connected) + { + $this->db_handle->setOption('debug', $dbg); + $this->db_handle->setOption('emulate_prepared', $dbg); + } + } + /** * Getter for error state @@ -413,6 +432,22 @@ class rcube_mdb2 return $this->db_handle->quoteIdentifier($str); } + /** + * Escapes a string + * + * @param string The string to be escaped + * @return string The escaped string + * @access public + * @since 0.1.1 + */ + function escapeSimple($str) + { + if (!$this->db_handle) + $this->db_connect('r'); + + return $this->db_handle->escape($str); + } + /** * Return SQL function for current time and date @@ -569,4 +604,17 @@ class rcube_mdb2 } // end class rcube_db + +/* this is our own debug handler for the MDB2 connection */ +function mdb2_debug_handler(&$db, $scope, $message, $context = array()) +{ + if ($scope != 'prepare') + { + $debug_output = $scope . '('.$db->db_index.'): '; + $debug_output .= $message . $db->getOption('log_line_break'); + write_log('sqllog', $debug_output); + } +} + + ?> diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc index bec254661..815331195 100644 --- a/program/include/rcube_shared.inc +++ b/program/include/rcube_shared.inc @@ -262,7 +262,10 @@ function send_modified_header($mdate, $etag=null) header("Etag: $etag"); if ($iscached) + { + ob_end_clean(); exit; + } } diff --git a/program/include/rcube_user.inc b/program/include/rcube_user.inc index 41b424f1d..e748758a9 100644 --- a/program/include/rcube_user.inc +++ b/program/include/rcube_user.inc @@ -361,7 +361,7 @@ class rcube_user // try to resolve user in virtusertable if (!empty($CONFIG['virtuser_file']) && !strpos($user, '@')) - $user_email = self::user2email($user); + $user_email = rcube_user::user2email($user); $DB->query( "INSERT INTO ".get_table_name('users')." @@ -468,7 +468,7 @@ class rcube_user $arr = preg_split('/\s+/', $data); if (count($arr) > 0) { - $email = trim($arr[0]); + $email = trim(str_replace('\\@', '@', $arr[0])); break; } } diff --git a/program/js/app.js b/program/js/app.js index 73c03c860..4359e5985 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -132,7 +132,7 @@ function rcube_webmail() this.message_list.addEventListener('dblclick', function(o){ p.msglist_dbl_click(o); }); this.message_list.addEventListener('keypress', function(o){ p.msglist_keypress(o); }); this.message_list.addEventListener('select', function(o){ p.msglist_select(o); }); - this.message_list.addEventListener('dragstart', function(o){ p.drag_active = true; }); + this.message_list.addEventListener('dragstart', function(o){ p.drag_active = true; if (p.preview_timer) clearTimeout(p.preview_timer); }); this.message_list.addEventListener('dragend', function(o){ p.drag_active = false; }); this.message_list.init(); @@ -202,7 +202,7 @@ function rcube_webmail() } if (this.env.messagecount) - this.enable_command('select-all', 'select-none', 'sort', 'expunge', true); + this.enable_command('select-all', 'select-none', 'expunge', true); if (this.env.messagecount && (this.env.mailbox==this.env.trash_mailbox || this.env.mailbox==this.env.junk_mailbox)) this.enable_command('purge', true); @@ -314,7 +314,7 @@ function rcube_webmail() var input_user = rcube_find_object('rcmloginuser'); var input_pass = rcube_find_object('rcmloginpwd'); if (input_user) - input_user.onkeypress = function(e){ return rcmail.login_user_keypress(e); }; + input_user.onkeyup = function(e){ return rcmail.login_user_keyup(e); }; if (input_user && input_user.value=='') input_user.focus(); else if (input_pass) @@ -712,7 +712,7 @@ function rcube_webmail() break; case 'load-attachment': - var qstring = '_mbox='+this.env.mailbox+'&_uid='+this.env.uid+'&_part='+props.part; + var qstring = '_mbox='+urlencode(this.env.mailbox)+'&_uid='+this.env.uid+'&_part='+props.part; // open attachment in frame if it's of a supported mimetype if (this.env.uid && props.mimetype && find_in_array(props.mimetype, this.mimetypes)>=0) @@ -892,7 +892,7 @@ function rcube_webmail() { setTimeout(function(){ ref.printwin.focus(); }, 20); if (this.env.action != 'show') - this.toggle_read_status('read', [uid]); + this.mark_message('read', uid); } } break; @@ -1138,7 +1138,7 @@ function rcube_webmail() } // start timer for message preview (wait for double click) - if (selected && this.env.contentframe) + if (selected && this.env.contentframe && !list.multi_selecting) this.preview_timer = setTimeout(function(){ ref.msglist_get_preview(); }, this.dblclick_time + 10); else if (this.env.contentframe) this.show_contentframe(false); @@ -1486,6 +1486,7 @@ function rcube_webmail() this.mark_message = function(flag, uid) { var a_uids = new Array(); + var r_uids = new Array(); var selection = this.message_list ? this.message_list.get_selection() : new Array(); if (uid) @@ -1496,26 +1497,35 @@ function rcube_webmail() { for (var id, n=0; n<selection.length; n++) { - id = selection[n]; - if ((flag=='read' && this.message_list.rows[id].unread) || (flag=='unread' && !this.message_list.rows[id].unread) - || (flag=='delete' && !this.message_list.rows[id].deleted) || (flag=='undelete' && this.message_list.rows[id].deleted)) - a_uids[a_uids.length] = id; + a_uids[a_uids.length] = selection[n]; } } + + for (var id, n=0; n<a_uids.length; n++) + { + id = a_uids[n]; + if ((flag=='read' && this.message_list.rows[id].unread) + || (flag=='unread' && !this.message_list.rows[id].unread) + || (flag=='delete' && !this.message_list.rows[id].deleted) + || (flag=='undelete' && this.message_list.rows[id].deleted)) + { + r_uids[r_uids.length] = id; + } + } // nothing to do - if (!a_uids.length) + if (!r_uids.length) return; switch (flag) { case 'read': case 'unread': - this.toggle_read_status(flag, a_uids); + this.toggle_read_status(flag, r_uids); break; case 'delete': case 'undelete': - this.toggle_delete_status(a_uids); + this.toggle_delete_status(r_uids); break; } }; @@ -1556,7 +1566,7 @@ function rcube_webmail() rows[uid].icon.src = icn_src; } } - + this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag='+flag); }; @@ -1564,7 +1574,7 @@ function rcube_webmail() this.toggle_delete_status = function(a_uids) { if (this.env.read_when_deleted) - this.toggle_read_status('read',a_uids); + this.mark_message('read',a_uids); // if deleting message from "view message" don't bother with delete icon if (this.env.action == "show") @@ -1671,7 +1681,7 @@ function rcube_webmail() /*********************************************************/ // handler for keyboard events on the _user field - this.login_user_keypress = function(e) + this.login_user_keyup = function(e) { var key = rcube_event.get_keycode(e); var elm; @@ -2010,7 +2020,7 @@ function rcube_webmail() // reset vars this.env.current_page = 1; this.set_busy(true, 'searching'); - this.http_request('search', '_q='+urlencode(value)+(this.env.mailbox ? '&_mbox='+this.env.mailbox : '')+(this.env.source ? '&_source='+urlencode(this.env.source) : ''), true); + this.http_request('search', '_q='+urlencode(value)+(this.env.mailbox ? '&_mbox='+urlencode(this.env.mailbox) : '')+(this.env.source ? '&_source='+urlencode(this.env.source) : ''), true); } return true; }; @@ -2681,6 +2691,10 @@ function rcube_webmail() { this.http_post('delete-folder', '_mboxes='+urlencode(folder)); this.set_env('folder', null); + + if (this.gui_objects.createfolderhint) + this.gui_objects.createfolderhint.innerHTML = ''; + } }; @@ -2816,60 +2830,18 @@ function rcube_webmail() this.subscribe_folder = function(folder) { - var form; - if ((form = this.gui_objects.editform) && form.elements['_unsubscribed']) - this.change_subscription('_unsubscribed', '_subscribed', 'subscribe'); - else if (folder) - this.http_post('subscribe', '_mboxes='+urlencode(folder)); + if (folder) + this.http_post('subscribe', '_mbox='+urlencode(folder)); }; this.unsubscribe_folder = function(folder) { - var form; - if ((form = this.gui_objects.editform) && form.elements['_subscribed']) - this.change_subscription('_subscribed', '_unsubscribed', 'unsubscribe'); - else if (folder) - this.http_post('unsubscribe', '_mboxes='+urlencode(folder)); + if (folder) + this.http_post('unsubscribe', '_mbox='+urlencode(folder)); }; - this.change_subscription = function(from, to, action) - { - var form; - if (form = this.gui_objects.editform) - { - var a_folders = new Array(); - var list_from = form.elements[from]; - - for (var i=0; list_from && i<list_from.options.length; i++) - { - if (list_from.options[i] && list_from.options[i].selected) - { - a_folders[a_folders.length] = list_from.options[i].value; - list_from[i] = null; - i--; - } - } - - // yes, we have some folders selected - if (a_folders.length) - { - var list_to = form.elements[to]; - var index; - - for (var n=0; n<a_folders.length; n++) - { - index = list_to.options.length; - list_to[index] = new Option(a_folders[n]); - } - - this.http_post(action, '_mboxes='+urlencode(a_folders.join(','))); - } - } - - }; - // helper method to find a specific mailbox row ID this.get_folder_row_id = function(folder) { @@ -3491,12 +3463,17 @@ function rcube_webmail() case 'list': if (this.env.messagecount) - this.enable_command('purge', (this.env.mailbox==this.env.trash_mailbox || this.env.mailbox==this.env.junk_mailbox)); - this.msglist_select(this.message_list); + this.enable_command('purge', (this.env.mailbox==this.env.trash_mailbox || this.env.mailbox==this.env.junk_mailbox)); + + this.msglist_select(this.message_list); + + case 'getunread': + this.enable_command('sort', (this.env.messagecount > 0)); case 'expunge': this.enable_command('select-all', 'select-none', 'expunge', this.env.messagecount ? true : false); break; + } request_obj.reset(); diff --git a/program/js/list.js b/program/js/list.js index e42d3f6b7..2b3c7a8f6 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -35,6 +35,7 @@ function rcube_list_widget(list, p) this.subject_col = -1; this.shiftkey = false; this.multiselect = false; + this.multi_selecting = false; this.draggable = false; this.keyboard = false; this.toggleselect = false; @@ -319,6 +320,7 @@ select_row: function(id, mod_key, with_mouse) { this.shift_start = id; this.highlight_row(id, false); + this.multi_selecting = false; } else { @@ -341,6 +343,7 @@ select_row: function(id, mod_key, with_mouse) this.highlight_row(id, false); break; } + this.multi_selecting = true; } // trigger event if selection changed @@ -456,6 +459,8 @@ select_all: function(filter) if (this.selection.join(',') != select_before) this.trigger_event('select'); + this.focus(); + return true; }, @@ -508,7 +513,7 @@ highlight_row: function(id, multiple) { if (this.rows[id] && !multiple) { - if (!this.in_selection(id)) + if (this.selection.length > 1 || !this.in_selection(id)) { this.clear_selection(); this.selection[0] = id; diff --git a/program/js/tiny_mce/themes/advanced/css/editor_content.css b/program/js/tiny_mce/themes/advanced/css/editor_content.css new file mode 100644 index 000000000..182e79121 --- /dev/null +++ b/program/js/tiny_mce/themes/advanced/css/editor_content.css @@ -0,0 +1,58 @@ +/* This file contains the CSS data for the editable area(iframe) of TinyMCE */
+/* You can extend this CSS by adding your own CSS file with the the content_css option */
+
+body, td, pre {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+}
+
+body {
+ background-color: #FFFFFF;
+}
+
+.mceVisualAid {
+ border: 1px dashed #BBBBBB !important;
+}
+
+div.mceVisualAid {
+ background-image:url('../images/spacer.gif');
+ visibility: visible !important;
+}
+
+.mceItemAnchor {
+ width: 12px;
+ line-height: 6px;
+ overflow: hidden;
+ padding-left: 12px;
+ background-image: url('../images/anchor_symbol.gif');
+ background-position: bottom;
+ background-repeat: no-repeat;
+}
+
+/* Important is needed in Gecko browsers inorder to style links */
+/*
+a {
+ color: green !important;
+}
+*/
+
+/* Style selection range colors in Gecko browsers */
+/*
+::-moz-selection {
+ background-color: red;
+ color: green;
+}
+*/
+
+/* MSIE specific */
+
+* html body {
+ scrollbar-3dlight-color: #F0F0EE;
+ scrollbar-arrow-color: #676662;
+ scrollbar-base-color: #F0F0EE;
+ scrollbar-darkshadow-color: #DDDDDD;
+ scrollbar-face-color: #E0E0DD;
+ scrollbar-highlight-color: #F0F0EE;
+ scrollbar-shadow-color: #F0F0EE;
+ scrollbar-track-color: #F5F5F5;
+}
diff --git a/program/lib/imap.inc b/program/lib/imap.inc index e9b46847d..96353dd2f 100644 --- a/program/lib/imap.inc +++ b/program/lib/imap.inc @@ -161,18 +161,19 @@ function iil_xor($string, $string2) { } function iil_ReadLine($fp, $size) { - $line = ''; - if ($fp) { - do { - // FIXME: hardcode size? - $buffer = fgets($fp, 2048); - if ($buffer === false) { - break; - } - $line .= $buffer; - } while ($buffer[strlen($buffer)-1]!="\n"); - } - return $line; + $line = ''; + if (!$fp) { + return $line; + } + do { + // FIXME: hardcode size? + $buffer = fgets($fp, 2048); + if ($buffer === false) { + break; + } + $line .= $buffer; + } while ($buffer[strlen($buffer)-1] != "\n"); + return $line; } function iil_MultLine($fp, $line) { @@ -192,13 +193,16 @@ function iil_MultLine($fp, $line) { } function iil_ReadBytes($fp, $bytes) { - $data = ''; - $len = 0; - do { - $data.=fread($fp, $bytes-$len); - $len = strlen($data); - } while ($len<$bytes); - return $data; + $data = ''; + $len = 0; + do { + $data .= fread($fp, $bytes-$len); + if ($len == strlen($data)) { + break; //nothing was read -> exit to avoid apache lockups + } + $len = strlen($data); + } while ($len < $bytes); + return $data; } function iil_ReadReply($fp) { @@ -1596,7 +1600,8 @@ function iil_C_FetchHeaders(&$conn, $mailbox, $message_set, $uidfetch=false) while ( list($lines_key, $str) = each($lines) ) { list($field, $string) = iil_SplitHeaderLine($str); - $field = strtolower($field); + $field = strtolower($field); + $string = ereg_replace("\n[[:space:]]*"," ",$string); switch ($field) { case 'date'; @@ -1607,22 +1612,22 @@ function iil_C_FetchHeaders(&$conn, $mailbox, $message_set, $uidfetch=false) $result[$id]->from = $string; break; case 'to': - $result[$id]->to = str_replace("\n", " ", $string); + $result[$id]->to = $string; break; case 'subject': - $result[$id]->subject = str_replace("\n", '', $string); + $result[$id]->subject = $string; break; case 'reply-to': - $result[$id]->replyto = str_replace("\n", " ", $string); + $result[$id]->replyto = $string; break; case 'cc': - $result[$id]->cc = str_replace("\n", " ", $string); + $result[$id]->cc = $string; break; case 'bcc': - $result[$id]->bcc = str_replace("\n", " ", $string); + $result[$id]->bcc = $string; break; case 'content-transfer-encoding': - $result[$id]->encoding = str_replace("\n", " ", $string); + $result[$id]->encoding = $string; break; case 'content-type': $ctype_parts = explode(";", $string); @@ -1643,7 +1648,7 @@ function iil_C_FetchHeaders(&$conn, $mailbox, $message_set, $uidfetch=false) case 'return-receipt-to': case 'disposition-notification-to': case 'x-confirm-reading-to': - $result[$id]->mdn_to = str_replace("\n", " ", $string); + $result[$id]->mdn_to = $string; break; case 'message-id': $result[$id]->messageID = $string; @@ -2448,7 +2453,6 @@ function iil_C_Append(&$conn, $folder, &$message) { if (fputs($fp, $request)) { $line=iil_ReadLine($fp, 100); $sent = fwrite($fp, $message."\r\n"); - flush(); do { $line=iil_ReadLine($fp, 1000); } while ($line[0] != 'A'); diff --git a/program/localization/en_GB/labels.inc b/program/localization/en_GB/labels.inc index 24622d00e..3761cc6d3 100644 --- a/program/localization/en_GB/labels.inc +++ b/program/localization/en_GB/labels.inc @@ -167,7 +167,7 @@ $labels['language'] = 'Language'; $labels['timezone'] = 'Time zone'; $labels['pagesize'] = 'Rows per page'; $labels['signature'] = 'Signature'; -$labels['dstactive'] = 'Daylight savings'; +$labels['dstactive'] = 'Summer time'; $labels['htmleditor'] = 'Compose HTML messages'; $labels['htmlsignature'] = 'HTML signature'; $labels['previewpane'] = 'Show preview pane'; @@ -189,4 +189,4 @@ $labels['sortby'] = 'Sort by'; $labels['sortasc'] = 'Sort ascending'; $labels['sortdesc'] = 'Sort descending'; -?>
\ No newline at end of file +?> diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc index 9a9c8410c..823fb2ab5 100644 --- a/program/localization/en_US/labels.inc +++ b/program/localization/en_US/labels.inc @@ -218,7 +218,7 @@ $labels['language'] = 'Language'; $labels['timezone'] = 'Time zone'; $labels['pagesize'] = 'Rows per page'; $labels['signature'] = 'Signature'; -$labels['dstactive'] = 'Daylight savings'; +$labels['dstactive'] = 'Daylight saving time'; $labels['htmleditor'] = 'Compose HTML messages'; $labels['htmlsignature'] = 'HTML signature'; $labels['previewpane'] = 'Show preview pane'; @@ -243,4 +243,4 @@ $labels['sortby'] = 'Sort by'; $labels['sortasc'] = 'Sort ascending'; $labels['sortdesc'] = 'Sort descending'; -?>
\ No newline at end of file +?> diff --git a/program/localization/fi/labels.inc b/program/localization/fi/labels.inc index b46eddb88..1abeffa87 100644 --- a/program/localization/fi/labels.inc +++ b/program/localization/fi/labels.inc @@ -47,7 +47,7 @@ $labels['reply-to'] = 'Vastaus osoitteeseen'; $labels['mailboxlist'] = 'Kansiot'; $labels['messagesfromto'] = 'Viestit $from-$to/$count'; $labels['messagenrof'] = 'Viesti $nr/$count'; -$labels['moveto'] = 'siirrä...'; +$labels['moveto'] = 'siirrä kansioon...'; $labels['download'] = 'lataa'; $labels['filename'] = 'Tiedoston nimi'; $labels['filesize'] = 'Tiedoston koko'; @@ -96,7 +96,7 @@ $labels['all'] = 'Kaikki'; $labels['none'] = 'Ei mitään'; $labels['unread'] = 'Lukemattomat'; $labels['compact'] = 'Tiivistä'; -$labels['empty'] = 'Empty'; +$labels['empty'] = 'Tyhjennä'; $labels['purge'] = 'Puhdista'; $labels['quota'] = 'Levytila'; $labels['unknown'] = 'tuntematon'; @@ -187,7 +187,7 @@ $labels['renamefolder'] = 'Nimeä kansio uudelleen'; $labels['deletefolder'] = 'Poista kansio'; $labels['managefolders'] = 'Kansioiden ylläpito'; $labels['sortby'] = 'Järjestä'; -$labels['sortasc'] = 'Järjestä nousevasti'; -$labels['sortdesc'] = 'Järjestä laskevasti'; +$labels['sortasc'] = 'Järjestä nousevasti (a-ö)'; +$labels['sortdesc'] = 'Järjestä laskevasti (ö-a)'; ?>
\ No newline at end of file diff --git a/program/localization/fr/labels.inc b/program/localization/fr/labels.inc index 3c89d86ee..01bc6f0bc 100644 --- a/program/localization/fr/labels.inc +++ b/program/localization/fr/labels.inc @@ -10,9 +10,8 @@ | Licensed under the GNU GPL | | | +-----------------------------------------------------------------------+ - | Author: aldweb <info@aldweb.com> | - | Pierre HAEGELI <pierre@haegeli.net> | - | Mickaël Wolff <rcw@lupusmic.org> | + | Author: Joel S. <joel.s@spijoprod.net> | + | Jerome Lipowicz <jerome@yayel.com> | +-----------------------------------------------------------------------+ @version $Id$ @@ -90,8 +89,8 @@ $labels['lastmessages'] = 'Voir la dernière page de messages'; $labels['backtolist'] = 'Retourner à la liste des messages'; $labels['viewsource'] = 'Voir le source'; $labels['markmessages'] = 'Marquer les messages'; -$labels['markread'] = 'comme lus'; -$labels['markunread'] = 'comme non lus'; +$labels['markread'] = 'Comme lus'; +$labels['markunread'] = 'Comme non lus'; $labels['select'] = 'Sélectionner'; $labels['all'] = 'Tous'; $labels['none'] = 'Aucun'; @@ -191,4 +190,4 @@ $labels['sortby'] = 'Trier par'; $labels['sortasc'] = 'Tri ascendant'; $labels['sortdesc'] = 'Tri descendant'; -?>
\ No newline at end of file +?> diff --git a/program/localization/fr/messages.inc b/program/localization/fr/messages.inc index fcd59fcfc..d91e09373 100644 --- a/program/localization/fr/messages.inc +++ b/program/localization/fr/messages.inc @@ -10,9 +10,8 @@ | Licensed under the GNU GPL | | | +-----------------------------------------------------------------------+ - | Author: aldweb <info@aldweb.com> | - | Pierre HAEGELI <pierre@haegeli.net> | - | Mickaël Wolff <rcw@lupusmic.org> | + | Author: Joel S. <joel.s@spijoprod.net> | + | Jerome Lipowicz <jerome@yayel.com> | +-----------------------------------------------------------------------+ @version $Id$ diff --git a/program/localization/ge/labels.inc b/program/localization/ge/labels.inc index 75ccc1df9..6d3722319 100755 --- a/program/localization/ge/labels.inc +++ b/program/localization/ge/labels.inc @@ -18,59 +18,42 @@ */ $labels = array(); - -// login page -$labels['welcome'] = 'მოგესალმებათ $product'; -$labels['username'] = 'მომხმარებელი'; -$labels['password'] = 'პაროლი'; -$labels['server'] = 'სერვერი'; -$labels['login'] = 'შესვლა'; - -// taskbar -$labels['logout'] = 'გამოსვლა'; -$labels['mail'] = 'ელ–ფოსტა'; +$labels['welcome'] = 'მოგესალმებათ $product'; +$labels['username'] = 'მომხმარებელი'; +$labels['password'] = 'პაროლი'; +$labels['server'] = 'სერვერი'; +$labels['login'] = 'შესვლა'; +$labels['logout'] = 'გამოსვლა'; +$labels['mail'] = 'ელ–ფოსტა'; $labels['settings'] = 'პარამეტრები'; $labels['addressbook'] = 'მისამართები'; - -// mailbox names -$labels['inbox'] = 'მიღებული'; +$labels['inbox'] = 'მიღებული'; $labels['drafts'] = 'დროებითი'; -$labels['sent'] = 'გაგზავნილები'; -$labels['trash'] = 'წაშლილები'; -$labels['junk'] = 'სპამი'; - -// message listing +$labels['sent'] = 'გაგზავნილები'; +$labels['trash'] = 'წაშლილები'; +$labels['junk'] = 'სპამი'; $labels['subject'] = 'სათაური'; -$labels['from'] = 'გამგზავნი'; -$labels['to'] = 'მიმღები'; -$labels['cc'] = 'კოპია'; -$labels['bcc'] = 'ფარული'; +$labels['from'] = 'გამგზავნი'; +$labels['to'] = 'მიმღები'; +$labels['cc'] = 'კოპია'; +$labels['bcc'] = 'ფარული'; $labels['replyto'] = 'დაბრუნება'; -$labels['date'] = 'თარიღი'; -$labels['size'] = 'ზომა'; +$labels['date'] = 'თარიღი'; +$labels['size'] = 'ზომა'; $labels['priority'] = 'პრიორიტეტი'; $labels['organization'] = 'ორგანიზაცია'; - -// aliases -$labels['reply-to'] = $labels['replyto']; - +$labels['reply-to'] = 'დაბრუნება'; $labels['mailboxlist'] = 'საქაღალდეები'; $labels['messagesfromto'] = 'შეტყობინება $from $to დან $count'; $labels['messagenrof'] = 'შეტყობინება $nr დან $count'; - -$labels['moveto'] = 'გადატანა...'; +$labels['moveto'] = 'გადატანა...'; $labels['download'] = 'გადმოწერა'; - $labels['filename'] = 'ფაილის სახელი'; $labels['filesize'] = 'ფაილის ზომა'; - $labels['preferhtml'] = 'როგორც HTML'; $labels['htmlmessage'] = 'HTML შეტყობინება'; $labels['prettydate'] = 'კარგი თარიღები'; - $labels['addtoaddressbook'] = 'მისამართებში დამატება'; - -// weekdays short $labels['sun'] = 'კვ'; $labels['mon'] = 'ორ'; $labels['tue'] = 'სამ'; @@ -78,160 +61,132 @@ $labels['wed'] = 'ოთხ'; $labels['thu'] = 'ხუთ'; $labels['fri'] = 'პარ'; $labels['sat'] = 'შაბ'; - -// weekdays long -$labels['sunday'] = 'კვირა'; -$labels['monday'] = 'ორშაბათი'; -$labels['tuesday'] = 'სამშაბათი'; +$labels['sunday'] = 'კვირა'; +$labels['monday'] = 'ორშაბათი'; +$labels['tuesday'] = 'სამშაბათი'; $labels['wednesday'] = 'ოთხშაბათი'; -$labels['thursday'] = 'ხუთშაბათი'; -$labels['friday'] = 'პარასკევი'; -$labels['saturday'] = 'შაბათი'; - +$labels['thursday'] = 'ხუთშაბათი'; +$labels['friday'] = 'პარასკევი'; +$labels['saturday'] = 'შაბათი'; $labels['today'] = 'დღეს'; - -// toolbar buttons -$labels['checkmail'] = 'შემოწმება ახალ შეტყობინებაზე'; -$labels['writenewmessage'] = 'ახალი შეტყობინება'; -$labels['replytomessage'] = 'პასუხი'; +$labels['checkmail'] = 'შემოწმება ახალ შეტყობინებაზე'; +$labels['writenewmessage'] = 'ახალი შეტყობინება'; +$labels['replytomessage'] = 'პასუხი'; $labels['replytoallmessage'] = 'პასუხი ყველას'; -$labels['forwardmessage'] = 'გადაგზავნა'; -$labels['deletemessage'] = 'წაშლა'; +$labels['forwardmessage'] = 'გადაგზავნა'; +$labels['deletemessage'] = 'წაშლა'; $labels['movemessagetotrash'] = 'შეტყობინების წაშლილებში გადატანა'; -$labels['printmessage'] = 'შეტყობინების ამობეჭვდა'; -$labels['previousmessage'] = 'წინა შეტყობინების ნახვა'; +$labels['printmessage'] = 'შეტყობინების ამობეჭვდა'; +$labels['previousmessage'] = 'წინა შეტყობინების ნახვა'; $labels['previousmessages'] = 'წინა შეტყობინებების ნახვა'; -$labels['firstmessage'] = 'პირველი შეტყობინების ნახვა'; -$labels['firstmessages'] = 'პრველი შეტყობინებები'; -$labels['nextmessage'] = 'შემდეგი შეტყობინების ნახვა'; -$labels['nextmessages'] = 'შემდეგი შეტყობინებების ნახვა'; -$labels['lastmessage'] = 'ბოლო შეტყობინების ნახვა'; -$labels['lastmessages'] = 'ბოლო შეტყობინებების ნახვა'; -$labels['backtolist'] = 'უკან ჩამონათვალში'; -$labels['viewsource'] = 'შიგთავსი'; - +$labels['firstmessage'] = 'პირველი შეტყობინების ნახვა'; +$labels['firstmessages'] = 'პრველი შეტყობინებები'; +$labels['nextmessage'] = 'შემდეგი შეტყობინების ნახვა'; +$labels['nextmessages'] = 'შემდეგი შეტყობინებების ნახვა'; +$labels['lastmessage'] = 'ბოლო შეტყობინების ნახვა'; +$labels['lastmessages'] = 'ბოლო შეტყობინებების ნახვა'; +$labels['backtolist'] = 'უკან ჩამონათვალში'; +$labels['viewsource'] = 'შიგთავსი'; +$labels['markmessages'] = 'მონიშნეთ შეტყობინებები'; +$labels['markread'] = 'როგორც წაკითხული'; +$labels['markunread'] = 'როგორც წაუკითხავი'; $labels['select'] = 'მონიშვნა'; $labels['all'] = 'ყველა'; $labels['none'] = 'არცერთი'; $labels['unread'] = 'წაუკითხავი'; - $labels['compact'] = 'შეკუმშვა'; $labels['empty'] = 'გაცარიელება'; $labels['purge'] = 'გასუფთავება'; - $labels['quota'] = 'შეზღუდვა'; -$labels['unknown'] = 'უცნობი'; -$labels['unlimited'] = 'შეუზღუდავი'; - -$labels['quicksearch'] = 'სწრაფი ძიება'; -$labels['resetsearch'] = 'ძიების გასუფთავება'; - - -// message compose -$labels['compose'] = 'შეტყობინების დაწერა'; -$labels['sendmessage'] = 'შეტყობინების გაგზავნა'; -$labels['savemessage'] = 'დროებით შენახვა'; -$labels['addattachment'] = 'ფაილის ატვირთვა'; -$labels['charset'] = 'კოდირება'; -$labels['editortype'] = 'რედაქტორი'; -$labels['returnreceipt'] = 'პასუხის მოთხოვნა'; - +$labels['unknown'] = 'უცნობი'; +$labels['unlimited'] = 'შეუზღუდავი'; +$labels['quicksearch'] = 'სწრაფი ძიება'; +$labels['resetsearch'] = 'ძიების გასუფთავება'; +$labels['compose'] = 'შეტყობინების დაწერა'; +$labels['savemessage'] = 'დროებით შენახვა'; +$labels['sendmessage'] = 'შეტყობინების გაგზავნა'; +$labels['addattachment'] = 'ფაილის ატვირთვა'; +$labels['charset'] = 'კოდირება'; +$labels['editortype'] = 'რედაქტორი'; +$labels['returnreceipt'] = 'პასუხის მოთხოვნა'; $labels['checkspelling'] = 'ორთოგრაფიული შემოწმება'; $labels['resumeediting'] = 'რედაქტირების გაგრძელება'; -$labels['revertto'] = 'გაუქმება'; - +$labels['revertto'] = 'გაუქმება'; $labels['attachments'] = 'გზავნილები'; $labels['upload'] = 'ატვირთვა'; -$labels['close'] = 'დახურვა'; - -$labels['low'] = 'დაბალი'; -$labels['lowest'] = 'უდაბლესი'; -$labels['normal'] = 'საშუალო'; -$labels['high'] = 'მაღალი'; +$labels['close'] = 'დახურვა'; +$labels['low'] = 'დაბალი'; +$labels['lowest'] = 'უდაბლესი'; +$labels['normal'] = 'საშუალო'; +$labels['high'] = 'მაღალი'; $labels['highest'] = 'უმაღლესი'; - -$labels['nosubject'] = '(უსათაურო)'; +$labels['nosubject'] = '(უსათაურო)'; $labels['showimages'] = 'გამოსახულების ჩვენება'; - $labels['htmltoggle'] = 'HTML'; $labels['plaintoggle'] = 'ტექსტური'; - $labels['addcc'] = 'დაამატე კოპიო'; $labels['addbcc'] = 'დაამატე ფარული კოპიო'; $labels['addreplyto'] = 'დაამატე გამომგზავნი'; - - -// address boook -$labels['name'] = 'სრული სახელი'; +$labels['mdnrequest'] = 'გამომგზავნს სურს შეიტყოს წერილის მიღება. გსურთ შეატყობინოთ გამომგზავნს?'; +$labels['receiptread'] = 'გზავნილის დაბრუნება'; +$labels['yourmessage'] = 'ეს არის მიღების დასტური თქვენს შეტყობინებაზე'; +$labels['receiptnote'] = 'განმარტება: ეს ნიშნავს რომ ადრესატმა მიიღო შეტყობინება. მაგრამ, არ ნიშნავს რომ წაიკითხა ან გაიგო ტექსტი'; +$labels['name'] = 'სრული სახელი'; $labels['firstname'] = 'სახელი'; -$labels['surname'] = 'გვარი'; -$labels['email'] = 'ელ–ფოსტა'; - +$labels['surname'] = 'გვარი'; +$labels['email'] = 'ელ–ფოსტა'; $labels['addcontact'] = 'კონტაქტებში დამატება'; $labels['editcontact'] = 'კონტაქტის რედაქტირება'; - -$labels['edit'] = 'რედაქტირება'; +$labels['edit'] = 'რედაქტირება'; $labels['cancel'] = 'გაუქმება'; -$labels['save'] = 'შენახვა'; +$labels['save'] = 'შენახვა'; $labels['delete'] = 'წაშლა'; - -$labels['newcontact'] = 'კონტაქტის შექმნა'; -$labels['deletecontact'] = 'მონიშნელი კონტაქტის წაშლა'; -$labels['composeto'] = 'ფოსტის გაგზავნა შერჩეულ ადრესატებთან'; +$labels['newcontact'] = 'კონტაქტის შექმნა'; +$labels['deletecontact'] = 'მონიშნელი კონტაქტის წაშლა'; +$labels['composeto'] = 'ფოსტის გაგზავნა შერჩეულ ადრესატებთან'; $labels['contactsfromto'] = 'კონტაქტები $from დან $to ში $count'; -$labels['print'] = 'დაბეჭვდა'; -$labels['export'] = 'ექსპორტი'; - -$labels['previouspage'] = 'წინას ჩვენება'; -$labels['firstpage'] = 'პირველის ჩვენება'; -$labels['nextpage'] = 'შემდეგის ჩვენება'; -$labels['lastpage'] = 'ბოლოს ჩვენება'; - +$labels['print'] = 'დაბეჭვდა'; +$labels['export'] = 'ექსპორტი'; +$labels['previouspage'] = 'წინას ჩვენება'; +$labels['firstpage'] = 'პირველის ჩვენება'; +$labels['nextpage'] = 'შემდეგის ჩვენება'; +$labels['lastpage'] = 'ბოლოს ჩვენება'; $labels['groups'] = 'ჯგუფები'; $labels['personaladrbook'] = 'პერსონალური მისამართები'; - - -// settings -$labels['settingsfor'] = 'პარამეტრები'; - -$labels['preferences'] = 'პარამეტრები'; -$labels['userpreferences'] = 'მომხმარებლის პარამეტრები'; -$labels['editpreferences'] = 'მომხმარებლის პარამეტრების რედაქტირება'; - -$labels['identities'] = 'პროფილები'; -$labels['manageidentities'] = 'პროფილების მართვა'; -$labels['newidentity'] = 'ახალი პროფილი'; - -$labels['newitem'] = 'ახალი'; -$labels['edititem'] = 'რედაქტირება'; - -$labels['setdefault'] = 'როგორც ზოგაგად'; -$labels['language'] = 'ენა'; -$labels['timezone'] = 'დროითი ზონა'; -$labels['pagesize'] = 'სტრიქონი გვერდზე'; +$labels['settingsfor'] = 'პარამეტრები'; +$labels['preferences'] = 'პარამეტრები'; +$labels['userpreferences'] = 'მომხმარებლის პარამეტრები'; +$labels['editpreferences'] = 'მომხმარებლის პარამეტრების რედაქტირება'; +$labels['identities'] = 'პროფილები'; +$labels['manageidentities'] = 'პროფილების მართვა'; +$labels['newidentity'] = 'ახალი პროფილი'; +$labels['newitem'] = 'ახალი'; +$labels['edititem'] = 'რედაქტირება'; +$labels['setdefault'] = 'როგორც ზოგაგად'; +$labels['language'] = 'ენა'; +$labels['timezone'] = 'დროითი ზონა'; +$labels['pagesize'] = 'სტრიქონი გვერდზე'; $labels['signature'] = 'ხელმოწერა'; -$labels['dstactive'] = 'დროის გადაყვანა'; +$labels['dstactive'] = 'დროის გადაყვანა'; $labels['htmleditor'] = 'შეტყობინების შექმნა HTML –ში'; $labels['htmlsignature'] = 'HTML ხელმოწერა'; $labels['previewpane'] = 'ჩვენება'; - -$labels['autosavedraft'] = 'ავტომატური შენახვა'; -$labels['everynminutes'] = 'ყოველ $n წუთში'; -$labels['never'] = 'არასდროს'; - -$labels['folder'] = 'საქაღალდე'; -$labels['folders'] = 'საქაღალდეები'; -$labels['foldername'] = 'საქაღალდის დასახელება'; -$labels['subscribed'] = 'გამოცერილია'; -$labels['create'] = 'შექმნა'; -$labels['createfolder'] = 'საქაღალდის შექმნა'; +$labels['autosavedraft'] = 'ავტომატური შენახვა'; +$labels['everynminutes'] = 'ყოველ $n წუთში'; +$labels['never'] = 'არასდროს'; +$labels['folder'] = 'საქაღალდე'; +$labels['folders'] = 'საქაღალდეები'; +$labels['foldername'] = 'საქაღალდის დასახელება'; +$labels['subscribed'] = 'გამოცერილია'; +$labels['messagecount'] = 'შეტყობინებები'; +$labels['create'] = 'შექმნა'; +$labels['createfolder'] = 'საქაღალდის შექმნა'; $labels['rename'] = 'სახელის გადარქმევა'; $labels['renamefolder'] = 'სახელის გადარქმევა საქაღალდისთვის'; -$labels['deletefolder'] = 'საქაღალდის წაშლა'; -$labels['managefolders'] = 'საქაღალდეების მართვა'; - +$labels['deletefolder'] = 'საქაღალდის წაშლა'; +$labels['managefolders'] = 'საქაღალდეების მართვა'; $labels['sortby'] = 'დალაგება'; -$labels['sortasc'] = 'დალაგება ზრდადობით'; +$labels['sortasc'] = 'დალაგება ზრდადობით'; $labels['sortdesc'] = 'დალაგება კლებადობით'; ?> diff --git a/program/localization/ge/messages.inc b/program/localization/ge/messages.inc index c45574246..d2c29ca21 100755 --- a/program/localization/ge/messages.inc +++ b/program/localization/ge/messages.inc @@ -18,7 +18,7 @@ */ $messages = array(); -$messages['loginfailed'] = 'შესვლა შეუძლებელია'; +$messages['loginfailed'] = 'შესვლა შეუძლებელია'; $messages['cookiesdisabled'] = 'თქვენი ბროუზერი კუკიებს არ პასუხობს'; $messages['sessionerror'] = 'თქვენი სესია არის მცდარი ან ვადაგასული'; $messages['imaperror'] = 'IMAP სერვერთან დაკავშირება შეუძლებელია'; @@ -43,16 +43,16 @@ $messages['sendingfailed'] = 'შეტყობინება ვერ გა $messages['errorsaving'] = 'შენახვის დროს მოხდა შეცდომა'; $messages['errormoving'] = 'შეტყობინების გადატანა შეუძლებელია'; $messages['errordeleting'] = 'შეტყობინების წაშლა შეუძლებელია'; -$messages['deletecontactconfirm'] = 'ნამდვილად გსურთ მონიშნული კონტაქტების წაშლა?'; +$messages['deletecontactconfirm'] = 'ნამდვილად გსურთ მონიშნული კონტაქტების წაშლა?'; $messages['deletemessagesconfirm'] = 'ნამდვილად გსურთ მონიშნული შეტყობინებების წაშლა?'; -$messages['deletefolderconfirm'] = 'ნამდვილად გსურთ ამ საქაღალდის წაშლა?'; -$messages['purgefolderconfirm'] = 'ნამდვილად გსურთ ყველა შეტყობინების წაშლა აღნიშნულ საქაღალდეში?'; +$messages['deletefolderconfirm'] = 'ნამდვილად გსურთ ამ საქაღალდის წაშლა?'; +$messages['purgefolderconfirm'] = 'ნამდვილად გსურთ ყველა შეტყობინების წაშლა აღნიშნულ საქაღალდეში?'; $messages['formincomplete'] = 'ყველა ველი არ არის შევსებული'; $messages['noemailwarning'] = 'მიუთითეთ სწორი ელ–ფოსტის მისამართი'; -$messages['nonamewarning'] = 'მიუთითეთ სახელი'; +$messages['nonamewarning'] = 'მიუთითეთ სახელი'; $messages['nopagesizewarning'] = 'მიუთითეთ ფურცლის ზომა'; $messages['norecipientwarning'] = 'მიუთითეთ მიმღები'; -$messages['nosubjectwarning'] = 'გსურთ თუ არა შეტყობინების გაგზავნა უსათაუროდ?'; +$messages['nosubjectwarning'] = 'გსურთ თუ არა შეტყობინების გაგზავნა უსათაუროდ?'; $messages['nobodywarning'] = 'გსურთ თუ არა შეტყობინების გაგზავნა უტექსტოდ?'; $messages['notsentwarning'] = 'შეტყობინება ვერ იქნა გაგზავნილი. გსურთ თუ არა გზავნილის გაუქმება?'; $messages['noldapserver'] = 'მიუთითეთ LDAP სერვერი ძიებისთვის'; @@ -74,5 +74,9 @@ $messages['copyerror'] = 'ვერცერთი მისამართი $messages['sourceisreadonly'] = 'აღნიშნული მისამართის მხოლოდ წაკითხვაა შესაძლებელი'; $messages['errorsavingcontact'] = 'საკონტაქტო მისამართის შენახვა შეუძლებელია'; $messages['movingmessage'] = 'შეტყობინების გადატანა...'; +$messages['receiptsent'] = 'წარმატებით გაიგზავნა'; +$messages['errorsendingreceipt'] = 'არ გაიგზავნა'; +$messages['nodeletelastidentity'] = 'წაშლა შეუძლებელია, ის თქვენთვის ერთადერთია'; +$messages['addsubfolderhint'] = 'საქაღალდე შეიქმნება როგორც ქვესაქაღალდე მონიშნულ საქაღალდეში'; ?> diff --git a/program/localization/hu/messages.inc b/program/localization/hu/messages.inc index 1af1cd5f5..d1154b85e 100644 --- a/program/localization/hu/messages.inc +++ b/program/localization/hu/messages.inc @@ -11,7 +11,7 @@ | | +-----------------------------------------------------------------------+ | Author: Levente Farkas <lfarkas at lfarkas dot org> | - | Ervin Hegeds <airween@damson.hu> | + | Ervin Hegedüs <airween@damson.hu> | +-----------------------------------------------------------------------+ @version $Id$ @@ -19,65 +19,65 @@ */ $messages = array(); -$messages['loginfailed'] = 'Sikertelen belps'; -$messages['cookiesdisabled'] = 'A bngsz nem tmogatja a stik hasznlatt'; -$messages['sessionerror'] = 'rvnytelen vagy lejrt munkamenet'; -$messages['imaperror'] = 'Nem sikerlt a kapcsolds az IMAP szerverhez'; -$messages['nomessagesfound'] = 'A fik nem tartalmaz leveleket'; -$messages['loggedout'] = 'Sikeres kijelentkezs. Viszont ltsra!'; -$messages['mailboxempty'] = 'A fik res'; -$messages['loading'] = 'Betlts...'; -$messages['loadingdata'] = 'Az adatok betltse...'; -$messages['checkingmail'] = 'j zenetek keresse...'; -$messages['sendingmessage'] = 'Az zenet kldse...'; -$messages['messagesent'] = 'Az zenet elkldve'; -$messages['savingmessage'] = 'Az zenet mentse...'; -$messages['messagesaved'] = 'Az zenet elmentve a Sablonokhoz'; -$messages['successfullysaved'] = 'A ments sikerlt'; -$messages['addedsuccessfully'] = 'A cm hozzadsa a cmjegyzkhez megtrtnt'; -$messages['contactexists'] = 'A kapcsolat mr ltezik ezzel az e-mail cmmel'; -$messages['blockedimages'] = 'Biztonsgi okokbl a tvoli kpek letltse tiltott.'; -$messages['encryptedmessage'] = 'Az zenet titkostott, emiatt nem tudom megjelenteni.'; +$messages['loginfailed'] = 'Sikertelen belépés'; +$messages['cookiesdisabled'] = 'A böngésző nem támogatja a sütik használatát'; +$messages['sessionerror'] = 'Érvénytelen vagy lejárt munkamenet'; +$messages['imaperror'] = 'Nem sikerült a kapcsolódás az IMAP szerverhez'; +$messages['nomessagesfound'] = 'A fiók nem tartalmaz leveleket'; +$messages['loggedout'] = 'Sikeres kijelentkezés. Viszont látásra!'; +$messages['mailboxempty'] = 'A fiók üres'; +$messages['loading'] = 'Betöltés...'; +$messages['loadingdata'] = 'Az adatok betöltése...'; +$messages['checkingmail'] = 'Új üzenetek keresése...'; +$messages['sendingmessage'] = 'Az üzenet küldése...'; +$messages['messagesent'] = 'Az üzenet elküldve'; +$messages['savingmessage'] = 'Az üzenet mentése...'; +$messages['messagesaved'] = 'Az üzenet elmentve a Sablonokhoz'; +$messages['successfullysaved'] = 'A mentés sikerült'; +$messages['addedsuccessfully'] = 'A cím hozzáadása a címjegyzékhez megtörtént'; +$messages['contactexists'] = 'A kapcsolat már létezik ezzel az e-mail címmel'; +$messages['blockedimages'] = 'Biztonsági okokból a távoli képek letöltése tiltott.'; +$messages['encryptedmessage'] = 'Az üzenet titkosított, emiatt nem tudom megjeleníteni.'; $messages['nocontactsfound'] = 'Nincs kapcsolat'; -$messages['contactnotfound'] = 'A kivlasztott kapcsolat nem tallhat'; -$messages['sendingfailed'] = 'Az zenet elkldse nem sikerlt'; -$messages['errorsaving'] = 'A ments sorn hiba lpett fel'; -$messages['errormoving'] = 'Az zenetet nem sikerlt thelyezni'; -$messages['errordeleting'] = 'Az zenetet nem sikerlt trlni'; -$messages['deletecontactconfirm'] = 'Biztos, hogy trlni szeretnd a kijellt cme(ke)t?'; -$messages['deletemessagesconfirm'] = 'Biztos, hogy trlni szeretnd a kijellt zenete(ke)t?'; -$messages['deletefolderconfirm'] = 'Biztos, hogy trlni szeretnd ezt a mappt?'; -$messages['purgefolderconfirm'] = 'Biztos vagy benne, hogy az sszes zenet trlhet?'; -$messages['formincomplete'] = 'Az rlap hinyosan lett kitltve'; -$messages['noemailwarning'] = 'Adj meg egy vals e-mail cmet'; +$messages['contactnotfound'] = 'A kiválasztott kapcsolat nem található'; +$messages['sendingfailed'] = 'Az üzenet elküldése nem sikerült'; +$messages['errorsaving'] = 'A mentés során hiba lépett fel'; +$messages['errormoving'] = 'Az üzenetet nem sikerült áthelyezni'; +$messages['errordeleting'] = 'Az üzenetet nem sikerült törölni'; +$messages['deletecontactconfirm'] = 'Biztos, hogy törölni szeretnéd a kijelölt címe(ke)t?'; +$messages['deletemessagesconfirm'] = 'Biztos, hogy törölni szeretnéd a kijelölt üzenete(ke)t?'; +$messages['deletefolderconfirm'] = 'Biztos, hogy törölni szeretnéd ezt a mappát?'; +$messages['purgefolderconfirm'] = 'Biztos vagy benne, hogy az összes üzenet törölhető?'; +$messages['formincomplete'] = 'Az űrlap hiányosan lett kitöltve'; +$messages['noemailwarning'] = 'Adj meg egy valós e-mail címet'; $messages['nonamewarning'] = 'Adj meg egy nevet'; -$messages['nopagesizewarning'] = 'Add meg a papr mrett'; -$messages['norecipientwarning'] = 'Legalbb egy cmzettet adj meg'; -$messages['nosubjectwarning'] = 'A "Trgy" mez res. Szeretnd most kitlteni?'; -$messages['nobodywarning'] = 'Elkldd az zenetet trgy nlkl?'; -$messages['notsentwarning'] = 'Az zenet mg nem kldtem el. Eldobod az zenetet?'; -$messages['noldapserver'] = 'Adj meg egy LDAP szervert a keresshez'; -$messages['nocontactsreturned'] = 'Nem talltam kapcsolatot'; -$messages['nosearchname'] = 'Add meg a kapcsolat nevt vagy e-mail cmt'; -$messages['searchsuccessful'] = '$nr zenetet talltam'; -$messages['searchnomatch'] = 'Nincs tallat'; -$messages['searching'] = 'Keress...'; -$messages['checking'] = 'Ellenrzs...'; -$messages['nospellerrors'] = 'Nem talltam helyesrsi hibt'; -$messages['folderdeleted'] = 'A mappa sikeresen trlve'; -$messages['deletedsuccessfully'] = 'Trlve'; -$messages['converting'] = 'Formzs eltvoltsa az zenetbl...'; -$messages['messageopenerror'] = 'Nem tudom letlteni a leveleket a szerverrl'; -$messages['fileuploaderror'] = 'Feltlts sikertelen'; -$messages['filesizeerror'] = 'A feltlttt file mrete meghaladja a maximlis mretet $size'; -$messages['copysuccess'] = 'Sikeresen msoltunk $nr cmet'; -$messages['copyerror'] = 'Nem tudtunk msolni egyetlen cmet sem'; -$messages['sourceisreadonly'] = 'Ez a cmforrs csak olvashat'; -$messages['errorsavingcontact'] = 'Nem tudtuk menteni a kapcsolat cmt'; -$messages['movingmessage'] = 'zenet mozgatsa...'; -$messages['receiptsent'] = 'Az Olvassi rtestst elkldtk'; -$messages['errorsendingreceipt'] = 'Az Olvassi rtestst nem sikerlt elkldeni'; -$messages['nodeletelastidentity'] = 'Nem trlheti ezt a profilt, ez az egyetlen'; -$messages['addsubfolderhint'] = 'Az j knyvtrat az aktulisan kivlasztott alknyvtraknt fogjuk ltrehozni'; +$messages['nopagesizewarning'] = 'Add meg a papír méretét'; +$messages['norecipientwarning'] = 'Legalább egy címzettet adj meg'; +$messages['nosubjectwarning'] = 'A "Tárgy" mező üres. Szeretnéd most kitölteni?'; +$messages['nobodywarning'] = 'Elküldöd az üzenetet tárgy nélkül?'; +$messages['notsentwarning'] = 'Az üzenet még nem küldtem el. Eldobod az üzenetet?'; +$messages['noldapserver'] = 'Adj meg egy LDAP szervert a kereséshez'; +$messages['nocontactsreturned'] = 'Nem találtam kapcsolatot'; +$messages['nosearchname'] = 'Add meg a kapcsolat nevét vagy e-mail címét'; +$messages['searchsuccessful'] = '$nr üzenetet találtam'; +$messages['searchnomatch'] = 'Nincs találat'; +$messages['searching'] = 'Keresés...'; +$messages['checking'] = 'Ellenőrzés...'; +$messages['nospellerrors'] = 'Nem találtam helyesírási hibát'; +$messages['folderdeleted'] = 'A mappa sikeresen törölve'; +$messages['deletedsuccessfully'] = 'Törölve'; +$messages['converting'] = 'Formázás eltávolítása az üzenetből...'; +$messages['messageopenerror'] = 'Nem tudom letölteni a leveleket a szerverről'; +$messages['fileuploaderror'] = 'Feltöltés sikertelen'; +$messages['filesizeerror'] = 'A feltöltött file mérete meghaladja a maximális méretet $size'; +$messages['copysuccess'] = 'Sikeresen másoltunk $nr címet'; +$messages['copyerror'] = 'Nem tudtunk másolni egyetlen címet sem'; +$messages['sourceisreadonly'] = 'Ez a címforrás csak olvasható'; +$messages['errorsavingcontact'] = 'Nem tudtuk menteni a kapcsolat címét'; +$messages['movingmessage'] = 'Üzenet mozgatása...'; +$messages['receiptsent'] = 'Az Olvasási Értesítést elküldtük'; +$messages['errorsendingreceipt'] = 'Az Olvasási Értesítést nem sikerült elküldeni'; +$messages['nodeletelastidentity'] = 'Nem törölheti ezt a profilt, ez az egyetlen'; +$messages['addsubfolderhint'] = 'Az új könyvtárat az aktuálisan kiválasztott alkönyvtáraként fogjuk létrehozni'; ?>
\ No newline at end of file diff --git a/program/localization/index.inc b/program/localization/index.inc index 80007f4ba..a11f889c7 100644 --- a/program/localization/index.inc +++ b/program/localization/index.inc @@ -54,6 +54,7 @@ 'it' => 'Italiano', 'ja' => 'Japanese (日本語)', 'kr' => 'Korean', + 'ku' => 'Kurdish (Kurmancî)', 'lv' => 'Latvian', 'lt' => 'Lithuanian', 'mk' => 'Macedonian', diff --git a/program/localization/ku/labels.inc b/program/localization/ku/labels.inc new file mode 100644 index 000000000..3edd3e559 --- /dev/null +++ b/program/localization/ku/labels.inc @@ -0,0 +1,189 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | language/ku/labels.inc | + | | + | Language file of the RoundCube Webmail client | + | Copyright (C) 2006, RoundQube Dev. - Switzerland | + | Licensed under the GNU GPL | + | | + +-----------------------------------------------------------------------+ + | Author: Amed Çeko Jiyan <amedcj@kurdistan.name> | + +-----------------------------------------------------------------------+ + +*/ + +$labels = array(); +$labels['welcome'] = 'Bixêr hatî $product \\\'ê'; +$labels['username'] = 'Bikarhêner'; +$labels['password'] = 'Nasnav'; +$labels['server'] = 'Pêşkêşkar'; +$labels['login'] = 'Têkevê'; +$labels['logout'] = 'Derkeve'; +$labels['mail'] = 'E-Peyam'; +$labels['settings'] = 'Mîhengên Takekesî'; +$labels['addressbook'] = 'Lênûska Navnîşanan'; +$labels['inbox'] = 'Hatî'; +$labels['drafts'] = 'Hilanînî'; +$labels['sent'] = 'Şandî'; +$labels['trash'] = 'Çop'; +$labels['junk'] = 'Biikêrnehatî'; +$labels['subject'] = 'Mijar'; +$labels['from'] = 'Şandyar'; +$labels['to'] = 'Standyar'; +$labels['cc'] = 'Kopiya Karbon'; +$labels['bcc'] = 'Kopiya karbon a Veşartî'; +$labels['replyto'] = 'Navnîşanên Standyar'; +$labels['date'] = 'Dîrok'; +$labels['size'] = 'Mezinahî'; +$labels['priority'] = 'Girîngî'; +$labels['organization'] = 'Sazî'; +$labels['reply-to'] = 'Navnîşanên Standyar'; +$labels['mailboxlist'] = 'Peldank'; +$labels['messagesfromto'] = 'Peyam $count ên di navbera $from - $to'; +$labels['messagenrof'] = '$nr a peyama $count'; +$labels['moveto'] = 'bibe...'; +$labels['download'] = 'daxe'; +$labels['filename'] = 'Navê pelê'; +$labels['filesize'] = 'Mezinahiya pelê'; +$labels['preferhtml'] = 'Wekî HTML nîşan bide'; +$labels['htmlmessage'] = 'Peyama HTML'; +$labels['prettydate'] = 'Kurtenivîsa Dîrokê'; +$labels['addtoaddressbook'] = 'Têxe lênûska navnîşanan'; +$labels['sun'] = 'Yş'; +$labels['mon'] = 'Dş'; +$labels['tue'] = 'Sş'; +$labels['wed'] = 'Çş'; +$labels['thu'] = 'Pş'; +$labels['fri'] = 'În'; +$labels['sat'] = 'Şe'; +$labels['sunday'] = 'Yekşem'; +$labels['monday'] = 'Duşem'; +$labels['tuesday'] = 'Sêşem'; +$labels['wednesday'] = 'Çarşem'; +$labels['thursday'] = 'Pêncşem'; +$labels['friday'] = 'În'; +$labels['saturday'] = 'Şemî'; +$labels['today'] = 'Îro'; +$labels['checkmail'] = 'Li peyamên nû venihêre'; +$labels['writenewmessage'] = 'Peyameke nû biafirîne'; +$labels['replytomessage'] = 'Bersivê bide peyamê'; +$labels['replytoallmessage'] = 'Bersivê ji bo hemû kesên ku ev peyan standine bişîne'; +$labels['forwardmessage'] = 'Bersivê bide peyamê'; +$labels['deletemessage'] = 'Peyamê jê bibe'; +$labels['movemessagetotrash'] = 'Peyamê dake çopê'; +$labels['printmessage'] = 'Vê peyamê çap bike'; +$labels['previousmessage'] = 'Peyama berê nîşan bide'; +$labels['previousmessages'] = 'Peyamên berê nîşan bide'; +$labels['firstmessage'] = 'Peyama yekemîn nîşan bide'; +$labels['firstmessages'] = 'Peyamên yekemîn nîşan bide'; +$labels['nextmessage'] = 'Peyama di rêzê de nîşan bide'; +$labels['nextmessages'] = 'Peyamên di rêzê de nîşan bide'; +$labels['lastmessage'] = 'Peyama dawî nîşan bide'; +$labels['lastmessages'] = 'Peyamên dawî nîşan bide'; +$labels['backtolist'] = 'Vegere lîsteya peyaman'; +$labels['viewsource'] = 'Çavkaniyê nîşan bide'; +$labels['markmessages'] = 'Peyamê nîşan bike'; +$labels['markread'] = 'Wekî xwendî'; +$labels['markunread'] = 'Wekî nexwendî'; +$labels['select'] = 'Hilbijêre'; +$labels['all'] = 'Hemû'; +$labels['none'] = 'Ne yek jî'; +$labels['unread'] = 'Nexwendî'; +$labels['compact'] = 'Kompakt'; +$labels['empty'] = 'Vala Bike'; +$labels['purge'] = 'Jê bibe'; +$labels['quota'] = 'Bikaranîna dîskê'; +$labels['unknown'] = 'nayê zanîn'; +$labels['unlimited'] = 'bêsînor'; +$labels['quicksearch'] = 'Lêgerîna bilez'; +$labels['resetsearch'] = 'Lêgerînê reset bike'; +$labels['compose'] = 'Peyamekê biafirîne'; +$labels['savemessage'] = 'Hilîne'; +$labels['sendmessage'] = 'Peyamê niha bişîne'; +$labels['addattachment'] = 'Pelekê lê zêde bike'; +$labels['charset'] = 'Curetîp'; +$labels['editortype'] = 'Cureyê serastkat'; +$labels['returnreceipt'] = 'Rapora Vegerînê'; +$labels['checkspelling'] = 'Kontrola rastnivîsê'; +$labels['resumeediting'] = 'Serastkirinê bidomîne'; +$labels['revertto'] = 'Şûnde bîne'; +$labels['attachments'] = 'Pêvek'; +$labels['upload'] = 'Bar bike'; +$labels['close'] = 'Bigire'; +$labels['low'] = 'Nizm'; +$labels['lowest'] = 'Nizmtirîn'; +$labels['normal'] = 'Asayî'; +$labels['high'] = 'Bilind'; +$labels['highest'] = 'Bilintirîn'; +$labels['nosubject'] = '(bê mijar)'; +$labels['showimages'] = 'Xuyakirina wêneyan'; +$labels['htmltoggle'] = 'HTML'; +$labels['plaintoggle'] = 'Deqa tazî'; +$labels['addcc'] = 'Cc Têxê'; +$labels['addbcc'] = 'Bcc Têxê'; +$labels['addreplyto'] = 'Bibersivîne têxê'; +$labels['mdnrequest'] = 'Şandyara/ê vê peyamê xwest dema ku te peyam vekir, jê re hişyarî here. Dixwazî jê re hişyarî here?'; +$labels['receiptread'] = 'Rapora Vegerînê (xwendî)'; +$labels['yourmessage'] = 'Ev rapora vegerîna peyama te ye'; +$labels['receiptnote'] = 'Nîşe: Ev dide zanîn ka peyama te şand hat xwendin an na. Naveroka peyamê bi mîgogerî nayê zanîn.'; +$labels['name'] = 'Navê xuya dibe'; +$labels['firstname'] = 'Nav'; +$labels['surname'] = 'Paşnav'; +$labels['email'] = 'E-Peyam'; +$labels['addcontact'] = 'Têkiliyeke nû têxê'; +$labels['editcontact'] = 'Têkiliyê serast bike'; +$labels['edit'] = 'Serast bike'; +$labels['cancel'] = 'Betal'; +$labels['save'] = 'Tomar bike'; +$labels['delete'] = 'Jê Bibe'; +$labels['newcontact'] = 'kardeke nû a têkiliyê biafirîne'; +$labels['deletecontact'] = 'Têkiliyên hilbijartî jê bibe'; +$labels['composeto'] = 'Ji têkiliya hilbijartî re peyam bişîne'; +$labels['contactsfromto'] = 'Têkiliyên $count ên di navbera $from - $to de'; +$labels['print'] = 'çap bike'; +$labels['export'] = 'Derxe'; +$labels['previouspage'] = 'Seta berê nîşan bide'; +$labels['firstpage'] = 'Seta yekemîn nîşan bide'; +$labels['nextpage'] = 'Seta di rêzê de nîşan bide'; +$labels['lastpage'] = 'Seta dawî nîşan bide'; +$labels['groups'] = 'Kom'; +$labels['personaladrbook'] = 'Navnîşanên Takekesî'; +$labels['settingsfor'] = 'Mîheng ji bo'; +$labels['preferences'] = 'Vebijêrk'; +$labels['userpreferences'] = 'Vebijêrkên bikarhêner'; +$labels['editpreferences'] = 'Vebijêrkên bikarhêner serast bike'; +$labels['identities'] = 'Nasname'; +$labels['manageidentities'] = 'Nasnameyên vê hesabê serast bike'; +$labels['newidentity'] = 'Nasnameya nû'; +$labels['newitem'] = 'Parçeya nû'; +$labels['edititem'] = 'Parçeyê serast bike'; +$labels['setdefault'] = 'Wekî standard tomar bike'; +$labels['language'] = 'Ziman'; +$labels['timezone'] = 'Herêma demê'; +$labels['pagesize'] = 'Hejmara peyamên her rûpelekê'; +$labels['signature'] = 'Şanenav'; +$labels['dstactive'] = 'Demjimêra havînî'; +$labels['htmleditor'] = 'Peyameke HTML biafirîne'; +$labels['htmlsignature'] = 'Şanenava HTML'; +$labels['previewpane'] = 'Panela berê nîşan bide'; +$labels['autosavedraft'] = 'Xweber hilîne'; +$labels['everynminutes'] = 'her $n çirke'; +$labels['never'] = 'qet'; +$labels['folder'] = 'Peldank'; +$labels['folders'] = 'Peldank'; +$labels['foldername'] = 'Navê peldankê'; +$labels['subscribed'] = 'Ni şanenav'; +$labels['messagecount'] = 'Peyam'; +$labels['create'] = 'Biafirîne'; +$labels['createfolder'] = 'Peldankeke nû biafirîne'; +$labels['rename'] = 'Nav biguherîne'; +$labels['renamefolder'] = 'Navê peldankê biguherîne'; +$labels['deletefolder'] = 'Peldankê jê bibe'; +$labels['managefolders'] = 'Rêveberiya peldankan'; +$labels['sortby'] = 'Şêweyê rêzkirinê'; +$labels['sortasc'] = 'Wekî zêde dibe'; +$labels['sortdesc'] = 'Wekî kêm dibe'; + +?> diff --git a/program/localization/ku/messages.inc b/program/localization/ku/messages.inc new file mode 100644 index 000000000..fe1ca3260 --- /dev/null +++ b/program/localization/ku/messages.inc @@ -0,0 +1,79 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | language/ku/messages.inc | + | | + | Language file of the RoundCube Webmail client | + | Copyright (C) 2006, RoundQube Dev. - Switzerland | + | Licensed under the GNU GPL | + | | + +-----------------------------------------------------------------------+ + | Author: Amed çeko Jiyan <amedcj@kurdistan.name> | + +-----------------------------------------------------------------------+ + +*/ + +$messages = array(); +$messages['loginfailed'] = 'Têketin têk çû'; +$messages['cookiesdisabled'] = 'Geroka te destûrê nade çerezan'; +$messages['sessionerror'] = 'Danişîna te çewt e an jî bi dawî bûye'; +$messages['imaperror'] = 'Girêdana pêşkêşkara IMAP têk çû'; +$messages['nomessagesfound'] = 'Di vê peyamdankê de tu peyam nehat dîtin'; +$messages['loggedout'] = 'Te danişînî bi dawî anî. Oxir be!'; +$messages['mailboxempty'] = 'Peyamdank vala ye'; +$messages['loading'] = 'Tê barkirin...'; +$messages['loadingdata'] = 'Dane tên barkirin...'; +$messages['checkingmail'] = 'Li peyamên nû vedinihêre...'; +$messages['sendingmessage'] = 'Peyamê dişîne...'; +$messages['messagesent'] = 'Peyam hate şandin'; +$messages['savingmessage'] = 'Peyam tê hilanîn...'; +$messages['messagesaved'] = 'Peyam di Hilanînî de hat hilanîn'; +$messages['successfullysaved'] = 'Hat hilanîn'; +$messages['addedsuccessfully'] = 'Têkilî li navnîşanan hat zêdekirin'; +$messages['contactexists'] = 'Têkiliyeke bi vê navnîşanê jixwe heye'; +$messages['blockedimages'] = 'Ji bo ewlekariya te wêneyên cuda yên vê peyamê hatin astenkirin.'; +$messages['encryptedmessage'] = 'Ev peyamenek şîfrekirî ye, bibore, nayê vekirin!'; +$messages['nocontactsfound'] = 'Tu têkiliyek nehat dîtin'; +$messages['contactnotfound'] = 'Têkiliya dihat xwestin nehat dîtin'; +$messages['sendingfailed'] = 'Peyam nehat şandin'; +$messages['errorsaving'] = 'Di tomarkirinê de çewtiyek derket'; +$messages['errormoving'] = 'Ciyê peyamê nehat guherandin'; +$messages['errordeleting'] = 'Peyam nehat jêbirin'; +$messages['deletecontactconfirm'] = 'Ji dil dixwazî têkiliya/ên nîşankirî jê bibî?'; +$messages['deletemessagesconfirm'] = 'Ji dil dixwazî peya/ên nîşankirî jê bibî?'; +$messages['deletefolderconfirm'] = 'Ji dil dixwazî vê peldankê jê bibî?'; +$messages['purgefolderconfirm'] = 'Ji dil dixwazî hemû peyamên di vê peldankê de jê bibî?'; +$messages['formincomplete'] = 'Form bi temamî nehat tijekirin'; +$messages['noemailwarning'] = 'Tika ye, navnîşaneke rast têkevê'; +$messages['nonamewarning'] = 'Tika ye, navekî têkevê'; +$messages['nopagesizewarning'] = 'Tika ye, mezinahiyeke pelê têkevê'; +$messages['norecipientwarning'] = 'Tika ye, herî kêm standyarekê têkevê'; +$messages['nosubjectwarning'] = 'Qada "Mijar"ê vala ye. Dixwazî niha tiştekî lê binivîsî?'; +$messages['nobodywarning'] = 'Peyamê bê nivîs bişeyînî?'; +$messages['notsentwarning'] = 'Peyam nehat şandin. Dixwazî peyamê pişTgo bikî?'; +$messages['noldapserver'] = 'Tika ye, ji bo lêgerînê pêşkêşkareke Idap têkevê'; +$messages['nocontactsreturned'] = 'Tu têkilî nehat dîtin'; +$messages['nosearchname'] = 'Tika ye, nav an jî navnîşaneke têkiliyê têkevê'; +$messages['searchsuccessful'] = '$nr peyam hat(in) dîtin'; +$messages['searchnomatch'] = 'Di lêgerînê de tu tişt nehat dîtin'; +$messages['searching'] = 'Digere...'; +$messages['checking'] = 'Vedinihêre...'; +$messages['nospellerrors'] = 'Tu şaşiyeke rastnivîsê nehat dîtin'; +$messages['folderdeleted'] = 'Peldank hat jêbirin'; +$messages['deletedsuccessfully'] = 'Hat jêbirin'; +$messages['converting'] = 'Formatkirin ji peyamê tê birin...'; +$messages['messageopenerror'] = 'Peyam ji pêşkêşkar nehat barkirin'; +$messages['fileuploaderror'] = 'Barkirina pelê têk çû'; +$messages['filesizeerror'] = 'Pel pir mezin e. Herî zêde divê $size be'; +$messages['copysuccess'] = '$nr navnîşan hat(in) jibergirtin'; +$messages['copyerror'] = 'Tu navnîşan nehat jibergirtin'; +$messages['sourceisreadonly'] = 'Çavkaniya vê navnîşanê tenê-xwendin e'; +$messages['errorsavingcontact'] = 'Navnîşana têkiliyê nehat barkirin'; +$messages['movingmessage'] = 'Ciyê peyamê tê guhertin...'; +$messages['receiptsent'] = 'Rapora şandina serkeftî'; +$messages['errorsendingreceipt'] = 'Rapor nehat şandin'; +$messages['nodeletelastidentity'] = 'Nikarî vê nasnameyê jê bibî. Ew ya dawî ye.'; +$messages['addsubfolderhint'] = 'Ev peldank wê wekî binepeldanka ya heyî bê afirandin'; + +?> diff --git a/program/localization/nl_NL/labels.inc b/program/localization/nl_NL/labels.inc index b7fe8c07b..d5be822f7 100644 --- a/program/localization/nl_NL/labels.inc +++ b/program/localization/nl_NL/labels.inc @@ -22,7 +22,7 @@ $labels['welcome'] = 'Welkom bij $product'; $labels['username'] = 'Gebruikersnaam'; $labels['password'] = 'Wachtwoord'; $labels['server'] = 'Server'; -$labels['login'] = 'Login'; +$labels['login'] = 'Inloggen'; $labels['logout'] = 'Uitloggen'; $labels['mail'] = 'E-Mail'; $labels['settings'] = 'Persoonlijke Instellingen'; @@ -35,7 +35,7 @@ $labels['junk'] = 'SPAM'; $labels['subject'] = 'Onderwerp'; $labels['from'] = 'Afzender'; $labels['to'] = 'Ontvanger'; -$labels['cc'] = 'kopie'; +$labels['cc'] = 'Kopie'; $labels['bcc'] = 'Bcc'; $labels['replyto'] = 'Antwoord-aan'; $labels['date'] = 'Datum'; @@ -106,7 +106,7 @@ $labels['compose'] = 'Maak een bericht'; $labels['savemessage'] = 'Bewaar als concept'; $labels['sendmessage'] = 'Verstuur het bericht nu'; $labels['addattachment'] = 'Voeg een bijlage toe'; -$labels['charset'] = 'karakterset'; +$labels['charset'] = 'Karakterset'; $labels['editortype'] = 'Opmaak'; $labels['returnreceipt'] = 'Ontvangstbevestiging'; $labels['checkspelling'] = 'Controleer spelling'; diff --git a/program/localization/pl/labels.inc b/program/localization/pl/labels.inc index fae0f5367..bcc2e561e 100644 --- a/program/localization/pl/labels.inc +++ b/program/localization/pl/labels.inc @@ -131,8 +131,8 @@ $labels['plaintoggle'] = 'Zwykły tekst'; $labels['addcc'] = 'Dodaj Cc'; $labels['addbcc'] = 'Dodaj Bcc'; $labels['addreplyto'] = 'Dodaj Reply-To'; -$labels['mdnrequest'] = 'Nadawca poprosił o potwierdzenie przeczytania tej wiadomości. Czy chcesz go powiadomić?'; -$labels['receiptread'] = 'Potwierdzenie odbioru'; +$labels['mdnrequest'] = 'Nadawca zażądał potwierdzenia przeczytania tej wiadomości. Czy chcesz go powiadomić?'; +$labels['receiptread'] = 'Potwierdzenie otrzymania'; $labels['yourmessage'] = 'To jest potwierdzenie dostarczenia Twojej wiadomości'; $labels['receiptnote'] = 'Uwaga: To potwierdzenie dostarczenia wiadomości oznacza tylko, że wiadomość została wyświetlona na komputerze adresata. Nie ma żadnej gwarancji, że odbiorca przeczytał czy też zrozumiał treść wiadomości.'; $labels['name'] = 'Nazwa'; diff --git a/program/localization/pl/messages.inc b/program/localization/pl/messages.inc index 3834e82af..6b2ab9682 100644 --- a/program/localization/pl/messages.inc +++ b/program/localization/pl/messages.inc @@ -52,8 +52,8 @@ $messages['deletemessagesconfirm'] = 'Czy na pewno chcesz usunąć wybrane wiado $messages['deletefolderconfirm'] = 'Czy na pewno chcesz usunąć wybrany folder?'; $messages['purgefolderconfirm'] = 'Czy na pewno chcesz usunąć wszystkie wiadomości w tym folderze?'; $messages['formincomplete'] = 'Uzupełnij formularz!'; -$messages['noemailwarning'] = 'Wpisz poprawny adres e-mail!'; -$messages['nonamewarning'] = 'Podaj imię!'; +$messages['noemailwarning'] = 'Podaj poprawny adres e-mail!'; +$messages['nonamewarning'] = 'Podaj nazwę!'; $messages['nopagesizewarning'] = 'Podaj poprawną wartość!'; $messages['norecipientwarning'] = 'Podaj co najmniej jednego odbiorcę!'; $messages['nosubjectwarning'] = 'Nie podano tematu wiadomości. Czy chcesz go teraz uzupełnić?'; diff --git a/program/localization/se/labels.inc b/program/localization/se/labels.inc index 47cf768b1..b8152d659 100644 --- a/program/localization/se/labels.inc +++ b/program/localization/se/labels.inc @@ -136,7 +136,7 @@ $labels['receiptnote'] = 'Notera: Det här kvittot berättar bara att meddelande $labels['name'] = 'Visa namn'; $labels['firstname'] = 'Förnamn'; $labels['surname'] = 'Efternamn'; -$labels['email'] = 'Meddelande'; +$labels['email'] = 'E-post'; $labels['addcontact'] = 'Lägg till ny kontakt'; $labels['editcontact'] = 'Redigera kontakt'; $labels['edit'] = 'Redigera'; @@ -191,4 +191,4 @@ $labels['sortby'] = 'Sortera på'; $labels['sortasc'] = 'Sortera stigande'; $labels['sortdesc'] = 'Sortera fallande'; -?>
\ No newline at end of file +?> diff --git a/program/localization/zh_CN/labels.inc b/program/localization/zh_CN/labels.inc index da1682ec8..6abadd8fc 100644 --- a/program/localization/zh_CN/labels.inc +++ b/program/localization/zh_CN/labels.inc @@ -30,8 +30,8 @@ $labels['addressbook'] = '通讯录'; $labels['inbox'] = '收件箱'; $labels['drafts'] = '草稿箱'; $labels['sent'] = '已发送邮件'; -$labels['trash'] = '垃圾邮件'; -$labels['junk'] = '回收箱'; +$labels['trash'] = '回收站'; +$labels['junk'] = '垃圾邮件'; $labels['subject'] = '主题'; $labels['from'] = '发件人'; $labels['to'] = '收件人'; @@ -99,8 +99,8 @@ $labels['unlimited'] = '无限制'; $labels['quicksearch'] = '快速查找'; $labels['resetsearch'] = '重新查找'; $labels['compose'] = '写新邮件'; -$labels['sendmessage'] = '立即发送'; $labels['savemessage'] = '暂存至草稿箱'; +$labels['sendmessage'] = '立即发送'; $labels['addattachment'] = '添加附件'; $labels['charset'] = '字符集'; $labels['editortype'] = '编辑器类型'; @@ -154,7 +154,7 @@ $labels['edititem'] = '修改条目'; $labels['setdefault'] = '默认值'; $labels['language'] = '语言'; $labels['timezone'] = '时区'; -$labels['pagesize'] = '第页邮件数量'; +$labels['pagesize'] = '每页邮件数量'; $labels['signature'] = '签名'; $labels['dstactive'] = '夏令时'; $labels['htmleditor'] = '使用HTML编辑器'; diff --git a/program/localization/zh_CN/messages.inc b/program/localization/zh_CN/messages.inc index cf885b071..0450d4000 100644 --- a/program/localization/zh_CN/messages.inc +++ b/program/localization/zh_CN/messages.inc @@ -73,5 +73,10 @@ $messages['copysuccess'] = '成功复制 $nr 个地址'; $messages['copyerror'] = '无法复制地址'; $messages['sourceisreadonly'] = '源地址为只读'; $messages['errorsavingcontact'] = '无法保存联系人的地址'; +$messages['movingmessage'] = '移动邮件到...'; +$messages['receiptsent'] = '成功发送了一个已读回执'; +$messages['errorsendingreceipt'] = '无法发送回执'; +$messages['nodeletelastidentity'] = '无法删除这个身份,这是最后一个。'; +$messages['addsubfolderhint'] = '文件夹将被作为所选中文件夹的子目录'; ?> diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index 71d2197d8..fd3743e2a 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -90,7 +90,11 @@ if (!empty($msg_uid)) // similar as in program/steps/mail/show.inc $MESSAGE = array('UID' => $msg_uid); $MESSAGE['headers'] = &$IMAP->get_headers($msg_uid); - $MESSAGE['structure'] = &$IMAP->get_structure($msg_uid); + $MESSAGE['structure'] = &$IMAP->get_structure($msg_uid); + + if (!empty($MESSAGE['headers']->charset)) + $IMAP->set_charset($MESSAGE['headers']->charset); + $MESSAGE['subject'] = $IMAP->decode_header($MESSAGE['headers']->subject); $MESSAGE['parts'] = $IMAP->get_mime_numbers($MESSAGE['structure']); @@ -889,7 +893,7 @@ if ($result = $CONTACTS->list_records()) { while ($sql_arr = $result->iterate()) if ($sql_arr['email']) - $a_contacts[] = format_email_recipient($sql_arr['email'], JQ($sql_arr['name'])); + $a_contacts[] = format_email_recipient($sql_arr['email'], $sql_arr['name']); } if (isset($CONFIG['ldap_public'])) { @@ -914,7 +918,7 @@ if (isset($CONFIG['ldap_public'])) $email = $results->records[$i]['email']; $name = $results->records[$i]['name']; - $a_contacts[] = format_email_recipient($email, JQ($name)); + $a_contacts[] = format_email_recipient($email, $name); } } $LDAP->close(); diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index b1ce4bd4e..79e0248c3 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -695,10 +695,10 @@ function rcmail_print_body($part, $safe=FALSE, $plain=FALSE) $quotation = ''; $q = 0; - if (preg_match('/^(>+\s*)/', $line, $regs)) + if (preg_match('/^(>+\s*)+/', $line, $regs)) { - $q = strlen(preg_replace('/\s/', '', $regs[1])); - $line = substr($line, strlen($regs[1])); + $q = strlen(preg_replace('/\s/', '', $regs[0])); + $line = substr($line, strlen($regs[0])); if ($q > $quote_level) $quotation = str_repeat('<blockquote>', $q - $quote_level); diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index 21b5b4308..ddd3ea897 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -212,12 +212,16 @@ if (!empty($_POST['_receipt'])) // additional headers $headers['Message-ID'] = $message_id; $headers['X-Sender'] = $from; -$headers['Received'] = wordwrap('from ' . - (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? - gethostbyaddr($_SERVER['HTTP_X_FORWARDED_FOR']).' ['.$_SERVER['HTTP_X_FORWARDED_FOR'].'] via ' : '') . - gethostbyaddr($_SERVER['REMOTE_ADDR']).' ['.$_SERVER['REMOTE_ADDR'].'] with ' . - $_SERVER['SERVER_PROTOCOL'].' ('.$_SERVER['REQUEST_METHOD'].'); ' . date('r'), - 69, rcmail_header_delm() . "\t"); + +if ($CONFIG['http_received_header']) +{ + $nldlm = rcmail_header_delm() . "\t"; + $headers['Received'] = wordwrap('from ' . (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? + gethostbyaddr($_SERVER['HTTP_X_FORWARDED_FOR']).' ['.$_SERVER['HTTP_X_FORWARDED_FOR'].']'.$nldlm.' via ' : '') . + gethostbyaddr($_SERVER['REMOTE_ADDR']).' ['.$_SERVER['REMOTE_ADDR'].']'.$nldlm.'with ' . + $_SERVER['SERVER_PROTOCOL'].' ('.$_SERVER['REQUEST_METHOD'].'); ' . date('r'), + 69, $nldlm); +} if (!empty($CONFIG['useragent'])) $headers['User-Agent'] = $CONFIG['useragent']; @@ -245,6 +249,11 @@ if ($isHtml) // add a plain text version of the e-mail as an alternative part. $h2t = new html2text($message_body); $plainTextPart = wordwrap($h2t->get_text(), 998, "\r\n", true); + if (!strlen($plainTextPart)) + { + // empty message body breaks attachment handling in drafts + $plainTextPart = "\r\n"; + } $MAIL_MIME->setTXTBody(html_entity_decode($plainTextPart, ENT_COMPAT, 'utf-8')); // look for "emoticon" images from TinyMCE and copy into message as attachments @@ -254,6 +263,11 @@ else { $message_body = wordwrap($message_body, 75, "\r\n"); $message_body = wordwrap($message_body, 998, "\r\n", true); + if (!strlen($message_body)) + { + // empty message body breaks attachment handling in drafts + $message_body = "\r\n"; + } $MAIL_MIME->setTXTBody($message_body, FALSE, TRUE); } diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc index 5cd5e8360..27d26603f 100644 --- a/program/steps/mail/show.inc +++ b/program/steps/mail/show.inc @@ -30,6 +30,10 @@ if ($_GET['_uid']) $MESSAGE = array('UID' => get_input_value('_uid', RCUBE_INPUT_GET)); $MESSAGE['headers'] = $IMAP->get_headers($MESSAGE['UID']); + // set message charset as default + if (!empty($MESSAGE['headers']->charset)) + $IMAP->set_charset($MESSAGE['headers']->charset); + // go back to list if message not found (wrong UID) if (!$MESSAGE['headers']) { diff --git a/program/steps/mail/viewsource.inc b/program/steps/mail/viewsource.inc index c88b165b6..7c32b89ca 100644 --- a/program/steps/mail/viewsource.inc +++ b/program/steps/mail/viewsource.inc @@ -5,7 +5,7 @@ | program/steps/mail/viewsource.inc | | | | This file is part of the RoundCube Webmail client | - | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland | + | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland | | Licensed under the GNU GPL | | | | PURPOSE: | @@ -22,19 +22,21 @@ // similar code as in program/steps/mail/get.inc if ($uid = get_input_value('_uid', RCUBE_INPUT_GET)) - { - header('Content-Type: text/plain'); - //@ob_end_clean(); +{ + $headers = $IMAP->get_headers($uid); + $charset = $headers->charset ? $headers->charset : $IMAP->default_charset; + header("Content-Type: text/plain; charset={$charset}"); $IMAP->print_raw_body($uid); - } +} else - { - raise_error(array('code' => 500, - 'type' => 'php', - 'message' => 'Message UID '.$uid.' not found'), - TRUE, - TRUE); - } +{ + raise_error(array( + 'code' => 500, + 'type' => 'php', + 'message' => 'Message UID '.$uid.' not found'), + true, + true); +} exit; ?> diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc index a0666cd9d..befc1d7a0 100644 --- a/program/steps/settings/func.inc +++ b/program/steps/settings/func.inc @@ -67,14 +67,16 @@ function rcmail_user_prefs_form($attrib) $select_timezone = new select(array('name' => '_timezone', 'id' => $field_id)); $select_timezone->add('(GMT -11:00) Midway Island, Samoa', '-11'); $select_timezone->add('(GMT -10:00) Hawaii', '-10'); + $select_timezone->add('(GMT -9:30) Marquesas Islands', '-9.5'); $select_timezone->add('(GMT -9:00) Alaska', '-9'); $select_timezone->add('(GMT -8:00) Pacific Time (US/Canada)', '-8'); $select_timezone->add('(GMT -7:00) Mountain Time (US/Canada)', '-7'); $select_timezone->add('(GMT -6:00) Central Time (US/Canada), Mexico City', '-6'); $select_timezone->add('(GMT -5:00) Eastern Time (US/Canada), Bogota, Lima', '-5'); - $select_timezone->add('(GMT -4:00) Atlantic Time (Canada), Caracas, La Paz', '-4'); - $select_timezone->add('(GMT -3:00) Brazil, Buenos Aires, Georgetown', '-3'); + $select_timezone->add('(GMT -4:30) Caracas', '-4.5'); + $select_timezone->add('(GMT -4:00) Atlantic Time (Canada), La Paz', '-4'); $select_timezone->add('(GMT -3:30) Nfld Time (Canada), Nfld, S. Labador', '-3.5'); + $select_timezone->add('(GMT -3:00) Brazil, Buenos Aires, Georgetown', '-3'); $select_timezone->add('(GMT -2:00) Mid-Atlantic', '-2'); $select_timezone->add('(GMT -1:00) Azores, Cape Verde Islands', '-1'); $select_timezone->add('(GMT) Western Europe, London, Lisbon, Casablanca', '0'); @@ -88,13 +90,18 @@ function rcmail_user_prefs_form($attrib) $select_timezone->add('(GMT +5:30) Chennai, Kolkata, Mumbai, New Delhi', '5.5'); $select_timezone->add('(GMT +5:45) Kathmandu', '5.75'); $select_timezone->add('(GMT +6:00) Almaty, Dhaka, Colombo', '6'); + $select_timezone->add('(GMT +6:30) Cocos Islands, Myanmar', '6.5'); $select_timezone->add('(GMT +7:00) Bangkok, Hanoi, Jakarta', '7'); $select_timezone->add('(GMT +8:00) Beijing, Perth, Singapore, Taipei', '8'); + $select_timezone->add('(GMT +8:45) Caiguna, Eucla, Border Village', '8.75'); $select_timezone->add('(GMT +9:00) Tokyo, Seoul, Yakutsk', '9'); $select_timezone->add('(GMT +9:30) Adelaide, Darwin', '9.5'); $select_timezone->add('(GMT +10:00) EAST/AEST: Sydney, Guam, Vladivostok', '10'); + $select_timezone->add('(GMT +10:30) New South Wales', '10.5'); $select_timezone->add('(GMT +11:00) Magadan, Solomon Islands', '11'); + $select_timezone->add('(GMT +11:30) Norfolk Island', '11.5'); $select_timezone->add('(GMT +12:00) Auckland, Wellington, Kamchatka', '12'); + $select_timezone->add('(GMT +12:45) Chatham Islands', '12.75'); $select_timezone->add('(GMT +13:00) Tonga, Pheonix Islands', '13'); $select_timezone->add('(GMT +14:00) Kiribati', '14'); diff --git a/program/steps/settings/manage_folders.inc b/program/steps/settings/manage_folders.inc index 9caff5c85..9cf188a41 100644 --- a/program/steps/settings/manage_folders.inc +++ b/program/steps/settings/manage_folders.inc @@ -28,8 +28,8 @@ $OUTPUT->include_script('list.js'); // subscribe to one or more mailboxes if ($_action=='subscribe') { - if ($mboxes = get_input_value('_mboxes', RCUBE_INPUT_POST)) - $IMAP->subscribe($mboxes); + if ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST)) + $IMAP->subscribe(array($mbox)); if ($OUTPUT->ajax_call) $OUTPUT->remote_response('// subscribed'); @@ -38,8 +38,8 @@ if ($_action=='subscribe') // unsubscribe one or more mailboxes else if ($_action=='unsubscribe') { - if ($mboxes = get_input_value('_mboxes', RCUBE_INPUT_POST)) - $IMAP->unsubscribe($mboxes); + if ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST)) + $IMAP->unsubscribe(array($mbox)); if ($OUTPUT->ajax_call) $OUTPUT->remote_response('// unsubscribed'); diff --git a/robots.txt b/robots.txt new file mode 100644 index 000000000..1f53798bb --- /dev/null +++ b/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / diff --git a/skins/default/common.css b/skins/default/common.css index 82e1d409d..4d41b1465 100644 --- a/skins/default/common.css +++ b/skins/default/common.css @@ -70,6 +70,7 @@ input, textarea padding: 1px; padding-left: 3px; padding-right: 3px; + color: #333333; background-color: #ffffff; border: 1px solid #666666; } diff --git a/skins/default/editor_content.css b/skins/default/editor_content.css index e8b1c88fe..31a0a592e 100644 --- a/skins/default/editor_content.css +++ b/skins/default/editor_content.css @@ -1,61 +1,15 @@ -/* This file contains the CSS data for the editable area(iframe) of TinyMCE */
-/* You can extend this CSS by adding your own CSS file with the the content_css option */
-
-body, td, pre {
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 12px;
-}
-
-body {
+/* This file contains the CSS data for the editable area(iframe) of TinyMCE */ +/* You can extend this CSS by adding your own CSS file with the the content_css option */ + +body, td, pre { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 12px; +} + +body { background-color: #FFFFFF; margin-left: 4px; margin-right: 4px; margin-top: 2px; -}
-
-.mceVisualAid {
- border: 1px dashed #BBBBBB !important;
-}
-
-div.mceVisualAid {
- background-image:url('../images/spacer.gif');
- visibility: visible !important;
-}
-
-.mceItemAnchor {
- width: 12px;
- line-height: 6px;
- overflow: hidden;
- padding-left: 12px;
- background-image: url('../images/anchor_symbol.gif');
- background-position: bottom;
- background-repeat: no-repeat;
-}
-
-/* Important is needed in Gecko browsers inorder to style links */
-/*
-a {
- color: green !important;
-}
-*/
-
-/* Style selection range colors in Gecko browsers */
-/*
-::-moz-selection {
- background-color: red;
- color: green;
-}
-*/
-
-/* MSIE specific */
-
-* html body {
- scrollbar-3dlight-color: #F0F0EE;
- scrollbar-arrow-color: #676662;
- scrollbar-base-color: #F0F0EE;
- scrollbar-darkshadow-color: #DDDDDD;
- scrollbar-face-color: #E0E0DD;
- scrollbar-highlight-color: #F0F0EE;
- scrollbar-shadow-color: #F0F0EE;
- scrollbar-track-color: #F5F5F5;
-}
+} + diff --git a/skins/default/includes/header.html b/skins/default/includes/header.html index a7e034a0b..2e47ff911 100644 --- a/skins/default/includes/header.html +++ b/skins/default/includes/header.html @@ -1,3 +1,3 @@ -<div id="header"><roundcube:button command="mail" image="/images/roundcube_logo.png" alt="RoundCube Webmail" width="165" height="55" /></div> +<div id="header"><roundcube:button command="mail" image="/images/roundcube_logo.png" alt="RoundCube Webmail" /></div> <roundcube:object name="message" id="message" /> diff --git a/skins/default/mail.css b/skins/default/mail.css index aa3f64313..69762b665 100644 --- a/skins/default/mail.css +++ b/skins/default/mail.css @@ -153,6 +153,9 @@ td.formlinks a:visited left: 20px; right: 20px; bottom: 20px; + /* css hack for IE */ + width: expression((parseInt(document.documentElement.clientWidth)-40)+'px'); + height: expression((parseInt(document.documentElement.clientHeight)-100)+'px'); } #mailcontframe @@ -202,8 +205,6 @@ td.formlinks a:visited height: 100%; border: 1px solid #999999; background-color: #F9F9F9; - /* css hack for IE */ - height: expression(parseInt(document.getElementById('messagepartcontainer').offsetHeight)+'px'); } diff --git a/skins/default/settings.css b/skins/default/settings.css index 7ee50f527..9f0c8f3cc 100644 --- a/skins/default/settings.css +++ b/skins/default/settings.css @@ -69,7 +69,7 @@ span.tablink-selected a #folder-manager { - width: 540px; + width: 600px; bottom: 140px; overflow: auto; border: 1px solid #999999; @@ -119,7 +119,7 @@ span.tablink-selected a #bottomboxes { position: absolute; - width: 540px; + width: 600px; height: 120px; left: 20px; bottom: 20px; @@ -142,7 +142,7 @@ div.boxtitle, div.settingsbox { - width: 540px; + width: 600px; margin-top: 20px; margin-bottom: 20px; border: 1px solid #999999; @@ -185,28 +185,15 @@ div.settingspart #subscription-table thead td.name { - width: 240px; + width: 250px; } #subscription-table thead td.msgcount { - width: 70px; + width: 90px; } #subscription-table thead td.subscribed { - width: 60px; -} - -#subscription-table tbody td.msgcount, -#subscription-table tbody td.subscribed -{ - padding-left: 18px; -} - -#subscription-table thead td.rename, -#subscription-table thead td.delete -{ - width: 20px; - text-align: center; + width: 90px; } diff --git a/skins/default/templates/login.html b/skins/default/templates/login.html index 1950be2e8..2a48f48bf 100644 --- a/skins/default/templates/login.html +++ b/skins/default/templates/login.html @@ -28,7 +28,7 @@ </head> <body> -<img src="/images/roundcube_logo.png" width="165" height="55" border="0" alt="<roundcube:object name='productname' />" hspace="12" vspace="2"/> +<img src="/images/roundcube_logo.png" border="0" alt="<roundcube:object name='productname' />" style="margin:2px 12px" /> <roundcube:object name="message" id="message" /> diff --git a/skins/default/templates/printmessage.html b/skins/default/templates/printmessage.html index 223c98b4d..eecff69fb 100644 --- a/skins/default/templates/printmessage.html +++ b/skins/default/templates/printmessage.html @@ -6,7 +6,7 @@ </head> <body> -<div id="header"><img src="/images/roundcube_logo_print.gif" width="182" height="50" alt="RoundCube Webmail" /></div> +<div id="header"><img src="/images/roundcube_logo_print.gif" alt="<roundcube:object name="productname" />" /></div> <div id="messageframe"> <roundcube:object name="messageHeaders" class="headers-table" cellspacing="0" cellpadding="2" /> |