*/
// ensure this file is being included by a parent file
defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.' );
// backwards compatability hack!
global $mambelfishWarnedAdmin;
$mambelfishWarnedAdmin=false;
class MambelFish{
function warnAdmin(){
global $mosConfig_mailfrom, $mosConfig_fromname, $adminEmail,$mambelfishWarnedAdmin;
$privateWarning=false;
if (!$mambelfishWarnedAdmin) {
$bt = debug_backtrace();
if (count($bt)>=2){
$subject = "Deprecated use of Mambelfish Translation";
$content = "Deprecated use of Mambelfish. Request URL : ".$_SERVER['REQUEST_URI']."\n\n";
$content .= "Please contact the author of this component/module/mambot with the details in this message.\n\n";
$content .= "In the meantime the following function reference can be commented out and translation should not be affected.\n";
$content .= "File : ".basename(dirname($bt[1]["file"]))."\\".basename($bt[1]["file"])."\n";
$content .= "Line : ".$bt[1]["line"]."\n";
$content .= "Function : ".$bt[1]["function"]."\n\n";
if ( $privateWarning) {
global $database, $my, $mosConfig_absolute_path ;
require_once( $mosConfig_absolute_path .'/components/com_messages/messages.class.php' );
$query = "SELECT id"
. "\n FROM #__users"
. "\n WHERE sendEmail = 1"
;
$database->setQuery( $query );
$users = $database->loadResultArray(false);
foreach ($users as $user_id) {
$msg = new mosMessage( $database );
// send message from admin
$msg->send( $user_id, $user_id, $subject, $content);
}
}
else {
$content = str_replace("\n","
",$content);
echo "$content";
}
}
//mosMail( $mosConfig_mailfrom, $mosConfig_fromname, $mosConfig_mailfrom, $subject, $content );
}
$mambelfishWarnedAdmin=true;
}
function translate( $content, $reference_table, $language, $tableArray=array()) { MambelFish::warnAdmin(); return $content;}
function translateList( $rows, $reference_table, $language , $tableArray) { MambelFish::warnAdmin(); return $rows;}
}
/**
* The joom fish change the text information in the supported
* objects after they have been loaded. The idea is to create a
* flexible environment which can add the multi language support at
* any time.
*
* The basic concept behind the joom fish is to map an existing content
* with all his general information to a different translation of it's
* text content. There is no additional copy of the information like the
* author or publishing flags, only a copy of the text fields.
*
* @author A. Kempkens
*/
class JoomFish {
/* New experimental version*/
function translateList( &$rows, $reference_table, $language , $tableArray) {
if (!isset($rows) || !is_array($rows)) return $rows;
global $_JOOMFISH_MANAGER, $mosConfig_defaultLang, $database;
$querySQL = $database->_sql;
// do not try to translate if I have no fields!!!
if (!isset($tableArray) || count($tableArray)==0) {
//echo "$tableArray $querySQL
";
return;
}
// If I write content in non-default language then this skips the translation!
//if($language == $mosConfig_defaultLang) return $rows;
// toggle variable to allow testing - remove at later date!
$useTranslateListWithIDs = true;
$rowsLanguage = $language;
if (count($rows)>0){
foreach ($tableArray["fieldTablePairs"] as $i=>$value){
$reftable = $tableArray["fieldTablePairs"][$i];
// If there is not translated content for this table then skip it!
if (!$database->translatedContentAvailable($reftable)) continue;
// get primary key for tablename
$idkey = $_JOOMFISH_MANAGER->getPrimaryKey( trim($reftable) );
// I actually need to check the primary key against the alias list!
for ($i=0;$i<$tableArray["fieldCount"];$i++){
if (!array_key_exists($i,$tableArray["fieldTableAliasData"])) continue;
// look for fields from the correct table with the correct name
if ($tableArray["fieldTableAliasData"][$i]["tableName"]==$reftable &&
$tableArray["fieldTableAliasData"][$i]["fieldName"]==$idkey){
$idkey=$tableArray["fieldTableAliasData"][$i]["fieldNameAlias"];
break;
}
}
$idstring = "";
foreach( array_keys( $rows) as $key ) {
$content =& $rows[$key];
// NASTY KLUDGE TO DEAL WITH SQL CONSTRUCTION IN contact.php, weblinks.php where multiple tables to be translated all use "id" which gets dropped! etc.
if ($reftable=='categories' && isset($content->catid) && $content->catid>0 && (!isset($content->section) || $content->section!='')) {
$newidkey = "catid";
$idkey = $newidkey;
}
if (isset($content->$idkey)) {
//print ($idkey ." ".$content->$idkey." list
");
$idstring .= (strlen( $idstring)>0?",":""). $content->$idkey;
}
}
/* no translate if you have no id!*/
/* Some queries do not include the primarykey/index - consider reissuing these queries*/
// This is too dangerous for production at present
/*
if (strlen( $idstring)==0) {
global $database;
// Useful DEBUG message to spot untranslated material and its cause!
//echo "no primarykey/index in query string change original query? : $querySQL
";
// RADICAL ATTEMPT TO REWORK SQL ON THE FLY
// FOR THIS TO WORK I NEED TO TRACK THE ALIAS AND REUSE IT IN IDENTIFYING THE EXTRA FIELD!
$tempArray = preg_split("/SELECT\s+/i",$querySQL);
if (count($tempArray)!=2) return;
global $mosConfig_dbprefix;
$alias = $tableArray["tableAliases"][$reftable];
if (!isset($alias)) return;
$querySQL = "SELECT $alias.$idkey, ".$tempArray[1];
//echo "reworked query : $querySQL
";
$database->setQuery($querySQL);
// SOME COMPONENTS USE loadRESULT AND DO NOT CHECK FIELDS
// SINCE THEY WROTE THE SQL THEMSELVES!!
// IMUST NOT THEREOFRE write this directly into $content
// MAKE SURE THIS IS NOT TRANSLATED TO AVOID ALL RISKS OF RECURSION!
$rows2 = $database->loadObjectList("",false);
foreach( array_keys( $rows2) as $key ) {
$content =& $rows2[$key];
$idstring .= (strlen( $idstring)>0?",":""). $content->$idkey;
}
if (strlen( $idstring)==0) {
// In this case I give up - no translation!
return;
}
}
*/
if (strlen( $idstring)==0) return;
if ($useTranslateListWithIDs)
JoomFish::translateListWithIDs( $rows, $idstring, $reftable, $language ,$idkey, $tableArray);
else
JoomFish:: translateListOLD( $rows, $reftable, $language );
}
}
}
/** Cover function which tries to find out the id from the object
*
*/
function translate( &$content, $reference_table, $language, $tableArray=array())
{
//print "translate $reference_table
";
// if the currect language is the site default language not translations needed
global $mosConfig_lang, $mosConfig_defaultLang, $_JOOMFISH_MANAGER, $database;
$querySQL = $database->_sql;
// If I write content in non-default language then this skips the translation!
//if($language == $mosConfig_defaultLang) return;
if (isset($tableArray) && array_key_exists("fieldTablePairs",$tableArray)) foreach ($tableArray["fieldTablePairs"] as $i=>$value){
$reftable = $tableArray["fieldTablePairs"][$i];
$idkey = $_JOOMFISH_MANAGER->getPrimaryKey( trim($reftable) );
// I actually need to check the primary key against the alias list!
for ($i=0;$i<$tableArray["fieldCount"];$i++){
if (!array_key_exists($i,$tableArray["fieldTableAliasData"])) continue;
// look for fields from the correct table with the correct name
if ($tableArray["fieldTableAliasData"][$i]["tableName"]==$reftable &&
$tableArray["fieldTableAliasData"][$i]["fieldName"]==$idkey){
$idkey=$tableArray["fieldTableAliasData"][$i]["fieldNameAlias"];
break;
}
}
if (isset($content->$idkey)) {
//print ($idkey ." ".$content->$idkey." nonlist
");
$id = $content->$idkey;
JoomFish::translateWithID( $content, $id, $reftable, $language, $idkey, $tableArray);
}
else {
global $database;
// Useful DEBUG message to spot untranslated material and its cause!
// VERY IMPORTANT SKIP ANY SQL THAT IS A SELECT UPDATE etc.!
//echo "no primarykey/index in query string change original query? : $querySQL
";
// RADICAL ATTEMPT TO REWORK SQL ON THE FLY
// FOR THIS TO WORK I NEED TO TRACK THE ALIAS AND REUSE IT IN IDENTIFYING THE EXTRA FIELD!
$tempArray = preg_split("/SELECT\s+/i",$querySQL);
if (count($tempArray)!=2) return;
global $mosConfig_dbprefix;
$alias = $tableArray["tableAliases"][$reftable];
if (!isset($alias)) return;
$querySQL = "SELECT $alias.$idkey, ".$tempArray[1];
//echo "reworked query : $querySQL
";
$database->setQuery($querySQL);
// SOME COMPONENTS USE loadRESULT AND DO NOT CHECK FIELDS
// SINCE THEY WROTE THE SQL THEMSELVES!!
// IMUST NOT THEREOFRE write this directly into $content
// MAKE SURE THIS IS NOT TRANSLATED TO AVOID ALL RISKS OF RECURSION!
$database->loadObject($content2,false);
//echo var_export($content2,true);
if (isset($content2->$idkey)) {
$id = $content2->$idkey;
//$content = $content2;
//echo var_export($content,true);
JoomFish::translateWithID( $content, $id, $reftable, $language, $idkey, $tableArray);
}
}
}
else {
if (isset($content->id))
JoomFish::translateWithID( $content, $content->id, $reference_table, $language, $idkey,$tableArray);
}
}
/**
* Function to translate a section object
*
* @static
* @param object $content by reference
* @param int $id
* @param string $reference_table
* @param string $language
* @param string $refTablePrimaryKey
* @param array $tableArray
* @return void
*/
function translateWithID( &$content, $id, $reference_table, $language, $refTablePrimaryKey="id", $tableArray)
{
/**
* This function now uses the list code which can handle a single item list!
*/
$rows = array();
$rows[0]=$content;
JoomFish::translateListWithIDs( $rows, $id, $reference_table, $language, $refTablePrimaryKey, $tableArray);
$content=$rows[0];
return;
}
/**
* Function to translate a section object
*/
function translateListWithIDs( &$rows, $ids, $reference_table, $language, $refTablePrimaryKey="id", $tableArray)
{
//print " translateListWithIDs for ids=$ids refTablePrimaryKey=$refTablePrimaryKey
" ;
global $database, $mosConfig_debug, $mosConfig_defaultLang, $_JOOMFISH_MANAGER;
if ($reference_table == "languages" || $reference_table == "jf_content" ) {
return; // I can't translate myself ;-)
}
//print " translateListWithIDs( ".count($rows). ", ids=$ids, reftab=$reference_table, $language, primkey = $refTablePrimaryKey )
";
if ($mosConfig_debug) {
echo "JoomFish debug (new):
"
. "reference_table=$reference_table
"
. "$refTablePrimaryKey IN($ids)
"
. "language=$language
"
.(count($rows)>0? "class=" .get_class(current($rows)):"")
. "
";
}
if (isset($ids) && $reference_table!='') {
$sql = "SELECT jf_content.reference_field, jf_content.value, jf_content.reference_id, jf_content.original_value "
. "\nFROM #__jf_content AS jf_content,"
. "\n #__languages as languages"
. "\nWHERE jf_content.language_id=languages.id"
. "\n AND jf_content.published=1"
. "\n AND jf_content.reference_id IN($ids)"
. "\n AND jf_content.reference_table='$reference_table'"
. "\n AND languages.code='$language'";
$database->setQuery( $sql );
$translations = $database->loadObjectList('',false);
if (count($translations)>0){
$fieldmap = null;
foreach( array_keys( $rows) as $key ) {
$row_to_translate =& $rows[$key];
$rowTranslationExists=false;
//print_r ($row_to_translate); print"
";
if( isset( $row_to_translate->$refTablePrimaryKey ) ) {
foreach ($translations as $row){
if ($row->reference_id!=$row_to_translate->$refTablePrimaryKey) continue;
$refField = $row->reference_field;
// adjust refField for aliases (make sure the field is from the same table!).
// I could reduce the calculation by building an array of translation reference fields against their mapping number
// but this refinement can wait!
for ($i=0;$i<$tableArray["fieldCount"];$i++){
if (!array_key_exists($i,$tableArray["fieldTableAliasData"])) continue;
// look for fields from the correct table with the correct name
if ($tableArray["fieldTableAliasData"][$i]["tableName"]==$reference_table &&
$tableArray["fieldTableAliasData"][$i]["fieldName"]==$refField){
$refField=$tableArray["fieldTableAliasData"][$i]["fieldNameAlias"];
$adjustedRefField=$refField;
break;
}
}
$fieldIndex = $i;
if (isset( $row->reference_id) && $row->reference_id==$row_to_translate->$refTablePrimaryKey && $fieldIndex<$tableArray["fieldCount"]){
if (is_subclass_of($row_to_translate, 'mosDBTable')) {
$row_to_translate->set($row->reference_field, $row->value);
} else {
$row_to_translate->$refField = $row->value;
}
$rowTranslationExists=true;
//print_r( $row_to_translate);
}
}
if (!$rowTranslationExists){
JoomFish::processMissingTranslation($row_to_translate, $language,$reference_table);
}
}
}
}
else {
foreach( array_keys( $rows) as $key ) {
JoomFish::processMissingTranslation($rows[$key], $language,$reference_table);
}
}
}
}
/**
* Works out what to show if the translation is missing
*
* @param object $row_to_translate
* @param string $language
* @param string $reference_table
*/
function processMissingTranslation(&$row_to_translate, $language,$reference_table){
global $database, $mosConfig_debug, $mosConfig_defaultLang, $mosConfig_lang, $_JOOMFISH_MANAGER, $mosConfig_absolute_path;
$noTranslationBehaviour = $_JOOMFISH_MANAGER->getCfg( 'noTranslation' );
if( $noTranslationBehaviour >= 1 && $language != $mosConfig_defaultLang ) {
$contentElement = $_JOOMFISH_MANAGER->getContentElement( $reference_table );
if( isset($contentElement) && $contentElement->getReferenceType() == $_JOOMFISH_MANAGER->DEFAULT_CONTENTTYPE ) {
$defaultText = $_JOOMFISH_MANAGER->getCfg('defaultText');
if ($defaultText=="") {
// load language file to get default text
if (file_exists( $mosConfig_absolute_path. '/components/com_joomfish/language/'.$mosConfig_lang.'.php')) {
include_once ( $mosConfig_absolute_path. '/components/com_joomfish/language/'.$mosConfig_lang.'.php');
} else {
include_once ( $mosConfig_absolute_path. '/components/com_joomfish/language/english.php');
}
if (defined("_JOOMFISH_NO_TRANSLATION_AVAILABLE")) $defaultText = _JOOMFISH_NO_TRANSLATION_AVAILABLE;
}
$contentObject = new ContentObject( $_JOOMFISH_MANAGER->getLanguageID($language), $contentElement );
$textFields = $contentObject->getTextFields();
if( $textFields !== null ) {
$defaultSet = false;
foreach ($textFields as $field) {
if( !$defaultSet ) {
if ($noTranslationBehaviour==1) {
$row_to_translate->$field = $defaultText;
} else if ($noTranslationBehaviour==2) {
if ($contentObject->getFieldType($field)=="htmltext"){
$cr="
";
} else {
$cr="\n";
}
$row_to_translate->$field = $defaultText .$cr.(isset($row_to_translate->$field)?$row_to_translate->$field:"");
}
$defaultSet = true;
} else {
$row_to_translate->$field = "";
}
}
}
}
}
}
/**
* Version information of the component
*
* @author Alex Kempkens
*/
function version() {
return JoomFishManager :: getVersion();
}
}
?>