From d972768efc41951ed9b68c3818dedcecc19a67b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cornelius=20Wei=C3=9F?= Date: Thu, 21 Jun 2007 22:03:50 +0000 Subject: [PATCH 01/36] make defautl-records complay with the (hard to understand) setup-rules after a phonecall with ralf i do understand 1% more of how setup works :-) --- importexport/setup/default_records.inc.php | 42 ++++++++++------------ 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/importexport/setup/default_records.inc.php b/importexport/setup/default_records.inc.php index cd08b9fc52..31ac816c32 100644 --- a/importexport/setup/default_records.inc.php +++ b/importexport/setup/default_records.inc.php @@ -10,30 +10,26 @@ */ require_once(EGW_INCLUDE_ROOT. '/importexport/inc/class.bodefinitions.inc.php'); -require_once(EGW_INCLUDE_ROOT. '/phpgwapi/inc/class.accounts.inc.php'); -require_once(EGW_INCLUDE_ROOT. '/phpgwapi/inc/class.translation.inc.php'); -// some globals we need -if ( !is_object($GLOBALS['egw']->accounts) ) $GLOBALS['egw']->accounts = new accounts(); -if ( !is_object($GLOBALS['egw']->translation) ) $GLOBALS['egw']->translation = new translation(); -if ( !is_object($GLOBALS['egw']->db)) $GLOBALS['egw']->db = $GLOBALS['egw_setup']->db; +// This sets up $GLOBALS['egw']->accounts and $GLOBALS['egw']->db +$GLOBALS['egw_setup']->setup_account_object(); -// apps, whose definitions should be installed automatically -// i don't know how to ask setup which apps are / ore are going to be installed. -$appnames = array ( - 'addressbook', -); +// Fetch translation object +$GLOBALS['egw_setup']->translation->setup_translation_sql(); +if ( !is_object($GLOBALS['egw']->translation) ) $GLOBALS['egw']->translation = $GLOBALS['egw_setup']->translation->sql; -foreach ($appnames as $appname) { - $defdir = EGW_INCLUDE_ROOT. "/$appname/importexport/definitions"; - if(!is_dir($defdir)) continue; - $d = dir($defdir); - - // step through each file in appdir - while (false !== ($entry = $d->read())) { - $file = $defdir. '/'. $entry; - list( $filename, $extension) = explode('.',$entry); - if ( $extension != 'xml' ) continue; - bodefinitions::import( $file ); - } +// step through every source code intstalled app +$egwdir = dir(EGW_INCLUDE_ROOT); +while (false !== ($appdir = $egwdir->read())) { + $defdir = EGW_INCLUDE_ROOT. "/$appdir/importexport/definitions"; + if ( !is_dir( $defdir ) ) continue; + + // step through each file in defdir of app + $d = dir($defdir); + while (false !== ($entry = $d->read())) { + $file = $defdir. '/'. $entry; + list( $filename, $extension) = explode('.',$entry); + if ( $extension != 'xml' ) continue; + bodefinitions::import( $file ); + } } From 68eb6767292f350c0d21067f3692c173c0188daf Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 22 Jun 2007 12:42:56 +0000 Subject: [PATCH 02/36] "fix for bug #952: Fatal error: Undefined class name 'self' in class.bocontacts.inc.php on line 86 self:: is PHP5 :-(" --- addressbook/inc/class.bocontacts.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addressbook/inc/class.bocontacts.inc.php b/addressbook/inc/class.bocontacts.inc.php index df246b4052..7d706060f7 100755 --- a/addressbook/inc/class.bocontacts.inc.php +++ b/addressbook/inc/class.bocontacts.inc.php @@ -859,7 +859,7 @@ class bocontacts extends socontacts function merge($ids) { $this->error = false; - foreach(self::search(array('id'=>$ids),false) as $contact) // $this->search calls the extended search from ui! + foreach(parent::search(array('id'=>$ids),false) as $contact) // $this->search calls the extended search from ui! { if ($contact['account_id']) { From fe58bfc0e30666bf514443aba0f3b485a2102396 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 22 Jun 2007 12:49:21 +0000 Subject: [PATCH 03/36] "fix for bug reported on the developers list" --- infolog/inc/hook_deleteaccount.inc.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/infolog/inc/hook_deleteaccount.inc.php b/infolog/inc/hook_deleteaccount.inc.php index c230ad628a..8290b52983 100644 --- a/infolog/inc/hook_deleteaccount.inc.php +++ b/infolog/inc/hook_deleteaccount.inc.php @@ -14,7 +14,8 @@ if((int)$GLOBALS['hook_values']['account_id'] > 0) { require_once(EGW_INCLUDE_ROOT.'/infolog/inc/class.soinfolog.inc.php'); - $info =& new soinfolog; + $grants = array(); + $info =& new soinfolog($grants); $info->change_delete_owner((int)$GLOBALS['hook_values']['account_id'],(int)$_POST['new_owner']); From bd303864408b371e6a4a8572a6b11df2258e2caa Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 22 Jun 2007 18:23:11 +0000 Subject: [PATCH 04/36] "fixed access to parent dir off session.save_path, which gives errors under open_basedir" --- phpgwapi/inc/class.sessions_php4.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpgwapi/inc/class.sessions_php4.inc.php b/phpgwapi/inc/class.sessions_php4.inc.php index fc0529ee43..6bf292c775 100644 --- a/phpgwapi/inc/class.sessions_php4.inc.php +++ b/phpgwapi/inc/class.sessions_php4.inc.php @@ -223,7 +223,7 @@ while (($file = readdir($dir))) { - if (filesize($path.'/'.$file) >= $max_session_size) continue; + if ($file{0} == '.' || filesize($path.'/'.$file) >= $max_session_size) continue; if (substr($file,0,5) != 'sess_' || $session_cache[$file] === false) { From ab74fbeca01a4be03539bf9dbebf0daebfb25928 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sat, 23 Jun 2007 07:09:52 +0000 Subject: [PATCH 05/36] "fix for bug #953: Addresbook Contact Info ignores Default Address Format Rule" --- addressbook/inc/class.uicontacts.inc.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addressbook/inc/class.uicontacts.inc.php b/addressbook/inc/class.uicontacts.inc.php index 3024e0af6e..31841057a4 100644 --- a/addressbook/inc/class.uicontacts.inc.php +++ b/addressbook/inc/class.uicontacts.inc.php @@ -1518,6 +1518,10 @@ class uicontacts extends bocontacts // ToDo: fix vCard export $readonlys['button[vcard]'] = true; + // how to display addresses + $content['addr_format'] = $this->addr_format_by_country($content['adr_one_countryname']); + $content['addr_format2'] = $this->addr_format_by_country($content['adr_two_countryname']); + $sel_options['fileas_type'][$content['fileas_type']] = $this->fileas($content); $sel_options['owner'] = $this->get_addressbooks(); for($i = -23; $i<=23; $i++) $tz[$i] = ($i > 0 ? '+' : '').$i; From 88370ceb8ab8cf953c653da5d5aa6ed92960e411 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sat, 23 Jun 2007 07:14:01 +0000 Subject: [PATCH 06/36] fix for bug #948: space missing in regular addressbook view in home address --- addressbook/setup/etemplates.inc.php | 4 ++-- addressbook/templates/default/index.xet | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addressbook/setup/etemplates.inc.php b/addressbook/setup/etemplates.inc.php index 151cae0ae9..8f20a596e7 100755 --- a/addressbook/setup/etemplates.inc.php +++ b/addressbook/setup/etemplates.inc.php @@ -2,7 +2,7 @@ /** * eGroupWare - eTemplates for Application addressbook * http://www.egroupware.org - * generated by soetemplate::dump4setup() 2007-06-17 16:07 + * generated by soetemplate::dump4setup() 2007-06-23 09:26 * * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @package addressbook @@ -154,7 +154,7 @@ $templ_data[] = array('name' => 'addressbook.index.rows','template' => '','lang' $templ_data[] = array('name' => 'addressbook.index.rows','template' => '','lang' => '','group' => '0','version' => '1.3.002','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:6:{s:2:"c1";s:2:"th";s:2:"c2";s:7:"row,top";s:1:"I";s:17:",@no_customfields";s:1:"F";s:9:",@no_home";s:1:"D";s:12:"60,@no_photo";s:1:"K";s:2:"90";}i:1;a:11:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:6:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:5:{s:2:"h2";s:16:",!@order=n_given";s:2:"h5";s:84:",!@order=/^(org_name|n_fileas|adr_one_postalcode|contact_modified|contact_created)$/";s:2:"h3";s:17:",!@order=n_family";s:2:"h1";s:17:",!@order=n_fileas";s:2:"h6";s:16:",@order=n_fileas";}i:1;a:2:{s:1:"A";a:4:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"span";s:3:"all";s:5:"label";s:11:"own sorting";s:4:"name";s:8:"n_fileas";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:7:"n_given";s:5:"label";s:9:"Firstname";}s:1:"B";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:4:"Name";s:4:"name";s:8:"n_family";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:4:"Name";s:4:"name";s:8:"n_family";}s:1:"B";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:7:"n_given";s:5:"label";s:9:"Firstname";}}i:4;a:2:{s:1:"A";a:4:{s:4:"name";s:8:"org_name";s:5:"label";s:12:"Organisation";s:4:"span";s:3:"all";s:4:"type";s:20:"nextmatch-sortheader";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:5;a:2:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:8:"n_family";s:5:"label";s:4:"Name";}s:1:"B";a:4:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:7:"n_given";s:5:"label";s:9:"Firstname";s:4:"span";s:9:",leftPad5";}}i:6;a:2:{s:1:"A";a:4:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"span";s:3:"all";s:5:"label";s:11:"own sorting";s:4:"name";s:8:"n_fileas";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:6;s:4:"cols";i:2;s:7:"options";a:2:{i:4;s:1:"0";i:5;s:1:"0";}s:4:"size";s:7:",,,,0,0";}s:1:"C";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:8:"Category";s:4:"name";s:6:"cat_id";}s:1:"D";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:5:"Photo";s:4:"name";s:5:"photo";}s:1:"E";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"3,,0,0";i:1;a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:16:"Business address";s:4:"name";s:8:"business";}i:2;a:4:{s:4:"type";s:22:"nextmatch-customfilter";s:4:"name";s:19:"adr_one_countryname";s:4:"size";s:24:"select-country,Country,1";s:4:"span";s:14:",countrySelect";}i:3;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:18:"adr_one_postalcode";s:5:"label";s:8:"zip code";}}s:1:"F";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:12:"Home address";s:4:"name";s:4:"home";}s:1:"G";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"3,,0,0";i:1;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:8:"tel_work";s:5:"label";s:14:"Business phone";}i:2;a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:12:"Mobile phone";s:4:"name";s:8:"tel_cell";}i:3;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:8:"tel_home";s:5:"label";s:10:"Home phone";}}s:1:"H";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"3,,0,0";i:1;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:3:"url";s:5:"label";s:3:"Url";}i:2;a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:14:"Business email";s:4:"name";s:5:"email";}i:3;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:10:"email_home";s:5:"label";s:10:"Home email";}}s:1:"I";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"2,,0,0";i:1;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:12:"customfields";s:4:"size";s:13:"Custom fields";}i:2;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:25:"customfields[$row][label]";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:7:",,,,0,0";}}s:1:"J";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"2,,0,0";i:1;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:15:"contact_created";s:5:"label";s:7:"Created";}i:2;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:16:"contact_modified";s:5:"label";s:13:"Last modified";}}s:1:"K";a:6:{s:4:"type";s:4:"hbox";s:5:"align";s:6:"center";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Actions";s:5:"align";s:6:"center";}i:2;a:8:{s:4:"type";s:6:"button";s:4:"size";s:5:"check";s:5:"label";s:9:"Check all";s:4:"name";s:9:"check_all";s:4:"help";s:9:"Check all";s:7:"onclick";s:60:"toggle_all(this.form,form::name(\'checked[]\')); return false;";s:6:"needed";s:1:"1";s:5:"align";s:5:"right";}s:4:"span";s:8:",noPrint";}}i:2;a:11:{s:1:"A";a:5:{s:4:"type";s:5:"image";s:5:"label";s:21:"$row_cont[type_label]";s:4:"name";s:12:"${row}[type]";s:5:"align";s:6:"center";s:7:"no_lang";s:1:"1";}s:1:"B";a:8:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"5,,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:4:"name";s:13:"${row}[line1]";s:7:"no_lang";s:1:"1";}i:2;a:3:{s:4:"type";s:5:"label";s:4:"name";s:13:"${row}[line2]";s:7:"no_lang";s:1:"1";}i:3;a:3:{s:4:"type";s:5:"label";s:4:"name";s:16:"${row}[org_unit]";s:7:"no_lang";s:1:"1";}i:4;a:3:{s:4:"type";s:5:"label";s:4:"name";s:13:"${row}[title]";s:7:"no_lang";s:1:"1";}i:5;a:3:{s:4:"type";s:5:"label";s:4:"name";s:17:"${row}[first_org]";s:7:"no_lang";s:1:"1";}s:4:"name";s:10:"${row}[id]";}s:1:"C";a:4:{s:4:"type";s:10:"select-cat";s:4:"size";s:1:"1";s:4:"name";s:14:"${row}[cat_id]";s:8:"readonly";s:1:"1";}s:1:"D";a:2:{s:4:"type";s:5:"image";s:4:"name";s:13:"${row}[photo]";}s:1:"E";a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"4,,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:4:"name";s:27:"${row}[adr_one_countryname]";s:7:"no_lang";s:1:"1";}i:2;a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:7:"3,0,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:24:"${row}[adr_one_locality]";}i:2;a:4:{s:4:"type";s:5:"label";s:4:"span";s:9:",leftPad5";s:7:"no_lang";s:1:"1";s:4:"name";s:22:"${row}[adr_one_region]";}i:3;a:5:{s:4:"type";s:5:"label";s:4:"name";s:26:"${row}[adr_one_postalcode]";s:4:"span";s:9:",leftPad5";s:5:"label";s:1:" ";s:7:"no_lang";s:1:"1";}}i:3;a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:22:"${row}[adr_one_street]";}i:4;a:3:{s:4:"type";s:5:"label";s:4:"name";s:23:"${row}[adr_one_street2]";s:7:"no_lang";s:1:"1";}}s:1:"F";a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"4,,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:4:"name";s:27:"${row}[adr_two_countryname]";s:7:"no_lang";s:1:"1";}i:2;a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"3,,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:24:"${row}[adr_two_locality]";}i:2;a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:22:"${row}[adr_two_region]";}i:3;a:5:{s:4:"type";s:5:"label";s:4:"name";s:26:"${row}[adr_two_postalcode]";s:4:"span";s:9:",leftPad5";s:5:"label";s:1:" ";s:7:"no_lang";s:1:"1";}}i:3;a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:22:"${row}[adr_two_street]";}i:4;a:3:{s:4:"type";s:5:"label";s:4:"name";s:23:"${row}[adr_two_street2]";s:7:"no_lang";s:1:"1";}}s:1:"G";a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"4,,0,0";i:1;a:5:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:16:"${row}[tel_work]";s:4:"span";s:11:",telNumbers";s:4:"size";s:53:",$row_cont[tel_work_link],,,calling,$cont[call_popup]";}i:2;a:5:{s:4:"type";s:5:"label";s:4:"name";s:16:"${row}[tel_cell]";s:7:"no_lang";s:1:"1";s:4:"span";s:11:",telNumbers";s:4:"size";s:53:",$row_cont[tel_cell_link],,,calling,$cont[call_popup]";}i:3;a:5:{s:4:"type";s:5:"label";s:4:"name";s:16:"${row}[tel_home]";s:7:"no_lang";s:1:"1";s:4:"span";s:11:",telNumbers";s:4:"size";s:53:",$row_cont[tel_home_link],,,calling,$cont[call_popup]";}i:4;a:4:{s:4:"type";s:5:"label";s:4:"name";s:20:"${row}[tel_prefered]";s:7:"no_lang";s:1:"1";s:4:"size";s:57:",$row_cont[tel_prefered_link],,,calling,$cont[call_popup]";}}s:1:"H";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"3,,0,0";i:1;a:5:{s:4:"type";s:5:"label";s:4:"size";s:3:",,1";s:4:"span";s:12:",fixedHeight";s:7:"no_lang";s:1:"1";s:4:"name";s:11:"${row}[url]";}i:2;a:5:{s:4:"type";s:5:"label";s:4:"size";s:52:",@${row}[email_link],,,_blank,$row_cont[email_popup]";s:4:"span";s:12:",fixedHeight";s:4:"name";s:13:"${row}[email]";s:7:"no_lang";s:1:"1";}i:3;a:5:{s:4:"type";s:5:"label";s:4:"size";s:62:",@${row}[email_home_link],,,_blank,$row_cont[email_home_popup]";s:4:"span";s:12:",fixedHeight";s:4:"name";s:18:"${row}[email_home]";s:7:"no_lang";s:1:"1";}}s:1:"I";a:7:{s:4:"type";s:4:"grid";s:4:"size";s:15:",48,0,,0,0,auto";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:4:{s:4:"type";s:5:"label";s:4:"span";s:12:",fixedHeight";s:7:"no_lang";s:1:"1";s:4:"name";s:4:"$row";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"name";s:20:"${row}[customfields]";s:7:"options";a:5:{i:1;s:2:"48";i:6;s:4:"auto";i:4;s:1:"0";i:5;s:1:"0";i:2;s:1:"0";}}s:1:"J";a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"4,,0,0";i:1;a:4:{s:4:"type";s:9:"date-time";s:4:"name";s:15:"${row}[created]";s:8:"readonly";s:1:"1";s:4:"span";s:7:",noWrap";}i:2;a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:15:"${row}[creator]";s:8:"readonly";s:1:"1";}i:3;a:4:{s:4:"type";s:9:"date-time";s:4:"name";s:16:"${row}[modified]";s:8:"readonly";s:1:"1";s:4:"span";s:8:",noBreak";}i:4;a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:16:"${row}[modifier]";s:8:"readonly";s:1:"1";}}s:1:"K";a:7:{s:4:"type";s:4:"hbox";s:4:"size";s:5:"4,0,0";i:1;a:4:{s:4:"type";s:5:"image";s:4:"size";s:52:"addressbook.uicontacts.view&contact_id=$row_cont[id]";s:5:"label";s:4:"View";s:4:"name";s:4:"view";}i:2;a:5:{s:4:"type";s:6:"button";s:4:"size";s:4:"edit";s:5:"label";s:4:"Edit";s:7:"onclick";s:189:"window.open(egw::link(\'/index.php\',\'menuaction=addressbook.uicontacts.edit&contact_id=$row_cont[id]\'),\'_blank\',\'dependent=yes,width=850,height=440,scrollbars=yes,status=yes\'); return false;";s:4:"name";s:19:"edit[$row_cont[id]]";}i:3;a:6:{s:4:"type";s:6:"button";s:4:"name";s:21:"delete[$row_cont[id]]";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:4:"help";s:19:"Delete this contact";s:7:"onclick";s:38:"return confirm(\'Delete this contact\');";}i:4;a:5:{s:4:"type";s:8:"checkbox";s:4:"name";s:9:"checked[]";s:4:"size";s:13:"$row_cont[id]";s:4:"help";s:45:"Select multiple contacts for a further action";s:5:"align";s:5:"right";}s:4:"span";s:8:",noPrint";}}}s:4:"rows";i:2;s:4:"cols";i:11;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1145192391',); -$templ_data[] = array('name' => 'addressbook.index.rows','template' => '','lang' => '','group' => '0','version' => '1.4.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:6:{s:2:"c1";s:2:"th";s:2:"c2";s:7:"row,top";s:1:"I";s:17:",@no_customfields";s:1:"F";s:9:",@no_home";s:1:"D";s:12:"60,@no_photo";s:1:"K";s:2:"90";}i:1;a:11:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:6:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:5:{s:2:"h2";s:16:",!@order=n_given";s:2:"h5";s:84:",!@order=/^(org_name|n_fileas|adr_one_postalcode|contact_modified|contact_created)$/";s:2:"h3";s:17:",!@order=n_family";s:2:"h1";s:17:",!@order=n_fileas";s:2:"h6";s:16:",@order=n_fileas";}i:1;a:2:{s:1:"A";a:4:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"span";s:3:"all";s:5:"label";s:11:"own sorting";s:4:"name";s:8:"n_fileas";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:7:"n_given";s:5:"label";s:9:"Firstname";}s:1:"B";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:4:"Name";s:4:"name";s:8:"n_family";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:4:"Name";s:4:"name";s:8:"n_family";}s:1:"B";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:7:"n_given";s:5:"label";s:9:"Firstname";}}i:4;a:2:{s:1:"A";a:4:{s:4:"name";s:8:"org_name";s:5:"label";s:12:"Organisation";s:4:"span";s:3:"all";s:4:"type";s:20:"nextmatch-sortheader";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:5;a:2:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:8:"n_family";s:5:"label";s:4:"Name";}s:1:"B";a:4:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:7:"n_given";s:5:"label";s:9:"Firstname";s:4:"span";s:9:",leftPad5";}}i:6;a:2:{s:1:"A";a:4:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"span";s:3:"all";s:5:"label";s:11:"own sorting";s:4:"name";s:8:"n_fileas";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:6;s:4:"cols";i:2;s:7:"options";a:2:{i:4;s:1:"0";i:5;s:1:"0";}s:4:"size";s:7:",,,,0,0";}s:1:"C";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:8:"Category";s:4:"name";s:6:"cat_id";}s:1:"D";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:5:"Photo";s:4:"name";s:5:"photo";}s:1:"E";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"3,,0,0";i:1;a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:16:"Business address";s:4:"name";s:8:"business";}i:2;a:4:{s:4:"type";s:22:"nextmatch-customfilter";s:4:"name";s:19:"adr_one_countryname";s:4:"size";s:24:"select-country,Country,1";s:4:"span";s:14:",countrySelect";}i:3;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:18:"adr_one_postalcode";s:5:"label";s:8:"zip code";}}s:1:"F";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:12:"Home address";s:4:"name";s:4:"home";}s:1:"G";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"3,,0,0";i:1;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:8:"tel_work";s:5:"label";s:14:"Business phone";}i:2;a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:12:"Mobile phone";s:4:"name";s:8:"tel_cell";}i:3;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:8:"tel_home";s:5:"label";s:10:"Home phone";}}s:1:"H";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"3,,0,0";i:1;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:3:"url";s:5:"label";s:3:"Url";}i:2;a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:14:"Business email";s:4:"name";s:5:"email";}i:3;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:10:"email_home";s:5:"label";s:10:"Home email";}}s:1:"I";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"2,,0,0";i:1;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:12:"customfields";s:4:"size";s:13:"Custom fields";}i:2;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:25:"customfields[$row][label]";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:7:",,,,0,0";}}s:1:"J";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"2,,0,0";i:1;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:15:"contact_created";s:5:"label";s:7:"Created";}i:2;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:16:"contact_modified";s:5:"label";s:13:"Last modified";}}s:1:"K";a:6:{s:4:"type";s:4:"hbox";s:5:"align";s:6:"center";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Actions";s:5:"align";s:6:"center";}i:2;a:8:{s:4:"type";s:6:"button";s:4:"size";s:5:"check";s:5:"label";s:9:"Check all";s:4:"name";s:9:"check_all";s:4:"help";s:9:"Check all";s:7:"onclick";s:60:"toggle_all(this.form,form::name(\'checked[]\')); return false;";s:6:"needed";s:1:"1";s:5:"align";s:5:"right";}s:4:"span";s:8:",noPrint";}}i:2;a:11:{s:1:"A";a:5:{s:4:"type";s:5:"image";s:5:"label";s:21:"$row_cont[type_label]";s:4:"name";s:12:"${row}[type]";s:5:"align";s:6:"center";s:7:"no_lang";s:1:"1";}s:1:"B";a:8:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"5,,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:4:"name";s:13:"${row}[line1]";s:7:"no_lang";s:1:"1";}i:2;a:3:{s:4:"type";s:5:"label";s:4:"name";s:13:"${row}[line2]";s:7:"no_lang";s:1:"1";}i:3;a:3:{s:4:"type";s:5:"label";s:4:"name";s:16:"${row}[org_unit]";s:7:"no_lang";s:1:"1";}i:4;a:3:{s:4:"type";s:5:"label";s:4:"name";s:13:"${row}[title]";s:7:"no_lang";s:1:"1";}i:5;a:3:{s:4:"type";s:5:"label";s:4:"name";s:17:"${row}[first_org]";s:7:"no_lang";s:1:"1";}s:4:"name";s:10:"${row}[id]";}s:1:"C";a:4:{s:4:"type";s:10:"select-cat";s:4:"size";s:1:"1";s:4:"name";s:14:"${row}[cat_id]";s:8:"readonly";s:1:"1";}s:1:"D";a:2:{s:4:"type";s:5:"image";s:4:"name";s:13:"${row}[photo]";}s:1:"E";a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"4,,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:4:"name";s:27:"${row}[adr_one_countryname]";s:7:"no_lang";s:1:"1";}i:2;a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:7:"3,0,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:24:"${row}[adr_one_locality]";}i:2;a:4:{s:4:"type";s:5:"label";s:4:"span";s:9:",leftPad5";s:7:"no_lang";s:1:"1";s:4:"name";s:22:"${row}[adr_one_region]";}i:3;a:5:{s:4:"type";s:5:"label";s:4:"name";s:26:"${row}[adr_one_postalcode]";s:4:"span";s:9:",leftPad5";s:5:"label";s:1:" ";s:7:"no_lang";s:1:"1";}}i:3;a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:22:"${row}[adr_one_street]";}i:4;a:3:{s:4:"type";s:5:"label";s:4:"name";s:23:"${row}[adr_one_street2]";s:7:"no_lang";s:1:"1";}}s:1:"F";a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"4,,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:4:"name";s:27:"${row}[adr_two_countryname]";s:7:"no_lang";s:1:"1";}i:2;a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"3,,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:24:"${row}[adr_two_locality]";}i:2;a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:22:"${row}[adr_two_region]";}i:3;a:5:{s:4:"type";s:5:"label";s:4:"name";s:26:"${row}[adr_two_postalcode]";s:4:"span";s:9:",leftPad5";s:5:"label";s:1:" ";s:7:"no_lang";s:1:"1";}}i:3;a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:22:"${row}[adr_two_street]";}i:4;a:3:{s:4:"type";s:5:"label";s:4:"name";s:23:"${row}[adr_two_street2]";s:7:"no_lang";s:1:"1";}}s:1:"G";a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"4,,0,0";i:1;a:5:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:16:"${row}[tel_work]";s:4:"span";s:11:",telNumbers";s:4:"size";s:53:",$row_cont[tel_work_link],,,calling,$cont[call_popup]";}i:2;a:5:{s:4:"type";s:5:"label";s:4:"name";s:16:"${row}[tel_cell]";s:7:"no_lang";s:1:"1";s:4:"span";s:11:",telNumbers";s:4:"size";s:53:",$row_cont[tel_cell_link],,,calling,$cont[call_popup]";}i:3;a:5:{s:4:"type";s:5:"label";s:4:"name";s:16:"${row}[tel_home]";s:7:"no_lang";s:1:"1";s:4:"span";s:11:",telNumbers";s:4:"size";s:53:",$row_cont[tel_home_link],,,calling,$cont[call_popup]";}i:4;a:4:{s:4:"type";s:5:"label";s:4:"name";s:20:"${row}[tel_prefered]";s:7:"no_lang";s:1:"1";s:4:"size";s:57:",$row_cont[tel_prefered_link],,,calling,$cont[call_popup]";}}s:1:"H";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"3,,0,0";i:1;a:5:{s:4:"type";s:5:"label";s:4:"size";s:3:",,1";s:4:"span";s:12:",fixedHeight";s:7:"no_lang";s:1:"1";s:4:"name";s:11:"${row}[url]";}i:2;a:5:{s:4:"type";s:5:"label";s:4:"size";s:52:",@${row}[email_link],,,_blank,$row_cont[email_popup]";s:4:"span";s:12:",fixedHeight";s:4:"name";s:13:"${row}[email]";s:7:"no_lang";s:1:"1";}i:3;a:5:{s:4:"type";s:5:"label";s:4:"size";s:62:",@${row}[email_home_link],,,_blank,$row_cont[email_home_popup]";s:4:"span";s:12:",fixedHeight";s:4:"name";s:18:"${row}[email_home]";s:7:"no_lang";s:1:"1";}}s:1:"I";a:7:{s:4:"type";s:4:"grid";s:4:"size";s:15:",48,0,,0,0,auto";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:4:{s:4:"type";s:5:"label";s:4:"span";s:12:",fixedHeight";s:7:"no_lang";s:1:"1";s:4:"name";s:4:"$row";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"name";s:20:"${row}[customfields]";s:7:"options";a:5:{i:1;s:2:"48";i:6;s:4:"auto";i:4;s:1:"0";i:5;s:1:"0";i:2;s:1:"0";}}s:1:"J";a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"4,,0,0";i:1;a:4:{s:4:"type";s:9:"date-time";s:4:"name";s:15:"${row}[created]";s:8:"readonly";s:1:"1";s:4:"span";s:7:",noWrap";}i:2;a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:15:"${row}[creator]";s:8:"readonly";s:1:"1";}i:3;a:4:{s:4:"type";s:9:"date-time";s:4:"name";s:16:"${row}[modified]";s:8:"readonly";s:1:"1";s:4:"span";s:8:",noBreak";}i:4;a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:16:"${row}[modifier]";s:8:"readonly";s:1:"1";}}s:1:"K";a:8:{s:4:"type";s:4:"hbox";s:4:"size";s:5:"5,0,0";i:1;a:4:{s:4:"type";s:6:"button";s:4:"name";s:23:"document[$row_cont[id]]";s:4:"size";s:3:"new";s:5:"label";s:18:"Insert in document";}i:2;a:4:{s:4:"type";s:5:"image";s:4:"size";s:52:"addressbook.uicontacts.view&contact_id=$row_cont[id]";s:5:"label";s:4:"View";s:4:"name";s:4:"view";}i:3;a:5:{s:4:"type";s:6:"button";s:4:"size";s:4:"edit";s:5:"label";s:4:"Edit";s:7:"onclick";s:189:"window.open(egw::link(\'/index.php\',\'menuaction=addressbook.uicontacts.edit&contact_id=$row_cont[id]\'),\'_blank\',\'dependent=yes,width=850,height=440,scrollbars=yes,status=yes\'); return false;";s:4:"name";s:19:"edit[$row_cont[id]]";}i:4;a:6:{s:4:"type";s:6:"button";s:4:"name";s:21:"delete[$row_cont[id]]";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:4:"help";s:19:"Delete this contact";s:7:"onclick";s:38:"return confirm(\'Delete this contact\');";}s:4:"span";s:8:",noPrint";i:5;a:5:{s:4:"type";s:8:"checkbox";s:4:"name";s:9:"checked[]";s:4:"size";s:13:"$row_cont[id]";s:4:"help";s:45:"Select multiple contacts for a further action";s:5:"align";s:5:"right";}}}}s:4:"rows";i:2;s:4:"cols";i:11;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1145192391',); +$templ_data[] = array('name' => 'addressbook.index.rows','template' => '','lang' => '','group' => '0','version' => '1.4.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:6:{s:2:"c1";s:2:"th";s:2:"c2";s:7:"row,top";s:1:"I";s:17:",@no_customfields";s:1:"F";s:9:",@no_home";s:1:"D";s:12:"60,@no_photo";s:1:"K";s:2:"90";}i:1;a:11:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:6:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:5:{s:2:"h2";s:16:",!@order=n_given";s:2:"h5";s:84:",!@order=/^(org_name|n_fileas|adr_one_postalcode|contact_modified|contact_created)$/";s:2:"h3";s:17:",!@order=n_family";s:2:"h1";s:17:",!@order=n_fileas";s:2:"h6";s:16:",@order=n_fileas";}i:1;a:2:{s:1:"A";a:4:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"span";s:3:"all";s:5:"label";s:11:"own sorting";s:4:"name";s:8:"n_fileas";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:7:"n_given";s:5:"label";s:9:"Firstname";}s:1:"B";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:4:"Name";s:4:"name";s:8:"n_family";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:4:"Name";s:4:"name";s:8:"n_family";}s:1:"B";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:7:"n_given";s:5:"label";s:9:"Firstname";}}i:4;a:2:{s:1:"A";a:4:{s:4:"name";s:8:"org_name";s:5:"label";s:12:"Organisation";s:4:"span";s:3:"all";s:4:"type";s:20:"nextmatch-sortheader";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:5;a:2:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:8:"n_family";s:5:"label";s:4:"Name";}s:1:"B";a:4:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:7:"n_given";s:5:"label";s:9:"Firstname";s:4:"span";s:9:",leftPad5";}}i:6;a:2:{s:1:"A";a:4:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"span";s:3:"all";s:5:"label";s:11:"own sorting";s:4:"name";s:8:"n_fileas";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:6;s:4:"cols";i:2;s:7:"options";a:2:{i:4;s:1:"0";i:5;s:1:"0";}s:4:"size";s:7:",,,,0,0";}s:1:"C";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:8:"Category";s:4:"name";s:6:"cat_id";}s:1:"D";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:5:"Photo";s:4:"name";s:5:"photo";}s:1:"E";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"3,,0,0";i:1;a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:16:"Business address";s:4:"name";s:8:"business";}i:2;a:4:{s:4:"type";s:22:"nextmatch-customfilter";s:4:"name";s:19:"adr_one_countryname";s:4:"size";s:24:"select-country,Country,1";s:4:"span";s:14:",countrySelect";}i:3;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:18:"adr_one_postalcode";s:5:"label";s:8:"zip code";}}s:1:"F";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:12:"Home address";s:4:"name";s:4:"home";}s:1:"G";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"3,,0,0";i:1;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:8:"tel_work";s:5:"label";s:14:"Business phone";}i:2;a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:12:"Mobile phone";s:4:"name";s:8:"tel_cell";}i:3;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:8:"tel_home";s:5:"label";s:10:"Home phone";}}s:1:"H";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"3,,0,0";i:1;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:3:"url";s:5:"label";s:3:"Url";}i:2;a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:14:"Business email";s:4:"name";s:5:"email";}i:3;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:10:"email_home";s:5:"label";s:10:"Home email";}}s:1:"I";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"2,,0,0";i:1;a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:12:"customfields";s:4:"size";s:13:"Custom fields";}i:2;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:25:"customfields[$row][label]";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:7:",,,,0,0";}}s:1:"J";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"2,,0,0";i:1;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:15:"contact_created";s:5:"label";s:7:"Created";}i:2;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:16:"contact_modified";s:5:"label";s:13:"Last modified";}}s:1:"K";a:6:{s:4:"type";s:4:"hbox";s:5:"align";s:6:"center";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Actions";s:5:"align";s:6:"center";}i:2;a:8:{s:4:"type";s:6:"button";s:4:"size";s:5:"check";s:5:"label";s:9:"Check all";s:4:"name";s:9:"check_all";s:4:"help";s:9:"Check all";s:7:"onclick";s:60:"toggle_all(this.form,form::name(\'checked[]\')); return false;";s:6:"needed";s:1:"1";s:5:"align";s:5:"right";}s:4:"span";s:8:",noPrint";}}i:2;a:11:{s:1:"A";a:5:{s:4:"type";s:5:"image";s:5:"label";s:21:"$row_cont[type_label]";s:4:"name";s:12:"${row}[type]";s:5:"align";s:6:"center";s:7:"no_lang";s:1:"1";}s:1:"B";a:8:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"5,,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:4:"name";s:13:"${row}[line1]";s:7:"no_lang";s:1:"1";}i:2;a:3:{s:4:"type";s:5:"label";s:4:"name";s:13:"${row}[line2]";s:7:"no_lang";s:1:"1";}i:3;a:3:{s:4:"type";s:5:"label";s:4:"name";s:16:"${row}[org_unit]";s:7:"no_lang";s:1:"1";}i:4;a:3:{s:4:"type";s:5:"label";s:4:"name";s:13:"${row}[title]";s:7:"no_lang";s:1:"1";}i:5;a:3:{s:4:"type";s:5:"label";s:4:"name";s:17:"${row}[first_org]";s:7:"no_lang";s:1:"1";}s:4:"name";s:10:"${row}[id]";}s:1:"C";a:4:{s:4:"type";s:10:"select-cat";s:4:"size";s:1:"1";s:4:"name";s:14:"${row}[cat_id]";s:8:"readonly";s:1:"1";}s:1:"D";a:2:{s:4:"type";s:5:"image";s:4:"name";s:13:"${row}[photo]";}s:1:"E";a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"4,,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:4:"name";s:27:"${row}[adr_one_countryname]";s:7:"no_lang";s:1:"1";}i:2;a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:7:"3,0,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:24:"${row}[adr_one_locality]";}i:2;a:4:{s:4:"type";s:5:"label";s:4:"span";s:9:",leftPad5";s:7:"no_lang";s:1:"1";s:4:"name";s:22:"${row}[adr_one_region]";}i:3;a:5:{s:4:"type";s:5:"label";s:4:"name";s:26:"${row}[adr_one_postalcode]";s:4:"span";s:9:",leftPad5";s:5:"label";s:1:" ";s:7:"no_lang";s:1:"1";}}i:3;a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:22:"${row}[adr_one_street]";}i:4;a:3:{s:4:"type";s:5:"label";s:4:"name";s:23:"${row}[adr_one_street2]";s:7:"no_lang";s:1:"1";}}s:1:"F";a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"4,,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:4:"name";s:27:"${row}[adr_two_countryname]";s:7:"no_lang";s:1:"1";}i:2;a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"3,,0,0";i:1;a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:24:"${row}[adr_two_locality]";}i:2;a:4:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:22:"${row}[adr_two_region]";s:4:"span";s:9:",leftPad5";}i:3;a:5:{s:4:"type";s:5:"label";s:4:"name";s:26:"${row}[adr_two_postalcode]";s:4:"span";s:9:",leftPad5";s:5:"label";s:1:" ";s:7:"no_lang";s:1:"1";}}i:3;a:3:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:22:"${row}[adr_two_street]";}i:4;a:3:{s:4:"type";s:5:"label";s:4:"name";s:23:"${row}[adr_two_street2]";s:7:"no_lang";s:1:"1";}}s:1:"G";a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"4,,0,0";i:1;a:5:{s:4:"type";s:5:"label";s:7:"no_lang";s:1:"1";s:4:"name";s:16:"${row}[tel_work]";s:4:"span";s:11:",telNumbers";s:4:"size";s:53:",$row_cont[tel_work_link],,,calling,$cont[call_popup]";}i:2;a:5:{s:4:"type";s:5:"label";s:4:"name";s:16:"${row}[tel_cell]";s:7:"no_lang";s:1:"1";s:4:"span";s:11:",telNumbers";s:4:"size";s:53:",$row_cont[tel_cell_link],,,calling,$cont[call_popup]";}i:3;a:5:{s:4:"type";s:5:"label";s:4:"name";s:16:"${row}[tel_home]";s:7:"no_lang";s:1:"1";s:4:"span";s:11:",telNumbers";s:4:"size";s:53:",$row_cont[tel_home_link],,,calling,$cont[call_popup]";}i:4;a:4:{s:4:"type";s:5:"label";s:4:"name";s:20:"${row}[tel_prefered]";s:7:"no_lang";s:1:"1";s:4:"size";s:57:",$row_cont[tel_prefered_link],,,calling,$cont[call_popup]";}}s:1:"H";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"3,,0,0";i:1;a:5:{s:4:"type";s:5:"label";s:4:"size";s:3:",,1";s:4:"span";s:12:",fixedHeight";s:7:"no_lang";s:1:"1";s:4:"name";s:11:"${row}[url]";}i:2;a:5:{s:4:"type";s:5:"label";s:4:"size";s:52:",@${row}[email_link],,,_blank,$row_cont[email_popup]";s:4:"span";s:12:",fixedHeight";s:4:"name";s:13:"${row}[email]";s:7:"no_lang";s:1:"1";}i:3;a:5:{s:4:"type";s:5:"label";s:4:"size";s:62:",@${row}[email_home_link],,,_blank,$row_cont[email_home_popup]";s:4:"span";s:12:",fixedHeight";s:4:"name";s:18:"${row}[email_home]";s:7:"no_lang";s:1:"1";}}s:1:"I";a:7:{s:4:"type";s:4:"grid";s:4:"size";s:15:",48,0,,0,0,auto";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:4:{s:4:"type";s:5:"label";s:4:"span";s:12:",fixedHeight";s:7:"no_lang";s:1:"1";s:4:"name";s:4:"$row";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"name";s:20:"${row}[customfields]";s:7:"options";a:5:{i:1;s:2:"48";i:6;s:4:"auto";i:4;s:1:"0";i:5;s:1:"0";i:2;s:1:"0";}}s:1:"J";a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"4,,0,0";i:1;a:4:{s:4:"type";s:9:"date-time";s:4:"name";s:15:"${row}[created]";s:8:"readonly";s:1:"1";s:4:"span";s:7:",noWrap";}i:2;a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:15:"${row}[creator]";s:8:"readonly";s:1:"1";}i:3;a:4:{s:4:"type";s:9:"date-time";s:4:"name";s:16:"${row}[modified]";s:8:"readonly";s:1:"1";s:4:"span";s:8:",noBreak";}i:4;a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:16:"${row}[modifier]";s:8:"readonly";s:1:"1";}}s:1:"K";a:8:{s:4:"type";s:4:"hbox";s:4:"size";s:5:"5,0,0";i:1;a:4:{s:4:"type";s:6:"button";s:4:"name";s:23:"document[$row_cont[id]]";s:4:"size";s:3:"new";s:5:"label";s:18:"Insert in document";}i:2;a:4:{s:4:"type";s:5:"image";s:4:"size";s:52:"addressbook.uicontacts.view&contact_id=$row_cont[id]";s:5:"label";s:4:"View";s:4:"name";s:4:"view";}i:3;a:5:{s:4:"type";s:6:"button";s:4:"size";s:4:"edit";s:5:"label";s:4:"Edit";s:7:"onclick";s:189:"window.open(egw::link(\'/index.php\',\'menuaction=addressbook.uicontacts.edit&contact_id=$row_cont[id]\'),\'_blank\',\'dependent=yes,width=850,height=440,scrollbars=yes,status=yes\'); return false;";s:4:"name";s:19:"edit[$row_cont[id]]";}i:4;a:6:{s:4:"type";s:6:"button";s:4:"name";s:21:"delete[$row_cont[id]]";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:4:"help";s:19:"Delete this contact";s:7:"onclick";s:38:"return confirm(\'Delete this contact\');";}s:4:"span";s:8:",noPrint";i:5;a:5:{s:4:"type";s:8:"checkbox";s:4:"name";s:9:"checked[]";s:4:"size";s:13:"$row_cont[id]";s:4:"help";s:45:"Select multiple contacts for a further action";s:5:"align";s:5:"right";}}}}s:4:"rows";i:2;s:4:"cols";i:11;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1145192391',); $templ_data[] = array('name' => 'addressbook.search','template' => '','lang' => '','group' => '0','version' => '','data' => 'a:1:{i:0;a:4:{s:4:"type";s:4:"grid";s:4:"data";a:4:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:8:"template";s:4:"name";s:16:"addressbook.edit";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:6:"select";s:5:"label";s:8:"Operator";s:4:"name";s:8:"operator";s:7:"no_lang";s:1:"1";}i:2;a:3:{s:4:"type";s:6:"select";s:4:"name";s:11:"meth_select";s:7:"no_lang";s:1:"1";}s:4:"span";s:3:"all";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:3;a:2:{s:1:"A";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";s:4:"span";s:3:"all";i:1;a:4:{s:4:"type";s:6:"button";s:5:"label";s:6:"Search";s:4:"name";s:14:"button[search]";s:7:"onclick";s:37:"xajax_eT_wrapper(this); return false;";}i:2;a:4:{s:4:"type";s:6:"button";s:5:"label";s:6:"Cancel";s:4:"name";s:14:"button[cancel]";s:7:"onclick";s:29:"window.close(); return false;";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:3;s:4:"cols";i:2;}}','size' => '','style' => '','modified' => '1161707411',); diff --git a/addressbook/templates/default/index.xet b/addressbook/templates/default/index.xet index 7c347a080a..fdb2feab20 100644 --- a/addressbook/templates/default/index.xet +++ b/addressbook/templates/default/index.xet @@ -128,7 +128,7 @@ - + From 4268f2a3568f6f64c880b62092f8fa38d37f7b0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cornelius=20Wei=C3=9F?= Date: Sat, 23 Jun 2007 12:06:08 +0000 Subject: [PATCH 07/36] fix: skip empty lines, even if conversion fills (empty) record --- .../class.import_contacts_csv.inc.php | 54 +++++++++++++------ 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/addressbook/importexport/class.import_contacts_csv.inc.php b/addressbook/importexport/class.import_contacts_csv.inc.php index d39b2414df..c6aeaaf8c8 100644 --- a/addressbook/importexport/class.import_contacts_csv.inc.php +++ b/addressbook/importexport/class.import_contacts_csv.inc.php @@ -23,18 +23,17 @@ class import_contacts_csv implements iface_import_plugin { 'fieldsep', // char 'charset', // string 'contact_owner', // int + 'update_cats', // string {override|add} overides record + // with cat(s) from csv OR add the cat from + // csv file to exeisting cat(s) of record + 'num_header_lines', // int number of header lines 'field_conversion', // array( $csv_col_num => conversion) 'field_mapping', // array( $csv_col_num => adb_filed) - 'has_header_line', //bool 'conditions', /* => array containing condition arrays: 'type' => exists, // exists 'string' => '#kundennummer', 'true' => array( 'action' => update, - 'options' => array ( - update_cats' => 'add' // string {override|add} overides record - ), // with cat(s) from csv OR add the cat from - // csv file to exeisting cat(s) of record 'last' => true, ), 'false' => array( @@ -56,6 +55,11 @@ class import_contacts_csv implements iface_import_plugin { */ private static $conditions = array( 'exists', 'greater', 'greater or equal', ); + /** + * @var definition + */ + private $definition; + /** * @var bocontacts */ @@ -66,6 +70,16 @@ class import_contacts_csv implements iface_import_plugin { */ private $dry_run = false; + /** + * @var bool is current user admin? + */ + private $is_admin = false; + + /** + * @var int + */ + private $user = null; + /** * imports entries according to given definition object. * @param resource $_stream @@ -78,6 +92,12 @@ class import_contacts_csv implements iface_import_plugin { 'charset' => $_definition->plugin_options['charset'], )); + $this->definition = $_definition; + + // user, is admin ? + $this->is_admin = isset( $GLOBALS['egw_info']['user']['apps']['admin'] ) && $GLOBALS['egw_info']['user']['apps']['admin']; + $this->user = $GLOBALS['egw_info']['user']['account_id']; + // dry run? $this->dry_run = isset( $_definition->plugin_options['dry_run'] ) ? $_definition->plugin_options['dry_run'] : false; @@ -90,22 +110,24 @@ class import_contacts_csv implements iface_import_plugin { // set FieldConversion $import_csv->conversion = $_definition->plugin_options['field_conversion']; - //check if file has a header line - if ($_definition->plugin_options['has_header_line']) { - $record = $import_csv->get_record(); + //check if file has a header lines + if ( isset( $_definition->plugin_options['num_header_lines'] ) ) { + $import_csv->skip_records($_definition->plugin_options['num_header_lines']); } - // set contactOwner - if ( isset( $_definition->plugin_options['contact_owner'] ) - && abs( $_definition->plugin_options['contact_owner'] > 0 ) ) { - $record['contact_owner'] = $_definition->plugin_options['contact_owner']; - } + // set eventOwner + $_definition->plugin_options['contact_owner'] = isset( $_definition->plugin_options['contact_owner'] ) ? + $_definition->plugin_options['contact_owner'] : $this->user; while ( $record = $import_csv->get_record() ) { // don't import empty contacts if( count( array_unique( $record ) ) < 2 ) continue; - + + if ( $_definition->plugin_options['contact_owner'] != -1 ) { + $record['contact_owner'] = $_definition->plugin_options['contact_owner']; + } else unset( $record['contact_owner'] ); + if ( $_definition->plugin_options['conditions'] ) { foreach ( $_definition->plugin_options['conditions'] as $condition ) { switch ( $condition['type'] ) { @@ -113,7 +135,7 @@ class import_contacts_csv implements iface_import_plugin { case 'exists' : $contacts = $this->bocontacts->search( array( $condition['string'] => $record[$condition['string']],), - $condition['true']['options']['update_cats'] == 'add' ? false : true + $_definition->plugin_options['update_cats'] == 'add' ? false : true ); if ( is_array( $contacts ) && count( array_keys( $contacts ) >= 1 ) ) { @@ -121,7 +143,7 @@ class import_contacts_csv implements iface_import_plugin { $action = $condition['true']; foreach ( (array)$contacts as $contact ) { $record['id'] = $contact['id']; - if ( $condition['true']['options']['update_cats'] == 'add' ) { + if ( $_definition->plugin_options['update_cats'] == 'add' ) { if ( !is_array( $contact['cat_id'] ) ) $contact['cat_id'] = explode( ',', $contact['cat_id'] ); if ( !is_array( $record['cat_id'] ) ) $record['cat_id'] = explode( ',', $record['cat_id'] ); $record['cat_id'] = implode( ',', array_unique( array_merge( $record['cat_id'], $contact['cat_id'] ) ) ); From d63a7d622d38d3c9faacc41988e89317e4d8dc23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cornelius=20Wei=C3=9F?= Date: Sat, 23 Jun 2007 12:07:18 +0000 Subject: [PATCH 08/36] fix: skip empty lines, even if conversion fills (empty) record add: custom_strtotime in importexport_helper_functions --- importexport/inc/class.import_csv.inc.php | 14 +++++ ...ass.import_export_helper_functions.inc.php | 56 ++++++++++++++++++- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/importexport/inc/class.import_csv.inc.php b/importexport/inc/class.import_csv.inc.php index 08d0378640..bc6d36158a 100755 --- a/importexport/inc/class.import_csv.inc.php +++ b/importexport/inc/class.import_csv.inc.php @@ -93,10 +93,14 @@ class import_csv implements iface_import_record { //, Iterator { * @return mixed array with data / false if no furtor records */ public function get_record( $_position = 'next' ) { + if ($this->get_raw_record( $_position ) === false) { return false; } + // skip empty records + if( count( array_unique( $this->record ) ) < 2 ) return $this->get_record( $_position ); + if ( !empty( $this->conversion ) ) { $this->do_conversions(); } @@ -108,6 +112,16 @@ class import_csv implements iface_import_record { //, Iterator { return $this->record; } // end of member function get_record + /** + * Skips $_numToSkip of records from current position on + * + * @param int $_numToSkip + */ + public function skip_records( $_numToSkip ) { + while ( (int)$_numToSkip-- !== 0 ) { + fgetcsv( $this->resource, self::csv_max_linelength, $this->csv_fieldsep); + } + } /** * updates $this->record diff --git a/importexport/inc/class.import_export_helper_functions.inc.php b/importexport/inc/class.import_export_helper_functions.inc.php index be0d7a2e47..358411adf1 100755 --- a/importexport/inc/class.import_export_helper_functions.inc.php +++ b/importexport/inc/class.import_export_helper_functions.inc.php @@ -20,6 +20,50 @@ class import_export_helper_functions { * nothing to construct here, only static functions! */ + /** + * Converts a custom time string to to unix timestamp + * The format of the time string is given by the argument $_format + * which takes the same parameters as the php date() function. + * + * @abstract supportet formatstrings: d,m,y,Y,H,h,i,O,a,A + * 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 + */ + public static function custom_strtotime( $_string, $_format='' ) { + if ( empty( $_format ) ) return strtotime( $_string ); + $fparams = explode( ',', chunk_split( $_format, 1, ',' ) ); + $spos = 0; + foreach ( $fparams as $fparam ) { + + switch ( $fparam ) { + case 'd': (int)$day = substr( $_string, $spos, 2 ); $spos += 2; break; + case 'm': (int)$mon = substr( $_string, $spos, 2 ); $spos += 2; break; + case 'y': (int)$year = substr( $_string, $spos, 2 ); $spos += 2; break; + case 'Y': (int)$year = substr( $_string, $spos, 4 ); $spos += 4; break; + case 'H': (int)$hour = substr( $_string, $spos, 2 ); $spos += 2; break; + case 'h': (int)$hour = substr( $_string, $spos, 2 ); $spos += 2; break; + case 'i': (int)$min = substr( $_string, $spos, 2 ); $spos += 2; break; + case 'O': (int)$offset = $year = substr( $_string, $spos, 5 ); $spos += 5; break; + case 'a': (int)$hour = $fparam == 'am' ? $hour : $hour + 12; break; + case 'A': (int)$hour = $fparam == 'AM' ? $hour : $hour + 12; break; + default: $spos++; // seperator + } + } + + print_debug("hour:$hour; min:$min; sec:$sec; mon:$mon; day:$day; year:$year;\n"); + $timestamp = mktime($hour, $min, $sec, $mon, $day, $year, 0); + + // offset given? + if ( isset( $offset ) && strlen( $offset == 5 ) ) { + $operator = $offset{0}; + $ohour = 60 * 60 * (int)substr( $offset, 1, 2 ); + $omin = 60 * (int)substr( $offset, 3, 2 ); + if ( $operator == '+' ) $timestamp += $ohour + $omin; + else $timestamp -= $ohour + $omin; + } + return $timestamp; + } /** * converts accound_lid to account_id * @@ -168,7 +212,7 @@ class import_export_helper_functions { ); } - $val = preg_replace_callback( "/(cat|account)\(([^)]+)\)/i", array( self, 'c2_dispatcher') , $val ); + $val = preg_replace_callback( "/(cat|account|strtotime)\(([^)]+)\)/i", array( self, 'c2_dispatcher') , $val ); } } $values[$idx] = $val; @@ -187,8 +231,14 @@ class import_export_helper_functions { $action = &$_matches[1]; // cat or account ... $data = &$_matches[2]; // datas for action - $method = (string)$action. ( is_int( $data ) ? '_id2name' : '_name2id' ); - return self::$method( $data ); + switch ( $action ) { + case 'strtotime' : + list( $string, $format ) = explode( ',', $data ); + return self::custom_strtotime( trim( $string ), trim( $format ) ); + default : + $method = (string)$action. ( is_int( $data ) ? '_id2name' : '_name2id' ); + return self::$method( $data ); + } } /** From 8d739d827f7bfc2bbbbdd301e43102d398ce7aab Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sat, 23 Jun 2007 17:45:54 +0000 Subject: [PATCH 09/36] "fixed bug reported in xmlrpc read by Esben" --- addressbook/inc/class.boaddressbook.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addressbook/inc/class.boaddressbook.inc.php b/addressbook/inc/class.boaddressbook.inc.php index 414a3091af..c73276c753 100644 --- a/addressbook/inc/class.boaddressbook.inc.php +++ b/addressbook/inc/class.boaddressbook.inc.php @@ -380,7 +380,7 @@ class boaddressbook if($data !== false) // permission denied { - $data = array($this->data2xmlrpc($data)); + $data = $this->data2xmlrpc(array($data)); return $data[0]; } From 8f1f3f68cb6347586b350f9e60221e90a9ab8dd9 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sun, 24 Jun 2007 08:36:20 +0000 Subject: [PATCH 10/36] "fix to detect if a table depends on a sequence to not try to drop it separate, thanks to Peter Eisentraut " --- phpgwapi/inc/adodb/datadict/datadict-postgres.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpgwapi/inc/adodb/datadict/datadict-postgres.inc.php b/phpgwapi/inc/adodb/datadict/datadict-postgres.inc.php index fd1aa46b06..c313e4aba3 100644 --- a/phpgwapi/inc/adodb/datadict/datadict-postgres.inc.php +++ b/phpgwapi/inc/adodb/datadict/datadict-postgres.inc.php @@ -289,7 +289,7 @@ class ADODB2_postgres extends ADODB_DataDict { $seq = $this->connection->GetOne("SELECT relname FROM pg_class WHERE NOT relname ~ 'pg_.*' AND relname LIKE $tabname AND relkind='S'"); // check if a tables depends on the sequenz and it therefor cant and dont need to be droped separatly - if (!$seq || $this->connection->GetOne("SELECT relname FROM pg_class JOIN pg_depend ON pg_class.relfilenode=pg_depend.objid WHERE relname='$seq' AND relkind='S' AND deptype='i'")) { + if (!$seq || $this->connection->GetOne("SELECT relname FROM pg_class JOIN pg_depend ON pg_class.oid=pg_depend.objid WHERE relname='$seq' AND relkind='S' AND deptype='i'")) { return False; } return "DROP SEQUENCE ".$seq; From f9023da5e2d5c23ba1d3560feaf3b88136d8877f Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sun, 24 Jun 2007 09:19:48 +0000 Subject: [PATCH 11/36] "fix for bug #928: Distribution lists are not working with pgsql, thanks to Peter Eisentraut postgres requires that expressions in order by appear in the columns of a distinct select" --- addressbook/inc/class.socontacts_sql.inc.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addressbook/inc/class.socontacts_sql.inc.php b/addressbook/inc/class.socontacts_sql.inc.php index 7f3a5b2cbf..a2f0c828a1 100644 --- a/addressbook/inc/class.socontacts_sql.inc.php +++ b/addressbook/inc/class.socontacts_sql.inc.php @@ -328,6 +328,12 @@ class socontacts_sql extends so_sql $filter[] = $this->table_name.'.contact_owner='.(int)$filter['owner']; unset($filter['owner']); } + // postgres requires that expressions in order by appear in the columns of a distinct select + if ($this->db->Type != 'mysql' && preg_match("/(\w+<>'')/",$order_by,$matches)) + { + if (!is_array($extra_cols)) $extra_cols = $extra_cols ? explode(',',$extra_cols) : array(); + $extra_cols[] = $matches[1]; + } } $rows =& parent::search($criteria,$only_keys,$order_by,$extra_cols,$wildcard,$empty,$op,$start,$filter,$join,$need_full_no_count); From 99771edd87c6e84cce6342b5f82b1c7ea736db30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oscar=20Manuel=20G=C3=B3mez=20Senovilla?= Date: Sun, 24 Jun 2007 21:55:08 +0000 Subject: [PATCH 12/36] language updates --- addressbook/setup/phpgw_el.lang | 222 +++++++++++++++++++++++++--- addressbook/setup/phpgw_es-es.lang | 38 +++++ addressbook/setup/phpgw_pt-br.lang | 71 +++++---- addressbook/setup/phpgw_sl.lang | 26 +++- addressbook/setup/phpgw_zh-tw.lang | 22 +++ admin/setup/phpgw_el.lang | 129 ++++++++++++---- calendar/setup/phpgw_es-es.lang | 4 + calendar/setup/phpgw_sl.lang | 8 +- calendar/setup/phpgw_zh-tw.lang | 4 + importexport/setup/phpgw_es-es.lang | 10 ++ importexport/setup/phpgw_zh-tw.lang | 10 ++ infolog/setup/phpgw_es-es.lang | 45 +++++- infolog/setup/phpgw_zh-tw.lang | 40 ++++- phpgwapi/setup/phpgw_el.lang | 140 ++++++++++++++++-- preferences/setup/phpgw_sl.lang | 2 +- 15 files changed, 681 insertions(+), 90 deletions(-) diff --git a/addressbook/setup/phpgw_el.lang b/addressbook/setup/phpgw_el.lang index 9a0c29bde8..fb1b221d8e 100644 --- a/addressbook/setup/phpgw_el.lang +++ b/addressbook/setup/phpgw_el.lang @@ -1,158 +1,342 @@ +%1 added addressbook el %1 προστέθηκε +%1 contact(s) %2 addressbook el %1 επαφή(ές) %2 +%1 contact(s) %2, %3 failed because of insufficent rights !!! addressbook el %1 επαφή(ές) %2, %3 απέτυχαν εξαιτίας ανεπαρκών δικαιωμάτων !!! +%1 fields in %2 other organisation member(s) changed addressbook el %1 πεδία σε %2 άλλου οργανισμού μέλος(η) άλλαξαν %1 records imported addressbook el %1 εγγραφές εισήχθησαν %1 records read (not yet imported, you may go %2back%3 and uncheck test import) addressbook el %1 εγγραφές αναγνώσθηκαν (δεν εισηχθησαν ακόμη, μπορείτε να %2επιστρέψετε%3 και να ξετσεκάρετε τη Δοκιμαστική Εισαγωγή) +%1 starts with '%2' addressbook el %1 ξεκινά με '%2' +%s please calculate the result addressbook el %s παρακαλώ υπολογίστε το αποτέλεσμα (e.g. 1969) addressbook el (π.χ. 1969) -no conversion type <none> could be located. please choose a conversion type from the list addressbook el Κανένας τύπος μετατροπής <none> δεν εντοπίστηκε. Παρακαλώ επιλέξτε έναν τύπο μετατροπής από τον κατάλογο +no conversion type <none> could be located. please choose a conversion type from the list addressbook el Κανένας τύπος μετατροπής δεν εντοπίστηκε. Παρακαλώ επιλέξτε έναν τύπο μετατροπής από τον κατάλογο @-eval() is only availible to admins!!! addressbook el @-eval() διατίθεται μόνο σε διαχειριστές!!! +account repository admin el Ταμείο λογαριασμού +accounts addressbook el Λογαριασμοί actions addressbook el Ενέργειες +add %1 addressbook el Προσθέστε %1 +add a contact to this organisation addressbook el Προσθέστε μία επαφή σε αυτόν τον οργανισμό +add a new contact addressbook el Προσθέστε μία νέα επαφή +add a new list addressbook el Προσθέστε μία νέα λίστα add a single entry by passing the fields. addressbook el Προσθέστε ένα λήμμα διαβαίνοντας τα πεδία. +add business email of whole distribution list? addressbook el Προσθήκη email εργασίας ολόκληρης της λίστας διανομής; add custom field addressbook el Πρόσθεση Τυχαίου Πεδίου +add to distribution list: addressbook el Προσθήκη στη λίστα διανομής: +added by synchronisation addressbook el προστέθηκε συγχρονισμένα +added to distribution list addressbook el προστέθηκε στη λίστα διανομής +additional information about using ldap as contact repository admin el Επιπρόσθετες πληροφορίες για τη χρήση του LDAP ως αποθήκη επαφής address book common el Επαφές address book - vcard in addressbook el Επαφές - VCard in address book - view addressbook el Επαφές - εμφάνιση address line 2 addressbook el Γραμμή Διευθύνσεων 2 -address line 3 addressbook el Γραμμή Διευθύνσεων 3 address type addressbook el Τύπος Διεύθυνσης addressbook common el Επαφές +addressbook csv export addressbook el CSV εξαγωγή επαφών +addressbook menu addressbook el Μενού επαφών addressbook preferences addressbook el Προτιμήσεις Επαφών +addressbook the contact should be saved to addressbook el Σε ποιο βιβλίο διεθύνσεων να αποθηκευτεί η επαφή addressbook-fieldname addressbook el Επαφές-Πεδίο ονόματος addvcard addressbook el Προσθήκη VCard +advanced search addressbook el Αναζήτηση για προχωρημένους +all contacts addressbook el Όλες οι επαφές +allow users to maintain their own account-data admin el Επιτρέψτε στους χρήστες να διατηρούν τα δικά τους στοιχεία λογαριασμού alt. csv import addressbook el Εναλλακτική εισαγωγή CSV +always addressbook el πάντα +apply changes to all members, whose fields have the same previous content addressbook el Εφαρμογή των αλλαγών σε όλα τα μέλη, των οποίων τα πεδία έχουν το ίδιο με προηγουμένως περιεχόμενο +apply the action on the whole query, not only the shown contacts!!! addressbook el Εφαρμογή της ενέργειας σε όλες τις απορίες, ΟΧΙ μόνο των εμφανιζόμενων επαφών!!! +are you shure you want to delete this contact? addressbook el Είστε σίγουρος ότι θέλετε να διαγράψετε αυτήν την επαφή; are you sure you want to delete this field? addressbook el Θέλετε σίγουρα να διαγραφεί αυτό το πεδίο; -bbs phone addressbook el Τηλέφωνο BBS +assistent addressbook el Βοηθός +assistent phone addressbook el τηλέφωνο ανάγκης birthday common el Ημέρα Γενεθλίων birthdays common el Γενέθλια blank addressbook el Κενό business common el Εργασία -business address type addressbook el Τύπος Διεύθυνσης Εργασίας +business address addressbook el Διεύθυνση εργασίας business city addressbook el Πόλη εργασίας business country addressbook el Χώρα Εργασίας business email addressbook el EMail Εργασίας -business email type addressbook el Τύπος EMail εργασίας business fax addressbook el Fax Εργασίας business phone addressbook el Τηλέφωνο εργασίας business state addressbook el Νομός εργασίας business street addressbook el Διεύθυνση εργασίας business zip code addressbook el Τ.Κ. εργασίας +calendar uri addressbook el Ημερολόγιο URI +can be changed via setup >> configuration admin el Μπορεί να αλλάξει μέσω Setup >> Configuration car phone addressbook el Τηλέφωνο αυτοκινήτου +categories, notes, ... addressbook el Κατηγορίες, Σημειώσεις, ... cell phone addressbook el Κινητό τηλέφωνο +change all organisation members addressbook el Αλλαγή όλων των μελών του οργανισμού +charset for the csv export addressbook el Κωδικοσελίδα για την CSV εξαγωγή charset of file addressbook el Κωδικοσελίδα αρχείου +check all addressbook el Έλεγχος όλων +choose an icon for this contact type admin el Επιλέξτε μία εικόνα για αυτόν τον τύπο επαφής +chosse an etemplate for this contact type admin el Επιλέξτε μία eΤαμπλέτα για αυτόν τον τύπο επαφής city common el Πόλη company common el Εταιρία -company name common el Ονομα εταιρίας +company name addressbook el Ονομα εταιρίας configuration common el Διαμόρφωση contact common el Επαφή contact application admin el Αίτηση επαφής +contact copied addressbook el Επαφή αντιγράφηκε +contact deleted addressbook el Επαφή διεγράφη +contact fields to show addressbook el Πεδία επαφών προς προβολή +contact id addressbook el Ταυτότητα επαφής +contact modified by %1 at %2 addressbook el Επαφή τροποποιήθηκε από %1 στις %2 +contact repository admin el Αποθήκη επαφής +contact saved addressbook el Επαφή αποθηκεύτηκε contact settings admin el Ρυθμίσεις επαφής +contactform addressbook el Φόρμα επαφής +contacts and account contact-data to ldap admin el επαφές και επαφή-στοιχεία λογαριασμού προς LDAP +contacts to ldap admin el επαφές προς LDAP +contacts to ldap, account contact-data to sql admin el επαφές προς LDAP, επαφή-στοιχεία λογαριασμού προς SQL +contains addressbook el περιέχει copied by %1, from record #%2. addressbook el Αντιγράφτηκε από %1, από την εγγραφή #%2. +copy a contact and edit the copy addressbook el Αντιγραφή επαφής και επεξεργασία αντιγράφου country common el Χώρα +create new links addressbook el Δημιουργία νέων συνδέσμων +created addressbook el Δημιουργήθηκε +credit addressbook el Πίστωση csv-fieldname addressbook el Ονομα πεδίου CSV csv-filename addressbook el Ονομα αρχείου CSV custom addressbook el Προσαρμογή +custom etemplate for the contactform addressbook el Προσαρμογή eΤαμπλέτας για τη φόρμα επαφών custom fields addressbook el Προσαρμοσμένα πεδία debug output in browser addressbook el Αποσφαλμάτωση εξαγωγής στο φυλλομετρητή +default address format addressbook el Προκαθορισμένη μορφή διευθύνσεων +default addressbook for adding contacts addressbook el Προκαθορισμένο βιβλίο διευθύνσεων για προσθήκη επαφών default filter addressbook el Προκαθορισμένο φίλτρο delete a single entry by passing the id. addressbook el Διαγραφή μιας καταχώρησης με εισαγωγή του id. -department common el Διαμέρισμα +delete selected distribution list! addressbook el Διαγραφή επιλεγμένης λίστας διανομής! +delete this contact addressbook el Διαγραφή αυτής της επαφής +delete this organisation including all its contacts addressbook el Διαγραφή αυτού του οργανισμού συμπεριλαμβανομένων και ΟΛΩΝ των επαφών του +deleted addressbook el διεγράφη +deletes the photo addressbook el Διαγραφή φωτογραφίας +department common el Τμήμα +departments addressbook el τμήματα +displays a remider for birthdays on the startpage (page you get when you enter egroupware or click on the homepage icon). addressbook el Δείχνει μία υπενθύμιση γενεθλίων στην αρχική σελίδα (η σελίδα που εμφανίζεται όταν εισέρχεστε στο eGroupWare ή όταν κάνετε κλικ στο εικονίδιο αρχικής σελίδας). +distribution list deleted addressbook el Λίστα διανομής διεγράφη +distribution lists addressbook el Λίστες διανομής +do your really want to delete this contact? addressbook el Θέλετε πραγματικά να διαγράψετε αυτήν την επαφή; +doesn't matter addressbook el δεν έχει σημασία domestic addressbook el Εσωτερικός +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 αρχείο edit custom field addressbook el Επεξεργασία προσαρμοσμένου πεδίου edit custom fields admin el Επεξεργασία προσαρμοσμένων πεδίων +edit extra account-data in the addressbook admin el Επεξεργασία επιπλέον στοιχείων λογαριασμού στο βιβλίο διευθύνσεων +edit phonenumbers - addressbook el Επεξαργασία αριθμών τηλεφώνων +either the configured email addesses are wrong or the mail configuration. addressbook el Είτε οι διαμορφωμένες διευθύνσεις των email είναι λάθος είτε η διαμόρφωση του μηνύματος. +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 Ενεργοποιήστε ένα έξτρα προσωπικό βιβλίο διευθύνσεων enter the path to the exported file here addressbook el Εισάγετε τη διαδρομή για το αρχείο εξαγωγής εδώ +error deleting the contact !!! addressbook el Σφάλμα στη διαγραφή της επαφής !!! +error saving the contact !!! addressbook el Σφάλμα στην αποθήκευση της επαφής !!! +existing links addressbook el Υπάρχοντες σύνδεσμοι +export addressbook el εξαγωγή +export as csv addressbook el Εξαγωγή ως CSV +export as vcard addressbook el Εξαγωγή ως VCard export contacts addressbook el Εξαγωγή επαφών export file name addressbook el Ονομα αρχείου εξαγωγής export from addressbook addressbook el Εξαγωγή από το βιβλίο Διευθύνσεων +export selection addressbook el Επιλογές εξαγωγής +exported addressbook el εξήχθη +exports contacts from your addressbook into a csv file. csv means 'comma seperated values'. however in the options tab you can also choose other seperators. addressbook el Εξάγει επαφές από το βιβλίο διευθύνσεών σας σε CSV αρχείο.CSV σημαίνει 'Comma Seperated Values'. Παρολαυτά στην καρτέλα Επιλογές μπορείτε επίσης να διαλέξετε και άλλους διαχωριστήρες. extra addressbook el Επιπλέον +failed to change %1 organisation member(s) (insufficent rights) !!! addressbook el Απέτυχε η αλλαγή του-των μέλους(η) του %1 οργανισμού (ανεπαρκή δικαιώματα)!!! fax addressbook el Fax fax number common el Αριθμός Fax field %1 has been added ! addressbook el Το πεδίο %1 προστέθηκε ! field %1 has been updated ! addressbook el Το πεδίο %1 ενημερώθηκε ! field name addressbook el Ονομα πεδίου +fields for the csv export addressbook el Πεδία για την CSV εξαγωγή +fields the user is allowed to edit himself admin el Πεδία τα οποία ο ίδιος ο χρήστης μπορεί να επεξεργαστεί fields to show in address list addressbook el Πεδία που θα εμφανίζονται στη λίστα διευθύνσεων fieldseparator addressbook el Διαχωριστής πεδίων +for read only ldap admin el Για ανάγνωση μόνο LDAP full name addressbook el Πλήρες όνομα +general addressbook el Γενικά geo addressbook el GEO global categories addressbook el Παγκόσμιες κατηγορίες grant addressbook access common el Πρόσβαση στο βιβλίο Διευθύνσεων -home address type addressbook el Τύπος Διεύθυνσης οικίας +group %1 addressbook el Ομάδα %1 +hide accounts from addressbook addressbook el Απόκρυψη λογαριασμών από το βιβλίο διευθύνσεων +hides accounts completly from the adressbook. addressbook el Αποκρύπτει λογαριασμούς εντελώς από το βιβλίο διευθύνσεων +home address addressbook el Διεύθυνση οικίας +home address, birthday, ... addressbook el Διεύθυνση οικίας, Γενέθλια, ... home city addressbook el Πόλη οικίας home country addressbook el Χώρα οικίας home email addressbook el Email οικίας -home email type addressbook el Τύπος email οικίας home phone addressbook el Τηλέφωνο οικίας home state addressbook el Νομός οικίας home street addressbook el Διεύθυνση οικίας home zip code addressbook el Τ.Κ. οικίας +how many contacts should non-admins be able to export (empty = no limit) admin el Πόσες επαφές επιθυμείτε οι μη διαχεριστές να μπορούν να εξάγουν (κενό=απεριόριστες) +icon addressbook el Εικόνα +if accounts are already in ldap admin el αν οι λογαριασμοί είναι ακόμα στο LDAP import addressbook el Εισαγωγή import contacts addressbook el Εισαγωγή επαφών import csv-file into addressbook addressbook el Εισαγωγή αρχείου CSV στο βιβλίο Διευθύνσεων import file addressbook el Εισαγωγή Αρχείου +import from addressbook el Εισαγωγή από import from ldif, csv, or vcard addressbook el Εισαγωγή από LDIF, CSV, ή VCard import from outlook addressbook el Εισαγωγή από το Outlook +import multiple vcard addressbook el Εισαγωγή πολλαπλών VCard import next set addressbook el Εισαγωγή επόμενου σετ -import_instructions addressbook el Στο Netscape, ανοίξτε την ατζέντα διευθύνσεων και επιλέξτε Εξαγωγή από το Αρχείο. Το +import_instructions addressbook el Στο Netscape, ανοίξτε την ατζέντα διευθύνσεων και επιλέξτε Εξαγωγή από το Αρχείο. Το εξαγώγιμο αρχείο θα είναι σε LDIF μορφή.

Ή, στο Outlook, επιλέξτε το φάκελο Eπαφών, επιλέξτεImport and Export... από το File menu και εξάγετε τις επαφές σας σε ένα CSV αρχείο.

Ή, στο Palm Desktop 4.0 ή μεγαλύτερο, επισκεφθείτε το βιβλίο διευθύνσεων σας και επιλέξτε Export από το File menu.Το εξαγώγιμο αρχείο θα ειναι σε VCard μορφή. +in %1 days (%2) is %3's birthday. addressbook el Σε %1 ημέρες (%2) είναι του/της %3 τα γενέθλια. +income addressbook el Εισόδημα +insufficent rights to delete this list! addressbook el Ανεπαρκή δικαιώματα για διαγραφή αυτής της λίστας! international addressbook el Διεθνείς -isdn phone addressbook el Τηλέφωνο ISDN label addressbook el Ετικέττα +last modified addressbook el Τελευταία τροποποίηση +last modified by addressbook el Τελευταία τροποποίηση από ldap context for contacts admin el LDAP πλαίσιο για τις επαφές ldap host for contacts admin el LDAP φορέας για τις επαφές -ldap root dn for contacts admin el LDAP root dn για τις επαφές -ldap root pw for contacts admin el LDAP root pw για τις επαφές +ldap settings for contacts admin el LDAP ρυθμίσεις για τις επαφές ldif addressbook el LDIF line 2 addressbook el Γραμμή 2 +link title for contacts show addressbook el Τίτλος συνδέσμου για παρουσίαση επαφών +links addressbook el Σύνδεσμοι +list all categories addressbook el Τοποθέτηση σε λίστα όλων των κατηγοριών +list all customfields addressbook el Τοποθέτηση σε λίστα όλων των προσαρμοσμένων πεδίων +list already exists! addressbook el Η λίστα υπάρχει ήδη +list created addressbook el Η λίστα δημιουργήθηκε +list creation failed, no rights! addressbook el Η δημιουργία της λίστας απέτυχε, δεν έχετε το δικαίωμα! +load vcard addressbook el Φόρτωση VCard +locations addressbook el τοποθεσίες mark records as private addressbook el Σημείωση εγγραφών ως ιδιωτικές +merge into first or account, deletes all other! addressbook el Συγχώνευση στο πρώτο ή το λογαριασμό,διαγραφή όλων των άλλων +merged addressbook el συγχωνεύτηκε +message after submitting the form addressbook el Μήνυμα μετά την υποβολή της φόρμας message phone addressbook el Τηλέφωνο μηνυμάτων middle name addressbook el Μεσαίο όνομα +migration finished addressbook el Ολοκληρώθηκε η μετανάστευση +migration to ldap admin el Μετανάστευση στο LDAP mobile addressbook el Κινητό mobile phone addressbook el Κινητό τηλέφωνο modem phone addressbook el Τηλέφωνο modem +more ... addressbook el Περισσότερα +move to addressbook: addressbook el Μετακίνηση στο βιβλίο διευθύνσεων: +moved addressbook el μετακινήθηκε +multiple vcard addressbook el Πολλαπλή VCard +name for the distribution list addressbook el Όνομα για την λίστα διανομής +name, address addressbook el Όνομα, Διεύθυνση +new contact submitted by %1 at %2 addressbook el Νέα επαφή υπεβλήθει από %1 στις %2 no vcard addressbook el Οχι VCard +number addressbook el Αριθμός number of records to read (%1) addressbook el Αριθμός εγγραφών προς ανάγνωση (%1) +options for type admin el Επιλογές για τον τύπο +organisation addressbook el οργανισμός +organisations addressbook el Οργανισμοί +organisations by departments addressbook el Οργανισμοί σύμφωνα με τα τμήματα +organisations by location addressbook el Οργανισμοί σύμφωνα με την τοποθεσία other number addressbook el Αλλος αριθμός other phone addressbook el Αλλο τηλέφωνο +own sorting addressbook el προσωπική ταξινόμηση pager common el Αριθμός μπίπερ parcel addressbook el Πακέτο +permission denied !!! addressbook el Άδεια απορρίπτεται !!! phone number common el Αριθμός τηλεφώνου phone numbers common el Αριθμοί τηλεφώνων +photo addressbook el Φωτογραφία please enter a name for that field ! addressbook el Παρακαλώ εισάγετε όνομα γι' αυτό το πεδίο ! +please select only one category addressbook el Παρακαλώ επιλέξτε μόνο μία κατηγορία postal common el Ταχυδρομικός pref addressbook el Προτιμήσεις +preferred phone addressbook el προτιμητέο τηλέφωνο prefix addressbook el Πρόθεμα public key addressbook el Δημόσιο κλειδί +publish into groups: addressbook el Δημοσίευση σε ομάδες: +read a list / search for entries. addressbook el Ανάγνωση μιας λίστας/αναζήτηση για καταχωρήσεις. read a list of entries. addressbook el Ανάγνωση λίστας καταχωρήσεων read a single entry by passing the id and fieldlist. addressbook el Ανάγνωση μεμονωμένης καταχώρησης με εισαγωγή id και λίστας πεδίων +read only addressbook el μόνο ανάγνωση record access addressbook el Πρόσβαση Εγγραφής record owner addressbook el Ιδιοκτήτης εγγραφής -retrieve contacts admin el Ανάκτηση επαφών -select all addressbook el Απιλογή όλων +remove selected contacts from distribution list addressbook el Αφαίρεση επιλεγμένων επαφών από τη λίστα διανομής +removed from distribution list addressbook el Αφαιρέθηκε από τη λίστα διανομής +required fields * addressbook el απαιτούμενα πεδία * +role addressbook el Ρόλος +room addressbook el Γραφείο +search for '%1' addressbook el Αναζήτηση για '%1' +select a portrait format jpeg photo. it will be resized to 60 pixel width. addressbook el Επιλέξτε μια jpeg φωτογραφία σε μορφή πορτραίτου. Θα επαναπροσδιοριστεί σε 60 pixel πλάτος. +select a view addressbook el Επιλέξτε μία προβολή +select addressbook type addressbook el Επιλέξτε τύπο βιβλίου διευθύνσεων +select all addressbook el Επιλογή όλων +select an action or addressbook to move to addressbook el Επιλέξτε μία ενέργεια ή ένα βιβλίο διευθύνσεων για μετακίνηση σε αυτό +select migration type admin el Επιλέξτε τύπο μετανάστευσης +select multiple contacts for a further action addressbook el Επιλέξτε πολλαπλές επαφές για περαιτέρω ενέργειες +select phone number as prefered way of contact addressbook el επιλέξτε τον αριθμό τηλεφώνου ως προτιμότερο τρόπο επικοινωνίας select the type of conversion addressbook el Επιλέξτε τύπο μετατροπής select the type of conversion: addressbook el Επιλέξτε τύπο μετατροπής: -select where you want to store admin el Επιλέξτε θέση αποθήκευσης +select where you want to store / retrieve contacts admin el Επιλέξτε που θέλετε να αποθηκεύετε/ανακτάτε τις επαφές +selected contacts addressbook el επιλεγμένες επαφές +should the columns photo and home address always be displayed, even if they are empty. addressbook el Επιθυμείτε να εμφανίζονται πάντα οι στήλες φωτογραφίας και διεύθυνσης οικίας, ακόμα και αν είναι κενές. +show addressbook el Εμφάνιση show birthday reminders on main screen addressbook el Εμφάνιση υπενθυμίσεων γενεθλίων στην κεντρική οθόνη +show infolog entries for this organisation addressbook el Παρουσίαση των InfoLog καταχωρήσεων για αυτόν τον οργανισμό +show the contacts of this organisation addressbook el Εμφανίστε τις επαφές αυτού του οργανισμού +start admin el Έναρξη startrecord addressbook el Αρχική εγγραφή state common el Νομός street common el Οδός +subject for email addressbook el Θέμα email successfully imported %1 records into your addressbook. addressbook el Επιτυχής εισαγωγή %1 εγγραφής(ών) στο βιβλίο Διευθύνσεων suffix addressbook el Επίθεμα -test import (show importable records only in browser) addressbook el Δοκιμαστική Εξαγωγή +tel home addressbook el τηλ σπιτιού +telephony integration admin el Τηλεφωνική ενοποίηση +test import (show importable records only in browser) addressbook el Δοκιμαστική Εισαγωγή +thank you for contacting us. addressbook el Ευχαριστούμε που επικοινωνήσατε μαζί μας. that field name has been used already ! addressbook el Το όνομα πεδίου χρησιμοποιείται ήδη ! +the anonymous user has probably no add rights for this addressbook. addressbook el Ο ανώνυμος χρήστης δεν έχει πιθανότατα δικαίωμα προσθήκης σε αυτό το βιβλίο διευθύνσεων +the anonymous user needs add rights for it! addressbook el Ο ανώνυμος χρήστης χρειάζεται δικαιώματα για να προσθέσει σε αυτό! +there was an error saving your data :-( addressbook el Υπήρξε ένα σφάλμα κατά την αποθήκευση των δεδομένων σας :-( +this module displays a contactform, that stores direct into the addressbook. addressbook el Αυτή η ενότητα εμφανίζει μία φόρμα επαφών, που αποθηκεύεται απευθείας στο βιβλίο διευθύνσεων. this person's first name was not in the address book. addressbook el Το όνομα αυτού του ατόμου δεν υπάρχει στο βιβλίο διευθύνσεων this person's last name was not in the address book. addressbook el Το επίθετο αυτού του ατόμου δεν υπάρχει στο βιβλίο διευθύνσεων +timezone addressbook el Ζώνη ώρας to many might exceed your execution-time-limit addressbook el Πάρα πολλοί. Ενδεχόμενο υπέρβασης ορίου χρόνου εκτέλεσης today is %1's birthday! common el Σήμερα είναι τα γενέθλια του/της %1 ! tomorrow is %1's birthday. common el Αύριο είναι τα γενέθλια του/της %1 ! translation addressbook el Μετάφραση +type addressbook el Τύπος update a single entry by passing the fields. addressbook el Ενημέρωση συγκεκριμένης καταχώρησης εισάγωντας τα πεδία +upload or delete the photo addressbook el Φορτώστε ή διαγράψτε τη φωτογραφία +use an extra category tab? addressbook el Χρήση μιας επιπλέον ετικέτας κατηγοριών use country list addressbook el Χρήση καταλόγου χωρών +use setup for a full account-migration admin el χρήση της εγκατάστασης για πλήρη μετανάστευση λογαριασμού +used for links and for the own sorting of the list addressbook el χρησιμοποιείται για συνδέσμους και προσωπικές ταξινομήσεις της λίστας vcard common el VCard vcards require a first name entry. addressbook el VCards απαιτούν καταχώρηση ονόματος vcards require a last name entry. addressbook el VCards απαιτούν καταχώρηση επίθετου -video phone addressbook el Video Phone -voice phone addressbook el Τηλέφωνο +verification addressbook el Επαλήθευση +view linked infolog entries addressbook el Εμφάνιση συνδεδεμένων καταχωρήσεων του InfoLog warning!! ldap is valid only if you are not using contacts for accounts storage! admin el ΠΡΟΣΟΧΗ!! LDAP ισχύει μόνο εάν ΔΕΝ χρησιμοποιείτε τις επαφές για την αποθήκευση +warning: all contacts found will be deleted! addressbook el ΠΡΟΣΟΧΗ: Όλες οι επαφές που βρέθηκαν θα διαγραφούν! +which address format should the addressbook use for countries it does not know the address format. if the address format of a country is known, it uses it independent of this setting. addressbook el Ποια μορφή διεύθυνσης θα έπρεπε το βιβλίο διευθύνσεων να χρησιμοποιεί για τις χώρες που δεν γνωρίζει τη μορφή διεύθυνσής τους. Αν η μορφή διεύθυνσης μιας χώρας είναι γνωστή, χρησιμοποιεί την ανεξάρτητη αυτής της διάταξης. +which addressbook should be selected when adding a contact and you have no add rights to the current addressbook. addressbook el Ποιο βιβλίο διευθύνσεων πρέπει να επιλέγεται όταν προσθέτετε επαφή χωρίς να έχετε δικαιώματα στο συγκεκριμένο βιβλίο διευθύνσεων. +which charset should be used for the csv export. the system default is the charset of this egroupware installation. addressbook el Ποια κωδικοσελίδα θα πρέπει να χρησιμοποιέιται για την CSV εξαγωγή.Το προκαθορισμένο σύστημα ειναι η κωδικοσελίδα της εγκατάστασης του eGroupWare. +which fields should be exported. all means every field stored in the addressbook incl. the custom fields. the business or home address only contains name, company and the selected address. addressbook el Ποια πεδία θα πρέπει να εξάγωνται.Όλα σημαίνει κάθε πεδίο που είναι αποθηκευμένο στο βιβλίο διευθύνσεων συμπεριλαμβανομένου και των προσαρμοσμένων πεδίων.Η διεύθυνση εργασίας ή οικίας περιέχει μόνο το όνομα, την εταιρεία και την επιλεγμένη διεύθυνση. +whole query addressbook el ολόκληρη απορία work phone addressbook el Τηλέφωνο Εργασίας +write (update or add) a single entry by passing the fields. addressbook el Εγγραφή (ενημέρωση ή προσθήκη) μιας καταχώρησης διαβαίνοντας από τα πεδία. +wrong - try again ... addressbook el Λάθος - προσπαθήστε ξανά ... +yes, for the next three days addressbook el Ναι, για τις επόμενες τρεις ημέρες +yes, for the next two weeks addressbook el Ναι, για τις επόμενες δύο εβδομάδες +yes, for the next week addressbook el Ναι, για την επόμενη εβδομάδα +yes, for today and tomorrow addressbook el Ναι, για σήμερα και αύριο +you are not permitted to delete contact %1 addressbook el Δεν έχετε άδεια να διαγράψετε την επαφή %1 +you are not permittet to delete this contact addressbook el Δεν έχετε άδεια να διαγράψετε αυτήν την επαφή +you are not permittet to edit this contact addressbook el Δεν έχετε άδεια να επεξεργαστείτε αυτήν την επαφή +you are not permittet to view this contact addressbook el Δεν έχετε άδεια να δείτε τα στοιχεία αυτής της επαφής +you can only use ldap as contact repository if the accounts are stored in ldap too! admin el Μπορείτε να χρησιμοποιήσετε το LDAP ως αποθήκη επαφής μόνο αν οι λογαριασμοί αποθηκεύονται στο LDAP επίσης! +you can respond by visiting: addressbook el Για να το δείτε επισκεφθείτε: you must select a vcard. (*.vcf) addressbook el Πρέπει να επιλέξετε μια VCard (*.vcf) you must select at least 1 column to display addressbook el Πρέπει να επιλέξετε τουλάχιστο μία στήλη για εμφάνιση +you need to select a distribution list addressbook el Πρέπει να επιλέξετε μια λίστα διανομής +you need to select some contacts first addressbook el Πρέπει να επιλέξετε κάποιες επαφές πρώτα zip code common el Τ.Κ. zip_note addressbook el

Σημείωση: Το αρχείο μπορεί να είναι μια συλλογή συμπιεσμένων αρχείων .csv, .vcf, ή .ldif αρχείων. Εντούτοις, μην αναμίξτε τους τύπους αρχείου ανά εισαγωγή. diff --git a/addressbook/setup/phpgw_es-es.lang b/addressbook/setup/phpgw_es-es.lang index a4b3846cf5..917633fa66 100644 --- a/addressbook/setup/phpgw_es-es.lang +++ b/addressbook/setup/phpgw_es-es.lang @@ -5,6 +5,7 @@ %1 records imported addressbook es-es Se han importado %1 registros %1 records read (not yet imported, you may go %2back%3 and uncheck test import) addressbook es-es Se han leνdo %1 registros (no importados todavνa, puede volver %2atrαs%3 y desmarcar la prueba de importaciσn) %1 starts with '%2' addressbook es-es %1 empieza por '%2' +%s please calculate the result addressbook es-es %s por favor, calcule el resultado (e.g. 1969) addressbook es-es (p. ej. 1969) no conversion type <none> could be located. please choose a conversion type from the list addressbook es-es No se encontrσ el tipo de conversiσn . Por favor, seleccione un tipo de conversiσn de la lista @-eval() is only availible to admins!!! addressbook es-es ‘@-eval estα disponible sσlo para los administradores! @@ -45,6 +46,7 @@ are you shure you want to delete this contact? addressbook es-es are you sure you want to delete this field? addressbook es-es ΏEstα seguro de que desea borrar este campo? assistent addressbook es-es Asistente assistent phone addressbook es-es telιfono del asistente +at the moment the following document-types are supported: addressbook es-es De momento, los siguientes tipos de documentos estαn soportados: birthday common es-es Fecha de nacimiento birthdays common es-es Cumpleaρos blank addressbook es-es Vacνo @@ -58,6 +60,7 @@ business phone addressbook es-es Tel business state addressbook es-es Provincia del trabajo business street addressbook es-es Direcciσn del trabajo business zip code addressbook es-es Cσdigo postal del trabajo +calendar fields: addressbook es-es Campos del calendario: calendar uri addressbook es-es URI del calendario can be changed via setup >> configuration admin es-es Puede modificarse desde Instalaciσn -> Configuraciσn car phone addressbook es-es Telιfono del coche @@ -68,6 +71,8 @@ charset for the csv export addressbook es-es Juego de caracteres para exportar a charset of file addressbook es-es Juego de caracteres del fichero check all addressbook es-es Marcar todo choose an icon for this contact type admin es-es Elija un icono para este tipo de contacto +choose owner of imported data addressbook es-es Elija el propietario de los datos importados +choose seperator and charset addressbook es-es Elija el separador y el juego de caracteres chosse an etemplate for this contact type admin es-es Elija una plantilla para este tipo de contacto city common es-es Ciudad company common es-es Empresa @@ -77,10 +82,15 @@ contact common es-es Contacto contact application admin es-es Aplicaciσn del contacto contact copied addressbook es-es Se ha copiado el contacto contact deleted addressbook es-es Se ha borrado el contacto +contact fields to show addressbook es-es Campos del contacto a mostrar +contact fields: addressbook es-es Campos del contacto: contact id addressbook es-es ID del contacto +contact modified by %1 at %2 addressbook es-es Contacto modificado por %1 el %2 +contact not found! addressbook es-es ‘No se encontrσ el contacto! contact repository admin es-es Repositorio de contactos contact saved addressbook es-es Se ha guardado la entrada contact settings admin es-es Configuraciσn de los contactos +contactform addressbook es-es Formulario de contacto contacts and account contact-data to ldap admin es-es Contactos y datos del contacto y la cuenta en LDAP contacts to ldap admin es-es Contactos en LDAP contacts to ldap, account contact-data to sql admin es-es Contactos en LDAP, datos del contacto y la cuenta en SQL @@ -94,6 +104,7 @@ credit addressbook es-es Cr csv-fieldname addressbook es-es Campo CSV csv-filename addressbook es-es Archivo CSV custom addressbook es-es Personalizado +custom etemplate for the contactform addressbook es-es Plantilla personalizada para el formulario del contacto custom fields addressbook es-es Campos personalizados debug output in browser addressbook es-es Depurar salida en el navegador default address format addressbook es-es Formato predeterminado de las drecciones @@ -112,6 +123,7 @@ distribution list deleted addressbook es-es Lista de distribuci distribution lists addressbook es-es Listas de distribuciσn do you want a private addressbook, which can not be viewed by users, you grant access to your personal addressbook? addressbook es-es ΏDesea una libreta de direcciones privada, que no pueden ver otros usuarios (a menos que conceda acceso a su libreta de direcciones personal)? do your really want to delete this contact? addressbook es-es ΏRealmente desea borrar este contacto? +document '%1' does not exist or is not readable for you! addressbook es-es El documento '%1' no existe o usted no tiene permiso para leerlo doesn't matter addressbook es-es no importa domestic addressbook es-es Domιstico don't hide empty columns addressbook es-es No ocultar las columnas vacνas @@ -122,7 +134,9 @@ edit custom field addressbook es-es Editar campo personalizado edit custom fields admin es-es Editar campos personalizados edit extra account-data in the addressbook admin es-es Editar datos adicionales de la cuenta en la libreta de direcciones edit phonenumbers - addressbook es-es Editar nϊmeros de telιfono - +either the configured email addesses are wrong or the mail configuration. addressbook es-es Las direcciones de correo electrσnico configuradas o la configuraciσn del correo es incorrecta email & internet addressbook es-es Correo electrσnico e Internet +email addresses (comma separated) to send the contact data addressbook es-es Direcciones de correo electrσnico (separadas por comas) para enviar los datos del contacto empty for all addressbook es-es vacνo para todo enable an extra private addressbook addressbook es-es Activar una libreta de direcciones privada extra enter the path to the exported file here addressbook es-es Introduzca aquν la ruta a los ficheros exportados @@ -153,6 +167,7 @@ for read only ldap admin es-es para LDAP de s freebusy uri addressbook es-es URI para disponibilidad full name addressbook es-es Nombre completo general addressbook es-es General +general fields: addressbook es-es Campos generales: geo addressbook es-es GEO global categories addressbook es-es Categorνas globales grant addressbook access common es-es Conceder acceso a la libreta de direcciones @@ -171,6 +186,8 @@ home zip code addressbook es-es C how many contacts should non-admins be able to export (empty = no limit) admin es-es ΏCuαntos contactos deben los no administradores ser capaces de exportar (vacνo=sin lνmite)? icon addressbook es-es Icono if accounts are already in ldap admin es-es si las cuentas ya estαn en LDAP +if you specify a directory (full vfs path) here, addressbook displays an action for each document. that action allows to download the specified document with the contact data inserted. addressbook es-es Si especifica un directorio (ruta completa vfs) aquν, la libreta de direcciones muestra una acciσn para cada documento. Esa acciσn permite descargar el documento especificado con los datos del contacto insertados. +if you specify a document (full vfs path) here, addressbook displays an extra document icon for each address. that icon allows to download the specified document with the contact data inserted. addressbook es-es Si especifica un documento (ruta completa vfs) aquν, la libreta de direcciones muestra un icono de documento extra para cada direcciσn. Ese icono permite descargar el documento especificado con los datos del contacto insertados. import addressbook es-es Importar import contacts addressbook es-es Importar contactos import csv-file into addressbook addressbook es-es Importar archivo CSV en la Libreta de direcciones @@ -181,8 +198,10 @@ import from outlook addressbook es-es Importar desde Outlook import multiple vcard addressbook es-es Importar mϊltiples VCards import next set addressbook es-es Importar el registro siguiente import_instructions addressbook es-es Si usa Mozilla o Netscape, abra la libreta de direcciones y seleccione Exportar desde el menϊ Archivo. El fichero exportado estarα en formato LDIF.

O, en Outlook, seleccione su carpeta de contactos, luego, en el menϊFichero, Importar y Exportar para guardarlos en un fichero separado por comas (CSV).

O, en Palm Desktop 4.0 o superior, visite la libreta de direcciones y seleccione Exportar desde el menϊ Archivo. El fichero exportado estarα en formato VCard. +imports contacts into your addressbook from a csv file. csv means 'comma seperated values'. however in the options tab you can also choose other seperators. addressbook es-es Importa los contactos en la libreta de direcciones desde un fichero CSV. CSV significa 'Valores separados por comas'. Sin embargo, en la pestaρa de opciones, tambiιn se pueden elegir otros separadores. in %1 days (%2) is %3's birthday. addressbook es-es En %1 dνas (%2) es el cumpleaρos de %3. income addressbook es-es Ingresos +insert in document addressbook es-es Insertar en el documento insufficent rights to delete this list! addressbook es-es No tiene privilegios suficientes para borrar esta lista international addressbook es-es Internacional label addressbook es-es Etiqueta @@ -200,11 +219,14 @@ list all customfields addressbook es-es Lista de todos los campos personalizados list already exists! addressbook es-es ‘La lista ya existe! list created addressbook es-es Se ha creado la lista list creation failed, no rights! addressbook es-es Fallσ la creaciσn de lista. No tiene privilegios suficientes. +load sample file addressbook es-es Cargar el fichero de ejemplo load vcard addressbook es-es Cargar VCard locations addressbook es-es ubicaciones +manage mapping addressbook es-es Administrar los mapeos mark records as private addressbook es-es Marcar registros como privados merge into first or account, deletes all other! addressbook es-es ‘Mezclar en el primero o cuenta, borra todos los demαs! merged addressbook es-es Mezclado +message after submitting the form addressbook es-es Mensaje de despuιs de enviar el formulario message phone addressbook es-es Telιfono de mensajes middle name addressbook es-es Segundo nombre migration finished addressbook es-es Migraciσn finalizada @@ -217,7 +239,9 @@ move to addressbook: addressbook es-es Mover a la libreta de direcciones: moved addressbook es-es movido multiple vcard addressbook es-es VCard mϊltiple name for the distribution list addressbook es-es Nombre para la lista de distribuciσn +name of current user, all other contact fields are valid too addressbook es-es Nombre del usuario actual. Todos los demαs campos del contacto tambiιn son vαlidos. name, address addressbook es-es Nombre, Direcciσn +new contact submitted by %1 at %2 addressbook es-es Nuevo contacto enviado por %1 en %2 no vcard addressbook es-es Sin VCard number addressbook es-es Nϊmero number of records to read (%1) addressbook es-es Nϊmero de registros a leer (%1) @@ -237,6 +261,7 @@ phone numbers common es-es N photo addressbook es-es Fotografνa please enter a name for that field ! addressbook es-es Por favor, introduzca un nombre para ese campo please select only one category addressbook es-es Por favor, seleccione sσlo una categorνa +please update the templatename in your customfields section! addressbook es-es ‘Por favor, actualice el nombre de la plantilla en la secciσn de campos personalizados! postal common es-es Postal pref addressbook es-es pref preferred phone addressbook es-es telιfono preferido @@ -251,6 +276,8 @@ record access addressbook es-es Acceso al registro record owner addressbook es-es Propietario del registro remove selected contacts from distribution list addressbook es-es Eliminar los contactos seleccionados de la lista de distribuciσn removed from distribution list addressbook es-es eliminados de la lista de distribuciσn +replacements for inserting contacts into documents addressbook es-es Sustituciones para insertar contactos en los documetos +required fields * addressbook es-es Campos requeridos * role addressbook es-es Rol room addressbook es-es Habitaciσn search for '%1' addressbook es-es Buscar '%1' @@ -276,12 +303,19 @@ start admin es-es Empezar startrecord addressbook es-es Registro inicial state common es-es Provincia street common es-es Calle +subject for email addressbook es-es Asunto para el correo electrσnico successfully imported %1 records into your addressbook. addressbook es-es Se han importado correctamnte %1 registros en la libreta de direcciones. suffix addressbook es-es Sufijo tel home addressbook es-es telιfono particular telephony integration admin es-es Integraciσn con telefonνa test import (show importable records only in browser) addressbook es-es Test de Importaciσn (mostrar los registros que se pueden importar sσlo en el navegador) +thank you for contacting us. addressbook es-es Gracias por ponerse en contacto con nosotros. that field name has been used already ! addressbook es-es El nombre del campo ya ha sido usado +the anonymous user has probably no add rights for this addressbook. addressbook es-es El usuario anσnimo probablemente no tiene derechos de aρadir para esta libreta de direcciones. +the anonymous user needs add rights for it! addressbook es-es ‘El usuario anσnimo necesita derechos de aρadir para esto! +the document can contain placeholder like $$n_fn$$, to be replaced with the contact data (%1full list of placeholder names%2). addressbook es-es El documento puede tener un contenedor como $$n_fn$$, para ser sustituido con los datos del contacto (%1lista completa de nombres del contenedor%2). +there was an error saving your data :-( addressbook es-es Ocurriσ un error al guardar los datos +this module displays a contactform, that stores direct into the addressbook. addressbook es-es Este mσdulo muestra un formulario de contacto que se guarda directamente en la libreta de direcciones. this person's first name was not in the address book. addressbook es-es El primer nombre de esta persona no estaba en la libreta de direcciones. this person's last name was not in the address book. addressbook es-es El apellido de esta persona no estaba en la libreta de direcciones. timezone addressbook es-es Zona horaria @@ -300,9 +334,11 @@ used for links and for the own sorting of the list addressbook es-es utilizado p vcard common es-es Tarjeta de visita vcards require a first name entry. addressbook es-es Las tarjetas de visita requieren el primer nombre. vcards require a last name entry. addressbook es-es Las tarjetas de visita requieren el apellido. +verification addressbook es-es Verificaciσn view linked infolog entries addressbook es-es Ver las entradas del Registro que estιn vinculadas warning!! ldap is valid only if you are not using contacts for accounts storage! admin es-es ‘Atenciσn! ‘LDAP es valido sσlo si no estα usando contactos para almacenar las cuentas! warning: all contacts found will be deleted! addressbook es-es ATENCIΣN: ‘Se borrarαn todos los contactos encontrados! +warning: template "%1" not found, using default template instead. addressbook es-es AVISO: No se encontrσ la plantilla "%1". Se usa la plantilla predeterminada en su lugar. what should links to the addressbook display in other applications. empty values will be left out. you need to log in anew, if you change this setting! addressbook es-es Quι deben mostrar los enlaces a la libreta de direcciones en otras aplicaciones. Los valores vacνos se ignorarαn. Es necesario volver a iniciar la sesiσn si se cambia esta opciσn. which address format should the addressbook use for countries it does not know the address format. if the address format of a country is known, it uses it independent of this setting. addressbook es-es Quι formato de direcciσn debe usar la libreta de direcciones para paνses de los que no conoce el formato de las direcciones. Si se conoce el formato de las direcciones, se usa independientemente de lo indicado en esta opciσn which addressbook should be selected when adding a contact and you have no add rights to the current addressbook. addressbook es-es Quι libreta de direcciones debe seleccionarse al aρadir un contacto Y cuando no haya permiso de aρadir en la libreta de direcciones actual. @@ -311,6 +347,7 @@ which fields should be exported. all means every field stored in the addressbook whole query addressbook es-es la consulta completa work phone addressbook es-es Telιfono del trabajo write (update or add) a single entry by passing the fields. addressbook es-es Escribir (actualizar o aρadir) una ϊnica entrada pasando los campos. +wrong - try again ... addressbook es-es Incorrecto. Vuelva a intentarlo... yes, for the next three days addressbook es-es Sν, para los tres prσximos dνas yes, for the next two weeks addressbook es-es Sν, para las dos semanas siguientes yes, for the next week addressbook es-es Sν, para la semana siguiente @@ -320,6 +357,7 @@ you are not permittet to delete this contact addressbook es-es No tiene permiso you are not permittet to edit this contact addressbook es-es No tiene permiso para editar este contacto you are not permittet to view this contact addressbook es-es No tiene permiso para ver este contacto you can only use ldap as contact repository if the accounts are stored in ldap too! admin es-es ‘Sσlo puede usar LDAP como repositorio de contactos si las cuentas tambiιn estαn almacenadas en LDAP! +you can respond by visiting: addressbook es-es Para verlo, visite: you must select a vcard. (*.vcf) addressbook es-es Debe seleccionar una tarjeta (*.vcf) you must select at least 1 column to display addressbook es-es Debe seleccionar al menos una columna para mostrar you need to select a distribution list addressbook es-es Necesita seleccionar una lista de distribuciσn diff --git a/addressbook/setup/phpgw_pt-br.lang b/addressbook/setup/phpgw_pt-br.lang index af7e5a43f3..11edf96811 100644 --- a/addressbook/setup/phpgw_pt-br.lang +++ b/addressbook/setup/phpgw_pt-br.lang @@ -5,6 +5,7 @@ %1 records imported addressbook pt-br %1 registro(s) importado(s) %1 records read (not yet imported, you may go %2back%3 and uncheck test import) addressbook pt-br %1 registro(s) lido(s) (nγo importado(s) ainda. Vocκ deve voltar e desmarcar o campo Testar Importaηγo) %1 starts with '%2' addressbook pt-br %1 inicia(m) com '%2' +%s please calculate the result addressbook pt-br %s por favor calcule o resultado (e.g. 1969) addressbook pt-br (ex. 1969) no conversion type <none> could be located. please choose a conversion type from the list addressbook pt-br O tipo de conversγo nγo foi encontrado. Escolha um tipo de conversγo da lista @-eval() is only availible to admins!!! addressbook pt-br @-eval() estα disponνvel somente para administradores !!! @@ -22,17 +23,17 @@ add to distribution list: addressbook pt-br Adicionar a uma lista de distribui added by synchronisation addressbook pt-br adicionado por sincronizaηγo added to distribution list addressbook pt-br adicionado a uma lista de distribuiηγo additional information about using ldap as contact repository admin pt-br Informaηγo adicional sobre usar LDAP como respositσrio de contas -address book common pt-br Contatos -address book - vcard in addressbook pt-br Contatos - VCard -address book - view addressbook pt-br Contatos - Exibir +address book common pt-br Livro de Contatos +address book - vcard in addressbook pt-br Livro de Contatos - VCard +address book - view addressbook pt-br Livro de Contatos - Exibir address line 2 addressbook pt-br Endereηo Linha 2 address type addressbook pt-br Tipo de endereηo -addressbook common pt-br Contatos -addressbook csv export addressbook pt-br Exportar Contatos em CSV -addressbook menu addressbook pt-br Menu dos Contatos -addressbook preferences addressbook pt-br Preferκncias de Contatos -addressbook the contact should be saved to addressbook pt-br Contatos em que o contato deverα ser salvo -addressbook-fieldname addressbook pt-br Contatos - Nome do Campo +addressbook common pt-br Livro de Contatos +addressbook csv export addressbook pt-br Exportar Livro de Contatos em CSV +addressbook menu addressbook pt-br Menu do Livro de Contatos +addressbook preferences addressbook pt-br Preferκncias do Livro de Contatos +addressbook the contact should be saved to addressbook pt-br Livro de Contatos em que o contato deverα ser salvo +addressbook-fieldname addressbook pt-br Livro de Contatos - Nome do Campo addvcard addressbook pt-br Adicionar VCard advanced search addressbook pt-br Pesquisa avanηada all contacts addressbook pt-br Todos os contatos @@ -77,10 +78,13 @@ contact common pt-br Contato contact application admin pt-br Aplicaηγo de Contatos contact copied addressbook pt-br Contato copiado contact deleted addressbook pt-br Contato removido +contact fields to show addressbook pt-br Campos a serem exibidos contact id addressbook pt-br ID do contato +contact modified by %1 at %2 addressbook pt-br Contato alterado por %1 em %2 contact repository admin pt-br Repositσrio de contatos contact saved addressbook pt-br Contato salvo contact settings admin pt-br Preferκncias de Contatos +contactform addressbook pt-br Formulαrio de contatos contacts and account contact-data to ldap admin pt-br contatos e dados da conta de contatos para LDAP contacts to ldap admin pt-br contatos para LDAP contacts to ldap, account contact-data to sql admin pt-br contatos para LDAP, dados da conta de contatos para SQL @@ -94,10 +98,11 @@ credit addressbook pt-br Cr csv-fieldname addressbook pt-br CSV-Nome do Campo csv-filename addressbook pt-br CSV-Nome do Arquivo custom addressbook pt-br Personalizado +custom etemplate for the contactform addressbook pt-br eModelo personalizado para o formulαrio de contatos custom fields addressbook pt-br Campos personalizados debug output in browser addressbook pt-br Depurar saνda no navegador default address format addressbook pt-br Formato padrγo de endereηo -default addressbook for adding contacts addressbook pt-br Lista de contatos padrγo para inclusγo +default addressbook for adding contacts addressbook pt-br Livro de Contatos padrγo para inclusγo default filter addressbook pt-br Filtro padrγo delete a single entry by passing the id. addressbook pt-br Remover um ϊnica entrada informando o ID. delete selected distribution list! addressbook pt-br Remover a lista de distribuiηγo selecionada @@ -110,7 +115,7 @@ departments addressbook pt-br Departamentos displays a remider for birthdays on the startpage (page you get when you enter egroupware or click on the homepage icon). addressbook pt-br Exibe um lembrete para aniversαrios na Pαgina Inicial (pαgina que vocκ vκ quando entra no Grupo de Trabalho ou clica no νcone Pαgina Inicial). distribution list deleted addressbook pt-br Lista de distribuiηγo removida distribution lists addressbook pt-br Listas de distribuiηγo -do you want a private addressbook, which can not be viewed by users, you grant access to your personal addressbook? addressbook pt-br Vocκ quer uma lista de contatos privativa, que podem ser vistos por usuαrios que vocκ permitir ? +do you want a private addressbook, which can not be viewed by users, you grant access to your personal addressbook? addressbook pt-br Vocκ quer um Livro de Contatos particular, que sσ pode ser visto por usuαrios que vocκ permitir ? do your really want to delete this contact? addressbook pt-br Tem certeza que deseja remover este contato? doesn't matter addressbook pt-br nγo faz diferenηa domestic addressbook pt-br Domιstico @@ -120,11 +125,13 @@ download export file (uncheck to debug output in browser) addressbook pt-br Baix download this contact as vcard file addressbook pt-br baixar este contato como arquivo vCard edit custom field addressbook pt-br Editar campo personalizado edit custom fields admin pt-br Editar campos personalizados -edit extra account-data in the addressbook admin pt-br Editar dodos extras nos Contatos +edit extra account-data in the addressbook admin pt-br Editar dados extras no Livro de Contatos edit phonenumbers - addressbook pt-br Editar nϊmeros de telefones +either the configured email addesses are wrong or the mail configuration. addressbook pt-br Os endereηos de e-mail informados estγo errados ou a configuraηγo do e-mail ι invαlida. email & internet addressbook pt-br Email & Internet +email addresses (comma separated) to send the contact data addressbook pt-br Endereηos de e-mail (separados por vνrgula) para enviar os dados de contatos empty for all addressbook pt-br vazio para todos -enable an extra private addressbook addressbook pt-br Habilitar uma lista de contatos extra +enable an extra private addressbook addressbook pt-br Habilitar um Livro de Contatos particular enter the path to the exported file here addressbook pt-br Entre aqui com o caminho do arquivo exportado error deleting the contact !!! addressbook pt-br Erro removendo o contato !!! error saving the contact !!! addressbook pt-br Erro salvando o contato !!! @@ -134,10 +141,10 @@ export as csv addressbook pt-br Exportar como CSV export as vcard addressbook pt-br Exportar como VCard export contacts addressbook pt-br Exportar contatos export file name addressbook pt-br Exportar arquivo -export from addressbook addressbook pt-br Exportar dos Contatos +export from addressbook addressbook pt-br Exportar Livro de Contatos export selection addressbook pt-br Exportar seleηγo exported addressbook pt-br exportado -exports contacts from your addressbook into a csv file. csv means 'comma seperated values'. however in the options tab you can also choose other seperators. addressbook pt-br Exporta seus contatos em um arquivo CSV. CSV significa 'Comma Seperated Values' (Valores Separados por Vνrgula). No entando na guia Opηυes vocκ tambιm pode escolher outros separadores. +exports contacts from your addressbook into a csv file. csv means 'comma seperated values'. however in the options tab you can also choose other seperators. addressbook pt-br Exporta seu Livro de Contatos em um arquivo CSV. CSV significa 'Comma Seperated Values' (Valores Separados por Vνrgula). No entando na guia Opηυes vocκ tambιm pode escolher outros separadores. extra addressbook pt-br Extra failed to change %1 organisation member(s) (insufficent rights) !!! addressbook pt-br Falha ao alterar %1 membro(s) da organizaηγo (direitos insuficientes) !!! fax addressbook pt-br Fax @@ -155,9 +162,9 @@ full name addressbook pt-br Nome Completo general addressbook pt-br Geral geo addressbook pt-br GEO global categories addressbook pt-br Categorias Globais -grant addressbook access common pt-br Permitir acesso aos Contatos +grant addressbook access common pt-br Permitir acesso ao Livro de Contatos group %1 addressbook pt-br Grupo %1 -hide accounts from addressbook addressbook pt-br Ocultar contas dos Contatos +hide accounts from addressbook addressbook pt-br Ocultar contas do Livro de Contatos hides accounts completly from the adressbook. addressbook pt-br Oculta completamente contas dos Contatos home address addressbook pt-br Endereηo residencial home address, birthday, ... addressbook pt-br Endereηo residencial, Aniversαrio, ... @@ -173,14 +180,14 @@ icon addressbook pt-br if accounts are already in ldap admin pt-br se as contas jα estiverem em LDAP import addressbook pt-br Importar import contacts addressbook pt-br Importar contatos -import csv-file into addressbook addressbook pt-br Importar arquivo CSV para Contatos +import csv-file into addressbook addressbook pt-br Importar arquivo CSV para o Livro de Contatos import file addressbook pt-br Importar arquivo import from addressbook pt-br Importar de import from ldif, csv, or vcard addressbook pt-br Importar de LDIF, CSV ou VCard import from outlook addressbook pt-br Importar do Outlook import multiple vcard addressbook pt-br Importar mϊltiplo VCard import next set addressbook pt-br Importar prσximo conjunto -import_instructions addressbook pt-br No Netscape, abra o Catαlogo de Endereηos e selecione Exportar do menu Arquivo. O arquivo exportado serα do format LDIF.

Ou, no Outlook, selecione a sua pastas de contatos, selecione Importar e Exportar... do menu Arquivo e exporte seus contatos para um arquivo separado por vνrgulas (CSV). Ou no Palmdesktop 4.0 ou superior, vα para seu catαlogo de endereηos e selecione Exportar do menu Arquivo. O arquivo exportado serα do tipo VCard. +import_instructions addressbook pt-br No Netscape, abra o Livro de Contatos e selecione Exportar do menu Arquivo. O arquivo exportado serα do format LDIF.

Ou, no Outlook, selecione a sua pastas de contatos, selecione Importar e Exportar... do menu Arquivo e exporte seus contatos para um arquivo separado por vνrgulas (CSV). Ou no Palmdesktop 4.0 ou superior, vα para seu Livro de Contatos e selecione Exportar do menu Arquivo. O arquivo exportado serα do tipo VCard. in %1 days (%2) is %3's birthday. addressbook pt-br Em %1 dia(s) (%2) serα aniversαrio de %3 income addressbook pt-br Renda insufficent rights to delete this list! addressbook pt-br Direitos insuficientes para remover esta lista! @@ -205,6 +212,7 @@ locations addressbook pt-br Localiza mark records as private addressbook pt-br Marcar registos como particulares merge into first or account, deletes all other! addressbook pt-br Mesclar na primeira conta, deletar o restante! merged addressbook pt-br mesclado +message after submitting the form addressbook pt-br Mensagem apσs enviar o formulαrio message phone addressbook pt-br Telefone para recado middle name addressbook pt-br Nome do meio migration finished addressbook pt-br Migraηγo concluνda @@ -213,11 +221,12 @@ mobile addressbook pt-br Celular mobile phone addressbook pt-br Telefone celular modem phone addressbook pt-br Telefone de Dados (Modem) more ... addressbook pt-br Mais... -move to addressbook: addressbook pt-br Mover para Contatos: +move to addressbook: addressbook pt-br Mover para o Livro de Contatos: moved addressbook pt-br movido multiple vcard addressbook pt-br Mϊltiplo VCard name for the distribution list addressbook pt-br Nome da lista de distribuiηγo name, address addressbook pt-br Nome, Endereηo +new contact submitted by %1 at %2 addressbook pt-br Novo contato informado por %1 em %2 no vcard addressbook pt-br Nenhum VCard number addressbook pt-br Nϊmero number of records to read (%1) addressbook pt-br Nϊmero de registros a ler (%1) @@ -251,14 +260,15 @@ record access addressbook pt-br Acesso ao registro record owner addressbook pt-br Dono do registro remove selected contacts from distribution list addressbook pt-br Remover contatos selecionados da lista de distribuiηγo removed from distribution list addressbook pt-br removido da lista de distribuiηγo +required fields * addressbook pt-br campos requeridos * role addressbook pt-br Funηγo room addressbook pt-br Sala search for '%1' addressbook pt-br Procurar por '%1' select a portrait format jpeg photo. it will be resized to 60 pixel width. addressbook pt-br Selecione uma foto no formato jpeg. Ela serα alterada para o tamanho de 60 pixels de largura select a view addressbook pt-br Selecionar uma exibiηγo -select addressbook type addressbook pt-br Selecionar tipo de Contatos +select addressbook type addressbook pt-br Selecionar tipo de Livro de Contatos select all addressbook pt-br Selecionar todos -select an action or addressbook to move to addressbook pt-br Selecione uma aηγo ou lista de Contatos para mover +select an action or addressbook to move to addressbook pt-br Selecione uma aηγo ou Livro de Contatos para mover select migration type admin pt-br Selecionar tipo de migraηγo select multiple contacts for a further action addressbook pt-br Selecione mϊltiplos contatos para aηγo posterior select phone number as prefered way of contact addressbook pt-br Selecione telefone como forma preferida de contato @@ -276,12 +286,18 @@ start admin pt-br Iniciar startrecord addressbook pt-br Registro inicial state common pt-br Estado street common pt-br Rua -successfully imported %1 records into your addressbook. addressbook pt-br %1 registro(s) importado(s) para seus Contatos com sucesso. +subject for email addressbook pt-br Assunto para o e-mail +successfully imported %1 records into your addressbook. addressbook pt-br %1 registro(s) importado(s) para seu Livro de Contatos com sucesso. suffix addressbook pt-br Sufixo tel home addressbook pt-br telefone telephony integration admin pt-br Integraηγo de telefone test import (show importable records only in browser) addressbook pt-br Testar Importaηγo (mostrar no navegador somente os registros que serγo importados) +thank you for contacting us. addressbook pt-br Obrigado por entrar em contato conosco. that field name has been used already ! addressbook pt-br Este nome de campo jα estα em uso ! +the anonymous user has probably no add rights for this addressbook. addressbook pt-br O usuαrio anτnimo provavelmente nγo tem permissγo para adicionar neste Livro de Contatos. +the anonymous user needs add rights for it! addressbook pt-br O usuαrio anτnimo precisa de permissγo para adicionα-lo! +there was an error saving your data :-( addressbook pt-br Ocorreu um erro ao salvar seus dados :-( +this module displays a contactform, that stores direct into the addressbook. addressbook pt-br Este mσdulo exibe um formulαrio de contato, que salva diretamente no Livro de Contatos. this person's first name was not in the address book. addressbook pt-br O primeiro nome desta pessoa nγo estava nos Contatos. this person's last name was not in the address book. addressbook pt-br O ϊltimo nome dessa pessoa nγo estα nos Contatos. timezone addressbook pt-br Zona de horαrio @@ -300,17 +316,19 @@ used for links and for the own sorting of the list addressbook pt-br usado para vcard common pt-br VCard vcards require a first name entry. addressbook pt-br VCards requer um primeiro nome. vcards require a last name entry. addressbook pt-br VCards requerem que o ϊltimo nome esteja preenchido +verification addressbook pt-br Verificaηγo view linked infolog entries addressbook pt-br Exibir entradas de Tarefas relacionadas warning!! ldap is valid only if you are not using contacts for accounts storage! admin pt-br AVISO!! LDAP ι vαlido somente se vocκ nγo estiver usando contatos para guardar as contas! warning: all contacts found will be deleted! addressbook pt-br AVISO: Todos os contatos encontrados serγo removidos! -what should links to the addressbook display in other applications. empty values will be left out. you need to log in anew, if you change this setting! addressbook pt-br O que deverγo exibir os links para os Contatos em outros aplicativos. Valores vazios serγo desconsiderados. Vocκ precisarα fazer novo login ser alterar esta configuraηγo! +what should links to the addressbook display in other applications. empty values will be left out. you need to log in anew, if you change this setting! addressbook pt-br O que deverα ser exibido pelos links para o Livro de Contatos que estγo em outros aplicativos. Valores vazios serγo desconsiderados. Vocκ precisarα fazer novo login ser alterar esta configuraηγo! which address format should the addressbook use for countries it does not know the address format. if the address format of a country is known, it uses it independent of this setting. addressbook pt-br Qual formato de endereηo deverα ser usado para paνses onde o formato padrγo nγo ι conhecido. Se o formato de endereηo de um paνs for conhecido, este serα usado independente desta configuraηγo. -which addressbook should be selected when adding a contact and you have no add rights to the current addressbook. addressbook pt-br Qual lista de contatos deverα ser selecionada quando incluindo um contato E vocκ nγo tem direitos de inclusγo na lista de contatos atual. +which addressbook should be selected when adding a contact and you have no add rights to the current addressbook. addressbook pt-br Qual Livro de Contatos deverα ser selecionado quando estiver incluindo um contato E vocκ nγo tiver permissγo de inclusγo. which charset should be used for the csv export. the system default is the charset of this egroupware installation. addressbook pt-br Que codificaηγo de caracter deverα ser usado para exportaηγo CSV. O padrγo ι a codificaηγo desta instalaηγo do eGroupWare. -which fields should be exported. all means every field stored in the addressbook incl. the custom fields. the business or home address only contains name, company and the selected address. addressbook pt-br Quais campos devem ser exportados. Todos significa qualquer campo registrado nos Contatos, incluindo os campos personalizados. Os endereηos residencial e comercial contκm nome, companhia e o endereηo seleciona. +which fields should be exported. all means every field stored in the addressbook incl. the custom fields. the business or home address only contains name, company and the selected address. addressbook pt-br Quais campos devem ser exportados. Todos significa qualquer campo registrado no Livro de Contatos, incluindo os campos personalizados. Os endereηos residencial ou comercial somente contκm nome, empresa e o endereηo selecionado. whole query addressbook pt-br toda a consulta work phone addressbook pt-br Telefone de trabalho write (update or add) a single entry by passing the fields. addressbook pt-br Gravar (atualizar ou adicionar) uma ϊnica entrada informando os campos. +wrong - try again ... addressbook pt-br Errado - tente novamente ... yes, for the next three days addressbook pt-br Sim, para os prσximos trκs dias yes, for the next two weeks addressbook pt-br Sim, para as prσximas duas semanas yes, for the next week addressbook pt-br Sim, para a prσxima semana @@ -320,6 +338,7 @@ you are not permittet to delete this contact addressbook pt-br Voc you are not permittet to edit this contact addressbook pt-br Vocκ nγo tem permissγo para editar este contato you are not permittet to view this contact addressbook pt-br Vocκ nγo tem permissγo para exibir este contato you can only use ldap as contact repository if the accounts are stored in ldap too! admin pt-br Vocκ somente pode usar LDAP como repositσrio de contas se as contas estiverem salvas em LDAP tambιm! +you can respond by visiting: addressbook pt-br Para exibi-lo, visite: you must select a vcard. (*.vcf) addressbook pt-br Vocκ deve selecionar um vcard. (*.vcf) you must select at least 1 column to display addressbook pt-br Vocκ deve selecionar pelo menos uma coluna para ser exibida. you need to select a distribution list addressbook pt-br Vocκ deve selecionar uma lista de distribuiηγo diff --git a/addressbook/setup/phpgw_sl.lang b/addressbook/setup/phpgw_sl.lang index 168fa845d3..10fca19221 100644 --- a/addressbook/setup/phpgw_sl.lang +++ b/addressbook/setup/phpgw_sl.lang @@ -5,6 +5,7 @@ %1 records imported addressbook sl %1 zapisov uvoΕΎenih %1 records read (not yet imported, you may go %2back%3 and uncheck test import) addressbook sl 1% zapisov prebranih (niso Ε‘e uvoΕΎeni, lahko greste %2nazaj%3 in odznačite preizkus uvoza) %1 starts with '%2' addressbook sl %1 se začne z '%2' +%s please calculate the result addressbook sl %s izračunaj rezultat (e.g. 1969) addressbook sl (npr. 1969) no conversion type <none> could be located. please choose a conversion type from the list addressbook sl Ni tipa prevoda lahko je zaklenjen. Izberite tip prevoda s seznama. @-eval() is only availible to admins!!! addressbook sl Funkcija @-eval() je na voljo samo za oskrbniku! @@ -16,6 +17,7 @@ add a contact to this organisation addressbook sl Dodaj kontakt v to organizacij add a new contact addressbook sl Dodaj nov kontakt add a new list addressbook sl Dodaj nov seznam add a single entry by passing the fields. addressbook sl Dodaj zapis z vnosom polj. +add business email of whole distribution list? addressbook sl Dodam sluΕΎbeni e-naslov celotnega distribucijskega seznama? add custom field addressbook sl Dodaj polje add to distribution list: addressbook sl Dodaj v distribucijski seznam: added by synchronisation addressbook sl Dodano s sinhronizacijo @@ -38,7 +40,7 @@ all contacts addressbook sl Vsi kontakti allow users to maintain their own account-data admin sl Dovoli uporabnikom, da sami vzdrΕΎuejo svoje podatke o računu alt. csv import addressbook sl Uvoz CSV datoteke always addressbook sl Vedno -apply changes to all members, whose fields have the same previous content addressbook sl Uveljavi spremembe vsem člamon, katerih polja imajo enako prejΕ‘njo vrednost +apply changes to all members, whose fields have the same previous content addressbook sl Uveljavi spremembe vsem članom, katerih polja imajo enako prejΕ‘njo vrednost apply the action on the whole query, not only the shown contacts!!! addressbook sl Uveljavi dejanje na celem povpraΕ‘evanju, NE samo na prikazanih kontaktih! are you shure you want to delete this contact? addressbook sl Res ΕΎelite zbrisati ta stik? are you sure you want to delete this field? addressbook sl Ste prepričani, da ΕΎelite izbrisati to polje? @@ -76,10 +78,13 @@ contact common sl Stik contact application admin sl Aaplikacija za stike contact copied addressbook sl Stik kopiran contact deleted addressbook sl Stik izbrisan +contact fields to show addressbook sl Polja stika za prikaz contact id addressbook sl ID stika +contact modified by %1 at %2 addressbook sl Stik spremenil %1 dne %2 contact repository admin sl Repozitorij za stike contact saved addressbook sl Stik shranjen contact settings admin sl Nastavitve stikov +contactform addressbook sl Obrazec za stike contacts and account contact-data to ldap admin sl Stiki in kontaktni podatki računa v LDAP contacts to ldap admin sl Stiki v LDAP contacts to ldap, account contact-data to sql admin sl Stik v LDAP, kontaktni podatki računa v LDAP @@ -93,6 +98,7 @@ credit addressbook sl Zasluge csv-fieldname addressbook sl CSV-Ime polja csv-filename addressbook sl CSV-Ime datoteke custom addressbook sl Lasten +custom etemplate for the contactform addressbook sl eTemplate po meri za obrazec za stike custom fields addressbook sl Lastna polja debug output in browser addressbook sl Preglej izpis v brskalniku default address format addressbook sl Privzeta oblika naslovov @@ -121,7 +127,9 @@ edit custom field addressbook sl Uredi lastno polje edit custom fields admin sl Uredi lastna polja edit extra account-data in the addressbook admin sl Uredi dodatne podatke računa v adresarju edit phonenumbers - addressbook sl Uredi telefonske Ε‘tevilke - +either the configured email addesses are wrong or the mail configuration. addressbook sl Napačen e-naslov ali konfiguracija. email & internet addressbook sl E-poΕ‘ta in Splet +email addresses (comma separated) to send the contact data addressbook sl E-naslovi (ločeni z vejico), na katere poΕ‘ljem podatke stika empty for all addressbook sl Izprazni za vse enable an extra private addressbook addressbook sl Omogoči dodatni osebni adresar enter the path to the exported file here addressbook sl Vnesite pot do izhodne datoteke @@ -167,6 +175,7 @@ home phone addressbook sl Telefon home state addressbook sl DrΕΎava home street addressbook sl Naslov home zip code addressbook sl PoΕ‘tna Ε‘t. +how many contacts should non-admins be able to export (empty = no limit) admin sl Koliko stikov lahko izvozijo ne-administratorji (prazno pomeni brez omejitev) icon addressbook sl Ikona if accounts are already in ldap admin sl Če je račun ΕΎe v LDAP import addressbook sl Uvozi @@ -195,6 +204,7 @@ link title for contacts show addressbook sl PrikaΕΎi naslov stika kot povezavo links addressbook sl Povezave list all categories addressbook sl Izpis vseh kategorij list all customfields addressbook sl Izpis vseh lastnih polj +list already exists! addressbook sl Seznam ΕΎe obstaja! list created addressbook sl Seznam ustvarjen list creation failed, no rights! addressbook sl Napak pri ustvarjanju seznama - nimate pravic! load vcard addressbook sl NaloΕΎi VCard @@ -202,6 +212,7 @@ locations addressbook sl Lokacije mark records as private addressbook sl Označi zapise kot zasebne merge into first or account, deletes all other! addressbook sl Spoji v prvi stik, izbriΕ‘i ostale! merged addressbook sl Spojeno +message after submitting the form addressbook sl Sporočilo po oddaji obrazca message phone addressbook sl Telefon za sporočila middle name addressbook sl Srednje ime migration finished addressbook sl Migracija končana @@ -215,6 +226,7 @@ moved addressbook sl Premaknjeno multiple vcard addressbook sl Več VCard zapisov name for the distribution list addressbook sl Ime za distribucijski seznam name, address addressbook sl Ime, naslov +new contact submitted by %1 at %2 addressbook sl Nov stik je dodal/-a %1 dne %2 no vcard addressbook sl Ni VCard zapisov number addressbook sl Ε tevilo number of records to read (%1) addressbook sl Ε tevilo zapisov za branje (%1) @@ -248,6 +260,7 @@ record access addressbook sl Dostop do zapisa record owner addressbook sl Lastnik zapisa remove selected contacts from distribution list addressbook sl Odstrani izbrane kontakte iz distribucijskega seznama removed from distribution list addressbook sl Odstranjeno iz distribucijskega seznama +required fields * addressbook sl Zahtevana polja * role addressbook sl Vloga room addressbook sl Soba search for '%1' addressbook sl Iőči '%1' @@ -273,12 +286,18 @@ start admin sl Začetek startrecord addressbook sl Začetni zapis state common sl DrΕΎava street common sl Ulica +subject for email addressbook sl Zadeva sporočila successfully imported %1 records into your addressbook. addressbook sl UspeΕ‘no prenesenih %1 zapisov v vaΕ‘ adresar. suffix addressbook sl Pripona tel home addressbook sl Domači telefon telephony integration admin sl Integracija telefonije test import (show importable records only in browser) addressbook sl Preizkus uvoza (PokaΕΎe uvoΕΎene zapisesamo v brskalniku). +thank you for contacting us. addressbook sl Hvala za vaΕ‘e sporočilo. that field name has been used already ! addressbook sl To ime polja je ΕΎe v uporabi! +the anonymous user has probably no add rights for this addressbook. addressbook sl Anonimni uporabnik verjetno nima pravic dodajanja v ta adresar. +the anonymous user needs add rights for it! addressbook sl Anonimni uporabnik potrebuje pravico dodajanja! +there was an error saving your data :-( addressbook sl Napaka pri shranjevanju podatkov. +this module displays a contactform, that stores direct into the addressbook. addressbook sl Ta modul prikaΕΎe obrazec stika, ki se shrani neposredno v adresar. this person's first name was not in the address book. addressbook sl Imena te osebe ni v adresarju. this person's last name was not in the address book. addressbook sl Priimka te osebe ni v adresarju. timezone addressbook sl Časovni pas @@ -289,7 +308,7 @@ translation addressbook sl Prevod type addressbook sl Vrsta update a single entry by passing the fields. addressbook sl Popravi en zapis z vnosom polj. upload or delete the photo addressbook sl NaloΕΎi ali izbriΕ‘i fotografijo -url to link telephone numbers to (use %1 for the number) admin sl URL, na katerega naj kaΕΎe povezava telefonske Ε‘tevilke (uporabite %1 za Ε‘tevilko) +url to link telephone numbers to (use %1 = number to call, %u = account name, %t = account phone) admin sl URL, na katerega se poveΕΎejo Ε‘tevilke telefonov (%1 = Ε‘tevilka za klicanje, %u = ime računa, %t = telefonska Ε‘tevilka računa) use an extra category tab? addressbook sl Uporaba dodatnega zavihka kategorija? use country list addressbook sl Uporabi seznam drΕΎav use setup for a full account-migration admin sl Uporabi namestitev za popolno migracijo računov @@ -297,6 +316,7 @@ used for links and for the own sorting of the list addressbook sl Uporabno za po vcard common sl VCard vcards require a first name entry. addressbook sl VCards zahteva vpis imena. vcards require a last name entry. addressbook sl VCards zahteva vpis priimka. +verification addressbook sl Potrditev view linked infolog entries addressbook sl Poglej povezane vnose InfoDnevnika warning!! ldap is valid only if you are not using contacts for accounts storage! admin sl OPOZORILO!! LDAP je veljaven samo, če ne uporabljate stikov za skladiőčenje računov! warning: all contacts found will be deleted! addressbook sl Opozorilo: vsi najdeni stiki bodo zbrisani! @@ -308,6 +328,7 @@ which fields should be exported. all means every field stored in the addressbook whole query addressbook sl Celotno povpraΕ‘evanje work phone addressbook sl Telefon write (update or add) a single entry by passing the fields. addressbook sl ZapiΕ‘i (posodobi ali dodaj) zapis s podanimi polji. +wrong - try again ... addressbook sl Napačno - poskusite znoova. yes, for the next three days addressbook sl Da, za naslednje tri dni yes, for the next two weeks addressbook sl Da, za naslednja dva tedna yes, for the next week addressbook sl Da, za naslednji teden @@ -317,6 +338,7 @@ you are not permittet to delete this contact addressbook sl Nimate dovoljenja br you are not permittet to edit this contact addressbook sl Nimate dovoljenja spremeniti tega stika you are not permittet to view this contact addressbook sl Nimate dovoljenja pogledati tega stika you can only use ldap as contact repository if the accounts are stored in ldap too! admin sl LDAP lahko uporabite za shranjevanje stikov samo, če LDAP uporabite tudi za shranjevanje računov! +you can respond by visiting: addressbook sl Za ogled pojdite na: you must select a vcard. (*.vcf) addressbook sl Izbrati morate VCard. (*.vcf) you must select at least 1 column to display addressbook sl Izbrati morate najmanj 1 stolpec za prikaz you need to select a distribution list addressbook sl Izbrati morate distribucijski seznam diff --git a/addressbook/setup/phpgw_zh-tw.lang b/addressbook/setup/phpgw_zh-tw.lang index dce1637f56..a74db030fb 100644 --- a/addressbook/setup/phpgw_zh-tw.lang +++ b/addressbook/setup/phpgw_zh-tw.lang @@ -5,6 +5,7 @@ %1 records imported addressbook zh-tw ε…±ζœ‰%1 η­†η΄€ιŒ„θ’«εŒ―ε…₯ %1 records read (not yet imported, you may go %2back%3 and uncheck test import) addressbook zh-tw ε…±ζœ‰%1 η­†θ¨˜ιŒ„θ’«θ€ε–οΌˆι‚„ζœͺ蒫匯ε…₯οΌŒζ‚¨ζ‡‰θ©² %2ε›žδΈŠι %3 δΈ¦ε–ζΆˆγ€ŒεŒ―ε…₯測試」) %1 starts with '%2' addressbook zh-tw %1 開始於 '%2' +%s please calculate the result addressbook zh-tw %s θ«‹θ¨ˆη—η΅ζžœ (e.g. 1969) addressbook zh-tw (例如 1969) no conversion type <none> could be located. please choose a conversion type from the list addressbook zh-tw ζ²’ζœ‰θ½‰ζ›ζ ΌεΌ <ζ²’ζœ‰> 可δ»₯θ’«ζŒ‡εšγ€‚ θ«‹εΎžιΈε–選取一η¨θ½‰ζ›ζ ΌεΌ @-eval() is only availible to admins!!! addressbook zh-tw @-eval() εͺ提供硦η‘理者使用!! @@ -16,6 +17,7 @@ add a contact to this organisation addressbook zh-tw ζ–°ε’žδΈ€ε€‹θ―η΅‘δΊΊεˆ°ι€™ add a new contact addressbook zh-tw ζ–°ε’žθ―η΅‘δΊΊ add a new list addressbook zh-tw ζ–°ε’žδΈ€ε€‹ζΈ…ε– add a single entry by passing the fields. addressbook zh-tw εΎžζ¬„δ½δΈ­ζ–°ε’žδΈ€η­†θ³‡ζ–™γ€‚ +add business email of whole distribution list? addressbook zh-tw εœ¨ζ•΄ε€‹εˆ†ι…ζΈ…ε–ζ–°ε’žε•†ε‹™δΏ‘η±οΌŸ add custom field addressbook zh-tw ζ–°ε’žθ‡ͺ訂欄位 add to distribution list: addressbook zh-tw ζ–°ε’žεˆ°εˆ†ι…ζΈ…ε–οΌš added by synchronisation addressbook zh-tw 同ζ­₯εΎŒζ–°ε’ž @@ -76,10 +78,13 @@ contact common zh-tw 聯硑人 contact application admin zh-tw 聯硑人申請 contact copied addressbook zh-tw 聯硑人耇製了 contact deleted addressbook zh-tw 聯硑人εˆͺ陀了 +contact fields to show addressbook zh-tw θ¦ι‘―η€Ίηš„θ―η΅‘δΊΊζ¬„δ½ contact id addressbook zh-tw θ―η΅‘δΊΊη·¨θ™Ÿ +contact modified by %1 at %2 addressbook zh-tw 這個聯硑人由 %1 在 %2 δΏζ”Ή contact repository admin zh-tw 聯硑人資料庫 contact saved addressbook zh-tw θ―η΅‘δΊΊε„²ε­˜δΊ† contact settings admin zh-tw θ―η΅‘δΊΊθ¨­εš +contactform addressbook zh-tw θ―η΅‘θ‘¨ε– contacts and account contact-data to ldap admin zh-tw θ―η΅‘δΊΊθˆ‡εΈ³θ™Ÿθ―η΅‘θ³‡ζ–™εˆ°LDAP contacts to ldap admin zh-tw 聯硑人到LDAP contacts to ldap, account contact-data to sql admin zh-tw 聯硑人到LDAPοΌŒεΈ³θ™Ÿθ―η΅‘θ³‡ζ–™εˆ°θ³‡ζ–™εΊ« @@ -93,6 +98,7 @@ credit addressbook zh-tw 俑用鑍度 csv-fieldname addressbook zh-tw CSV欄位名稱 csv-filename addressbook zh-tw CSVζͺ”名 custom addressbook zh-tw θ‡ͺ訂 +custom etemplate for the contactform addressbook zh-tw θ‡ͺ訂 eTemplate ηš„θ―η΅‘θ‘¨ε– custom fields addressbook zh-tw θ‡ͺ訂欄位 debug output in browser addressbook zh-tw εΎžη€θ¦½ε™¨θΌΈε…₯錯θͺ€θ¨Šζ― default address format addressbook zh-tw 預設住址格式 @@ -121,7 +127,9 @@ edit custom field addressbook zh-tw η·¨θΌ―θ‡ͺ訂欄位 edit custom fields admin zh-tw η·¨θΌ―θ‡ͺ訂欄位 edit extra account-data in the addressbook admin zh-tw η·¨θΌ―ι€šθ¨ŠιŒ„ηš„ε…Άδ»–εΈ³θ™Ÿθ³‡ζ–™ edit phonenumbers - addressbook zh-tw η·¨θΌ―ι›»θ©±θ™Ÿη’Ό - +either the configured email addesses are wrong or the mail configuration. addressbook zh-tw δΏ‘η±ζˆ–ζ˜―郡仢設εšζœ‰θͺ€γ€‚ email & internet addressbook zh-tw Email & ηΆ²θ·― +email addresses (comma separated) to send the contact data addressbook zh-tw ε―„ι€θ―η΅‘δΊΊθ³‡ζ–™ηš„δΏ‘η±οΌˆι€—ι»žεˆ†ιš”οΌ‰ empty for all addressbook zh-tw 全部清陀 enable an extra private addressbook addressbook zh-tw ε•Ÿη”¨η§δΊΊι€šθ¨ŠιŒ„ enter the path to the exported file here addressbook zh-tw θΌΈε…₯εŒ―ε‡Ίζͺ”ζ‘ˆηš„θ·―εΎ‘ @@ -196,6 +204,7 @@ link title for contacts show addressbook zh-tw ι‘―η€Ίθ―η΅‘δΊΊηš„ι€£η΅ζ¨™ι‘Œ links addressbook zh-tw 連硐 list all categories addressbook zh-tw εˆ—ε‡Ίζ‰€ζœ‰ι‘žεˆ₯ list all customfields addressbook zh-tw εˆ—ε‡Ίζ‰€ζœ‰θ‡ͺ訂欄位 +list already exists! addressbook zh-tw ζΈ…ε–ε·²ηΆ“ε­˜εœ¨οΌ list created addressbook zh-tw ζΈ…ε–ε»Ίη«‹ζ—₯期 list creation failed, no rights! addressbook zh-tw ε»Ίη«‹ζΈ…ε–ε€±ζ•—οΌŒζ²’ζœ‰ζ¬Šι™οΌ load vcard addressbook zh-tw θ€ε–名片ζͺ” @@ -203,6 +212,7 @@ locations addressbook zh-tw δ½η½ mark records as private addressbook zh-tw ζ¨™η€Ίη‚Ίη§δΊΊθ¨˜ιŒ„ merge into first or account, deletes all other! addressbook zh-tw εˆδ½΅εˆ°η¬¬δΈ€ε€‹ζˆ–ζ˜―εΈ³θ™ŸοΌŒεˆͺι™€ε…Άδ»–ηš„οΌ merged addressbook zh-tw εˆδ½΅δΊ† +message after submitting the form addressbook zh-tw 送出葨ε–εΎŒηš„θ¨Šζ― message phone addressbook zh-tw 留言電話 middle name addressbook zh-tw 中間欄位 migration finished addressbook zh-tw 轉換εŒζˆ @@ -216,6 +226,7 @@ moved addressbook zh-tw 移動了 multiple vcard addressbook zh-tw ε€šι‡εη‰‡ζͺ” name for the distribution list addressbook zh-tw εˆ†ι…ζΈ…ε–ηš„εη¨± name, address addressbook zh-tw 名稱,住址 +new contact submitted by %1 at %2 addressbook zh-tw %1 在 %2 ζ–°ε’žδΊ†θ―η΅‘δΊΊ no vcard addressbook zh-tw ζ²’ζœ‰VCard number addressbook zh-tw ζ•Έε­— number of records to read (%1) addressbook zh-tw θ€ε–θ¨˜ιŒ„θ™Ÿη’Ό(%1) @@ -249,6 +260,7 @@ record access addressbook zh-tw θ¨˜ιŒ„ε­˜ε– record owner addressbook zh-tw θ¨˜ιŒ„ζ“ζœ‰θ€… remove selected contacts from distribution list addressbook zh-tw εΎžεˆ†ι…ζΈ…ε–η§»ι™€ιΈζ“‡ηš„θ―η΅‘δΊΊ removed from distribution list addressbook zh-tw εΎžεˆ†ι…ζΈ…ε–移陀了 +required fields * addressbook zh-tw 必呫欄位 role addressbook zh-tw 角色 room addressbook zh-tw θΎ¦ε…¬ε€ search for '%1' addressbook zh-tw ζœε°‹ '%1' @@ -274,12 +286,18 @@ start admin zh-tw 開始 startrecord addressbook zh-tw ι–‹ε§‹θ¨˜ιŒ„ state common zh-tw 省/εΈ‚ street common zh-tw εœ°ε€ +subject for email addressbook zh-tw 郡仢主旨 successfully imported %1 records into your addressbook. addressbook zh-tw 成功匯ε…₯ %1 η­†ι€šθ¨ŠιŒ„θ³‡ζ–™ suffix addressbook zh-tw 稱謂(後η½) tel home addressbook zh-tw εΆδΈ­ι›»θ©± telephony integration admin zh-tw ι›»δΏ‘εŠŸθƒ½ζ•΄εˆ test import (show importable records only in browser) addressbook zh-tw 測試匯ε…₯οΌŸοΌˆεœ¨η€θ¦½ε™¨δΈ­εͺ鑯瀺可匯ε…₯ηš„η΄€ιŒ„οΌ‰ +thank you for contacting us. addressbook zh-tw ζ„Ÿθ¬ζ‚¨ηš„θ―ηΉ«γ€‚ that field name has been used already ! addressbook zh-tw 這個欄位名稱已碓蒫使用! +the anonymous user has probably no add rights for this addressbook. addressbook zh-tw θ¨ͺε’δΉŸθ¨±ζ²’ζœ‰ζ–°ε’žθ³‡ζ–™εˆ°ι€šθ¨ŠιŒ„ηš„ζ¬Šι™γ€‚ +the anonymous user needs add rights for it! addressbook zh-tw θ¨ͺε’ιœ€θ¦ζ–°ε’žηš„ζ¬Šι™οΌ +there was an error saving your data :-( addressbook zh-tw ε„²ε­˜θ³‡ζ–™ζ™‚η™Όη”ŸδΈ€ε€‹ιŒ―θͺ€γ€‚ +this module displays a contactform, that stores direct into the addressbook. addressbook zh-tw 這個樑硄鑯瀺一個聯硑葨ε–οΌŒε„²ε­˜ηš„θ³‡ζ–™ζœƒη›΄ζŽ₯θ½‰εˆ°ι€šθ¨ŠιŒ„δΈ­γ€‚ this person's first name was not in the address book. addressbook zh-tw ι€™ε€‹δΊΊηš„εε­—ζ²’ζœ‰εœ¨ι€šθ¨ŠιŒ„δΈ­γ€‚ this person's last name was not in the address book. addressbook zh-tw ι€™ε€‹δΊΊηš„ε§“ζ°ζ²’ζœ‰εœ¨ι€šθ¨ŠιŒ„δΈ­γ€‚ timezone addressbook zh-tw 時區 @@ -290,6 +308,7 @@ translation addressbook zh-tw 轉換 type addressbook zh-tw ι‘žεž‹ update a single entry by passing the fields. addressbook zh-tw εΎžζ¬„δ½ζ›΄ζ–°δΈ€η­†θ³‡ζ–™γ€‚ upload or delete the photo addressbook zh-tw δΈŠε‚³ζˆ–ζ˜―εˆͺ陀照片 +url to link telephone numbers to (use %1 = number to call, %u = account name, %t = account phone) admin zh-tw ι€£η΅ι›»θ©±θ™Ÿη’Όηš„ηΆ²ε€οΌˆδ½Ώη”¨ %1 = ζ’₯ζ‰“θ™Ÿη’ΌοΌŒ %u = εΈ³θ™Ÿεη¨±οΌŒ %t = εΈ³θ™Ÿι›»θ©±οΌ‰ use an extra category tab? addressbook zh-tw δ½Ώη”¨ι™„εŠ ι‘žεˆ₯ζ¨™η±€οΌŸ use country list addressbook zh-tw δ½Ώη”¨εœ‹εΆζΈ…ε– use setup for a full account-migration admin zh-tw 使用ε‰θ£η¨‹εΌδΎ†εŒζ•΄θ½‰ζ›εΈ³θ™Ÿ @@ -297,6 +316,7 @@ used for links and for the own sorting of the list addressbook zh-tw η”¨εœ¨ι€£ vcard common zh-tw 名片ζͺ” vcards require a first name entry. addressbook zh-tw 名片ζͺ”ιœ€θ¦εε­—θ³‡ζ–™γ€‚ vcards require a last name entry. addressbook zh-tw 名片ζͺ”ιœ€θ¦ε§“ζ°θ³‡ζ–™γ€‚ +verification addressbook zh-tw η’Ίθͺ view linked infolog entries addressbook zh-tw ζͺ’θ¦–ι€£η΅ηš„θ¨˜δΊ‹θ³‡ζ–™ warning!! ldap is valid only if you are not using contacts for accounts storage! admin zh-tw 注意!!εͺζœ‰η•Άζ‚¨ζ²’ζœ‰ε°‡θ―η΅‘δΊΊδ½œη‚ΊεΈ³θ™Ÿε„²ε­˜ζ™‚LDAPζ‰ζœƒη”Ÿζ•ˆοΌ warning: all contacts found will be deleted! addressbook zh-tw θ­¦ε‘ŠοΌšζ‰Ύεˆ°ηš„ζ‰€ζœ‰θ―η΅‘δΊΊιƒ½ζœƒθ’«εˆͺ陀! @@ -308,6 +328,7 @@ which fields should be exported. all means every field stored in the addressbook whole query addressbook zh-tw 整個ζŸ₯θ©’ work phone addressbook zh-tw ε·₯δ½œι›»θ©± write (update or add) a single entry by passing the fields. addressbook zh-tw ι€ιŽζδΎ›ηš„ζ¬„δ½ε―«ε…₯οΌˆζ›΄ζ–°ζˆ–ζ–°ε’žοΌ‰δΈ€η­†η¨η«‹θ³‡ζ–™γ€‚ +wrong - try again ... addressbook zh-tw 錯θͺ€οΌŒθ«‹ι‡θ©¦... yes, for the next three days addressbook zh-tw 是,在ζŽ₯下來三倩 yes, for the next two weeks addressbook zh-tw 是,在ζŽ₯δΈ‹δΎ†ε…©ι€± yes, for the next week addressbook zh-tw 是,在ζŽ₯δΈ‹δΎ†δΈ€ι€± @@ -317,6 +338,7 @@ you are not permittet to delete this contact addressbook zh-tw ζ‚¨ζ²’ζœ‰ζ¬Šι™ you are not permittet to edit this contact addressbook zh-tw ζ‚¨ζ²’ζœ‰ζ¬Šι™η·¨θΌ―ι€™ε€‹θ―η΅‘δΊΊ you are not permittet to view this contact addressbook zh-tw ζ‚¨ζ²’ζœ‰ζ¬Šι™ζͺ’視這個聯硑人 you can only use ldap as contact repository if the accounts are stored in ldap too! admin zh-tw ε¦‚ζžœεΈ³θ™Ÿθ³‡ζ–™δΉŸε„²ε­˜εœ¨ LDAP θ³‡ζ–™εΊ«οΌŒζ‚¨εͺ能倠使用 LDAP δ½œη‚Ίθ―η΅‘δΊΊθ³‡ζ–™εΊ«γ€‚ +you can respond by visiting: addressbook zh-tw ζͺ’θ¦–ηΆ²ε€οΌš you must select a vcard. (*.vcf) addressbook zh-tw ζ‚¨εΏ…ι ˆιΈε–δΈ€ε€‹εη‰‡ζͺ” (*.vcf) you must select at least 1 column to display addressbook zh-tw ζ‚¨εΏ…ι ˆθ‡³ε°‘ιΈε–δΈ€ε€‹ζ¬„δ½ζ‰θƒ½ι‘―η€Ί you need to select a distribution list addressbook zh-tw ζ‚¨εΏ…ι ˆιΈζ“‡δΈ€ε€‹εˆ†ι…ζΈ…ε– diff --git a/admin/setup/phpgw_el.lang b/admin/setup/phpgw_el.lang index 5d00c7e1da..fc2b48ad5e 100644 --- a/admin/setup/phpgw_el.lang +++ b/admin/setup/phpgw_el.lang @@ -1,7 +1,10 @@ %1 - %2 of %3 user accounts admin el %1 - %2 of %3 user accounts +%1 acl records of not (longer) existing accounts deleted. admin el %1 ACL εγγραφές από μη υπάρχοντες λογαριασμούς διαγράφηκαν. %1 not found or not executable !!! admin el %1 not found or not executable !!! +(default no, leave it off if you dont use it) admin el (προεπιλεγμένο Νο, να μείνει απενεργοποιημένο αν δεν χρησιμοποιείται) (stored password will not be shown here) admin el (Τα αποθηκευμένα password δεν θα εμφανίζονται εδω) (to install new applications use
setup [manage applications] !!!) admin el (To install new applications use
Setup [Manage Applications] !!!) +- type admin el - τύπος accesslog and bruteforce defense admin el AccessLog και BruteForce άμυνα account active admin el Λογαριασμός ενεργός account has been created common el Ο λογαριασμός έχει δημιουργηθεί @@ -13,6 +16,7 @@ account preferences admin el acl manager admin el Διευθυντής ACL acl rights common el Δικαιώματα ACL action admin el Ενέργια +activate wysiwyg-editor admin el ενεργοποιήστε WYSIWYG-συντάκτης add a category admin el πρόσθεσε μία κατηγορία add a group admin el πρόσθεσε ένα Group add a new account. admin el Πρόσθεσε έναν νέο λογαριασμό @@ -33,19 +37,25 @@ admin email addresses (comma-separated) to be notified about the blocking (empty admin name admin el Ονομα διαχειρηστή administration admin el Διαχείρηση admins admin el Διαχειριστές +advanced options admin el επιλογές για προχωρημένους after how many unsuccessful attempts to login, an account should be blocked (default 3) ? admin el Μετα απο πόσες αποτυχημένες προσπάθειες για εισαγωγή, ένας λογαριασμός θα έπρεπε να μπλοκαριστεί (προκαθορισμένο 3) ? after how many unsuccessful attempts to login, an ip should be blocked (default 3) ? admin el Μετα απο πόσες αποτυχημένες προσπάθειες για εισαγωγή, ένα IP θα έπρεπε να μπλοκαριστεί (προκαθορισμένο 3) ? +aliases admin el Ψευδώνυμα all records and account information will be lost! admin el Ολες οι εγγραφές και οι πληροφορίες λογαριασμών θα χαθούν! all users admin el Ολοι οι χρήστες allow anonymous access to this app admin el Επιτρέπεται ανώνυμη πρόσβαση σε αυτή την εφαρμογή +alternate email address admin el εναλλακτική διεύθυνση email anonymous user admin el Ανώνυμος χρήστης anonymous user (not shown in list sessions) admin el Ανώνυμος χρήστης -appearance admin el Εμφάνηση -application admin el Εφαρμωγή +anonymous user does not exist! admin el Ο ανώνυμος χρήστης ΔΕΝ υπάρχει! +anonymous user has no run-rights for the application! admin el Ο ανώνυμος χρήστης ΔΕΝ έχει δικαιώματα για αυτήν την εφαρμογή! +appearance admin el Εμφάνιση +application admin el Εφαρμογή application name admin el Ονομα εφαρμογής application title admin el Τίτλος εφαρμογής applications admin el Εφαρμογές applications list admin el Λίστα εφαρμογών +applies the changes admin el εφαρμόζει τις αλλαγές are you sure you want to delete the application %1 ? admin el Είσαι σίγουρος πως θέλεις να διαγράψεις την εφαρμογή %1 ? are you sure you want to delete this account ? admin el Είσαι σίγουρος πως θέλεις να διαγράψεις αυτό το λογαριασμό are you sure you want to delete this application ? admin el Είσαι σίγουρος πως θέλεις να διαγράψεις αυτή την εφαρμογή @@ -58,6 +68,10 @@ async services last executed admin el asynchronous timed services admin el Ασύγχρονες υπηρεσίες asyncservices not yet installed or other error (%1) !!! admin el ασύγχρονες υπηρεσίες δεν έχουν εγκατεστηθεί ακόμα ή άλλο λάθος (%1) !!! attempt to use correct mimetype for ftp instead of default 'application/octet-stream' admin el Επιχειρήθηκε να χρησημοοιηθεί σωστή ομοιοτυπία αντι του προκαθορισμένου 'εφαρμογή/octet-stream' +attribute accountstatus explained admin el Αυτό διαχειρίζεται το γνώρισμα -accountStatus- από το σχήμα QMAIL. +attribute mail explained admin el Αυτό διαχειρίζεται το γνώρισμα -mail- από το σχήμα QMAIL και δεν πρέπει ποτέ να είναι άδειο.Είναι επίσης το eGW εσωτερικό email πεδίο. +attribute mailalternateaddress explained admin el Αυτό διαχειρίζεται το γνώρισμα -mailAlternateAddress- από το σχήμα QMAIL και μπορεί να διαχειριστεί ως οπτικοί χάρτες ή ψευδώνυμα. +attribute mailforwardingaddress explained admin el Αυτό διαχειρίζεται το γνώρισμα -mailForwardingAddress- για το σχήμα QMAIL και δεν πρέπει να είναι κενό αν έχει ανατεθεί. authentication / accounts admin el Ποιστοποίηση / λογαριασμοί auto create account records for authenticated users admin el Αυτόματη δημιουργία εγραφών λογαριασμού για ποιστοποιημένους χρήστες back to the list admin el πίσω στη λίστα @@ -75,12 +89,17 @@ change config settings admin el change main screen message admin el Αλλαγή μηνύματος κύριας οθόνης check ip address of all sessions admin el Ελεγξε τις διευθύνσεις IP από όλα τα sessions check items to %1 to %2 for %3 admin el Ελεγξε τα θέματα στα %1 to %2 για %3 +click to select a color admin el Κάντε κλικ για να επιλέξετε ένα χρ΄'ωμα +color admin el Χρώμα country selection admin el Επιλογή χώρας create group admin el Δημιουργία ομάδας +creates a new field admin el δημιουργεί νέο πεδίο crontab only (recomended) admin el μόνο cronetab (προτείνεται) +custom fields admin el Σύνηθη πεδία data admin el Δεδομένα day admin el Ημέρα day of week
(0-6, 0=sun) admin el Ημέρα της εβδομάδας
(0-6, 0=Κυρ) +db backup and restore admin el DB εφεδρικό και επαναφορά default admin el Προεπιλεγμένος default file system space per user admin el Προεπιλεγμένο σύστημα αρχείων ανα χρήστη default file system space per user/group ? admin el Προεπιλεγμένο σύστημα αρχείων ανα χρήστη/ομαδά ? @@ -96,11 +115,14 @@ delete the group admin el delete this category admin el διέγραψε αυτή την κατηγορία delete this group admin el διέγραψε αυτή την ομάδα delete this user admin el διέγραψε αυτό τον χρήστη +deletes this field admin el δια γράφει αυτό το πεσίο +deliver extern admin el παράδοση εξωτερ deny access to access log admin el Αρνηση πρόσβασης στην αναφορά πρόσβασης deny access to application registery admin el Αρνηση πρόσβασης στην καταγραφή της εφαρμογής deny access to applications admin el Αρνηση πρόσβασης στις εφαρμογές deny access to asynchronous timed services admin el Αρνηση πρόσβασης στις ασυχρόνηστες υπηρεσίες deny access to current sessions admin el Αρνηση πρόσβασης στις τρέχουσες περιόδους +deny access to db backup and restore admin el Άρνηση πρόσβασης στο DB εφεδρικό και επαναφορά deny access to error log admin el Αρνηση πρόσβασης στην αναφορά λαθών deny access to global categories admin el Αρνηση πρόσβασης στις γενικές κατηγορίες deny access to groups admin el Αρνηση πρόσβασης στις ομάδες @@ -111,18 +133,25 @@ deny access to site configuration admin el deny access to user accounts admin el Αρνηση πρόσβασης στους λογαριασμούς του χρήστη deny all users access to grant other users access to their entries ? admin el Αρνηση πρόσβασης όλων των χρηστών στην μεταβίβαση της πρόσβασης άλλων χρηστών στις εισόδους τους? description can not exceed 255 characters in length ! admin el Η περιγραφή δεν πρέπει να υπερβένει τους 255 χαρακτήρες σε μήκος +determines the order the fields are displayed admin el καθορίζει τη σειρά εμφάνισης των πεδίων disable "auto completion" of the login form admin el απενεργοποίηση "αυτόματης συμπλήρωσης" της φόρμασ εισαγωγής +disable wysiwyg-editor admin el απαενεργοποίηση του WYSIWYG-συντάκτη disabled (not recomended) admin el απενεργοποίηση (δεν προτείνεται) display admin el Εμφάνηση do not delete the category and return back to the list admin el μην σβύνετε την κατηγορία και γυρήστε πίσω στην λίστα -do you also want to delete all global subcategories ? admin el Θέλεις επείσης να σβυστούν όλες οι γενικές υποκατηγορίες? +do you also want to delete all global subcategories ? admin el Θέλεις επίσης να σβυστούν όλες οι γενικές υποκατηγορίες? do you want to delete all global subcategories ? admin el Θέλεις να σβύσεις όλες τις γενικές υποκατηγορίες? do you want to move all global subcategories one level down ? admin el Θέλεις να μετακινήσεις όλες τις γενικές υποκατηγορίες ένα επίπεδο κάτω? +document root (default) admin el Πορεία εγγράφου (προεπιλεγμένη) +each value is a line like [=

'.($available ? $passed_icon : $warning_icon).' '. lang('Checking PEAR%1 is installed',($package?'::'.$package:'').($min_version?" ($min_version)":'')).': '. ($available ? ($version_available ? $version_available : lang('True')) : lang('False'))."
\n"; From 4b80391b7195ccd46147ec2b835993f6188ffbef Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 25 Jun 2007 15:57:19 +0000 Subject: [PATCH 17/36] "fix for sequenzes tables are depending on for postgres 8.x, thanks to Peter Eisentraut" --- phpgwapi/inc/adodb/datadict/datadict-postgres.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpgwapi/inc/adodb/datadict/datadict-postgres.inc.php b/phpgwapi/inc/adodb/datadict/datadict-postgres.inc.php index c313e4aba3..963e96b2ed 100644 --- a/phpgwapi/inc/adodb/datadict/datadict-postgres.inc.php +++ b/phpgwapi/inc/adodb/datadict/datadict-postgres.inc.php @@ -289,7 +289,7 @@ class ADODB2_postgres extends ADODB_DataDict { $seq = $this->connection->GetOne("SELECT relname FROM pg_class WHERE NOT relname ~ 'pg_.*' AND relname LIKE $tabname AND relkind='S'"); // check if a tables depends on the sequenz and it therefor cant and dont need to be droped separatly - if (!$seq || $this->connection->GetOne("SELECT relname FROM pg_class JOIN pg_depend ON pg_class.oid=pg_depend.objid WHERE relname='$seq' AND relkind='S' AND deptype='i'")) { + if (!$seq || $this->connection->GetOne("SELECT relname FROM pg_class JOIN pg_depend ON pg_class.oid=pg_depend.objid WHERE relname='$seq' AND relkind='S' AND refclassid = (SELECT oid FROM pg_class WHERE relname = 'pg_class')")) { return False; } return "DROP SEQUENCE ".$seq; From 1602ebc69d0a330b247f460aed2bc059a7cd12d0 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 25 Jun 2007 16:16:55 +0000 Subject: [PATCH 18/36] "some fixes for syncml: - if no owner/addressbook set on update load owner AND private from the existing contact - if no owner/addressbook set for new entries, use the add_default prefs if set and the personal adb of the user if not" --- addressbook/inc/class.bocontacts.inc.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/addressbook/inc/class.bocontacts.inc.php b/addressbook/inc/class.bocontacts.inc.php index 7d706060f7..35a6d52a77 100755 --- a/addressbook/inc/class.bocontacts.inc.php +++ b/addressbook/inc/class.bocontacts.inc.php @@ -442,6 +442,7 @@ class bocontacts extends socontacts if (($old = $this->read($contact['id']))) // --> try reading the old entry and set it from there { $contact['owner'] = $old['owner']; + $contact['private'] = $old['private']; } else // entry not found --> create a new one { @@ -449,8 +450,11 @@ class bocontacts extends socontacts } } } - if (!$isUpdate) { - if (!isset($contact['owner'])) $contact['owner'] = $this->user; // write to users personal addressbook + if (!$isUpdate) + { + // if no owner/addressbook set use the setting of the add_default prefs (if set, otherwise the users personal addressbook) + if (!isset($contact['owner'])) $contact['owner'] = (int)$this->prefs['add_default'] ? (int)$this->prefs['add_default'] : $this->user; + if (!isset($contact['private'])) $contact['private'] = (int)(substr($this->prefs['add_default'],-1) == 'p'); $contact['creator'] = $this->user; $contact['created'] = $this->now_su; From d81a239640edb92c14109e8ffdf7ceff59e1afd3 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 25 Jun 2007 16:36:58 +0000 Subject: [PATCH 19/36] "fixed moving contracts to and from private addressbook" --- addressbook/inc/class.uicontacts.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addressbook/inc/class.uicontacts.inc.php b/addressbook/inc/class.uicontacts.inc.php index 31841057a4..7dabb6c948 100644 --- a/addressbook/inc/class.uicontacts.inc.php +++ b/addressbook/inc/class.uicontacts.inc.php @@ -639,10 +639,10 @@ class uicontacts extends bocontacts { $Ok = false; } - elseif ($contact['owner'] != $action) // no need to change + elseif ($contact['owner'] != (int)$action || $contact['private'] != (int)(substr($action,-1) == 'p')) { $contact['owner'] = (int) $action; - $contact['private'] = 0; + $contact['private'] = (int)(substr($action,-1) == 'p'); $Ok = $this->save($contact); } } From e88080d52048aed4b34f29b2e9bc7d04e83f66a3 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 25 Jun 2007 16:43:32 +0000 Subject: [PATCH 20/36] "fixed bug: resources search to create links returns only maxmatch entries" --- resources/inc/class.bo_resources.inc.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/resources/inc/class.bo_resources.inc.php b/resources/inc/class.bo_resources.inc.php index 8bc97ae01b..abaaab8593 100755 --- a/resources/inc/class.bo_resources.inc.php +++ b/resources/inc/class.bo_resources.inc.php @@ -23,6 +23,12 @@ class bo_resources var $thumbs_dir = '/resources/pictures/thumbs/'; var $resource_icons = '/resources/templates/default/images/resource_icons/'; var $debug = 0; + /** + * Instance of resources so object + * + * @var so_resources + */ + var $so; function bo_resources() { @@ -332,7 +338,7 @@ class bo_resources 'cat_id' => array_flip((array)$this->acl->get_cats(EGW_ACL_READ)), //'accessory_of' => '-1' ); - $data = $this->so->search($criteria,$only_keys,$order_by='',$extra_cols='',$wildcard='%',$empty,$op='OR','',$filter); + $data = $this->so->search($criteria,$only_keys,$order_by='',$extra_cols='',$wildcard='%',$empty,$op='OR',false,$filter); foreach($data as $num => $resource) { $list[$resource['res_id']] = $resource['name']. ($resource['short_description'] ? ', ['.$resource['short_description'].']':''); From a9f78defa882285c91182ae7e0bee6a4c0419458 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 25 Jun 2007 17:00:41 +0000 Subject: [PATCH 21/36] "allow to set quantity to a negative value (like in 1.2) to use it to mark overtime" --- timesheet/inc/class.uitimesheet.inc.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/timesheet/inc/class.uitimesheet.inc.php b/timesheet/inc/class.uitimesheet.inc.php index cbfbcc5683..0f40b6bb03 100644 --- a/timesheet/inc/class.uitimesheet.inc.php +++ b/timesheet/inc/class.uitimesheet.inc.php @@ -90,6 +90,7 @@ class uitimesheet extends botimesheet } else { + //echo "

ts_start=$content[ts_start], start_time=$content[start_time], end_time=$content[end_time], ts_duration=$content[ts_duration], ts_quantity=$content[ts_quantity]

\n"; // we only need 2 out of 3 values from start-, end-time or duration (the date in ts_start is always required!) if ($content['start_time']) // start-time specified { @@ -130,10 +131,11 @@ class uitimesheet extends botimesheet { $etpl->set_validation_error('ts_quantity',lang('Field must not be empty !!!')); } - if ($this->data['ts_quantity'] < 0) + if ($this->data['ts_duration'] < 0) // for layout purpose we show the error behind the quantity field { $etpl->set_validation_error('ts_quantity',lang('Starttime has to be before endtime !!!')); } + //echo "

ts_start=$content[ts_start], start_time=$content[start_time], end_time=$content[end_time], ts_duration=$content[ts_duration], ts_quantity=$content[ts_quantity]

\n"; if (!$this->data['ts_project']) $this->data['ts_project'] = $this->data['ts_project_blur']; // set ts_title to ts_project if short viewtype (title is not editable) if($this->ts_viewtype == 'short') From aa15c34580522750bc3638fb4db6b5548400df44 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 25 Jun 2007 19:50:35 +0000 Subject: [PATCH 22/36] "fixed bug: copy of event does not copy participants" --- calendar/inc/class.uiforms.inc.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/calendar/inc/class.uiforms.inc.php b/calendar/inc/class.uiforms.inc.php index 72742c97bd..478f680aae 100644 --- a/calendar/inc/class.uiforms.inc.php +++ b/calendar/inc/class.uiforms.inc.php @@ -338,8 +338,6 @@ class uiforms extends uical unset($event['modified']); unset($event['modifier']); $event['owner'] = !(int)$this->owner || !$this->bo->check_perms(EGW_ACL_ADD,0,$this->owner) ? $this->user : $this->owner; - $event['participants'] = array($event['owner']=>'A'); - $event['participant_types'] = array('u'=>$event['participants']); $preserv['view'] = $preserv['edit_single'] = false; $msg = lang('Event copied - the copy can now be edited'); $event['title'] = lang('Copy of:').' '.$event['title']; From e7743cb87c520a72f7c8b4186851a3363a4c0aaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cornelius=20Wei=C3=9F?= Date: Mon, 25 Jun 2007 20:47:38 +0000 Subject: [PATCH 23/36] clean fields on demand from cntl chars --- ...ass.import_export_helper_functions.inc.php | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/importexport/inc/class.import_export_helper_functions.inc.php b/importexport/inc/class.import_export_helper_functions.inc.php index 358411adf1..8528c59a63 100755 --- a/importexport/inc/class.import_export_helper_functions.inc.php +++ b/importexport/inc/class.import_export_helper_functions.inc.php @@ -174,14 +174,15 @@ class import_export_helper_functions { */ public static function conversion( $_record, $_conversion, &$_cclass = null ) { if (empty( $_conversion ) ) return $_record; - $values = $_record; $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 + $TPre = '|T{'; $TPos = '}'; // |{_record-idx} is trimmed + $CntlPre = '|TC{'; // Filter all cntl-chars \x01-\x1f and trim + $CntlnCLPre = '|TCnCL{'; // Like |C{ but allowes CR and LF foreach ( $_conversion as $idx => $conversion_string ) { - if ( empty( $conversion_string ) ) continue; // fetch patterns ($rvalues) @@ -194,7 +195,7 @@ class import_export_helper_functions { $rvalues[$pattern] = $replace; // replace two with only one, added by the form } - // conversion list may be longer than $_record (no_csv) + // conversion list may be longer than $_record aka (no_csv) $val = array_key_exists( $idx, $_record ) ? $_record[$idx] : ''; foreach ( $rvalues as $pattern => $replace ) { @@ -215,9 +216,12 @@ class import_export_helper_functions { $val = preg_replace_callback( "/(cat|account|strtotime)\(([^)]+)\)/i", array( self, 'c2_dispatcher') , $val ); } } - $values[$idx] = $val; + // clean each field + $val = preg_replace_callback("/(\|T\{|\|TC\{|\|TCnCL\{)(.*)\}/", array( self, 'strclean'), $val ); + + $_record[$idx] = $val; } - return $values; + return $_record; } // end of member function conversion /** @@ -241,6 +245,17 @@ class import_export_helper_functions { } } + private static function strclean( $_matches ) { + //print_r($_matches); + 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] ) ); + default: + throw new Exception('Error in conversion string! "'. substr( $_matches[1], 0, -1 ). '" is not valid!'); + } + } + /** * returns a list of importexport plugins * From 88548c7767c26c6cb58229e079bf8488019501af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cornelius=20Wei=C3=9F?= Date: Mon, 25 Jun 2007 20:49:19 +0000 Subject: [PATCH 24/36] add calendar csv import plugin --- .../class.import_events_csv.inc.php | 274 ++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 calendar/importexport/class.import_events_csv.inc.php diff --git a/calendar/importexport/class.import_events_csv.inc.php b/calendar/importexport/class.import_events_csv.inc.php new file mode 100644 index 0000000000..be4161f507 --- /dev/null +++ b/calendar/importexport/class.import_events_csv.inc.php @@ -0,0 +1,274 @@ + + * @copyright Cornelius Weiss + * @version $Id: $ + */ + +require_once(EGW_INCLUDE_ROOT. '/importexport/inc/class.iface_import_plugin.inc.php'); +require_once(EGW_INCLUDE_ROOT.'/importexport/inc/class.import_csv.inc.php'); + + +/** + * class import_csv for addressbook + */ +class import_events_csv implements iface_import_plugin { + + private static $plugin_options = array( + 'fieldsep', // char + 'charset', // string + 'event_owner', // int account_id or -1 for leave untuched + 'owner_joins_event', // bool + 'update_cats', // string {override|add} overides record + // with cat(s) from csv OR add the cat from + // csv file to exeisting cat(s) of record + 'num_header_lines', // int number of header lines + 'field_conversion', // array( $csv_col_num => conversion) + 'field_mapping', // array( $csv_col_num => adb_filed) + 'conditions', /* => array containing condition arrays: + 'type' => exists, // record['uid'] exists + 'true' => array( + 'action' => update, + 'last' => true, + ), + 'false' => array( + 'action' => insert, + 'last' => true, + ),*/ + + ); + + /** + * actions wich could be done to data entries + */ + private static $actions = array( 'none', 'update', 'insert', 'delete', ); + + /** + * conditions for actions + * + * @var array + */ + private static $conditions = array( 'exists', 'empty', ); + + /** + * @var definition + */ + private $definition; + + /** + * @var bocalupdate + */ + private $bocalupdate; + + /** + * @var bool + */ + private $dry_run = false; + + /** + * @var bool is current user admin? + */ + private $is_admin = false; + + /** + * @var int + */ + private $user = null; + + /** + * imports entries according to given definition object. + * @param resource $_stream + * @param string $_charset + * @param definition $_definition + */ + public function import( $_stream, definition $_definition ) { + $import_csv = new import_csv( $_stream, array( + 'fieldsep' => $_definition->plugin_options['fieldsep'], + 'charset' => $_definition->plugin_options['charset'], + )); + + $this->definition = $_definition; + + // user, is admin ? + $this->is_admin = isset( $GLOBALS['egw_info']['user']['apps']['admin'] ) && $GLOBALS['egw_info']['user']['apps']['admin']; + $this->user = $GLOBALS['egw_info']['user']['account_id']; + + // dry run? + $this->dry_run = isset( $_definition->plugin_options['dry_run'] ) ? $_definition->plugin_options['dry_run'] : false; + + // fetch the calendar bo + $this->bocalupdate = CreateObject('calendar.bocalupdate'); + + // set FieldMapping. + $import_csv->mapping = $_definition->plugin_options['field_mapping']; + + // set FieldConversion + $import_csv->conversion = $_definition->plugin_options['field_conversion']; + + //check if file has a header lines + if ( isset( $_definition->plugin_options['num_header_lines'] ) ) { + $import_csv->skip_records( $_definition->plugin_options['num_header_lines'] ); + } + + // set eventOwner + $_definition->plugin_options['events_owner'] = isset( $_definition->plugin_options['events_owner'] ) ? + $_definition->plugin_options['events_owner'] : $this->user; + + while ( $record = $import_csv->get_record() ) { + + // don't import empty events + if( count( array_unique( $record ) ) < 2 ) continue; + + if ( $_definition->plugin_options['events_owner'] != -1 ) { + $record['owner'] = $_definition->plugin_options['events_owner']; + } else unset( $record['owner'] ); + + if ( $_definition->plugin_options['conditions'] ) { + foreach ( $_definition->plugin_options['conditions'] as $condition ) { + switch ( $condition['type'] ) { + // exists + case 'exists' : + + if ( is_array( $event = $this->bocalupdate->read( $record['uid'], null, $this->is_admin ) ) ) { + // apply action to event matching this exists condition + $record['id'] = $event['id']; + + if ( $_definition->plugin_options['update_cats'] == 'add' ) { + if ( !is_array( $event['cat_id'] ) ) $event['cat_id'] = explode( ',', $event['cat_id'] ); + if ( !is_array( $record['cat_id'] ) ) $record['cat_id'] = explode( ',', $record['cat_id'] ); + $record['cat_id'] = implode( ',', array_unique( array_merge( $record['cat_id'], $event['cat_id'] ) ) ); + } + + // check if entry is modiefied + $event = array_intersect_key( $event, $record ); + $diff = array_diff( $event, $record ); + if( !empty( $diff ) ) $record['modified'] = time(); + + $action = $condition['true']; + } else $action = $condition['false']; + + $this->action( $action['action'], $record ); + break; + case 'empty' : + $action = empty( $record[$condition['string']] ) ? $condition['true'] : $condition['false']; + $this->action( $action['action'], $record ); + break; + + // not supported action + default : + throw new Exception('condition not supported!!!'); + break; + } + if ($action['last']) break; + } + } else { + // unconditional insert + $this->action( 'insert', $record ); + } + } + } + + /** + * perform the required action + * + * @param int $_action one of $this->actions + * @param array $_data event data for the action + * @return bool success or not + */ + private function action ( $_action, $_data ) { + switch ( $_action ) { + case 'none' : + return true; + + case 'update' : + case 'insert' : + + // paticipants handling + $participants = $_data['participants'] ? split( '[,;]', $_data['participants'] ) : array(); + $_data['participants'] = array(); + if ( $this->definition->plugin_options['owner_joins_event'] && $this->definition->plugin_options['events_owner'] > 0 ) { + $_data['participants'][$this->definition->plugin_options['events_owner']] = 'A'; + } + foreach( $participants as $participant ) { + list( $participant, $status ) = explode( '=', $participant ); + $valid_staties = array('U'=>'U','u'=>'U','A'=>'A','a'=>'A','R'=>'R','r'=>'R','T'=>'T','t'=>'T'); + $status = isset( $valid_staties[$status] ) ? $valid_staties[$status] : 'U'; + if ( $participant && is_numeric($participant ) ) { + $_data['participants'][$participant] = $status; + } + } + // no valid participants so far --> add the importing user/owner + if ( empty( $_data['participants'] ) ) { + $_data['participants'][$this->user] = 'A'; + } + + // are we serious? + if ( $this->dry_run ) { + print_r($_data); + } else { + return $this->bocalupdate->update( $_data, true, !$_data['modified'], $this->is_admin); + } + + case 'delete' : + } + } + + /** + * returns translated name of plugin + * + * @return string name + */ + public static function get_name() { + return lang('Calendar CSV export'); + } + + /** + * returns translated (user) description of plugin + * + * @return string descriprion + */ + public static function get_description() { + return lang("Imports events into your Calendar from a CSV File. CSV means 'Comma Seperated Values'. However in the options Tab you can also choose other seperators."); + } + + /** + * retruns file suffix(s) plugin can handle (e.g. csv) + * + * @return string suffix (comma seperated) + */ + public static function get_filesuffix() { + return 'csv'; + } + + /** + * return etemplate components for options. + * @abstract We can't deal with etemplate objects here, as an uietemplate + * objects itself are scipt orientated and not "dialog objects" + * + * @return array ( + * name => string, + * content => array, + * sel_options => array, + * preserv => array, + * ) + */ + public function get_options_etpl() { + // lets do it! + } + + /** + * returns etemplate name for slectors of this plugin + * + * @return string etemplate name + */ + public function get_selectors_etpl() { + // lets do it! + } + +} // end of iface_export_plugin +?> From a55b1a5163395248d4d6a2cab5c4dbd97aef107d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 27 Jun 2007 05:26:46 +0000 Subject: [PATCH 25/36] "fixed bug reported from sim : _read_group not searching for posixGroup, which makes problems if you have identical numbers and context for users and groups also added a filter for objectclass=posixAccount to _read_user" --- phpgwapi/inc/class.accounts_ldap.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpgwapi/inc/class.accounts_ldap.inc.php b/phpgwapi/inc/class.accounts_ldap.inc.php index 1fbf776f06..f8d0b488a1 100644 --- a/phpgwapi/inc/class.accounts_ldap.inc.php +++ b/phpgwapi/inc/class.accounts_ldap.inc.php @@ -399,7 +399,7 @@ class accounts_backend */ function _read_group($account_id) { - $sri = ldap_search($this->ds, $this->group_context, 'gidnumber=' . abs($account_id), + $sri = ldap_search($this->ds, $this->group_context,'(&(objectClass=posixGroup)(gidnumber=' . abs($account_id).'))', array('dn','gidnumber','cn','objectclass','mail')); $data = ldap_get_entries($this->ds, $sri); @@ -443,7 +443,7 @@ class accounts_backend */ function _read_user($account_id) { - $sri = ldap_search($this->ds, $this->user_context, 'uidnumber=' . (int)$account_id, + $sri = ldap_search($this->ds, $this->user_context, '(&(objectclass=posixAccount)(uidnumber=' . (int)$account_id.'))', array('dn','uidnumber','uid','gidnumber','givenname','sn','cn','mail','userpassword', 'shadowexpire','shadowlastchange','homedirectory','loginshell')); From 25197222bf3773ed6ad5be29e7ed56c1a90ecf74 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 28 Jun 2007 06:11:58 +0000 Subject: [PATCH 26/36] "patch #978 from Nathan Gray, file as option incl. org_unit" --- addressbook/inc/class.bocontacts.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/addressbook/inc/class.bocontacts.inc.php b/addressbook/inc/class.bocontacts.inc.php index 35a6d52a77..0896f44525 100755 --- a/addressbook/inc/class.bocontacts.inc.php +++ b/addressbook/inc/class.bocontacts.inc.php @@ -54,6 +54,7 @@ class bocontacts extends socontacts 'n_prefix n_family: org_name', 'n_fn: org_name', 'org_name', + 'org_name - org_unit', 'n_given n_family', 'n_prefix n_family', 'n_family, n_given', From 6b5dc22ff1f4c391f46cd1664af1829df8fe167f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cornelius=20Wei=C3=9F?= Date: Thu, 28 Jun 2007 10:07:16 +0000 Subject: [PATCH 27/36] Welcome to Darwin! fix: owner field in adb is owner and _not_ contact_owner fix: selector for cli exports --- .../importexport/class.export_contacts_csv.inc.php | 8 ++++++-- .../importexport/class.import_contacts_csv.inc.php | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/addressbook/importexport/class.export_contacts_csv.inc.php b/addressbook/importexport/class.export_contacts_csv.inc.php index 7a12866d0c..1919ed9b9a 100644 --- a/addressbook/importexport/class.export_contacts_csv.inc.php +++ b/addressbook/importexport/class.export_contacts_csv.inc.php @@ -32,12 +32,16 @@ class export_contacts_csv implements iface_export_plugin { $uicontacts = new uicontacts(); $selection = array(); - if ($options['selection'] == 'use_all') { + if ($options['selection'] == 'use_all') { + // uicontacts selection with checkbox 'use_all' $query = $GLOBALS['egw']->session->appsession('index','addressbook'); $query['num_rows'] = -1; // all $uicontacts->get_rows($query,$selection,$readonlys,true); // true = only return the id's } - else { + elseif ( $options['selection'] == 'all_contacts' ) { + $selection = ExecMethod('addressbook.bocontacts.search',array()); + //$uicontacts->get_rows($query,$selection,$readonlys,true); + } else { $selection = explode(',',$options['selection']); } diff --git a/addressbook/importexport/class.import_contacts_csv.inc.php b/addressbook/importexport/class.import_contacts_csv.inc.php index c6aeaaf8c8..190763e052 100644 --- a/addressbook/importexport/class.import_contacts_csv.inc.php +++ b/addressbook/importexport/class.import_contacts_csv.inc.php @@ -125,8 +125,8 @@ class import_contacts_csv implements iface_import_plugin { if( count( array_unique( $record ) ) < 2 ) continue; if ( $_definition->plugin_options['contact_owner'] != -1 ) { - $record['contact_owner'] = $_definition->plugin_options['contact_owner']; - } else unset( $record['contact_owner'] ); + $record['owner'] = $_definition->plugin_options['contact_owner']; + } else unset( $record['owner'] ); if ( $_definition->plugin_options['conditions'] ) { foreach ( $_definition->plugin_options['conditions'] as $condition ) { From c452b9f1c1ade262477a8e3f0682ea8a2989e4e5 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 3 Jul 2007 04:37:06 +0000 Subject: [PATCH 28/36] "fixed type of info_responsible, it's varchar, in the query, gives error in MaxDB" --- infolog/inc/class.soinfolog.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infolog/inc/class.soinfolog.inc.php b/infolog/inc/class.soinfolog.inc.php index a8f5b154de..5869d5c518 100644 --- a/infolog/inc/class.soinfolog.inc.php +++ b/infolog/inc/class.soinfolog.inc.php @@ -252,7 +252,7 @@ class soinfolog // DB-Layer if ($filter == 'user' && $f_user > 0) { - $filtermethod .= " AND (info_owner=$f_user AND info_responsible=0 OR ".$this->responsible_filter($f_user).')'; + $filtermethod .= " AND (info_owner=$f_user AND info_responsible='0' OR ".$this->responsible_filter($f_user).')'; } } //echo "

aclFilter(filter='$filter_was',user='$user') = '$filtermethod', privat_user_list=".print_r($privat_user_list,True).", public_user_list=".print_r($public_user_list,True)."

\n"; From c4a17cf53f88a736ecabdff33798b71c7522df06 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 3 Jul 2007 08:21:29 +0000 Subject: [PATCH 29/36] "fixed date-type problem in restore reported on the german list" --- phpgwapi/inc/class.db_backup.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpgwapi/inc/class.db_backup.inc.php b/phpgwapi/inc/class.db_backup.inc.php index 94f2d26365..eaac7732c4 100644 --- a/phpgwapi/inc/class.db_backup.inc.php +++ b/phpgwapi/inc/class.db_backup.inc.php @@ -302,7 +302,7 @@ } $arr[$key] = str_replace(BACKSLASH_TOKEN,'\\',str_replace(array('\\\\','\\n','\\r','\\"'),array(BACKSLASH_TOKEN,"\n","\r",'"'),substr($field,1,-1))); } - elseif ($keys && (strlen($field) > 64 || !is_numeric($field) && $field != 'NULL')) + elseif ($keys && strlen($field) > 24) { $arr[$key] = base64_decode($field); } From b6cd1ee9e6e07794539f7809b61728655058d77f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cornelius=20Wei=C3=9F?= Date: Wed, 4 Jul 2007 19:13:00 +0000 Subject: [PATCH 30/36] backport syncML fixes --- addressbook/inc/class.bocontacts.inc.php | 5 +++- addressbook/inc/class.socontacts_sql.inc.php | 23 +++++++++++++----- addressbook/inc/class.vcaladdressbook.inc.php | 24 +++++++------------ 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/addressbook/inc/class.bocontacts.inc.php b/addressbook/inc/class.bocontacts.inc.php index 0896f44525..6b1eb6d167 100755 --- a/addressbook/inc/class.bocontacts.inc.php +++ b/addressbook/inc/class.bocontacts.inc.php @@ -443,7 +443,10 @@ class bocontacts extends socontacts if (($old = $this->read($contact['id']))) // --> try reading the old entry and set it from there { $contact['owner'] = $old['owner']; - $contact['private'] = $old['private']; + if(!isset($contact['private'])) + { + $contact['private'] = $old['private']; + } } else // entry not found --> create a new one { diff --git a/addressbook/inc/class.socontacts_sql.inc.php b/addressbook/inc/class.socontacts_sql.inc.php index a2f0c828a1..f38565313f 100644 --- a/addressbook/inc/class.socontacts_sql.inc.php +++ b/addressbook/inc/class.socontacts_sql.inc.php @@ -243,11 +243,17 @@ class socontacts_sql extends so_sql $owner = isset($filter['owner']) ? $filter['owner'] : (isset($criteria['owner']) ? $criteria['owner'] : null); // fix cat_id filter to search in comma-separated multiple cats and return subcats - if ((int)$filter['cat_id']) + if (($cats = $filter['cat_id'])) { - $filter[] = $this->_cat_filter($filter['cat_id']); + if ($filter['cat_id']{0} == '!') + { + $filter['cat_id'] = substr($filter['cat_id'],1); + $not = 'NOT'; + } + $filter[] = $this->_cat_filter((int)$filter['cat_id'],$not); unset($filter['cat_id']); } + // add filter for read ACL in sql, if user is NOT the owner of the addressbook if (isset($this->grants) && !(isset($filter['owner']) && $filter['owner'] == $GLOBALS['egw_info']['user']['account_id'])) { @@ -349,7 +355,7 @@ class socontacts_sql extends so_sql * @param int $cat_id * @return string sql to filter by given cat */ - function _cat_filter($cat_id) + function _cat_filter($cat_id, $not='') { if (!is_object($GLOBALS['egw']->categories)) { @@ -357,9 +363,14 @@ class socontacts_sql extends so_sql } foreach($GLOBALS['egw']->categories->return_all_children((int)$cat_id) as $cat) { - $cat_filter[] = $this->db->concat("','",cat_id,"','")." LIKE '%,$cat,%'"; + $cat_filter[] = $this->db->concat("','",cat_id,"','")." $not LIKE '%,$cat,%'"; } - return '('.implode(' OR ',$cat_filter).')'; + $cfilter = '('.implode(' OR ',$cat_filter).')'; + if(!empty($not)) + { + $cfilter = "( $cfilter OR cat_id IS NULL )"; + } + return $cfilter; } /** @@ -530,4 +541,4 @@ class socontacts_sql extends so_sql return $this->db->row(true); } -} \ No newline at end of file +} diff --git a/addressbook/inc/class.vcaladdressbook.inc.php b/addressbook/inc/class.vcaladdressbook.inc.php index 130eb4f1d5..3bcb60f71b 100644 --- a/addressbook/inc/class.vcaladdressbook.inc.php +++ b/addressbook/inc/class.vcaladdressbook.inc.php @@ -15,6 +15,7 @@ require_once EGW_SERVER_ROOT.'/phpgwapi/inc/horde/Horde/iCalendar.php'; class vcaladdressbook extends bocontacts { + /** * import a vard into addressbook * @@ -91,7 +92,8 @@ class vcaladdressbook extends bocontacts } // don't add the entry if it contains only ';' - if(strlen(str_replace(';','',$value)) != 0) { + // exeptions for mendatory fields + if( ( strlen(str_replace(';','',$value)) != 0 ) || in_array($vcardField,array('FN','ORG','N')) ) { $vCard->setAttribute($vcardField, $value); } if(preg_match('/([\000-\012\015\016\020-\037\075])/',$value)) { @@ -103,18 +105,7 @@ class vcaladdressbook extends bocontacts $vCard->setParameter($vcardField, $options); } - // add the full name of the contact; this is a required field - $value = $GLOBALS['egw']->translation->convert($entry['n_fn'], $sysCharSet, 'utf-8'); - $vCard->setAttribute('FN', $value); - $options = array(); - if(preg_match('/([\000-\012\015\016\020-\037\075])/',$value)) { - $options['ENCODING'] = 'QUOTED-PRINTABLE'; - } - if(preg_match('/([\177-\377])/',$value)) { - $options['CHARSET'] = 'UTF-8'; - } - $vCard->setParameter('FN', $options); - + $result = $vCard->exportvCalendar(); return $result; @@ -564,7 +555,7 @@ class vcaladdressbook extends bocontacts break; case 'private': - $contact[$fieldName] = (int) $vcardValues[$vcardKey]['values'][$fieldKey] == 'PRIVATE'; + (int)$contact[$fieldName] = $vcardValues[$vcardKey]['values'][$fieldKey] == 'PRIVATE'; break; case 'cat_id': @@ -581,6 +572,10 @@ class vcaladdressbook extends bocontacts $contact[$fieldName] = $cat_id; } break; + case 'note': + // note may contain ','s but maybe this needs to be fixed in vcard parser... + $contact[$fieldName] = trim($vcardValues[$vcardKey]['value']); + break; default: $contact[$fieldName] = trim($vcardValues[$vcardKey]['values'][$fieldKey]); break; @@ -591,7 +586,6 @@ class vcaladdressbook extends bocontacts } $contact['n_fn'] = trim($contact['n_given'].' '.$contact['n_family']); - return $contact; } From 909609ebbc01c54a327b678f37b5db9c9e5754ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cornelius=20Wei=C3=9F?= Date: Wed, 4 Jul 2007 19:14:35 +0000 Subject: [PATCH 31/36] backport syncML fixes --- .../inc/horde/Horde/SyncML/Command/Map.php | 3 +- phpgwapi/inc/horde/Horde/SyncML/State_egw.php | 35 +++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/phpgwapi/inc/horde/Horde/SyncML/Command/Map.php b/phpgwapi/inc/horde/Horde/SyncML/Command/Map.php index 1c2d4c8200..264682de77 100644 --- a/phpgwapi/inc/horde/Horde/SyncML/Command/Map.php +++ b/phpgwapi/inc/horde/Horde/SyncML/Command/Map.php @@ -137,7 +137,8 @@ class Horde_SyncML_Command_Map extends Horde_SyncML_Command { Horde::logMessage("SyncML: creating Map for source=" . $this->_mapSource . " and target=" . $this->_mapTarget, __FILE__, __LINE__, PEAR_LOG_DEBUG); // Overwrite existing data by removing it first: - $r = $state->setUID($this->_targetLocURI, $this->_mapSource, $this->_mapTarget); + $ts = $state->getServerAnchorNext($this->_targetLocURI); + $r = $state->setUID($this->_targetLocURI, $this->_mapSource, $this->_mapTarget, $ts); if (is_a($r, 'PEAR_Error')) { Horde::logMessage('SyncML: PEAR Error: ' . $r->getMessage(), __FILE__, __LINE__, PEAR_LOG_ERR); return false; diff --git a/phpgwapi/inc/horde/Horde/SyncML/State_egw.php b/phpgwapi/inc/horde/Horde/SyncML/State_egw.php index 60c95d40af..4490fb0c22 100644 --- a/phpgwapi/inc/horde/Horde/SyncML/State_egw.php +++ b/phpgwapi/inc/horde/Horde/SyncML/State_egw.php @@ -111,6 +111,34 @@ class EGW_SyncML_State extends Horde_SyncML_State return false; } + /** + * returns GUIDs of all client items + */ + function _getClientItems($type) + { + $mapID = $this->_locName . $this->_sourceURI . $type; + + $db = clone($GLOBALS['egw']->db); + + $cols = array('map_guid'); + + $where = array + ( + 'map_id' => $mapID, + 'map_expired' => 0, + ); + + $db->select('egw_contentmap', $cols, $where, __LINE__, __FILE__, false, '', 'syncml'); + + $guids = array(); + while($db->next_record()) + { + $guids[] = $db->f('map_guid'); + } + + return empty($guids) ? false : $guids; + } + /** * Retrieves the Horde server guid (like * kronolith:0d1b415fc124d3427722e95f0e926b75) for a given client @@ -338,11 +366,14 @@ class EGW_SyncML_State extends Horde_SyncML_State #if(count($guidParts) == 3) { # $guid = $GLOBALS['egw']->common->generate_uid($guidParts[0],$guidParts[1]); #} - + + // problem: entries created from client, come here with the (long) server guid, + // but getUIDMapping does not know them and can not map server-guid <--> client guid $guid = $this->getUIDMapping($_guid); if($guid === false) { Horde::logMessage("SyncML: setUID $type, $locid, $guid something went wrong!!! Mapping not found.", __FILE__, __LINE__, PEAR_LOG_INFO); - return false; + $guid = $_guid; + //return false; } Horde::logMessage("SyncML: setUID $_guid => $guid", __FILE__, __LINE__, PEAR_LOG_DEBUG); if($ts == 0) { From dcb8c7c80c0cc12dbfd3f64c122c48d043239411 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 5 Jul 2007 04:42:20 +0000 Subject: [PATCH 32/36] "removed wrong/old constructor " --- etemplate/inc/class.historylog_widget.inc.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/etemplate/inc/class.historylog_widget.inc.php b/etemplate/inc/class.historylog_widget.inc.php index 42b5886601..536e172d8a 100644 --- a/etemplate/inc/class.historylog_widget.inc.php +++ b/etemplate/inc/class.historylog_widget.inc.php @@ -41,10 +41,6 @@ class historylog_widget // 'historylog-helper' => '', ); - function customfields_widget($ui) - { - } - function pre_process($name,&$value,&$cell,&$readonlys,&$extension_data,&$tmpl) { $status_widgets =& $GLOBALS['egw_info']['flags']['etemplate']['historylog-helper']; From c28a1babff2c7fa619da88196c0c539cf0dfbc2f Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 5 Jul 2007 04:44:18 +0000 Subject: [PATCH 33/36] "fixed some bugs, wrong function or method names (it was'nt used so far)" --- etemplate/inc/class.etemplate_request.inc.php | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/etemplate/inc/class.etemplate_request.inc.php b/etemplate/inc/class.etemplate_request.inc.php index 8b6fdcbd04..0ddb75d9b9 100644 --- a/etemplate/inc/class.etemplate_request.inc.php +++ b/etemplate/inc/class.etemplate_request.inc.php @@ -83,7 +83,7 @@ class etemplate_request */ static function read($id) { - if (!($data = $GLOBALS['egw']->session->request($id,'etemplate'))) + if (!($data = $GLOBALS['egw']->session->appsession($id,'etemplate'))) { return false; // request not found } @@ -184,7 +184,7 @@ class etemplate_request } /** - * saves content,readonlys,template-keys, ... via eGW's app_session function + * saves content,readonlys,template-keys, ... via eGW's appsession function * * As a user may open several windows with the same content/template wie generate a location-id from microtime * which is used as location for request to descriminate between the different windows. This location-id @@ -193,11 +193,11 @@ class etemplate_request */ function __destruct() { - if ($this->data_modified) $GLOBALS['egw']->session->app_session($this->id,'etemplate',$this->data); + if ($this->data_modified) $GLOBALS['egw']->session->appsession($this->id,'etemplate',$this->data); if (substr($GLOBALS['egw_info']['server']['sessions_type'],0,4) == 'php4' && !$this->garbage_collection_done) { - $this->php4_request_garbage_collection(); + $this->_php4_request_garbage_collection(); } } @@ -211,8 +211,8 @@ class etemplate_request private function _php4_request_garbage_collection() { // now we are on php4 sessions and do a bit of garbage collection - $app_sessions =& $_SESSION[EGW_SESSION_VAR]['app_sessions']['etemplate']; - $session_used =& $app_sessions['session_used']; + $appsessions =& $_SESSION[EGW_SESSION_VAR]['appsessions']['etemplate']; + $session_used =& $appsessions['session_used']; if ($this->id) { @@ -221,24 +221,24 @@ class etemplate_request } $this->garbage_collection_done = true; - if (count($app_sessions) < 20) return; // we dont need to care + if (count($appsessions) < 20) return; // we dont need to care list($msec,$sec) = explode(' ',microtime()); $now = 100 * $sec + (int)(100 * $msec); // gives precision of 1/100 sec - foreach(array_keys($app_sessions) as $id) + foreach(array_keys($appsessions) as $id) { list(,$time) = explode(':',$id); if (!$time) continue; // other data, no session - //echo ++$n.') '.$id.': '.(($now-$time)/100.0)."secs old, used=".$session_used[$id].", size=".strlen($app_sessions[$id])."
\n"; + //echo ++$n.') '.$id.': '.(($now-$time)/100.0)."secs old, used=".$session_used[$id].", size=".strlen($appsessions[$id])."
\n"; if ($session_used[$id] == 1 && $time < $now - 10*6000 || // session used and older then 10min $time < $now - 60*6000) // session not used and older then 1h { //echo "

boetemplate::php4_session_garbage_collection('$id_used'): unsetting session '$id' (now=$now)

\n"; - unset($app_sessions[$id]); + unset($appsessions[$id]); unset($session_used[$id]); } } From c5ac7645807bb9f843d9016bdca33c9b110d0d57 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 5 Jul 2007 04:46:49 +0000 Subject: [PATCH 34/36] "- bugfix: data_merge was not merging null values (isset instead of array_key_exists) - new update function, which write just the given cols and not the whole row" --- etemplate/inc/class.so_sql.inc.php | 38 ++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/etemplate/inc/class.so_sql.inc.php b/etemplate/inc/class.so_sql.inc.php index aa0220360d..76ece2d41d 100644 --- a/etemplate/inc/class.so_sql.inc.php +++ b/etemplate/inc/class.so_sql.inc.php @@ -201,14 +201,14 @@ class so_sql } foreach($this->db_cols as $db_col => $col) { - if (isset($new[$col])) + if (array_key_exists($col,$new)) { $this->data[$col] = $new[$col]; } } foreach($this->non_db_cols as $db_col => $col) { - if (isset($new[$col])) + if (array_key_exists($col,$new)) { $this->data[$col] = $new[$col]; } @@ -446,6 +446,40 @@ class so_sql return $this->db->Errno; } + /** + * Update only the given fields, if the primary key is not given, it will be taken from $this->data + * + * @param array $fields + * @param boolean $merge=true if true $fields will be merged with $this->data (after update!), otherwise $this->data will be just $fields + * @return int 0 on success, errno != 0 otherwise + */ + function update($fields,$merge=true) + { + if ($merge) $backup_data = $this->data ? $this->data : array(); + + if ($this->autoinc_id && !isset($fields[$this->autoinc_id]) || + $this->db_key_cols && count(array_intersect(array_keys($this->db_key_cols),array_keys($fields)) != count($this->db_key_cols))) + { + foreach($this->db_key_cols as $col => $name) + { + if (!isset($fields[$name])) + { + $fields[$name] = $this->data[$name]; + } + } + } + $this->init($fields); + + $ret = $this->save(); + + if ($merge) + { + $this->init($backup_data); + $this->data_merge($fields); + } + return $ret; + } + /** * deletes row representing keys in internal data or the supplied $keys if != null * From d255c152481ae01d3be172de484d3f006970fefd Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 5 Jul 2007 04:50:53 +0000 Subject: [PATCH 35/36] "new so_sql2 class: adding magic __get() and __set() methods, to be able to work more object oriented with so_sql (just a first step) you can now use $so_sql_obj->my_col = 15 instead of $so_sql_obj->data['my_col']=15; (be aware, that does NOT work with var-parameters of functions and probably references) $so_sql_obj->id alwas references the auto-id, independent of it's name (id is a bad choice of a column-name, because it's a reserved word in some dbms)" --- etemplate/inc/class.so_sql2.inc.php | 114 ++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 etemplate/inc/class.so_sql2.inc.php diff --git a/etemplate/inc/class.so_sql2.inc.php b/etemplate/inc/class.so_sql2.inc.php new file mode 100644 index 0000000000..78f90829c7 --- /dev/null +++ b/etemplate/inc/class.so_sql2.inc.php @@ -0,0 +1,114 @@ + + * @version $Id$ + */ + +require_once(EGW_INCLUDE_ROOT.'/etemplate/inc/class.so_sql.inc.php'); + +/** + * generalized SQL Storage Object + * + * the class can be used in following ways: + * 1) by calling the constructor with an app and table-name or + * 2) by setting the following documented class-vars in a class derifed from this one + * Of cause can you derife the class and call the constructor with params. + * + * The so_sql2 class uses a privat $data array and __get and __set methods to set its data. + * Please note: + * You have to explicitly declare other object-properties of derived classes, which should NOT + * be handled by that mechanism! + * + * @package etemplate + * @subpackage api + * @author RalfBecker-AT-outdoor-training.de + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + */ +class so_sql2 extends so_sql +{ + /** + * Private array containing all the object-data + * + * Colides with the original definition in so_sql and I dont want to change it there at the moment. + * + * @var array + */ + //private $data; + + /** + * constructor of the class + * + * NEED to be called from the constructor of the derived class !!! + * + * @param string $app should be set if table-defs to be read from /setup/tables_current.inc.php + * @param string $table should be set if table-defs to be read from /setup/tables_current.inc.php + * @param object/db $db database object, if not the one in $GLOBALS['egw']->db should be used, eg. for an other database + * @param string $colum_prefix='' column prefix to automatic remove from the column-name, if the column name starts with it + * + * @return so_sql2 + */ + function so_sql2($app='',$table='',$db=null,$column_prefix='') + { + $this->so_sql($app,$table,$db,$column_prefix); + } + + /** + * magic method to read a property from $this->data + * + * The special property 'id' always refers to the auto-increment id of the object, independent of its name. + * + * @param string $property + * @return mixed + */ + function __get($property) + { + switch($property) + { + case 'id': + $property = $this->autoinc_id; + break; + } + if (in_array($property,$this->db_cols)) + { + return $this->data[$property]; + } + } + + /** + * magic method to set a property in $this->data + * + * The special property 'id' always refers to the auto-increment id of the object, independent of its name. + * + * @param string $property + * @param mixed $value + * @return mixed + */ + function __set($property,$value) + { + switch($property) + { + case 'id': + $property = $this->autoinc_id; + break; + } + if (in_array($property,$this->db_cols)) + { + $this->data[$property] = $value; + } + } + + /** + * Return the whole object-data as array, it's a cast of the object to an array + * + * @return array + */ + function as_array() + { + return $this->data; + } +} From 548858e074806979548db334b47a18969a1fa46b Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 5 Jul 2007 04:57:31 +0000 Subject: [PATCH 36/36] "some bugfixes: - two etemplate on one page (eg. infolog under the addressbook view) is working halfway again - fixed not working vars in onclick on grid-cells - disabled cells keep there css-class now Also calling some of the static methods now static, while trying to make process_exec static (which it is not at the moment)" --- etemplate/inc/class.uietemplate.inc.php | 32 ++++++++++++++++--------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/etemplate/inc/class.uietemplate.inc.php b/etemplate/inc/class.uietemplate.inc.php index e5e3f01133..7f0bfc593e 100644 --- a/etemplate/inc/class.uietemplate.inc.php +++ b/etemplate/inc/class.uietemplate.inc.php @@ -191,13 +191,17 @@ $GLOBALS['egw']->translation->add_app('etemplate'); // some extensions have own texts } $id = $this->appsession_id(); - +//echo "

unsetting existing egw_info[etemplate] which had keys=".implode(',',array_keys($GLOBALS['egw_info']['etemplate']))."

\n"; // initialise $GLOBALS['egw_info']['etemplate'], in case there are multiple eTemplates on a page $GLOBALS['egw_info']['etemplate'] = array( 'name_forms' => $GLOBALS['egw_info']['etemplate']['name_forms'], 'validation_errors' => $GLOBALS['egw_info']['etemplate']['validation_errors'], 'hooked' => $GLOBALS['egw_info']['etemplate']['hooked'], + 'content' => $GLOBALS['egw_info']['etemplate']['content'], + 'hook_content' => $GLOBALS['egw_info']['etemplate']['hook_content'], + 'hook_app' => $GLOBALS['egw_info']['etemplate']['hook_app'], ); +//echo "

hooked=".(int)!!$GLOBALS['egw_info']['etemplate']['hooked'].", content=".(int)!!$GLOBALS['egw_info']['etemplate']['content'].", hook_content=".(int)!!$GLOBALS['egw_info']['etemplate']['hook_content'].", hook_app={$GLOBALS['egw_info']['etemplate']['hook_app']}

\n"; $this->name_form =& $GLOBALS['egw_info']['etemplate']['name_form']; $this->name_forms =& $GLOBALS['egw_info']['etemplate']['name_forms']; if (!is_array($this->name_forms)) $this->name_forms = array(); @@ -324,7 +328,7 @@ 'java_script_body_tags' => $GLOBALS['egw']->js->body, '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'], + 'hooked' => $hooked ? $hooked : $GLOBALS['egw_info']['etemplate']['hook_content'], 'hook_app' => $hooked ? $GLOBALS['egw_info']['flags']['currentapp'] : $GLOBALS['egw_info']['etemplate']['hook_app'], 'app_header' => $GLOBALS['egw_info']['flags']['app_header'], 'output_mode' => $output_mode != -1 ? $output_mode : 0, @@ -333,6 +337,8 @@ 'method' => $method, 'name_vars' => $this->name_vars, ),$id); +//echo "

hooked=".(int)!!$hooked.", content=".(int)!!$GLOBALS['egw_info']['etemplate']['content'].", hook_content=".(int)!!$GLOBALS['egw_info']['etemplate']['hook_content'].", hook_app={$GLOBALS['egw_info']['etemplate']['hook_app']}

\n"; +//echo "

session: "; foreach($sess as $key => $val) echo "$key=$val, "; echo "

\n"; /* echo "

total size session data = ".($total=strlen(serialize($sess)))."

\n"; echo "

shares bigger then 1.0% percent of it:

\n"; @@ -736,10 +742,14 @@ foreach($sess as $key => $val) unset($row_data[$col]); // omit empty/disabled cells if only one row continue; } - // can only be set via source at the moment - if (strlen($cell['onclick']) > 1 && $cell['type'] != 'button') + if (strlen($cell['onclick']) > 1 && !in_array($cell['type'],array('button','buttononly'))) { - $row_data[".$col"] .= ' onclick="'.$this->js_pseudo_funcs($cell['onclick'],$cname).'"' . + $onclick = $cell['onclick']; + if (strpos($onclick,'$') !== false || $onclick{0} == '@') + { + $onclick = $this->expand_name($onclick,$c,$r,$content['.c'],$content['.row'],$content); + } + $row_data[".$col"] .= ' onclick="'.$this->js_pseudo_funcs($onclick,$cname).'"' . ($cell['id'] ? ' id="'.$cell['id'].'"' : ''); } $colspan = $span == 'all' ? $this->cols-$c : 0+$span; @@ -885,7 +895,7 @@ foreach($sess as $key => $val) if ($this->rows == 1) { return ''; // if only one row omit cell } - $cell = $this->empty_cell(); // show nothing + $cell = $this->empty_cell('label','',array('span' => $cell['span'])); // show nothing (keep the css class!) $value = ''; } $extra_label = True; @@ -1719,7 +1729,7 @@ foreach($sess as $key => $val) } foreach($var as $key => $val) { - $var[$key] = is_array($val) ? $this->array_stripslashes($val) : stripslashes($val); + $var[$key] = is_array($val) ? etemplate::array_stripslashes($val) : stripslashes($val); } return $var; } @@ -1751,7 +1761,7 @@ foreach($sess as $key => $val) $content = array(); if (get_magic_quotes_gpc()) { - $content_in = $this->array_stripslashes($content_in); + $content_in = etemplate::array_stripslashes($content_in); } $GLOBALS['egw_info']['etemplate']['validation_errors'] = array(); $this->canceled = $this->button_pressed = False; @@ -1767,7 +1777,7 @@ foreach($sess as $key => $val) { $attr = array(); } - $value = $this->get_array($content_in,$form_name,True,$GLOBALS['egw_info']['flags']['currentapp'] == 'etemplate' ? false : true ); + $value = etemplate::get_array($content_in,$form_name,True,$GLOBALS['egw_info']['flags']['currentapp'] == 'etemplate' ? false : true ); // The comment below does only aplay to normal posts, not for xajax. Files are not supported anyway by xajax atm. // not checked checboxes are not returned in HTML and file is in $_FILES and not in $content_in if($value === false && $type == 'xajaxResponse' /*!in_array($type,array('checkbox','file'))*/) continue; @@ -1781,7 +1791,7 @@ foreach($sess as $key => $val) switch ($type) { case 'ext': - $_cont = &$this->get_array($content,$form_name,True); + $_cont = &etemplate::get_array($content,$form_name,True); if (!$this->extensionPostProcess($sub,$form_name,$_cont,$value)) { //echo "\n

unsetting content[$form_name] !!!

\n"; @@ -1791,7 +1801,7 @@ foreach($sess as $key => $val) // $form_name of $content, but under some circumstances a set/changed $_cont // does not result in a change in $content -- RalfBecker 2004/09/18 // seems to depend on the number of (not existing) dimensions of the array -- -- RalfBecker 2005/04/06 - elseif (!$this->isset_array($content,$form_name)) + elseif (!etemplate::isset_array($content,$form_name)) { //echo "

setting content[$form_name]='$_cont' because is was unset !!!

\n"; $this->set_array($content,$form_name,$_cont);