clsItemDB(); $this->tablename = GetTablePrefix()."Phrase"; $this->id_field = "PhraseId"; $this->NoResourceId=1; if($id) $this->LoadFromDatabase($id); } function LoadFromDatabase($Id) { global $Errors; if(!isset($Id)) { $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromDatabase"); return false; } if($Id) { $sql = sprintf("SELECT * FROM ".$this->tablename." WHERE ".$this->IdField()." = '%s'",$Id); $result = $this->adodbConnection->Execute($sql); if ($result === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromDatabase"); return false; } $data = $result->fields; $this->SetFromArray($data); $this->Clean(); return true; } else return FALSE; } function AdminIcon() { global $imagesURL; return $imagesURL."/itemicons/icon16_language_var.gif"; } } class clsPhraseList extends clsItemCollection { var $Page; var $PerPageVar; function clsPhraseList() { $this->clsItemCollection(); $this->SourceTable = GetTablePrefix()."Phrase"; $this->classname = "clsPhrase"; $this->PerPageVar = "Perpage_Phrase"; $this->AdminSearchFields = array("p.Phrase","p.Translation"); } function &AddPhrase($Phrase,$LangId,$Translation,$Type) { $tmpphrase = $this->GetPhrase($Phrase, $LangId); if (!$tmpphrase) { $p = new clsPhrase(); $p->tablename = $this->SourceTable; $p->Set(array("Phrase","LanguageId","Translation","PhraseType"), array($Phrase,$LangId,$Translation,$Type)); $p->Dirty(); $p->Create(); return $p; } else { //echo 'phrase already exists with label '.$Phrase.'
'; $add_error = "Error"; return $add_error; /* $tmpphrase->Set(array("Phrase","LanguageId","Translation","PhraseType"), array($Phrase,$LangId,$Translation,$Type)); $tmpphrase->Dirty(); $tmpphrase->Update(); return $tmpphrase;*/ } } function &EditPhrase($id,$Phrase,$LangId,$Translation,$Type) { $p = $this->GetItem($id); $p->Set(array("Phrase","LanguageId","Translation","PhraseType"), array($Phrase,$LangId,$Translation,$Type)); $p->Dirty(); $p->Update(); return $p; } function DeletePhrase($id) { $p = $this->GetItem($id); $p->Delete(); } function DeleteLanguage($LangId) { $sql = "DELETE FROM ".$this->SourceTable." WHERE LanguageId=$LangId"; if( $GLOBALS['debuglevel'] ) echo $sql."
\n"; $this->adodbConnection->Execute($sql); } function CopyFromEditTable() { global $objSession; $GLOBALS['_CopyFromEditTable']=1; $edit_table = $objSession->GetEditTable($this->SourceTable); $sql='REPLACE '.GetTablePrefix().'Phrase SELECT * FROM '.$objSession->GetEditTable('Phrase').' WHERE PhraseId > 0'; $this->adodbConnection->Execute($sql); $sql='INSERT INTO '.GetTablePrefix().'Phrase SELECT Phrase, Translation, PhraseType, 0, LanguageId FROM '.$objSession->GetEditTable('Phrase').' WHERE PhraseId < 0'; $this->adodbConnection->Execute($sql); return; //$idlist = array(); $sql = "SELECT * FROM $edit_table"; //echo "performing mass create/update
"; flush(); $this->Clear(); $rs = $this->adodbConnection->Execute($sql); while($rs && !$rs->EOF) { $data = $rs->fields; $c = $this->AddItemFromArray($data); $c->Dirty(); if($data["PhraseId"]>0) { $c->Update(); } else { $c->debuglevel=0; $c->UnsetIdField(); $c->Create(); } $rs->MoveNext(); } // Phrases deleted from temporary table are marked with LanguageId = 0, when saving we need to actually delete them all // The idea was taken from Images edit by Kostja $sql = "DELETE FROM ".$this->SourceTable." WHERE LanguageId = 0"; $this->adodbConnection->Execute($sql); if( $GLOBALS['debuglevel'] ) echo $sql."
\n"; $this->adodbConnection->Execute($sql); unset($GLOBALS['_CopyFromEditTable']); } function PurgeEditTable() { global $objSession; $edit_table = $objSession->GetEditTable($this->SourceTable); $this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); } function GetPhrase($Phrase,$Lang, $no_db=FALSE) { $found = FALSE; foreach($this->Items as $i) { if($i->Get("Phrase")==$Phrase && $i->Get("LanguageId")==$Lang) { $found = TRUE; break; } } if(!$found && !$no_db) { $sql = "SELECT * FROM ".$this->SourceTable." WHERE Phrase='$Phrase' AND LanguageId='$Lang'"; //echo $sql."
\n"; $rs = $this->adodbConnection->Execute($sql); if($rs && !$rs->EOF) { $data = $rs->fields; $i = $this->AddItemFromArray($data); } else $i = FALSE; } return $i; } } RegisterPrefix("clsLanguage","lang","kernel/include/language.php"); class clsLanguage extends clsParsedItem { function clsLanguage($id=NULL) { $this->clsParsedItem(); $this->tablename = GetTablePrefix()."Language"; $this->id_field = "LanguageId"; $this->NoResourceId=1; $this->TagPrefix="lang"; if($id) $this->LoadFromDatabase($id); } function LoadFromDatabase($Id) { global $Errors; if(!isset($Id)) { $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromDatabase"); return false; } $sql = sprintf("SELECT * FROM ".$this->tablename." WHERE ".$this->IdField()." = '%s'",$Id); $result = $this->adodbConnection->Execute($sql); if ($result === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromDatabase"); return false; } $data = $result->fields; $this->SetFromArray($data); $this->Clean(); return true; } function Delete() { $p = new clsPhraseList(); //$id = $this->Get("LanguageId"); //$p->DeleteLanguage($id); parent::Delete(); } function ParseObject($element) { global $m_var_list,$m_var_list_update, $var_list,$var_list_update, $TemplateRoot; //echo "
"; print_r($element); echo "
"; $extra_attribs = ExtraAttributes($element->attributes); if(strtolower($element->name)==$this->TagPrefix) { $field = strtolower($element->attributes["_field"]); switch($field) { case "id": $ret = $this->Get("LanguageId"); break; case "packname": $ret = $this->Get("PackName"); break; case "localname": $ret = $this->Get("LocalName"); break; case "link": $t = $element->attributes["_template"]; if(strlen($t)) { $var_list_update["t"] = $t; } else $var_list_update["t"] = $var_list["t"]; $m_var_list_update["lang"] = $this->Get("LanguageId"); $ret = GetIndexURL(2)."?env=".BuildEnv(); unset($var_list_update["t"],$m_var_list_update["lang"]); break; case "primary": $ret = ""; if($this->Get("PrimaryLang")==1) $ret = "1"; break; case "icon": $ret = ""; $icon = $this->Get("IconUrl"); if(strlen($icon)>0) { $file = $TemplateRoot."/".$icon; //echo "File:$file
\n"; if(file_exists($file)) $ret = $icon; } if(!strlen($ret)) $ret = $element->attributes["_default"]; //echo $ret; break; }//switch }//if return $ret; } function AdminIcon() { global $imagesURL; $file = $imagesURL."/itemicons/icon16_language"; if($this->Get("PrimaryLang")==1) { $file .= "_primary.gif"; } else { if($this->Get("Enabled")==0) { $file .= "_disabled"; } $file .= ".gif"; } return $file; } } class clsLanguageList extends clsItemCollection { var $m_Primary; function clsLanguageList() { $this->clsItemCollection(); $this->SourceTable = GetTablePrefix()."Language"; $this->classname = "clsLanguage"; $this->AdminSearchFields = array("PackName","LocalName"); } function SetPrimary($lang_id) { $sql = "UPDATE ".$this->SourceTable." SET PrimaryLang=0 "; $this->adodbConnection->Execute($sql); $l = $this->GetItem($lang_id); $l->Set("PrimaryLang","1"); $l->Update(); $this->m_Primary =$lang_id; } function GetPrimary($Field="LanguageId") { if(!$this->m_Primary) { $sql = "SELECT * FROM ".$this->SourceTable." WHERE PrimaryLang=1"; $rs = $this->adodbConnection->Execute($sql); if($rs && !$rs->EOF) { $l = $rs->fields[$Field]; } else $l = 0; $this->m_Primary=$l; } else $l = $this->m_Primary; return $l; } function LoadAllLanguages() { $sql = "SELECT * FROM ".$this->SourceTable; $this->Query_Item($sql); } function &AddLanguage($PackName,$LocalName,$Enabled,$Primary, $IconUrl="",$Datefmt,$TimeFmt,$Dec,$Thousand) { $l = new clsLanguage(); $l->tablename = $this->SourceTable; $l->Set(array("PackName","LocalName","Enabled","PrimaryLang","IconUrl","DateFormat","TimeFormat", "DecimalPoint","ThousandSep"), array($PackName,$LocalName,$Enabled,$Primary,$IconUrl,$Datefmt,$TimeFmt,$Dec,$Thousand)); $l->Dirty(); $l->Create(); return $l; } function EditLanguage($id,$PackName,$LocalName,$Enabled,$Primary, $IconUrl="",$Datefmt,$TimeFmt,$Dec,$Thousand,$Charset) { $l = $this->GetItem($id); $l->Set(array("PackName","LocalName","Enabled","PrimaryLang","IconUrl","DateFormat","TimeFormat", "DecimalPoint","ThousandSep",'Charset'), array($PackName,$LocalName,$Enabled,$Primary,$IconUrl,$Datefmt,$TimeFmt,$Dec,$Thousand,$Charset)); $l->Update(); return $l; } function DeleteLanguage($id) { $l = $this->GetItem($id); $l->Delete(); } function CopyFromEditTable() { global $objSession; $GLOBALS['_CopyFromEditTable']=1; $edit_table = $objSession->GetEditTable($this->SourceTable); $idlist = array(); $sql = "SELECT * FROM $edit_table"; $this->Clear(); $rs = $this->adodbConnection->Execute($sql); while($rs && !$rs->EOF) { $data = $rs->fields; $c = $this->AddItemFromArray($data); $c->Dirty(); if($data["LanguageId"]>0) { $c->Update(); } else { $oldid = $c->Get("LanguageId"); $c->UnsetIdField(); $c->Create(); $id = $c->Get("LanguageId"); $phrase_table = $objSession->GetEditTable("Phrase"); $message_table = $objSession->GetEditTable("EmailMessage"); $sql = "UPDATE $phrase_table SET LanguageId=$id WHERE LanguageId=$oldid"; $this->adodbConnection->Execute($sql); $sql = "UPDATE $message_table SET LanguageId=$id WHERE LanguageId=$oldid"; $this->adodbConnection->Execute($sql); } $rs->MoveNext(); } unset($GLOBALS['_CopyFromEditTable']); } function ExportPhrases($file,$LangIds=NULL,$PhraseTypes=null) { $output = array(); $this->Clear(); $where_parts = Array(); if( isset($LangIds) ) $where_parts[] = 'LanguageId IN ('.$LangIds.')'; $where = count($where_parts) ? ' WHERE '.implode(' AND ', $where_parts) : ''; $this->Query_Item($sql = 'SELECT * FROM '.$this->SourceTable.$where); $objXML = new xml_doc(); $RootNode =& $objXML->getTagByID($objXML->createTag("LANGUAGES")); $ret = 0; if($this->NumItems()>0) { $phrase_where = isset($PhraseTypes) ? ' AND PhraseType IN ('.$PhraseTypes.')' : ''; $event_where = isset($PhraseTypes) ? ' AND Type+1 IN ('.$PhraseTypes.')' : ''; foreach($this->Items as $l) { $LangRoot =& $objXML->getTagByID($RootNode->addChild($objXML,"LANGUAGE",array("PackName"=>$l->Get("PackName")),"")); $LangRoot->addChild($objXML,"DATEFORMAT",array(),$l->Get("DateFormat")); $LangRoot->addChild($objXML,"TIMEFORMAT",array(),$l->Get("TimeFormat")); $LangRoot->addChild($objXML,"DECIMAL",array(),$l->Get("DecimalPoint")); $LangRoot->addChild($objXML,"THOUSANDS",array(),$l->Get("ThousandSep")); $LangRoot->addChild($objXML,"CHARSET",array(),$l->Get("Charset")); $PhraseRoot =& $objXML->getTagByID($LangRoot->addChild($objXML,"PHRASES")); $sql = "SELECT * FROM ".GetTablePrefix()."Phrase WHERE LanguageId=".$l->Get("LanguageId").$phrase_where; $rs=$this->adodbConnection->Execute($sql); while($rs && ! $rs->EOF) { $PhraseRoot->addChild($objXML,"PHRASE",array("Label"=>$rs->fields["Phrase"],"Type"=>$rs->fields["PhraseType"]),base64_encode($rs->fields["Translation"])); $rs->MoveNext(); } $EventRoot =& $objXML->getTagByID($LangRoot->addChild($objXML,"EVENTS")); $ev = GetTablePrefix()."Events"; $em = GetTablePrefix()."EmailMessage"; $sql = "SELECT $em.*,$ev.Event,$ev.Type FROM $em INNER JOIN $ev ON ($em.EventId=$ev.EventId) WHERE LanguageId=".$l->Get("LanguageId").$event_where; $rs = $this->adodbConnection->Execute($sql); while($rs && !$rs->EOF) { $EventRoot->AddChild($objXML,"EVENT",array("MessageType"=>$rs->fields["MessageType"],"Event"=>$rs->fields["Event"],"Type"=>$rs->fields["Type"]),base64_encode($rs->fields["Template"])); $rs->MoveNext(); } } $objXML->generate(); $objXML->xml = str_replace("&","&",$objXML->xml); $fp = @fopen($file,"w"); @fputs($fp,$objXML->xml); @fclose($fp); } return file_exists($file); } function ReadImportTable($TableName,$SetEnabled=0,$Types="0,1",$OverwitePhrases=FALSE, $MaxInserts=100,$Offset=0) { global $objPhraseList; if(!is_object($objPhraseList)) $objPhraseList = new clsPhraseList(); $PhraseList = new clsPhraseList(); $TypeArray = explode(",",$Types); $Inserts = 0; $sql = "SELECT * FROM $TableName WHERE PhraseType IN ($Types) LIMIT $Offset,$MaxInserts"; //echo $sql; //$PhraseList->EnablePaging = false; $PhraseList->Query_Item($sql); if($PhraseList->NumItems()>0) { foreach($PhraseList->Items as $i) { $p = $objPhraseList->GetPhrase($i->Get("Phrase"),$i->Get("LanguageId")); //echo "
"; print_r($p); echo "
"; if(is_object($p)) { if($OverwitePhrases) { //$p->debuglevel=1; $p->Set("Translation",$i->Get("Translation")); //echo $i->Get("Translation")."
"; $p->Set("PhraseType",$i->Get("PhraseType")); $p->Dirty(); $p->Update(); } } else { //$i->debuglevel=1; $i->Create(); } $Inserts++; } } $Offset = $Offset + $Inserts; return $Offset; } function PurgeEditTable() { global $objSession; $edit_table = $objSession->GetEditTable($this->SourceTable); $this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); } } class clsLanguageCache { var $m_CachedLanguage; var $FullLoad = FALSE; var $cache; var $adodbConnection; var $TemplateName; var $TemplateCache; var $TemplateDate; var $ThemeId; function clsLanguageCache($LangId=NULL) { global $objConfig; $this->m_CachedLanguage = $LangId; $this->adodbConnection =&GetADODBConnection(); $this->Clear(); } function Clear() { unset($this->cache); $this->cache = array(); $this->TemplateCache = array(); } function LoadLanguage($LangId,$Type) { $this->Clear(); $this->m_CachedLanguage = $LangId; $this->FullLoad = TRUE; $sql = "SELECT Phrase,Translation FROM ".GetTablePrefix()."Phrase WHERE LanguageId=$LangId AND PhraseType=$Type"; $rs = $this->adodbConnection->Execute($sql); while($rs && !$rs->EOF) { $this->cache[$rs->fields["Phrase"]] = $rs->fields["Translation"]; if(ADODB_EXTENSION>0) { adodb_movenext($rs); } else $rs->MoveNext(); } return (count($this->cache)>0); } function GetPhrase($Phrase,$Lang) { $t = ""; $sql = "SELECT PhraseId,Phrase,Translation FROM ".GetTablePrefix()."Phrase WHERE Phrase='$Phrase' AND LanguageId='$Lang'"; $rs = $this->adodbConnection->Execute($sql); if($rs && !$rs->EOF) { $t = $rs->fields["Translation"]; $this->TemplateCache[] = $rs->fields["PhraseId"]; } return $t; } function LoadTemplateCache($t, $timeout, $ThemeId) { $this->TemplateName = $t; $this->TemplateDate = 0; $this->ThemeId = $ThemeId; if($timeout > 0) { $sql = "SELECT * FROM ".GetTablePrefix()."PhraseCache WHERE Template='$t' AND ThemeId=$ThemeId"; $rs = $this->adodbConnection->Execute($sql); if($rs && !$rs->EOF) { $this->TemplateCache = explode(',', $rs->fields['PhraseList']); $t_length = strlen($rs->fields['PhraseList']) ? 1 : 0; $this->TemplateDate = $rs->fields["CacheDate"]; if(date("U") < $this->TemplateDate + $timeout || !$t_length) { $this->TemplateCache = Array(); $this->TemplateDate=0; } } else $this->TemplateDate = -1; } else $this->TemplateDate=-2; } function LoadCachedVars($LangId) { if(count($this->TemplateCache)) { $values = implode(",",$this->TemplateCache); $this->FullLoad = FALSE; $this->m_CachedLanguage = $LangId; $sql = "SELECT Phrase,Translation FROM ".GetTablePrefix()."Phrase WHERE LanguageId=$LangId AND PhraseId IN ($values)"; $rs = $this->adodbConnection->Execute($sql); while($rs && !$rs->EOF) { $this->cache[$rs->fields["Phrase"]] = $rs->fields["Translation"]; if( defined('ADODB_EXTENSION') && constant('ADODB_EXTENSION') > 0 ) adodb_movenext($rs); else $rs->MoveNext(); } } } function SaveTemplateCache() { if($this->TemplateDate==0 || $this->TemplateDate==-1) { $value = implode(",",$this->TemplateCache); if($this->TemplateDate==0) { $sql = "UPDATE ".GetTablePrefix()."PhraseCache SET PhraseList='$value',CacheDate=".date("U"); $sql .=" WHERE Template='".$this->TemplateName."' AND ThemeId=".$this->ThemeId; } else { $sql = "INSERT IGNORE INTO ".GetTablePrefix()."PhraseCache (Template,PhraseList,CacheDate,ThemeId) VALUES ('"; $sql .= $this->TemplateName."','$value',".date("U").",".$this->ThemeId.")"; } $this->adodbConnection->Execute($sql); } } //This function returns a translation for a particular phrase //if translation is not found then !phrase! is returned. function GetTranslation($phrase,$language) { global $objSession, $LogPhraseLookups,$LangList, $MissingList; $missing = FALSE; if(!$this->FullLoad) { $this->RefreshCacheStatus($language); if(!isset($this->cache[$phrase])) { $this->cache[$phrase] = $this->GetPhrase($phrase,$language); $translation = $this->cache[$phrase]; //$translation = ""; } else $translation = $this->cache[$phrase]; } else { $translation = $this->cache[$phrase]; } if(!strlen($translation)) { $missing = TRUE; if($language != 1) { $translation=$this->GetTranslation($phrase,1); } else { $translation = "!".$phrase."!"; } } if($LogPhraseLookups==TRUE) { //if(!is_array($LangList)) // $LangList = array(); //$LangList[$phrase] = $LangList; if($missing) { if(!is_array($MissingList)) { $MissingList = array(); } if(!in_array($phrase,$MissingList)) $MissingList[] = $phrase; } } return $translation; } //This function checks if cache is current for current language //if not clear it out function RefreshCacheStatus($language) { //First remember what language we are caching // if(!isset($this->m_CachedLanguage)) // $this->m_CachedLanguage = $language; //If this is the different language, then clear the cache // if($this->m_CachedLanguage != $language) // { // $this->Clear(); // $this->m_CachedLanguage = $language; // } } } ?>