Bernd: Mehrsprachigkeit

Guten Tag,

mit welcher Technik erreiche ich eine Sprach-Umschaltmöglichkeit auf einer Webseite?
Dem User soll auf jeder Seite die Möglichkeit gegeben werden, zwischen deutsch und englisch zu wechseln und dabei sofort auf die entsprechende Seite weitergeleitet werden. Er soll sich also nicht nach dem Sprachwechsel auf einer Indexseite wiederfinden, sondern an der Stelle, bis zu der er bisher gesurft war.

Im Forumsarchiv habe ich bereits Beiträge zu Mehrsprachigkeit gefunden, möchte aber als Einstieg erst mal wissen, welche Techniken hier überhaupt in Frage kommmen. Meine Perl-Kenntnisse sind noch sehr rudimentär.

Danke für eine Antwort

Bernd

  1. hey,
    ich würde Dir empfehlen, das ganze mittels einer Datenbank und PHP zu verwirklichen ... das ist mit Sicherheit die sauberste Methode.

    viel spaß dabei ...

    mfG,
       Markus.

  2. Hallo Bernd,

    das kannst Du mit Akribie oder durch ne Datenbanklösung schaffen.
    Die Umschaltung auf die andee Sprache erfordert ja nur ein Link oder einen Post-Button. Der kann ja an das entsprechende Script / die HTML-Datei gesendet werden.

    Man muss ja zwangsweise alle Seiten doppelt bauen. Und wenn Du nun die Namen polymorph vergibst, dann kann man gar nicht durcheinander kommen.

    Grüße

    Chris (C)

  3. Hallo,

    Ich kann leider kein Perl, daher eine PHP-Lösung, die Dir aber vielleicht auch für Perl hilft!

    Möglich wäre es auch mit PHP auf folgende Weise: In der PHP-Datei wird eine Variable language standardmäßig auf "de" gesetzt. Dann wird geprüft, ob in der Adressezeile ein Wert übergeben wird, etwa so:

    www.Adresse.de/index.php?lang=en

    Wenn dieser Wert sich von de unterscheidet und überhaupt auch angegeben ist, dann wird die Variable language auf diesen Wert gesetzt. Dabei hilft Dir:

    $query = urldecode($_SERVER['QUERY_STRING']);
    $query_explode_array = explode('&', $query);
    foreach ($query_explode_array as $qea_value) {
       $qea_value_explode = explode('=', $qea_value, 2);
       $query_array[$qea_value_explode[0]] = $qea_value_explode[1];

    Anschließend definierst Du zwei Textbereiche im Dokument, die über eine if-Abfrage der Variable language angezeigt werden.

    Das Menü gestaltest Du so, dass hinter jedem Link immer auch die entgegengesetzte Sprache mittels if-Abfrage gesetzt wird, etwa so:

    <a href="unterseite.html<?php if language=="de" echo "?lang=en" ?>">...</a>

    Ich hoffe ich habe auf die Schnelle jetzt keinen Fehler gemacht, aber im Prinzip klappt es so! Mit Perl müsste es eigentlich analog auch machbar sein!

    Wenn oft Änderungen an der Seite stattfinden ist aber tatsächlich eine Datenbanklösung die bessere Wahl!

    Grüße
    Guillermo

    1. $query = urldecode($_SERVER['QUERY_STRING']);
      $query_explode_array = explode('&', $query);
      foreach ($query_explode_array as $qea_value) {
         $qea_value_explode = explode('=', $qea_value, 2);
         $query_array[$qea_value_explode[0]] = $qea_value_explode[1];

      Hier habe ich am Ende dann doch eine } vergessen! Sorry. Das Skript dient dazu alle Übergaben in der Adresszeile auszulsen und in einem Feld zu spreichern: Z.B.:

      www.Seite.de/?lang=en?test=2

      Dann lässt sich mit echo $query_array['test'] der Wert 2 ausgeben etc.

      1. Hallo Guillermo,

        $query = urldecode($_SERVER['QUERY_STRING']);
        $query_explode_array = explode('&', $query);
        foreach ($query_explode_array as $qea_value) {
           $qea_value_explode = explode('=', $qea_value, 2);
           $query_array[$qea_value_explode[0]] = $qea_value_explode[1];

        Hier habe ich am Ende dann doch eine } vergessen! Sorry. Das Skript dient dazu alle Übergaben in der Adresszeile auszulsen und in einem Feld zu spreichern: Z.B.:

        Das ist ein unnoetiger und extrem komplizierter Weg,
        um an die Variablen aus der URL heranzukommen, siehe unten.

        www.Seite.de/?lang=en?test=2

        ^^^
        Falsch. Statt dem zweiten ? muss es ein & haben.
        In HTML muss dieses & dann noch maskiert sein:

        <a href="http://www.Seite.de/?lang=en&test=2">English</a>

        Dann lässt sich mit echo $query_array['test'] der Wert 2 ausgeben etc.

        Warum so kompliziert?
        Was gefaellt Dir nicht an $_REQUEST['test'] bzw $_GET['test']?
        Diese Arrays enthalten doch schon automatisch die uebergebenen Variablen!

        mfg
        Thomas

  4. Moin!

    mit welcher Technik erreiche ich eine Sprach-Umschaltmöglichkeit auf einer Webseite?

    Mit einem Link, auf den man klicken kann.

    Dem User soll auf jeder Seite die Möglichkeit gegeben werden, zwischen deutsch und englisch zu wechseln und dabei sofort auf die entsprechende Seite weitergeleitet werden. Er soll sich also nicht nach dem Sprachwechsel auf einer Indexseite wiederfinden, sondern an der Stelle, bis zu der er bisher gesurft war.

    Das läßt sich eigentlich nur durch eine einzige Methode realisieren: Du brauchst für jede Sprachvariante eine eindeutige URL.

    Beispiele:
    /de/verzeichnis/seite.html und
    /en/verzeichnis/seite.html

    Oder:
    /verzeichnis/seite_de.html und
    /verzeichnis/seite_en.html

    Oder (in kompliziert)
    /verzeichnis/seite.html und
    /verzeichnis/page.html

    Du kannst die automatische Spracherkennung des Servers nutzen. Das würde dann hinauslaufen auf:
    /verzeichnis/seite.html -> ist automatisch die gewünschte Sprache, die im Browser steht
    /verzeichnis/seite.de.html -> deutsche Version.
    /verzeichnis/seite.en.html -> englische Version.

    Das Problem hierbei wird sein, dass du jeden normalen Link auf der Seite nicht auf eine ".de.html"-Seite (oder ".en.html") setzt, sondern auf ".html". Damit wird die Auswahl, die von der Browsereinstellung abweicht, auf jeder Seite rückgängig gemacht, was im Prinzip schlecht ist.

    Ich setze daher für die Startseite (http://www.example.com/) meist ein Skript ein, welches einen Redirect auf die vorhandene und gewünschte Sprachversion in den Verzeichnissen /de, /en etc. auslöst und dort die Startseite lädt.

    Je nach deinen Möglichkeiten kannst du mit Javascript die aktuelle URL auswerten, die derzeitige Sprache darin durch eine andere ersetzen und die Seite neuladen (als javascriptlose Alternative baust du einen festen Link auf die Startseite der anderen Sprache ein), oder du schaffst es gar, den Link auf dem Server dynamisch zu generieren, weißt dann natürlich, welche Sprache aktuell ausgegeben wird und kannst links auf identische Seiten der anderen Sprachen ausgeben, die dann auch ohne Javascript funktionieren.

    - Sven Rautenberg

    --
    ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
  5. als Ergänzung folgende Entscheidungshilfe:

    1. Ist es eine eher Handgestrickte Seite, die keine Daten aus einer Datenbank sammelt, musst du die Seiten doppelt, d.h. redundant anlegen.

    Eine Möglichkleit wäre, jeden link nicht direkt aufzurufen, sondern als php-Funktion, die in abhängigkeit der gewählten Sprache den tatsächlichen Link zurückliefert und dann erst diesen aufruft, z.b. indem sie entweder den dateinamen "foo" zu "foo_de" oder "foo_en" erweitert, oder das entsprechende Unterverzeichnis ersetzt:

    "...bar/foo/inhalt" wird zu "...bar/foo/de/inhalt"
    bzw. "...bar/foo/en/inhalt"

    1. Ansonsten wäre es besser, im Falle eines Kataloges mit relativ starrer Struktur die Standardtexte in einer Datenbank (mysql) etc. zu speichern und dann dynamisch in Abhängigkeit der Sprache dynamisch zu lesen

    2. Die Information, welche Sprache der Benutzer gewählt hat, kannst du z.B. als unsichtbares input-Feld in der html-seite selbst mitführen und jedesmal auslesen. Dann kämst Du ohne Cookies und Datenbank aus, müsstest allerdings jeden Link Deiner Seite mit dem entsprechenddem (unsichtabren) Formular umklammern und als submit das php aufrufen, welches dir dann die richtige Seite zurückliefert.

    benötigte Infrastruktur

    1. läßt sich auch mit javascript direkt auf der www-seite realisieren (Abfrage der Sprachauswahl und dynamisches Ändern des links (alle Seiten komplett mehrsprachig redundant)

    2. mit php und MYSQL (nur spezielle Infos mehrsprachig redundant)
      2b) anstelle MYSQL eine Textdatei für jede Sprache, die im Aufbau wie eine Windows-INI-Datei <Eintrag> = Text, wobei als <Eintrag> eine pseudo-abkürzung für den verwendeten Text ist (z.B. Begruessung = Welcome, Begruessung = Wilkommen)

    3. mit php ohne Datenbank und ohne javascript (alle Seiten mehrsprachig redundant)

    Viel erfolg
    Aaron

  6. Hi

    Ich benutze dafür für all meine Projekte Sprachdateien.
    Durch diese Art und Weise lässt sich jede Sprache einfach nachimplementieren.

    Alle Texte in den Seiten werden in Variablen abgelegt.
    Es existiert für jede Sprache eine Datei, wo diese Variablen vorhanden sind (Vorzugsweise sind die Vars in einem array gekapselt, wegen der Übergabe an Funkionen)

    Nachteil. Es muss wirklich alles generiert werden.

    Beispiel (für php):
    index.php

    --------------

    $lan = $_GET["lan"];

    //include der relevanten sprachdatei
    if($lan=="en") require("en.php");
    else require("de.php");

    //ausgeben
    echo $var_lan["beguessung"];

    //umschalten
    if($lan=="en")
       echo <a href="index.php?lan=de"> en </a>";
    else
       echo <a href="index.php?lan=en"> en </a>";

    -------------
    de.php
    $var_lan["begruessung"] = "hallo leute";

    en.php
    $var_lan["begruessung"] = "hi folks";

    Es ist sicherlich anfänglich sehr zeitraubend, bewährt sich IMHO aber sehr, vorllendingen wenn man viele Sprachen implementieren möchte.

    ciao
    romy

    --
    DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
    sh:( fo:| ch:? rl:( br:& va:| zu:) ss:| ls:[
    Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
    Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
    1. Moin!

      Alle Texte in den Seiten werden in Variablen abgelegt.
      Es existiert für jede Sprache eine Datei, wo diese Variablen vorhanden sind (Vorzugsweise sind die Vars in einem array gekapselt, wegen der Übergabe an Funkionen)

      Nachteil. Es muss wirklich alles generiert werden.

      Ideal ist diese Vorgehensweise bei weitem nicht.

      Mal so grundsätzlich überlegt: Wenn man eine zweisprachige Website anbietet, dann gibt es zwei Möglichkeiten.

      1. Die Site wird nur teilweise übersetzt. Dann existieren nicht für alle Seiten der einen Sprache äquivalente Seiten der anderen Sprache - folglich ist es mit dem Umschalten auch blöd. Einfachste Methode hier: Zwei unabhängige Sites in zwei Verzeichnissen, mit Link auf die Startseite der jeweils anderen Sprache.

      2. Die Site wird komplett 1:1 übersetzt.

      In diesem zweiten Fall bleibt die Struktur der Site in jeder Sprache identisch. Das bedeutet, dass sich auf einer Seite zwei Klassen von Dingen ändern: 1. Die Navigationselemente, die auf jeder Seite der Sprache identisch auftreten und 2. der eigentliche Content.

      Es spricht in meinen Augen absolut nichts dagegen, den Content _nicht_ in solche Sprachdateien zu würgen. :) Content ist in der Regel umfangreich, es wäre recht sinnlos, ihn in einer einzigen, umfangreichen Datei zu verwalten. Viel besser geeignet ist da der Ansatz, ihn in jeweils separaten Dateien zu halten, oder in einer Datenbank.

      Was die Navigationselemente angeht: Die sind eigentlich ja Bestandteil des den Content umgebenden Templates. Es spricht in meinen Augen auch hier nichts dagegen, ein Template je Sprache anzulegen, welches dann spezifische Sprachinhalte enthält. Ein dahinterliegendes Framework fasst dann Template und Content zusammen und gibt die Seite aus.

      Man _kann_ an dieser Stelle vieles vereinfachen, wenn man die zur Verfügung stehenden Optionen sinnvoll einsetzt. Beispielsweise wäre es möglich, mit mod_rewrite das gesamte URL-Gebilde, welches der Client hinter /de/ oder /en/ (oder /fr/) sieht, auf / zu mappen. Weiter könnte statt / auch /index.php angesprochen werden und entsprechend der gewünschten URL aus einem Verzeichnisbaum die gewünschte Sprachdatei für den Content holen, sie mit dem passenden Sprachtemplate zusammenwürfeln und dann ausliefern, ohne dass die beteiligten Dateien auch nur irgendetwas mit den in der URL genannten Ressourcen zu tun gehabt hätten. Selbstverständlich ließe sich das auch mit einer Datenbank regeln.

      - Sven Rautenberg

      --
      ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
  7. Hi Bernd,

    Meine Perl-Kenntnisse sind noch sehr rudimentär.

    die konkrete Umsetzung (Programmiersprache etc.) ist in Deinem Falle von untergeordneter Bedeutung.

    Wichtiger erscheint mir, welche Auswirkungen die Anforderung der Mehrsprachigkeit auf das Datenmodell Deines Content hat (dies wird in den Beiträgen bezüglich Generiererung von Seiten vs. Parallelhaltung von Dateien behandelt) und wie diese Auswirkungen mit der Pflege des Inhalts verträglich sind.

    Letzteres wiederum hängt von der Häufigkeit für Änderungen ab, über die Du bisher nichts ausgesagt hast. Ich vermute, daß mit steigender Änderungsfrequenz der Nutzen einer vollständigen Generierung der Seiten (und einer Pflege der Inhalte über ein CMS) zunehmen wird, während bei selten geänderten Inhalten die Parallelhaltung fertiger Dateien (ggf. mit dynamischer Einbindung einheitlicher Schablonen für Verweise auf alternativsprachliche Versionen: Du möchtest die englische Version nicht ändern müssen, wenn eine französische entstanden ist - diese Umschalt-Links zwischen den Sprachen möchtest Du lieber dynamisch erzeugen) ausreichen sollte.

    Viele Grüße
          Michael

    --
    T'Pol: I apologize if I acted inappropriately.
    V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
    (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
     => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
    Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.