Все принятые и другие ответы не учитывают, что предпочтительным языком может быть язык, отличный от языка устройства .
Язык устройства - это язык, на котором представлены элементы операционной системы и приложения 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)
}
}
NSLocale
. Смотри мой ответ.