Все принятые и другие ответы не учитывают, что предпочтительным языком может быть язык, отличный от языка устройства .
Язык устройства - это язык, на котором представлены элементы операционной системы и приложения Apple.
предпочтительный язык - это язык, на котором пользователь хотел бы локализовать приложения. Apple предоставляет только ограниченный набор переводов. Если предпочтительным языком является язык, на который Apple перевела свои приложения, это также будет язык устройства. Однако , если пользователь предпочитает язык, для которого Apple не предоставляет переводы, устройство и предпочтительные языки не будут соответствовать . Язык устройства не будет на первой позиции в списке предпочтительных языков.
Следующая функция просматривает список предпочитаемых языков и проверяет, есть ли перевод в платформах Apple. Первый язык для перевода - это язык устройства. Функция вернет свой код языка.
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
}
Это работает, если список предпочитаемых языков:
- африкаанс (iOS не переводится на африкаанс)
- Испанский (Язык устройства)
Список предпочтительных языков может быть отредактирован в : Settings.app -> Общие -> Язык и регион -> Порядок предпочтительных языков
Вы можете использовать код языка устройства и перевести его на название языка. Следующие строки будут печатать язык устройства на языке устройства. Например, «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)
}
}