DevOG: Internationalisierung

Ich arbeite seit einer Weile am Oettinger Games Code. Zum einen wartet seit einiger Zeit ein Internationalisierungssystem darauf scharf geschalten zu werden, zum anderen habe ich noch einige kleinere Änderungen am Game-Modul durchgeführt, die ich recht spannend finde.

Das letzte zuerst: ich habe zu den Screenshots jetzt eine Eigenschaft "system" definiert, die angibt, von welchem System der Screenshot stammt. So wird es möglich verschiedene Screenshot-Stapel zu haben, die jeweils nach System sortiert sind. Damit soll etwas mehr Ordnung geschaffen werden, sucht ein Nutzer bspw. konkret nach der PSP-Variante, so kann er den Stapel der PSP-Screenshots durchgehen. Außerdem wird neben dem PSP-Reviewtext nun nurnoch der PSP-Screenshot-Stapel angezeigt.

Außerdem plane ich noch ein Modul zu implementieren, welches eine Serie von Spielen darstellen soll. So soll, jedenfalls ist es so geplant, auf der Detailseite zu einem Spiel, unten, eine Darstellung platziert werden, die anzeigt, welche Spiele in der Serie vor und welche nach dem aktuell gezeigten Spiel kamen. So kann der Nutzer bspw. den Verlauf einer Serie nachvollziehen. Außerdem sieht er Spiele, die er vielleicht verpasst hat. Wichtig ist dabei die 1:n Beziehung, da ein Spiel in mehreren Serien erscheinen könnte, bspw. so genannte Cross-Over-Spiele.

Nun zum Elefanten im Raum: die Lokalisierung. Unter Lokalisierung (l10n) oder Internationalisierung (i18n) versteht man das Anbieten einer Software in mehreren Sprachen. Dazu müssen oft bestimmte Vorkehrungen getroffen werden, zum Beispiel muss beachtet werden, dass teilweise andere Alphabete oder Schreibrichtungen verwendet werden. Soweit wurde das hier nicht implementiert. Von Oettinger Games werden nur links-nach-rechts-Schriften unterstützt.

Geplant ist, die Seite komplett in Deutsch und Englisch anzubieten, ausgenommen davon wären Reviewvideos, die ihrer Natur wegen nur einsprachig gehalten sein können und Achievement Guides, die - hoffentlich - generisch genug erstellt werden können, sodass sowohl deutsche als auch internationale Nutzerinnen und Nutzer sie verwenden können.

Die Internationalisierung funktioniert hier so, dass es eine Standardsprache gibt (hier Deutsch), und alle anderen nur Übersetzungen des deutschen Originals sind. Dh. ist keine Übersetzung in der gewünschten Sprache verfügbar, so wird die deutsche Version angezeigt. Der Zugriff auf die Datenbank erfolgt nun zweistufig. Zunächst wird der deutsche Text inkl. Metadaten aus der Datenbank geholt, dann wird versucht einen übersetzten Text in der gewählten Sprache zu finden. Wird er gefunden, wird der deutsche Text mit dem übersetzten Text ersetzt und angezeigt. Ist keine Übersetzung verfügbar, wird der deutsche Text im Speicher beibehalten und somit später angezeigt.

Der Ansatz ist generisch, sodass es für die Module kaum einen nennenswerten Unterschied gibt. Lediglich die localize Methode muss gerufen werden, um die Erkennung der gewählten Sprache, und darum auch Übersetzungen von versch. Modulen gegeneinander abzuschirmen kümmert sich das Lokalisierungssystem. Statischer Text wird aus JSON-Dateien gelesen und zur Laufzeit durch Rufen der Methode "text" eingefügt. Sollte keine Lokalisierungsdatei angegeben sein (in den Konfigurationen des Moduls) wird der Standardtext eingesetzt, der sonst als Hash verwendet wird.

Für mich ist das eigentlich eine recht spannende Technik, da es mir sehr darauf ankam, den vorhandenen Code möglichst wenig verändern zu müssen. Ich denke, das ist mir sehr gut gelungen. Wenigstens muss ich die vorhandenen Tabellen nicht anrühren, sondern konnte die Funktionalität gut in die lang.php packen, und damit getrennt von den eigentlichen Moduln.

Letzte Bearbeitung: 01.11.2015 00:59