Le risposte accettate e le altre non tengono conto del fatto che la lingua preferita può essere un'altra lingua rispetto alla lingua del dispositivo .
La lingua del dispositivo è la lingua in cui vengono presentati gli elementi del sistema operativo e le app Apple.
La lingua preferita è la lingua in cui l'utente vorrebbe localizzare le app. Apple fornisce solo un numero limitato di traduzioni. Se la lingua preferita è una lingua in cui Apple ha tradotto le sue app, sarà anche la lingua del dispositivo. Tuttavia, se l'utente preferisce una lingua per la quale Apple non fornisce traduzioni, il dispositivo e le lingue preferite non corrisponderanno . La lingua del dispositivo non sarà in prima posizione nell'elenco delle lingue preferite.
La seguente funzione passerà attraverso l'elenco delle lingue preferite e controllerà se esiste una traduzione nei framework Apple. La prima lingua per avere una traduzione è la lingua del dispositivo. La funzione restituirà il suo codice lingua.
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
}
Funziona se l'elenco delle lingue preferite è:
- afrikaans (iOS non è tradotto in afrikaans)
- Spagnolo (lingua del dispositivo)
L' elenco delle lingue preferite può essere modificato in : Settings.app -> Generale -> Lingua e regione -> Ordine lingue preferite
È quindi possibile utilizzare il codice lingua del dispositivo e tradurlo nel nome della lingua. Le seguenti righe stamperanno la lingua del dispositivo nella lingua del dispositivo. Ad esempio "Español" se il dispositivo è impostato su spagnolo.
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
. Vedi la mia risposta