Die akzeptierten und die anderen Antworten berücksichtigen nicht, dass die bevorzugte Sprache eine andere Sprache als die Gerätesprache sein kann .
Die Gerätesprache ist die Sprache, in der Betriebssystemelemente und Apple Apps dargestellt werden.
Die bevorzugte Sprache ist die Sprache, in der der Benutzer Apps lokalisieren möchte. Apple bietet nur eine begrenzte Anzahl von Übersetzungen an. Wenn die bevorzugte Sprache eine Sprache ist, in die Apple seine Apps übersetzt hat, ist dies auch die Gerätesprache. Allerdings , wenn der Benutzer bevorzugt eine Sprache , für die Apple nicht die Übersetzungen des bieten Gerät und bevorzugten Sprachen nicht übereinstimmen . Die Gerätesprache steht in der Liste der bevorzugten Sprachen nicht an erster Stelle.
Die folgende Funktion durchsucht die Liste der bevorzugten Sprachen und prüft, ob in den Apple-Frameworks eine Übersetzung vorhanden ist. Die erste Sprache, die eine Übersetzung hat, ist die Gerätesprache. Die Funktion gibt ihren Sprachcode zurück.
func deviceLanguage() -> String? {
let systemBundle: NSBundle = NSBundle(forClass: UIView.self)
let englishLocale: NSLocale = NSLocale(localeIdentifier: "en")
let preferredLanguages: [String] = NSLocale.preferredLanguages()
for language: String in preferredLanguages {
let languageComponents: [String : String] = NSLocale.componentsFromLocaleIdentifier(language)
guard let languageCode: String = languageComponents[NSLocaleLanguageCode] else {
continue
}
// ex: es_MX.lproj, zh_CN.lproj
if let countryCode: String = languageComponents[NSLocaleCountryCode] {
if systemBundle.pathForResource("\(languageCode)_\(countryCode)", ofType: "lproj") != nil {
// returns language and country code because it appears that the actual language is coded within the country code aswell
// for example: zh_CN probably mandarin, zh_HK probably cantonese
return language
}
}
// ex: English.lproj, German.lproj
if let languageName: String = englishLocale.displayNameForKey(NSLocaleIdentifier, value: languageCode) {
if systemBundle.pathForResource(languageName, ofType: "lproj") != nil {
return languageCode
}
}
// ex: pt.lproj, hu.lproj
if systemBundle.pathForResource(languageCode, ofType: "lproj") != nil {
return languageCode
}
}
return nil
}
Dies funktioniert, wenn die Liste der bevorzugten Sprachen lautet:
- Afrikaans (iOS wird nicht in Afrikaans übersetzt)
- Spanisch (Gerätesprache)
Die Liste der bevorzugten Sprachen kann in bearbeitet werden : Settings.app -> General -> Language & Region -> Preferred Language Order
Sie können dann den Gerätesprachencode verwenden und ihn in den Sprachnamen übersetzen. In den folgenden Zeilen wird die Gerätesprache in der Gerätesprache gedruckt. Zum Beispiel "Español", wenn das Gerät auf Spanisch eingestellt ist.
if let deviceLanguageCode: String = deviceLanguage() {
let printOutputLanguageCode: String = deviceLanguageCode
let printOutputLocale: NSLocale = NSLocale(localeIdentifier: printOutputLanguageCode)
if let deviceLanguageName: String = printOutputLocale.displayNameForKey(NSLocaleIdentifier, value: deviceLanguageCode) {
// keep in mind that for some localizations this will print a language and a country
// see deviceLanguage() implementation above
print(deviceLanguageName)
}
}
NSLocale
. Siehe meine Antwort.