Swift - как получить текущий язык устройства ios - PullRequest
0 голосов
/ 29 сентября 2019

Мое устройство работает под управлением iOS 12 и имеет английский язык в качестве основного языка и иврит в качестве дополнительного языка.

Теперь я открываю свое приложение с английским языком в качестве базовой локализации.

InВ приложении у меня есть список из трех языков: английский, иврит и французский.

Сначала атрибут Locale.preferredLanguages результат: ["en-IL", "he-IL", "fr-IL"]

Если я хочу локализовать все приложение без изменения языка операционной системы, я изменяю только массив AppleLanguages на UserDefaults следующим образом:

func currentAppleLanguage() -> String {
    return (UserDefaults.standard.object(forKey: "AppleLanguages") as? NSArray)?
        .firstObject as? String ?? ""
}
func setAppleLanguageTo(lang: String) {
    UserDefaults.standard.set([lang], forKey: "AppleLanguages")
}

И после того, как я сделаюэто изменение, я перезапускаю свое приложение, и язык меняется.

Дело в том, что после того, как я изменил AppleLanguages в UserDefaults, например, на "he", атрибут Locale.preferredLanguages превращается в: ["he"]

Так что теперь у меня нет резервных локализаций preferredLanguages, которые устанавливаются в операционной системе в приложении настроек.

Более того, я бы хотел узнать, как получить текущийработает язык устройства в операционной системе дажеПосле того, как я изменил язык приложения с помощью AppleLanguages, как это делает Facebook,

Facebook localization screen

Я хотел бы отметить, что при редактировании рабочей схемыЯзык приложения на другой язык, он также меняет язык Apple.

1 Ответ

0 голосов
/ 29 сентября 2019

Вместо того, чтобы заменять массив «AppleLanguages» только одним значением, обновите существующий список, чтобы указанный язык переместился в начало.

func currentAppleLanguage() -> String {
    return UserDefaults.standard.stringArray(forKey: "AppleLanguages")?.first ?? ""
}

func setAppleLanguageTo(lang: String) {
    // Get the current list
    var languages = UserDefaults.standard.stringArray(forKey: "AppleLanguages") ?? []
    // Get all locales using the specified language
    let matching = languages.filter { $0.hasPrefix(lang) }
    if matching.count > 0 {
        // Remove those entries from the list
        languages.removeAll { $0 == lang }
        // Add them back at the start of the list
        languages.insert(contentsOf: matching, at: 0)
    } else {
        // It wasn't found in the list so add it at the top
        languages.insert(lang, at: 0)
    }
    UserDefaults.standard.set(languages, forKey: "AppleLanguages")
}

При этом будет сохранен полный список.Он просто переупорядочивает значения, поэтому желаемый язык стоит первым.

...