Multilinguale Website
Deus Figendi
- programmiertechnik
0 suit0 Deus Figendi
0 dedlfix
0 Deus Figendi0 dedlfix
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
Und letztlich: Was würdet ihr als fallback wählen?
Das, was der Benutzer im Accept-Language spezifiziert hat - in dieser Reihenfolge.
a) wie finde ich das heraus? (ich will ja eine große Abfrage machen und nicht jeden string einzeln)
Den Request-Header auswerten - das machst du genau 1x
b) wie gehe ich damit um? (ggf. Abfrage auf "irgendeine Sprache"? Fehlermeldung? Leerstring? Platzhalter einfach lassen?).
Liefere das passenste aus, wenn sich nichts findet den von dir als default definierten "Rest".
Du hast mich missverstanden, bzw. ich habe mich ungenau/unklar ausgedrückt:
Und letztlich: Was würdet ihr als fallback wählen?
Das, was der Benutzer im Accept-Language spezifiziert hat - in dieser Reihenfolge.
Die Accept-Language frage ich ohnehin schon ab (und erlaube dem Benutzer sie zu überschreiben). Die Frage war viel mehr: "Was wenn der entsprechende String nicht in den spezifizierten Sprachen verfügbar ist?"
Aber dedlfix hat da wohl recht, einfach englisch nehmen :)
a) wie finde ich das heraus? (ich will ja eine große Abfrage machen und nicht jeden string einzeln)
Den Request-Header auswerten - das machst du genau 1x
Äh ja, das erübrigt sich dann ja, ich meinte "wie finde ich heraus, dass der String in keiner spezifizierten Sprache verfügbar ist?" nicht "wie finde ich heraus was die spezifizierten Sprachen sind?"
Deine letzte Antwort ist dann mehr oder minder die, die ich brauchte ^^
Dennoch danke.
Die Accept-Language frage ich ohnehin schon ab (und erlaube dem Benutzer sie zu überschreiben). Die Frage war viel mehr: "Was wenn der entsprechende String nicht in den spezifizierten Sprachen verfügbar ist?"
Aber dedlfix hat da wohl recht, einfach englisch nehmen :)
Was ist, wenn englisch nicht verfügbar ist?
Hi!
"Was wenn der entsprechende String nicht in den spezifizierten Sprachen verfügbar ist?"
Aber dedlfix hat da wohl recht, einfach englisch nehmen :)
Was ist, wenn englisch nicht verfügbar ist?
Englisch muss dann die (oder zumindest eine der) Sprache(n) sein, für die alle Texte vorhanden sein müssen.
Lo!
Aber dedlfix hat da wohl recht, einfach englisch nehmen :)
Was ist, wenn englisch nicht verfügbar ist?
Englisch muss dann die (oder zumindest eine der) Sprache(n) sein, für die alle Texte vorhanden sein müssen.
In der Tat, ich muss die Seite ja eh programmieren, also wird jeder String mindestens in deutsch ODER englisch vorkommen, ich denke aber einfach in beiden Sprachen. Jedenfalls habe ich nicht vor Strings zu verwenden deren Inhalt ich nicht definiere ^^ also irgendeinen Wert wird er haben.
Ganz Unrecht hast du aber auch nicht, es kann ja immer mal was sein... dann mache ich wohl
Wunschsprachen => sonst englisch => sonst egal
Hi!
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.
Du bist doch nicht der erste, der ein mehrsprachiges Projekt in Angriff nimmt. Was für Lösungen zu dieser Problematik hast du dir schon angesehen und was hat dir daran nicht gefallen, dass du das Rad nochmal neu zu erfinden gedenkst?
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.
Den Inhalt einer Datenbank kann man aber nicht so einfach mal eben kopieren und jemandem zum Übersetzen geben. Dateien sind da erst einmal einfacher in der Handhabung. Wenn du dir Performance-Gedanken machst, solltest du die Szenarien erst einmal (mit einer realistischen Menge an Daten) durchspielen. Das was du vielleicht für das Array mehr an Speicher belegst ist die DBMS-Lösung möglicherweise langsamer. Beachte auch die unterschiedlichen Rechnerkonstellationen in deinem Entwicklungslabor und in der Produktivumgebung.
$AusgabeVariable[] = '<div class="example">'.htmlentities($texte['name_des_textes']).'</div>(...)';
Was hantierst du hier mit htmlentities() rum? Wenn du schon etwas Multilinguales aufstellst, dann verwende UTF-8, alles andere wäre - 'tschuldigung - dämlich. Einzig htmlspecialchars() benötigst du dann noch für den HTML-Kontext (und für die anderen Kontexte natürlich etwas dort benötigtes).
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.
Die Array-Lösung käme mehr oder weniger mit einem strtr(), str\_replace() oder preg\_replace() aus (eigentlich eher preg\_replace\_callback(), denn irgendwie musst du beim Einfügen ja noch die kontextspezifische Kodierung reinbringen). Die DBMS-Lösung müsste zunächst alle Platzhalter zusammentragen, eine Abfrage generieren, das Ergebnis abholen und dann die Ersetzung mit einer der genannten Funktionen vornehmen. Jeden Begriff einzeln abzufragen wäre ... - du kannst dir das bestimmt vorstellen.
> 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.
Dafür eignen sich Textdateien primär schlecht. Aber was ist mit einer Qualitätskontrolle? Jeder Formularspammer kann dir dann deine Texte "übersetzen" - abgesehen von engagierten aber sprachlich doch nicht so ganz fitten Mitarbeitern.
> 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' |
Eine ID benötigst du im Prinzip nicht, denn der Primärschlüssel ergibt sich eigentlich schon aus den Feldern textname und lang. Sie kann trotzdem sinnvoll sein, wenn Abhängigkeiten zu anderen Tabellen bestehen und sich mal ein Textname ändert. Allerdings solltest du dir eine solche Umbenennung im laufenden Betrieb gut überlegen. Der Grund dafür wäre sicher ein geänderter Text aufgrund neuer Rahmenbedingungen. Alle Übersetzungen stimmen dann sicher nicht mehr und du kämest vermutlich besser, neue Datensätze anzulegen.
> textname (primary) | (...) | de | en | (...) | zu |
> 'greet' | |'Hallo'|'Hello'| | |
> 'name\_des\_textes' | |'Inhlt'| | | |
Diese Variante hat nur den Vorteil, dass du mit einer einfachen Abfrage auf einen Blick siehst, welche Übersetzungen fehlen. Im Allgemeinen wird ein solches Design jedoch abgelehnt, da das Hinzufügen einer neuen Sprache immer mit einem Ändern der Struktur einhergehen muss. Bei der ersten Variante musst du "nur ein paar Datensätze" hinzufügen.
> Ich tendiere zu ersterem, weil ich denke dass ich erstmal weniger Speicher in der Datenbank belege (keine leeren Sprach-Zellen)
Das Speicherproblem überlass mal dem DBMS. Ganz sicher wirst du VARCHAR-Felder haben und - wofür steht gleich nochmal das VAR?
> 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).
Joins heißt ein Stichwort. Du wirst eine Sprache haben, die vollständig ist. Mit einem Left Join bindest du daran die gewünschte Sprache an. Ist für die zweite Sprache kein Datensatz vorhanden, ergeben deren Felder NULL. Mit COALESCE() beispielsweise kannst du nun den Inhalt der zweiten Sprache oder als Rückfall (bei NULL) den der ersten Sprache liefern lassen.
> 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.
Während du bei Variante 1 die gewünschte Sprache als Parameter in der WHERE-Klausel angibst, musst du in Variante 2 immer das Statement selbst anpassen und die gewünschten Sprachfelder einfügen.
> 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...).
Nicht nur das. Wenn du eine Zahl siehst, weißt du gar nichts zu dem Text, der hier angezeigt werden soll. Wenn du einen sprechenden Bezeichner nimmst, kannst du zumindest ahnen, worum es geht, ohne dir zusätzliche Kommentare ins Programm schreiben zu müssen. Die Kommentierdispziplin lässt ja bei den meisten Programmiereren (mich eingeschlossen) zu wünschen übrig.
> 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).
Mach es nicht zu komplex/kompliziert. Du musst dir dann auch wieder einen Votingfunktionsmissbrauchsschutz implementieren.
> Wie könnte ich bei einer solchen Sache noch variable Inhalte in die Texte eingeben? Also das ein Text einen anderen enthält.
Jetzt wird es anspruchsvoll. Also, nicht was die reine Umsetzung mit Platzhaltern angeht, sondern das Berücksichtigen der sprachlichen <del>Gemein</del><ins>Besonder</ins>heiten. Um mal nur ein Beispiel zu nennen: nicht nur, dass manche Sprachen Einzahl und Mehrzahl unterscheiden und dafür unterschiedliche Wortformen verwenden und andere hingegen nicht, es gibt auch noch Sprachen, die für unterschiedliche Mengen unterschiedliche Formen im Angebot haben (Tschechisch, glaub ich, war so eine. 1 Einzahl, 2-4 Mehrzahl, 4-... andere Mehrzahlform).
> Grundsätzlich könnte man in die Texte selber den entsprechenden Platzhalter einfügen, [...] (so will ich Kosistenz in den Bezeichnungen erreichen, nicht das die gleiche Sache hier so und dort anders bezeichnet/übersetzt wird).
Nicht immer ist eine 1:1-Übersetzung möglich. Gelegentlich muss man da je nach Kontext unterschiedlich translieren.
> Und letztlich: Was würdet ihr als fallback wählen?
Englisch. Das verstehen noch die meisten, die einen Begriff nicht in ihrer bevorzugten Sprache finden. Von Englisch nach Sprache X gibt es zudem die meisten Wörterbücher (online). Von X nach Y ist das nicht immer gegeben.
> Ich bin für alle Ideen, Gedanken, Denkanstöße, Tipps, Erfahrungen und so fort dankbar und daran interessiert, immer mal her damit :)
Wie sieht es mit unterschiedlichen Schreibweisen für Datum, Zahlen und Messwerten aus? Die korrekt anzugeben und bei Eingaben zu interpretieren wirst du allein mit Platzhalterersetzungen nicht auf die Reihe bekommen. (Übrigens, im Zend Framework steckt auch ein umfangreiches Paket zu diesem Thema. Deswegen ist der Download auch so groß, weil ein wesentlicher Teil davon Daten für ebendieses sind.)
> ...
Einige der Fragen habe ich ja weiter oben schon implizit mitbeantwortet, weswegen ich nicht noch einmal darauf eingehe.
Lo!
Du bist doch nicht der erste, der ein mehrsprachiges Projekt in Angriff nimmt. Was für Lösungen zu dieser Problematik hast du dir schon angesehen und was hat dir daran nicht gefallen, dass du das Rad nochmal neu zu erfinden gedenkst?
Erm wie gesagt ich kenne die Methode aus diverser freier Websoftware dass man in /languages/de.php oder so die Strings ablegt. Manchmal auch in mehreren Dateien: /languages/en_words.php /languages/en_sentences.php /languages/en_paragraphs.php (oder thematisch statt nach Länge) Sonst wüsste ich jetzt nicht... naja außerhalb des Web wird afaik ähnlich verfahren, die Sprachdateien freier Software sind oft Listen oder XML oder .ini oder irgendwas dazwischen.
Den Inhalt einer Datenbank kann man aber nicht so einfach mal eben kopieren und jemandem zum Übersetzen geben. Dateien sind da erst einmal einfacher in der Handhabung.
Das stimmt. Allerdings soll die Software nicht wirklich zur Weitergabe gedacht sein... Hm ich muss ein bisschen ausholen: Also das Ganze soll mal so ähnlich wie die großen Video-Plattformen dieser Welt werden. Jedenfalls so vom Grundtenor her. Die wichtigen Unterschiede: Keine Urheberrechtsverletzungen wenn das klappt. (Wie ich das zu bewerkstelligen gedenke führt jetzt zu weit vom Thema weg denke ich). Eigentlich nur Audio. Fokus auf Alben und Playlists. Damit sollte man eine grobe Vorstellung haben. Es ist also nicht mein Ziel die Software quelloffen ins Netz zu stellen, damit möglichst viele andere damit eigene ähnliche Projekte starten. Weil es imho erstrebenswert ist die Benutzer möglichst zu bündeln. Dennoch habe ich vor die Quellen offen zu legen, allerdings aus primär egoistischen Gründen:
Damit wäre die Software unfrei, was mich durchaus ärgert, aber ich will es so. Ob ich dafür eine Lizenz finde oder eine schreiben muss und ob die Inhalte es überhaupt zulassen werden das ganze unfrei zu handhaben wird sich zeigen.
Was ich sagen will: Sprach-Dateien-Austausch unter oder an Übersetzer ist imho nicht notwendig. Zumal ich ja - wie unten angesprochen - das eher so im laufenden Betrieb machen will. Falls es dann doch mal Sinn machen sollte kann man imho ganz gut hin und her transformieren, vor wenigen Tagen habe ich eine Frage zum Thema CSV+SQL gestellt, eine entsprechende Abfrage auf der DB, die ein CSV generiert und schon hat man eine Datei, die man weiterreichen kann, mit der Tabellenkalkulation bearbeitet und auch (hoffentlich) unkompliziert re-importiert.
$AusgabeVariable[] = '<div class="example">'.htmlentities($texte['name_des_textes']).'</div>(...)';
Was hantierst du hier mit htmlentities() rum? Wenn du schon etwas Multilinguales aufstellst, dann verwende UTF-8, alles andere wäre - 'tschuldigung - dämlich. Einzig htmlspecialchars() benötigst du dann noch für den HTML-Kontext (und für die anderen Kontexte natürlich etwas dort benötigtes).
Stümmt.
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.
Die Array-Lösung käme mehr oder weniger mit einem strtr(), str_replace() oder preg_replace() aus (eigentlich eher preg_replace_callback(), denn irgendwie musst du beim Einfügen ja noch die kontextspezifische Kodierung reinbringen).
Meine Planung aktuell war
$HTML_Ausgabe_Variable = str_replace($PlatzhalterArray , $db_result_array , $HTML_Ausgabe_Variable);
Aber ich wollte mich eben noch nicht festlegen :)
Die DBMS-Lösung müsste zunächst alle Platzhalter zusammentragen,
wie gesagt, die wollte ich immer wenn ich einen Platzhalter verwende einfach in einem array (einer Liste) ablegen und daraus...
eine Abfrage generieren, das Ergebnis abholen und dann die Ersetzung mit einer der genannten Funktionen vornehmen.
So war auch mein Plan
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.
Dafür eignen sich Textdateien primär schlecht. Aber was ist mit einer Qualitätskontrolle? Jeder Formularspammer kann dir dann deine Texte "übersetzen" - abgesehen von engagierten aber sprachlich doch nicht so ganz fitten Mitarbeitern.
Stimmt das ist ein Problem. Wie ich unten darlegte dachte ich noch an eine Abstimmung oder sowas, aber du hast recht, gegen Spam hilft das nichts. Gibt es denn nur böse Bots da draußen? ^^ Nee hast, recht muss ich verwerfen oder mir was einfallen lassen... oh und da kommen mir auch gleich Ideen:
ich kann mit vorstellen die Tabellen etwa so zu stukturieren:(...) (...)Die Kommentierdispziplin lässt ja bei den meisten Programmiereren (mich eingeschlossen) zu wünschen übrig.
Ich sehe wir sind uns einig :) Danke fürs bestätigen.
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).
Mach es nicht zu komplex/kompliziert. Du musst dir dann auch wieder einen Votingfunktionsmissbrauchsschutz implementieren.
Siehe oben :-D Mal gucken... 2. Nur erfahrene Benutzer dürfen übersetzen. Was auch immer das bedeutet, eine Woche dabei, einen Monat dabei drei Monate dabei und mindestens wöchentlich besucht... irgendwie sowas, einfach damit man nicht nur registrieren und losspammen kann. Vandalen kann man dann sperren/löschen und sie müssten wieder die entsprechende "Erfahrung" sammeln.
Wie könnte ich bei einer solchen Sache noch variable Inhalte in die Texte eingeben? Also das ein Text einen anderen enthält.
Jetzt wird es anspruchsvoll. Also, nicht was die reine Umsetzung mit Platzhaltern angeht, sondern das Berücksichtigen der sprachlichen <del>Gemein</del><ins>Besonder</ins>heiten. Um mal nur ein Beispiel zu nennen: nicht nur, dass manche Sprachen Einzahl und Mehrzahl unterscheiden und dafür unterschiedliche Wortformen verwenden und andere hingegen nicht, es gibt auch noch Sprachen, die für unterschiedliche Mengen unterschiedliche Formen im Angebot haben (Tschechisch, glaub ich, war so eine. 1 Einzahl, 2-4 Mehrzahl, 4-... andere Mehrzahlform).
Stimmt das ist ein Problem... Ich denke aber ich könnte mit den entsprechenden Unzukänglichkeiten leben, wie oft liest man im Netz denn sowas wie "1 Ergebnisse" oder so, weil es keine Überprüfung über die Menge gibt. Mir ist klar, dass sich das nicht nur auf Ein- und Mehrzahl bezieht, ich meinte vielmehr... wenn da eine falsche Gramatik ankommt ist aufgrund der offenen Struktur klar, wie das zustande kommt. Also lebt man damit. Ansonsten habe ich aber auch festgestellt, dass man ggf. mit passendem Satzbau zumindest in den Sprachen die ich beherrsche (deutsch, englisch, latein) zumeist ein vorhandener Begriff passend einbauen lässt. Ich hätte dieses Problem ja schon im Deutschen, weil hier Wortbeugungen auch nicht immer gleich funktionieren. Das wäre mir jetzt auch viel zu aufwendig da noch eine gigantische Gramatik-Regel-Datenbank hinter zu hängen. Nein, das obläge dem Übersetzer den Satz so zu gestalten, dass er passt (wenn es nur um Wortendungen geht oder so kann man die ja sogar in eine Übersetzung einbauen).
Grundsätzlich könnte man in die Texte selber den entsprechenden Platzhalter einfügen, [...] (so will ich Konsistenz in den Bezeichnungen erreichen, nicht das die gleiche Sache hier so und dort anders bezeichnet/übersetzt wird).
Nicht immer ist eine 1:1-Übersetzung möglich. Gelegentlich muss man da je nach Kontext unterschiedlich translieren.
Logisch, ich habe auch jetzt schon gleiche Begriffe mehrmals in der Sprach-Datei, weil sie unterschiedliche Bedeutungen haben (quasi Teekesselchen) und in einer Übersetzung nicht gleich wären.
Und letztlich: Was würdet ihr als fallback wählen?
Englisch. Das verstehen noch die meisten, die einen Begriff nicht in ihrer bevorzugten Sprache finden. Von Englisch nach Sprache X gibt es zudem die meisten Wörterbücher (online). Von X nach Y ist das nicht immer gegeben.
Mhm, schlüssig.
Wie sieht es mit unterschiedlichen Schreibweisen für Datum, Zahlen und Messwerten aus? Die korrekt anzugeben und bei Eingaben zu interpretieren wirst du allein mit Platzhalterersetzungen nicht auf die Reihe bekommen.
Hmm da hast du recht. Ich denke aber dass die Menge da gering ist. Wie gesagt geht es um eine Art Media-Player, also was brauch ich schon? Zeit (Dauer) ggf. Datum Floats (Tausenderpunkte, Dezimal-Abgrenzer-Zeichen aka Komma...) öööhm sonst? Okay, das kann man gerade noch aus der Sprache ableiten bzw. eine entsprechende Profilangabe machen... wird aber aufwendig, da hast du recht. Zweiter Knackpunkt: Ich weiß nicht was September auf Mandarin heißt. Alles in allem rechnen aber glaube ich die meisten Menschen im Dezimalsystem bzw. in Sekunden, Minuten, Stunden, Grad. Wenn man da arabische Ziffern verwendet und sich darauf beschränkt kommen alle zurecht denke ich.
(Übrigens, im Zend Framework steckt auch ein umfangreiches Paket zu diesem Thema. Deswegen ist der Download auch so groß, weil ein wesentlicher Teil davon Daten für ebendieses sind.)
Sagt mir nichts, schau ich mir gleich an.
Einige der Fragen habe ich ja weiter oben schon implizit mitbeantwortet, weswegen ich nicht noch einmal darauf eingehe. Lo!
Ja, vielen Dank für das Feedback und wie ich schrieb hatte ich während des Postens schon die ein oder andere Idee. Dank dir habe ich Probleme entdeckt, von denen ich nicht wusste, wurde bestätigt, habe Hilfe für die DB-Abfrage erhalten und so fort. Also schönen Dank dass du dich so ausführlich mit meinen Sorgen beschäftigst und ich hoffe ich klang jetzt nicht zu "verteidigend", ich denke nämlich ich nehme schon einiges aus deinem Beitrag mit :)
Gruß Deus Figendi
Hi!
Du bist doch nicht der erste, der ein mehrsprachiges Projekt in Angriff nimmt. Was für Lösungen zu dieser Problematik hast du dir schon angesehen und was hat dir daran nicht gefallen, dass du das Rad nochmal neu zu erfinden gedenkst?
Erm wie gesagt ich kenne die Methode aus diverser freier Websoftware [...]
Sonst wüsste ich jetzt nicht...
Eines der Systeme, die in vielen Programmierumgebungen eine Umsetzung haben, wäre Gettext. Sowas meinte ich, also fertige, ausgereifte Umsetzungen.
Die Array-Lösung käme mehr oder weniger mit einem strtr(), str_replace() oder preg_replace() aus (eigentlich eher preg_replace_callback(), denn irgendwie musst du beim Einfügen ja noch die kontextspezifische Kodierung reinbringen).
Meine Planung aktuell war
$HTML_Ausgabe_Variable = str_replace($PlatzhalterArray , $db_result_array , $HTML_Ausgabe_Variable);
strtr() in der zweiten Variante hat den Vorteil gegenüber str_replace(), dass es mit _einem_ Array auskommt, bei dem Schlüssel und Wert eine Einheit bilden. Das lässt sich auch leichter handhaben als die zwei Arrays, bei denen man über einen gemeinsamen Schlüssel den Wert im anderen suchen muss.
Aber wie gesagt, denkt dir eine Lösung aus, wie du da noch die kontextgerechte Behandlung unterbringst.
Die DBMS-Lösung müsste zunächst alle Platzhalter zusammentragen,
wie gesagt, die wollte ich immer wenn ich einen Platzhalter verwende einfach in einem array (einer Liste) ablegen und daraus...
Wie muss ich "wenn ich einen Platzhalter verwende" verstehen? Nach meinem Verständnis hast du doch gemäß dem für den aktuellen Request abzuarbeitenden Anwendungsfall am Ende ein Ergebnis mit x Platzhaltern drin. Die musst du da erst einmal herausklauben, bevor du das DBMS damit beauftragen kannst, genau dafür die Texte zu liefern.
- Statt Sidebar oder so könnte man auch jeden String, der nicht in der primärsprache des Benutzers erscheint mit einem hochgestellten Link (wie Fußnoten) versehen, der genau das ermöglicht. Das würde auch das Kontext-Problem lösen, weil total offensichtlich ist, in welchem Kontext der string steht.
Also im Prinzip wie bei einem Wiki-Stichwort, zu dem zwar schon der Link steht, aber das Thema noch nicht erstellt wurde. Klingt nicht schlecht.
Wie sieht es mit unterschiedlichen Schreibweisen für Datum, Zahlen und Messwerten aus? Die korrekt anzugeben und bei Eingaben zu interpretieren wirst du allein mit Platzhalterersetzungen nicht auf die Reihe bekommen.
Hmm da hast du recht. Ich denke aber dass die Menge da gering ist. Wie gesagt geht es um eine Art Media-Player, also was brauch ich schon?
Das wirst du erst dann sehen, wenn alle Features implementiert sind. In so einem fortgeschrittenen Stadium nochmal was grundlegendes zu ändern, ist meist keine einfache Aufgabe, wenn man solche Fälle nicht mit eingeplant hat.
Ich weiß nicht was September auf Mandarin heißt.
Die machen es sich da ganz einfach, die zählen die Monate. Also wörtlich "eins Monat" ist Januar, und so weiter bis "zwölf Monat". Bei den Wochentagen ist es ähnlich: "Woche eins" bis "Woche sechs", nur der Sonntag heißt "Woche Himmel" oder "Woche Sonne".
Aber egal, das muss dein Übersetzer wissen. Du musst nur dafür sorgen, dass nicht nur ein Datum richtigrum positioniert wird sondern gegebenenfalls komplett umgeschrieben werden muss.
Aber apropos Chinesisch und ISO-639-1. Mit "zh" allein wirst du nicht weit kommen. Gesprochen ist das (von Dialekten abgesehen) das gleiche, es gibt aber zwei Schriftsysteme, die traditionelle Variante (Taiwan, Hong-Kong, Überseepopulationen) und die vereinfachte (China, Singapur). Schon dafür musst du zwei Einträge vorsehen oder einen Zeichenübersetzer bemühen. Nur eine der beiden Varianten zu unterstützen, geht nicht gut.
Alles in allem rechnen aber glaube ich die meisten Menschen im Dezimalsystem bzw. in Sekunden, Minuten, Stunden, Grad. Wenn man da arabische Ziffern verwendet und sich darauf beschränkt kommen alle zurecht denke ich.
Arabische Ziffern? - Haha, schau dir mal an, was für Ziffern die Araber heutzutage verwenden. :-)
Mit unterschiedlichen Maßeinheiten wirst du vermutlich nicht in Berührung kommen. Bei der Art Daten, wie du sie zu sammeln gedenkst, wird die Temperatur (°C vs. °F) keine Rolle spielen und Begrifflichkeiten wie 12"-Remix wirst du sicher nicht in 30,48cm-Remix übersetzen wollen. Zeitangaben werden in deinem Projekt wohl die einzige zu lokalisierende Größe sein.
Lo!