Ankündigung

Einklappen
Keine Ankündigung bisher.

Mehrsprachigkeit mit Hilfe von Files

Einklappen

Neue Werbung 2019

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

  • Geryon
    hat ein Thema erstellt Mehrsprachigkeit mit Hilfe von Files.

    Mehrsprachigkeit mit Hilfe von Files

    Hallo,

    ich bin gerade am grübeln darüber, wie ich das Datenbankkonzept für Mehrsprachigkeit umsetze.

    Ich habe im Internet verschiedene Ansätze gefunden. Jedoch scheint keiner auf meine Anforderungen zu passen.

    1. Möglichkeit: SQL Tabelle nach rechts erweitern. Ich find’s komisch, dass das trotz der massiven Nachteile immer noch so oft im Internet angepriesen wird.

    2. Möglichkeit: Mehrere Sprachen in der gleichen Tabelle untereinander in Zeilen Speichern. Spätestens wenn ich mit Nested Sets arbeite bekomme ich hier ein mega Chaos. Es fängt aber schon bei den IDs und auto_increment an.

    3. Möglichkeit: Alle sprachabhängigen Inhalte in eine extra Tabelle auslagern. Diese Methode ist schon ganz gut aber erfordert Joins und erzeugt zusätzliche Datenbanklast. Beispiel: Nested Sets Befehle werden an dieser Stelle sehr komplex

    4. Möglichkeit: Alle Sprachinhalte in ein und dieselbe Zelle Stecken und die verschiedenen Abschnitte im Text mit speziellen Trennzeichen unterteilen. Das ist zwar eine Möglichkeit aber die einzelnen Zellen würden extrem Aufgebläht. Zum Beispiel bei der Speicherung von Artikeln. Außerdem wäre die Software zum Bearbeiten solcher Zellen relativ kompliziert (Bearbeiten von Artikeln)

    Meine Idee: Ich speichere die Sprachabhängigen Inhalte einfach nicht in der Datenbank. Sondern ich speichere diese Inhalte in Dateien. Alles was ich nun tun muss, ist meine Datenbankklasse zu erweitern. Dort gibt es eine Methode getRows($sql). Diese Methode müsste nun nur noch prüfen, ob es zu den ausgelesenen Spalten zusätzliche Werte in Dateien gibt. Diese würden dann in der derzeit eingestellten Sprache nachgeladen werden.

    Vorteile: Keine Datenbanklast, Spontanes umschalten auf alternative Sprache wenn angeforderte Sprache nicht vorhanden ist, kann ohne großen Aufwand nachgerüstet werden, SQL-Kommandos bleiben absolut leserlich

    Nachteile: Sicherung umständlicher, Benutzung der Inhalte durch mehrere System unter Umständen schwierig, Nachteil der fehlenden Volltextsuche – müsste über mehrsprachige Keywords ausgeglichen werden

    Was haltet ihr von dieser Möglichkeit?

  • mquadrat
    antwortet
    Zitat von hts Beitrag anzeigen
    Das Statement wird in PHP erstellt, wieso sollte ich die Spalte da nicht dynamisch vergeben können?
    Um mal bei hausls Beispiel zu bleiben:
    Code:
    SELECT text FROM tabelle WHERE lang = '$currentLang' AND textname = 'txtWelcome'
    vs.
    SELECT text_$currentLang FROM tabelle WHERE textname = 'txtWelcome'
    Probleme kriegst du damit z.B.

    - beim Verwenden von OR-Mappern
    - beim Verwenden von Stored Procedures

    Der Export / Import aller Sprachen wird schwieriger. Die Prüfung welche Elemente in einer Sprache noch nicht übersetzt wurden wird ebenfalls komplizierter

    Einen Kommentar schreiben:


  • marcusson
    antwortet
    Und genau diese Diskussion hatten wir auch schon mal. Da beißt sich die Schlange in den Schwanz.

    Einige Leute haben das schon live durch: die Tabellen wurden immer breiter, immer inkonsistenter und die Wunschlisten eben doch immer größer.
    Als Krönung kamen doch noch externe Übersetzungsbüros und wechselnde Kollegen bei der Bearbeitung der Datenbanken dazu und das Chaos war perfekt. Der erste wusste noch was er tat. Der dritte nicht mehr wirklich.

    Ich glaube auch nicht, dass die letzte Idee von @HTS irgendwas bringt, denn sobald Kontexte dazu kommen funktioniert das nicht mehr. Jeder Begriff hat N Kontexte und jeder Kontext M Begriffe. 1 Tabelle reicht nicht. Einfaches Beispiel: eine Spalte kann mit "Nettobetriebsergebnis" bezeichnet sein, aber in Tabellen wird eine Abkürzung verwendet und in Legenden steht zusätzlich der Text +"der Filiale im Berichtszeitraum". Von einem Glossar für feststehende Begriffe oder rekursiven Übersetzungen will ich da gar nicht erst anfangen.

    Ich denke, die Diskussion ist irgendwie an einem toten Ende. Es gibt für Übersetzungen einen internationalen Standard und da kann man sich dran halten, oder man macht eben etwas anderes: mit allen sich daraus ergebenden Konsequenzen. Hauptsache alle Seiten sind sich einig, dass man die Konsequenzen auch wirklich will.

    Mein Problem war nie der Code, sondern stets eine Kombination aus Kollegen, die dachten sie wüssten was sie tun und Kunden, die dachten sie wüssten was sie wollen.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Letzten Endes läuft das auf das selbe hinaus: Die Normalisierungsdiskussion.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Zitat von nikosch Beitrag anzeigen
    Falls es Dir Spaß macht, kannst Du Dir an dieser Stelle auch den User mit dem jüngsten Veröffentlichungsdatum denken. Oder wie wärs mit der Anwendung: Die populärsten Artikel sortiert/gruppiert nach Sprache. Usw. usf.

    Zeige alle Texte, die ich und meine Freunde lesen können.
    Sorry, aber Datenbankdesign muss mehr abbilden können, als meine Phantasie in 5 Minuten erspinnen kann.
    Ich glaube, wir driften ab. Es ging doch hier um Mehrsprachigkeit einer Website. Darunter verstehe ich personalisierte Menüs, Überscriften, Hinweistexte, Fehlermeldungen, etc.

    Die Artikel in verschiedenen Sprachen, die du ansprichst, gehören natürlich in eine andere Tabelle mit zb id, user_id, language_id, artikel_text

    Einen Kommentar schreiben:


  • hausl
    antwortet
    ok.. bei den Überlegungen.. ist erledigt.. bitte Zwischenfrage vergessen..

    Danke!

    Lg

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Ok, $currentAccount kommt aus der Session?
    Falls es Dir Spaß macht, kannst Du Dir an dieser Stelle auch den User mit dem jüngsten Veröffentlichungsdatum denken. Oder wie wärs mit der Anwendung: Die populärsten Artikel sortiert/gruppiert nach Sprache. Usw. usf.

    Wozu soll das gut sein?
    Zeige alle Texte, die ich und meine Freunde lesen können.
    Konstruierst du jetzt irgendwelche realitätsfremden Abfragen, um deine Aussage zu verteidigen?
    Sorry, aber Datenbankdesign muss mehr abbilden können, als meine Phantasie in 5 Minuten erspinnen kann.

    Einen Kommentar schreiben:


  • hausl
    antwortet
    kurze Zwischenfrage -DB ist jetzt fix?

    Topic: Mehrsprachigkeit mit Hilfe von Files
    LG

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Ok, $currentAccount kommt aus der Session? Also kann man beim Login genausogut die Sprache in der Session ablegen.

    Ich führe mal einen meiner Meinung nach weiteren Vorteil auf, wenn alle Sprachen in einer Zeile zusammengefasst sind. Mit einer Abfrage wie IFNULL(text_'.getLanguage().', text_de) AS text kann automatisch ein Fallback auf die Defaultsprache realisiert werden, falls eine Übersetzung fehlt.

    [EDIT]
    Deine zweite Abfrage kam später. Was soll diese Bezwecken? Alle Übersetzungen für meine Sprache und die meiner Freunde ermitteln? Wozu soll das gut sein?
    Konstruierst du jetzt irgendwelche realitätsfremden Abfragen, um deine Aussage zu verteidigen?

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Code:
    SELECT text 
    FROM   tabelle  t
    JOIN   users    u
      ON   t.lang = u.nativeLang
    WHERE  u.id = '$currentAccount'
    Code:
    SELECT t.text 
    FROM   users    u
    JOIN   users    uf
      ON   uf.friendId = u.id /* vereinfacht */
    JOIN   tabelle  t
      ON   t.lang = u.nativeLang
           OR t.lang = uf.nativeLang
    WHERE  u.id = '$currentAccount'

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Wenn du keine Lust auf eine sachliche Diskussion hast, dann musst du nicht unbedingt antworten.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Für mich schon.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Zitat von nikosch Beitrag anzeigen
    Z.B. weil man Spaltennamen in SQL nicht dynamisch ansprechen kann. Feldinhalte dagegen ja.
    Das Statement wird in PHP erstellt, wieso sollte ich die Spalte da nicht dynamisch vergeben können?
    Um mal bei hausls Beispiel zu bleiben:
    Code:
    SELECT text FROM tabelle WHERE lang = '$currentLang' AND textname = 'txtWelcome'
    vs.
    SELECT text_$currentLang FROM tabelle WHERE textname = 'txtWelcome'
    Das war jetzt kein überzeugendes Argument.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Ich hätte dazu mal einen plausiblen Grund,
    Z.B. weil man Spaltennamen in SQL nicht dynamisch ansprechen kann. Feldinhalte dagegen ja.

    Einen Kommentar schreiben:


  • hausl
    antwortet
    Hallo!

    Ich hoff ich hab nichts überlesen, und auch auf die Gefahr das ich die Komplexität "übersehe"... aber warum nicht so das jeder Text eine Namen hat und man dann in der i18n tabelle nach unten geht.. Ein (zusätzlicher) unique ist auf "textname && lang"...

    Code:
    txtID | textname          | lang | text
    ------------------------------------------------------------------------------------
      1   | txtWelcome        | de   | Herzlich Willkommen!
      2   | txtWelcome        | en   | Welcome!
      3   | txtWelcome        | fr   | Bon Jour!
      4   | txtWelcomUsername | de   | Hallo %1, wir freuen uns das Sie hier sind!
    etc...
    Und dann noch ne nette Funktion/Methode (einer Language-Class) die dann den benötigenten Text rausholt - das die Sprach-var verfügbar ist, davnon geh ich aus...

    echo $Lang->getLangValue("txtWelcome", $currentLang);

    Sollten dann noch Parameter nötig sein, kann man ja nochweitere Methoden reinbauen die dann im DB-Text zB ein %1 und %2 durch die Parameter ersetzen..

    echo $Lang->getLangValue_1Param("txtWelcomUsername", $currentLang, "Kingman");
    Das würde dann in "Hallo %1" durch "Hallo Kingman, wir freuen uns das Sie hier sind!" ersetzen (sorry, grad auf die Schnelle kein besseres Beispiel, man könnte den auch aufteilen..)

    Dann kann ich ja nach Sortierung auch schöne Übersicht machen und neue Sprache hinzufügen ist sowieso kein Problem... geht mit der Methode nach je Spalte eine Sprache genauso..

    LG

    Einen Kommentar schreiben:

Lädt...
X