Wszystkie zaakceptowane i pozostałe odpowiedzi nie biorą pod uwagę, że preferowanym językiem może być inny język niż język urządzenia .
Język urządzenia to język, w którym prezentowane są elementy systemu operacyjnego i aplikacje Apple.
Preferowany język jest językiem użytkownik chciałby mieć aplikacje zlokalizowane w. Jabłko zapewnia tylko ograniczoną liczbę tłumaczeń. Jeśli preferowanym językiem jest jeden język, na który Apple przetłumaczyło swoje aplikacje, będzie to również język urządzenia. Jeśli jednak użytkownik preferuje język, dla którego Apple nie zapewnia tłumaczeń, urządzenie i preferowane języki nie będą pasować . Język urządzenia nie będzie na pierwszym miejscu na liście preferowanych języków.
Poniższa funkcja przejdzie przez listę preferowanych języków i sprawdzi, czy jest dostępne tłumaczenie w środowisku Apple. Pierwszym językiem do tłumaczenia jest język urządzenia. Funkcja zwróci kod języka.
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
}
Działa to, jeśli lista preferowanych języków to:
- Afrikaans (iOS nie jest tłumaczony na afrikaans)
- Hiszpański (język urządzenia)
Lista język korzystne mogą być edytowane w : Settings.app -> Ogólne -> Język i region -> Preferowany język Zamówienie
Możesz następnie użyć kodu języka urządzenia i przetłumaczyć go na nazwę języka. Poniższe wiersze wydrukują język urządzenia w języku urządzenia. Na przykład „Español”, jeśli urządzenie jest ustawione na hiszpański.
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
. Zobacz moją odpowiedź.