From 47ddd5f71496e1245b8236959fe794bf28156c38 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 23 Aug 2007 10:18:14 +0000 Subject: [PATCH 001/554] a fix to get the memcache session handler working with SyncML: the way SyncML/Horde handles the session (calling session_destroy) unloads our custom memcache handler --- phpgwapi/inc/horde/Horde/SyncML.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/phpgwapi/inc/horde/Horde/SyncML.php b/phpgwapi/inc/horde/Horde/SyncML.php index 25f2842912..8d41f43404 100644 --- a/phpgwapi/inc/horde/Horde/SyncML.php +++ b/phpgwapi/inc/horde/Horde/SyncML.php @@ -150,6 +150,11 @@ class Horde_SyncML_SyncMLHdr extends Horde_SyncML_ContentHandler { // custom session id. session_destroy(); + // we need to (re-)load our custom memcache session handler, as session_destroy unloads it somehow + if (extension_loaded('memcache') && ini_get('session.save_handler') == 'user') + { + session_set_save_handler("egw_memcache_open", "egw_memcache_close", "egw_memcache_read", "egw_memcache_write", "egw_memcache_destroy", "egw_memcache_gc"); + } // Reload the Horde SessionHandler if necessary. Horde::setupSessionHandler(); From fa8bef1312a1b1d601ce973352b7748bd1ab43ab Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 23 Aug 2007 10:22:55 +0000 Subject: [PATCH 002/554] typo --- phpgwapi/inc/memcache.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/phpgwapi/inc/memcache.inc.php b/phpgwapi/inc/memcache.inc.php index c4e4c75f4c..5bebb40a00 100644 --- a/phpgwapi/inc/memcache.inc.php +++ b/phpgwapi/inc/memcache.inc.php @@ -4,9 +4,9 @@ * * Fixes a problem of the buildin session handler of the memcache pecl extension, * which can NOT work with sessions > 1MB. This handler splits the session-data - * in 1MB junk, so memcache can handle them. For the first junk we use an identical + * in 1MB chunk, so memcache can handle them. For the first chunk we use an identical * key (just the session-id) as the original memcache session handler. For the further - * junks we add -2, -3, ... so other code (eg. the SyncML code from Horde) can + * chunks we add -2, -3, ... so other code (eg. the SyncML code from Horde) can * open the session, if it's size is < 1MB. * * To enable it, you need to set session.save_handler to 'memcache' and @@ -91,7 +91,7 @@ function _cut_bytes(&$data,$offset,$len=null) if (is_null($mbstring_func_overload)) _test_mbstring_func_overload(); - return $mbstring_func_overload ? mb_substr($data,$offset,$len,'ascii') : substr($data,$offset,$len,'ascii'); + return $mbstring_func_overload ? mb_substr($data,$offset,$len,'ascii') : substr($data,$offset,$len); } function egw_memcache_destroy($id) From ee022cd40d737285cfcb899fa063dcb45a7a0850 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 24 Aug 2007 06:15:27 +0000 Subject: [PATCH 003/554] fixed bug reported by Raphael Alla: registered javascript files get lost if etemplate loops --- etemplate/inc/class.uietemplate.inc.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/etemplate/inc/class.uietemplate.inc.php b/etemplate/inc/class.uietemplate.inc.php index 620830dd9f..bc04415b25 100644 --- a/etemplate/inc/class.uietemplate.inc.php +++ b/etemplate/inc/class.uietemplate.inc.php @@ -326,6 +326,7 @@ 'java_script' => $GLOBALS['egw_info']['etemplate']['java_script'], 'java_script_from_flags' => $GLOBALS['egw_info']['flags']['java_script'], 'java_script_body_tags' => $GLOBALS['egw']->js->body, + 'java_script_files' => $GLOBALS['egw']->js->files, 'include_xajax' => $GLOBALS['egw_info']['flags']['include_xajax'], 'dom_enabled' => $GLOBALS['egw_info']['etemplate']['dom_enabled'], 'hooked' => $hooked ? $hooked : $GLOBALS['egw_info']['etemplate']['hook_content'], @@ -488,6 +489,15 @@ foreach($sess as $key => $val) $GLOBALS['egw']->js->body[$tag] .= $code; } } + if (is_array($session_data['java_script_files'])) + { + if( !is_object($GLOBALS['egw']->js)) + { + $GLOBALS['egw']->js =& CreateObject('phpgwapi.javascript'); + } + $GLOBALS['egw']->js->files = !is_array($GLOBALS['egw']->js->files) ? $session_data['java_script_files'] : + $this->complete_array_merge($GLOBALS['egw']->js->files,$session_data['java_script_files']); + } //echo "

process_exec($this->name): loop is set, content=

\n"; _debug_array($content); return $this->exec($session_data['method'],$session_data['content'],$session_data['sel_options'], @@ -1015,8 +1025,9 @@ foreach($sess as $key => $val) ); } break; - case 'html': // size: [link],[link_target],[link_popup_size],[link_title] - list($extra_link,$extra_link_target,$extra_link_popup,$extra_link_title) = explode(',',$cell_options); + case 'html': // size: [link],[link_target],[link_popup_size],[link_title],[activate_links] + list($extra_link,$extra_link_target,$extra_link_popup,$extra_link_title,$activate_links) = explode(',',$cell_options); + if ($activate_links) $value = $this->html->activate_links($value); $html .= $value; break; case 'int': // size: [min],[max],[len],[precission/sprint format] From 097238311b160935071824cc1fab2e7a10c00603 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 24 Aug 2007 10:53:26 +0000 Subject: [PATCH 004/554] fixed not found user searched by email, if there's also a contact with that email --- phpgwapi/inc/class.accounts_sql.inc.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/phpgwapi/inc/class.accounts_sql.inc.php b/phpgwapi/inc/class.accounts_sql.inc.php index 6dd3723724..7a1358e95d 100644 --- a/phpgwapi/inc/class.accounts_sql.inc.php +++ b/phpgwapi/inc/class.accounts_sql.inc.php @@ -37,7 +37,7 @@ class accounts_backend /** * instance of the db class * - * @var object + * @var egw_db */ var $db; /** @@ -445,6 +445,10 @@ class accounts_backend { $where['account_type'] = $account_type; } + else + { + $where[] = 'account_id IS NOT NULL'; // otherwise contacts with eg. the same email hide the accounts! + } $this->db->select($table,$cols,$where,__LINE__,__FILE__); if(!$this->db->next_record()) return false; From 121a44bf7167aef1758b952058da27c8c0e6d5a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cornelius=20Wei=C3=9F?= Date: Fri, 24 Aug 2007 12:52:50 +0000 Subject: [PATCH 005/554] fix for dst in cal import --- .../inc/class.import_export_helper_functions.inc.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/importexport/inc/class.import_export_helper_functions.inc.php b/importexport/inc/class.import_export_helper_functions.inc.php index 2933ddaaed..0e94467072 100755 --- a/importexport/inc/class.import_export_helper_functions.inc.php +++ b/importexport/inc/class.import_export_helper_functions.inc.php @@ -29,8 +29,9 @@ class import_export_helper_functions { * If timestring is empty, php strtotime is used. * @param string $_string time string to convert * @param string $_format format of time string e.g.: d.m.Y H:i + * @param int $_is_dst is day light saving time? 0 = no, 1 = yes, -1 = system default */ - public static function custom_strtotime( $_string, $_format='' ) { + public static function custom_strtotime( $_string, $_format='', $_is_dst = -1) { if ( empty( $_format ) ) return strtotime( $_string ); $fparams = explode( ',', chunk_split( $_format, 1, ',' ) ); $spos = 0; @@ -53,7 +54,7 @@ class import_export_helper_functions { } print_debug("hour:$hour; min:$min; sec:$sec; mon:$mon; day:$day; year:$year;\n"); - $timestamp = mktime($hour, $min, $sec, $mon, $day, $year, 0); + $timestamp = mktime($hour, $min, $sec, $mon, $day, $year, $_is_dst); // offset given? if ( isset( $offset ) && strlen( $offset == 5 ) ) { From 22449ee1a4dea07954c1f094b78be76782cffc45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cornelius=20Wei=C3=9F?= Date: Fri, 24 Aug 2007 15:16:45 +0000 Subject: [PATCH 006/554] fix sif syncml from ob@dansound.dk on devel list --- calendar/inc/class.sifcalendar.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/inc/class.sifcalendar.inc.php b/calendar/inc/class.sifcalendar.inc.php index 03619c8c89..539ea3ae7c 100644 --- a/calendar/inc/class.sifcalendar.inc.php +++ b/calendar/inc/class.sifcalendar.inc.php @@ -73,7 +73,7 @@ function endElement($_parser, $_tag) { #error_log($_tag .' => '. $this->sifData); if(!empty($this->sifMapping[$_tag])) { - $this->event[$this->sifMapping[$_tag]] = $this->sifData; + $this->event[$this->sifMapping[$_tag]] = trim($this->sifData); } unset($this->sifData); } From 240b8eac317ed91f6ac293889f12c7f5efa938f5 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 27 Aug 2007 13:00:45 +0000 Subject: [PATCH 007/554] some new features for the infolog-widget to improve form printting: 1) fetching contact fields from linked infolog entries, 2) formatting content with preg_replace --- infolog/inc/class.infolog_widget.inc.php | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/infolog/inc/class.infolog_widget.inc.php b/infolog/inc/class.infolog_widget.inc.php index 9d68c1fe0d..80f0dd3a98 100644 --- a/infolog/inc/class.infolog_widget.inc.php +++ b/infolog/inc/class.infolog_widget.inc.php @@ -99,7 +99,7 @@ class infolog_widget $value = ''; break; } - list($type,$compare,$alternatives) = explode(',',$cell['size']); + list($type,$compare,$alternatives,$contactfield,$regex,$replace) = explode(',',$cell['size'],6); $value = $this->info[$type]; $cell['size'] = ''; $cell['no_lang'] = 1; @@ -109,7 +109,7 @@ class infolog_widget { case '': // Sum of the alternatives $cell['type'] = 'float'; - $cell['size'] = ',,,2'; + $cell['size'] = ',,,%0.2lf'; $value = 0.0; foreach(explode(':',$alternatives) as $name) { @@ -174,6 +174,23 @@ class infolog_widget $value = $value == $compare ? 'X' : ''; $cell['type'] = 'label'; } + // modify the value with a regular expression + if (!empty($regex)) + { + $parts = explode('/',$regex); + if (strchr(array_pop($parts),'e') === false) // dont allow e modifier, which would execute arbitrary php code + { + $value = preg_replace($regex,$replace,$value); + } + $cell['type'] = 'label'; + $cell['size'] = ''; + } + // use a contact widget to render the value, eg. to fetch contact data from an linked infolog + if (!empty($contactfield)) + { + $cell['type'] = 'contact-value'; + $cell['size'] = $contactfield; + } break; } return True; // extra label ok From 56774aaee5ee8ab2911b455b8a4a4468f9df1840 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 27 Aug 2007 13:04:05 +0000 Subject: [PATCH 008/554] using uid to fetch infolog entries like in calendar, used by icalsrv, requires a schema update to store the uid --- infolog/inc/class.boinfolog.inc.php | 9 +++++---- infolog/inc/class.soinfolog.inc.php | 25 ++++++++++++++++++------- infolog/setup/setup.inc.php | 3 ++- infolog/setup/tables_current.inc.php | 3 ++- infolog/setup/tables_update.inc.php | 15 +++++++++++++++ 5 files changed, 42 insertions(+), 13 deletions(-) diff --git a/infolog/inc/class.boinfolog.inc.php b/infolog/inc/class.boinfolog.inc.php index 518ea9bc35..984a8a99e4 100644 --- a/infolog/inc/class.boinfolog.inc.php +++ b/infolog/inc/class.boinfolog.inc.php @@ -438,10 +438,10 @@ class boinfolog { if (is_array($info_id)) { - $info_id = (int) (isset($info_id['info_id']) ? $info_id['info_id'] : $info_id[0]); + $info_id = isset($info_id['info_id']) ? $info_id['info_id'] : $info_id[0]; } - if ($this->so->read($info_id) === False) + if (($data = $this->so->read($info_id)) === False) { if ($this->xmlrpc) { @@ -449,7 +449,9 @@ class boinfolog } return null; } - if (!$this->check_access($info_id,EGW_ACL_READ)) // check behind read, to prevent a double read + $info_id = $data['info_id']; // in case the uid was specified + + if (!$this->check_access($data,EGW_ACL_READ)) // check behind read, to prevent a double read { if ($this->xmlrpc) { @@ -457,7 +459,6 @@ class boinfolog } return False; } - $data = $this->so->data; if ($data['info_subject'] == $this->subject_from_des($data['info_des'])) { diff --git a/infolog/inc/class.soinfolog.inc.php b/infolog/inc/class.soinfolog.inc.php index 5869d5c518..2533271ccc 100644 --- a/infolog/inc/class.soinfolog.inc.php +++ b/infolog/inc/class.soinfolog.inc.php @@ -353,18 +353,17 @@ class soinfolog // DB-Layer * * some cacheing is done to prevent multiple reads of the same entry * - * @param $info_id id of log-entry + * @param $info_id id or uid of entry * @return array/boolean the entry as array or False on error (eg. entry not found) */ function read($info_id) // did _not_ ensure ACL { - $info_id = (int) $info_id; - - if ($info_id && $info_id == $this->data['info_id']) + if ($info_id && ((int)$info_id == $this->data['info_id'] || $info_id == $this->data['info_uid'])) { return $this->data; // return the already read entry } - if ($info_id <= 0 || !$this->db->select($this->info_table,'*',array('info_id'=>$info_id),__LINE__,__FILE__) || + if (!$info_id || !$this->db->select($this->info_table,'*', + $this->db->expression($this->info_table,array('info_id'=>$info_id),' OR ',array('info_uid'=>$info_id)),__LINE__,__FILE__) || !(($this->data = $this->db->row(true)))) { $this->init( ); @@ -374,7 +373,7 @@ class soinfolog // DB-Layer { $this->data['info_responsible'] = $this->data['info_responsible'] ? explode(',',$this->data['info_responsible']) : array(); } - $this->db->select($this->extra_table,'info_extra_name,info_extra_value',array('info_id'=>$info_id),__LINE__,__FILE__); + $this->db->select($this->extra_table,'info_extra_name,info_extra_value',array('info_id'=>$this->data['info_id']),__LINE__,__FILE__); while ($this->db->next_record()) { $this->data['#'.$this->db->f(0)] = $this->db->f(1); @@ -527,9 +526,14 @@ class soinfolog // DB-Layer if ($check_modified) $where['info_datemodified'] = $check_modified; if (!$this->db->update($this->info_table,$to_write,$where,__LINE__,__FILE__)) { + //error_log("### soinfolog::write(".print_r($to_write,true).") where=".print_r($where,true)." returning false"); return false; // Error } - if ($this->db->affected_rows() < 1) return 0; // someone else updated the modtime or deleted the entry + if ($check_modified && $this->db->affected_rows() < 1) + { + //error_log("### soinfolog::write(".print_r($to_write,true).") where=".print_r($where,true)." returning 0 (nothing updated, eg. condition not met)"); + return 0; // someone else updated the modtime or deleted the entry + } } else { @@ -537,6 +541,12 @@ class soinfolog // DB-Layer $this->db->insert($this->info_table,$to_write,false,__LINE__,__FILE__); $info_id = $this->data['info_id'] = $this->db->get_last_insert_id($this->info_table,'info_id'); + + if (!$this->data['info_uid']) // new entry without uid --> create one based on our info_id and save it + { + $this->data['info_uid'] = $GLOBALS['egw']->common->generate_uid('infolog',$info_id); + $this->db->update($this->info_table,array('info_uid'=>$this->data['info_uid']),array('info_id'=>$info_id),__LINE__,__FILE__); + } } //echo "

soinfolog.write values= "; _debug_array($values); @@ -557,6 +567,7 @@ class soinfolog // DB-Layer ),__LINE__,__FILE__); } // echo "

soinfolog.write this->data= "; _debug_array($this->data); + //error_log("### soinfolog::write(".print_r($to_write,true).") where=".print_r($where,true)." returning id=".$this->data['info_id']); return $this->data['info_id']; } diff --git a/infolog/setup/setup.inc.php b/infolog/setup/setup.inc.php index 42f0eeb6c4..b60bce382a 100755 --- a/infolog/setup/setup.inc.php +++ b/infolog/setup/setup.inc.php @@ -12,7 +12,7 @@ */ $setup_info['infolog']['name'] = 'infolog'; -$setup_info['infolog']['version'] = '1.4'; +$setup_info['infolog']['version'] = '1.5.001'; $setup_info['infolog']['app_order'] = 5; $setup_info['infolog']['tables'] = array('egw_infolog','egw_infolog_extra'); $setup_info['infolog']['enable'] = 1; @@ -72,3 +72,4 @@ $setup_info['infolog']['depends'][] = array( 'appname' => 'etemplate', 'versions' => Array('1.3','1.4','1.5') ); + diff --git a/infolog/setup/tables_current.inc.php b/infolog/setup/tables_current.inc.php index 99225ff8ef..f2e9dfd8dd 100644 --- a/infolog/setup/tables_current.inc.php +++ b/infolog/setup/tables_current.inc.php @@ -40,7 +40,8 @@ 'info_percent' => array('type' => 'int','precision' => '2','default' => '0'), 'info_datecompleted' => array('type' => 'int','precision' => '8'), 'info_location' => array('type' => 'varchar','precision' => '255'), - 'info_custom_from' => array('type' => 'int','precision' => '1') + 'info_custom_from' => array('type' => 'int','precision' => '1'), + 'info_uid' => array('type' => 'varchar','precision' => '255') ), 'pk' => array('info_id'), 'fk' => array(), diff --git a/infolog/setup/tables_update.inc.php b/infolog/setup/tables_update.inc.php index f6c7563346..607b5c56ff 100644 --- a/infolog/setup/tables_update.inc.php +++ b/infolog/setup/tables_update.inc.php @@ -574,3 +574,18 @@ { return $GLOBALS['setup_info']['infolog']['currentver'] = '1.4'; } + + $test[] = '1.4'; + function infolog_upgrade1_4() + { + $GLOBALS['egw_setup']->oProc->AddColumn('egw_infolog','info_uid',array( + 'type' => 'varchar', + 'precision' => '255' + )); + $GLOBALS['egw_setup']->db->query("SELECT config_value FROM egw_config WHERE config_app='phpgwapi' AND config_name='install_id'",__LINE__,__FILE__); + $install_id = $GLOBALS['egw_setup']->db->next_record() ? $GLOBALS['egw_setup']->db->f(0) : md5(time()); + $GLOBALS['egw_setup']->db->query('UPDATE egw_infolog SET info_uid='.$GLOBALS['egw_setup']->db->concat("'infolog-'",'info_id',"'-$install_id'"),__LINE__,__FILE__); + + return $GLOBALS['setup_info']['infolog']['currentver'] = '1.5.001'; + } +?> From e003a6b5c709ad28bc3e9bc5479341aaa83ef00a Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 27 Aug 2007 13:13:11 +0000 Subject: [PATCH 009/554] many modifications to improve the support of (at least) lightning - changed default uid handling to UID2UID (means keep them unchanged), as the other modes created doublicates on client and server, as the client did not understand that the server changes his uid's (against the RFC specs). - ability to delete events (not yet InfoLogs!), by tracking the id's of the GET request of the client and deleting the ones NOT send back to the server in PUT requests - added etag handling to allow to reject put requests if the calendar is not up to date (HTTP_IF header with etag in client PUT requests) and to report unmodified calendars to the client (HTTP_IF_NONE_MATCH header with etag gets 304 Not modified response) - returning 501 Not implemented response, for WebDAV/CalDAV request (eg. PROPFIND), to let the client know we dont support it - ability to use contacts identified by their mail address as participants (mail addresses which are no contacts still get written to the description!) - support uid for InfoLog (requires InfoLog version >= 1.5) --- icalsrv.php | 86 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 75 insertions(+), 11 deletions(-) diff --git a/icalsrv.php b/icalsrv.php index 82b47d673f..81ee8b5761 100644 --- a/icalsrv.php +++ b/icalsrv.php @@ -10,6 +10,21 @@ * @note THIS IS STILL EXPERIMENTAL CODE do not use in production. * @note this script is supposed to be at: egw-root/icalsrv.php * + * NEW RalfBecker Aug 2007 + * many modifications to improve the support of (at least) lightning + * - changed default uid handling to UID2UID (means keep them unchanged), as the other + * modes created doublicates on client and server, as the client did not understand + * that the server changes his uid's (against the RFC specs). + * - ability to delete events (not yet InfoLogs!), by tracking the id's of the GET request + * of the client and deleting the ones NOT send back to the server in PUT requests + * - added etag handling to allow to reject put requests if the calendar is not up to date + * (HTTP_IF header with etag in client PUT requests) and to report unmodified calendars + * to the client (HTTP_IF_NONE_MATCH header with etag gets 304 Not modified response) + * - returning 501 Not implemented response, for WebDAV/CalDAV request (eg. PROPFIND), to + * let the client know we dont support it + * - ability to use contacts identified by their mail address as participants (mail addresses + * which are no contacts still get written to the description!) + * - support uid for InfoLog (requires InfoLog version >= 1.5) * @version 0.9.37-ng-a2 added a todo plan for v0.9.40 * @date 20060510 * @since 0.9.37-ng-a1 removed fixed default domain authentication @@ -133,7 +148,12 @@ * the related Egroupware element. * See further in @ref secuidmapping in the icalsrv_resourcehandler documentation. */ - $uid_export_mode = UMM_ID2UID; + // New RalfBecker Aug 2007 + // NOT using UID2UID creates doublicates on the iCal client, as it does NOT understand, + // that posted events get their uid changed by the server. + // I think uid's should be handled as specified in the RFC: the first clients assigns them + // AND noone is supposted to change them after that! + $uid_export_mode = UMM_UID2UID; /** uid mapping import configuration switch * @var int @@ -142,7 +162,9 @@ * elements, that are then updated with the ical info. * See further in @ref secuidmapping in the icalsrv_resourcehandler documentation. */ - $uid_import_mode = UMM_UID2ID; + // New RalfBecker Aug 2007 + // NOT using UID2UID creates doublicates on the iCal client, see above + $uid_import_mode = UMM_UID2UID; /** * @section secisuidmapping Basic Possible settings of UID to ID mapping. @@ -326,13 +348,13 @@ // build a virtual calendar with ical facilities from the found vircal // array_storage data - $icalvc =& CreateObject('icalsrv.icalvircal'); + require_once(EGW_INCLUDE_ROOT.'/icalsrv/inc/class.icalvircal.inc.php'); + $icalvc =& new icalvircal; if(!$icalvc->fromArray($vircal_arstore)) { error_log('icalsrv.php: ' . $cnmsg . ' couldnot restore from repository.' ); fail_exit($cnmsg . ' internal problem ' , '403'); } - // YES: $icalvc created ok! acces rights needs to be checked though! // HACK: ATM basic auth is always needed!! (JVL) ,so we force icalvc into it @@ -409,11 +431,14 @@ $icalvc->reimport_missing_elements = $reimport_missing_elements; $logmsg = ""; - // oke now process the actual import or export to/from icalvc.. - if($_SERVER['REQUEST_METHOD'] == 'PUT') + + // NEW RalfBecker Aug 2007 + // We have to handle the request methods different, specially the WebDAV ones we dont support + switch($_SERVER['REQUEST_METHOD']) { + case 'PUT': // *** PUT Request so do an Import ************* - + if($isdebug) { error_log('icalsrv.php: importing, by user:' .$GLOBALS['egw_info']['user']['account_id'] @@ -435,6 +460,21 @@ fail_exit('importing in groupcalendars is not allowed', '403'); } + // NEW RalfBecker Aug 2007 + // for a PUT we have to check if the currently loaded calendar is still up to date + // (not changed eg. by someone else or via the webfrontend). + // This is done by comparing the ETAG given as HTTP_IF with the current ETAG (last modification date) + // of the calendar --> on failure we return 412 Precondition failed, to not overwrite the modifications + if (isset($_SERVER['HTTP_IF']) && preg_match('/\(\[([0-9]+)\]\)/',$_SERVER['HTTP_IF'],$matches)) + { + $etag = $icalvc->get_etag(); + //error_log("PUT: current etag=$etag, HTTP_IF=$_SERVER[HTTP_IF]"); + if ($matches[1] != $etag) + { + fail_exit('Precondition Failed',412); + } + } + // I0 read the payload $logmsg = 'IMPORTING in '. $importMode . ' mode'; $fpput = fopen("php://input", "r"); @@ -469,16 +509,31 @@ log_ical($logmsg,"import",$vcalstr); } + // NEW RalfBecker Aug 2007 + // we have to send a new etag header, as otherwise the client (at least lightning) has a wrong etag, + // if it's not requesting the calendar again via GET + header("ETag: ". $icalvc->get_etag()); + // handle response ... $GLOBALS['egw']->common->egw_exit(); - } - else - { - // *** GET (or POST?) Request so do an export + + case 'GET': + // *** GET Request so do an export $logmsg = 'EXPORTING'; // derive a ProductType from our http Agent and set it in icalvc $icalvc->deviceType = icalsrv_resourcehandler::httpUserAgent2deviceType($reqagent); + // NEW RalfBecker Aug 2007 + // if an IF_NONE_MATCH is given, check if we need to send a new export, or the current one is still up-to-date + if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) + { + $etag = $icalvc->get_etag(); + error_log("GET: current etag=$etag, HTTP_IF_NONE_MATCH=$_SERVER[HTTP_IF_NONE_MATCH]"); + if ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag) + { + fail_exit('Not Modified',304); + } + } // export the data from the virtual calendar $vcalstr = $icalvc->export_vcal(); @@ -493,6 +548,10 @@ $logmsg .= "\n exported " . $cnmsg ." : OK "; } // DONE exporting + + // NEW RalfBecker Aug 2007 + // returnung max modification date of events as etag header + header("ETag: ". $icalvc->export_etag); if($logdir) log_ical($logmsg,"export",$vcalstr); // handle response ... @@ -503,6 +562,11 @@ } echo $vcalstr; $GLOBALS['egw']->common->egw_exit(); + + default: + case 'PROPFIND': + // tell the client we do NOT support full WebDAV/CalDAV + fail_exit('Not Implemented',501); } // // --- SOME UTILITY FUNCTIONS ------- From ba1a1c3e69d0bf4dbcf31b886697a2c8850a17f5 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 27 Aug 2007 17:17:36 +0000 Subject: [PATCH 010/554] changed case to uppercase of the method part of the mime-type of calendar invitations, as lightning ignores lowercase methods --- calendar/inc/class.bocalupdate.inc.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/calendar/inc/class.bocalupdate.inc.php b/calendar/inc/class.bocalupdate.inc.php index b047b6d65c..a93f7e589b 100644 --- a/calendar/inc/class.bocalupdate.inc.php +++ b/calendar/inc/class.bocalupdate.inc.php @@ -439,52 +439,52 @@ class bocalupdate extends bocal $action = lang('Canceled'); $msg = 'Canceled'; $msgtype = '"calendar";'; - $method = 'cancel'; + $method = 'CANCEL'; break; case MSG_MODIFIED: $action = lang('Modified'); $msg = 'Modified'; $msgtype = '"calendar"; Version="'.$version.'"; Id="'.$new_event['id'].'"'; - $method = 'request'; + $method = 'REQUEST'; break; case MSG_DISINVITE: $action = lang('Disinvited'); $msg = 'Disinvited'; $msgtype = '"calendar";'; - $method = 'cancel'; + $method = 'CANCEL'; break; case MSG_ADDED: $action = lang('Added'); $msg = 'Added'; $msgtype = '"calendar"; Version="'.$version.'"; Id="'.$new_event['id'].'"'; - $method = 'request'; + $method = 'REQUEST'; break; case MSG_REJECTED: $action = lang('Rejected'); $msg = 'Response'; $msgtype = '"calendar";'; - $method = 'reply'; + $method = 'REPLY'; break; case MSG_TENTATIVE: $action = lang('Tentative'); $msg = 'Response'; $msgtype = '"calendar";'; - $method = 'reply'; + $method = 'REPLY'; break; case MSG_ACCEPTED: $action = lang('Accepted'); $msg = 'Response'; $msgtype = '"calendar";'; - $method = 'reply'; + $method = 'REPLY'; break; case MSG_ALARM: $action = lang('Alarm'); $msg = 'Alarm'; $msgtype = '"calendar";'; - $method = 'publish'; // duno if thats right + $method = 'PUBLISH'; // duno if thats right break; default: - $method = 'publish'; + $method = 'PUBLISH'; } $notify_msg = $this->cal_prefs['notify'.$msg]; if (empty($notify_msg)) @@ -582,7 +582,7 @@ class bocalupdate extends bocal case 'ical': $ics = ExecMethod2('calendar.boical.exportVCal',$event['id'],'2.0',$method); - if ($method == "request") + if ($method == 'REQUEST') { $send->AddStringAttachment($ics, "cal.ics", "8bit", "text/calendar; method=$method"); } From 372c2b4b28abbbaa626440c0420e2459ab2765b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cornelius=20Wei=C3=9F?= Date: Tue, 28 Aug 2007 13:02:33 +0000 Subject: [PATCH 011/554] fix: onchange of date selector was not working --- etemplate/inc/class.date_widget.inc.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/etemplate/inc/class.date_widget.inc.php b/etemplate/inc/class.date_widget.inc.php index 71a947faf0..899747d50e 100644 --- a/etemplate/inc/class.date_widget.inc.php +++ b/etemplate/inc/class.date_widget.inc.php @@ -269,7 +269,8 @@ { $dcell['type'] = 'html'; $dcell['name'] = 'str'; - $value['str'] = $this->jscal->input($name.'[str]',False,$value['Y'],$value['m'],$value['d'],lang($cell['help'])); + $jscaloptions = $cell['onchange'] ? ( "onchange='". ( (int)$cell['onchange'] === 1 ? "this.form.submit();'" : $cell['onchange']. "'" ) ) : '' ; + $value['str'] = $this->jscal->input($name.'[str]',False,$value['Y'],$value['m'],$value['d'],lang($cell['help']),$jscaloptions); $n = 2; // no other fields $options &= ~2; // no set-today button } From f2ea7ea2f64ecd4bfca032f1536ffee278bca8d1 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 30 Aug 2007 13:24:54 +0000 Subject: [PATCH 012/554] removed formatting chars from the phone-number in callto:-links, as the mess up the links --- addressbook/inc/class.uicontacts.inc.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addressbook/inc/class.uicontacts.inc.php b/addressbook/inc/class.uicontacts.inc.php index 32f900ce28..8a03284362 100644 --- a/addressbook/inc/class.uicontacts.inc.php +++ b/addressbook/inc/class.uicontacts.inc.php @@ -1727,6 +1727,8 @@ $readonlys['button[vcard]'] = true; $user = $this->read('account:'.$GLOBALS['egw_info']['user']['account_id']); $userphone = is_array($user) ? ($user['tel_work'] ? $user['tel_work'] : $user['tel_home']) : false; } + $number = str_replace(array(' ','(',')','/','-'),'',$number); // remove number formatting chars messing up the links + $link = str_replace(array('%1','%u','%t'),array(urlencode($number),$GLOBALS['egw_info']['user']['account_lid'],$userphone), $this->config['call_link']); } From e91b4400b96b8af6a34f1f6fc4c3ae1f4bcd95c5 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 30 Aug 2007 15:29:34 +0000 Subject: [PATCH 013/554] fix for bug #1172: values lost, if error in user-creation/validation --- admin/inc/class.uiaccounts.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/inc/class.uiaccounts.inc.php b/admin/inc/class.uiaccounts.inc.php index 2903917e84..03d4c94648 100755 --- a/admin/inc/class.uiaccounts.inc.php +++ b/admin/inc/class.uiaccounts.inc.php @@ -588,7 +588,7 @@ $errors = $this->bo->add_user($userData); if(is_array($errors)) { - $this->create_edit_user($userData,$errors); + $this->create_edit_user(0,$userData,$errors); $GLOBALS['egw']->common->egw_exit(); } $GLOBALS['egw']->redirect($GLOBALS['egw']->link('/index.php','menuaction=admin.uiaccounts.list_users')); From 885dd1bf8454f0df095cf69bc05f1b25b79d73d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cornelius=20Wei=C3=9F?= Date: Thu, 30 Aug 2007 15:46:31 +0000 Subject: [PATCH 014/554] php5.2 fixes --- importexport/inc/class.definition.inc.php | 2 +- importexport/inc/class.export_csv.inc.php | 2 +- importexport/inc/class.import_csv.inc.php | 2 +- .../class.import_export_helper_functions.inc.php | 14 ++++++++------ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/importexport/inc/class.definition.inc.php b/importexport/inc/class.definition.inc.php index 7333bc0f5a..90035331dc 100644 --- a/importexport/inc/class.definition.inc.php +++ b/importexport/inc/class.definition.inc.php @@ -309,4 +309,4 @@ class definition implements iface_egw_record { unset($this->so_sql); } -} \ No newline at end of file +} diff --git a/importexport/inc/class.export_csv.inc.php b/importexport/inc/class.export_csv.inc.php index a2f418deaf..807fd5bdf1 100644 --- a/importexport/inc/class.export_csv.inc.php +++ b/importexport/inc/class.export_csv.inc.php @@ -74,7 +74,7 @@ class export_csv implements iface_export_record * @param array _options options for specific backends * @return bool */ - public function __construct( $_stream, $_options ) { + public function __construct( $_stream, array $_options ) { if (!is_object($GLOBALS['egw']->translation)) { $GLOBALS['egw']->translation = new translation(); } diff --git a/importexport/inc/class.import_csv.inc.php b/importexport/inc/class.import_csv.inc.php index bc6d36158a..d8a1b58820 100755 --- a/importexport/inc/class.import_csv.inc.php +++ b/importexport/inc/class.import_csv.inc.php @@ -73,7 +73,7 @@ class import_csv implements iface_import_record { //, Iterator { * @param string $_resource resource containing data. May be each valid php-stream * @param array $_options options for the resource array with keys: charset and fieldsep */ - public function __construct( $_resource, $_options ) { + public function __construct( $_resource, array $_options ) { $this->resource = $_resource; $this->csv_fieldsep = $_options['fieldsep']; $this->csv_charset = $_options['charset']; diff --git a/importexport/inc/class.import_export_helper_functions.inc.php b/importexport/inc/class.import_export_helper_functions.inc.php index 0e94467072..b2cfe66684 100755 --- a/importexport/inc/class.import_export_helper_functions.inc.php +++ b/importexport/inc/class.import_export_helper_functions.inc.php @@ -128,7 +128,7 @@ class import_export_helper_functions { $cat_names = is_array( $_cat_names ) ? $_cat_names : explode( ',', $_cat_names ); foreach ( $cat_names as $cat_name ) { - + if ( $cat_name == '' ) continue; if ( ( $cat_id = $cats->name2id( $cat_name ) ) == 0 ) { $cat_id = $cats->add( array( 'name' => $cat_name, @@ -179,10 +179,11 @@ class import_export_helper_functions { $PSep = '||'; // Pattern-Separator, separats the pattern-replacement-pairs in conversion $ASep = '|>'; // Assignment-Separator, separats pattern and replacesment - $CPre = '|['; $CPos = ']'; // |[_record-idx] is expanded to the corespondig value + $CPre = '|['; $CPos = ']'; // |[_record-idx] is expanded to the corespondig value $TPre = '|T{'; $TPos = '}'; // |{_record-idx} is trimmed - $CntlPre = '|TC{'; // Filter all cntl-chars \x01-\x1f and trim + $CntlPre = '|TC{'; // Filter all cntl-chars \x01-\x1f and trim $CntlnCLPre = '|TCnCL{'; // Like |C{ but allowes CR and LF + $INE = '|INE{'; // Only insert if stuff in ^^ is not empty foreach ( $_conversion as $idx => $conversion_string ) { if ( empty( $conversion_string ) ) continue; @@ -215,11 +216,11 @@ class import_export_helper_functions { ); } - $val = preg_replace_callback( "/(cat|account|strtotime)\(([^)]+)\)/i", array( self, 'c2_dispatcher') , $val ); + $val = preg_replace_callback( "/(cat|account|strtotime)\(([^)]*)\)/i", array( self, 'c2_dispatcher') , $val ); } } // clean each field - $val = preg_replace_callback("/(\|T\{|\|TC\{|\|TCnCL\{)(.*)\}/", array( self, 'strclean'), $val ); + $val = preg_replace_callback("/(\|T\{|\|TC\{|\|TCnCL\{|\|INE\{)(.*)\}/", array( self, 'strclean'), $val ); $_record[$idx] = $val; } @@ -252,7 +253,8 @@ class import_export_helper_functions { switch( $_matches[1] ) { case '|T{' : return trim( $_matches[2] ); case '|TC{' : return trim( preg_replace( '/[\x01-\x1F]+/', '', $_matches[2] ) ); - case '|TCnCL{' : return trim( preg_replace( '/[\x01-\x09\x11\x12\x14-\x1F]+/', '', $_matches[2] ) ); + case '|TCnCL{' : return trim( preg_replace( '/[\x01-\x09\x11\x12\x14-\x1F]+/', '', $_matches[2] ) ); + case '|INE{' : return preg_match( '/\^.+\^/', $_matches[2] ) ? $_matches[2] : ''; default: throw new Exception('Error in conversion string! "'. substr( $_matches[1], 0, -1 ). '" is not valid!'); } From 9e91aafcc7302ff250b9909fc9574822ce4188cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cornelius=20Wei=C3=9F?= Date: Thu, 30 Aug 2007 15:47:16 +0000 Subject: [PATCH 015/554] add german outlook import --- .../definitions/outlook_csv_german.xml | 71 ++++++++++++++++++- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/addressbook/importexport/definitions/outlook_csv_german.xml b/addressbook/importexport/definitions/outlook_csv_german.xml index 5ca71584a9..262c1c8fc7 100644 --- a/addressbook/importexport/definitions/outlook_csv_german.xml +++ b/addressbook/importexport/definitions/outlook_csv_german.xml @@ -3,11 +3,76 @@ importexport definitions utf-8 - 1 + 2 - - outlook_csv_german + + outlook_csv_import_german + addressbook + import_contacts_csv + import + + Default + + + , + iso-8859-1 + add + 1 + + n_prefix n_given n_middle n_family n_suffix + org_name org_unit title adr_one_street adr_one_street2 nc0 adr_one_locality adr_one_region adr_one_postalcode adr_one_countryname adr_two_street adr_two_street2 nc1 adr_two_locality adr_two_region adr_two_postalcode adr_two_countryname nc2 nc3 nc4 nc5 nc6 nc7 nc8 tel_assistent tel_fax tel_work tel_other nc9 tel_car nc10 tel_fax_home tel_home nc11 nc12 tel_cell nc13 nc14 tel_pager tel_prefer tel_cell_private nc15 nc16 nc17 nc18 nc19 nc20 nc21 role room email nc22 email_home nc23 nc24 nc25 nc26 bday nc27 nc28 nc29 freebusy_uri nc30 cat_id nc37 nc38 assistent nc39 note nc40 nc41 nc42 nc43 nc44 nc45 nc46 nc47 nc48 nc49 nc50 nc51 url + + 0 + FALSE + + |[9] |[10] cat(|[68]) |[73] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + admin + Importiert Kontakte von Microsoft Outlook + + + outlook_csv_export_german addressbook export_contacts_csv export From 0abbc55c490659588c9dac61ec00faeda8ea1b5f Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 31 Aug 2007 06:49:17 +0000 Subject: [PATCH 016/554] fixed bug reported on the user list: Warning wrong data type in line 184, added ldap extension check as it seems for many a surprise that ldap/ads auth needs it ;-) --- setup/check_install.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/setup/check_install.php b/setup/check_install.php index b93be4b53e..a08228b4ee 100644 --- a/setup/check_install.php +++ b/setup/check_install.php @@ -142,6 +142,10 @@ 'func' => 'extension_check', 'warning' => lang('The session extension is needed to use php sessions (db-sessions work without).') ), + 'ldap' => array( + 'func' => 'extension_check', + 'warning' => lang("The ldap extension is needed, if you use ldap as account or contact storage, authenticate against ldap or active directory. It's not needed for a standard SQL installation."), + ), '.' => array( 'func' => 'permission_check', 'is_world_writable' => False, @@ -181,6 +185,7 @@ $checks[$name]['from'] = array($checks[$name]['from']); } if (!isset($data['from'])) $data['from'] = $app; + if (!isset($checks[$name]['from']) || !is_array($checks[$name]['from'])) $checks[$name]['from'] = array(); if (!in_array($data['from'],$checks[$name]['from'])) $checks[$name]['from'][] = $data['from']; } else From 45e3088505f1d186fcd198fdcaa0df17c843453c Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 31 Aug 2007 06:59:32 +0000 Subject: [PATCH 017/554] set checked memory_limit to 24M, as 16M cries for problems, also added missing translations --- setup/check_install.php | 6 +++--- setup/lang/phpgw_ca.lang | 2 +- setup/lang/phpgw_cs.lang | 2 +- setup/lang/phpgw_de.lang | 4 +++- setup/lang/phpgw_en.lang | 4 +++- setup/lang/phpgw_es-es.lang | 2 +- setup/lang/phpgw_fi.lang | 2 +- setup/lang/phpgw_fr.lang | 2 +- setup/lang/phpgw_hr.lang | 2 +- setup/lang/phpgw_iw.lang | 2 +- setup/lang/phpgw_ko.lang | 2 +- setup/lang/phpgw_nl.lang | 2 +- setup/lang/phpgw_no.lang | 2 +- setup/lang/phpgw_pt-br.lang | 2 +- setup/lang/phpgw_pt.lang | 2 +- setup/lang/phpgw_sk.lang | 2 +- setup/lang/phpgw_sl.lang | 2 +- setup/lang/phpgw_sv.lang | 2 +- setup/lang/phpgw_zh-tw.lang | 2 +- 19 files changed, 25 insertions(+), 21 deletions(-) diff --git a/setup/check_install.php b/setup/check_install.php index a08228b4ee..35dca523af 100644 --- a/setup/check_install.php +++ b/setup/check_install.php @@ -83,10 +83,10 @@ ), 'memory_limit' => array( 'func' => 'php_ini_check', - 'value' => '16M', + 'value' => '24M', 'check' => '>=', - 'error' => lang('memory_limit is set to less than 16M: some applications of eGroupWare need more than the recommend 8M, expect occasional failures'), - 'change' => 'memory_limit = 16M' + 'error' => lang('memory_limit is set to less than %1: some applications of eGroupWare need more than the recommend 8M, expect occasional failures','24M'), + 'change' => 'memory_limit = 24M' ), 'max_execution_time' => array( 'func' => 'php_ini_check', diff --git a/setup/lang/phpgw_ca.lang b/setup/lang/phpgw_ca.lang index b37b701484..2ddae52f9d 100644 --- a/setup/lang/phpgw_ca.lang +++ b/setup/lang/phpgw_ca.lang @@ -282,7 +282,7 @@ mcrypt initialization vector setup ca Vector d' inicialitzaci mcrypt mode (default cbc) setup ca Modus Mcrypt (predeterminat: CBC) mcrypt settings (requires mcrypt php extension) setup ca Configuraci Mcrypt (necessita la extensi mcrypt de PHP) mcrypt version setup ca Versi Mcrypt -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup ca memory_limit te un valor menor de 16M: algunes aplicacions d'eGroupWare necessiten ms dels recomanats 8M. Es poden produir petades ocasionals +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup ca memory_limit te un valor menor de %1: algunes aplicacions d'eGroupWare necessiten ms dels recomanats 8M. Es poden produir petades ocasionals minimum account id (e.g. 500 or 100, etc.) setup ca Id mnim de compte (ex. 500 o 100, etc) minute setup ca minut missing or uncomplete mailserver configuration setup ca Configuraci del servidor de correu desconeguda o incompleta diff --git a/setup/lang/phpgw_cs.lang b/setup/lang/phpgw_cs.lang index f34659a287..b23d89ff86 100644 --- a/setup/lang/phpgw_cs.lang +++ b/setup/lang/phpgw_cs.lang @@ -342,7 +342,7 @@ mcrypt initialization vector setup cs Mcrypt inicializa mcrypt mode (default cbc) setup cs Mcyrpt reim (vchoz CBC) mcrypt settings (requires mcrypt php extension) setup cs Nastaven mcyrpt (vyaduje PHP rozen mcrypt) mcrypt version setup cs Verze mcrypt -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup cs Parametr memory_limit je nastaven na mn ne 16M: nkter aplikace eGroupWaru vyaduj vce ne doporuench 8M, oekvejte nahodil chyby +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup cs Parametr memory_limit je nastaven na mn ne %1: nkter aplikace eGroupWaru vyaduj vce ne doporuench 8M, oekvejte nahodil chyby migration between egroupware account repositories setup cs Migrace mezi databzemi eGroupWare t minimum account id (e.g. 500 or 100, etc.) setup cs Minimln id tu (nap. 500 nebo 100, atp.) minute setup cs minuta diff --git a/setup/lang/phpgw_de.lang b/setup/lang/phpgw_de.lang index 3b60e3fb3b..08bdcf691c 100644 --- a/setup/lang/phpgw_de.lang +++ b/setup/lang/phpgw_de.lang @@ -3,6 +3,7 @@ %1 created in %2. setup de %1 in %2 angelegt. %1 does not exist !!! setup de %1 existiert nicht!!! %1 is %2%3 !!! setup de %1 ist %2%3!!! +%1 is needed by: %2. setup de %1 wird von bentigt von: %2. %1, %2 or %3 the configuration file. setup de %1, %2 oder %3 der Konfigurationsdatei. '%1' is not allowed as %2. arguments of option %3 !!! setup de '%1' ist nicht erlaubt als %2. Parameter fr die Option %3 !!! (searching accounts and changing passwords) setup de Benutzerkonten suchen und Passwrter ndern) @@ -344,7 +345,7 @@ mcrypt initialization vector setup de MCrypt-Initialisierungsvektor mcrypt mode (default cbc) setup de MCrypt-Modus (Vorgabe CBC) mcrypt settings (requires mcrypt php extension) setup de MCrypt-Einstellungen (bentigt die mcrypt Erweiterung von PHP) mcrypt version setup de MCrypt-Version -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup de memory_limit (maximale Speicher fr ein Skript) ist auf weniger als 16M gesetzt: einige eGroupWare Anwendungen bentigen mehr als die empfohlenen 8M. Sie mssen mit gelegentlichen Fehlern rechnen. +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup de memory_limit (maximale Speicher fr ein Skript) ist auf weniger als %1 gesetzt: einige eGroupWare Anwendungen bentigen mehr als die empfohlenen 8M. Sie mssen mit gelegentlichen Fehlern rechnen. migration between egroupware account repositories setup de Migration zwischen versch. Orten zur Speicherung von eGroupWare Benutzern minimum account id (e.g. 500 or 100, etc.) setup de Minimum fr Benutzer-ID (z.B. 500 oder 100) minute setup de Minute @@ -520,6 +521,7 @@ the first step in installing egroupware is to ensure your environment has the ne the following applications need to be upgraded: setup de Die folgenden Anwendungen mssen aktualisiert werden: the function %1 is needed from: %2. setup de Die Funktion %1 wird bentigt von: %2. the imagecreatefromjpeg function is supplied by the gd extension (complied with jpeg support!). it's needed to upload photos for contacts. setup de Die imagecreatefromjpeg Funktion wird bereitgestellt von der gd Erweiterung (compiliert mit jpeg Untersttzung!). Sie wird bentigt um Fotos fr Kontakte hoch zu laden. +the ldap extension is needed, if you use ldap as account or contact storage, authenticate against ldap or active directory. it's not needed for a standard sql installation. setup de Die ldap Erweiterung (php extension) wird bentigt fr LDAP as Benutzer oder Addressen Speicher, um gegen LDAP oder Aktive Directory zu authetifizieren. Es wird nicht bentigt fr eine standard SQL Installation. the mbstring extension is needed to fully support unicode (utf-8) or other multibyte-charsets. setup de Die mbstring Erweiterung (php extension) ist notwendig um Unicode (utf-8) oder andere mehr-byte (multibyte) Zeichenstze vollstndig zu untersttzen. the mbstring.func_overload = 7 is needed to fully support unicode (utf-8) or other multibyte-charsets. setup de Die Einstellung mbstring.func_overload = 7 ist notwendig um Unicode (utf-8) oder andere mehr-byte (multibyte) Zeichenstze vollstndig zu untersttzen. the session extension is needed to use php sessions (db-sessions work without). setup de Die session Erweiterung (php extension) ist notwendig fr PHP Sessions (Datenbank Sessions arbeiten ohne diese). diff --git a/setup/lang/phpgw_en.lang b/setup/lang/phpgw_en.lang index 05d6949794..dd9226af2e 100644 --- a/setup/lang/phpgw_en.lang +++ b/setup/lang/phpgw_en.lang @@ -3,6 +3,7 @@ %1 created in %2. setup en %1 created in %2. %1 does not exist !!! setup en %1 does not exist !!! %1 is %2%3 !!! setup en %1 is %2%3 !!! +%1 is needed by: %2. setup en %1 is needed by: %2. %1, %2 or %3 the configuration file. setup en %1, %2 or %3 the configuration file. '%1' is not allowed as %2. arguments of option %3 !!! setup en '%1' is not allowed as %2. arguments of option %3 !!! (searching accounts and changing passwords) setup en (searching accounts and changing passwords) @@ -342,7 +343,7 @@ mcrypt initialization vector setup en MCrypt initialization vector mcrypt mode (default cbc) setup en Mcrypt mode (default CBC) mcrypt settings (requires mcrypt php extension) setup en Mcrypt Settings (requires mcrypt PHP extension) mcrypt version setup en MCrypt version -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup en memory_limit is set to less than 16M: some applications of eGroupWare need more than the recommend 8M, expect occasional failures +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup en memory_limit is set to less than %1: some applications of eGroupWare need more than the recommend 8M, expect occasional failures migration between egroupware account repositories setup en Migration between eGroupWare account repositories minimum account id (e.g. 500 or 100, etc.) setup en Minimum account id (e.g. 500 or 100, etc.) minute setup en minute @@ -518,6 +519,7 @@ the first step in installing egroupware is to ensure your environment has the ne the following applications need to be upgraded: setup en The following applications need to be upgraded: the function %1 is needed from: %2. setup en The function %1 is needed from: %2. the imagecreatefromjpeg function is supplied by the gd extension (complied with jpeg support!). it's needed to upload photos for contacts. setup en The imagecreatefromjpeg function is supplied by the gd extension (complied with jpeg support!). It's needed to upload photos for contacts. +the ldap extension is needed, if you use ldap as account or contact storage, authenticate against ldap or active directory. it's not needed for a standard sql installation. setup en The ldap extension is needed, if you use ldap as account or contact storage, authenticate against ldap or active directory. It's not needed for a standard SQL installation. the mbstring extension is needed to fully support unicode (utf-8) or other multibyte-charsets. setup en The mbstring extension is needed to fully support unicode (utf-8) or other multibyte-charsets. the mbstring.func_overload = 7 is needed to fully support unicode (utf-8) or other multibyte-charsets. setup en The mbstring.func_overload = 7 is needed to fully support unicode (utf-8) or other multibyte-charsets. the session extension is needed to use php sessions (db-sessions work without). setup en The session extension is needed to use php sessions (db-sessions work without). diff --git a/setup/lang/phpgw_es-es.lang b/setup/lang/phpgw_es-es.lang index 3cef37cf7e..e798526750 100644 --- a/setup/lang/phpgw_es-es.lang +++ b/setup/lang/phpgw_es-es.lang @@ -344,7 +344,7 @@ mcrypt initialization vector setup es-es Vector de inicializaci mcrypt mode (default cbc) setup es-es Modo de MCrypt (predeterminado CBC) mcrypt settings (requires mcrypt php extension) setup es-es Configuracin de MCrypt (necesita la extensin PHP mcrypt) mcrypt version setup es-es Versin de MCrypt -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup es-es memory_limit est puesto a menos de 16M. Algunas aplicaciones de eGroupWare necesitan ms de los recomendados 8M, as que puede haber fallos ocasionales +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup es-es memory_limit est puesto a menos de %1. Algunas aplicaciones de eGroupWare necesitan ms de los recomendados 8M, as que puede haber fallos ocasionales migration between egroupware account repositories setup es-es Migracin entre repositorios de cuentas de eGroupWare minimum account id (e.g. 500 or 100, etc.) setup es-es Id mnimo para la cuenta (p. ej. 500 100, etc) minute setup es-es minuto diff --git a/setup/lang/phpgw_fi.lang b/setup/lang/phpgw_fi.lang index 24cadba201..3d0178903d 100644 --- a/setup/lang/phpgw_fi.lang +++ b/setup/lang/phpgw_fi.lang @@ -293,7 +293,7 @@ mcrypt initialization vector setup fi MCryptin alustusvektori mcrypt mode (default cbc) setup fi Mcrypt-tila (default CBC) mcrypt settings (requires mcrypt php extension) setup fi Mcrypt-asetukset (tarvitaan PHP:n mcrypt-laajennus) mcrypt version setup fi MCrypt-versio -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup fi memory_limit-asetus on alle 16M: jotkin sovellukset tarvitsevat muistia enemmn kuin PHP:n oletus 8m, voit odottaa ongelmia. +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup fi memory_limit-asetus on alle %1: jotkin sovellukset tarvitsevat muistia enemmn kuin PHP:n oletus 8m, voit odottaa ongelmia. minimum account id (e.g. 500 or 100, etc.) setup fi Kyttjtunnisteen minimiarvo (esim. 500 tai 100, jne.) minute setup fi minuutti missing or uncomplete mailserver configuration setup fi Postipalvelimen asetukset puuttuvat tai ovat vajaat diff --git a/setup/lang/phpgw_fr.lang b/setup/lang/phpgw_fr.lang index 27685c2f41..4c17d91240 100644 --- a/setup/lang/phpgw_fr.lang +++ b/setup/lang/phpgw_fr.lang @@ -342,7 +342,7 @@ mcrypt initialization vector setup fr Vecteur d'initialisation MCrypt mcrypt mode (default cbc) setup fr Mode Mcrypt (par dfaut CBC) mcrypt settings (requires mcrypt php extension) setup fr Rglages Mcrypt (ncessite l'extension PHP mcrypt) mcrypt version setup fr Version de MCrypt -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup fr L'option memory_limit est positionne en dessous de 16M:
certaines applications ont requirent plus de 8M, ceci peut entraner des problmes. +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup fr L'option memory_limit est positionne en dessous de %1:
certaines applications ont requirent plus de 8M, ceci peut entraner des problmes. migration between egroupware account repositories setup fr Migration entre les dpts de comptes eGroupWare minimum account id (e.g. 500 or 100, etc.) setup fr ID de compte minimum (p.e. 500 ou 100, etc.) minute setup fr minute diff --git a/setup/lang/phpgw_hr.lang b/setup/lang/phpgw_hr.lang index cfa059d760..d123af790c 100755 --- a/setup/lang/phpgw_hr.lang +++ b/setup/lang/phpgw_hr.lang @@ -236,7 +236,7 @@ mcrypt initialization vector setup hr MCrypt initialization vector mcrypt mode (default cbc) setup hr Mcrypt mode (default CBC) mcrypt settings (requires mcrypt php extension) setup hr Mcrypt Settings (requires mcrypt PHP extension) mcrypt version setup hr MCrypt version -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup hr memory_limit is set to less than 16M: some applications of eGroupWare need more than the recommend 8M, expect occasional failures +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup hr memory_limit is set to less than %1: some applications of eGroupWare need more than the recommend 8M, expect occasional failures minimum account id (e.g. 500 or 100, etc.) setup hr Minimum account id (e.g. 500 or 100, etc.) modifications have been completed! setup hr Modifications have been completed! modify setup hr Modify diff --git a/setup/lang/phpgw_iw.lang b/setup/lang/phpgw_iw.lang index e502057f6b..63e94728df 100755 --- a/setup/lang/phpgw_iw.lang +++ b/setup/lang/phpgw_iw.lang @@ -248,7 +248,7 @@ mcrypt initialization vector setup iw MCrypt וקטור אתחול של mcrypt mode (default cbc) setup iw (CBC ברירת מחדל) MCrypt מצב של mcrypt settings (requires mcrypt php extension) setup iw (php של mcrypt מחייב הרחבות) MCrypt הגדרות mcrypt version setup iw MCrypt גירסת -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup iw :מגבלת הזכרון נקבע כפחות מ-16 מ"ב +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup iw :מגבלת הזכרון נקבע כפחות מ-16 מ"ב שזקוקים ליותר מה-8 מ"ב המומלץ, תצפה לבעיות לעתים eGroupWare ישנם יישומים של minimum account id (e.g. 500 or 100, etc.) setup iw ('זיהוי חשבון מיזערי (למשל 500 או 100, וכו modifications have been completed! setup iw !השינוים הושלמו diff --git a/setup/lang/phpgw_ko.lang b/setup/lang/phpgw_ko.lang index 3ac3633de2..4b609f4343 100644 --- a/setup/lang/phpgw_ko.lang +++ b/setup/lang/phpgw_ko.lang @@ -236,7 +236,7 @@ mcrypt initialization vector setup ko MCrypt mcrypt mode (default cbc) setup ko Mcrypt (⺻ CBC) mcrypt settings (requires mcrypt php extension) setup ko Mcrypt (mcrypt PHP Ȯ忡 ʿ) mcrypt version setup ko MCrypt -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup ko memory_limit 16MϷ Ǿ ֽϴ: eGroupWare Ư α׷ 8M̻ ֽϴ, ϴ Դϴ +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup ko memory_limit %1Ϸ Ǿ ֽϴ: eGroupWare Ư α׷ 8M̻ ֽϴ, ϴ Դϴ minimum account id (e.g. 500 or 100, etc.) setup ko ּ ID ( 500 100, Ÿ.) modifications have been completed! setup ko ϷǾϴ! modify setup ko diff --git a/setup/lang/phpgw_nl.lang b/setup/lang/phpgw_nl.lang index 6c96f6f632..b98dae0f0d 100644 --- a/setup/lang/phpgw_nl.lang +++ b/setup/lang/phpgw_nl.lang @@ -277,7 +277,7 @@ mcrypt initialization vector setup nl MCrypt initialisatie vector mcrypt mode (default cbc) setup nl MCrypt modus (standaard CBC) mcrypt settings (requires mcrypt php extension) setup nl MCrypt instellingen (vereist de mcrypt PHP extensie) mcrypt version setup nl MCrypt versie -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup nl memory_limit is ingesteld op minder dan 16M; sommige toepassingen van eGroupWare hebben meer nodig dan de aanbevolen 8M, reken er dus op at er af en toe fouten optreden +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup nl memory_limit is ingesteld op minder dan %1; sommige toepassingen van eGroupWare hebben meer nodig dan de aanbevolen 8M, reken er dus op at er af en toe fouten optreden minimum account id (e.g. 500 or 100, etc.) setup nl Minimum account ID (voorbeeld: 500 of 100, enz.) minute setup nl minuut modifications have been completed! setup nl Aanpassingen zijn voltooid! diff --git a/setup/lang/phpgw_no.lang b/setup/lang/phpgw_no.lang index 9af90c0e51..e0dabc95fd 100644 --- a/setup/lang/phpgw_no.lang +++ b/setup/lang/phpgw_no.lang @@ -268,7 +268,7 @@ mcrypt initialization vector setup no MCrypt initialisasjonsvektor mcrypt mode (default cbc) setup no MCrypt-lge (Default CBC) mcrypt settings (requires mcrypt php extension) setup no MCryptinstllningar (krver mcrypt PHP extension) mcrypt version setup no MCrypt-versjon -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup no memory_limit r satt till mindre n 16MB. En del applikationer i eGroupWare krver mer n de rekommenderade 8 MB. Frvnta dig problem emellant. +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup no memory_limit r satt till mindre n %1B. En del applikationer i eGroupWare krver mer n de rekommenderade 8 MB. Frvnta dig problem emellant. minimum account id (e.g. 500 or 100, etc.) setup no Minimum kontoID (dvs 500 eller 100 t ex) minute setup no Minutt modifications have been completed! setup no Frndringarna genomfrda diff --git a/setup/lang/phpgw_pt-br.lang b/setup/lang/phpgw_pt-br.lang index 129c39cc30..83950b0389 100644 --- a/setup/lang/phpgw_pt-br.lang +++ b/setup/lang/phpgw_pt-br.lang @@ -341,7 +341,7 @@ mcrypt initialization vector setup pt-br Vetor de inicia mcrypt mode (default cbc) setup pt-br Modo Mcrypt (padro CBC) mcrypt settings (requires mcrypt php extension) setup pt-br Configuraes para Mcrypt (requer extenso mcrypt do PHP) mcrypt version setup pt-br Verso do MCrypt -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup pt-br O Valor de limite de memria est menor que 16M. Alguns aplicativos do eGroupware necessitam mais que os 8M recomendados. possvel que ocorram problemas. +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup pt-br O Valor de limite de memria est menor que %1. Alguns aplicativos do eGroupware necessitam mais que os 8M recomendados. possvel que ocorram problemas. migration between egroupware account repositories setup pt-br Migrao entre respositrios de contas do eGroupWare minimum account id (e.g. 500 or 100, etc.) setup pt-br Id mnimo para contas (Exemplo: 500 ou 100, etc.) minute setup pt-br minuto diff --git a/setup/lang/phpgw_pt.lang b/setup/lang/phpgw_pt.lang index b64e995fa0..4168ac66a0 100644 --- a/setup/lang/phpgw_pt.lang +++ b/setup/lang/phpgw_pt.lang @@ -291,7 +291,7 @@ mcrypt initialization vector setup pt Vector de inicializa mcrypt mode (default cbc) setup pt Modo Mcrypt (por omisso CBC) mcrypt settings (requires mcrypt php extension) setup pt Configuraes para Mcrypt (requer extenso mcrypt do PHP) mcrypt version setup pt Verso MCrypt -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup pt O limite de memria (memory_limit) est configurado para menos de 16M: algumas aplicaes do eGroupWare necessitam de mais de 8M. Espere falhas ocasionais. +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup pt O limite de memria (memory_limit) est configurado para menos de %1: algumas aplicaes do eGroupWare necessitam de mais de 8M. Espere falhas ocasionais. minimum account id (e.g. 500 or 100, etc.) setup pt Id mnimo para contas (Exemplo: 500 ou 100, etc.) minute setup pt Minuto missing or uncomplete mailserver configuration setup pt Configurao do servidor de correio electrnico em falta ou por concluir diff --git a/setup/lang/phpgw_sk.lang b/setup/lang/phpgw_sk.lang index 906d0c7d13..a8c147da54 100644 --- a/setup/lang/phpgw_sk.lang +++ b/setup/lang/phpgw_sk.lang @@ -326,7 +326,7 @@ mcrypt initialization vector setup sk MCrypt inicializa mcrypt mode (default cbc) setup sk MCrypt reim (predvolen CBC) mcrypt settings (requires mcrypt php extension) setup sk Nastavenia MCrypt (vyaduje mcrypt PHP rozrenie) mcrypt version setup sk Verzia MCrypt -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup sk pamov limit je nastaven na menej ne 16M; niektor aplikcie v eGroupWare potrebuj viac ne odporanch 8M, okrem vnimonch zlyhan +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup sk pamov limit je nastaven na menej ne %1; niektor aplikcie v eGroupWare potrebuj viac ne odporanch 8M, okrem vnimonch zlyhan migration between egroupware account repositories setup sk Migrcia medzi zdrojmi eGroupWare tov minimum account id (e.g. 500 or 100, etc.) setup sk Najmenie ID tu (napr. 500 alebo 100, at.) minute setup sk minta diff --git a/setup/lang/phpgw_sl.lang b/setup/lang/phpgw_sl.lang index 536e412b2a..4a7bd52a33 100644 --- a/setup/lang/phpgw_sl.lang +++ b/setup/lang/phpgw_sl.lang @@ -328,7 +328,7 @@ mcrypt initialization vector setup sl Mcrypt začetni vektor mcrypt mode (default cbc) setup sl Mcrypt način (privzeto CBC) mcrypt settings (requires mcrypt php extension) setup sl Mcrypt nastavitve (zahteva mcrypt razširitev PHPja) mcrypt version setup sl Različica mcrypt -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup sl Omejitev spomina (memory_limit) je nastavljena na manj kot 16 Mb: nekatere aplikacije v eGW potrebujejo več kot priporočljivih 8 Mb zato se lahko pojavijo občasne napake +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup sl Omejitev spomina (memory_limit) je nastavljena na manj kot 16 Mb: nekatere aplikacije v eGW potrebujejo več kot priporočljivih 8 Mb zato se lahko pojavijo občasne napake minimum account id (e.g. 500 or 100, etc.) setup sl Najnižji ID računa (npr. 500 ali 100) minute setup sl minuta missing or uncomplete mailserver configuration setup sl Manjkajoča ali nepopolna konfiguracija poštnega strežnika diff --git a/setup/lang/phpgw_sv.lang b/setup/lang/phpgw_sv.lang index 8ebb7b7504..2715963996 100644 --- a/setup/lang/phpgw_sv.lang +++ b/setup/lang/phpgw_sv.lang @@ -338,7 +338,7 @@ mcrypt initialization vector setup sv MCrypt initialisationsvektor mcrypt mode (default cbc) setup sv MCrypt (standard CBC) mcrypt settings (requires mcrypt php extension) setup sv MCrypt alternativ (krver MCrypt PHP utkning) mcrypt version setup sv MCrypt version -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup sv memory_limit r satt till mindre n 16MB. En del applikationer i eGroupWare krver mer n de rekommenderade 8 MB. Frvnta dig problem emellant. +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup sv memory_limit r satt till mindre n %1B. En del applikationer i eGroupWare krver mer n de rekommenderade 8 MB. Frvnta dig problem emellant. migration between egroupware account repositories setup sv Migrering mellan eGroupWare kontodatabaser minimum account id (e.g. 500 or 100, etc.) setup sv Minimum kontoID (dvs 500 eller 100 t ex) minute setup sv Minut diff --git a/setup/lang/phpgw_zh-tw.lang b/setup/lang/phpgw_zh-tw.lang index 5b62235ad5..48d12e8d57 100644 --- a/setup/lang/phpgw_zh-tw.lang +++ b/setup/lang/phpgw_zh-tw.lang @@ -336,7 +336,7 @@ mcrypt initialization vector setup zh-tw MCrypt 組態依據 mcrypt mode (default cbc) setup zh-tw Mcrypt 模式 (預設為 CBC) mcrypt settings (requires mcrypt php extension) setup zh-tw Mcrypt 設定 (需要 mcrypt 的PHP 擴充) mcrypt version setup zh-tw MCrypt 版本 -memory_limit is set to less than 16m: some applications of egroupware need more than the recommend 8m, expect occasional failures setup zh-tw memory_limit(最大可存取記憶體)設定小於16M:eGroupWare有部份應用程式會使用超過預設值8M的記憶體存取,特別是無法預期的錯誤 +memory_limit is set to less than %1: some applications of egroupware need more than the recommend 8m, expect occasional failures setup zh-tw memory_limit(最大可存取記憶體)設定小於%1:eGroupWare有部份應用程式會使用超過預設值8M的記憶體存取,特別是無法預期的錯誤 migration between egroupware account repositories setup zh-tw 轉移 eGroupWare 帳號資料庫 minimum account id (e.g. 500 or 100, etc.) setup zh-tw 使用者帳號編碼最小值﹝如:500 或 100﹞ minute setup zh-tw 分 From a4a85097a4c48fac167252cd51fc26a47f538404 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Wed, 5 Sep 2007 06:27:35 +0000 Subject: [PATCH 018/554] fix of small typo in the switching of the export definition fields --- addressbook/inc/class.uicontacts.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addressbook/inc/class.uicontacts.inc.php b/addressbook/inc/class.uicontacts.inc.php index 8a03284362..b372a28bb9 100644 --- a/addressbook/inc/class.uicontacts.inc.php +++ b/addressbook/inc/class.uicontacts.inc.php @@ -502,7 +502,7 @@ class uicontacts extends bocontacts $fields = $this->business_contact_fields; break; case 'home': - $fields = $this-home_contact_fields; + $fields = $this->home_contact_fields; break; default: $fields = $this->contact_fields; From 820bb9b59259b4a0a4c8d325b7e24c183be3c32f Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 5 Sep 2007 07:50:10 +0000 Subject: [PATCH 019/554] calculation of rfc822 dates was not working with half hour time zones used eg. in Australia, set smtp timeout to 30s, as there are multiple reports 10s is to less --- phpgwapi/inc/class.phpmailer.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpgwapi/inc/class.phpmailer.inc.php b/phpgwapi/inc/class.phpmailer.inc.php index a4a8bb39ef..25e28a9eb0 100644 --- a/phpgwapi/inc/class.phpmailer.inc.php +++ b/phpgwapi/inc/class.phpmailer.inc.php @@ -191,7 +191,7 @@ class PHPMailer * work with the win32 version. * @var int */ - var $Timeout = 10; + var $Timeout = 30; /** * Sets SMTP class debugging on or off. @@ -1468,7 +1468,7 @@ class PHPMailer $tz = date("Z"); $tzs = ($tz < 0) ? "-" : "+"; $tz = abs($tz); - $tz = ($tz/3600)*100 + ($tz%3600)/60; + $tz = (int)($tz/3600)*100 + ($tz%3600)/60; $result = sprintf("%s %s%04d", date("D, j M Y H:i:s"), $tzs, $tz); return $result; From cb5e205d6667cecfdea81a0d9a524f382255d917 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 6 Sep 2007 11:14:12 +0000 Subject: [PATCH 020/554] "added missing \"None\" label for contact-type" --- etemplate/inc/class.contact_widget.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/etemplate/inc/class.contact_widget.inc.php b/etemplate/inc/class.contact_widget.inc.php index 7c511bbe61..ef8937b7fe 100644 --- a/etemplate/inc/class.contact_widget.inc.php +++ b/etemplate/inc/class.contact_widget.inc.php @@ -90,6 +90,7 @@ class contact_widget } $cell['type'] = 'select'; $cell['no_lang'] = 1; + $cell['size'] = 'None'; break; case 'contact-account': From f21e357253e7aea18d39f32f954d072ab1912dc9 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 6 Sep 2007 11:56:37 +0000 Subject: [PATCH 021/554] fixed not working direct sql-updates (eg. 'etag=etag+1') via so_sql::save's parameter --- etemplate/inc/class.so_sql.inc.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/etemplate/inc/class.so_sql.inc.php b/etemplate/inc/class.so_sql.inc.php index 76ece2d41d..4b5ed97200 100644 --- a/etemplate/inc/class.so_sql.inc.php +++ b/etemplate/inc/class.so_sql.inc.php @@ -422,6 +422,14 @@ class so_sql } $data[$db_col] = (string) $this->data[$col] === '' && $this->empty_on_write == 'NULL' ? null : $this->data[$col]; } + // allow to add direct sql updates, eg. "etag=etag+1" with int keys + if (is_array($keys) && isset($keys[0])) + { + for($n=0; isset($keys[$n]); ++$n) + { + $data[] = $keys[$n]; + } + } $keys = ''; foreach($this->db_key_cols as $db_col => $col) { From 1055642df3666a32c55b0c8631be019de5a87b54 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 6 Sep 2007 11:59:35 +0000 Subject: [PATCH 022/554] fixed not working autorepeated rows with , added id's to (content of) labels and images --- etemplate/inc/class.boetemplate.inc.php | 6 +++--- etemplate/inc/class.uietemplate.inc.php | 21 ++++++++++++--------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/etemplate/inc/class.boetemplate.inc.php b/etemplate/inc/class.boetemplate.inc.php index 3411ec8a28..e1e4be9d8b 100644 --- a/etemplate/inc/class.boetemplate.inc.php +++ b/etemplate/inc/class.boetemplate.inc.php @@ -194,11 +194,11 @@ * @param boolean $check_col to check for col- or row-autorepeat * @return boolean true if cell is autorepeat (has index with vars / '$') or false otherwise */ - function autorepeat_idx($cell,$c,$r,&$idx,&$idx_cname,$check_col=False) + function autorepeat_idx($cell,$c,$r,&$idx,&$idx_cname,$check_col=False,$cont=null) { $org_idx = $idx = $cell[ $cell['type'] == 'template' ? 'size' : 'name' ]; - $idx = $this->expand_name($idx,$c,$r); + $idx = $this->expand_name($idx,$c,$r,'','',$cont); if (!($komma = strpos($idx,','))) { $idx_cname = $idx; @@ -222,7 +222,7 @@ else { $Ok = $pat[0] == 'r' && !(substr($pat,0,2) == 'r_' || - substr($pat,0,4) == 'row_' && substr($pat,0,8) != 'row_cont'); + substr($pat,0,4) == 'row_'); } } if ($this->name && $this->name == $this->debug) diff --git a/etemplate/inc/class.uietemplate.inc.php b/etemplate/inc/class.uietemplate.inc.php index bc04415b25..d1f0babd9e 100644 --- a/etemplate/inc/class.uietemplate.inc.php +++ b/etemplate/inc/class.uietemplate.inc.php @@ -664,9 +664,9 @@ foreach($sess as $key => $val) { if (!(list($r_key) = each($data))) // no further row { - if (!(($this->autorepeat_idx($cols['A'],0,$r,$idx,$idx_cname) && $idx_cname) || - (substr($cols['A']['type'],1) == 'box' && $this->autorepeat_idx($cols['A'][1],0,$r,$idx,$idx_cname) && $idx_cname) || - ($this->autorepeat_idx($cols['B'],1,$r,$idx,$idx_cname) && $idx_cname)) || + if (!(($this->autorepeat_idx($cols['A'],0,$r,$idx,$idx_cname,false,$content) && $idx_cname) || + (substr($cols['A']['type'],1) == 'box' && $this->autorepeat_idx($cols['A'][1],0,$r,$idx,$idx_cname,false,$content) && $idx_cname) || + ($this->autorepeat_idx($cols['B'],1,$r,$idx,$idx_cname,false,$content) && $idx_cname)) || !$this->isset_array($content,$idx_cname)) { break; // no auto-row-repeat @@ -706,7 +706,7 @@ foreach($sess as $key => $val) // otherwise the rows have a differen number of cells and it saved a lot checks if ($c >= $max_cols) { - if (!$this->autorepeat_idx($cell,$c,$r,$idx,$idx_cname,True) || + if (!$this->autorepeat_idx($cell,$c,$r,$idx,$idx_cname,True,$content) || !$this->isset_array($content,$idx)) { break; // no auto-col-repeat @@ -1015,7 +1015,8 @@ foreach($sess as $key => $val) if ($activate_links) $value = $this->html->activate_links($value); if ($value != '' && $style && strpos($style,'b')!==false) $value = $this->html->bold($value); if ($value != '' && $style && strpos($style,'i')!==false) $value = $this->html->italic($value); - $html .= $value; + // if the label has a name, use it as id in a span, to allow addressing it via javascript + $html .= ($name ? '' : '').$value.($name ? '' : ''); if ($help) { $class = array( @@ -1039,6 +1040,7 @@ foreach($sess as $key => $val) } if (($type == 'float' || !is_numeric($pre)) && $value && $pre) { + $value = str_replace(array(' ',','),array('','.'),$value); $value = is_numeric($pre) ? round($value,$pre) : sprintf($pre,$value); } $cell_options .= ',,'.($cell['type'] == 'int' ? '/^-?[0-9]*$/' : '/^-?[0-9]*[,.]?[0-9]*$/'); @@ -1280,7 +1282,7 @@ foreach($sess as $key => $val) { echo "

show_cell::template(tpl=$this->name,name=$cell[name]): $obj_read, readonly=$readonly

\n"; } - if ($this->autorepeat_idx($cell,$show_c,$show_row,$idx,$idx_cname) || $cell_options != '') + if ($this->autorepeat_idx($cell,$show_c,$show_row,$idx,$idx_cname,false,$content) || $cell_options != '') { if ($span == '' && isset($content[$idx]['span'])) { // this allows a colspan in autorepeated cells like the editor @@ -1392,7 +1394,7 @@ foreach($sess as $key => $val) } } break; - case 'image': // size: [link],[link_target],[imagemap],[link_popup] + case 'image': // size: [link],[link_target],[imagemap],[link_popup],[id] $image = $value != '' ? $value : $name; list($app,$img) = explode('/',$image,2); if (!$app || !$img || !is_dir(EGW_SERVER_ROOT.'/'.$app) || strpos($img,'/')!==false) @@ -1402,10 +1404,11 @@ foreach($sess as $key => $val) } if (!$readonly) { - list($extra_link,$extra_link_target,$imagemap,$extra_link_popup) = explode(',',$cell['size']); + list($extra_link,$extra_link_target,$imagemap,$extra_link_popup,$id) = explode(',',$cell['size']); } $html .= $this->html->image($app,$img,strlen($label) > 1 && !$cell['no_lang'] ? lang($label) : $label, - 'border="0"'.($imagemap?' usemap="'.$this->html->htmlspecialchars($imagemap).'"':'')); + 'border="0"'.($imagemap?' usemap="'.$this->html->htmlspecialchars($imagemap).'"':''). + ($id || $value ? ' id="'.($id ? $id : $name).'"' : '')); $extra_label = False; break; case 'file': // size: size of the filename field From a10101d640e02128a80f711cb078683327a64f16 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Wed, 12 Sep 2007 13:17:02 +0000 Subject: [PATCH 023/554] Fix for a problem with cumulating timesheets when the linking application is other than initiated by $app1, means for whom link_app1=$app1 and app1 being the application passed on in the get_3links function parameter list. --- phpgwapi/inc/class.solink.inc.php | 48 ++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/phpgwapi/inc/class.solink.inc.php b/phpgwapi/inc/class.solink.inc.php index dc4bad0dcb..8bd739e2da 100644 --- a/phpgwapi/inc/class.solink.inc.php +++ b/phpgwapi/inc/class.solink.inc.php @@ -353,16 +353,42 @@ class solink function get_3links($app,$target_app,$target_id=null) { $links = array(); - $this->db->select($this->link_table,'c.*,b.link_app1 AS app3,b.link_id1 AS id3,b.link_id AS link3', - 'a.link_app1='.$this->db->quote($app).' AND c.link_app2='.$this->db->quote($target_app). - (!$target_id ? '' : $this->db->expression($this->link_table,' AND c.',array('link_id2' => $target_id))), - __LINE__,__FILE__,false,'',false,0," a - JOIN $this->link_table b ON a.link_id2=b.link_id1 AND a.link_app2=b.link_app1 - JOIN $this->link_table c ON a.link_id1=c.link_id1 AND a.link_app1=c.link_app1 AND a.link_id!=c.link_id AND c.link_app2=b.link_app2 AND c.link_id2=b.link_id2"); - while (($row = $this->db->row(true,'link_'))) - { - $links[] = $row; - } - return $links; + $table_def = $this->db->get_table_definitions('phpgwapi',$this->link_table); + $arrayofselects=array( + // retrieve the type of links, where the relation is realized as timesheet->infolog/tracker via infolog->projectmanager to timesheet->projectmanager + array('table'=>$this->link_table, + 'cols'=>'c.*,b.link_app1 AS app3,b.link_id1 AS id3,b.link_id AS link3', + 'where'=>'a.link_app1='.$this->db->quote($app).' AND c.link_app2='.$this->db->quote($target_app). + (!$target_id ? '' : $this->db->expression($this->link_table,' AND c.',array('link_id2' => $target_id))), + 'join'=>" a + JOIN $this->link_table b ON a.link_id2=b.link_id1 AND a.link_app2=b.link_app1 + JOIN $this->link_table c ON a.link_id1=c.link_id1 AND a.link_app1=c.link_app1 AND a.link_id!=c.link_id AND c.link_app2=b.link_app2 AND c.link_id2=b.link_id2", + 'table_def'=>$table_def + ), + // retrieve the type of links, where the relation is realized as timesheet->infolog/tracker and projectmanager->timesheet + array('table'=>$this->link_table, + 'cols'=>'b.link_id, b.link_app2 as app1, b.link_id2 as id1, b.link_app1 as app2, b.link_id1 as id2, b.link_remark,b.link_lastmod,b.link_owner,c.link_app1 AS app3,c.link_id1 AS id3,c.link_id AS link3', + 'where'=>'a.link_app1='.$this->db->quote($app).' AND b.link_app1='.$this->db->quote($target_app). + (!$target_id ? '' : $this->db->expression($this->link_table,' AND b.',array('link_id1' => $target_id))), + 'join'=>" a + JOIN $this->link_table b ON a.link_id1=b.link_id2 AND a.link_app1=b.link_app2 + JOIN egw_links c ON a.link_id2=c.link_id1 AND a.link_app2=c.link_app1 AND a.link_id!=c.link_id AND c.link_app2=b.link_app1 AND c.link_id2=b.link_id1", + 'table_def'=>$table_def), + // retrieve the type of links, where the relation is realized as timesheet->projectmanager and infolog->timesheet + array('table'=>$this->link_table, + 'cols'=>'a.*,c.link_app1 AS app3,c.link_id1 AS id3,c.link_id AS link3', + 'where'=>'a.link_app1='.$this->db->quote($app).' AND a.link_app2='.$this->db->quote($target_app). + (!$target_id ? '' : $this->db->expression($this->link_table,' AND a.',array('link_id2' => $target_id))), + 'join'=>" a + JOIN $this->link_table b ON a.link_id1=b.link_id2 AND a.link_app1=b.link_app2 + JOIN egw_links c ON a.link_id2=c.link_id2 AND a.link_app2=c.link_app2 AND a.link_id!=c.link_id AND c.link_app1=b.link_app1 AND c.link_id1=b.link_id1", + 'table_def'=>$table_def), + ); + $this->db->union($arrayofselects,__LINE__,__FILE__); + while (($row = $this->db->row(true,'link_'))) + { + $links[] = $row; + } + return $links; } } From 61270a0e0fa21fe3ecec3ded201e0dcd2d351494 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 13 Sep 2007 08:12:56 +0000 Subject: [PATCH 024/554] fixed two mail2infolog problems: 1. instead of default status of email type done was used, 2. long lines of line-chars (-_+=~) stalled the infolog layout, they get now truncated to 40 of these chars --- infolog/inc/class.boinfolog.inc.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/infolog/inc/class.boinfolog.inc.php b/infolog/inc/class.boinfolog.inc.php index 984a8a99e4..b151e7ecc5 100644 --- a/infolog/inc/class.boinfolog.inc.php +++ b/infolog/inc/class.boinfolog.inc.php @@ -125,6 +125,13 @@ class boinfolog * @var infolog_tracking */ var $tracking; + /** + * Maximum number of line characters (-_+=~) allowed in a mail, to not stall the layout. + * Longer lines / biger number of these chars are truncated to that max. number or chars. + * + * @var int + */ + var $max_line_chars = 40; /** * Constructor Infolog BO @@ -875,15 +882,19 @@ class boinfolog trim($address->host)); $name[] = !empty($address->personal) ? $address->personal : $emailadr; } + // shorten long (> $this->max_line_chars) lines of "line" chars (-_+=~) in mails + $_message = preg_replace_callback('/[-_+=~]{'.$this->max_line_chars.',}/m', + create_function('$matches',"return substr(\$matches[0],0,$this->max_line_chars);"),$_message); + $type = isset($this->enums['type']['email']) ? 'email' : 'note'; $info = array( 'info_id' => 0, - 'info_type' => isset($this->enums['type']['email']) ? 'email' : 'note', + 'info_type' => $type, 'info_from' => implode(',',$name), 'info_addr' => implode(',',$email), 'info_subject' => $_subject, 'info_des' => $_message, 'info_startdate' => $_date, - 'info_status' => 'done', + 'info_status' => isset($this->status['defaults'][$type]) ? $this->status['defaults'][$type] : 'done', 'info_priority' => 1, 'info_percent' => 100, 'referer' => false, From 9fa586cb737ddbeba1b856275f01fa543ecf3a51 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 13 Sep 2007 09:17:47 +0000 Subject: [PATCH 025/554] 100% done causes status to set to done again in mail2infolog --- infolog/inc/class.boinfolog.inc.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/infolog/inc/class.boinfolog.inc.php b/infolog/inc/class.boinfolog.inc.php index b151e7ecc5..0ddeaf8495 100644 --- a/infolog/inc/class.boinfolog.inc.php +++ b/infolog/inc/class.boinfolog.inc.php @@ -883,9 +883,10 @@ class boinfolog $name[] = !empty($address->personal) ? $address->personal : $emailadr; } // shorten long (> $this->max_line_chars) lines of "line" chars (-_+=~) in mails - $_message = preg_replace_callback('/[-_+=~]{'.$this->max_line_chars.',}/m', + $_message = preg_replace_callback('/[-_+=~\.]{'.$this->max_line_chars.',}/m', create_function('$matches',"return substr(\$matches[0],0,$this->max_line_chars);"),$_message); $type = isset($this->enums['type']['email']) ? 'email' : 'note'; + $status = isset($this->status['defaults'][$type]) ? $this->status['defaults'][$type] : 'done'; $info = array( 'info_id' => 0, 'info_type' => $type, @@ -894,9 +895,9 @@ class boinfolog 'info_subject' => $_subject, 'info_des' => $_message, 'info_startdate' => $_date, - 'info_status' => isset($this->status['defaults'][$type]) ? $this->status['defaults'][$type] : 'done', + 'info_status' => $status, 'info_priority' => 1, - 'info_percent' => 100, + 'info_percent' => $status == 'done' ? 100 : 0, 'referer' => false, 'link_to' => array( 'to_app' => 'infolog', From cc7f3ef768856f0c7726453276f33c74e203e86b Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 13 Sep 2007 12:30:57 +0000 Subject: [PATCH 026/554] new function to set certain values in a multiselection (div with checkboxes) --- etemplate/js/etemplate.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/etemplate/js/etemplate.js b/etemplate/js/etemplate.js index e301a1875d..211a640055 100644 --- a/etemplate/js/etemplate.js +++ b/etemplate/js/etemplate.js @@ -253,3 +253,26 @@ function get_selected(form,suffix) { } return selected; } + +// set certain comma-separated values in a multiselection (div with checkboxes, used as replacement for a multiselection) +function set_multiselection(name,values,reset) +{ + //alert("set_multiselection('"+name+"','"+values+"',"+reset+")"); + checkboxes = document.getElementsByName(name); + div = document.getElementById(name.substr(0,name.length-2)); + div_first = div.firstChild; + values = ','+values+','; + for (var i = 0; i < checkboxes.length; i++) { + checkbox = checkboxes[i]; + value = values.indexOf(','+checkbox.value+',') >= 0; + if (reset || value) { + //alert(checkbox.name+': value='+checkbox.value+', checked='+checkbox.checked+' --> '+value); + checkbox.checked = value; + if (value && checkbox.parentNode != div_first) { + br = checkbox.parentNode.nextSibling; + div.insertBefore(div.removeChild(checkbox.parentNode),div_first); + div.insertBefore(div.removeChild(br),div_first); + } + } + } +} From 0cfe754826fba57889c96177a180f4ecf5348634 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 13 Sep 2007 12:43:58 +0000 Subject: [PATCH 027/554] new custom field types: - button to execute javascript - selectbox values can be read from a file --- .../inc/class.customfields_widget.inc.php | 70 ++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/etemplate/inc/class.customfields_widget.inc.php b/etemplate/inc/class.customfields_widget.inc.php index f08f081ef6..300c5c75d8 100644 --- a/etemplate/inc/class.customfields_widget.inc.php +++ b/etemplate/inc/class.customfields_widget.inc.php @@ -47,6 +47,7 @@ 'date' => 'Date', 'date-time'=> 'Date+Time', 'select-account' => 'Select account', + 'button' => 'Button', // button to execute javascript 'link-entry' => 'Select entry', // should be last type, as the individual apps get added behind ); @@ -129,7 +130,11 @@ switch ((string)$field['type']) { case 'select' : - if($this->advanced_search) $field['values'][''] = lang('doesn\'t matter'); + if (count($field['values']) == 1 && isset($field['values']['@'])) + { + $field['values'] = $this->_get_options_from_file($field['values']['@']); + } + if($this->advanced_search && $field['rows'] <= 1) $field['values'][''] = lang('doesn\'t matter'); foreach($field['values'] as $key => $val) { if (substr($val = lang($val),-1) != '*') @@ -161,6 +166,10 @@ $input =& etemplate::empty_cell('checkbox',$this->prefix.$name); break; case 'radio' : + if (count($field['values']) == 1 && isset($field['values']['@'])) + { + $field['values'] = $this->_get_options_from_file($field['values']['@']); + } $input =& etemplate::empty_cell('groupbox'); $m = 0; foreach ($field['values'] as $key => $val) @@ -207,6 +216,32 @@ $input =& etemplate::empty_cell('link-entry',$this->prefix.$name,array( 'size' => $field['type'] == 'link-entry' ? '' : $field['type'], )); + break; + case 'button': // button(s) to execute javascript (label=onclick) or textinputs (empty label, readonly with neg. length) + $input =& etemplate::empty_cell('hbox'); + foreach($field['values'] as $label => $js) + { + if (!$label) // display an readonly input + { + $widget =& etemplate::empty_cell('text',$this->prefix.$name.$label,array( + 'size' => $field['len'] ? $field['len'] : 20, + 'readonly' => $field['len'] < 0, + 'onchange' => $js, + )); + } + else + { + if ($readonly) continue; // dont display buttons if we're readonly + $widget =& etemplate::empty_cell('buttononly',$this->prefix.$name.$label,array( + 'label' => $label ? $label : lang('Submit'), + 'onclick' => $js, + 'no_lang' => True + )); + } + etemplate::add_child($input,$widget); + unset($widget); + } + break; } $cell['data'][0]['c'.$n++] = $row_class.',top'; @@ -233,4 +268,37 @@ return True; // extra Label is ok } + + /** + * Read the options of a 'select' or 'radio' custom field from a file + * + * For security reasons that file has to be relative to the eGW root + * (to not use that feature to explore arbitrary files on the server) + * and it has to be a php file setting one variable called options, + * (to not display it to anonymously by the webserver). + * The $options var has to be an array with value => label pairs, eg: + * + * 'Option A', + * 'b' => 'Option B', + * 'c' => 'Option C', + * ); + * + * @param string $file file name inside the eGW server root, either relative to it or absolute + * @return array in case of an error we return a single option with the message + */ + function _get_options_from_file($file) + { + if (!($path = realpath($file{0} == '/' ? $file : EGW_SERVER_ROOT.'/'.$file)) || // file does not exist + substr($path,0,strlen(EGW_SERVER_ROOT)+1) != EGW_SERVER_ROOT.'/' || // we are NOT inside the eGW root + basename($path,'.php').'.php' != basename($path) || // extension is NOT .php + basename($path) == 'header.inc.php') // dont allow to include our header again + { + return array(lang("'%1' is no php file in the eGW server root (%2)!".': '.$path,$file,EGW_SERVER_ROOT)); + } + include($path); + + return $options; + } } From f35db30ef44fc76eaaa3dd60324655c58f2f6b0e Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 13 Sep 2007 13:00:29 +0000 Subject: [PATCH 028/554] "stupid IE forgets the checked value if the checkbox gets moved" --- etemplate/js/etemplate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etemplate/js/etemplate.js b/etemplate/js/etemplate.js index 211a640055..67e9d4fecc 100644 --- a/etemplate/js/etemplate.js +++ b/etemplate/js/etemplate.js @@ -267,12 +267,12 @@ function set_multiselection(name,values,reset) value = values.indexOf(','+checkbox.value+',') >= 0; if (reset || value) { //alert(checkbox.name+': value='+checkbox.value+', checked='+checkbox.checked+' --> '+value); - checkbox.checked = value; if (value && checkbox.parentNode != div_first) { br = checkbox.parentNode.nextSibling; div.insertBefore(div.removeChild(checkbox.parentNode),div_first); div.insertBefore(div.removeChild(br),div_first); } + checkbox.checked = value; } } } From 0fbb7ef5f46a28cd0eebfef5570fa826f85a0556 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 13 Sep 2007 13:50:48 +0000 Subject: [PATCH 029/554] "new account template subwidget for the contact widget: allows to select a templated based on some contact data, eg. a form-header based on the organisation unit" --- etemplate/inc/class.contact_widget.inc.php | 25 +++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/etemplate/inc/class.contact_widget.inc.php b/etemplate/inc/class.contact_widget.inc.php index ef8937b7fe..e2e669cd41 100644 --- a/etemplate/inc/class.contact_widget.inc.php +++ b/etemplate/inc/class.contact_widget.inc.php @@ -31,9 +31,10 @@ class contact_widget * @var string/array $human_name */ var $human_name = array( - 'contact-value' => 'Contact', - 'contact-account'=> 'Account contactdata', - 'contact-fields' => 'Contact fields', + 'contact-value' => 'Contact', + 'contact-account' => 'Account contactdata', + 'contact-template' => 'Account template', + 'contact-fields' => 'Contact fields', ); /** * Instance of the contacts class @@ -78,6 +79,7 @@ class contact_widget */ function pre_process($name,&$value,&$cell,&$readonlys,&$extension_data,&$tmpl) { + //echo "

contact_widget::pre_process('$name','$value',".print_r($cell,true).",...)

\n"; switch($cell['type']) { case 'contact-fields': @@ -94,7 +96,11 @@ class contact_widget break; case 'contact-account': - $value = 'account:'.$value; + case 'contact-template': + if (substr($value,0,8) != 'account:') + { + $value = 'account:'.($cell['name'] != 'account:' ? $value : $GLOBALS['egw_info']['user']['account_id']); + } // fall-throught case 'contact-value': default: @@ -108,8 +114,17 @@ class contact_widget break; } $type = $cell['size']; - $value = $this->contact[$type]; $cell['size'] = ''; + + if ($cell['type'] == 'contact-template') + { + $name = $this->contact[$type]; + $cell['type'] = 'template'; + if (($prefix = $cell['label'])) $name = strpos($prefix,'%s') !== false ? str_replace('%s',$name,$prefix) : $prefix.$name; + $cell['obj'] = new etemplate($name,$tmpl->as_array()); + return false; + } + $value = $this->contact[$type]; $cell['no_lang'] = 1; $cell['readonly'] = true; From e5eac71f71424601c772d4fc0e860484bb6a591f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oscar=20Manuel=20G=C3=B3mez=20Senovilla?= Date: Thu, 13 Sep 2007 13:57:21 +0000 Subject: [PATCH 030/554] pending lang updates --- addressbook/setup/phpgw_el.lang | 8 + addressbook/setup/phpgw_fr.lang | 453 ++++++++++++++++++++++++++++- addressbook/setup/phpgw_sk.lang | 53 +++- addressbook/setup/phpgw_sl.lang | 7 + addressbook/setup/phpgw_zh-tw.lang | 26 ++ admin/setup/phpgw_el.lang | 36 +-- admin/setup/phpgw_es-es.lang | 2 +- admin/setup/phpgw_sk.lang | 6 +- calendar/setup/phpgw_el.lang | 8 +- calendar/setup/phpgw_pt-br.lang | 4 + calendar/setup/phpgw_sk.lang | 6 +- etemplate/setup/phpgw_pt-br.lang | 2 + etemplate/setup/phpgw_sk.lang | 12 +- etemplate/setup/phpgw_zh-tw.lang | 2 + filemanager/setup/phpgw_zh-tw.lang | 10 + importexport/setup/phpgw_sk.lang | 10 + infolog/setup/phpgw_el.lang | 49 +++- infolog/setup/phpgw_pt-br.lang | 42 ++- infolog/setup/phpgw_sk.lang | 42 ++- infolog/setup/phpgw_sl.lang | 42 ++- infolog/setup/phpgw_zh-tw.lang | 2 + phpgwapi/setup/phpgw_en.lang | 2 +- phpgwapi/setup/phpgw_sk.lang | 8 +- preferences/setup/phpgw_sk.lang | 10 +- setup/lang/phpgw_pt-br.lang | 8 + 25 files changed, 794 insertions(+), 56 deletions(-) diff --git a/addressbook/setup/phpgw_el.lang b/addressbook/setup/phpgw_el.lang index fb1b221d8e..e064cd6bd0 100644 --- a/addressbook/setup/phpgw_el.lang +++ b/addressbook/setup/phpgw_el.lang @@ -59,6 +59,7 @@ business phone addressbook el business state addressbook el business street addressbook el business zip code addressbook el .. +calendar fields: addressbook el : calendar uri addressbook el URI can be changed via setup >> configuration admin el Setup >> Configuration car phone addressbook el @@ -69,6 +70,7 @@ charset for the csv export addressbook el charset of file addressbook el check all addressbook el choose an icon for this contact type admin el +choose owner of imported data addressbook el chosse an etemplate for this contact type admin el e city common el company common el @@ -79,8 +81,10 @@ contact application admin el contact copied addressbook el contact deleted addressbook el contact fields to show addressbook el +contact fields: addressbook el : contact id addressbook el contact modified by %1 at %2 addressbook el %1 %2 +contact not found! addressbook el ! contact repository admin el contact saved addressbook el contact settings admin el @@ -101,6 +105,7 @@ custom addressbook el custom etemplate for the contactform addressbook el e custom fields addressbook el debug output in browser addressbook el +default addressbook el default address format addressbook el default addressbook for adding contacts addressbook el default filter addressbook el @@ -122,6 +127,7 @@ don't hide empty columns addressbook el download addressbook el download export file (uncheck to debug output in browser) addressbook el ( ) download this contact as vcard file addressbook el vCard +duration addressbook el edit custom field addressbook el edit custom fields admin el edit extra account-data in the addressbook admin el @@ -131,6 +137,7 @@ email & internet addressbook el Email & Internet email addresses (comma separated) to send the contact data addressbook el Email ( ) empty for all addressbook el enable an extra private addressbook addressbook el +end addressbook el enter the path to the exported file here addressbook el error deleting the contact !!! addressbook el !!! error saving the contact !!! addressbook el !!! @@ -158,6 +165,7 @@ fieldseparator addressbook el for read only ldap admin el LDAP full name addressbook el general addressbook el +general fields: addressbook el : geo addressbook el GEO global categories addressbook el grant addressbook access common el diff --git a/addressbook/setup/phpgw_fr.lang b/addressbook/setup/phpgw_fr.lang index dfb18879dd..52cbda01a7 100644 --- a/addressbook/setup/phpgw_fr.lang +++ b/addressbook/setup/phpgw_fr.lang @@ -1,23 +1,61 @@ +%1 - %2 of %3 user accounts admin fr %1 - %2 de %3 comptes utilisateurs +%1 - %2 of %3 user groups admin fr %1 - %2 de %3 groupes utilisateurs +%1 acl records of not (longer) existing accounts deleted. admin fr %1 droits d'accs de comptes inexistants supprims. %1 added addressbook fr %1 ajout %1 contact(s) %2 addressbook fr %1 contact(s) %2 %1 contact(s) %2, %3 failed because of insufficent rights !!! addressbook fr %1 contact(s) %2, %3 en erreur (droits d'accs insuffisants). %1 fields in %2 other organisation member(s) changed addressbook fr Le champ %1 dans %2 d'autre membre de l'organisation a chang. +%1 not found or not executable !!! admin fr %1 introuvable ou pas excutable !!! %1 records imported addressbook fr %1 enregistrements imports %1 records read (not yet imported, you may go %2back%3 and uncheck test import) addressbook fr %1 enregistrements lus (non encore import, vous devriez retourner en arrire %2back%3 et dcocher le test de lmportation) %1 starts with '%2' addressbook fr %1 dbute avec '%2' +%s please calculate the result addressbook fr %s calculez s'il vous plait le rsultat +(default no, leave it off if you dont use it) admin fr (Non par dfaut, ne pas modifier si vous ne l'utilisez pas) (e.g. 1969) addressbook fr (e.g. 1969) +(stored password will not be shown here) admin fr (Le mot de passe enregistr ne sera pas montr ici) +(to install new applications use
setup [manage applications] !!!) admin fr (Pour installer de nouvelles applications utilisez
Setup [Grer Les Applications] !!!) +- type admin fr - type no conversion type <none> could be located. please choose a conversion type from the list addressbook fr Aucun type de conversion n'a pu tre trouv. SVP choisissez un type de conversion depuis la liste @-eval() is only availible to admins!!! addressbook fr @-eval() est disponible uniquement pour les administrateurs!!! +accesslog and bruteforce defense admin fr Protection contre les attaques accs aux logs et attaque systmatique +account active admin fr Compte actif +account has been created common fr Le compte a t cr +account has been deleted common fr Le compte a t supprim +account has been updated common fr Le compte a t mis jour +account list admin fr Liste des comptes +account permissions admin fr Permissions de compte +account preferences admin fr Prfrences de compte account repository admin fr Dpt de comptes accounts addressbook fr Comptes +acl manager admin fr Gestionnaire des droits d'accs +acl rights common fr Droits d'accs +action admin fr Action actions addressbook fr Actions +activate wysiwyg-editor admin fr activer l'diteur WYSIWYG add %1 addressbook fr Ajouter %1 +add a category admin fr Ajouter une catgorie add a contact to this organisation addressbook fr Ajouter un contact cette organisation +add a group admin fr Ajouter un groupe +add a new account. admin fr Ajouter un nouveau compte. add a new contact addressbook fr Ajouter un nouveau contact add a new list addressbook fr Ajouter une nouvelle liste add a single entry by passing the fields. addressbook fr Ajouter une seule entre en passant les champs. +add a subcategory admin fr Ajouter une sous-catgorie +add a user admin fr Ajouter un utilisateur +add account admin fr Ajouter un compte +add application admin fr Ajouter une application +add auto-created users to this group ('default' will be attempted if this is empty.) admin fr Ajouter les utilisateurs cres automatiquement ce groupe ('Dfaut' sera tent si ce champ est laiss vide.) +add business email of whole distribution list? addressbook fr Ajouter l'email professionnel add custom field addressbook fr Ajouter un champ personnalis +add global category admin fr Ajouter une catgorie globale +add global category for %1 admin fr Ajouter une catgorie globale pour %1 +add group admin fr Ajouter un groupe +add new account admin fr Ajouter un nouveau compte +add new application admin fr Ajouter une nouvelle application +add peer server admin fr Ajouter un Serveur Pair +add sub-category admin fr Ajouter une sous-catgorie add to distribution list: addressbook fr Ajouter la liste de distribution: +added by synchronisation addressbook fr ajout par synchronisation added to distribution list addressbook fr ajout la liste de distribution additional information about using ldap as contact repository admin fr Informations complmentaires pour utiliser LDAP comme dpt de contacts address book common fr Carnet d'adresses @@ -26,25 +64,73 @@ address book - view addressbook fr Carnet d'adresses - Voir address line 2 addressbook fr Adresse ligne 2 address type addressbook fr Type d'adresse addressbook common fr Carnet d'adresses +addressbook csv export addressbook fr Exporter en CSV le carnet d'adresse addressbook menu addressbook fr Menu de carnet d'adresses addressbook preferences addressbook fr Prfrences du carnet d'adresses addressbook the contact should be saved to addressbook fr Le contact du carnet d'adresses doit tre sauvegard vers addressbook-fieldname addressbook fr Carnet d'adresses - nom du champ addvcard addressbook fr Ajouter VCard +admin email admin fr Email de l'administrateur +admin email addresses (comma-separated) to be notified about the blocking (empty for no notify) admin fr Adresses EMail (spares par des virgules) des administrateurs prvenir propos du blocage (vide pour aucune notification) +admin name admin fr Nom de l'administrateur +administration admin fr Administration +admins admin fr Administrateurs +advanced options admin fr options avanes advanced search addressbook fr Recherche avance +after how many unsuccessful attempts to login, an account should be blocked (default 3) ? admin fr Aprs combien de tentatives infructueuses de connexion, un compte doit-il tre bloqu (3 par dfaut) ? +after how many unsuccessful attempts to login, an ip should be blocked (default 3) ? admin fr Aprs combien de tentatives infructueuses de connexion, une adresse IP doit-elle tre bloque (3 par dfaut) ? +aliases admin fr Alias all contacts addressbook fr Tous les contacts +all records and account information will be lost! admin fr Tous les enregistrements et informations sur les comptes vont tre perdus! +all users admin fr Tous les utilisateurs +allow anonymous access to this app admin fr Autoriser l'accs anonyme cette application allow users to maintain their own account-data admin fr Permettre aux utilisateurs de maintenir les donnes de leur propre compte alt. csv import addressbook fr Importation CSV alternative +alternate email address admin fr Adresse email alternative always addressbook fr toujours +anonymous user admin fr Utilisateur anonyme +anonymous user (not shown in list sessions) admin fr Utilisateur anonyme (n'apparat pas dans la liste des sessions) +anonymous user does not exist! admin fr L'utilisateur anonyme n'existe pas ! +anonymous user has no run-rights for the application! admin fr L'utilisateur anonyme n'a pas le droit d'excuter cette application ! +appearance admin fr Apparence +application admin fr Application +application name admin fr Nom d'application +application title admin fr Titre d'application +applications admin fr Applications +applications list admin fr Liste de applications +applies the changes admin fr appliquer les changements apply changes to all members, whose fields have the same previous content addressbook fr Appliquer les changements tous les membres dont les champs ont le mme contenu. apply the action on the whole query, not only the shown contacts!!! addressbook fr Appliquer l'action sur la totalit des rsultats de la requte et pas seulement sur les contacts affichs. are you shure you want to delete this contact? addressbook fr Etes-vous sr que vous voulez supprimer ce contact? +are you sure you want to delete the application %1 ? admin fr Etes-vous sr de vouloir supprimer l'application %1 ? +are you sure you want to delete this account ? admin fr Etes-vous sr de vouloir supprimer ce compte ? +are you sure you want to delete this application ? admin fr Etes-vous sr de vouloir supprimer cette application ? +are you sure you want to delete this category ? common fr Etes-vous sr de vouloir supprimer cette catgorie ? are you sure you want to delete this field? addressbook fr Etes-vous sr de vouloir effacer ce champ ? +are you sure you want to delete this global category ? admin fr Etes-vous sr de vouloir supprimer cette catgorie globale ? +are you sure you want to delete this group ? admin fr Etes-vous sr de vouloir supprimer ce groupe ? +are you sure you want to delete this server? admin fr Etes-vous sr de vouloir supprimer ce serveur ? +are you sure you want to kill this session ? admin fr Etes-vous sr de vouloir tuer cette session ? assistent addressbook fr Assistant(e) assistent phone addressbook fr Tlphone assistant(e) +async services last executed admin fr Dernire excution des services asynchrones +asynchronous timed services admin fr Services asynchrones +asyncservices not yet installed or other error (%1) !!! admin fr services asynchrones pas encore installs ou autre erreur (%1) !!! +at the moment the following document-types are supported: addressbook fr l'heure actuelle les types de documents supports : +attempt to use correct mimetype for ftp instead of default 'application/octet-stream' admin fr Tentative d'utiliser le type MIME correct pour ftp la place de celui par dfaut 'application/octet-stream' +attribute accountstatus explained admin fr Ceci modifie l'attribut accountStatus (Status du compte) pour le schma de QMAIL. +attribute mail explained admin fr Ceci modifie l'attribut -mail- du schma QMAIL. Cet attribut doit toujours tre renseign, c'est aussi le champ de l'adresse de courriel interne de eGW. +attribute mailalternateaddress explained admin fr Ceci modifie l'attribut -mailAlternateAddress- (adresse de messagerie alternative) du schma QMAIL. Cela peut tre utilis comme un alias ou un adressage virtuel. +attribute mailforwardingaddress explained admin fr Ceci modifie l'attribut -mailForwardingAddress- (adresse de routage de messagerie) du schma QMAIL. En cas d'utilisation de cette valeur, elle ne peut tre vide. +authentication / accounts admin fr Authentification / Comptes +auto create account records for authenticated users admin fr Crer automatiquement les enregistrements de comptes pour les utilisateurs authentifis +back to the list admin fr retour la liste +bi-dir passthrough admin fr passage bidirectionnel +bi-directional admin fr bidirectionnel birthday common fr Anniversaire birthdays common fr Anniversaires blank addressbook fr Blanc +bottom admin fr bas business common fr Bureau business address addressbook fr Adresse (bureau) business city addressbook fr Ville (bureau) @@ -55,18 +141,34 @@ business phone addressbook fr T business state addressbook fr Rgion (bureau) business street addressbook fr Rue (bureau) business zip code addressbook fr Code postal (bureau) +calculate next run admin fr Calculer la prochaine excution +calendar fields: addressbook fr Champ calendrier: calendar uri addressbook fr URI du calendrier can be changed via setup >> configuration admin fr Peut tre modifi via Setup >> Configuration +can change password admin fr Peut modifier son mot de passe +cancel testjob! admin fr Annuler le Travail de test! car phone addressbook fr Tlphone voiture +categories list admin fr Liste des catgories categories, notes, ... addressbook fr Catgories, Notes, ... +category %1 has been saved ! admin fr La catgorie %1 a t enregistre ! +category list admin fr Liste de catgories cell phone addressbook fr Tlphone portable +change acl rights admin fr modifier les droits d'accs (ACL) change all organisation members addressbook fr Modifier tous les membres de l'organisation +change config settings admin fr Modifier les paramtres de configuration +change main screen message admin fr Changer le message de l'cran principal charset for the csv export addressbook fr Jeu de caractres pour l'exportation CSV charset of file addressbook fr Jeu de caractres du fichier check all addressbook fr Vrifier tout -choose an icon for this contact type admin fr Choisissez une icne pour ce type de contact +check ip address of all sessions admin fr Vrifier l'adresse IP de toutes les sessions +check items to %1 to %2 for %3 admin fr Vrifier les objets vers %1 %2 pour %3 +choose an icon for this contact type admin fr Choisisser une icne pour ce type de contact +choose owner of imported data addressbook fr Choisisser le propritaire de donnes importes +choose seperator and charset addressbook fr Choisisser le sparateur et l'encodage chosse an etemplate for this contact type admin fr Choisissez un eTemplate pour ce type de contact city common fr Ville +click to select a color admin fr Cliquez pour slectionner une couleur +color admin fr Couleur company common fr Socit company name addressbook fr Nom de la socit configuration common fr Configuration @@ -85,28 +187,79 @@ contains addressbook fr contient copied by %1, from record #%2. addressbook fr Copi par %1 depuis l'enregistrement n%2. copy a contact and edit the copy addressbook fr Copier un contact et modifier la copie country common fr Pays +country selection admin fr Slection du pays +create group admin fr Crer un groupe create new links addressbook fr Crer de nouveaux liens created addressbook fr Cr(s) +creates a new field admin fr Crer un nouveau champ credit addressbook fr Crdits +crontab only (recomended) admin fr crontab seulement (recommand) csv-fieldname addressbook fr CSV - Nom du champ csv-filename addressbook fr CSV - Nom du fichier custom addressbook fr Personnalis custom fields addressbook fr Champs personnaliss +cyrus imap server admin fr Serveur Cyrus IMAP +data admin fr Donnes +day admin fr Jour +day of week
(0-6, 0=sun) admin fr Jour de la semaine
(0-6, 0=Dim) +db backup and restore admin fr Sauvegarde et restauration de la BDD debug output in browser addressbook fr Deboguer la sortie dans le navigateur +default addressbook fr Dfaut default addressbook for adding contacts addressbook fr Carnet d'adresses par dfaut pour l'ajout de contacts +default file system space per user admin fr Espace disque par utilisateur (par dfaut) +default file system space per user/group ? admin fr Espace disque par utilisateur/groupe (par dfaut) ? default filter addressbook fr Filtre par dfaut +deinstall crontab admin fr Dsinstaller le crontab delete a single entry by passing the id. addressbook fr Effacer une seule entre en passant l'ID. +delete account admin fr Supprimer le compte +delete all records admin fr Supprimer tous les enregistrements +delete application admin fr Supprimer l'application +delete category admin fr Supprimer catgorie +delete group admin fr Supprimer groupe +delete peer server admin fr Supprimer serveur Pair delete selected distribution list! addressbook fr Effacer la liste de distribution slectionne! +delete the category admin fr Supprimer la catgorie +delete the group admin fr Supprimer le groupe +delete this category admin fr Supprimer cette catgorie delete this contact addressbook fr Supprimer ce contact +delete this group admin fr Supprimer ce groupe delete this organisation including all its contacts addressbook fr Dtruire cette organisation et tous ses contacts +delete this user admin fr Supprimer cet utilisateur deleted addressbook fr supprim deletes the photo addressbook fr Supprime la photo +deletes this field admin fr Supprimer ce champ +deliver extern admin fr Envoi externe +deny access to access log admin fr Refuser l'accs au log d'accs +deny access to application registery admin fr Refuser l'accs l'enregistrement d'applications +deny access to applications admin fr Refuser l'accs aux applications +deny access to asynchronous timed services admin fr Refuser l'accs aux services asynchrones +deny access to current sessions admin fr Refuser l'accs aux sessions en cours +deny access to db backup and restore admin fr Refuser l'accs Sauvegarde et restauration de la BDD +deny access to error log admin fr Refuser l'accs la log d'erreurs +deny access to global categories admin fr Refuser l'accs aux catgories globales +deny access to groups admin fr Refuser l'accs aux groupes +deny access to mainscreen message admin fr Refuser l'accs au message de la page principale +deny access to peer servers admin fr Refuser l'accs aux serveurs pairs +deny access to phpinfo admin fr Refuser l'accs phpinfo +deny access to site configuration admin fr Refuser l'accs la configuration du site +deny access to user accounts admin fr Refuser l'accs aux comptes utilisateurs +deny all users access to grant other users access to their entries ? admin fr Les utilisateurs ne peuvent permettre aux autres l'accs leurs donnes ? department common fr Dpartement departments addressbook fr dpartements +description can not exceed 255 characters in length ! admin fr La description ne peut dpasser 255 caractres de long ! +determines the order the fields are displayed admin fr Dtermine l'ordre d'afficahge des champs +disable "auto completion" of the login form admin fr Dsactiver "remplissage auto" dans le formulaire de login +disable wysiwyg-editor admin fr dsactiver l'diteur WYSIWYG +disabled (not recomended) admin fr dsactiv (pas recommand) +display admin fr Afficher displays a remider for birthdays on the startpage (page you get when you enter egroupware or click on the homepage icon). addressbook fr Affiche un rappel pour les anniversaires sur la page d'accueil (page qui s'affiche quand vous entrez dans eGroupWare ou quand vous cliquez sur l'icne Accueil) distribution list deleted addressbook fr La liste de distribution est supprime distribution lists addressbook fr Listes de distribution +do not delete the category and return back to the list admin fr Ne PAS supprimer la catgorie et retourner la liste +do you also want to delete all global subcategories ? admin fr Voulez-vous aussi supprimer toutes les sous-catgories globales ? do you want a private addressbook, which can not be viewed by users, you grant access to your personal addressbook? addressbook fr Voulez vous un carnet d'adresse priv qui ne pourra tre vu par les autres utilisateurs sauf si vous modifiez les autorisations ? +do you want to delete all global subcategories ? admin fr Voulez-vous supprimer toutes les sous-catgories globales ? +do you want to move all global subcategories one level down ? admin fr Voulez-vous dplacer toutes les sous-catgories globales un niveau plus bas ? do your really want to delete this contact? addressbook fr Voulez vous vraiment supprimer ce contact? doesn't matter addressbook fr sans importance domestic addressbook fr Domestique @@ -114,17 +267,71 @@ don't hide empty columns addressbook fr Ne pas cacher les colonnes vides download addressbook fr Tlcharger download export file (uncheck to debug output in browser) addressbook fr Tlcharger le fichier d'exportation (Dcocher pour deboguer la sortie dans le navigateur) download this contact as vcard file addressbook fr Tlchargez ce contact comme un fichier vCard +each value is a line like [=