As respostas aceitas e as demais respostas não levam em consideração que o idioma preferido pode ser outro idioma que não o idioma do dispositivo .
O idioma do dispositivo é o idioma no qual os elementos do sistema operacional e os aplicativos da Apple são apresentados.
O idioma preferido é o idioma em que o usuário gostaria que os aplicativos fossem localizados. A Apple fornece apenas um conjunto limitado de traduções. Se o idioma preferido for um idioma para o qual a Apple traduziu seus aplicativos, também será o idioma do dispositivo. No entanto, se o usuário preferir um idioma para o qual a Apple não fornece traduções, o dispositivo e os idiomas preferidos não corresponderão . O idioma do dispositivo não estará na primeira posição na lista de idiomas preferidos.
A função a seguir percorrerá a lista de idiomas preferidos e verificará se há uma tradução nas estruturas da Apple. O primeiro idioma a ter uma tradução é o idioma do dispositivo. A função retornará seu 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
}
Isso funciona se a lista de idiomas preferidos for:
- Africâner (iOS não é traduzido para Africâner)
- Espanhol (idioma do dispositivo)
A lista de idiomas preferidos pode ser editada em : Settings.app -> Geral -> Idioma e região -> Ordem do idioma preferido
Você pode usar o código do idioma do dispositivo e traduzi-lo para o nome do idioma. As linhas a seguir imprimirão o idioma do dispositivo no idioma do dispositivo. Por exemplo "Español" se o dispositivo estiver definido para espanhol.
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
. Veja minha resposta.