iOS Как перезапустить приложение для смены языка Swift 4 - PullRequest
0 голосов
/ 06 сентября 2018

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

У меня уже есть Localization.string

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

Но я хочу изменить язык вручную из примера профиля пользователя:

enter image description here

И для этого я использую следующий код:

private func changeToLanguage(_ langCode: String) {
    if Bundle.main.preferredLocalizations.first != langCode {
        let message = "In order to change the language, the App must be closed and reopened by you."
        let confirmAlertCtrl = UIAlertController(title: "App restart required", message: message, preferredStyle: .alert)

        let confirmAction = UIAlertAction(title: "Close now", style: .destructive) { _ in
            UserDefaults.standard.set([langCode], forKey: "AppleLanguages")
            UserDefaults.standard.synchronize()
            exit(EXIT_SUCCESS)
        }
        confirmAlertCtrl.addAction(confirmAction)

        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
        confirmAlertCtrl.addAction(cancelAction)

        present(confirmAlertCtrl, animated: true, completion: nil)
    }
    UserDefaults.standard.set([langCode], forKey: "AppleLanguages")
    UserDefaults.standard.synchronize()
}



  @IBAction func didPressChangeLanguageButton() {
    let message = "Change language of this app including its content."
    let sheetCtrl = UIAlertController(title: "Choose language", message: message, preferredStyle: .actionSheet)

    for languageCode in Bundle.main.localizations.filter({ $0 != "Base" }) {
        let langName = Locale.current.localizedString(forLanguageCode: languageCode)
        let action = UIAlertAction(title: langName, style: .default) { _ in
            self.changeToLanguage(languageCode) // see step #2
        }
        sheetCtrl.addAction(action)
    }

    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
    sheetCtrl.addAction(cancelAction)

    sheetCtrl.popoverPresentationController?.sourceView = self.view
    sheetCtrl.popoverPresentationController?.sourceRect = self.changeLanguageButton.frame
    present(sheetCtrl, animated: true, completion: nil)
}

И я использую этот комплект:

Bundle.main.localizations.filter({ $0 != "Base" })
Locale.current.localizedString(forLanguageCode: "en")

Для этого кода у меня есть:

enter image description here

И когда я нажимаю кнопку, я получаю ошибку:

причина: «Действия, добавленные в UIAlertController, должны иметь заголовок»

Понятия не имею, в чем проблема.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

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

Для получения более подробной информации перейдите по этой ссылке: ручной выбор языка в iOS-приложении (iPhone и iPad)

0 голосов
/ 06 сентября 2018

в моем недавнем приложении я использовал это localize , это просто и без закрытия приложения мы можем переключать приложение в зависимости от языка.

добавьте файл localize.swift в ваш проект и, наконец, вызовите следующую функцию, где вам нужно

if let pre = Bundle.main.preferredLocalizations.first, !pre.isEmpty  {
            if pre == Language.english.rawValue{
                Language.language = Language.arabic
            }else{
                 Language.language = Language.english
            }

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...