Zum Inhalt springen

realurl und die sprachumschaltung

Erstellt am 12. Juli 2004 · 42 Antworten · letzte Antwort am 16. November 2005 · Seite 1 von 3

Tags: RealURL, Frage

doku ·

kurze, aber wichtige frage:

hat hier irgendjemand (schon) die sprachumschaltung über das language.php-skript (bei den meisten wird es ja mit den flaggen verwendet) in verbindung mit der realurl-extension hinbekommen?

ich meine hier ganz konkret die möglichkeit innerhalb einzelner seiten umzuschalten. daß mit dem skript auf die startseite in der alternativen sprache umgelenkt wird, ist kein problem.

doku ·

ja, du hast recht, meine bemerkung in einem anderen thread läßt darauf schließen, aber da hatte ich bei dem dortigen beispiel nicht genau genug hingeguckt... :o

AFisch ·

Also, das hat mir jetzt keine Ruhe gelassen :-)

Also, erstmal

#config.linkVars = L

Die L Var im Setup auskomentieren, das dieses Konstrukt weg ist.

Dann mit einer kleinen Anpassung im Lang Menu die Url umschreiben:

$flags[] = '<a href="'.htmlspecialchars('index.php?id='.$GLOBALS['TSFE']->id.'&L=2&ch_lang=1').'"  onfoc.......

//Wurde Flag angeklickt
if($_GET['ch_lang']=="1") {
	
	$domain=$_SERVER['HTTP_HOST'];
	$url_2go=$_SERVER['REQUEST_URI'];
	
	$url_2go=str_replace('&ch_lang=1','',$url_2go);
	$url_2go = preg_replace("/?id=(d+)&L=(d+)/","",$url_2go);
	
	//Und ab in die Wüste mit der hässlichen Url
	header('location: http://'.$domain.$url_2go);
}

Kann durchaus sein, das hier und da ein Fehler passiert. Ist nicht getestet und stellt nur eine Idee dar.

Gruß Holger

AFisch ·

Und noch ein kleiner Nachtrag.

Obige Lösung greift leider nicht wegen dem Seiten Cache.

Folgendes schafft Abhilfe:

$flags[] = '<a href="'.htmlspecialchars('index.php?id='.$GLOBALS['TSFE']->id.'&L=0&ch_lang=1&no_cache=1')....

[.....]
$url_2go = preg_replace("/?id=(d+)&L=(d+)&no_cache=1/","",$url_2go);
[.....]

Nachteil ist halt, das die Seite dann in dem Momant nicht aus dem Cache kommt. Aber wer schön sein will muss leiden :-)

Gruß AFisch

doku ·

hi, leider leider gips eine fehlermeldung

Warning: Cannot modify header information - headers already sent by (output started at /typo3_src-3.6.1/typo3/sysext/cms/tslib/index_ts.php:433) in /html/fileadmin/scripts/language-realurl.php on line 82

die sich genau auf die wichtigste zeile bezieht

//Und ab in die Wüste mit der hässlichen Url 
   header('location: http://'.$domain.$url_2go);

o.O

der komplette beispielcode sieht übrigens jetzt so aus. vielleicht hab ich es ja auch völlig falsch "eingebaut"...?

<?php

$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'pages_language_overlay', 'pid='.intval($GLOBALS['TSFE']->id).$GLOBALS['TSFE']->sys_page->enableFields('pages_language_overlay'), 'sys_language_uid');

$langArr = array();
while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))        {
        $langArr[$row['sys_language_uid']] = $row['title'];
}

$pointer = '<img src="t3lib/gfx/content_client.gif" width="7" height="10" align="middle" alt="" />';

$flags[] = ($GLOBALS['TSFE']->sys_language_uid==0?$pointer:'').'<a href="'.htmlspecialchars('index.php?id='.$GLOBALS['TSFE']->id.'&L=0&ch_lang=1&no_cache=1').'" target="_top"><img src="media/uploads/flag_uk.gif" width="21" height="13" hspace="5" border="0" alt="" /></a>';

$flags[] = ($GLOBALS['TSFE']->sys_language_uid==1?$pointer:'').'<a href="'.htmlspecialchars('index.php?id='.$GLOBALS['TSFE']->id.'&L=1&ch_lang=1&no_cache=1').'" target="_top"><img src="media/uploads/flag_de'.($langArr[1]?'':'_d').'.gif" width="21" height="13" hspace="5" border="0" alt="" /></a>';

if($_GET['ch_lang']=="1") {

   $domain=$_SERVER['HTTP_HOST'];
   $url_2go=$_SERVER['REQUEST_URI'];

   $url_2go = str_replace('&ch_lang=1','',$url_2go);
   $url_2go = preg_replace("/?id=(d+)&L=(d+)&no_cache=1/","",$url_2go);

   //Und ab in die Wüste mit der hässlichen Url
   header('location: http://'.$domain.$url_2go);
}

$content = '<table border="0" cellpadding="0" cellspacing="0"><tr><td><img src="clear.gif" width="30" height="1" alt="" /></td><td>'.implode('',$flags).'</td></tr></table>';

?>
AFisch ·

Warning: Cannot modify header information - headers already....

Nein, Eingebunden hast du es sicherlich nicht falsch. Wie gesagt, das mit dem Header senden ist ein böser Hack. Wahrscheinlich hast du irgend ein Extension in deiner Installation drin, die vor dem header in langMenu.php schon etwas an den Browser sendet. Dann kommt nähmlich die Fehlermeldung s.o. Kann unter Umständen auch an den Einstellungen von PHP liegen.

Tja, also bei meinem Projekt funktioniert das so. Aber für eine bessere und sicherere Lösung muss man da wohl RealUrl an der entscheidenden Stelle patchen. Nur da ist kein Quick Hack drin, das muss man richtig machen.

Werd mich in einer ruhigen Minute mal hinsetzen und das entwursteln.

Gruß AFisch

doku ·

wenn du dir tatsächlich die mühe machen solltest (und realurl wird bestimmt auf kurz oder lang zu den gebräuchlichsten extensions gehören) möchte ich gerne eine information an dich weiterleiten. ich hatte die frage nämlich auch schon in der typo3.org-mailingliste gepostet und da hat ingmar schlecht (der auch an der t3-entwicklung mitarbeitet) folgendes geantwortet:

Ingmar Schlecht schrieb

Kleiner Tipp:
Du musst die Datei language-menu.php so ändern, dass die Funktion typolink aus der Datei class.tslib_content.php zum Erstellen des Links verwendet wird.

Siehe auch:
http://typo3.org/documentation/mailing-lists/user-list-archive/thread/62/?tx_maillisttofaq_pi1%5Bmode%5D=5

und

http://typo3.org/documentation/mailing-lists/user-list-archive/thread/66/?tx_maillisttofaq_pi1%5Bmode%5D=5

das wäre sicherlich die sauberste lösung, ich kann aber nunmal leider kein stück php...

AFisch ·

Danke für den Hinweis.

Werd das ganze mal den Debuger laufen lassen. Ich muss nur die Stelle finden, an der die Url im Seiten-Cache landet.

Wenn ich das gefunden habe muss ich mal sehen, wie man das am besten da rein strickt. Soll ja unter allen Umständen funktionieren.

Gruß AFisch

AFisch ·

So, der nächste Hack :-)

An deine Url im Lang Menu wie gehabt diesen Parameter "&ch_lang=1" anhängen:

<a href="'.htmlspecialchars('index.php?id='.$GLOBALS['TSFE']->id.'&L=0&ch_lang=1').'"  onfo.......

und in Zeile 616 in "typo3conf/ext/realurl/class.ux_tslib_fe.php" folgendes einfügen was in //HH-Hack einkommentiert ist:

[....]
$result = array();
      
      //HH-Hack
      if(preg_match("/ch_lang=1/",$uri))
      $uri = preg_replace("/?id=(d+)&L=(d+)&ch_lang=1/","",$uri);
      //HH-Hack ende
      
$parsed = parse_url($uri); // Let PHP do the first run
[....]

Danach Cache und die real_url Tabelle leeren und Testen.

Feedback erwünscht.

Gruß AFisch

doku ·

das klappert hervorragend!

eine klitzkleine änderung wäre da noch wünschenswert:
die url hört ja nun mit einem slash auf.
besteht eine möglichkeit, abschließend noch ein "index.html" dranzuhängen? dann würde nämlich die jeweilige seite in meiner statistikauswertung nicht als eigenständige version ein und derselben seite gezählt.

die endversion sollten wir dann auch in deinem namen entweder in den "howto-bereich" auf typo3.org stellen.
-> http://typo3.org/documentation/mailing-lists/user-list-archive/?tx_maillisttofaq_pi1%5Bmode%5D=5

...oder besser noch gleich an den realurl-urheber schicken?

AFisch ·

besteht eine möglichkeit, abschließend noch ein "index.html" dranzuhängen?

Das ist etwas schwieriger. Das Ding wird weggeparst und dann beim automatischen Umwandeln der Url für einen Link wieder dazugepackt.

Das würde dann doch etwas tiefer in realurl eingreifen. Und ich denke das die Besucher deiner Seite nicht so oft auf den Language Button rumhämmern werden.

Werd mir das morgen nochmal ansehen, vieleicht gehts ja doch einfacher als es im Moment aussieht.

Wenn du willst kannst du das ja dem Autor von Real Url mailen. Namen brauchst du nicht dazu tun. So ein kleines Script ist doch keine Leistung :-)

Gruß AFisch

doku ·

ok, hier also die zusammenfassung für alle anderen zum mitschreiben... 😉

zwei (beispiel)versionen einer angepaßten example_languageMenu.php. sie dienen zum "seitengenauen" umschalten bei einer one-tree-fits-all umsetzung von mehreren sprachversionen einer website bei verwendung der extension realurl:

da wäre zum einen die klassische version mit den flaggen, die ja standardmäßig von typo3 mitgeliefert wird. hier mit english als id=0 und deutsch als id=1

<?php
/***************************************************************
*  Copyright notice
*
*  (c) 1999-2004 Kasper Skaarhoj (kasper@typo3.com)
*  All rights reserved
*
*  This script is part of the TYPO3 project. The TYPO3 project is
*  free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  The GNU General Public License can be found at
*  http://www.gnu.org/copyleft/gpl.html.
*  A copy is found in the textfile GPL.txt and important notices to the license
*  from the author is found in LICENSE.txt distributed with these scripts.
*
*
*  This script is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/

$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'pages_language_overlay', 'pid='.intval($GLOBALS['TSFE']->id).$GLOBALS['TSFE']->sys_page->enableFields('pages_language_overlay'), 'sys_language_uid');

$langArr = array();
while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))        {
        $langArr[$row['sys_language_uid']] = $row['title'];
}

$pointer = '<img src="t3lib/gfx/content_client.gif" width="7" height="10" align="middle" alt="" />';

$flags[] = ($GLOBALS['TSFE']->sys_language_uid==0?$pointer:'').'<a href="'.htmlspecialchars('index.php?id='.$GLOBALS['TSFE']->id.'&L=0&ch_lang=1').'" target="_top"><img src="media/uploads/flag_uk.gif" width="21" height="13" hspace="5" border="0" alt="" /></a>';

$flags[] = ($GLOBALS['TSFE']->sys_language_uid==1?$pointer:'').'<a href="'.htmlspecialchars('index.php?id='.$GLOBALS['TSFE']->id.'&L=1&ch_lang=1').'" target="_top"><img src="media/uploads/flag_de'.($langArr[1]?'':'_d').'.gif" width="21" height="13" hspace="5" border="0" alt="" /></a>';

$content = '<table border="0" cellpadding="0" cellspacing="0"><tr><td><img src="clear.gif" width="30" height="1" alt="" /></td><td>'.implode('',$flags).'</td></tr></table>';

?>

zum anderen eine version, die textlinks liefert ("deutsch", bzw. "english"). es wird dabei immer nur ein link angezeigt (logischerweise nur der, der zur jeweils anderen sprache führt... 😉).

<?php
/***************************************************************
*  Copyright notice
*
*  (c) 1999-2003 Kasper Skårhøj (kasper@typo3.com)
*  All rights reserved
*
*  This script is part of the Typo3 project. The Typo3 project is
*  free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  The GNU General Public License can be found at
*  http://www.gnu.org/copyleft/gpl.html.
*  A copy is found in the textfile GPL.txt and important notices to the license
*  from the author is found in LICENSE.txt distributed with these scripts.
*
*
*  This script is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/

$query = "SELECT * FROM pages_language_overlay WHERE pid=".$GLOBALS["TSFE"]->id.$GLOBALS["TSFE"]->sys_page->enableFields("pages_language_overlay")." GROUP BY sys_language_uid";

$res = mysql(TYPO3_db,$query);
$langArr=array();
while($row=mysql_fetch_assoc($res))        {
        $langArr[$row["sys_language_uid"]]=$row["title"];
}

$english = '[<a href="'.htmlspecialchars('index.php?id='.$GLOBALS['TSFE']->id.'&L=0&ch_lang=1').'">english</a>]';
$deutsch = '[<a href="'.htmlspecialchars('index.php?id='.$GLOBALS['TSFE']->id.'&L=1&ch_lang=1').'">deutsch</a>]';

$flags = array();
$flags[] = ($GLOBALS["TSFE"]->sys_language_uid==0?$deutsch:"");
$flags[] = ($GLOBALS["TSFE"]->sys_language_uid==1?$english:"");

$content = '<div style="position: absolute; text-align: right; right:0px; width:200px; height:15px; background-color:#ffffff;" class="language">'.implode("",$flags).'</div>';

?>

ich hatte hier übrigens einfach keinen bock $flags umzubenennen. es gibt natürlich keine flaggen...

alles funktioniert aber nur dann so schön, wenn man folgende änderung in typo3conf/ext/realurl/class.ux_tslib_fe.php (ungefähr zeile 616) macht

[....] 
$result = array(); 
      
      //HH-Hack 
      if(preg_match("/ch_lang=1/",$uri)) 
      $uri = preg_replace("/?id=(d+)&L=(d+)&ch_lang=1/","",$uri); 
      //HH-Hack ende 
      
$parsed = parse_url($uri); // Let PHP do the first run 
[....]

nochmals großen dank an AFisch! 🙂

jenses ·

Funktioniert auch bei mir hervorragend mit 3 Sprachen.
Vielen Dank !

Ein kleines Problem gibt es jedoch :

Die EXT: Language Detection, die vorher automatisch die
entsprechende Startseite aufrief, je nachdem welche Sprache im Browser eingestellt war,
machts nicht mehr !

Habt ihr irgendwelche Tips dazu ?

mit freundlichen Grüßen
jenses

AFisch ·

Hy Jenses

Versuch mal in deinem TS-Template folgendes.

config.linkVars = L

und schau ob es dann wieder geht. Wenn nicht, muss ich mal in die Ext reinschauen.

Gruß AFisch

jenses ·

Hy AFisch,
das war ja 'ne schnelle Antwort !

Das config.linkVars = L habe ich natürlich im Template,
sonst würde ja auch die ganze Sprachumschaltung nicht laufen.

Das Problem muß woanders liegen,
vermutlich in der EXT: Language Detection.

viele Grüße
jenses

AFisch ·

Nein, brauchen tut man die bei RealUrl nicht. Bei mir gehts auch ohne. Und aus dem Grund; versuch es mal ohne.

Ansonsten wird da wohl was bei der zusammenarbeit der beiden Ext durch den kleinen Patch falsch laufen.

Die EXT: Language Detection macht nähmlich am Ende der main() Funktion folgendes:

header('Location: '.$locationURL.'&L='.$L);

Und dann kommt unser RealUrl Patch daher und schmeisst das doch gleich wieder raus.

$uri = preg_replace("/?id=(d+)&L=(d+)&ch_lang=1/","",$uri);

Wird man nicht viel machen können so auf die schnelle.

Gruß AFisch

Edit: Hast du schon mal die RealURL Tabelle geleert?

jenses ·

Hai Afisch !

Danke für deine Mühe !

Also,
die config.linkVars = L habe ich auskommentiert,
real_url-Tabelle geleert, alle Chaches geleert,
Ergebnis:
EXT: Language Detection läuft nicht,
es wird immer Standardsprache Schwedisch aufgerufen.
Da kann man wohl nichts machen.

Gibt´s irgendeine andere Möglichkeit,
dem Zuschauer seine Sprachseite zu servieren ?

viele Grüße
jenses

AFisch ·

Rein theoretisch könnte man die Aufgabe der Spracherkennung einem externen index.php übertragen, das dann jeweils die von Typo3 richtig anspricht.

Das kann aber nicht die Lösung sein. Ich werd mich mal ran machen, wenn ich Zeit dazu finde. Im Moment siehts da aber mau aus. Kunden sind wie Wölfe. Die kommen immer im Rudel hab ich bald das Gefühl. *Nicht das ich mich beklagen würde* :-)

Gruß AFisch