【问题标题】:HTTPURLResponse.localizedString(forStatusCode:) not in development languageHTTPURLResponse.localizedString(forStatusCode:) 不是开发语言
【发布时间】:2019-08-07 20:00:26
【问题描述】:

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

  • 我的应用程序大多只有西班牙语,所以我更改了开发语言(以艰难的方式,更改project.pbxproj 中的developmentRegion = es; 并更改Info.plist 中的CFBundleDevelopmentRegion=es
  • 我还将Localizable.strings 添加到我唯一的语言中,以便将所有Strings 包含在一个文档中。我所有的NSLocalizedStrings 都可以正常工作

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

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

【问题讨论】:

    标签: ios swift localized nshttpurlresponse


    【解决方案1】:

    我认为您缺少正确的方法。

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

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

    对于第三点:

    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()
    

    }

    如果您遇到 BIG 错误(例如,在我的代码中我使用了错误的前缀“__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
        }
    

    您可以在哪里屏蔽最终用户的消息并使其更通用(并使用便利功能“本地化”进行本地化)

    对于 HTTP 错误(例如未找到资源...即“https://ingconti.com/wrongurl”)您将在 http/s 中收到错误 404。

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

    final private func manageHTTPError(code: Int, data : 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 in

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

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

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

    "GENERIC_NETWORK_ERR" = "网络错误"; “NETWORK_CODE_404”。 = "网络错误(无数据)";

    西班牙语...

    "GENERIC_NETWORK_ERR" = "红色错误"; ...

    希望对你有帮助。

    【讨论】:

    • 我强烈反对。那些与 HTTP 状态相关的错误消息非常有用。如果用户不明白,他可以问其他人,他将指向正确的方向。试想一下 4xx 和 5xx 状态码的区别。 4xx = 你做错了什么。 5xx = 服务出错了。
    • 无论如何,这个问题不是关于这些消息的有用性,而是关于如何从 iOS API 获取本地化版本。
    猜你喜欢
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多