Internationalisierung (i18n) in Swift: vollständiger Leitfaden für iOS und macOS
\n\nInternationalisierung (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\nGrundlagen: NSLocalizedString
\n\nDer grundlegende Mechanismus der Internationalisierung in Swift ist die Funktion NSLocalizedString. Sie sucht die Übersetzung eines Strings in .strings- oder .xcstrings-Dateien (String Catalog).
let greeting = NSLocalizedString("hello_world", comment: "Begrüßung auf dem Hauptbildschirm")\nprint(greeting) // Gibt die Übersetzung basierend auf der Gerätesprache aus\n\nDer Parameter comment dient als Hinweis für den Übersetzer. Der Schlüssel "hello_world" sollte im gesamten Projekt eindeutig sein.
Erstellen von Lokalisierungsdateien
\n\nIn 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.
Beispielinhalt von Localizable.strings (Englisch):
"hello_world" = "Hello, World!";\n"welcome_message" = "Welcome to our app %@";\n\nRussische Version (Localizable.strings (Russian)):
"hello_world" = "Привет, мир!";\n"welcome_message" = "Добро пожаловать в наше приложение %@";\n\nFormatierung von Strings mit Parametern
\n\nFür Strings, die dynamische Daten enthalten, verwenden Sie Formatspezifizierer. In Swift gibt es zwei Möglichkeiten:
\n\nMethode 1: String(format:)
\nlet userName = "Иван"\nlet points = 150\nlet message = String(format: NSLocalizedString("user_score", comment: "Punkte des Benutzers"), userName, points)\nprint(message) // "Иван набрал 150 очков"\n\nIn der Lokalisierungsdatei:
\n"user_score" = "%@ набрал %d очков";\n\nMethode 2: Swift String Interpolation (iOS 15+)
\nlet message = "\\(userName) набрал \\(points) очков"\nDiese 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.
Pluralisierung (Mehrzahlformen)
\n\nIm Russischen gibt es komplexe Deklinationsregeln: "1 файл", "2 файла", "5 файлов". Dafür bietet Apple stringsdict (XML) oder String Catalog mit Pluralisierungsregeln an.
\n\nBeispiel 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> Auch in der Bibliothek
ts-pattern für TypeScript: Vollständige Anleitung mit Beispielen
Objekt-Serialisierung in C++: Bibliotheken, Methoden und Codebeispiele
ORM für JavaScript (Node.js): Vergleich von Sequelize, TypeORM, Prisma
Reaktive Programmierung in Swift: Combine und RxSwift für iOS/macOS