Zum Inhalt springen

Mehrsprachigkeit programmieren?! Variable?

Erstellt am 27. April 2006 · 20 Antworten · letzte Antwort am 15. März 2008 · Seite 1 von 2

Tags: Frage

Unbekannter Benutzer ·

Sollte ich nach der Funktion "makelist" eine funktion "sprache" erstellen und dort die while abfrage reinbauen...?! alles als out ausgaben und danach die liste bauen?!

steffenk ·

nimm den Schnipsel von mir wieder raus und mach die Unterscheidung der Sprache in der Funktion makeListItem.

Unbekannter Benutzer ·

Hey danke für die Hilfe - aber irgendwie klemmt es immer noch... (ich denke meine PHP-Erfahrung ist zu gering)

<? /**
	 *AUSGABE
	 */
	function makeListItem()	{
		
		while($out = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
        // get the translated record if the content language is not the default language
        if ($GLOBALS['TSFE']->sys_language_content) {
                $OLmode = ($this->sys_language_mode == 'strict'?'hideNonTranslated':'');
                $out = $GLOBALS['TSFE']->sys_page->getRecordOverlay('tx_cdcstaff', $out, $GLOBALS['TSFE']->sys_language_content, $OLmode);
        }
        }
		
		$out='<p>.$this->getFieldContent('name').</p>'&nbsp;'<p>.$this->getFieldContent('vorname').</p>';
		return $out;
	}?>

Danke

steffenk ·

m.E. müsste das so aussehen:

<? 
/**
*AUSGABE
*/
function makeListItem() {

	// get the translated record if the content language is not the default language
	if ($GLOBALS['TSFE']->sys_language_content) {
		$OLmode = ($this->sys_language_mode == 'strict'?'hideNonTranslated':'');
		$this->internal['currentRow'] = $GLOBALS['TSFE']->sys_page->getRecordOverlay('tx_cdcstaff', $this->internal['currentRow'], $GLOBALS['TSFE']->sys_language_content, $OLmode);
	}
	
	$out='<p>'.$this->getFieldContent('name').' '.$this->getFieldContent('vorname').'</p>';
return $out;
}
?>

ohne gewähr

Unbekannter Benutzer ·

Jetzt habe ich verstanden! Allerdings geht es (immer) noch nicht... Ich denke mir fehlt die verknüpfung....

Ich überlege mal und werden dann nochmals posten!!
Gruß und Vielen Dank - ich melde mich...
:-)

MELDE MICH NOCHMAL!!! HIER DIE MELDUNG....

<?
function makeListItem() {
 
        // get the translated record if the content language is not the default language
        if ($GLOBALS['TSFE']->sys_language_content) {
                $OLmode = ($this->sys_language_uid == 'strict'?'hideNonTranslated':'');
                $this->internal['currentRow'] = $GLOBALS['TSFE']->sys_page->getRecordOverlay('tx_cdcstaff_cdc_staff', $this->internal['currentRow'], $GLOBALS['TSFE']->sys_language_content, $OLmode);
        }
        
        $out= $this->getFieldContent('vorname');
				return $out;
} ?>

Erzeugt keinen Fehler, gibt allerdings auch alle Datensätze aus - obwohl "L=0" ist....

Sind denn alle Variablen bzw. Datenbankfelder abgefragt...

sys_language_content als echo ergibt bei DE 0,0,0,0
sys_language_uid ergibt als echo bei DE "1,0,1,0" dies stimmt auch überein mit den Datenfelder der Datenbank.

Die Datenbankfelder müssten doch nun nur noch mir der aktullen "L" Variable verglichen werden... dies scheint aber nicht zu gehen....

RATLOS?!

Unbekannter Benutzer ·
<? $out= $this->getFieldContent('sys_language_uid'); ?>

ergibt bei 4 Datensätzen in 2 Sprachen 0,1,1,0

Dies stimmt, da der erste und letzte Deutsch, die anderen Spanisch sind!

steffenk ·

Die Ausgabe wird hier nicht beschränkt, sondern es wird aus der Overlay-Tabelle die richtige Sprache ausgelesen.

Wenn Du die Sprache eingrenzen willst, also nur die aktuelle Sprache ausgeben willst, so muss das in der Where-Klausel der SQL-Abfrage geschehen.

Unbekannter Benutzer ·

Ja, okay... verstanden und ich denke auch am sinnigsten... Allerdings stellt sich für mich die Frage "Wo wird die Datenbankabfrage gemacht...?", alle Datenbankfelder werden ja "zur Verfügung gestellt". Gibt es hier eine Klasse in Typo, welche included wird? Oder erfolgt der Zugriff weil bereits ein Connect besteht?

Danke und Gruß

FalkWalter · · Beste Antwort

Hallo, Andy,

binde die Berechnung Deines Outputs mal in die if-Schleife der Sprachwahl ein:

                                                                                                                       <?
/**
*AUSGABE
*/
function makeListItem() {

  // get the translated record if the content language is not the default language
  if ($GLOBALS['TSFE']->sys_language_content) {
    $OLmode = ($this->sys_language_mode == 'strict'?'hideNonTranslated':'');
    $this->internal['currentRow'] = $GLOBALS['TSFE']->sys_page->getRecordOverlay('tx_cdcstaff', $this->internal['currentRow'], $GLOBALS['TSFE']->sys_language_content, $OLmode);

    $out='<p>'.$this->getFieldContent('name').' '.$this->getFieldContent('vorname').'</p>';
  }

  return $out;
}
?>

Ich habe selbst die Sprachwahl innerhalb der makelist()-Funktion, a la:

function makelist($res)  {
  $items=Array();
    // Make list table rows
  while($this->internal['currentRow'] = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {

    // Gets the translated record if the content language is not the default language
    if ($GLOBALS['TSFE']->sys_language_content == $this->internal['currentRow']['sys_language_uid']) {
     $OLmode = ($this->sys_language_mode == 'strict'?'hideNonTranslated':'');
     $this->internal['currentRow'] = $GLOBALS['TSFE']->sys_page->getRecordOverlay('user_methodologiesinnovations_items', $this->internal['currentRow'], $GLOBALS['TSFE']->sys_language_content, $OLmode);

      // if item is a methodology, first calls the methodology list item, then calls all associated innovation list items
      if ($this->internal['currentRow']['methodology'] == '' || $this->internal['currentRow']['methodology'] == 0) {
        $isMethodology = true;
        $items[]=$this->makeListItem();
    }
  $out = '<div'.$this->pi_classParam('listrow').'>'.implode(chr(10),$items).'</div>';
  return $out;
}

Grüßle
Falk

FalkWalter ·

Hallo, Andy,

was ich noch vergessen hatte zu erwähnen...

in der if-Abfrage für die Sprachwahl des ZWEITEN php-Abschnitts findest Du:

(GLOBALS['TSFE']->sys_language_content == $this->internal['currentRow']['sys_language_uid'])

füge das mal in Deinen Code ein...

Deine Datensätze "übersetzt" hast aber schon, denke ich?

Grüßle
Falk

Unbekannter Benutzer ·

Ahha,, ich denke ich bin ein wenig weiter... Allerdings wird jetzt nur ein Record in der richtigen Sprache ausgegeben.

<?
function makelist($res)	{
		$items=Array();
					// Liste erstellen
		while($this->internal['currentRow'] = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))	{
			
			// Gets the translated record if the content language is not the default language
    if ($GLOBALS['TSFE']->sys_language_content == $this->internal['currentRow']['sys_language_uid']) {
     $OLmode = ($this->sys_language_mode == 'strict'?'hideNonTranslated':'');
     $this->internal['currentRow'] = $GLOBALS['TSFE']->sys_page->getRecordOverlay('tx_cdcstaff_cdc_staff', $this->internal['currentRow'], $GLOBALS['TSFE']->sys_language_content, $OLmode);
	
			$items[]=$this->makeListItem();
	}
			// Ausgabe
				
		$out = '<div'.$this->pi_classParam('listrow').'>
			'.implode(chr(10),$items).'
			</div>'; 
		return $out;
	}
}
?>
FalkWalter ·

Hallo, Andy,

wahrscheinlich ist der Aufruf der makeListItem()-Funktion nicht mehr in der while-Schleife enthalten?

Grüßle
Falk

neue Version:

function makelist($res) {
                $items=Array();
                                        // Liste erstellen
                while($this->internal['currentRow'] = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))      {
                       
                        // Gets the translated record if the content language is not the default language
    if ($GLOBALS['TSFE']->sys_language_content == $this->internal['currentRow']['sys_language_uid']) {
     $OLmode = ($this->sys_language_mode == 'strict'?'hideNonTranslated':'');
     $this->internal['currentRow'] = $GLOBALS['TSFE']->sys_page->getRecordOverlay('tx_cdcstaff_cdc_staff', $this->internal['currentRow'], $GLOBALS['TSFE']->sys_language_content, $OLmode);
       
                        $items[]=$this->makeListItem();
        }
     } //und hier die Klammer wieder rein
                        // Ausgabe
                               
                $out = '<div'.$this->pi_classParam('listrow').'>
                        '.implode(chr(10),$items).'
                        </div>';
                return $out;
        // } hier die Klammer raus
}
?>
Unbekannter Benutzer ·

Hi,
doch ist noch enthalten - die Formatierung bzw. Augabe ist per CSS nur in der makeListItem Funktion. Momentan wird nur der erste Datensatz angezeigt. :-o

FalkWalter ·

Hallo, Andy,

schön, dass es nun auch klappt. Kannst Du den Thread noch als gelöst markieren?

Danke und bis denne,
Falk

timinafrica ·

Ich hab auch noch nen Hinweis zu diesem Thema, der anderen vielleicht hilfreich sein könnte:

Ich hatte den Code korrekt eingebaut und getRecordOverlay() hat trotzdem keine Datensätze durch die passenden der anderen Sprache ersetzt. Es wurden einfach die originaldatensätze durchgeschleift.

Ich habe die ganze getRecordOverlay() auseinandergenommen bis ich auf folgendes Problem kam: Meine $row, die ich in die Funktion hineingab, kam aus folgendem Select:

$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,title', 'tx_mytable', 'sys_language_uid IN (-1,0)', '', 'title');

Man beachte den ersten Paramter: 'uid,title'

Die Funktion getRecordOverlay() prüft aber auch ab, ob der Datensatz in der selben pid liegt wie der Originaldatensatz. Da in meinem Resultset $row['pid'] nicht vorkam (weil ich nur die Felder uid und title im SELECT hatte), wurde kein entsprechender übersetzter Datensatz gefunden.

Herzliche grüße,

Tim

http://www-typo3-webdesign.biz