Steffi: Sprachsteuerung

Hallo,

wenn ich die Seite www.example.com aufrufe, soll je nach Browser-Einstellung (in Frankreich bzw. Deutschland) die Seite www.example.com/fr/ bzw. www.example.com/de/ aufgerufen werden.

Wie mache ich dies am einfachsten?

Gruß

Steffi

  1. Moin Steffi,

    soll auf die Unterseite an Hand der Sprache oder des Landes weitergeleitet werden?

    Viele Grüße
    Robert

  2. Hallo Steffi,

    ich nehme an, du sprichst aus der Sicht des Seitenbetreibers von www.example.com.

    Ausgangsbasis ist der accept-language Header, den der Browser mitschickt. Der wird vom Browser basierend auf Anwendereinstellungen generiert, nicht basierend auf dem Land, in dem der Browser läuft. Aber ich nehme an, das weißt Du.

    Bei statischen Seiten in Apache kann man das über Einstellungen im Webserver lösen. Mit PHP zusammen ist es nicht ganz so einfach.

    Es gibt DUMME Beispiele, die mit RewriteCond arbeiten, worin sie dann testen, ob "de" oder "en" im accept-language Header des Webrequests vorkommt. Das missachtet aber die q-Gewichte im Header, und wenn Dir jemand "accept-language: en;q=1.0,de;q=0.9" schickt, Du aber zuerst auf de testest, lieferst Du die Seite gegen den Willen des Besuchers auf deutsch

    Ich nehme an, dass Du im Root-Ordner des Projekts eine index.php hast. Surft jemand "https://www.example.com" an, sollte die als Defaultpage eingetragen sein. Darin kannst Du den accept-language Header interpretieren. Dafür gibt es gute und schlechte Lösungen.

    • Schlecht: Suche darin nach "de"
    • Besser: Verwende locale_accept_from_http(). Nachteil: die Funktion verwendet alle auf dem Computer installierten Locales, nicht das, was Dein Projekt unterstützt.
    • Vermutlich gut: Auf der locale_accept_from_http Seite verweist ein Kommentator auf die Negotiation-Klasse von William Durand. Der kannst Du dann deine unterstützten Sprachen mitgeben und er pickt aus accept-language die heraus, die dem Anwender am besten gefällt.

    Wenn Du allerdings die Seiten https://www.example.com/de/foo.php und https://www.example.com/fr/foo.php im Angebot hast, und jemand ruft https://www.example.com/foo.php ab, dann musst Du entweder eine schlaue Error-Page vorsehen oder für jede sprachspezifische PHP Datei eine Weiche vorsehen.

    Eine Alternative ist, gar keine sprachabhängigen URLs zu haben. Statt dessen erstellst Du eine Rewrite-Rule, die jeden Abrufpfad auf deiner Seite (außer denen, die auf statische Ressourcen führen), auf ein /index.php umleitet. Nach außen hin bietest Du URLs an wie https://www.example.com oder https://www.example.com/foo oder https://www.example.com/bar?q=hugo. Und die Rewrite-Rule leitet das nach index.php, index.php?page=foo oder index.php?page=bar&q=hugo. In index.php wertest Du den Sprachheader aus und delegierst den Abruf dann zur richtigen Seite. Aber nicht zu jeder beliebigen, das ist ein Security-Loch, du musst eine Whitelist von erlaubten page-Werten vorsehen.

    Soweit die Helikoptersicht, wenn Du weitere Infos brauchst, frag gerne nach.

    So würde ich es jedenfalls machen, ich bin aber nicht unbedingt der PHP-Gott 😉

    Rolf

    --
    sumpsi - posui - obstruxi
  3. @@Steffi

    wenn ich die Seite www.example.com aufrufe, soll je nach Browser-Einstellung (in Frankreich bzw. Deutschland) die Seite www.example.com/fr/ bzw. www.example.com/de/ aufgerufen werden.

    Dass du hier etwas völlig anderes beschreibst als im Betreff „Sprachsteuerung“ genannt, darauf haben @Rolf B und @Robert B. ja schon hingewiesen.

    Und du meinst „Sprachauswahl“, nicht „-steuerung“. Sprachsteuerung wäre, ein System mit natürlicher Sprache zu steuern. (Auch das funktioniert bei Webseiten out of the box, wenn man das nicht mit schlechtem HTML oder JavaScript zunichtemacht.)

    Wie mache ich dies am einfachsten?

    Auch diese Frage ist nicht gut gestellt. Geht es dir um „am einfachsten“ oder um „am besten“?

    Am einfachsten dürfte language negotiation sein, in deinem Fall wohl mit type maps.

    Das allein ist aber nicht am besten, siehe das unter Navigation angesprochene Problem. Sobald ein Nutzer das Sprachauswahlmenü benutzt (was vorhanden sein muss), sollte man dessen Auswahl in einem Cookie speichern, der Vorrang vor der Angabe im HTTP-Header hat.

    Lassen die beiden verlinkten Artikel noch Fragen offen?

    Kwakoni Yiquan

    --
    Ad astra per aspera
    1. Hallo,

      habe leider nicht alles verstanden. Und ich habe mich offensichtlich unklar ausgedrückt.

      Wenn jemand www.example.com aufruft, so soll bei mir mit meinen (offensichtlich auf Deutsch eingestellten Browsern) die Seite www.example.com/de aungezeigt werden, auch wenn ich in Japan sein sollte.

      Umgekehrt soll für französische Leser mit ihren auf "französisch" eingestellten Browsern die Seite www.example.com/fr angezeigt werden.

      1. Hallo

        Ich habe mal die Absätze in deinem Posting sichtbar gemacht. Mit zwei Zeilenumbrüchen von einem zum nächsten Absatz kannst du das auch. 😀

        habe leider nicht alles verstanden. Und ich habe mich offensichtlich unklar ausgedrückt.

        Im Betreff deines Postings bist hast du das schon (auch ich bin beim erstmaligen Lesen des Betreffs von der Steuerung der Seite mit natürlicher Sprache ausgegangen), im Text deines Beitrags wurde aber schon klar, dass du auf die Auswahl der Sprache hinauswillst. Ganz so, wie du es hier nachfolgend beschreibst.

        Wenn jemand www.example.com aufruft, so soll bei mir mit meinen (offensichtlich auf Deutsch eingestellten Browsern) die Seite www.example.com/de aungezeigt werden, auch wenn ich in Japan sein sollte.

        Umgekehrt soll für französische Leser mit ihren auf "französisch" eingestellten Browsern die Seite www.example.com/fr angezeigt werden.

        Das ist genau das, was Rolf und Gunnar meinten. Jetzt ist meine Frage, wo du kenntnismäßig stehst. Eine fachlich gute Lösung hat eine gewisse Komplexität, die einen Vorkenntnisstand voraussetzt.

        1. Auswertung der vom Browser gesendeten Header
        2. Berücksichtigung einer eventuell vom Benutzer getätigten Auswahl
          1. überstimmen der vom Browser gesendeten Header
          2. speichern der Auswahl des Benutzers im Browser und Übermittlung dieser Info bei nachfolgenden Seitenaufrufen
        3. Auslieferung der zu den ermittelten Werten passenden Seite

        Tschö, Auge

        --
        „Habe ich mir das nur eingebildet, oder kann der kleine Hund wirklich sprechen?“ fragte Schnapper. „Er behauptet, nicht dazu imstande zu sein“ erwiderte Victor. Schnapper zögerte (…) „Nun …“ sagte er schließlich, „ich schätze, er muss es am besten wissen.“ Terry Prattchett, Voll im Bilde
        1. Hi,

          1. Auswertung der vom Browser gesendeten Header
          2. Berücksichtigung einer eventuell vom Benutzer getätigten Auswahl
            1. überstimmen der vom Browser gesendeten Header
            2. speichern der Auswahl des Benutzers im Browser und Übermittlung dieser Info bei nachfolgenden Seitenaufrufen

          Nicht vergessen: Eine Default-Sprache bestimmen, wenn man keine der vom Besucher gewünschten Sprachen liefern kann

          Einen schönen Tag noch
           Martin

          --
          Wichtige Erkenntnis für Comiczeichner:
          Eine Sprechblase ist nicht unbedingt ein Fall für den Urologen.