Internationalisierung (i18n) in Swift: NSLocalizedString und String Catalog

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Internationalisierung (i18n) in Swift: vollständiger Leitfaden für iOS und macOS

\n\n

Internationalisierung (i18n) ist der Prozess des Entwerfens einer Anwendung, sodass sie ohne technische Änderungen an verschiedene Sprachen und Regionen angepasst werden kann. Im Apple-Ökosystem (iOS, macOS, watchOS, tvOS) sind die Werkzeuge zur Lokalisierung direkt in Swift und Xcode integriert. In diesem Artikel werden wir im Detail erläutern, wie man NSLocalizedString und den modernen String Catalog verwendet, um mehrsprachige Anwendungen zu erstellen.

\n\n

Grundlagen: NSLocalizedString

\n\n

Der grundlegende Mechanismus der Internationalisierung in Swift ist die Funktion NSLocalizedString. Sie sucht die Übersetzung eines Strings in .strings- oder .xcstrings-Dateien (String Catalog).

\n\n
let greeting = NSLocalizedString("hello_world", comment: "Begrüßung auf dem Hauptbildschirm")\nprint(greeting) // Gibt die Übersetzung basierend auf der Gerätesprache aus
\n\n

Der Parameter comment dient als Hinweis für den Übersetzer. Der Schlüssel "hello_world" sollte im gesamten Projekt eindeutig sein.

\n\n

Erstellen von Lokalisierungsdateien

\n\n

In Xcode können Sie unterstützte Sprachen über Project Info > Localizations hinzufügen. Danach werden für jede .strings-Datei oder jedes Storyboard Unterdateien für die Lokalisierung erstellt.

\n\n

Beispielinhalt von Localizable.strings (Englisch):

\n
"hello_world" = "Hello, World!";\n"welcome_message" = "Welcome to our app %@";
\n\n

Russische Version (Localizable.strings (Russian)):

\n
"hello_world" = "Привет, мир!";\n"welcome_message" = "Добро пожаловать в наше приложение %@";
\n\n

Formatierung von Strings mit Parametern

\n\n

Für Strings, die dynamische Daten enthalten, verwenden Sie Formatspezifizierer. In Swift gibt es zwei Möglichkeiten:

\n\n

Methode 1: String(format:)

\n
let userName = "Иван"\nlet points = 150\nlet message = String(format: NSLocalizedString("user_score", comment: "Punkte des Benutzers"), userName, points)\nprint(message) // "Иван набрал 150 очков"
\n\n

In der Lokalisierungsdatei:

\n
"user_score" = "%@ набрал %d очков";
\n\n

Methode 2: Swift String Interpolation (iOS 15+)

\n
let message = "\\(userName) набрал \\(points) очков"
\n

Diese Methode ist jedoch nicht für die Lokalisierung geeignet, da die Wortreihenfolge in verschiedenen Sprachen unterschiedlich sein kann. Verwenden Sie ausschließlich String(format:) oder AttributedString mit Flexion.

\n\n

Pluralisierung (Mehrzahlformen)

\n\n

Im Russischen gibt es komplexe Deklinationsregeln: "1 файл", "2 файла", "5 файлов". Dafür bietet Apple stringsdict (XML) oder String Catalog mit Pluralisierungsregeln an.

\n\n

Beispiel stringsdict

\n
<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"\n  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">\n<dict>\n    <key>files_count</key>\n    <dict>\n        <key>NSStringLocalizedFormatKey</key>\n        <string>%#@files@</string>\n        <key>files</key>\n        <dict>\n            <key>NSStringFormatSpecTypeKey</key>\n            <string>NSStringPluralRuleType</string>\n            <key>NSStringFormatValueTypeKey</key>\n            <string>d</string>\n            <key>one</key>\n            <string>%d Datei</string>\n            <key>few</key>\n            <string>%d Dateien</string>\n            <key>many</key>\n            <string>%d Dateien</string>\n            <key>other</key>\n            <string>%d Dateien</string>\n        </dict>                    

Empfehlungen