BrowserSprache + URL schaltet um - Sprache schaltet nicht um

Bei Problemen/Anregungen mehrsprachiger Webseiten.

BrowserSprache + URL schaltet um - Sprache schaltet nicht um

Beitragvon mina30de » 8. Jan 2011, 00:50

Hallo,

bei einer mehrsprachigen Seite, soll anhand der Browser Sprache, die entsprechende Sprache zugeordnet werden.

Code: Alles auswählen
session_start();

if (substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2) == "de")    {
       $this->setCLang(2);   
       $REX['CUR_CLANG'] = 2;
    }
    elseif (substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2) == "en")  {
       $this->setCLang(1);   
       $REX['CUR_CLANG'] = 1;
       }
    else {
        $this->setCLang(0);   // alles andere spanisch
        $REX['CUR_CLANG'] = 0;
    }


Soweit so gut.
Will man nun innerhalb des Frontends eine andere Sprache wählen, ändert sich zwar der URL-Rewrite Pfad, aber nicht die Frontendausgabe, also der Artikel in ein er anderen Sprache.

Hat jemand eine Idee, woran das liegen könnte?

Vielen Dank, Gruß Mina
mina30de
 
Beiträge: 152
Registriert: 19. Mär 2007, 10:43

Re: BrowserSprache + URL schaltet um - Sprache schaltet nich

Beitragvon jeandeluxe » 8. Jan 2011, 01:34

mina30de hat geschrieben:.. ändert sich zwar der URL-Rewrite Pfad, aber nicht die Frontendausgabe, also der Artikel in ein er anderen Sprache.

Du überschreibst mit deinem Code oben die clang die sich aus der URL ergeben würde ..

lg,
j.
mark your solved threads [SOLVED]™ promotion tour.. | Redaxo API Docu | rexdev.de | "You start with some money.."
IT'S A MARATHON. NOT A SPRINT. UNLESS IT IS A SPRINT, THEN SPRINT!
Benutzeravatar
jeandeluxe
 
Beiträge: 1941
Registriert: 29. Sep 2005, 09:50
Wohnort: Hamburg

Re: BrowserSprache + URL schaltet um - Sprache schaltet nich

Beitragvon mina30de » 8. Jan 2011, 01:48

jeandeluxe hat geschrieben:
mina30de hat geschrieben:.. ändert sich zwar der URL-Rewrite Pfad, aber nicht die Frontendausgabe, also der Artikel in ein er anderen Sprache.

Du überschreibst mit deinem Code oben die clang die sich aus der URL ergeben würde ..

lg,
j.


Danke für die schnelle Antwort. Verstehe ich leider nicht. :?
Klar wenn ich Browsersprache deutsch hab, und klick eine andere Sprache an, bleibt meine Browsersprache ja trotzdem deutsch. Eigentlich Logisch.
Und was muss ich nun ändern?

Hatte vorher mal diesen Code probiert,
aber da ging nur die Erste=deutsch. Egal was die Browsersprache ist.

Code: Alles auswählen
session_start();

  $sprache = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
    if ( eregi('de', $sprache) )
    {
    $this->setCLang(2);   
   $REX['CUR_CLANG'] = 2;
    }
    elseif (eregi('en', $sprache))
     {
     $this->setCLang(1);   
   $REX['CUR_CLANG'] = 1;
     }
    else {
    $this->setCLang(0);   
   $REX['CUR_CLANG'] = 0;
    }


Naja den Code hatte ich hier aus dem Forum, hatte da auch schon nicht richtig fkt.
Kennt vielleicht jemand die Lösung des Problems?
mina30de
 
Beiträge: 152
Registriert: 19. Mär 2007, 10:43

Re: BrowserSprache + URL schaltet um - Sprache schaltet nich

Beitragvon jeandeluxe » 8. Jan 2011, 04:03

mina30de hat geschrieben:Klar wenn ich Browsersprache deutsch hab, und klick eine andere Sprache an, bleibt meine Browsersprache ja trotzdem deutsch. Eigentlich Logisch.
Und was muss ich nun ändern?


Die Frage ist: was willst du erreichen? Du mußt dir überlegen wann dein Browsersprachen-Automatismus greifen soll, und wann nicht..

Außerdem: würd ich eher redirects machen, anstatt intern die clang zu verbiegen.

lg,
j.
mark your solved threads [SOLVED]™ promotion tour.. | Redaxo API Docu | rexdev.de | "You start with some money.."
IT'S A MARATHON. NOT A SPRINT. UNLESS IT IS A SPRINT, THEN SPRINT!
Benutzeravatar
jeandeluxe
 
Beiträge: 1941
Registriert: 29. Sep 2005, 09:50
Wohnort: Hamburg

Re: BrowserSprache + URL schaltet um - Sprache schaltet nich

Beitragvon zehbaeh-reloaded » 8. Jan 2011, 20:19

Dein Ansatz ist zu "Einfach" das er der Anforderung gerecht werden könnte. Dazu muss leider mehr Aufwand getrieben werden. Ich hab Dir mal eine leicht angepasste Version aus meiner "Redaxo-Ablage" zum Austesten auf der Kommdozeile gepostet:
Code: Alles auswählen
<?php
// BEGIN Zum "Spielen" in der Shell

function rex_redirect()
{
    $args = func_get_args();
    echo 'Redir', substr(print_r($args, TRUE), 5);
}

$GLOBALS['REX']['CUR_CLANG'] = 0;
$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'de-AT, en-US;q=0.9, es;q=1.0, *;q=0.5';

$supported = array(
    'es' => array('*' => 0),
    'en' => array('*' => 1),
    'de' => array('*' => 2, 'at' => 3)
);
languageRedirect(1, $supported, 2);

// END Zum "Spielen" in der Shell


/**
* Die durch den Benutzer akzeptierten Sprachen als assoc. Array zurückgeben.
*
* @return array  array of (quality ':' language '-' country => array(language, country, quality))
*/
function getHttpAcceptLanguages()
{
    $result = array();
    $index  = 'HTTP_ACCEPT_LANGUAGE';
    if (isset($_SERVER[$index])) {
        $pattern = '~((?:[a-z]{2}|\*))(?:-([a-z]{2})|)(?:;q=((?:1(?:\.0|)|0\.[0-9]+))|)~i';
        foreach (explode(',', $_SERVER[$index]) as $accept) {
            if (preg_match($pattern, $accept, $match)) {
                $language       = $match[1];
                $country        = empty($match[2]) ? '*' : $match[2];
                $quality        = empty($match[3]) ? 1.0 : floatval($match[3]);
                $index          = $quality . ':' . $language . '-' . $country;
                $result[$index] = array($language, $country, $quality);
            }
        }
        krsort($result, SORT_NUMERIC);
    }
    return $result;
}

/**
* Aus den angegebenen unterstützen Sprachen eine zur
* Anforderung durch den Benutzer passende finden.
*
* @param array $supported  Unterstüzte Sprachen = array of (language => array of (country | '*' => clang))
* @return int|NULL  int ID der Sprache, NULL wenn keine passende Sprache gefunden wurde
*/
function getHttpAcceptClang(array $supported)
{
    foreach (getHttpAcceptLanguages() as $languageCountry) {
        list($language, $country) = $languageCountry;
        foreach ($supported as $supportLanguage => $countriesClangs) {
            if (0 === strcasecmp($language, $supportLanguage)) {
                foreach ($countriesClangs as $supportCountry => $clang) {
                    if (0 === strcasecmp($country, $supportCountry)) {
                        return $clang;
                    }
                }
                if (isset($countriesClangs['*'])) {
                    return $countriesClangs['*'];
                }
            }
        }
    }
    return NULL;
}

/**
* Weiterleitung auf eine zur Anforderung durch den Benutzer passende Sprachversion des angegebenen Artikels.
*
* @param int $articleId  ID des Artikels zu dem weitergeleitet werden soll
* @param array $supported  Unterstüzte Sprachen = array of (language => array of (country | '*' => clang))
* @param int $chooserArticleId  ID eines Artikels mit Sprachwähler - wenn keine eindeutig passende Sprache gefunden wurde
* @param string $articleIdParam  Bezeichner für den Sprachwähler-Parameter in dem die ID des Artikels gesetzt wird
* @return bool   FALSE wenn keine Weiterleitung erfolgte. Andernfalls kehrt die Funktion nicht zurück
*/
function languageRedirect($articleId, array $supported, $chooserArticleId = NULL, $articleIdParam = 'target')
{
    if (headers_sent()) {
        trigger_error(__FUNCTION__ . ': headers already sent', E_USER_WARNING);
        return FALSE;
    }
    $currClang  = $GLOBALS['REX']['CUR_CLANG'];
    $redirClang = getHttpAcceptClang($supported);
    if (NULL === $redirClang) {
        $redirClang = current(array_shift($supported));
        if (!empty($chooserArticleId) && $chooserArticleId != $articleId) {
            return rex_redirect($chooserArticleId, $currClang, array($articleIdParam => $articleId));
        }
    }
    if ($currClang != $redirClang) {
        return rex_redirect($articleId, $redirClang);
    }
    return FALSE;
}


PS: Wenn der Ursprüngliche/Aktuelle Artikel zur Anzeige irgendwelche Parameter benötigte gehen diese in der gepsoteten Version von "languageRedirect" verloren.

EDIT: getHttpAcceptLanguages durch übersichtlichere Version mit regulärem Ausdruck ersetzt.
zehbaeh-reloaded
 
Beiträge: 23
Registriert: 8. Jan 2011, 20:12


Zurück zu Mehrsprachigkeit [R4]

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast