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

时间:2019-03-17 07:04:36

标签: ios swift localized nshttpurlresponse

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

  • 我的应用大多数都只有西班牙语,因此我更改了开发语言(以困难的方式,在developmentRegion = es;内更改了project.pbxproj,并在{{ 1}})
  • 我还向自己的唯一语言中添加了CFBundleDevelopmentRegion=es,以将所有Info.plist包含在一个文档中。而且我所有的Localizable.strings都正常工作

当我使用功能Strings时问题就出现了 它只会用英语还给我NSLocalizedStrings。以前可以正常运行,但是添加了HTTPURLResponse.localizedString(forStatusCode:)后就无法正常运行了

有什么帮助将Strings带回西班牙语吗?

1 个答案:

答案 0 :(得分:1)

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

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

  • 通常对最终用户没有用
  • 易于开发,无需展示(您最终可以将它们记录下来。)
  • 获得代码后,在可读的通用消息中对其进行更改,然后将其本地化。

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

}

如果遇到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(代码:整数,数据:数据?){         保护数据=其他数据{             返回         }

    #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” =“红色错误”; ...

希望它可以提供帮助。