Les réponses acceptées et les autres ne tiennent pas compte du fait que la langue préférée peut être une autre langue que la langue de l'appareil .
La langue de l'appareil est la langue dans laquelle les éléments du système d'exploitation et les applications Apple sont présentés.
La langue préférée est la langue dans laquelle l'utilisateur souhaite que les applications soient localisées. Apple ne fournit qu'un ensemble limité de traductions. Si la langue préférée est une langue vers laquelle Apple a traduit ses applications, ce sera également la langue de l'appareil. Cependant, si l'utilisateur préfère une langue pour laquelle Apple ne fournit pas de traductions, l' appareil et les langues préférées ne correspondent pas . La langue de l'appareil ne sera pas en première position dans la liste des langues préférées.
La fonction suivante va parcourir la liste des langues préférées et vérifier s'il y a une traduction dans les frameworks Apple. La première langue à traduire est la langue de l'appareil. La fonction renverra son code de langue.
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
}
Cela fonctionne si la liste des langues préférées est:
- Afrikaans (iOS n'est pas traduit en afrikaans)
- Espagnol (langue de l'appareil)
La liste des langues préférées peut être modifiée dans : Settings.app -> General -> Language & Region -> Preferred Language Order
Vous pouvez alors utiliser le code de langue de l'appareil et le traduire en nom de langue. Les lignes suivantes imprimeront la langue de l'appareil dans la langue de l'appareil. Par exemple, "Español" si l'appareil est réglé sur l'espagnol.
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
. Voir ma réponse.