3 verschiedene Möglichkeiten für Multilanguages

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

  • 3 verschiedene Möglichkeiten für Multilanguages

    Hallo zusammen.

    Nach längerer Zeit melde ich mich hier auch mal wieder zu Wort. Ich muss
    gerade ein größeres Projekt planen, wo ich mal die fachmännische Erfahrung
    einiger User hier benötige.

    Es geht um ein System, das später in min. 13 Sprachen verfügbar sein wird.
    Das System ist keine Homepage in dem Sinne, sondern dient zum verwalten
    von (ich nenne es mal) Produkten. Diese Produkte haben eine vielzahl
    von Attributen! Es wird also in der Browser-Ansicht später große
    Tabellen geben, mit vielen Feld-Beschriftungen und Buttons,
    sowie Info-Texten zu den Eingabefeldern. Die müssen natürlich alle
    jeweils in der vom Benutzer gewählen Sprache erscheinen.

    Es geht jetzt um die Frage, welche der folgenden drei Varianten zur
    Mehrsprachigkeit dafür am geeignetsten ist.

    1) Array:
    Ein Array mit allen Beschriftungen für jede Sprache.
    Vorteil: Einfach zu handhaben bei der Entwicklung.
    Nachteil: Das Array muss bei jedem Aufruf neu initialisiert werden, und
    da es vermutlich sehr sehr groß wird, nimmt das viele Ressourcen weg.

    2) Datenbank mit Sprachen-Tabelle:
    Alle Beschriftungen stehen stehen in den jeweiligen Sprachen in
    einer Tabelle.
    Vorteil: Ist schneller als ein Array.
    Nachteil: Ich muss im gesamten Script immer ein Objekt mit dem Ergebnis
    der Tabellenabfrage für die ausgewählte Sprache mitschleifen und diese Variante
    ist sicherlich sehr umständlich bei der Entwicklung.

    3) i18n GetText:
    Binäre Sprachdateien
    Vorteil: Sehr einfach bei der Entwicklung und ist vermutlich die schnellste
    der hier vorgestellten Möglichkeiten.
    Nachteil: Ich habe gelesen, das PHP dafür auf dem jeweiligen System
    speziell kompiliert werden muss. Ist dies tatsächlich so, fällt die GetText
    Variante leider ins Wasser, da das System später auch auf Shared-Hosting
    Servern laufen soll. Kann dazu jemand was sagen?

    Frage an alle:
    welche der drei Möglichkeiten habt ihr für was für ein System schon
    mal eingesetzt und welche Erfahrungen habt ihr damit gemacht? Bzw.
    welche der Möglichkeiten würdet ihr favorisieren?

    Ich bin sehr gespannt auf eure Antworten.
    Vielen Dank, Gruß dek*


    Edit:
    Habe vergessen zu erwähnen, dass das System auf Apache- sowie
    IIS Webservern laufen können soll. Ich weiß nicht, ob das für die dritte
    Variante von Bedeutung ist. So wie ich das verstanden habe, arbeitet
    i18n sehr System nah, bzw. irgendwie über die Shell oder so!? Denn
    dann weiß ich auch nicht, wie man auf einem Shared-Hosting Webspace
    ein Tool wie das GNU xgettext installieren und ausführen soll...
    Zuletzt geändert von deklarmart; 20.10.2006, 12:42.
    GLORIA PERPETUA

  • #2
    eine mischung aus variante 1 und 2

    spezielle sprachdateien mit den allgemeinen bezeichungen (z.b. produkt, preis) in arrays
    produkte mit beschreibung, preis etc. in identisch benamten felder + sprachsuffix also produkt_de, produkt_en, produkt_fr, usw.

    dann wird eine globale variable mit entsprechenden suffix definiert, über die die sprachsteuerung lauft, z.b:
    PHP-Code:
    global $suffix;
    $suffix 'de';

    ....
    include (
    'lang/'.$suffix.'.inc.php'); 
    und die abfragen dann so:
    PHP-Code:
    $query='SELECT produkt_'.$suffix.' AS produkt FROM ...'
    hat sich als sehr flexible methode herausgestellt. ein code und zig sprachen.

    gruß
    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      und die abfragen dann so:
      PHP-Code:
      $query='SELECT produkt_'.$suffix.' AS produkt FROM ...'
      hat sich als sehr flexible methode herausgestellt. ein code und zig sprachen.
      du willst ihm doch nicht ernsthaft raten, für jede sprache eine eigene produkttabelle zu definieren. oder doch?
      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


      Kommentar


      • #4
        produkttabelle zu definieren
        nein, sprachfelder innerhalb einer tabelle

        gruß
        peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          und bei 13 sprachen hast du 13 spalten nur für den namen eines produktes? und wenn die beschreibung dann auch noch mit dabei ist, hast du noch einmal 13 beschreibungsfelder? udsw ...
          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


          Kommentar


          • #6
            @abraxax: Das läßt sich doch irgendwie gar nicht vermeiden?! Wenn man den Namen eines Produktes in 13 Sprachen ausgeben muß, dann muß man diese 13 Namen auch irgendwo gespeichert haben. Ob das nun in 13 Dateien, 13 Datenbanken, 13 Tabellen oder 13 Feldern ist, ist eine Frage für sich. Aber 13 Namen z.B. serialized in 1 Feld oder 1 Datei zu schreiben ist sicher nicht der Königsweg.

            Die Sprachen auf eigene Datenbanken aufzuteilen, könnte performanter sein und vom Code her ist es ziemlich egal, ob man
            SELECT ... FROM table_$lang ...
            oder
            SELECT col_$lang FROM table ...
            schreibt. Da Preise ja auch von Land zu Land unterschiedlich sind, ist das kein Problem, lediglich wenn Bestellnummern oder sowas überall gleich sind, muß man aufpassen, alles schon synchron zu halten. In diesem Fall würde ich diesen Weg nicht gehen.

            Kommentar


            • #7
              Hi,
              grundsätzlich geb ich onemornerd recht. Den nachteil den ich aber
              grundsätzlich bei der 13-column-methode sehe ist die erweiterbarkeit.
              Kommt eine sprache hinzu muss eine neue spalte angelegt werden.
              Das skaliert schlecht.

              Wenn ich von vornherein weiss dass die anwendung multilingual
              sein soll, dann lege ich immer eine eigene tabelle bzw. zwei.

              Code:
              language
              id|name
              
              item
              id|name_id
              
              language_text
              foreign_id|lang_id|text
              Der query sieht dann so aus.
              Code:
              "SELECT * FROM item
                       INNER JOIN language_text AS name_text ON (name_text.foreign_id = item.name_id AND name_text.lang_id = {$lang_id})";
              $lang_id wird einmalig abhängig vom benutzter selected und dann
              in der session gespeichert.
              Meistens cache ich dann die ergebnisse damit sie bei häufiger
              verwendung schnell da sind.
              Nachteil dieses vorgehens sind riesige joins wenn man viele
              textbausteine internationalisieren muss.

              greets
              (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

              Kommentar


              • #8
                zu gettext:

                für jede sprache musst eine mo und eine po (afaik) generiert werden. das passiert direkt auf dem system ist also nicht für shared server gedacht.

                da gibts so ein fw. prado, die haben ne ähnliche technik im einsatz (imho auch für shared geeignet). kannst dir das ja mal ansehen.
                MfG
                aim
                Lies mich jetzt!
                - OT-Tags-Liebhaber und BB-Code-Einrücker -

                Kommentar


                • #9
                  ich habe ähnlich wie @closure geschrieben hat eine mehrsprachige seite mal Aufgebaut.

                  um auf einer Seite mehrere selects zu vermeiden, habe ich zusätzlich eine Tabelle "Seite" aufgebaut

                  Tabelle Seite
                  seiten_id: primary key
                  begriff_id: id von dem Text, der in mehreren Sprache übersetzt ist
                  assign: platzhalter für die Template z.b.s CONTENT oder HEADER

                  dadurch könnte ich mit einem query erst alle Inhalte bekommen

                  select Seite.assign, Begriff.text from Seite INNER JOIN Begriff on
                  Seite.begriff_id= Begriff.begriff_id INNER JOIN Sprache
                  ON Begriff.sprache_id=Sprache.sprache_id
                  WHERE Seite.seiten_id=$aktueleseite
                  and
                  Sprache.sprach_kurz = '$sprache'

                  und bei auslesen mit misql_query
                  könnte ich direkt die Template initialisieren.
                  PHP-Code:
                  while($erg=mysql_fetch_array($handle)){
                  $templ->assign($erg['assign'],$erg['text']);

                  hoffentlich kannst du das auch irgendwie benutzen.
                  Slava
                  bituniverse.com

                  Kommentar


                  • #10
                    Original geschrieben von closure
                    Wenn ich von vornherein weiss dass die anwendung multilingual
                    sein soll, dann lege ich immer eine eigene tabelle bzw. zwei.

                    ich hab zwar keine großen Erfahrungen, aber die lösung mit der tabelle für jede sprache ist bei uns auch im einsatz (großes motorsportportal)

                    denn die passenden scripte also querys usw lassen sich sehr leicht
                    erstellen..bsp sind ja schon hier im thread : tabelle_$language

                    so ist das erweitern immer sehr leicht, per knopdruck lassen sich alle tabellen generieren, falls eine neue sprache benötigt wird.
                    dabei werden auch gleich excel-dateien erzeugt fürs übersetzungsbüro.

                    damit bei uns nicht immer der komplette datensatz einer sprachtabelle geladen wird, haben alle texte nen content key, der bei dem select query der jeweiligen seite mit übergeben wird :where content=trulli

                    Kommentar


                    • #11
                      @onemorenerd
                      die lösung / der lösungsansatz von closure ist sicherlich der bessere weg für eine multilanguage-fähigkeit.

                      um sich joins für ein großes aufkommen an seitenanfragen zu umgehen kann man sicherlich auch mit (einer) temporären tabelle(n) arbeiten ....

                      aber für jede sprache eigene tabellen oder spalten in tabellen zu definieren, halte ich für nicht klug.
                      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                      Kommentar


                      • #12
                        Danke zunächst für die Antworten. Vielleicht habe ich es nicht genau genug
                        formuliert. Also, für den Produktnamen haben wir in der Tablle tatsächlich
                        mehrere Felder jeweils in anderen sprachen.
                        PHP-Code:
                        produktname_deproduktname_enproduktname_fr, ... 
                        usw. Genauso bei den Beschreibungen. Es ist zwar (wie hier auch gesagt
                        wurde) nicht so gut skalierbar, aber das ist (laut Projekt-Team) in Ordnung so.
                        Das nehmen wir bitte als gegeben hin, egal ob sinnig oder unsinnig

                        Was jetzt genau meine Frage war, ist folgendes:

                        Ein Benutzer soll nun das Produkt in seiner Sprache angezeigt bekommen.
                        Er hat zB englisch ausgewählt. Die Abfrage macht nun folgendes:
                        PHP-Code:
                        $lang 'en';
                        "SELECT produktname_$lang, besch_$lang FROM produkte..." 
                        soweit ok! So, jetzt kommt mein Problem: es wird auf einer HTML Seite
                        angezeigt:


                        PHP-Code:
                        Helloyou selected this product:<br />
                        <
                        b>Product-Name:</b> {hier produktname in englisch aus der DB (produktname_en)}
                        <
                        b>Product-Description:</b> {hier die beschreibung aus der DB (besch_en)}
                        <
                        input type="submit" value="save" />
                        <
                        input type="submit" value="edit" /> 
                        Oder das ganze wenn deutsch ausgewählt ist:

                        PHP-Code:
                        Hallosie haben folgendes Produkt ausgewählt:<br />
                        <
                        b>Produkt-Name:</b> {hier produktname in deutsch aus der DB (produktname_de)}
                        <
                        b>Produkt-Beschreibung:</b> {hier die beschreibung aus der DB (besch_de)}
                        <
                        input type="submit" value="speichern" />
                        <
                        input type="submit" value="bearbeiten" /> 
                        Ist es deutlicher was ich meine? Es geht um die vielen vielen Beschriftungen,
                        Überschriften, Bezeichnungsfelder, Infofelder, Button-Beschriftungen usw.
                        Die ändern sich ja im Grunde nie! Müssen aber in der jeweiligen Sprache
                        erscheinen. Und da war die Frage, wie man soetwas löst.
                        Zuletzt geändert von deklarmart; 22.10.2006, 18:59.
                        GLORIA PERPETUA

                        Kommentar


                        • #13
                          Original geschrieben von deklarmart
                          Danke zunächst für die Antworten. Vielleicht habe ich es nicht genau genug
                          formuliert.......
                          Und da war die Frage, wie man soetwas löst.
                          also ab jetzt verstehe ich nicht mehr was du wirklich willst
                          Slava
                          bituniverse.com

                          Kommentar


                          • #14
                            Original geschrieben von Slava
                            also ab jetzt verstehe ich nicht mehr was du wirklich willst
                            OK, nochmal das ganze

                            Also angenommen du kannst NUR russisch und KEIN deutsch. Du hast
                            dann natürlich russisch als deine Sprache ausgewählt. Die Produkt-Daten
                            werden also auf russisch aus der DB geholt. Nun werden die Daten dir
                            im Browser angezeigt und dort steht folgendes:

                            Hallo, Sie haben folgendes Produkt ausgewählt:
                            Produktname: ме-ньше знаешь
                            Produktbeschreibung: спишьлучше тем спишьспишь луч ше спишь


                            (Die russischen Zeichen habe ich dir mal aus deiner Signatur geklaut^^)
                            Du kannst wie gesagt kein deutsch, bekommst das aber nun so angezeigt
                            wie eben verdeutlicht. Kannst du damit was anfangen? Nein, weil du ja
                            den deutschen Satz "Hallo, Sie haben folgendes Produkt ausgewählt:"
                            gar nicht verstehen würdest, genausowenig wie das deutsche Wort "Produktname".
                            Diese Wörter und Sätze müssen also genauso in alle 13 Sprachen übersetzt
                            werden, und DAS ist genau die Frage, also wie man das macht!

                            Am Ende sollte es dann für dich so aussehen:

                            Создайте, свой онлайн-дневник Бесплатные блоги и личн:
                            платные: ме-ньше знаешь
                            рубрикантерн:спишьлучше тем спишьспишь луч ше спишь


                            Ich weiß nicht wie ich es noch verständlicher
                            erklären soll, aber ich hoffe mal, das du jetzt weißt was ich meine.
                            GLORIA PERPETUA

                            Kommentar


                            • #15
                              Und warum willst du diese sprachabhängigen Daten jetzt im PHP-Code oder Datenbank ablegen?

                              Ich würde sagen, du möchtest deine Templates in x verschiedenen Sprachversionen anlegen.
                              Dann pack doch die Templates in einen Unterordner mit Sprachbezeichnung, oder nehme sie in die Dateinamen mit auf.
                              I don't believe in rebirth. Actually, I never did in my whole lives.

                              Kommentar

                              Lädt...
                              X