Localization with&without Unity

 von Philipp Schäfer Während wir fröhlich an mehreren, noch unangekündigten Projekten herumbasteln, sei die Zeit einmal dafür genutzt einen kleinen Tech-Post zu schreiben. Lokalisierung und Unity war die Tage eine Überraschung für mich, da unerwarteter Weise von Haus aus nichts implementiert ist (oder bin ich nur zu inkompetent sie zu finden? ). Die Anzahl an Plugins zu diesem Thema legte mir aber nahe, dass Unity hier der Lobby der unzähligen…

von Philipp Schäfer

Während wir fröhlich an mehreren, noch unangekündigten Projekten herumbasteln, sei die Zeit einmal dafür genutzt einen kleinen Tech-Post zu schreiben.
Lokalisierung und Unity war die Tage eine Überraschung für mich, da unerwarteter Weise von Haus aus nichts implementiert ist (oder bin ich nur zu inkompetent sie zu finden? ). Die Anzahl an Plugins zu diesem Thema legte mir aber nahe, dass Unity hier der Lobby der unzähligen Plugin-Firmen einen Gefallen getan hat. Die Plugins hatten teilweise ellenlange Dokumentationen und waren in vielen Fällen erstaunlich umständlich konstruiert. Dabei geht es doch nur darum, eine string-Variable anhand eines einzelnen Parameters, der Sprache, auszuwählen.
Erst vor kurzem hatten wir einen Artikel in der Making Games, in dem wir darüber geredet haben, wie es uns mit der eigenen Engine ergangen ist. Nun hier ist ein Punkt aus dem Kapitel „Lessons learned“: Es ist einfach manchmal deutlich schneller etwas Kleines selber zu produzieren.

2015_05_12_philipp1

Eine Tabelle mit einem Schlüssel-string in der ersten Spalte gefolgt von den entsprechenden Texten in Deutsch, Englisch ist schnell erstellt und als praktische csv-Datei abgespeichert. Einen C#-reader für csv-Dateien findet man im Handumdrehen im Internet. Andererseits ist er auch dank eines Tokenizers schnell selber geschrieben. Die Zeilen definieren sich normalerweise durch einen Umbruch „n“ und die Spalten über „,“ oder „;“. Die meisten Fälle werden hier durch eine Regular Expression abgedeckt:

2015_05_12_philipp2

Man fügt die csv-Datei in das Unity-Projekt ein und übergibt sie dem Reader der sie zum Programmstart ausliest und schon hat man alle Daten, die man braucht im einfachsten Fall in einem 2D Array als direktes Abbild der Tabelle.
Jetzt fehlt nur noch ein Übersetzer–Skript, das man an Objekte hängt und das automatisch alle angehängten Texte durch die aktuelle Sprache ersetzt. Bei einem Sprachwechsel sucht man sich einfach alle Übersetzer und führt sie aus.
Verbesserungen? Gibt es natürlich viele! Wenn man viele Texte hat, sollte man auf numerische IDs umsteigen um kostenintensive string-Vergleiche zu minimalisieren. Verfügt das Projekt über viele und lange Texte, sollte man außerdem den Text nicht gleich komplett zu Anfang in den Speicher laden sondern nur bei Bedarf.
Alles in allem bin ich sehr zufrieden mit der Entscheidung in diesem Fall die Lösung selber implementiert zu haben. Falls jemand von euch diese Lösung auch implementieren will und weitere Informationen braucht, schreibt mir einfach eine Mail.