Guten Abend,
könnt ihr mir Tipps geben, wie man am besten mit Übersetzungen umgeht?
Sprich alle Texte in eine Datei? Oder wie oder was? Ich steh etwas sehr auf dem
Schlauch und habe überhaupt keinen Plan wie ich beginnen soll.
Gruß
Guten Abend,
könnt ihr mir Tipps geben, wie man am besten mit Übersetzungen umgeht?
Sprich alle Texte in eine Datei? Oder wie oder was? Ich steh etwas sehr auf dem
Schlauch und habe überhaupt keinen Plan wie ich beginnen soll.
Gruß
Ich habe zwar noch nie mehrsprachig entwickelt aber habe mich zu dem Thema schon belesen ;) Mal sehen, woran ich mich erinnern kann.
Am einfachsten ist es, wenn du alles an einer Stelle speicherst - egal, ob Datei, Datenbank, whatever. So hast du immer auf einen Blick alle Sprachvariablen verfügbar. Hast du die Daten verstreut (Ein Teil in der DB, ein Teil als PHP-Variable, ein Teil als JavaScrip-Variable, ... ) wird die Wartung unmöglich und das Hinzufügen weiterer Sprachen zur Qual.
Wenn du eine Templateengine wie Smarty oder ein PHP-Framework wie Cake nutzt, lohnt es sich unter Umständen, dort man in die Docs zu sehen - da finden sich oft schon Umsetzungen von Mehrsprachigkeit. Wenn du diese Funktionalitäten nutzen kannst, spart dir das vielleicht viel Zeit.
Ich nutze privat Sprachfiles, es gibt dann für jedes Template ein eigenes Sprachfile und ein zentrales für globale Variablen. Diese werden gleichzeitig mit dem jeweiligen Template von meiner Template-Engine geladen und in die Templates eingesetzt. In den Templates sind dann nur die Language-Tags und diese werden dann durch die jeweiligen Variablen ersetzt.
Die Sprachfiles befinden sich alle in einem zentralen Ordner, in dem für jede Sprache ein jeweiliger Unterordner existiert wo alle Files drinne liegen. Findet die Sprachen-Klasse eine Sprachdatei nicht, dann lädt sie die Standardsprache (sieht dann doof aus aber gibt keinen Fehler und es steht irgendwas im Template).
Wir entwickeln ausschließlich in Englisch und nutzen zentrale language files zur jeweiligen übersetzung.
Im Grunde lässt sich unser System mit dem eines phpbb3 vergleichen, nur die verzeichnisanordnung unterscheidet sich ein wenig.
Da bei uns auch Grafiken Text enthalten (vornehmlich Buttons etc)
gliedern wir folgendermaßen:
Languages
|-> en
|-> de
|-> fr
Diese gliedern sich wiederum in
|-> images
|-> text
Größere Texte (so ziehmlich alles ueber 4-5 Wörter) sind wiederum in einer Datenbank gesichert, wo sie sher einfach von jedem befugten in andere Sprachen uebernommen werden koennen.
Die Sprachphrasen liegen in der Datenbank und werden nach Locales sortiert. Die Engine lädt beim Start alle Sprachphrasen welche zu ihrem eingestellten Locale gehören in eine Hashtable im RAM. Dadurch, dass der Locale für die ganze JVM eingestellt wird ändert sich damit automatisch auch das Ausgabeformat von Zahlen und Datumsangaben.
Wichtig bei der Lokalisierung ist, dass dein Sprachformat flexibel auf unterschiedliche grammatikalische Regeln der jeweiligen Sprache reagieren kann. Sprachphrasen können Parameter enthalten (z.b. der Text "Du hast X neue Nachrichten", wobei X die Anzahl der Nachrichten ist). Je nach Wert des Parameters können sich Wortstellungen und Singular/Plural ändern. Verschiedene Sprachen haben hier verschiedene Regeln, manche Sprachen haben mehr Pluralformen als andere.
Im obigen Beispiel muss der Text auf Deutsch in 3 Versionen generiert werden können: "Du hast keine neuen Nachrichten.", "Du hast eine neue Nachricht", "Du hast X neue Nachrichten". Allerdings kannst du nicht einfach 3 verschiedene Versionen des Textes speichern, da manche Sprachen auch mehrere Pluralformen haben (z.b. Arabisch). Wenn du dann für eine Sprache plötzlich eine vierte Version des Textes brauchst stehst du doof dar und darfst plötzlich deinen Spielcode umprogrammieren. Hier eignet sich ein System, welches innerhalb einer Sprachphrase Fallunterscheidungen anhand der Parameterwerte machen kann.
Wie sowas funktionieren kann siehst du z.B. bei Perl (http://search.cpan.org/~ferreira/Locale-Maketext-1.13/lib/Locale/Maketext/TPJ13.pod) oder Java (http://java.sun.com/javase/6/docs/api/java/text/MessageFormat.html).
Was du ebenfalls beachten musst ist, dass du nicht nur Sprachphrasen lokalisieren musst. Du hast in anderen Sprachen ebenfalls andere Nummernformate (andere Tausendertrenner, Punkt statt Komma) und andere Datumsformate die ebenfalls korrekt dargestellt werden müssen.
Ich habe eine .ini (de.ini, en.ini, ...) in der alle Textelemente vorhanden sind. Im "Ur-Quelltext" steht dann nur {key_fuer_Das_element}. Dies wird dann später von PHP ersetzt.
Lange Texte haben dann eine de_text1.txt oder bilder den namen de_map.jpg
ach so geht das...exe du bist der geilste Programmierer überhaupt, ich beuge mein Haupt vor dir.
Gibt es zu dem Thema eigentlich auch weitergehende Lektüre (deutschsprachig wird bevorzugt), die auflistet, welche Dinge man durch die Sprache variable machen muss und wie man dies Programmiertechnisch realisiert? Und auch einige Sprachen wie Deutsch, Englisch zumindest auflistet mit deren Eigenschaften?
Variablen in Phrasen, Datums und Zeitformat, Nummernformatierung hab ich bereits. Allerdings wüsste ich derzeit nicht wie ich ohne weiteres programmiertechnisch das Beispiel von exe mit den verschiedenen Phrasen je nach Höhe des Parameters berücksichtige (keine Nachrichten, X neue Nachrichten etc.)
Nimm halt, wie exe es beschrieb, den standardisierten Weg, das Problem zu lösen, also gettext für die simple Variante oder Maketext, wenn es die Sonderfälle auch abhandeln können soll. Oder gibt es die Libs nicht für deine language of choice?
Dürfte schneller gehen, performanter sein, dir Codewartung ersparen und letztendlich zum besseren Ergebnis führen.
Meine Sprache der Wahl ist PHP, dort wird gettext unterstützt, allerdings wüsste ich nicht, ob ich auf meinem Webspace zugriff darauf habe. Ich finde es allerdings arg eingeschränkt ein binäres Format vorgeschrieben zu bekommen. Das war eigentlich der ausschlaggebende Punkt etwas eigenes zu nehmen.
Kann gettext eigentlich Variablen ersetzen und die jeweils richtige Form nehmen?
Gettext nimmt afaik nur den von dir angegebenen String als input und returned dir die Übersetzung. Aber es gibt dort eben recht komfortable Tools, um die Stringdatenbank aus bestehender Software zu generieren.
Verschiedene Pluralformen kann gettext wohl, siehe http://de.php.net/manual/de/function.ngettext.php - allerdings musst Du weitergehende Logik selbst schreiben.
Ich denke mal die Vorteile gettext zu nutzen sind:
- Sicherheit (bewährt, tausendfach im Einsatz)
- Performance (optimiertes, binäres Format)
- Portablität (man kann auch aus anderen Projekten auf die Language files zugreifen)
Dass die Dateien nun letztlich binär gespeichert werden ist ja vollkommen egal. Es ist ein offenes Format und man hat die Quelldaten.
Da es normale PHP Funktionen dazu gibt, wüsste ich nicht, wieso das nicht verfügbar sein sollte? Abgesehen davon hosted man doch eh kein Browsergame auf normalen webspace Accounts..
Schaue ich mir mal tiefergehend an, vielleicht erfüllt es ja doch alles was ich brauche. :)
Original von Kallisti
Da es normale PHP Funktionen dazu gibt, wüsste ich nicht, wieso das nicht verfügbar sein sollte? Abgesehen davon hosted man doch eh kein Browsergame auf normalen webspace Accounts..
Wüsste keinen Grund warum ich das nicht tun könnte/sollte.
Solang die Leistung des Webspace ausreichend ist werde ich bei diesem auch bleiben. Sollte das nicht mehr sein wird ein Benutzerlimit gesetzt. Sollten sehr viele Spieler darüber hinaus mitspielen wollen, wird es kostenpflichtig gemacht um die Kosten eines Servers abzudecken.
Aber das wird OT, weitere Beiträge zu dem Thema per PN oder neuem Thread. ^^
Ich bin bei PHP mit Zend_Translate und tmx-Dateien immer ganz gut gefahren. Zusammen mit memcached auch ne recht zügige Angelegenheit.
Frage zu gettext:
Ist die Verzeichnisstruktur eigentlich immer vorgeschrieben, also "/de_DE/LC_MESSAGES/.mo". Oder könnte man auch definieren, dass zum Beispiel die Pfade wie folgt aufgebaut sind: "/de_DE.mo"?
Finde die Ordnerstruktur nämlich arg hässlich :)
PS: Und gibt es auch eine Kurzform in PHP für das ngettext()?