1. Dezember 2017

Mehrsprachigkeit

Sprachspezifische lproj-Projektordner

In lokalisierten Projekten werden Storyboards und Ressourcendateien in einem Base Internationalization-Ordner Base.lproj abgelegt. Die Texte werden dann aus .strings-Dateien in sprachspezifischen Ordnern [locale].lproj überschrieben:

Sprachspezifische Ordner in Xcode

Im Projekt können die Sprachen konfiguriert werden:

Localizations im Xcode-Projekt

Sprachen für lokalisierte Dateien können im File Inspector konfiguriert werden - dabei stellt Xcode automatisch die benötigte Ordnerstruktur her:

Lokalisierungen für Dateien im File inspector

Die Zuordnung in den .strings-Dateien erfolgt über die Object ID, die im Identity Inspector sichtbar ist:

Storyboard Object ID im Identity Inspector

Strings im Code übersetzen

Mit NSLocalizedString können Texte aus sprachabhängigen .strings-Dateien geladen werden:

let str = NSLocalizedString("Key", value:"Base Value", comment:"Kommentar für Übersetzer")

Übersetzungs-Workflow mit XLIFF-Dateien

Mit Editor » Export for Localization können aus allen Storyboards und Quelltextdateien mit NSLocalizedString-Statements .xliff-Übersetzungsdateien extrahiert werden:

XLIFF-Übersetzungsdatei exportieren

Das XML Localization Interchange File Format (xliff) ist ein standardisiertes Austauschformat für Übersetzungen. Die Übersetzungen können extern mit einem Editor für das XLIFF-Format bearbeitet werden und mit Import Localizations wieder in das Projekt importiert werden. Diese Vorgehensweise hat gegenüber dem manuellen Bearbeiten der .strings-Dateien den Vorteil, dass Xcode auch neue hinzugekommene, unübersetzte Texte extrahiert und mit den bestehenden Übersetzungen zusammenführt.

Sprache beim Testen wählen

Beim Start der App kann in der Schema-Konfiguration die Sprache gewählt werden:

Sprachauswahl in der Schemakonfiguration

Tutorial 1: App für Deutsch & Englisch lokalisieren

  1. Laden Sie den Start-Stand von dem Flashcards-Beispielprojekt: Flashcards.zip.

  2. Öffnen Sie Main.storyboard. Entfernen Sie alle Platzhalter-Texte (wie „Title“ in den Tabellenzellen) so dass diese nicht unnötigerweise übersetzt werden müssen. Übersetzen Sie zudem für verbleibenden Texte nach Englisch, da Storyboards in Xcode-Projekten nicht ohne weiteres in Deutsch gepflegt werden können:

    Storyboard: Englisch

  3. Öffnen Sie die Klasse CardViewController und ersetzen Sie den Code in der updateViewNavTitle-Methode, der dem navigationItem einen Titel zuweist, durch die Verwendung von NSLocalizedString. Setzen Sie die Werte durch String-Ersetzung ein, so dass Übersetzer die Anordnung der Texte verändern können:

    private func updateNavigationItem() {
        var title = NSLocalizedString("CardTitle", value:"{count} cards remaining",
                                      comment:"Placeholders {count}")
        title = title.replacingOccurrences(of: "{count}", with: String(self.cards.count + 1))
        self.navigationItem.title = title
    }
  4. Passen Sie analog im StartViewController die updateView-Methode an:

    func updateView() {
        var title = NSLocalizedString("StartButtonTitle", value:"Learn {count} cards", comment:"Placeholders {count}")
        title = title.replacingOccurrences(of: "{count}", with: String(FlashcardsModel.shared.cards.count))
        self.btnStart.setTitle(title, for: .normal)
    }
  5. Öffnen Sie im Xcode-Projekt die Localizations-Einstellungen. Hier ist Englisch als Entwicklungssprache für das Projekt konfiguriert. Fügen Sie als 2. Sprache German (de) hinzu:

    Localizations im Xcode-Projekt
  6. Machen Sie sich mit der entstandenen Dateistruktur im Xcode-Projekt und im Finder vertraut:

  7. Wählen Sie die Projektdatei im Project Navigator aus (!) und exportieren Sie mit Editor » Export for Localization .xliff-Übersetzungsdateien:

    XLIFF-Übersetzungsdatei exportieren

    XML Localization Interchange File Format (xliff) ist ein standardisiertes Austauschformat für Übersetzungen. Der Export hat gegenüber dem manuellen Bearbeiten der .strings-Dateien vor allem den Vorteil, dass dabei von Xcode neue Texte (im Storyboard / NSLocalizedString in Quelltextdateien) automatisch extrahiert und mit bestehenden Übersetzungen zusammengeführt werden.

  8. Verwenden Sie XLIFFTool (kostenfrei im Mac App Store) um die exportierten Übersetzungen in en.xliff zu bearbeiten. Deaktivieren Sie dazu die Option Only non-translated. Lassen Sie die Info.plist-Texte leer und achten Sie darauf, auch Übersetzungen für die Texte in Flashcards/Localizable.strings anzugeben:

    Xliff Editor
  9. Wählen Sie erneut das Projekt aus und importieren Sie die Übersetzungen in Xcode mittels Editor » Import Localizations.

  10. Verwenden Sie die Vorschau im Assistant Editor des Storyboards um die Korrektheit der Texte für beide Sprachen zu überprüfen:

    Vorschau für Übersetzungen im Storyboard
  11. Starten Sie die App in deutscher und in englischer Sprache, indem Sie in der Schema-Konfiguration die Sprache auswählen:

    Sprachauswahl in der Schemakonfiguration
    Sprachauswahl in der Schemakonfiguration

    Sollten die Übersetzungen nicht wie erwartet angezeigt werden, ist dies ist häufig ein Xcode-Problem nach der Umstellung von einem unlokalisiertem Projekt zu einem lokalisiertem Projekt: Project > Clean und ein Löschen der App vom Simulator / vom Gerät (bzw. Simulator > Reset Content and Settings...) schafft Abhilfe.

  12. Passen Sie FlashcardsUITests so an, dass die Tests immer auf Deutsch ausgeführt werden:

    let app = XCUIApplication()
    app.launchArguments = ["--clear", "-AppleLocale", "de_DE", "-AppleLanguages", "(de)"]
    app.launch()
  13. Führen Sie die Tests mit Product » Test ⌘U aus.

  14. Committen Sie Ihre Änderungen: „25.1. Englische und deutsche Übersetzungen“.