76 Nachrichten unter 21 Themen von 33 Mitgliedern
[SilverStripe Roadmap][Changelog]

Silverstripe ändert Spracheinstellung

Seite: 1 1254 mal gelesen
  • pepperoni
    pepperoni Community Member
    3 Beiträge

    Silverstripe ändert Spracheinstellung

    Hallo liebe Community,

    Standardmäßig ist Silverstripe ja in Englisch, jedoch möchte ich nun, dass Silverstripe automatisch die Sprache anzeigt, die der Browser spricht. Die Hierarchie ist klar, die Benutzereinstellungen haben Vorrang, jedoch sollten nicht eingeloggte Benutzer zunächst die Sprache auf der Startseite bekommen, die Ihrem Browser entspricht. Ich dachte mir, ich müsste einfach eine Browserabfrage machen und dann in ./mysite/_config.php nur die Einstellung Translatable::set_default_locale('de_DE'); ändern. Leider hat es keinen Effekt. Ich habe herausgefunden, dass in dem Ordner sapphire\core\control die Datei ModelAsController.php in Zeile 69 die Einstellung von ehemals de_DE auf den Standardwert en_US setzt.

    // set language
    if($child->Locale) Translatable::set_current_locale($child->Locale);

    Was genau bedeutet die Variable, die hier gesetzt wird in der Abfrage steht. (edit) Mir ist aufgefallen, dass hier auch die Sprache gesetzt wird, die vom Benutzer ausgewählt wurde. Wie genau kann ich nun das Problem lösen, so dass die Sprache der Startseite der Browsersprache entspricht?

    Liebe Grüße
    pepperoni
  • riot222
    Community Member
    1 Beitrag

    Re: Silverstripe ändert Spracheinstellung

    Hi

    Leider kann ich dir auch nicht sagen was es damit genau auf sich hat. Ich habe das wie untenstehnd beschrieben gelöst. Allerdings kann ich nicht sagen ob das der korrekte Weg ist, eventuell gibt es da noch andere Ansätze. Bei mir hat es jedenfalls letztendlich auf diese Art funktioniert.

    1. Datei erstellen und unter /mysite/http_sprache.php ablegen, um die Browsersprache zu ermitteln (der Code kann so kopiert werden):

    <?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})?))?$/i', $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 (strtolower (join ('-', $lang_code)), $allowed_languages)) {
    // Qualität anschauen
    if ($lang_quality > $current_q) {
    // diese Sprache verwenden
    $current_lang = strtolower (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;
    }
    ?>

    (oben stehenden Code, habe ich nicht selber geschrieben. Wenn ich mich recht erinnere habe ich das php.net kopiert)

    2. Einen Seitentyp "HomePage.php" erstellen oder falls schon vorhandenen folgende Funktion im Controller einfügen und wie gewünscht anpassen:

    class HomePage_Controller extends Page_Controller {
       
    public function language() {

    include_once ($_SERVER['DOCUMENT_ROOT'].'/mysite/http_sprache.php');
          
    if ($_SERVER['REQUEST_URI'] != '/?locale=de_CH' && $_SERVER['REQUEST_URI'] != '/welcome-page/?locale=en_US') {

    $allowed_langs = array ('de','en');

    $lang = lang_getfrombrowser ($allowed_langs, 'de', null, false);
             
    if ($lang == "de") {
    Director::redirect("/?locale=de_CH");
    } elseif ($lang == "en") {
    Director::redirect("/welcome-page/?locale=en_US");
    } else {
    Director::redirect("/?locale=de_CH");
    }
    }
    }

    public function init() {
    parent::init();
    $this->language();
    }
       
    }
    ?>

    3. Den Pfade für beim Include anpassen damit die unter Punkt 1 erstellte Datei korrekt inkludiert wird.

    4. Die Pfade und erlaubten Sprachen den eigenen Bedürfnissen anpassen.

    5. Bei der Startseite unter Verhalten den Seitentyp "Home Page" aktivieren.


    Ich hoffe das hilft dir weiter...

    gruss riot222

Zur Zeit online: Zur Zeit ist leider niemand online.

Wir begrüßen unsere neuen Mitglieder: saerdna