-Development: Strings in der Info.plist-Datei übersetzen

Vor kurzem stand ich in einem meiner iOS-Projekte vor dem folgenden Problem: In einer internen Business-App für einen Drittkunden wird eine Kartenansicht verwendet, um die Referenzen des Unternehmens darauf anzuzeigen. Diese Funktion sollte so erweitert werden, dass – wenn der Nutzer der App dem zustimmt – zusätzlich der aktuelle Standort des Nutzers ebenfalls auf der Karte angezeigt wird und beim erstmaligen Laden der Karte direkt ein bestimmter Bereich um den Standort des Nutzers herum eingeblendet wird.

So weit, so gut.

Um in der aktuellen iOS-Version den Standort des Nutzers abfragen zu dürfen, reicht es aber nicht länger aus, mithilfe der Klasse CLLocationManager aus dem Core Location-Framework jene Nutzung autorisieren zu lassen. Zusätzlich muss in der Info.plist-Datei des Projekts der Schlüssel NSLocationWhenInUseUsageDescription hinzugefügt und diesem als Wert ein String zugewiesen werden, der beschreibt, warum die App Zugriff auf den Standort des Nutzers erhalten möchte.

Das rot umrandete letzte Schlüsselwertpaar ist innerhalb einer Info.plist-Datei notwendig, möchte man den Standort eines Nutzers in einer iOS-App ermitteln.
Das rot umrandete letzte Schlüsselwertpaar ist innerhalb einer Info.plist-Datei notwendig, möchte man den Standort eines Nutzers in einer iOS-App ermitteln.

Das Problem mit der Mehrsprachigkeit

Auch das ist an sich so kein Problem; Schlüssel in der Info.plist-Datei hinzufügen und passenden String niederschreiben, fertig! Allerdings gab es da in genanntem Projekt ein zentrales Problem:

Die App ist mehrsprachig. Und in der Info.plist-Datei lässt sich nur ein String unterbringen, sprich nur eine Sprache unterstützen.

Wie also löst man dieses Problem? Wie übersetzt man Strings innerhalb einer Info.plist-Datei?

Mein erster Gedanke war: Ich übersetzte die Datei selbst und pflege so eine Info.plist für jede unterstützte Sprache (übrigens ein Tipp, der sich auch zuhauf im Internet findet, in Wirklichkeit aber alles andere als eine gute und saubere Lösung darstellt). Das Problem dabei ist aber, das viele grundlegende Informationen, die für die App als ganzes gelten (wie zum Beispiel die Versionsnummer) in mehreren Dateien aktualisiert und gepflegt werden müssten. Auch muss man einem App-Target letztlich sowieso eine einzige Info.plist-Datei explizit zuweisen, aus der die genannten grundlegenden Informationen ausgelesen werden; die anderen übersetzten Dateien spielen diesbezüglich dann überhaupt keine Rolle mehr.

Die Lösung: STRINGS-File für Info.plist

Die mit Abstand beste und gelungenste Lösung für das genannte Problem stammt von Apple selbst und ist gleichermaßen simpel wie genial: Man verwendet explizit der Info.plist-Datei zugehörige STRINGS-Files, die in mehreren Sprachen angeboten werden können und die die jeweilige Übersetzung pro Sprache für den zugrundeliegenden Schlüssel enthalten. Im Endeffekt entspricht das Vorgehen also dem zum Übersetzen von Strings im Code mithilfe von NSLocalizedString und passender Localizable.strings-Dateien.

Damit dieses Verfahren funktioniert und das System weiß, dass es für einzelne Schlüssel der Info.plist-Datei eine Übersetzung gibt, muss zunächst ein neues STRINGS-File mit dem Namen InfoPlist.strings erstellt werden. Diese Datei kann anschließend in alle gewünschten Sprachen übersetzt werden, um so je eine InfoPlist.strings-Datei pro benötigter Sprache anzubieten.

In seiner Dokumentation beschreibt Apple, wie sich Strings der Info.plist-Datei übersetzen lassen.
In seiner Dokumentation beschreibt Apple, wie sich Strings der Info.plist-Datei übersetzen lassen.

Innerhalb dieser verschiedenen InfoPlist.strings-Dateien werden dann jene Schlüssel zur Übersetzung eingefügt, die auch in der Info.plist-Datei zum Einsatz kommen (in diesem Fall also NSLocationWhenInUseUsageDescription) und ihnen die gewünschte Übersetzung pro Sprache zugewiesen (ganz so, wie man es bereits von der Arbeit mit Localizable.strings-Dateien her kennt).

Sollte nun die App einen Schlüssel aus der Info.plist-Datei auslesen, wird geprüft, ob für diesen Schlüssel ein Eintrag in der neu erstellten InfoPlist.strings-Datei existiert. Ist das der Fall, wird der darin aufgeführte String passend zur gesetzten Systemsprache automatisch ausgelesen und verwendet. Um also so beispielsweise eine Übersetzung für den Schlüssel NSLocationWhenInUseUsageDescription anzubieten, muss man nichts weiter tun, als diesen in der InfoPlist.strings-Datei hinzuzufügen und die gewünschte Übersetzung pro Sprache zu setzen. Um den Rest kümmert sich das System vollautomatisch.

Die InfoPlist.strings-Datei wird pro gewünschter Sprache lokalisiert und in den jeweiligen Sprachdateien anschließend die Übersetzung für die Schlüssel aus der Info.plist-Datei hinzugefügt.
Die InfoPlist.strings-Datei wird pro gewünschter Sprache lokalisiert und in den jeweiligen Sprachdateien anschließend die Übersetzung für die Schlüssel aus der Info.plist-Datei hinzugefügt.

Fazit

Der gezeigte Weg zur Übersetzung von Strings aus der Info.plist-Datei ist gleichermaßen einfach wie elegant. STRINGS-Dateien werden jeher für die Übersetzung von iOS-Apps eingesetzt und dieses Prinzip wird auch bei der Info.plist fortgesetzt. Dass das System automatisch eine STRINGS-Datei mit dem Namen InfoPlist.strings der Info.plist-Datei zuordnet und ohne sonstige Anweisungen übersetzte Schlüssel daraus ausliest, macht die Arbeit für uns Apple-Entwickler extrem simpel und unkompliziert. Letzten Endes ist alles, was wir tun müssen, eine solche InfoPlist.strings-Datei zu erstellen, zu lokalisieren und die gewünschten Schlüssel aus der Info.plist-Datei zu übersetzen.


Also published on Medium.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.