Mehrsprachigkeit Front + Backend

  • Hiho liebe Community,

    ich hab' mal wieder 'ne Frage.
    Ich hab' 'n kleines CMS, indem man Seiten & news verfassen kann. Diese werden dann, welch' ein Wunder xD, im Frontend angezeigt.

    Nun meine kurz Frage.
    Ich würde gerne mhersprachigkeit in's CMS "bauen"...nur weiß ich noch nicht so Recht, wie ich das anstellen soll.
    Reicht's denn, zwei Button zu machen ( z.B. deutsche & englische Flagge) und wenn man auf den Deutschen Button klickt, laden Sich die deutschen Inhalte & auf den Englischen, den Englischen Button?

    Ich bräuchte ja, theoretisch, nur eine "Sprache" Tabelle in der DB in der, bsp, SpracheID 1 gleich Deutsch und SpracheID 2 gliech Englisch ist?!

    Im Frontend könnte man das ja dann so ähnlich lösen, oder?

    Wenn du im Recht bist, kannst du dir leisten, die Ruhe zu bewahren; und wenn du im Unrecht bist, kannst du dir nicht leisten, sie zu verlieren.
    __________________________________________
    Software design is hard, and we need all the help we can get.
    – Bjarne Stroustrup

  • :D Probieren geht ueber studieren :D
    Aber vom prinzip her muesste das so funktionieren

  • :D Probieren geht ueber studieren :D
    Aber vom prinzip her muesste das so funktionieren



    Hätte ja sein können, dass jemand 'ne "elegantere Lösung" hat ;) bzw. 'nen anderen Vorschlag...bei google findet man zwar auch ein bisschen...das meiste is' aber schon 2 Jahre oder länger alt.

    Wenn du im Recht bist, kannst du dir leisten, die Ruhe zu bewahren; und wenn du im Unrecht bist, kannst du dir nicht leisten, sie zu verlieren.
    __________________________________________
    Software design is hard, and we need all the help we can get.
    – Bjarne Stroustrup

  • Ich hab das ganze so geregelt:

    Ich habe mir vor langer Zeit mal ein Template-System programmiert, das seitdem beständig wächst.
    Im Verzeichnis "templates" sind jeher meine HTML-Quellcodes mit Platzhaltern drin.

    Jetzt habe ich den Inhalt dieses Verzeichnisses in ein Verzeichnis "templates/de" verschoben, kopiert und zu "templates/en" umbenannt,

    Bei einem Seitenaufruf prüfe ich, ob der Cookie "language" gesetzt ist und welchen Wert er enthält.
    Existiert er nicht, frage ich die Browsersprache ab und entscheide, ob DE oder EN verwendet wird.
    Danach kann ich die richtigen HTML-Codes laden und verarbeiten.

    Der Nachteil an meinem System: Unnötige Redundanz - Ich muss bei Änderungen oft zwei Dateien umstellen.
    Die Vorteile an meinem System: Ich kann die deutsche Version unabhängig von der englischen Version bearbeiten. Und was für mich viel wichtiger ist: Ich kann meinen Content weiterhin erstellen, wie vorher. Ich muss nicht ständig in die Datenbank eintragen und dann die Platzhalter richtig setzen, sodass die richtigen Werte ausgelesen werden, sondern kann meinen Text direkt in den HTML-Code schreiben.

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Ich dachte mir das so, dass ich erstmal im Backend abfrage, welche Sprache, bzw. welche Flagge aktiv ist.
    Wenn Flagge "DE" Aktiv is', sollen alle Inhalte, die die SprachID 1, für "DE", haben, ausgelesen werden & wenn die Flagge "EN" Aktiv ist, sollen einfach alle Inhalte, die die SprachID 2, für "EN",ausgelesen werden.

    Im Frontend, so denke ich jedenfalls, reicht es ja, wenn man z.B. Deutsch auf Standard setzt..wenn man dann auf die Englische Flagge klickst sollen sich einfach die Englischen Inhalte laden.
    ...da ich ja die Inhalte, aus dem Backend, auch durch Platzhalter in's Frontend bringe, reicht's ja eigentl. wenn ich die Platzhalten dann wechseln lasse oder?!

    Wenn du im Recht bist, kannst du dir leisten, die Ruhe zu bewahren; und wenn du im Unrecht bist, kannst du dir nicht leisten, sie zu verlieren.
    __________________________________________
    Software design is hard, and we need all the help we can get.
    – Bjarne Stroustrup

  • Ich habe mir fuer diesen zweck eine Klasse geschrieben - jedoch basiert die uf datein und nich auf einer Datenbank aus den folgenden gruenden:
    - Ueber die datenbank braucht as vieel laenger, da viele elemente pro seitenaufruf geladen werden muessen
    - unnoetger stress fuer die datenbank.

    Ich bin mom. nicht daheim, mal sehen ob ich an den Quellcode rankomme ;)

    Sry, dass der jetzt ein wenig unformatiert ist, bin anders nicht drangekommen...
    Die Dateien, aus denen diese Klasse liest sind wie folgt aufgebaut:

    Code
    schluessel|beschriftung|beschriftung
    schluessel2|beschr|foobar
    blabla|blub|--blub--


    Der "schluessel' ist die Zeichenkette, ueber die du den entsprechenden text in der entsprechenden sprache abfraegst. Die beschriftungen sind die tete in verschiedenen sprachen. z.B.
    wellcome_text|Willkommen|Wellcome

    Der Konstruktor kann ohne argumente aufgerufen werden, dann sollten die dateien wie folgt aufgebaut sein:

    Code
    schluessel|englisch|deutsch|franzoesisch


    Oder mit einem Argument, ein Array, dass die Reihenfolde der "Sprachen" in den Dateien beschreibt, also z.B.

    PHP
    $l=new language(array("de", "en", "es"));
    // Deutsch|Englisch|Spanisch


    Oder mit 2 Argumenten, das erste wieder das Array, das zweite ein String (sollte im Array sein), dass den Standard darstellt.

    Nach dem Konstruktor kannst du noch

    PHP
    $l->enableGET();
    // und
    $l->enableSES();
    // aufrufen, um die Sprache nicht aus dem $_SERVER['HTTP_ACCEPT_LANGUAGE'] sondern
    // aus $_GET bzw $_SESSION auszulesen. Dazu benutzt die klasse standardmaesig den key
    // "lang", also $_GET['lang'] / $_SESSION['lang'], das laesst sich aber durch
    $l->setSESkey{"foobar");
    // und
    $l->setGETkey("foobar");
    // aendern


    Um nun eine Datei zu laden benutzt du $l->load("pfad/zur/datei.txt");
    Wenn die fehler hat, wird die entsprechende zeile einfach ignoriert.
    Im PHP-Code benutzt du dann
    $l->get("wellcome_text");
    Und entsprechend gibt die Funktion "Willkommen" oder "Wellcome" zurueck.

    Ich hoffe das hilft dir ;)

    EDIT:
    Ich hab den quelltext jetzt mit leerzeilen und im anhang ist noch eine java-anwendung, mit der du die dateien bequemer editieren kannst als mit nem normalen notepad.LanguageFileEditor.jar.zip

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

    4 Mal editiert, zuletzt von Tobse (24. Dezember 2010 um 07:09)

  • Zitat


    Ich habe mir fuer diesen zweck eine Klasse geschrieben - jedoch basiert die uf datein und nich auf einer Datenbank aus den folgenden gruenden:
    - Ueber die datenbank braucht as vieel laenger, da viele elemente pro seitenaufruf geladen werden muessen
    - unnoetger stress fuer die datenbank.

    - Was du mit Dateien erledigen kannst, kannst du auch mit einer DB machen. Ansonsten ist es nicht wirklich langsamer, wenn du in der DB die selbse Struktur wie im File-Sys verwendest.
    - Man stresst die DB überhaupt nicht, wenn man ein vernünftiges caching hat. Zugegeben, ist ein extra Aufwand (bringt imo aber genug Vorteile - oder man benutzt gleich ein Framework bei dem das intergriert ist ;) ).

  • Angenommen, die methode get(String key) saehe so aus:


    Dann glaub ich nicht, dass das kuerzer ist, als es aus einem array rauszuhohlen, dass aus einer datei entstanden ist. Zumal, soweit ich weis, php dateien auch cached.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Natürlich wird da nur ein Query abgesetzt und nicht pro Key einer

    Schau dir mal von Frameworks Mehrsprachigkeitssysteme an

    Ich verwende auch Mehrsprachigkeit auf Fileebene, aber nicht so wie du ;)

  • Und wie machst du das auf fileebene? Wuerde man eine Tabelle fuer alle Texte anlegen, dann braeuchte man noch zusaetslich eine spalte, um zu speichern, auf welcher seite die angezeigt werden, also

    Code
    schluessel|page (primary)|englisch|deutsch


    und dann im konstruktor das dann damit abfragen:

    PHP
    "SELECT schluessel, english FROM language_items WHERE page='CURRENT_PAGE'"


    Was aber, wenn ein text fuer mehrere bereiche verfuegbar sein soll? Doppelt eintragen ist da wohl ein no-go. Im Dateisystem kann man einfach alle dateien laden, die man braucht und spart sich die page-spalte.

    P.S.: Ich habe das nur so ausgefuehrt, um dem TS die Moeglichkeit aufzuzeigen.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • So ist es bei mir Aufgeteilt:

    Erkennen welche Sprache (wenn nicht in Cookie)

    Dann wird eine allgemeine Datei geladen in der häufig verwendetet Begriffe drin sind wie zb "Hallo", "Login", etc..

    Zusätzlich eine Controllerspezifische Languagedatei in der zb die größeren Texte (wenn nicht aus DB) oder eben spezielle Phrasen benötigt werden

    Dh ich habe eine en-allgemeine.mo (.php/csv wie man möchte) und eine zb en-profil.mo

    Aufgebaut sind sie bei mir aus einem Array key => Wert:

    hello => 'Hallo'
    nice day => 'Schöner Tag'


    In der Datenbank würde ich nicht pro Sprache eine Spalte haben, sondern alles in Zeilen ablegen, versteh aber dein Problem mit der DB nicht. Ich frage eben dann alle aus der DB ab von der jedweiligen Sprache und Controller, auch wenn ich da ein paar nicht benötige

    Bzw ein intelligentes System weis was es dann am Schluss welche keys es von der Datenbank laden muss


    mfg

    Einmal editiert, zuletzt von Pion (24. Dezember 2010 um 17:13)

  • Mein problem mit der db ist halt folgendes:
    Sowas wie Sprachelemente sind total common. Das wird bei jedem Seitenaufruf verwendet. Das mit der Datei spart meiner ansicht nach einfach zeit und kann evtl. bei einer seite die sonst keine Datenbankverbindung brauchen wuerde diese sparen. Hier ein Bsp:
    Das CMS dass ich mom. fuer ein Projekt verwende hat folgende funktionen:
    Templates, eines fuer jede seite
    Seiten in der DB-Speicherbar
    Seiten als PHP-Objekt
    Navigation auch ueber die DB steuerbar (Die navi wird vom Template erzeugt)
    Plugins als PHP-Objekt, aktive in der DB eingetragen
    Seitenlayout (spalten) in der DB
    Dadurch kommen insgesammt (pro Seitenaufruf) 7 Querys zusammen. Da ich ja nichts ueber eine HTML-GUI steuern koennen muss, hab ich durch das schreiben von nem eigenen template, dass weder spalten noch die Navi aus der DB liest nurnoch 1 query, den fuer die Seite. Und den unterschied hat man beim benutzen eindeutig gemerkt.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • *sigh* kannst du mit einer DB genau so gut machen (und besser, aus den üblichen Gründen warum eine DB oft besser ist).
    Muss man halt gut zusammenstricken.

    Wie Pion schon sagte, schau dir ein Framework an, dass sowas anbietet.

  • Öhm man frägt ja die Datenbank auch nicht pro Seitenaufruf ab

    1. Bietet zb Mysql eine Cachefunktion, bei gleichbleibenden Queries wird dann nicht mehr abgefragt

    2. Bei einer guten Anwendung, schiebst du das Result (wenn du weißt das du es später noch einmal brauchst) in deinen Ram bzw eben einen Cache wie APC/MEMCACHED

    Dh erste Abfrage == DB, zweite Abfrage == Ram/Cache

    Aber ich bin mir echt sicher das du nicht solche Probleme hast und es auch keinen Unterschied zwischen 10 oder 30 Queries macht. Gut ich kenne deine Querys nicht, aber zb viele Querys in einer Schleife zum Eintragen oder ein Query der viele Einträge auf einmal einträgt ist nicht deutlich schneller. Aber man sollte auf jeden Fall unnötige Übertragungen/Querys meiden
    mfg

    Einmal editiert, zuletzt von Pion (24. Dezember 2010 um 18:00)