Die akzeptierten und die anderen Antworten berücksichtigen nicht, dass die bevorzugte Sprache kann eine andere Sprache als die Gerätesprache sein .
El Gerätesprache ist die Sprache, in der die Elemente des Betriebssystems und die Apple-Anwendungen dargestellt werden.
El bevorzugte Sprache ist die Sprache, in der der Benutzer die Anwendungen lokalisiert haben 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, wird dies auch die Gerätesprache sein. Allerdings wenn der Benutzer eine Sprache bevorzugt, für die Apple keine Übersetzungen anbietet, wird die Gerät und bevorzugte Sprachen stimmen nicht überein . Die Gerätesprache wird nicht an erster Stelle in der Liste der bevorzugten Sprachen stehen.
Die folgende Funktion geht die Liste der bevorzugten Sprachen durch und prüft, ob es eine Übersetzung in den Apple-Frameworks gibt. Die erste Sprache, für die es eine Übersetzung gibt, ist die Gerätesprache. Die Funktion gibt den 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 ist nicht ins Afrikaans übersetzt)
- Spanisch (Gerätesprache)
El Liste der bevorzugten Sprachen kann sein bearbeitet in : Einstellungen.app -> Allgemein -> Sprache & Region -> Bevorzugte Sprachreihenfolge
Sie können dann den Sprachcode des Geräts verwenden und ihn in den Namen der Sprache übersetzen. In den folgenden Zeilen wird die Gerätesprache in der Gerätesprache ausgegeben. 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)
}
}
1 Stimmen
Dies ist eingebaut in
NSLocale
. Siehe meine Antwort.18 Stimmen
iOS9 Kommentar: achten Sie darauf, dass Apple aus irgendeinem Grund das Format geändert hat, das von
[NSLocale preferredLanguages]
. früher wurde sie durch einen Unterstrich getrennt (z. B.en_US
), aber jetzt wurde er in einen Bindestrich umgewandelt:en-US
7 Stimmen
Mehr zu iOS9: Der Erhalt von [NSLocale preferredLanguages] auf einem iOS 8.4-Simulator im Vergleich zu einem 9.0-Simulator weist ebenfalls Diskrepanzen auf. Auf iOS 8.4 ist es "en" und iOS 9.0 ist es "en-US".
0 Stimmen
Dieser Kommentar hat mir sehr geholfen! Wir steckten mit einem einfachen Problem fest und fragten uns, was etwa 1 Stunde lang falsch lief, bis ich Ihren Kommentar sah.
4 Stimmen
NSLocale
hat MethodencomponentsFromLocaleIdentifier:
ylocaleIdentifierFromComponents:
die wahrscheinlich der richtige Weg sind, um das (potenziell veränderbare) Format zu handhaben.