Raffi: mehrsprachiges PHP Projekt

Hallo Leute

Ich plane ein zweisprachiges PHP Projekt. Ich stelle mir vor, dass die Ausgabetexte in zwei versch. Lang-Files sind.

Ich habe schon div. Seite im Web abgeklappert und bin etwas unsicher, welches die optimale Lösung für mehrsprachige Projekte ist.

  • Sprachelemente in einer DB
  • Sparchelemente per Variable und include einbinden
  • Sprachelemente in einem Array
  • gettext

Was ich noch dazu sagen muss, das ganze läuft auf einem Windows Apache Server (kann ich leider nicht ändern, da der Kunde diesen Intranteserver so betreibt).

Was für Lösungsansätze oder Links könnt ihr mir emfpehlen.

Danke und Gruss
Raffi

  1. Hallo,

    Ich habe schon div. Seite im Web abgeklappert und bin etwas unsicher, welches die optimale Lösung für mehrsprachige Projekte ist.

    • Sprachelemente in einer DB
    • Sparchelemente per Variable und include einbinden
    • Sprachelemente in einem Array
    • gettext

    Also ich habe gerade eins was schon fast fertig ist und habe es so gelöst, dass ich alle großen Inhalte in der Datenbank in einer Tabelle habe die dann je nach Sprache die richtige Spalte hergibt. Alles was so außenrum in der Seite ist wie Menü, Kleine Infos auf den Seiten standardisierte Links wie "weiterlesen" und so ein Zeugs habe ich in eine Datei language.php die so aufgebaut ist dass ich zwei Arrays habe

    $lang_txt['de'] = array(
                            'welcome'   => 'Willkommen auf unserer Seite.',
                            'read_more' => 'weiterlesen'
                           )
    $lang_txt['en'] = array(
                            'welcome'   => 'Welcome on our homepage.',
                            'read_more' => 'read more'
                           )

    Und wenn es dann so weit ist binde ich es so ein, wobei $language entweder 'de' oder 'en' ist je nachdem wo man sich auf der Seite befindet:

    echo "<h1>".$lang_txt[$language]['welcome']."</h1>\n";
    echo "<a href='seite.php'>".$lang_txt[$language]['read_more']."</a>";

    Mit dem Content mache ich das genau so nur dass der dann aus der DB kommt und ich dort die Spalten:

    topic_de   topic_en
    content_de content_en

    benannt habe und beim Select einfach

    $sql = "SELECT topic_".$language" content_".$language." FROM news WHERE id = '".$id"'";

    so kann ich immer und jeder Zeit auf die andere Sprache umschalten, wobei natürlich die Inhalte 100% identisch sein müssen.

    Grüße
    Jeena Paradies

    --
    Logo drucken welches sich auf einer dunklen Seite befindet
    http://jeenaparadies.de/weblog/2004/august/print-logo/
    Spammer jetzt beim Arbeitsamt
    http://jeenaparadies.de/artikel/arbeitsamt-spammer/
    1. Hallo Jeena

      Bei mir geht es eigentlich nicht um ellenlange texte sondern wie du erwähnt hast nur um Wörter wie z.B. Log out / Abmelden, Speichern / Save etc.

      Das ganze ist ein Admin und Ausgabe - Bereich der in Deutsch und Englisch genutz wird. Die Inhalte (Contents) sind jetzt schon in einer DB zweisprachig verwaltet. Es gibt ein Baum (wie Explorerer) wo es zu oberst zwei ordner gibt: Deutsch und Englisch, danach sind die enthaltenen Elemente in der entsprechenden Sprache. Es geht also nur um das Drum herum wie Buttons, Menupunkte etc.

      So wie ich das aus den Beiden Beiträgen gelesen habe, wäre da eine Array Variante angebracht.

      Sehe ich das richtig. Du hast eine Datei language.php und darin die zwei Arrays. Diese Datei wird bei jedem Aufruf der Seite per include eingelesen?

      Evtl. wäre es ja noch sinvoll, die beiden Arrays in unterschiedlichen Dateien unterzubringen, damit wenn einer Deutsch auswählt nicht das ganze Englische Array auch noch eingelesen wird.

      Was meint Ihr zu diesen Überlegungen?

      Danke und Gruss
      Raffi

      1. Hallo,

        Sehe ich das richtig. Du hast eine Datei language.php und darin die zwei Arrays. Diese Datei wird bei jedem Aufruf der Seite per include eingelesen?
        Evtl. wäre es ja noch sinvoll, die beiden Arrays in unterschiedlichen Dateien unterzubringen, damit wenn einer Deutsch auswählt nicht das ganze Englische Array auch noch eingelesen wird.

        Jo das stimmt, bei mir sind es halt nicht wirklich viele Wörter die cih jedes mal einlese aber wenn ich so drüber nachdenke würde ich das jetzt auch in zwei packen.

        Grüße
        Jeena Paradies

        --
        Logo drucken welches sich auf einer dunklen Seite befindet
        http://jeenaparadies.de/weblog/2004/august/print-logo/
        Spammer jetzt beim Arbeitsamt
        http://jeenaparadies.de/artikel/arbeitsamt-spammer/
  2. Moin!

    Ich habe schon div. Seite im Web abgeklappert und bin etwas unsicher, welches die optimale Lösung für mehrsprachige Projekte ist.

    Ich denke nicht, dass es "DIE" optimale Lösung überhaupt gibt.

    • Sprachelemente in einer DB

    Wäre ohne DB schwierig zu bewerkstelligen (um mal einen Grund zu nennen, warum das nicht alle so machen). :)

    • Sparchelemente per Variable und include einbinden

    Wenn man 100 KB Sprachelemente einbinden muß, um ein 1KB-Skript starten zu können, ist irgendwas am Verhältnis Nutzen/Aufwand falsch.

    • Sprachelemente in einem Array

    Wo kommt das her?

    • gettext

    Wenn man das einsetzen kann, gehts vielleicht, aber es ist irgendwie für Webprojekte ein eher ungewöhnlicher Ansatz, würde ich meinen.

    Was für Lösungsansätze oder Links könnt ihr mir emfpehlen.

    Ich habe schon die eine oder andere mehrsprachige Website entwickeln dürfen - ich kann aber trotzdem noch immer nicht eindeutig sagen, was da jetzt tatsächlich am besten ist. Es hängt, würde ich meinen, von diversen Faktoren, und letztendlich auch von deiner Laune und Kenntnissen bezüglich der diversen Möglichkeiten ab.

    Um dir mal Denkansätze zu geben: Geht's nur um eine mehrsprachige Website, oder auch um eine mehrsprachige PHP-Applikation? Welche Art von Templates verwendest du? Ist es mit denen aufwendiger, je Sprachversion einen kompletten Satz einsprachiger Templates zu verwenden, oder ist es schlauer, z.B. mit gettext alle Texte EINES Template-Satzes zu lokalisieren, und dann mit weiterem Inhalt aus der Datenbank aufzufüllen?

    Wenn ich an die Aufgabenstellung "Eine mehrsprachige Website - Erstellungssoftware aber nur einsprachig" denke, dann halte ich es für wenig sinnvoll, den Content irgendwie kompliziert in Include-Files zu verpacken, welche immer den gesamten Site-Inhalt enthalten, von dem aber nur ein kleiner Ausschnitt jeweils benötigt wird. Content ist ja in der Regel auf jeder Seite komplett anders (es sei denn, man möchte sich immer wiederholen), also ergeben sich auch keinerlei Komprimierungseffekte, indem ein an mehreren Stellen auftretender Text durch genau EIN Arrayelement ausgegeben werden kann.

    gettext hingegen kann ich mir irgendwie bei PHP-Applikationen wesentlich besser vorstellen. Denn sofern die nicht template-basiert sind (und gewisse Dinge wären für sowas einfach zu aufwendig), hat man das Problem, bei Sprachänderungen am Programmcode rumändern zu müssen. Da ist es wahrscheinlich schlauer, Button-, Menü- und Dialogtexte mit gettext verwalten zu lassen - wenn ich richtig informiert bin, unterstützt gettext dann die Extraktion und Übersetzung der auf diese Weise ausgegebenen Texte, und das ist ja auch nicht unbedingt schlecht. Ich denke nur, gettext ist für sich häufig ändernde Inhalte eher ungeeignet. Ich habe aber damit noch nie gearbeitet, kann also keine Praxiserfahrungen beisteuern.

    Unter dem Strich würde ich sagen: Wenn's darum geht, Site-Inhalte, die von Redakteuren gepflegt und potentiell regelmäßig geändert werden, zu speichern, ist eine Datenbank oder auch ein Konstrukt aus Flatfiles (jeder Seiteninhalt in eine Datei) durchaus nicht falsch.

    Die Texte der eigentlichen Applikation sind in der Regel eher kurz und lassen sich wahrscheinlich ganz gut mit gettext oder einer Arraylösung behandeln, wobei gettext vielleicht programmiererfreundlicher ist - das solltest du mal ausprobieren.

    Der Einsatz von Templates ist in jedem Fall zu empfehlen. Damit kannst du dir eventuell die Geschichte mit den Arrays oder gettext sparen, indem du je Sprache ein eigenes Templateset anlegst, aber das erfordert von den Übersetzern (sofern du das nicht selbst machen mußt) natürlich Kenntnisse in der Templatesprache. Mit gettext werden sie aus diesen verwirrenden Konstrukten nämlich draußen gehalten.

    Ach ja: Noch ein wichtiger Punkt, den du dir überlegen solltest: Zeichencodierung. Verschiedene Sprachen haben mitunter die unangenehme Eigenschaft, Zeichen zu verwenden, die im klassischen 7-Bit-ASCII nicht enthalten sind. In Europa dürfte das bekannteste Zeichen, was in diesem Zusammenhang Ärger verursachen dürfte, das Eurozeichen sein. Denn es kommt in der klassischen Zeichencodierung ISO-8859-1 nicht vor, kann dementsprechend auch nicht nativ in HTML eingebaut werden (das muß man dann als Entity lösen - aber das wäre vermutlich noch hinzukriegen) - es kann aber auch nicht von Formularen gesendet werden. Die Browser denken sich da die abenteuerlichsten Dinge aus.

    Es ist also eventuell nicht verkehrt, wenn du dich mit UTF-8 bzw. Unicode im Allgemeinen beschäftigst. Ich habe dazu in diesem Jahr hier im Forum schon etliche Beiträge geschrieben, die, wenn ich die Rückmeldungen richtig interpretiere, offenbar schon bei einigen Leuten Licht in die Sache gebracht haben. So schrecklich ist UTF-8 nämlich gar nicht - man sollte nur ungefähr wissen, was man da tut. :) Die Archivsuche weiß mehr.

    - Sven Rautenberg

    1. Moin Moin!

      Wäre ohne DB schwierig zu bewerkstelligen (um mal einen Grund zu nennen, warum das nicht alle so machen). :)

      Wie habe ich diesen Satz zu verstehen?
      Danke.

      Gruß aus Berlin!
      eddi

      --
      Manchmal trifft es einen doch ganz unverhofft t86591:
      > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
      Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
      1. Moin!

        Wäre ohne DB schwierig zu bewerkstelligen (um mal einen Grund zu nennen, warum das nicht alle so machen). :)

        Wie habe ich diesen Satz zu verstehen?

        Ganz banal: Wer keine Datenbank zur Verfügung hat, der kann schwerlich seine Sprachversionen in einer Datenbank speichern, oder? :)

        Abgesehen davon ist der Zugriff auf eine Datenbank wegen ein paar kleiner Fitzel Textausgabe wahrscheinlich nicht unbedingt die performanteste Methode.

        - Sven Rautenberg

        1. Moin!

          Danke!

          Gruß aus Berlin!
          eddi

          --
          Manchmal trifft es einen doch ganz unverhofft t86591:
          > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
          Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
  3. Hallo!

    Was für Lösungsansätze oder Links könnt ihr mir emfpehlen.

    Wenn die Seite über ein CMS gepfeglt wird, würde ich die Daten folgendermaßen einbinden. Bei einem CMS das ich verwende, werden die Sprachversionen folgendermaßen abgelegt:

    z.B.

    #news
      id
      1
      2
      3

    #newsLang de=1, en=2
      id     text      lang
       1    text(de)     1
       1    text(en)     2
       2    text(de)     1
       3    text(en)     2

    Was das Layout angeht, wie zum Beispiel Text wie "Logout", "Suchen" etc, die sich ja nicht ständig ändern, habe ich in einem Array abgelegt:

    $textLang[001]['de'] = array('text'=>'Suchen');
    $textLang[001]['de'] = array('text'=>'Search');

    Bei Bildern bzw. Buttons:

    $imgLang[206]['de'] = array('src'=>'/bilder/button_de.gif', 'over'=> '/bilder/button_de_over.gif', 'alt'=>'Alttext');
    $imgLang[206]['en'] = array('src'=>'/bilder/button_en.gif', 'over'=> '/bilder/button_en_over.gif', 'alt'=>'Alttext');

    Eine Hundertestelle steht für ein Bereich wie Produkte, Kontakt, etc.
    So habe ich den Überblick behalten.

    MfG, André Laugks

    --
    L-Andre @ gmx.de
  4. Hallo Raffi,

    Ich hab das schon ein paarmal gemacht und zwar mit DB, INI-Files und einer PHP-Klasse, die gettext emuliert, da ich das eigentliche gettext() nicht zur Verfuegung hatte.

    Wenn ich dich recht verstehe, geht es mehr um kurze Texte, da finde ich gettext ideal, insbesondere weil Du den Text immer im Klartext siehst.

    DB kommt mir fuer kurze Texte wie Overkill vor. INI hat insbesondere den Nachteil, dass es mit Woertern wie 'no' nicht umgehen kann. Meine getText-Klasse verarbeitet .po-Dateien und gibt den Text bei Bedarf auch mit htmlentities beheandelt zurueck.

    Wenn das Objekt also z.B. $lang heisst, erzeugt <?php print$lang -> ('Size'); ?> den String 'Gr&ouml;&szlig;e'

    Dieter

  5. Huhu Raffi

    hier mal ein weiterer Lösungsansatz den ich für kleinere Webprojekte
    gerne verwende.
    Der eignet sich gut für kurze Texte/ Buttons etc. die nicht intensiv gepflegt werden müssen.
    Also für Admin- u.ä Oberflächen, aber weniger gut für redaktionelle  Inhalte.

    Da ich viel und gerne here doc Syntax benutze und den Inhalt erst am Ende ausgebe schreibe ich die englische (oder auch weitere) Sprachversion direkt dahin wo sie stehen soll.
    Das sieht dann z.B. so aus:

    <p>Speichern Sie hier Ihre Zugangsdaten
    <ENGLISCH>Please save your login data</ENGLISCH>
    </p>
    <table>
     <tr>
      <td>Loginname<ENGLISCH>login name</ENGLISCH></td>
    </tr>
    [...]

    Vor der Ausgabe stecke ich den HTML-Klops dann in eine Funktion
    die nur jeweils die gewünschte Sprachversion stehen lässt.

    Das nur mal so als Anregung.

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Hallo,

      <p>Speichern Sie hier Ihre Zugangsdaten
      <ENGLISCH>Please save your login data</ENGLISCH>
      </p>
      <table>
       <tr>
        <td>Loginname<ENGLISCH>login name</ENGLISCH></td>
      </tr>
      [...]

      Vor der Ausgabe stecke ich den HTML-Klops dann in eine Funktion
      die nur jeweils die gewünschte Sprachversion stehen lässt.

      Eine sehr interessante Vorgehensweise.

      Grüße
      Jeena Paradies

      --
      Logo drucken welches sich auf einer dunklen Seite befindet
      http://jeenaparadies.de/weblog/2004/august/print-logo/
      Spammer jetzt beim Arbeitsamt
      http://jeenaparadies.de/artikel/arbeitsamt-spammer/