Blog

iOS-Lokalisierungstricks für Storyboard- und NIB-Dateien

Lammert Westerhoff

Lammert Westerhoff

Aktualisiert Oktober 22, 2025
4 Minuten

Die Lokalisierung der von Interface Builder entworfenen Benutzeroberfläche in iOS war noch nie unproblematisch. Die richtige Art der Lokalisierung besteht darin, mehrere Strings-Dateien zu verwenden. Nib- oder Storyboard-Dateien zu duplizieren und dann die Sprache zu ändern, ist keine akzeptable Methode. Glücklicherweise hat Xcode 5 dies für Storyboards durch die Einführung der Basislokalisierung verbessert, aber ich persönlich habe mehrere Situationen erlebt, in denen dies überhaupt nicht funktionierte oder fehlerhaft erschien. Auch Nib (Xib)-Dateien ohne ViewController unterstützen dies nicht. In diesem Beitrag zeige ich ein paar Tricks, die bei der Lokalisierung von Storyboard- und Nib-Dateien helfen können.

Lokalisierte Unterklassen

Wenn Sie diese Methode verwenden, erstellen Sie spezialisierte Unterklassen von View-Klassen, die die Lokalisierung in der Methode awakeFromNib() übernehmen. Diese Methode wird für jede Ansicht aufgerufen, die aus einem Storyboard oder einer Nib geladen wird, und alle Eigenschaften, die Sie in Interface Builder eingestellt haben, sind bereits eingestellt. Für UILabelsbedeutet dies, dass Sie die Texteigenschaft abrufen, lokalisieren und die Texteigenschaft erneut einstellen. Mit Swift können Sie eine einzige Datei (z.B. LocalizationView.swift) in Ihrem Projekt erstellen und alle Ihre Unterklassen dort ablegen. Fügen Sie dann den folgenden Code für die Unterklasse UILabel ein: [objc] class LocalizedLabel : UILabel { override func awakeFromNib() { if let text = text { self.text = NSLocalizedString(text, comment: "") [/objc] } } } Jetzt können Sie ein Label auf Ihr Storyboard ziehen und den Text wie gewohnt in Ihrer Basissprache eingeben. Ändern Sie dann die Klasse in LocalizedLabel, um die tatsächliche Beschriftung aus der Datei Localizable.strings zu erhalten.

Bildschirmfoto 2014-10-31 um 22.45.46 Bildschirmfoto 2014-10-31 um 22.46.56

Sie brauchen keine Ausgänge zu machen oder Code zu schreiben, um sie zu ändern! Sie können etwas Ähnliches für UIButtonstun, auch wenn sie keine einzige Eigenschaft für den Text auf einer Schaltfläche haben. [objc] class LocalizedButton : UIButton { override func awakeFromNib() { for state in [UIControlState.Normal, UIControlState.Highlighted, UIControlState.Selected, UIControlState.Disabled] { if let title = titleForState(state) { setTitle(NSLocalizedString(title, comment: ""), forState: state) [/objc] } } } } So können Sie sogar verschiedene Bezeichnungen für die verschiedenen Zustände wie Normal und Hervorgehoben festlegen.

Benutzerdefinierte Laufzeitattribute

Eine andere Möglichkeit ist die Verwendung der benutzerdefinierten Laufzeitattribute. Diese Methode erfordert etwas mehr Arbeit, hat aber zwei kleine Vorteile:

  1. Sie brauchen keine Unterklassen zu verwenden. Das ist praktisch, wenn Sie bereits eine andere benutzerdefinierte Unterklasse für Ihre Beschriftungen, Schaltflächen und andere Ansichtsklassen verwenden.
  2. Ihre Schlüssel in der Datei Strings und die Texte, die im Storyboard angezeigt werden, müssen nicht identisch sein. Das funktioniert gut, wenn Sie Lokalisierungsschlüssel wie myCoolTableViewController.header.subtitle verwenden. Es sieht nicht sehr schön aus, wenn diese Schlüssel überall in Ihren Interface Builder-Beschriftungen und -Schaltflächen zu sehen sind.

Wie funktioniert das also? Anstatt eine Unterklasse zu erstellen, fügen Sie stattdessen eine berechnete Eigenschaft zu einer bestehenden Ansichtsklasse hinzu. Für UILabelsverwenden Sie den folgenden Code: [objc] extension UILabel { var localizedText: String { set (key) { text = NSLocalizedString(key, comment: "") } get { return text! [/objc] } } } Jetzt können Sie ein benutzerdefiniertes Laufzeitattribut mit dem Schlüssel localizedText zu Ihrem UILabel hinzufügen und den Lokalisierungsschlüssel als Wert haben.

Bildschirmfoto 2014-10-31 am 23.05.18 Bildschirmfoto 2014-10-31 um 23.06.16

Auch hier wird es etwas komplizierter, wenn Sie diese Funktion für Schaltflächen verwenden möchten. Sie müssen für jeden Status, der eine Beschriftung benötigt, eine Eigenschaft hinzufügen. [objc] Erweiterung UIButton { var localizedTitleForNormal: String { set (key) { setTitle(NSLocalizedString(key, comment: ""), forState: .Normal) } get { return titleForState(.Normal)! } } var localizedTitleForHighlighted: String { set (key) { setTitle(NSLocalizedString(key, comment: ""), forState: .Highlighted) } get { return titleForState(.Highlighted)! } } } [/objc]

Fazit

Versuchen Sie immer, die beste Lösung für Ihr Problem zu finden. Verwenden Sie die Storyboard-Basislokalisierung, wenn das für Sie gut funktioniert. Wenn dies nicht der Fall ist, verwenden Sie den Ansatz mit Unterklassen, wenn Sie keine andere Unterklasse verwenden müssen und wenn es Ihnen egal ist, ob Sie Ihre Basispositionsstrings als Lokalisierungsschlüssel verwenden. Andernfalls verwenden Sie den letzten Ansatz mit benutzerdefinierten Laufzeitattributen.

Verfasst von

Lammert Westerhoff

Contact

Let’s discuss how we can support your journey.