HTTPURLResponse.localizedString (forStatusCode :) не на языке разработки - PullRequest
0 голосов
/ 17 марта 2019

Я делаю приложение для iOS, и у меня есть эта проблема.

  • Мое приложение в большинстве случаев будет только на испанском, поэтому я изменил язык разработки (сложным образом, изменив developmentRegion = es; внутри project.pbxproj и изменив CFBundleDevelopmentRegion=es в Info.plist)
  • Я также добавляю Localizable.strings к своему единственному языку (ам), чтобы все Strings были в одном документе. И все мои NSLocalizedStrings отлично работают

Проблема возникает, когда я использую функцию HTTPURLResponse.localizedString(forStatusCode:) это только вернуло мне Strings на английском языке. Ранее работал нормально, но после добавления Localizable.string не работает больше

Любая помощь, чтобы вернуть Strings на испанский ??

1 Ответ

1 голос
/ 17 марта 2019

Я думаю, что вам не хватает правильного подхода.

Вам не нужно локализовать сетевую ошибку низкого уровня как:

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

Для III пункта:

final private func downloadMyData(){

guard let myURL = URL(string: "__https://ingconti.com/wrongurl") else{

    return
}

let session = URLSession.shared

let task = session.dataTask(with: myURL) { (data: Data?, response: URLResponse?, error: Error?) in

    // session cannot be created...
       if let error = error  {
            self.manageLowLevel(error: error)
            return
        }

    var statusCode: Int = 0
    if let httpResponse : HTTPURLResponse = response as? HTTPURLResponse{
        statusCode = httpResponse.statusCode
    }

    if 200 ... 299 ~= statusCode {
        self.parse(data: data)
    }else{
        self.manageHTTPError(code: statusCode, data: data)
    }
}


task.resume()

}

Если вы получили БОЛЬШУЮ ошибку (например, в моем коде я использовал неправильный префикс "__https") Вы получите _code = -1022,

и вы можете управлять следующим образом:

 final private func manageLowLevel(error: Error){
        #if DEBUG
        print(error)
        #endif
        var msg = ""
        let code = error._code
        switch code {
        case -1002:
            msg = localized("GENERIC_NETWORK_ERR")
        default:
            msg = localized("GENERIC_NETWORK_ERR")
        }

        // display msg... (on MAIN THREAD...)
    }



    func localized(_ msg: String)->String{
        let s = NSLocalizedString(msg, comment : "")
        return s
    }

Где Вы можете замаскировать сообщение для конечного пользователя и сделать его более общим (и локализованным с помощью вспомогательной функции "localized")

Для ошибки HTTP (например, не найден ресурс ... т.е. "https://ingconti.com/wrongurl") Вы получите ошибку 404 в http / s.

Так что вы можете сделать подобное:

final private func manageHTTPError (код: Int, данные: Data?) { охранник пусть данные = данные еще { вернуть }

    #if DEBUG
    if let s = String(data: data, encoding: .utf8){
        print(s)
    }else{
        if let s = String(data: data, encoding: .ascii){
            print(s)
        }
    }
    #endif

    var msg = ""
    switch code {
    case 404:
        msg = localized("NETWORK_CODE_404")
    default:
        msg = localized("GENERIC_NETWORK_ERR")
    }

    // display msg...
}

Или даже объединены вместе.

(строка s в

# если отладка если пусть s = .....

покажет ошибку сервера и снова не покажет пользователю ...)

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

"GENERIC_NETWORK_ERR" = "Ошибка сети"; "NETWORK_CODE_404". = "Ошибка сети (нет данных)";

и по-испански ...

"GENERIC_NETWORK_ERR" = "ошибка красного цвета"; ...

Надеюсь, это поможет.

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