Ankündigung

Einklappen
Keine Ankündigung bisher.

Mehrsprachigkeit mit PHP

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mehrsprachigkeit mit PHP

    Hallo zusammen,

    ich bin momentan beim redesign eines größeren PHP Projekts und in diesem Sinne wird viel Code überarbeitet und ersetzt. Unser Projekt hat bisher die Mehrsprachigkeit folgendermasen gelöst:

    Jede Sprache hat eine eigene Datei in der ein Array der Art
    PHP-Code:
    $lang = array(
        
    welcome => 'Willkommen im Projekt'
    ); 
    steht. Die Verwaltung der Einträge wurde über eine Datenbank geregelt, die dann autoamtisch die Textdateien mit dem Array erzeugt hat.Über einen Parameter wurde dann die entsprechende Datei eingebunden und die Werte mit einer globalen Funktion zurückgegeben:
    PHP-Code:
    __W('welcome'); 
    Meine Frage ist jetzt, was für Erfahrungen ihr mit anderen Methoden für die Mehrsprachigkeit von PHP Projekten habt. Ich habe schon ein Pear Modul (Translation2) gefunden. Das ist aber schon seit 2 Jahren nicht mehr aktualisiert worden. Habt ihr die Sprachdateien an sich direkt in einer Datenbank?

    Vielen Dank für eure Vorschläge!


  • #2
    Hi.

    Für mein Projekt habe ich sämtliche Texte in den unterschiedlichen Sprachen in der Datenbank hinterlegt. Anhand der IP setze ich eine Standartsprache, die der User nach dem Login selbst festlegen kann. Dieses wird in einer Session gespeichert und über ein include auf der jeweiligen Seite, werden einfach die gewünschten Texte eingefügt.

    Keine Ahnung, ob es der beste Weg ist, aber es funktioniert bei mir zumindestens gut!

    Grüsse,

    wolf29
    while (!asleep()) sheep++;

    Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

    Kommentar


    • #3
      Bei kleineren Projekten kannst du das sicher das aus der DB ziehen, da auf diesen wenig Traffic ist kann man die Translations direkt aus der DB holen. Habe ich auch schon bei kleineren Seiten so gemacht.
      Bei großen Projekten ist es sicher besser, die Translations entweder so wie ihr es gemacht hab in ein Array zu speichern und dann diese Dateinen ein zu binden.
      Was auch noch ne Möglichkeit ist, Ist direkt die übersetzten Templates zu erzeugen und dann hoch zu laden, so dass du dann für jedes Land ein eigenes Template hast.

      OT:
      Das ist keine FG-Frage!
      "My software never has bugs, it just develops random features."
      "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

      Kommentar


      • #4
        mehrsprachigkeit mit php sitehp.de - Google-Suche
        http://hallophp.de

        Kommentar


        • #5
          @Asipak: Es ging mir in der Frage nicht darum, wie man das Problem lösen kann. Ich kann google schon verwenden... Ich wollte Meinungen und Erfahrungsberichte von fähigen Entwicklern haben, die eventuell die anderen Methoden probiert haben. Die Sprachdatei hat ca 2000 Einträge, deswegen die Überlegung ob ein anderes System hierfür besser geeignet wäre.

          Das mit dem Template ist keine schlechte Idee. Mal überlegen wie sich das am besten einbauen läst.

          Danke für den Vorschlag!

          Kommentar


          • #6
            Ich benutze zur Zeit Datenbankeinträge. Ganze Texte sind natürlich als Inhaltsseiten gespeichert, Worte oder Fragemente (auch Fehlermeldungen u.ä.) habe ich in einet extra I18n Tabelle, die etwa so aufgebaut ist:

            Code:
            pattern | translation | lang | context
            pattern ist hier ein Schlüssel. Entweder das Wort selbst oder ein ein Bezeichner (siehe Beispiel)
            translation ist der übersetzte Inhalt
            lang ist ein zweistelliger Sprachcode oder eine Sprachgruppe. Sprachgruppen löse ich über eine weitere Tabelle auf.
            context gruppiert die Einträge nach Seiten o.ä. Wenn ich bspw. zwei Formulare habe, die gleiche Labelangaben verwenden, gebe ich "forms" als Kontext an.

            Als PK benutze ich (pattern, lang, context)
            context kann auch * sein, das sind Angaben, die applikationsweit ausgelesen werden
            lang kann * enthalten, was immer die Standardsprache ist, wenn das Pattern für keine andere Sprache definiert ist.

            Das Ganze lese ich in einen I18n Container (Objekt) aus, das ich für Sprach/Context auch im Cache ablege.

            Beispiel:
            Code:
            pattern     | translation | lang | context
            
            back          back          *      *
            back          zurück        de     *
            label_Subject Subject       *      forms
            label_Subject Betreff       de     forms
            label_Submit  Done          *      forms
            label_Submit  Fertig        de     forms
            label_Submit  Weiter        de     forms.multipart
            --

            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


            --

            Kommentar


            • #7
              Wir benutzen Sprachen (Deutsch, Französisch, ..) und Lokalisierungen (Deutschland/Deutsch, Schweiz/Deutsch, ..), an letztere sind die Übersetzungen gekoppelt.

              Folgende Tabellen:
              LANG
              id | code | name
              1 | de | Deutsch
              ..

              LOC
              id | fk_lang | code | name | decimal_delim | thousand_delim | date_format | time_format
              2| 1 | de | Deutschland | , | . | d.m.Y | H:i
              ..

              CAT
              id | name
              3 | NEWS
              ..

              LABEL
              id | fk_cat | name
              4 | 3 | TITLE
              ..

              TEXT
              id | fk_label | fk_loc | text
              5 | 4 | 2 | Newsübersicht
              ..

              Übersetzungen werden dann z.B. so abgefragt: translate("NEWS_TITLE")
              Anhand des Kategorienamens (Label-Präfix, hier NEWS) wird die gesamte Kategorie in der eingestellten Sprache aus der DB bezogen und in die Session geschrieben. So halten sich die Datenbankabfragen in Grenzen.

              translate() ist bei uns ein ViewHelper
              kannst auch
              translate()->toDate(time()) oder // Mapping auf date(LOC.date_format, time())
              translate()->multi("NEWS_DELETE", array("item" => "Köhler dankt ab")) // "Wollen Sie die News #item# wirklich löschen?"
              translate()->toNumber(123456789.01); // 123.456.789,01
              translate("<script>alert('1')</script>")->toHtml(); // htmlspecialchars("<script>alert('1')</script>")
              translate("<script>alert('1')</script>")->toJs(); // <?php return "decodeURIComponent('" . rawurlencode("<script>alert('1')</script>") . "')" ?>
              usw.

              etc. benutzen, ist dann relativ billige Logik die das übernimmt.
              "Mein Name ist Lohse, ich kaufe hier ein."

              Kommentar


              • #8
                Ich mache das auch dateibasiert mit einem Array wie Du. Einziger Unterschied, ich halte die Daten in MS Excel. Spalte A => Array-Keys, B => Deutsch, C => Englisch usw.
                Ein Makro produziert dann mehrere fertige PHP-Files, die der Usersprache entsprechend inkludiert werden. Der Vorteil dieser Methode ist, dass Du ohne großes Hick-Hack die Exceldatei an einen Übersetzer schicken kannst, der dann noch Spalte D => Polnisch einfügt.
                Es ist schon alles gesagt. Nur noch nicht von allen.

                Kommentar


                • #9
                  Mit einer Datenbank und einer kleinen Importroutine für Excel/Csv geht das genauso gut
                  --

                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                  --

                  Kommentar


                  • #10
                    Zitat von nikosch Beitrag anzeigen
                    Mit einer Datenbank und einer kleinen Importroutine für Excel/Csv geht das genauso gut
                    Klar, weiß ich doch. Ist aber etwas aufwendiger. So exportier und importier ...
                    Es ist schon alles gesagt. Nur noch nicht von allen.

                    Kommentar


                    • #11
                      Zitat von Chriz Beitrag anzeigen
                      Anhand des Kategorienamens (Label-Präfix, hier NEWS) wird die gesamte Kategorie in der eingestellten Sprache aus der DB bezogen und in die Session geschrieben. So halten sich die Datenbankabfragen in Grenzen.
                      Keine gute Idee, das sind normalerweise keine benutzer-/sessionspezifischen Daten.
                      Und "in Grenzen" halten sich die Abfragen auch nicht wirklich - pro User mindestens eine plus die zig Filesystem-Requests um die Session zu lesen.
                      Pack das Ganze in einen Cache, der für alle User gilt, _das_ spart dann wirklich DB-Abfragen und lässt dem Filesystem die Möglichkeit, ein bisschen zu Cachen, weil immer die gleiche Datei abgefragt wird.
                      Wenn du super-performant werden möchtest nimm z.B. memcached.
                      VokeIT GmbH & Co. KG - VokeIT-oss @ github

                      Kommentar


                      • #12
                        Die einfachste Mathode (und eigentlich auch ziemlich effizient) ist es, die Strings einfach in Konstanten zu definieren und dann an den jeweiligen Stellen einzubinden.

                        Kommentar


                        • #13
                          Für ein großes Projekt halte ich das für keine Alternative. Es löst auch nur einen Teil der Frage - den der Darstellung. Wie man die Konstanten konfiguriert ist dann der andere Teil.
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar


                          • #14
                            Ich habe Mehrsprachigkeit meistens anhand von XML Dateien umgesetzt, die dann mithilfe von simpleXML eingelesen wurden und ausgwertet wurden.
                            Code:
                            <index.php>
                               <title>Hallo Welt</title>
                               <content>
                                   Hallo Welt
                               </content>
                            </index.php>

                            Dabei kannst du dann noch Expressions einführen... z. B. ersetze %username% immer mit dem usernamen des eingeloggten Benutzers. Z. B. Hallo %username%.


                            Bei Bildern könntest du den Text direkt mit PHP drauf zeichnen, oder ggf. einen neuen Ordner anlegen (images/de , images/en etc.)

                            Kommentar


                            • #15
                              XML ist eine der schlechtesten Ideen, da überaus inperformant.
                              VokeIT GmbH & Co. KG - VokeIT-oss @ github

                              Kommentar

                              Lädt...
                              X