Zum Inhalt springen

Ext: Language Detection

Erstellt am 7. Oktober 2003 · 10 Antworten · letzte Antwort am 5. Dezember 2007

Tags: Frage

sw-student ·

Hallo zusammen,

schon jemand Erfahrung mit der Extension Language Detection gemacht? Habe Probleme bei der Installation. Es tritt irgendein Konflikt mit der TS Language, German Extension auf:

Double installs? A 'Global' extension with this key is also available on the server, but cannot be loaded because the 'Local' version takes precendence.

Hat jemand vielleicht schon nach Anleitung von maxhp versucht, die Spracheinstellung vom Browser auslesen zu lassen? So richtig funktioniert das nicht bei mir.
(#2175)

Bin über jeden Hinweis dankbar!

Gruß Sw-Student

wasiko ·

also ich hab das mit folgender php-funktion gelöst.
je nach rückgabewert rufe ich dann die index.php mit entsprechendem parameter auf. (zB index.php?id=400&L=1)

<?php
// Browsersprache ermitteln
function lang_getfrombrowser ($allowed_languages, $default_language, $lang_variable = null, $strict_mode = true) {
        // $_SERVER['HTTP_ACCEPT_LANGUAGE'] verwenden, wenn keine Sprachvariable mitgegeben wurde
        if ($lang_variable === null) {
                $lang_variable = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
        }

        // wurde irgendwelche Information mitgeschickt?
        if (empty($lang_variable)) {
                // Nein? => Standardsprache zurückgeben
                return $default_language;
        }

        // Den Header auftrennen
        $accepted_languages = preg_split('/,s*/', $lang_variable);

        // Die Standardwerte einstellen
        $current_lang = $default_language;
        $current_q = 0;

        // Nun alle mitgegebenen Sprachen abarbeiten
        foreach ($accepted_languages as $accepted_language) {
                // Alle Infos über diese Sprache rausholen
                $res = preg_match ('/^([a-z]{1,8}(?:-[a-z]{1,8})*)'.
                                   '(?:;s*q=(0(?:.[0-9]{1,3})?|1(?:.0{1,3})))?$/', $accepted_language, $matches);

                // war die Syntax gültig?
                if (!$res) {
                        // Nein? Dann ignorieren
                        continue;
                }
                
                // Sprachcode holen und dann sofort in die Einzelteile trennen
                $lang_code = explode ('-', $matches[1]);

                // Wurde eine Qualität mitgegeben?
                if (isset($matches[2])) {
                        // die Qualität benutzen
                        $lang_quality = (float)$matches[2];
                } else {
                        // Kompabilitätsmodus: Qualität 1 annehmen
                        $lang_quality = 1.0;
                }

                // Bis der Sprachcode leer ist...
                while (count ($lang_code)) {
                        // mal sehen, ob der Sprachcode angeboten wird
                        if (in_array (join ('-', $lang_code), $allowed_languages)) {
                                // Qualität anschauen
                                if ($lang_quality > $current_q) {
                                        // diese Sprache verwenden
                                        $current_lang = join ('-', $lang_code);
                                        $current_q = $lang_quality;
                                        // Hier die innere while-Schleife verlassen
                                        break;
                                }
                        }
                        // Wenn wir im strengen Modus sind, die Sprache nicht versuchen zu minimalisieren
                        if ($strict_mode) {
                                // innere While-Schleife aufbrechen
                                break;
                        }
                        // den rechtesten Teil des Sprachcodes abschneiden
                        array_pop ($lang_code);
                }
        }

        // die gefundene Sprache zurückgeben
        return $current_lang;
}
?>
wasiko ·

ich führe das skript in einer "nicht-typo3-startseite" aus, die dann die erste seite des typo3-webs per redirect mit dem entsprechenden L-parameter aufruft.

<?
include_once ('httpsprache.php');
$allowed_langs = array ('de', 'hu', 'cs', 'sk','en');
$lang = lang_getfrombrowser ($allowed_langs, 'en', null, false);
//var_dump ($lang);
//echo $lang;
$id=400;
switch($lang)
{
        case "de":
                $L="L=0";
                break;
        case "en":
                $L="L=2";
                break;
        case "hu":
                $L="L=5";
                break;
        case "cs":
                $L="L=3";
                break;
        case "sk":
                $L="L=1";
                break;
        default:
                $L="L=0";
                break;
}
header("Location: http://www.meintypo3.com/cms/index.php?id=".$id."&".$L);
?>
sw-student ·

Hi,
klingt alles verständlich. Leider bin ich der totaler Php-Newbie und hab ein Problem den Code richtig einzubinden. Hab deinen oberen Code in der httpsprache.php abgespeichert, richtig?

Was muss ich mit dem unteren Code machen?
Habs mal mit einer start.php/start.html versucht: Code in ein HTML eingebettet --> URL abgeändert
Leider Fehlanzeige 😢

Steckt der redirect überhaupt schon im Code drin?

wasiko ·

Hallo,

- obigen code 1:1 in datei httpsprache.php kopieren
- den unteren code 1:1 in eine datei mit endung PHP!

beide dateien müssen im selben ordner sein. da die funktionen der httpsprache.php in die andere datei included werden.

folgendes musst du anpassen:

zeile 7: "$id=400" auf die id deiner Startseite setzen
vorletzte zeile (das ist der redirect): hier den link zu deiner domain mit der index.php von typo3

in den case-abschnitten musst du ev. noch die L-Werte auf die id's deiner Sprachen anpassen. L=2 muss zb, abhängig von deiner installation, bei dir nicht englisch entsprechen.

sw-student ·

Sorry, aber irgendwie stell ich mich gerade ziemlich Blöde an. Hab die beiden Dateien nach deinen Instruktionen erstellt. Wenn ich nun die start.php öffne, wird im IE der Code der Datei ausgegeben. Was mache ich falsch?? 😢

sw-student ·

Super! Danke! Funktioniert!

Schäme mich fast ne Erklärung abzugeben :o

Den Code hatte ich richtig abgeändert, jedoch die start.php lokal ausgeführt ... ohne Php Interpreter läuft da wohl nich viel.

Vielen Dank nochmals!

JMS ·

Hallo wasiko,

ich beisse mir ebenfalls die Zähne an der "language detection" aus. Wäre es Dir möglich, die Scripts mir als PN zu schicken. Ich weiß... klingt unverschämt... aber ich weiß jetzt nicht mehr weiter... hab' schon überall gesucht.
Und die Anleitungen zur Ext. verstehe ich jetzt, nachdem ich alles versucht habe, überhaupt nicht mehr...

Vorab vielen Dank.

JMS

paopao1 ·

Hallo,

hab mich auch mal daran versucht ... leider ohne Erfolg!

Frage 1: Existiert bereits eine httpsprache.php irgendwo? Ihr spricht ja von "reinkopieren", dann müsste ja bereits eine existieren ... aber wo?

Frage 2: Habe den unteren Part abgeändert und Start.php genannt:

<?
include_once ('httpsprache.php');
$allowed_langs = array ('de', 'fr', 'es', 'ita','en');
$lang = lang_getfrombrowser ($allowed_langs, 'en', null, false);
//var_dump ($lang);
//echo $lang;
$id=96;
switch($lang)
{
        case "de":
                $L="L=0";
                break;
        case "en":
                $L="L=1";
                break;
        case "fr":
                $L="L=2";
                break;
        case "es":
                $L="L=4";
                break;
        case "ita":
                $L="L=3";
                break;
        default:
                $L="L=0";
                break;
}
header("Location: <a href="http://www.meineSite.com/index.php?id=".$id."&".$L);"" target="_blank" class="link_10">http://www.meineSite.com/index.php?id=".$id."&".$L);</a>
?>

nur leider will er nicht!
Wenn ich mir diese Seite aufrufe: meineSite/Start.php dann zeigt er mir einen Fehler in Zeile 29 an. Ist das nicht richtig?

Könnt ihr mir da weiterhelfen?

Cheers
paopao