hotti: Mehrsprachige Ausgaben aus Scripts

hi,

s. Thema. Es geht um Ausgaben, die in Script selbst notiert sind, wie machen das die Profis? Kontrollstrukturen im Script oder komplett mehrsprachige Scripts? Oder gibts noch andere Möglichkeiten?

Bitte mal um Hinweise,
Hotti

--
Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  1. hi,

    s. Thema. Es geht um Ausgaben, die in Script selbst notiert sind, wie machen das die Profis? Kontrollstrukturen im Script oder komplett mehrsprachige Scripts? Oder gibts noch andere Möglichkeiten?

    http://www.zfforum.de/links/4064-artikel-mehrsprachigkeit-mit-zend_application.html

    http://framework.zend.com/manual/de/zend.locale.functions.html

    mfg

    tami

    1. hi, danke,
      also thanks @dedlfix,

      s. Thema. Es geht um Ausgaben, die in Script selbst notiert sind, wie machen das die Profis? Kontrollstrukturen im Script oder komplett mehrsprachige Scripts? Oder gibts noch andere Möglichkeiten?

      http://www.zfforum.de/links/4064-artikel-mehrsprachigkeit-mit-zend_application.html

      http://framework.zend.com/manual/de/zend.locale.functions.html

      Die machen das viel zu kompliziert, mit meinem PHP/Perl Framework ist Mehrsprachigkeit an sich überhaupt kein Thema, das ist weit weg vom Code ;)

      Was bleibt, sind die Ausgaben, die ein Modul oder Script selbst tätigt, hier würden Übersetzungstabellen nur unnötig Speicher fressen, und am Ende soll je ohnehin nur _eine_ Response in _einer_ Sprache herauskommen. Überdiese muss ein Code ja auch ersteinmal kompiliert werden.... und wie oft haben wir vor vielen Jahren Matts Forum ins deutsche übersetzt ;?

      In diesem Sinne,
      viele Grüße!

  2. Tach!

    Es geht um Ausgaben, die in Script selbst notiert sind, wie machen das die Profis?

    Die suchen sich die reichlich vorhandene Literatur zum Thema und entscheiden sich dann aufgrund ihrer Anforderungen, was am besten zum Projekt passt. Vielleicht ist es gettext, vielleicht ein schnödes Array/Hash, vielleicht was ganz anderes.

    dedlfix.

  3. مرحبا

    s. Thema. Es geht um Ausgaben, die in Script selbst notiert sind, wie machen das die Profis? Kontrollstrukturen im Script oder komplett mehrsprachige Scripts? Oder gibts noch andere Möglichkeiten?

    Ich hab's bis jetzt immer mit einer Seperaten XML-Datei gelöst.

    Beispiel mit Fehlermeldungen für Fehlerseiten:

    <!-- I18N.xml -->  
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
    <msg>  
      
      <de><!-- Für jede Sprache einfach einen eigenen Block anlegen -->  
        <error>  
          <_401>  
            <status>401 Unauthorized</status>  
            <title>Error 401 - nicht autorisiert!</title>  
            <content>Authorisation erforderlich</content>  
          </_401>  
          <_404>  
            <status>404 Not Found</status>  
            <title>Error 404 - Seite nicht gefunden</title>  
            <content>Die gewünschte Seite konnte leider nicht gefunden werden.</content>  
          </_404>  
        </error>  
      </de>  
      
      <en>  
        <error>  
          <_401>  
            <status>401 Unauthorized</status>  
            <title>Error 401 - Unauthorized!</title>  
            <content>The request requires user authentication.</content>  
          </_401>  
      </en>  
      
    </msg>
    

    Und im Script:

    # XML-Datei laden  
    $msg = simplexml_load_file ('I18N.xml');  
      
    # Benutzen, wobei "de" und "_401" bei mir Dynamisch gesetzt werden, so dass ich auf alle Fehler reagieren kann, die ich brauche.  
    $_ERR = $msg->de->error->_401->status;  
    
    

    mfg

    1. @@Malcolm Beck´s:

      nuqneH

      Die XML-Struktur halte ich für suboptimal.

      <de><!-- Für jede Sprache einfach einen eigenen Block anlegen -->

      Ja, aber es sind doch gleichartige Blöcke. Das sollte sich in XML durch gleichartige Elemente widerspiegeln – unterschieden per Attribut:

      <version xml:lang="de">

      <_401>
              <status>401 Unauthorized</status>
              <title>Error 401 - nicht autorisiert!</title>
              <content>Authorisation erforderlich</content>
            </_401>

      Dito.

      <status statuscode="401">  
        <title xml:lang="en">401 Unauthorized</title>  
        <title>Authorisation erforderlich</title>  
        <content>Authorisation erforderlich</content>  
      </status>
      

      Qapla'

      --
      Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
      1. @@Gunnar Bittersmann:

        nuqneH

        <de><!-- Für jede Sprache einfach einen eigenen Block anlegen -->

        Vielleicht ist das aber auch gar nicht die beste Idee, sondern:

        <status statuscode="401">  
          <title xml:lang="en">Error 401 – Unauthorized</title>  
          <title xml:lang="de">Fehler 401 – nicht autorisiert</title>  
          <content xml:lang="de">Authorisation erforderlich.</content>  
          <content xml:lang="en">The request requires user authentication.</content>  
        </status>
        

        Qapla'

        --
        Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
        1. مرحبا

          <status statuscode="401">

          <title xml:lang="en">Error 401 – Unauthorized</title>
            <title xml:lang="de">Fehler 401 – nicht autorisiert</title>
            <content xml:lang="de">Authorisation erforderlich.</content>
            <content xml:lang="en">The request requires user authentication.</content>
          </status>

            
          Ich stimme dir Grundsätzlich zu, ich wollte es anfangs auch mit Attributen lösen. Allerdings benötigt es dann mehr als nur "[simplexml_load_file ()](http://php.net/manual/de/function.simplexml-load-file.php)", deswegen habe ich es ohne Attribute gelöst. Zumal meine gezeigte Variante auch im Script leichter zu handlen ist.  
            
          Die [XML](https://forum.selfhtml.org/?t=210667&m=1436965) bleibt gleich, dann braucht man nur den Zeiger auf die benötigte Sprache setzen, und kann dann auf alle Knoten zugreifen.  
            
          ~~~php
          # Sprache  
          $language = 'de';  
            
          # Ein Fehler ist aufgetreten (geht leider nicht ohne Unterstrich "_")  
          $status = '_401';  
            
          # XML laden und Sprache einstellen, um sicherzustellen, dass man immer auf die richtige Sprache zugreift  
          $msg = simplexml_load_file ('I18N.xml');  
          $msg = $msg->$language;  
            
          # Auf Knoten zugreifen  
          $_ERR = $msg->error->$status->title;
          

          Zwei Dinge stören mich hier nur, erstens, das ich bei der XML-Datei keine Zahl als Element nehmen kann. Also <401>...</401><!-- geht nicht -->. Das zweite ist, dass eine XML-Datei nicht so einfach geändert werden kann, wie wenn die Daten in der Datenbank stehen würden.
          Was ich sehr gut finde ist die Strikte trennung der Sprachen in einzelne Blöcke. Ich finde es
          Übersichtlicher, insbesondere wenn mehr als 3 - 4 Sprachen im Spiel sind.
          Man muss nur zusehen, dass alle Elemente in jeder Sprache da sind. Aber das muss man ja eh sicherstellen, von daher.

          mfg

          1. [latex]Mae  govannen![/latex]

            <status statuscode="401">

            <title xml:lang="en">Error 401 – Unauthorized</title>
              <title xml:lang="de">Fehler 401 – nicht autorisiert</title>
              <content xml:lang="de">Authorisation erforderlich.</content>
              <content xml:lang="en">The request requires user authentication.</content>
            </status>

              
            @Garak Bittersmann:  
            Sinn des Namespace? Für eine reine Konfigurationsdatei, die nur eingelesen und verarbeitet wird geht es auch ohne, oder gibt es relevante Nachteile?  
              
            
            > Ich stimme dir Grundsätzlich zu, ich wollte es anfangs auch mit Attributen lösen. Allerdings benötigt es dann mehr als nur "[simplexml_load_file ()](http://php.net/manual/de/function.simplexml-load-file.php)", deswegen habe ich es ohne Attribute gelöst.  
              
            Was ist das Problem? Ich nutze simplexml\_load\_file und lade damit problemlos XML incl. Attribute, allerdings ohne NS. Via [SimleXML xpath()](http://www.php.net/manual/de/simplexmlelement.xpath.php) lassen sich dann die passenden Elemente, die ein Attribut einer bestimmten Sprache besitzen, selektieren.  
              
            Stur lächeln und winken, Männer!  
            Kai
            
            -- 
            It all began when I went on a tour, hoping to find some furniture  
             Followed a sign saying "Beautiful Chest", led to a lady who showed me her best)  
            [SelfHTML-Forum-Stylesheet](http://selfhtml.knrs.de/#h_stylesheet)
            
            1. مرحبا

              Was ist das Problem? Ich nutze simplexml_load_file und lade damit problemlos XML incl. Attribute, allerdings ohne NS. Via SimleXML xpath() lassen sich dann die passenden Elemente, die ein Attribut einer bestimmten Sprache besitzen, selektieren.

              Was verstehst du unter Attributen? Wie selektierst du Attribute mit SimpleXML xpath()?

              <elm attribute="val"></elm>

              mfg

              1. [latex]Mae  govannen![/latex]

                Was ist das Problem? Ich nutze simplexml_load_file und lade damit problemlos XML incl. Attribute, allerdings ohne NS. Via SimleXML xpath() lassen sich dann die passenden Elemente, die ein Attribut einer bestimmten Sprache besitzen, selektieren.

                Wie selektierst du Attribute mit SimpleXML xpath()?

                Mit XPath-Syntax *g*

                Um Gunnars XML als Basis zu nehmen (erst mal ohne Namespace)

                foo.xml:

                <root>  
                  <status statuscode="401">  
                    <title lang="en">Error 401 – Unauthorized</title>  
                    <title lang="de">Fehler 401 – nicht autorisiert</title>  
                    <content lang="de">Authorisation erforderlich.</content>  
                    <content lang="en">The request requires user authentication.</content>  
                  </status>  
                  <status statuscode="403">  
                    <title lang="en">Error 403 – Forbidden</title>  
                    <title lang="de">Fehler 403 – Zugriff verweigert</title>  
                    <content lang="de">Blablubb laber laber.</content>  
                    <content lang="en">yet another crappy message</content>  
                  </status>  
                </root>
                
                $err = '403';  
                $lang = "de";  
                $xml = simplexml_load_file('foo.xml');  
                if ($xml) {  
                    $matching = $xml->xpath(sprintf(  
                       'status[@statuscode="%1$s"]/*[@lang="%2$s"]', // siehe unten  
                       $err,  
                       $lang  
                    ));  
                }
                

                in obigem Beispiel würde xpath() folgendes übergeben werden: 'status[@statuscode="403"]/*[@lang="de"]'

                Hier würde $matching sämtliche beliebigen Elemente (Selektor *) innerhalb <status statuscode="403"> enthalten (als Array von SimpleXML-Objekten), die das Attribut lang="de" besitzen:

                array(2) {
                  [0]=>
                  object(SimpleXMLElement)#5 (2) {
                    ["@attributes"]=>
                    array(1) {
                      ["lang"]=>
                      string(2) "de"
                    }
                    [0]=>
                    string(33) "Fehler 403 – Zugriff verweigert"
                  }
                  [1]=>
                  object(SimpleXMLElement)#3 (2) {
                    ["@attributes"]=>
                    array(1) {
                      ["lang"]=>
                      string(2) "de"
                    }
                    [0]=>
                    string(21) "Blablubb laber laber."
                  }
                }

                Stur lächeln und winken, Männer!
                Kai

                --
                It all began when I went on a tour, hoping to find some furniture
                 Followed a sign saying "Beautiful Chest", led to a lady who showed me her best)
                SelfHTML-Forum-Stylesheet
            2. @@Kai345:

              nuqneH

              @Garak Bittersmann:

              „Ich bin nur ein einfacher Schneider.“

              Sinn des Namespace? Für eine reine Konfigurationsdatei, die nur eingelesen und verarbeitet wird geht es auch ohne

              Es geht nicht ohne. Der XML-Namensraum ist da, ob man will oder nicht. Er muss nicht gesondert deklariert werden.*

              Das xml:lang-Attribut ist als auch einfach mal da. Da muss man kein neues erfinden.

              Qapla'

              * Kann aber. Dann muss als Namensraumname 'http://www.w3.org/XML/1998/namespace' angegeben werden.

              --
              Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
              1. Om nah hoo pez nyeetz, Gunnar Bittersmann!

                @Garak Bittersmann:

                „Ich bin nur ein einfacher Schneider.“

                Ja, obwohl ich Garak lange nicht mehr gesehen habe, fiel mir das auch sofort ein.

                Matthias

                --
                1/z ist kein Blatt Papier.

          2. @@Malcolm Beck´s:

            nuqneH

            Zumal meine gezeigte Variante auch im Script leichter zu handlen ist.

            Das halte ich für bedenklich, die XML-Struktur nicht anhand der Daten festzumachen, sondern anhand der gegenwärtig(!) gewünschten Weiterverarbeitung. Vielleicht willst du ja die Daten später mal anders verarbeiten. Eine vernünftige XML-Struktur (also nicht verschiedene Elementtypen für gleichartige Blöcke) zahlt sich dann aus.

            Qapla'

            --
            Wer möchte nicht lieber durch Glück dümmer als durch Schaden klüger werden? (Salvador Dalí)
    2. hi,

      s. Thema. Es geht um Ausgaben, die in Script selbst notiert sind, wie machen das die Profis? Kontrollstrukturen im Script oder komplett mehrsprachige Scripts? Oder gibts noch andere Möglichkeiten?

      Ich hab's bis jetzt immer mit einer Seperaten XML-Datei gelöst.

      Auch eine Möglichkeit, danke!

      Tatsächlich habe ich zwei Scripts, die mehrsprachig ausgeben müssen. Wenn es um schlanken Code geht, ists jedoch nicht ganz so glücklich, die Meldungen aller Sprachen in eine Datei zu tun (wenn ich 23 Übersetzer habe, die eine Datei bearbeiten sollen, würden die ja Schlange stehen müssen und wer weiß wass die dann fürn Mist reinschreiben, den dann jeder lesen kann ^^).

      Ne, die Idee mit einer Sprachdatei ist gut. Nämlich nur eine Datei, für die Meldungen in der jeweiligen Sprache. Wenn die Language-Negotiation auf 'en' fällt, wird die 'en'-Datei geladen. Ansonsten die 'fr', 'de', 'at-vorarlberg', 'by-oberpfalz' oder wie die alle heißen.

      Viele Grüße,
      Hotti