From 5e0c8277afb5ab48ce86bd84887ac7bffd630bc3 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 28 Oct 2002 01:17:32 +0000 Subject: [PATCH] 1) only the newest version of a tpl is used for creating the lang-file 2) added the possebility to select multiple tpls from the search-list to delete them 3) added the developer_tools solangfile class to etemplate to be able to write lang-files, even if the developer-tools are not installed --- etemplate/inc/class.editor.inc.php | 28 +- etemplate/inc/class.soetemplate.inc.php | 41 +-- etemplate/inc/class.solangfile.inc.php | 342 ++++++++++++++++++++++++ 3 files changed, 390 insertions(+), 21 deletions(-) create mode 100644 etemplate/inc/class.solangfile.inc.php diff --git a/etemplate/inc/class.editor.inc.php b/etemplate/inc/class.editor.inc.php index 68dbd444b1..1cb399b9da 100644 --- a/etemplate/inc/class.editor.inc.php +++ b/etemplate/inc/class.editor.inc.php @@ -30,7 +30,8 @@ 'not_writeable' => "Error: webserver is not allowed to write into '%s' !!!", 'exported' => "eTemplate '%s' written to '%s'", 'newer_version' => "newer version '%s' exists !!!", - 'need_name' => 'Application name needed to write a langfile or dump the eTemplates !!!' + 'need_name' => 'Application name needed to write a langfile or dump the eTemplates !!!', + 'x_deleted' => '%d eTemplates deleted' ); var $aligns = array( '' => 'Left', @@ -673,18 +674,35 @@ if (isset($cont['delete'])) { list($delete) = each($cont['delete']); - $read = $result[$delete-1]; - $this->etemplate->read($read['et_name'],$read['et_template'],$read['et_lang'],$read['group'],$read['et_version']); + $this->etemplate->read($result[$delete-1]); unset($cont['delete']); unset($cont['result']); $this->delete(array('preserv' => $cont),'list_result'); return; } + if (isset($cont['delete_selected'])) + { + while (list($row,$sel) = each($cont['selected'])) + { + if ($sel) + { + $this->etemplate->read($result[$row-1]); + $this->etemplate->delete(); + ++$n; + } + } + if ($n) + { + $msg = sprintf($this->messages['x_deleted'],$n); + } + unset($cont['selected']); + unset($cont['delete_selected']); + $result = $this->etemplate->search($cont); + } if (isset($cont['read'])) { list($read) = each($cont['read']); - $read = $result[$read-1]; - $this->etemplate->read($read['et_name'],$read['et_template'],$read['et_lang'],$read['group'],$read['et_version']); + $this->etemplate->read($result[$read-1]); $this->edit(); return; } diff --git a/etemplate/inc/class.soetemplate.inc.php b/etemplate/inc/class.soetemplate.inc.php index d3a559cc7c..1a518475ae 100644 --- a/etemplate/inc/class.soetemplate.inc.php +++ b/etemplate/inc/class.soetemplate.inc.php @@ -361,14 +361,17 @@ } $sql .= " ORDER BY et_name DESC,et_lang DESC,et_template DESC,et_version DESC"; - $this->db->query($sql,__LINE__,__FILE__); + $tpl = new soetemplate; + $tpl->db->query($sql,__LINE__,__FILE__); $result = array(); - while ($this->db->next_record()) + while ($tpl->db->next_record()) { - if ($this->db->f('et_lang') != '##') // exclude or import-time-stamps + if ($tpl->db->f('et_lang') != '##') // exclude or import-time-stamps { - $result[] = $this->db->Record; + $tpl->db2obj(); + + $result[] = $tpl->as_array(); } } return $result; @@ -385,6 +388,7 @@ $this->$name = $this->db->f($db_col); } $this->data = unserialize(stripslashes($this->data)); + if (!is_array($this->data)) $this->data = array(); if ($this->name[0] != '.') { @@ -639,10 +643,6 @@ { $to_trans = array(); - if (stristr($this->name,'test')) // dont write all test-tpls - { - return $to_trans; - } reset($this->data); each($this->data); // skip width while (list($row,$cols) = each($this->data)) { @@ -672,13 +672,20 @@ { $to_trans = array(); - $tmpl = new soetemplate; // to not alter our own data - $tmpl->db->query("SELECT * FROM $this->db_name WHERE et_name LIKE '$app.%'"); + $tpls = $this->search($app); - for ($n = 0; $tmpl->db->next_record(); ++$n) + $tpl = new soetemplate; // to not alter our own data + + while (list(,$keys) = each($tpls)) { - $tmpl->db2obj(); - $to_trans += $tmpl->getToTranslate(); + if (($keys['name'] != $last['name'] || // write only newest version + $keys['template'] != $last['template']) && + !strstr($keys['name'],'test')) + { + $tpl->read($keys); + $to_trans += $tpl->getToTranslate(); + $last = $keys; + } } return $to_trans; } @@ -702,10 +709,12 @@ if (!file_exists(PHPGW_SERVER_ROOT.'/developer_tools/inc/class.solangfile.inc.php')) { - return 'Error: app developer-tools not installed !!!'; + $solangfile = CreateObject('etemplate.solangfile'); + } + else + { + $solangfile = CreateObject('developer_tools.solangfile'); } - $solangfile = CreateObject('developer_tools.solangfile'); - $langarr = $solangfile->load_app($app,$lang); if (!is_array($langarr)) { diff --git a/etemplate/inc/class.solangfile.inc.php b/etemplate/inc/class.solangfile.inc.php new file mode 100644 index 0000000000..753639672e --- /dev/null +++ b/etemplate/inc/class.solangfile.inc.php @@ -0,0 +1,342 @@ + True + ); + + function solangfile() + { + $this->db = $GLOBALS['phpgw']->db; + } + + //Known Issue, if a phrase contains a ' or a " the parse will be thrown off. unless ' are nested inside " or vice versa + function parse_php_app($fd,$plist) + { + define('SEP',filesystem_separator()); + $d=dir($fd); + while ($fn=$d->read()) + { + if (is_dir($fd.$fn.SEP)) + { + if (($fn!='.')&&($fn!='..')&&($fn!='CVS')) + { + $plist=$this->parse_php_app($fd.$fn.SEP,$plist); + } + } + elseif ((strpos($fn,'.php')>1) && (is_readable($fd.$fn))) + { + $fp=fopen($fd.SEP.$fn,'r'); + $fds=substr($fd,strpos($fd,SEP)); + while (!feof($fp)) + { + $str=fgets($fp,8192); + while (strlen($str=$this->strstr_multiple($str,'lang','(',''))) + { + if ($str[0]=="\"" || $str[0]=="'") + { + if ($str[0] == "'") + { + $str=substr($str,1); + $s2=substr($str,0,strpos($str,"'")); + } + else + { + $str=substr($str,1); + $s2=substr($str,0,strpos($str,"\"")); + } + if ($s2!='') + { + $plist[$s2]=$fds; + } + } + } + } + fclose($fp); + } + } + $d->close(); + return ($plist); + } + + /*! + @function strstr_multiple + @abstract search for a substring consisted of parts separated by whitespaces + @param $str original string + @param $sub1 first part of substring + @param $sub2 second part of substring + @result returns portion of $str from the end of substring to the end of $str, or empty string if substring was not found + */ + function strstr_multiple($str,$sub1,$sub2) + { + if (isset($sub1)) + { + if(is_integer($pos=strpos($str,$sub1))) + { + $str=substr($str,$pos+strlen($sub1)); + if (isset($sub2)) + { + $str=ltrim($str); + if(substr($str,0,strlen($sub2)) == $sub2) + { + $str=substr($str,strlen($sub2)); + return $str; + } + } + else + { + return $str; + } + } + } + else + { + return $str; + } + return ""; + } + + function missing_app($app,$userlang=en) + { + $cur_lang=$this->load_app($app,$userlang); + define('SEP',filesystem_separator()); + $fd = PHPGW_SERVER_ROOT . SEP . $app . SEP; + $plist=array(); + $plist = $this->parse_php_app($fd,$plist); + reset($plist); + return($plist); + } + + /*! + @function add_app + @abstract loads all app phrases into langarray + @param $lang user lang variable (defaults to en) + */ + function add_app($app,$userlang='en') + { + define('SEP',filesystem_separator()); + + $fd = PHPGW_SERVER_ROOT . SEP . $app . SEP . 'setup'; + $fn = $fd . SEP . 'phpgw_' . $userlang . '.lang'; + if (is_writeable($fn)) + { + $wr = True; + } + elseif(!file_exists($fn) && is_writeable($fd)) + + { + $wr = True; + } + if (file_exists($fn)) + { + $this->src_file = $fn; + $fp = fopen($fn,'rb'); + while ($data = fgets($fp,8000)) + { + list($message_id,$app_name,$null,$content) = explode("\t",$data); + if(!$message_id) + { + continue; + } + //echo '
add_app(): adding phrase: $this->langarray["'.$message_id.'"]=' . trim($content); + $_mess_id = strtolower(trim($message_id)); + $this->langarray[$_mess_id]['message_id'] = $_mess_id; + $this->langarray[$_mess_id]['app_name'] = trim($app_name); + $this->langarray[$_mess_id]['content'] = trim($content); + } + fclose($fp); + } + else + { + $this->src_file = lang('no file'); + } + // stuff class array listing apps that are included already + $this->loaded_apps[$userlang]['filename'] = $fn; + $this->loaded_apps[$userlang]['writeable'] = $wr; + + if($this->debug) { _debug_array($this->langarray); } + @ksort($this->langarray); + return $this->langarray; + } + + /*! + @function load_app + @abstract loads all app phrases into langarray + @param $lang user lang variable (defaults to en) + */ + function load_app($app,$userlang='en') + { + define('SEP',filesystem_separator()); + + $fd = PHPGW_SERVER_ROOT . SEP . $app . SEP . 'setup'; + $fn = $fd . SEP . 'phpgw_' . $userlang . '.lang'; + if (is_writeable($fn)) + { + $wr = True; + } + elseif(!file_exists($fn) && is_writeable($fd)) + { + $wr = True; + } + + if (file_exists($fn)) + { + $this->tgt_file = $fn; + $fp = fopen($fn,'rb'); + while ($data = fgets($fp,8000)) + { + list($message_id,$app_name,$null,$content) = explode("\t",$data); + if(!$message_id) + { + continue; + } + //echo '
add_app(): adding phrase: $this->langarray["'.$message_id.'"]=' . trim($content); + $_mess_id = strtolower(trim($message_id)); + $langarray[$_mess_id]['message_id'] = $_mess_id; + $langarray[$_mess_id]['app_name'] = trim($app_name); + $langarray[$_mess_id]['content'] = trim($content); + } + fclose($fp); + } + else + { + $this->tgt_file = lang('no file'); + } + // stuff class array listing apps that are included already + $this->loaded_apps[$userlang]['filename'] = $fn; + $this->loaded_apps[$userlang]['writeable'] = $wr; + if($this->debug) { _debug_array($langarray); } + @ksort($langarray); + return $langarray; + } + + function list_apps() + { + $this->db->query("SELECT * FROM phpgw_applications",__LINE__,__FILE__); + if($this->db->num_rows()) + { + while($this->db->next_record()) + { + $name = $this->db->f('app_name'); + $title = $this->db->f('app_title'); + $apps[$name] = array( + 'title' => $title, + 'name' => $name + ); + } + } + @reset($apps); + $this->total = count($apps); + if ($this->debug) { _debug_array($apps); } + return $apps; + } + + function list_langs() + { + $this->db->query("SELECT lang_id,lang_name FROM phpgw_languages ORDER BY lang_name"); + $i = 0; + while ($this->db->next_record()) + { + $languages[$i]['lang_id'] = $this->db->f('lang_id'); + $languages[$i]['lang_name'] = $this->db->f('lang_name'); + $i++; + } + @reset($languages); + if($this->debug) { _debug_array($languages); } + return $languages; + } + + function write_file($app_name,$langarray,$userlang) + { + $fn = PHPGW_SERVER_ROOT . SEP . $app_name . SEP . 'setup' . SEP . 'phpgw_' . $userlang . '.lang'; + $fp = fopen($fn,'wb'); + while(list($mess_id,$data) = each($langarray)) + { + fwrite($fp,$mess_id . "\t" . $data['app_name'] . "\t" . $userlang . "\t" . $data['content'] . "\n"); + } + fclose($fp); + return; + } + + function loaddb($app_name,$userlang) + { + $this->db->transaction_begin(); + + $langarray = $this->load_app($app_name,$userlang); + + @reset($langarray); + while (list($x,$data) = @each($langarray)) + { + $addit = False; + /*echo '

 checking ' . $data['message_id'] . "\t" . $data['app_name'] . "\t" . $userlang . "\t" . $data['content'];*/
+				$this->db->query('SELECT COUNT(*) FROM phpgw_lang'
+					."  WHERE message_id='" . $this->db->db_addslashes($data['message_id'])
+					."' AND lang='".$userlang."' AND app_name='".$app_name."'",__LINE__,__FILE__);
+				$this->db->next_record();
+
+				if ($this->db->f(0) == 0)
+				{
+					$addit = True;
+					/* echo '... no
'; */ + } + else + { + /* echo '... yes'; */ + } + + if ($addit) + { + if($data['message_id'] && $data['content']) + { + /* echo "
adding - insert into phpgw_lang values ('" . $data['message_id'] . "','$app_name','$userlang','" . $data['content'] . "')"; */ + $this->db->query("INSERT into phpgw_lang VALUES ('" + . $this->db->db_addslashes($data['message_id']) + . "','$app_name','$userlang','" + . $this->db->db_addslashes($data['content']) . "')",__LINE__,__FILE__); + } + } + else + { + if($data['message_id'] && $data['content']) + { + $this->db->query("UPDATE phpgw_lang SET content='". $this->db->db_addslashes($data['content']) . "'" + . " WHERE message_id='" . $this->db->db_addslashes($data['message_id']) . "'" + . " AND app_name='$app_name' AND lang='$userlang'",__LINE__,__FILE__); + if ($this->db->affected_rows() > 0) + { +/* + echo "
changing - update lang set content='". $data['content'] . "'" + . " where message_id='" . $data['message_id'] ."'" + . " and app_name='$app_name' and lang='$userlang'"; +*/ + } + } + } + } + $this->db->transaction_commit(); + return lang('done'); + } + } +?>