Matthias Jütte: Wie setze ich am besten Mehrsprachigkeit auf Seiten um?

Hallo!

Ich habe mir mal wieder vorgenommen, ein größeres Projekt anzugehen. Und dabei stellt sich für mich folgende Frage:

Wenn ich die komplette Seite mehrsprachig darstellen möchte (sprich sämtliche in der Sprache variable Zeichenketten in Abhängigkeit einer PHP-Variable, z.B. $lan, austauschbar machen möchte), wie stelle ich es am sinnvollsten an diese abzuspeichern und wieder aufzurufen?

Dabei sollte berücksichtigt werden, daß jede Sprache nach Bedarf eingebunden werden können soll.

Ich denke bisher an zwei Alternativen:

  1. pro Sprache eine include-Datei mit einem fest definierten Array, z.B. der Form $text[-sprache-][-string-].
    Also so etwas wie:

languages/de.lan.php
$text['de'][title] = "Meine Homepage";
$text['de'][menu] = "Hauptmenu";

languages/us.lan.php
$text['us'][title] = "My Homepage";
$text['us'][menu] = "Main menu";

languages/fr.lan.php
$text['fr'][title] = "Mon site internet";
$text['fr'][menu] = "Menu principal";

zur Augabe dann: echo $text[$lan][was_gerade_gebraucht_wird];

  1. über eine MySQL-Datenbank: in Feld pro verwendetem String, ein Datensatz pro Sprache

In diesem Fall müßte halt für jede Seite der Satz enthaltener Zeichenketten abgerufen werden, hätte aber doch den Vorteil, daß nicht immer der _komplette_ Satz Text eingebunden wird.

Was meint ihr? Was währen noch weitere Alternativen? Wie unterscheiden sich diese in der Serverbelastung (ruhig auch nur rein hypothetisch, kann mir nicht vorstellen, daß meine Seite jemals einen Andrang generieren würde, die eine Server in die Knie zwingt).

Gruß

Matthias

--
ss:| zu:| ls:[ fo:| de:] va:) ch:? sh:) n4:( rl:( br:> js:| ie:% fl:) mo:}
http://www.makaio.de/quotations
  1. Hallo!

    Was meint ihr? Was währen noch weitere Alternativen?

    Ansatz ohne Datenbank, beim Blättern bleibst du in deiner Sprache, kannst aber auf JEDER Seite umspringen in eine andere Sprache:

    http://www.shanthi-guesthouse.de/index_gb.htm

    Gruss, Kalle

    1. Hallo!

      »»kannst aber auf JEDER Seite umspringen in eine andere Sprache:

      Kann ich mit der DB auch:

      $query = "SELECT title, ... FROM $languages WHERE lan=$lan";

      Gruß

      Matthias

      --
      ss:| zu:| ls:[ fo:| de:] va:) ch:? sh:) n4:( rl:( br:> js:| ie:% fl:) mo:}
      http://www.makaio.de/quotations
  2. Hi Matthias,

    bist du auf PHP beschränkt oder erlaubt dein WebServer auch JSP?

    Eine sehr elegante Variante ist Jakarta Struts, das auf JavaServer Pages aufbaut (und auch noch das Model-View-Controler Konzept erfüllt). Dort legst du einfach für jede Sprache eine ApplicationResources.properties Datei an und verwendest die darin definierten Platzhalter in deinen JSP-Seiten.

    Ein Platzhalter könnte dann so lauten:
    index.title=Tool für Softwareversionen und Ressourcen
    und auf englisch:
    index.title=Tool for software versions nand resources

    Alles andere erledigt Struts für dich automatisch.

    Grüße,
    Hoscha

    1. Hallo!

      Ich kenne W/LAMP und nix anderes ;-) Bis JSP habe ich es noch nicht geschafft.

      Gruß

      Matthias

      --
      ss:| zu:| ls:[ fo:| de:] va:) ch:? sh:) n4:( rl:( br:> js:| ie:% fl:) mo:}
      http://www.makaio.de/quotations
      1. Das Thema wurde in den Bereich "Programmiertechnik" und nicht in "PHP" gestellt. Deswegen dachte ich, du meinst die Frage Programmiersprachen-übergreifend. :D

        Grüße,
        Hoscha

        1. Hallo!

          Hast ja Recht...

          Gruß

          Matthias

          --
          ss:| zu:| ls:[ fo:| de:] va:) ch:? sh:) n4:( rl:( br:> js:| ie:% fl:) mo:}
          http://www.makaio.de/quotations
  3. use Mosche;

    Wenn ich die komplette Seite mehrsprachig darstellen möchte (sprich sämtliche in der Sprache variable Zeichenketten in Abhängigkeit einer PHP-Variable, z.B. $lan, austauschbar machen möchte)

    Ich denke bisher an zwei Alternativen:

    1. pro Sprache eine include-Datei mit einem fest definierten Array
    2. über eine MySQL-Datenbank: in Feld pro verwendetem String, ein Datensatz pro Sprache

    Meinst du das so:

    Sprache  |  Kennung   | String
    ------------------------------
        de   |  title     | Meine Homepage
        en   |  title     | my website
    ... ?

    Was meint ihr? Was währen noch weitere Alternativen? Wie unterscheiden sich diese in der Serverbelastung (ruhig auch nur rein hypothetisch, kann mir nicht vorstellen, daß meine Seite jemals einen Andrang generieren würde, die eine Server in die Knie zwingt).

    Ist es nun ein größeres Projekt oder nicht? Für ein kleineres Projekt reicht sicherlich 1 aus. Wird aber umständlich, wenn du viele Strings hast, die übersetzt werden müssen, da die Datei dann unnötig groß wird.
    Wenn du sowieso auf vielen Seiten eine Verbindung zur DB aufbaust, dann würde ich zu 2 tendieren.
    Am Ende mußt du auch entscheiden, wie du deine Homepage wartest. Ist die HP insgesamt recht statisch, dann würde ich verschiedene Versionen deiner HP statisch hochladen (statisch bezieht  sich nur auf die Sprache, nicht auf deinen restlichen PHP-Teil). Das ist sicherlich die performanteste Methode. Das erstellen deiner Seiten kannst du dann ja einem kleinen make-Script erledigen lassen, als Vorlage hast du zB deinen Vorschlag 1, und dein Script ersetzt dann alle Platzhalter-Variablen %%%STRING%%% durch den entsprechenden String deiner Sprache.
    use Tschoe qw(Matti);

    --
      Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
    1. Meinst du das so:

      Sprache  |  Kennung   | String

      de   |  title     | Meine Homepage
          en   |  title     | my website
      ... ?

      Es geht doch um WEB- Seiten, also überwiegend Fließtext ???

      Das ist m.E. nicht so zweckmäßig, habe sowas schon probiert. Du hast irgendwann eine Unzahl von Text- Schnippseln in 2 oder mehr Sprachen. Neben den Texten musst du auch noch die Namen für die diversen Platzhalter (Kennungen) verwalten und das PHP- Programm muss all diese Platzhalter kennen.

      Nach kurzer Zeit blickst du garantiert nicht mehr durch.

      Finde es immer noch am besten, eine WEB- Seite komplett und zusammenhängend in einer Sprache zu machen.

      Bei Formularen wäre es was anderes.

      Kalle.

      1. Hallo!

        Das ist m.E. nicht so zweckmäßig, habe sowas schon probiert. Du hast irgendwann eine Unzahl von Text- Schnippseln in 2 oder mehr Sprachen. Neben den Texten musst du auch noch die Namen für die diversen Platzhalter (Kennungen) verwalten

        So wird es wohl sein.

        und das PHP- Programm muss all diese Platzhalter kennen.

        Strenggenommen nicht, denn wenn die Platzhalter den gleichen Namen wie die Datenbankfelder oder die Feld-Schlüssel haben ist das Referenzieren glaube ich recht einfach zu bewerkstelligen. Aber der Umfang ist halt ggf. enorm.

        Nach kurzer Zeit blickst du garantiert nicht mehr durch.

        Wäre eine mögliche Folge ;-)

        Finde es immer noch am besten, eine WEB- Seite komplett und zusammenhängend in einer Sprache zu machen.

        Soll ja auch so sein, bloß für mehrere Sprachen. Es geht mir darum die Seite jedem Benutzer in seiner Muttersprache anzubieten, sprich alle Eingabeaufforderunge, Warnungen, Feldbezeichnungen, etc. in der jeweiligen Sprache anzuzeigen.

        Gruß

        Matthias

        --
        ss:| zu:| ls:[ fo:| de:] va:) ch:? sh:) n4:( rl:( br:> js:| ie:% fl:) mo:}
        http://www.makaio.de/quotations
    2. Hallo!

      Dachte da eher an sowas:

      Sprache | title          | kennung2  | ... | kennungX
      -----------------------------------------------------
         de   | Meine Homepage | irgendwas | ... | ...
         us   | My Homepage    | something | ... | ...

      Gruß

      Matthias

      --
      ss:| zu:| ls:[ fo:| de:] va:) ch:? sh:) n4:( rl:( br:> js:| ie:% fl:) mo:}
      http://www.makaio.de/quotations
      1. use Mosche;

        Dachte da eher an sowas:

        Sprache | title          | kennung2  | ... | kennungX

        de   | Meine Homepage | irgendwas | ... | ...
           us   | My Homepage    | something | ... | ...

        Schlecht, weil du die Tabellen_struktur_ verändern mußt, wenn du einen neuen String einfügst. Dann nimm lieber meine Methode. Äußer dich doch bitte zu der Größernvorstellung deines Projektes.

        use Tschoe qw(Matti);

        --
          Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
        1. Hallo!

          Schlecht, weil du die Tabellen_struktur_ verändern mußt, wenn du einen neuen String einfügst.

          War mir bewußt, ist aber doch auch nix anderes, als meinem array ein neues Feld hinzuzufügen, oder?

          »»Äußer dich doch bitte zu der Größernvorstellung deines Projektes.

          Soll als eine recht simple, dafür aber funktionale Adressenverwaltung anfangen, die ich dann, je nach Motivation und Disziplin sukzessive ausbauen möchte. Mit denen neuen Funktionen kämen dann jeweils neue Textbausteine.

          Gruß

          Matthias

          --
          ss:| zu:| ls:[ fo:| de:] va:) ch:? sh:) n4:( rl:( br:> js:| ie:% fl:) mo:}
          http://www.makaio.de/quotations
    3. Also ich mach ds bisher so:

      ID    |  en            | de
      ------------------------------
      title |  my website    | Meine Homepage

      Und beim initialisieren, wird die Spalte der Sprache in ein HASH eingelesen.

      %TEXT = [ ID => de ]

      und die Ausgabe ist dann immer:

      print TEXT{title};

      In wirklichkeit ist es etwas komplizierte, da die Strings Platzhalter für printf enthalten können, so dass ich immer eine Funktion aufrufe, die eventuelle Parameter mit sprintf umwandelt. z.b.:

      ID    |  en            | de
      ------------------------------
      title |  my website    | Meine Homepage
      msg   |  Hallo %s      | Hello %s

      sub Text
      {
      my $id = shift;
      return sprintf $TEXT{$id}, @_;
      }

      (das ist jetzt Perl, aber ich denke das ist mit PHP auch möglich )

      So läßt sich auch leicht der Datensatz ändern, da man immer alle Sprachen gleichzeitig abfragen kann mit der ID, außerdem läßt sich die ID auf unique setzten dann hat man keine doppelten Texte.

      Struppi.