Mehrsprachigkeit

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

  • Mehrsprachigkeit

    Tach

    Wie macht ihr denn so eure mehrsprachigen Seiten?

    Ich habe mir in meinem jugendlichen Leichtsinn gedacht, ich könnte es ja so machen
    Code:
    <head>
      <title>Titel, nicht zu übersetzen, für alle gleich</title>
    </head>
    <body>
      <h1>{translate}headline_main{/translate}</h1>
      <p>{translate}database queries{/translate}</p>
    </body>
    PHP-Code:
    function replace_language_blocks($tpl_src) {
      
    preg_replace('%\{translate\}(.*)\{/translate\}%Ue'
      
    'isset($_SESSION["phrases"][strtoupper("$1")][$_SESSION["language"]) 
        ?
           $_SESSION["phrases"][strtoupper("$1")][$_SESSION["language"] 
        : 
      "$1"'

      
    $tpl_src);

    Code:
    Array
    (
      [phrases] => Array
      (
        [HEADLINE_MAIN] => Array
        (
          [de] => Hauptüberschrift
          [en] => main headline
        )
    
        [DATABASE QUERIES] => Array
        (
          [de] => An der Erstellung der Seite war(en) 
                  {query_count} Datenbankabfrage(n) maßgeblich beteiligt.
          [en] => The page was generated with the help 
                  of {query_count} database query/queries.
        )
      )
      [language] => de
    )
    Die Funktion wird automatisch von der Template-Engine aufgerufen, ersetzt die sprachabhängigen Teile und danach erfolgt das eigentliche Parsen, bei dem z. B. {query-count} durch den entsprechenden Wert ersetzt wird.

    Die Textbausteine habe ich in der Session, damit ich sie nicht jedesmal neu auslesen muss. Das passiert nur dann, wenn ich auch effektiv prüfe, ob der Benutzer eingeloggt ist (nicht bei jedem Request sondern nur alle x Minuten)

    Oder ist die Idee schwachsinig?
    Ich denke, also bin ich. - Einige sind trotzdem...

  • #2
    finde den ansatz nicht schlecht, warum aber in der session?

    Kommentar


    • #3
      Weil Sein Server grosse Platten hat ... und es Ihm nicht darauf ankommt wie lange PHP braucht um die Session-Datei zu lesen ...
      carpe noctem

      [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
      [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

      Kommentar


      • #4
        Ich habe es bei mir genauso gelöst (bis auf die Sache mit der Session).
        Allerdings habe ich pro Sprache eine eigene Sprachdatei bzw. einen Sprachordner, in dem die Sprachdatei und sprachabhängige Bilder liegen.

        Ich finde Deinen Ansatz also absolut nicht schwachsinnig - im Gegenteil. Meiner Meinung nach ist es der flexibelste Ansatz, da das eigentliche Parsen erst nach der SprachFunktion kommt und man somit auch Satzbau etc. umstellen kann.
        Einziger Nachteil dabei ist, dass man beim Editieren einer Sprache auf die Platzhalter achten muß, die später durch die TemplateFunktion ersetzt werden und am Besten schon wissen sollte, was in diesen später drinsteht.
        In der Praxis hatte ich damit aber noch nie Probleme.

        Kommentar


        • #5
          Original geschrieben von goth
          Weil Sein Server grosse Platten hat
          ja

          und es Ihm nicht darauf ankommt wie lange PHP braucht um die Session-Datei zu lesen
          habe noch nicht getestet, ob es schneller geht, wenn ich die sprachabhängigen einträge jedesmal aufs neue aus der datenbank lese

          und außer datenbank oder datei fällt mir nix ein
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            Ist natürlich die Frage ob es sinnvoller ist jedes Mal alle Resourcen über eine Session einzulesen ... oder nur die die man Benötigt aus einer Datenbank ...

            ... genaugenommen habe ich auch nicht die perfekte Lösung zur Hand ... alleine weil ich noch keine Performance Tests gemacht habe ...

            Ich persönlich sauge die Resourcen über eine Klasse ... vorteil: ... ich kann bei Bedarf 'ne, für einzelne Seiten zusammenfassende Caching-Funktion implementieren ... Textersatz erfolgt einfach via Prefixes z.B. {text_VARIABLENNAME} ...

            Ist zunächst ein vorläufiges Konzept ...

            Anders z.B. bei MySQLdiff welches einfache Resource-Files verwendet ... geht aber auch nur weil's wenige Resourcen gibt ... und das Tool ein orginäres PHP-Konzept verwendet (ohne Templates) ...
            carpe noctem

            [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
            [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

            Kommentar


            • #7
              Ich benutze für jede sprache ein eigenes template.

              bei mir ist bzw. war es aber auch so, dass ich das deutsche template erstellt habe und eine übersetzerin hat das template dann übersetzt.

              und ich lade das template z.B. so :

              $template_klasse->parse_funtkion('datei_'.$_SESSION['datei'].'.tpl');


              An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

              Kommentar


              • #8
                [ ] Ja Max, eine gute Möglichkeit, die sich in der Praxis bewährt hat
                [ ] Nein, Das is viel zu langsam
                [ ] Nein, zu aufwendig
                [ ] Nein, zu unsicher
                [ ] Nein, (Grund hier eintragen)


                An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

                Kommentar


                • #9
                  OffTopic:
                  Liebst du mich? (bitte ankreuzen)
                  [ ] Ja
                  [ ] Nein
                  [ ] Vielleicht

                  :P

                  Ich habs auch mal mit verschiedenen Templates umgesetzt, finde es aber verglichen mit mrhapiness' Ansatz unflexibler, redundanter und aufwendiger.
                  Ausserdem dürfte es leichter zu administrieren sein.


                  mrhapiness:
                  Die Frage ist ob du die Wörter hardcoden willst und vom code aus direkt in die Session packst (unflexibel, redundant?),
                  oder
                  die Wörter in die db verlagerst und erst dann in das Skript lädst, wobei du sie in einer normalen Variable speicherst.

                  die Benutzung von sessions an der Stelle halte ich für absolut unsinnig.
                  Das Herausholen der benötigten Daten aus der db könnte so aussehen:
                  - hole alle Platzhalter für translate und speichere sie z.b. in einem array
                  - wähle alle benötigten Datensätze aus (anhand des arrays), in einer query
                  - ersetze die Platzhalter

                  in der query kommt dann z.B. eine $language Variable zum Einsatz mittels derer die Sprache bestimmt wird.

                  Kommentar


                  • #10
                    ich hab's jetzt so gelöst:
                    • Es gibt die Standardtemplates, in denen die {translate} Sachen stehen
                    • Es gibt für jede Sprache einen Unterordner (de, en, es, fr, ...)
                    • Bei einer Änderung des Standardtemplates werden die sprachabhängigen Templates automatisch gelöscht
                    • Bei einer Online-Änderung einer "Phrase", beim Import von Sprachdateien oder beim Online-Hinzufügen neuer "Phrasen" werden die Standardtemplates gesucht, in denen die Phrase vorkommt und die entsprechenden Templates aus dem/den betroffenen Sprachordner(n) (Wenn ich die englische Übersetzung ändere, kümmert das das französische Template ja nicht) werden gelöscht
                    • Der Enginge gebe ich die Sprache mit (steht in der Session), die damit zum Teil des Templatepfads wird und sie kümmert sich dann dadrum, dass benötigte, aber nicht vorhandene Templates, angelegt werden


                    So muss ich die sprachabhängigen Bestandteile nur dann laden, wenn sie sich geändert haben, kann mehrere Sprachen verwenden und Änderungen wirken sich automatisch aus.

                    Ist, finde ich, eine gute Idee, da ich nicht wie bisher immer die Sprachdaten laden muss und ja: Ich würde es als Mischung aus meiner Idee und MaxP0W3Rs Variante bezeichnen.
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar


                    • #11
                      guude,

                      hier muß ich doch noch mal einsteigen, zu diesem thread. ich steh jetzt ebenfalls vor dem mulitlingualen problem und die methode von mrhappiness sieht vielversprechend aus fragt sich nur was er dür ne template engine benutzt bzw. wie ich das nachbauen kann. wenn er mal so gnädig wäre sich dazu noch mal zu äüssern

                      Kommentar


                      • #12
                        er ist so gnädig.

                        er lässt dir ausrichten, dass er seine eigene templateengine benutzt, die aber unverkäuflich und closed source ist.

                        bei konkreten fragen hilft er dir aber gerne weiter *g*
                        Zuletzt geändert von mrhappiness; 15.06.2005, 22:13.
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Kommentar


                        • #13
                          Hallo

                          Da habe ich auch noch einige Fragen dazu. Zuerst möchte ich aber noch einmal in eigenen Worten rekapitulieren wie du vorgehst:

                          Du hast Masterdateien (Standardtemplate) in deinem Verzeichnis.
                          • index.php
                          • map.php
                          • usw.


                          die mit {translate} "bestückt" sind. Den Text zwischen {translate} ersetzt du mit einer Funktion, die ihre Werte aus einem Array erhält.

                          Außerdem hast du in Unterverzeichnissen die Sprache gespeichert. Speicherst du alle zu übersetzenden Elemente in einer Datei, oder hast du für jedes Template eine Datei, wie unten in der Liste angedeutet?
                          • index.tpl
                          • map.tpl
                          • usw.


                          Wenn du ein Template mit Sprache bestückst, geschieht dies mit ob_start, ob_get_content und dann turnst du mit deinem preg_replace durch den gepufferten Inhalt, oder verwendest du eine andere Methode?

                          Wie speicherst du den Text in den Sprachdateien? erzeugst du einen assoziativen Array im Stil Elementid => 'Text in Sprache' oder verwendest du eine andere Methode? Die Array - Methode hast du mit deiner Sessionvariable schon angedeutet, mir ist aber nach deinem späteren Resumée nicht ganz klar, wie du es jetzt handhabst.

                          Jetzt noch was Banales . Wie erzeugst du deine Schlüssel zwischen {translate} - Blöcken. Gehst du pro Datei einfach numerisch durch oder verwendest du Schlüsselworte, die den Inhalt des zu übersetzenden Textes charakterisieren. Gerade bei Listen und Textabsätzen fällt es mir schwer, da einen Bezeichner zu finden. Wenn ich die Dinge einfach durchnumeriere, ist die Reihenfolge der Numerierung hin, wenn ich etwas dazwischenfüge und einen assoziativen Bezeichner zu finden (was bei der Zuordnung hilft) fällt mir da nicht minder leicht.

                          Ach und noch eine Frage. Wie handhabst du Sprache in Klassen? Ich habe mir überlegt, in meiner Klasse für jeden erzeugten Text eine Eigenschaft zu erzeugen, z.B.

                          PHP-Code:
                          class foo {
                              
                          $headerdbresult 'Ergebnis';

                            function 
                          ret(){
                              return 
                          '<h3>'.$this->headerdbresult.'</h3>';
                           }

                          Für eine multilinguale Klasse wollte ich dann mittels Vererbung die Texte überschreiben mit den Templates der Texte

                          PHP-Code:
                          $headerdbresult '{translate}header_db_result{/translate}'
                          und dann analog zu den Standardtemplates verfahren. Bzw. wenn man Outputbuffering benutzt, geschieht das ja dann automatisch, da die Rückgabewerte der Klasse im Output erscheinen.
                          Grüße aus Luxemburg
                          Zuletzt geändert von frabron; 16.08.2005, 13:32.

                          Kommentar


                          • #14
                            Momentan handhabe ich es so, dass ich meine Templates in PHP-Skripte umwandle und diese abspeichere.

                            index.tpl wird also zu index.tpl.de.php und ggf. auch zu index.tpl.en.php, ...

                            Ist als Sprache französisch gewünscht, greife ich auf index.tpl.fr.php zu.
                            Gibt es diese Datei noch nicht, lese ich das Template index.tpl und jage es durch meine Templateengine.
                            Der Engine habe ich vorher gesagt, dass sie die Funktion translate mit dem Inhalt des Templates aufrufen soll und zwar bevor das Template selbst geparsed wird.

                            Resultat:
                            - Templateengine liest index.tpl in $content
                            - Inhalt von $content = <p>{translate}scheisse{/translate}^{$count}</p>
                            - Aufruf von translate
                            - Inhalt von $content = <p>merde^{$count}</p>
                            - Parsen von $content
                            - Speichern als index.tpl.fr.php
                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • #15
                              Deine Vorgehensweise, die fertigen Templates abzuspeichern, entlastet den Server natürlich ungemein, da nur noch bei Bedarf übersetzt werden muss.

                              Im Groben ist mir nun klar was du machst, doch ist mir nicht ganz klar, was du beim "parsen" machst. Bezieht sich das Parsen auf die Stelle {$count} in deinem Beispiel? Diesen Teil verstehe ich nämlich nicht so ganz

                              Die .tpl Datei ist sozusagen der Rahmen einer Seite, bereinigt vom Inhalt, aber mit HTML und PHP Teilen. In speziellen Sprachdateien wird der Inhalt vorgehalten. Beides zusammen ergibt die komplette Seite die im Browser angezeigt werden kann. Diese wird dann als index.de.php gespeichert.

                              Anfänglich hatte ich deine Methode so verstanden, dass du Rahmen und Inhalt zusammen abspeicherst und anbietest. Ändert sich die .tpl - Datei oder ist das zusammengesetzte Konstrukt nicht vorhanden, wird neu übersetzt aus Rahmen und Inhalt. Doch da passt die Sache mit dem parsen nun nicht herein. Bedeutet {$count} nun, dass du deinen PHP - Code in deinem Template schon in irgendeiner Form aufbereitet speicherst?

                              Und wie gehst du mit den Rückgaben von Funktionen und Klassen um, die ja dynamisch Ausgaben Daten zurückgeben?


                              Nachtrag: Die Such macht Kluch

                              Hab eben deinen Thread
                              über Templates gefunden. Ich denke, ich verstehe jetzt, woher das {$count} kommt.
                              Zuletzt geändert von frabron; 16.08.2005, 14:54.

                              Kommentar

                              Lädt...
                              X