summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--INSTALL2
-rw-r--r--SQL/mysql.initial.sql11
-rw-r--r--SQL/mysql.update-0.1a.sql51
-rw-r--r--SQL/mysql.update.sql24
-rw-r--r--SQL/mysql5.initial.sql23
-rw-r--r--SQL/postgres.initial.sql14
-rw-r--r--SQL/postgres.update.sql24
-rw-r--r--SQL/sqlite.initial.sql16
-rw-r--r--SQL/sqlite.update.sql11
-rw-r--r--config/db.inc.php.dist2
-rw-r--r--config/main.inc.php.dist12
-rw-r--r--index.php16
-rw-r--r--installer/check.php12
-rw-r--r--installer/config.php6
-rw-r--r--installer/index.php17
-rw-r--r--installer/rcube_install.php4
-rw-r--r--installer/test.php63
-rw-r--r--installer/welcome.html1
-rw-r--r--program/include/main.inc27
-rw-r--r--program/include/rcube_db.inc12
-rw-r--r--program/include/rcube_imap.inc63
-rw-r--r--program/include/rcube_ldap.inc16
-rw-r--r--program/include/rcube_mdb2.inc52
-rw-r--r--program/include/rcube_shared.inc3
-rw-r--r--program/include/rcube_user.inc4
-rw-r--r--program/js/app.js107
-rw-r--r--program/js/list.js7
-rw-r--r--program/js/tiny_mce/themes/advanced/css/editor_content.css58
-rw-r--r--program/lib/imap.inc60
-rw-r--r--program/localization/en_GB/labels.inc4
-rw-r--r--program/localization/en_US/labels.inc4
-rw-r--r--program/localization/fi/labels.inc8
-rw-r--r--program/localization/fr/labels.inc11
-rw-r--r--program/localization/fr/messages.inc5
-rwxr-xr-xprogram/localization/ge/labels.inc257
-rwxr-xr-xprogram/localization/ge/messages.inc16
-rw-r--r--program/localization/hu/messages.inc118
-rw-r--r--program/localization/index.inc1
-rw-r--r--program/localization/ku/labels.inc189
-rw-r--r--program/localization/ku/messages.inc79
-rw-r--r--program/localization/nl_NL/labels.inc6
-rw-r--r--program/localization/pl/labels.inc4
-rw-r--r--program/localization/pl/messages.inc4
-rw-r--r--program/localization/se/labels.inc4
-rw-r--r--program/localization/zh_CN/labels.inc8
-rw-r--r--program/localization/zh_CN/messages.inc5
-rw-r--r--program/steps/mail/compose.inc10
-rw-r--r--program/steps/mail/func.inc6
-rw-r--r--program/steps/mail/sendmail.inc26
-rw-r--r--program/steps/mail/show.inc4
-rw-r--r--program/steps/mail/viewsource.inc26
-rw-r--r--program/steps/settings/func.inc11
-rw-r--r--program/steps/settings/manage_folders.inc8
-rw-r--r--robots.txt2
-rw-r--r--skins/default/common.css1
-rw-r--r--skins/default/editor_content.css68
-rw-r--r--skins/default/includes/header.html2
-rw-r--r--skins/default/mail.css5
-rw-r--r--skins/default/settings.css25
-rw-r--r--skins/default/templates/login.html2
-rw-r--r--skins/default/templates/printmessage.html2
61 files changed, 987 insertions, 652 deletions
diff --git a/INSTALL b/INSTALL
index f40bb1f11..a88f4f9be 100644
--- a/INSTALL
+++ b/INSTALL
@@ -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 *****/
diff --git a/index.php b/index.php
index af523a0b8..f29ee9445 100644
--- a/index.php
+++ b/index.php
@@ -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>&lt;?php ?&gt;</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" />