Guten Morgen,
ich arbeite gerade an einem Projekt, welches ich sprachlich überhaupt nicht einschränken wollte. Mehr oder minder jede verdammte Sprache auf diesem Planeten soll darauf verfügbar sein. Naja okay, jetzt trage ich etwas dick auf, ich meinte die 185 Sprachen, die die entsprechende ISO (623 oder so) dazu in ihrer ersten Version kennt. Das reicht für meine Zwecke erstmal denke ich. Desweiteren wollte ich auf die länder-spieziefischen Varianten (en-US etc.) verzichten um die Ressourcen ein wenig zu bündeln.
Nun war der Plan grundsätzlich erstmal so, dass ich mir dachte jeder Benutzer legt (bis zu) drei Sprachen fest, die er beherrscht, für Gäste ist das einfach das was der UserAgent übermittelt (ggf. noch umstellbar und kommt dann in nen Cookie).
Mein erster Ansatz, mit dem ich auch schon angefangen habe war der, der aus vielen openSource-Lösungen (Foren, Wikis, Blogs...) bekannt ist: Man legt eine oder mehrere php-Dateien an, die im Dateinamen das Sprachkürzel enthalten. Diese erzeugen ein Text-Array, welches man dann in den anderen Scripten verwendet, nachdem man die Datei inkludiert hat.
Jetzt habe ich mir überlegt (und ich sollte das schnell ändern bevor das Projekt weiter fort schreitet) dass folgende Technik vielleicht geschickter ist:
Datenbank!
Anstatt ein array zu erzeugen bzw. eben drei arrays und mich dann daraus zu bedienen dachte ich es vielleicht geschickter das ganze in einer Datenbank zu handeln. Der Plan ist bis hierher folgendermaßen:
Die "anderen" Scripte erzeugen bereits jetzt ohnehin ihren Code nur in einer Ausgabe-Variable, die als letzter Schritt später dann ausgegeben wird. Die Überlegung meinerseits war nun statt wie bisher etwa so:
$AusgabeVariable[] = '<div class="example">'.htmlentities($texte['name_des_textes']).'</div>(...)';
Die Ausgabe so zu gestalten, dass man in die Variable einen Platzhalter einfügt und in eine Liste die Texte einträgt, die man so braucht:
$AusgabeVariable[] = '<div class="example">%%%name_des_textes%%%</div>(...)';
$verwendete_Texte[] = 'name_des_textes';
und direkt vor der Ausgabe erfolgt dann eine Abfrage auf der Datenbank gegen alle in $verwendete_Texte eingetragenen Namen, welche dann in der AusgabeVariable über eine der mannigfaltigen replace-Methoden ersetzt wird.
Gründe dafür sind vielfach: Ich denke in einer Datenbank ist es einfacher zu verwalten und vor allem einfach zu erweitern. Man muss nicht immer so einen riesigen Batzen Daten im Arbeitsspeicher mit sicher herum schleppen (nämlich den texte-array) und so fort.
Zudem wollte ich die Benutzer ein wenig einspannen, zwischendurch oder auch ständig irgendwo wo's nicht stört (ne Sitebar oder sowas) bittet man den Benutzer einen Begriff oder ganzen Text zu übersetzen von einer Sprache, die er beherrscht in eine Sprache, die er beherrscht.
Nun zu den Fragen:
Da geht's nämlich vor allem um die Datenstruktur:
ich kann mit vorstellen die Tabellen etwa so zu stukturieren:
id | textname | lang | value |
1 | 'greet' | 'de' | 'Hallo' |
2 |'name_des_| 'de' | 'Inhalt Inhalt Inhalt'|
| textes' | | |
3 | 'greet' | 'en' | 'Hello' |
oder so:
textname (primary) | (...) | de | en | (...) | zu |
'greet' | |'Hallo'|'Hello'| | |
'name_des_textes' | |'Inhlt'| | | |
Ich tendiere zu ersterem, weil ich denke dass ich erstmal weniger Speicher in der Datenbank belege (keine leeren Sprach-Zellen) und wohl auch die Anfrage besser stellen kann (nämlich: nach Sprache2 nur suchen wenn der Text in Sprache1 nicht gefunden wurde... wobei ich nicht weiß wie das mit MySQL geht, aber das finde ich dann schon raus).
Aber vielleicht ist auch die zweite Variante geschickter, weil man nur nach einer ID suchen muss und dann gleich alle Sprachen zur Hand hat, die man braucht.
Vielleicht ist es sogar sinnvoll statt textname einen nummerischen Index (bzw. Suchwert) zu wählen, da fürchtete ich nur um Kollisionen bei der Programmierung (wenn man nicht mehr weiß was der letzte Wert noch gleich war...).
In Variante 1 KÖNNTE man sogar noch überlegen mehrere Einträge der gleichen Sprache für den gleichen Text zu vergeben und dann über eine Voting-Funktion deren Wert zu bestimmen (Laien-Übersetzungen können ja auch mal schief gehen).
Tjoa, was war noch gleich die zweite Frage? Oh ach ja:
Wie könnte ich bei einer solchen Sache noch variable Inhalte in die Texte eingeben? Also das ein Text einen anderen enthält. Grundsätzlich könnte man in die Texte selber den entsprechenden Platzhalter einfügen, also
Greeting | de = Willkommen bei %%%projectname%%%
und projectname wäre dann ein anderer Eintrag... (so will ich Kosistenz in den Bezeichnungen erreichen, nicht das die gleiche Sache hier so und dort anders bezeichnet/übersetzt wird). Wenn ich sowas in die Einträge einpflege, dann muss ich einerseits Datenbankabfragen machen, bis alle Platzhalter ersetzt sind uns anderseits steht mir dann auch nicht mehr der entsprechende Array zur Verfügung, der mir sagt nach was ich die Datenbank durchsuchen muss (also welche Platzhalter verwendet wurden), so dass ich hier jeden abgefragten String erst durchsuchen muss was wie ich fürchte auf die Performance geht.
Jemand dazu Gedanken?
Und letztlich: Was würdet ihr als fallback wählen?
Wie gesagt kann man drei Sprachen angeben, aber einerseits muss man nicht und andererseits kann es auch mal sein, dass ein String in keiner der drei Sprachen verfügbar ist.
a) wie finde ich das heraus? (ich will ja eine große Abfrage machen und nicht jeden string einzeln)
b) wie gehe ich damit um? (ggf. Abfrage auf "irgendeine Sprache"? Fehlermeldung? Leerstring? Platzhalter einfach lassen?).
Ich bin für alle Ideen, Gedanken, Denkanstöße, Tipps, Erfahrungen und so fort dankbar und daran interessiert, immer mal her damit :)
Gruß DeusFigendi
sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(