HTTPURLResponse.localizedString(forStatusCode:) 不是开发语言

HTTPURLResponse.localizedString(forStatusCode:) not in development language

我正在制作一个 iOS 应用程序,但遇到了这个问题。

使用函数时出现问题HTTPURLResponse.localizedString(forStatusCode:) 它只会用英文返回 Strings。以前工作正常,但在添加 Localizable.string 后就不再工作了

任何有助于将 Strings 恢复为西班牙语的帮助?

我认为你错过了正确的方法。

您不需要将低级网络错误定位为:

  • 通常对最终用户没有用
  • 方便开发,不显示(您最终可以记录它们..)
  • 当您获得代码后,在可读的通用消息中更改它,然后将其本地化。

第三点:

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”)您将在 http/s.

中收到错误 404

所以你可以做类似的事情:

final private func manageHTTPError(code: Int, data : Data?){ 守卫让数据=数据其他{ return }

    #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 在

#if调试 如果让 s = .....

将显示服务器错误,并且不再向用户显示...)

总结一下: 所以不要显示低级错误,请参阅温和的消息,例如在你本地化的字符串中你可以有:

"GENERIC_NETWORK_ERR" = "Network error"; "NETWORK_CODE_404"。 = "Network error (no data)";

以及西班牙语...

"GENERIC_NETWORK_ERR" = "error de red "; ...

希望对您有所帮助。