Использование неправильной Localizable.string

У меня есть приложение iOS с языком по умолчанию (английский). Он также имеет французскую локализацию и работает должным образом на обоих языках.

Вот проблема, с которой я сталкиваюсь: При настройке устройства на язык, отличный от английского (по умолчанию) или языка, для которого предусмотрена локализация (например, установка устройства на японский язык); приложение не падает как положено на языке по умолчанию. Но он сохраняет последний язык, используемый для приложения. Это почему? И как я могу это исправить?

Я нашел несколько сообщений с похожей проблемой, но предложенные решения не сработали для меня. Например, этот, где проблема похожа на мою.

Я использую Xcode версии 11.1 и iOS версии 12.4.2.


person Michel    schedule 23.10.2019    source источник


Ответы (1)


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

Итак, если вы перешли с английского на несопоставленный язык (например, ko), приложение будет иметь в качестве AppleLanguages ​​массив:

[ko-(Код Зоны), en-(Код Зоны)].

Вы можете избежать этой процедуры, используя этот код ниже:

let defaultCultureCode: String = "en"
let defaults = UserDefaults.standard
let currentAppleLanguages = defaults.stringArray(forKey: "AppleLanguages")
if let currentLanguages = currentAppleLanguages {
    if(!currentLanguages.isEmpty && !(currentLanguages.first?.contains(["en", "fr"]))!) {
            defaults.removeObject(forKey: "AppleLanguages")
            defaults.set([defaultCultureCode], forKey: "AppleLanguages")
            defaults.synchronize()
        }
    }

Я использовал это строковое расширение, чтобы проверить, содержат ли текущие языки доступный язык:

extension String {
    public func contains(_ elements: [String]) -> Bool {
        var haveElementOnString = false

        if elements.count == 0 { return false }
        else { elements.forEach{ element in haveElementOnString = haveElementOnString || self.contains(element)} }

        return haveElementOnString
    }
}

Следующим шагом вы должны определить лучшую стратегию.

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

В StackOverflow есть много информации о bundle.localizedStringForKey или NSLocalizedString, которая может помочь вам найти лучшее решение для того, что вам нужно.

Кроме того, это только проверка и обновление для текущей локали и языка по умолчанию. сюда не входит раздел «Регион» (например, ko-KR (KR)).

Я нашел интересный текст на эту тему, который может быть полезен Как не надо делать локализацию.

Я надеюсь, что это решит вашу проблему!

person Luiz Henrique    schedule 23.10.2019
comment
Это очень полезная информация, она многое проясняет. Но где вы включаете свой код. Я пробовал, где-то в viewDidLoad. Не работает при первом запуске приложения, работает только со второго раза и после. Ты знаешь почему? - person Michel; 24.10.2019
comment
Я также пытался поместить код внутрь application:didFinishLaunchingWithOptions:, но результат был идентичным. - person Michel; 24.10.2019
comment
То же самое с кодом внутри application:willFinishLaunchingWithOptions: - person Michel; 24.10.2019
comment
Это отразится на приложении, только если вы не используете NSLocalizedString. Я предлагаю использовать реализацию bundle.localizedStringForKey. Я обновлю свой ответ, будет ли полное решение - person Luiz Henrique; 25.10.2019
comment
да. Покопавшись еще немного в теме, я вижу, что для одного и того же пользователя может быть несколько предпочитаемых языков по его предыдущим настройкам. - person Michel; 27.10.2019