Las respuestas aceptadas y las demás no tienen en cuenta que el idioma preferido puede ser otro idioma que el idioma del dispositivo .
El idioma del dispositivo es el idioma en el que se presentan los elementos del sistema operativo y las aplicaciones de Apple.
El idioma preferido es el idioma en el que al usuario le gustaría tener aplicaciones localizadas. Apple solo proporciona un conjunto limitado de traducciones. Si el idioma preferido es un idioma al que Apple tradujo sus aplicaciones, también será el idioma del dispositivo. Sin embargo, si el usuario prefiere un idioma para el que Apple no proporciona traducciones, el dispositivo no coincidirá con los idiomas preferidos . El idioma del dispositivo no estará en la primera posición en la lista de idiomas preferidos.
La siguiente función recorrerá la lista de idiomas preferidos y comprobará si hay una traducción en los marcos de Apple. El primer idioma en tener una traducción es el idioma del dispositivo. La función devolverá su código de idioma.
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
}
Esto funciona si la lista de idiomas preferidos es:
- Afrikaans (iOS no está traducido al afrikaans)
- Español (idioma del dispositivo)
La lista de idiomas preferidos se puede editar en : Configuración.app -> General -> Idioma y región -> Orden de idioma preferido
Puede usar el código de idioma del dispositivo y traducirlo al nombre del idioma. Las siguientes líneas imprimirán el idioma del dispositivo en el idioma del dispositivo. Por ejemplo "Español" si el dispositivo está configurado en español.
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
. Mira mi respuesta.