1

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

  • 我的应用程序大多只有西班牙语,所以我改变了开发语言(以艰难的方式,改变developmentRegion = es;里面的project.pbxproj和改变里面CFBundleDevelopmentRegion=esInfo.plist
  • 我还在我唯一的语言中添加了一个Localizable.strings,以便将所有内容都包含Strings在一个文档中。我所有的NSLocalizedStrings作品都很好

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

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

4

1 回答 1

0

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

您不需要将低级网络错误本地化为:

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

对于第三点:

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
    }

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

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

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

final private func manageHTTPError(code: Int, data : Data?){ guard let data = data else{ 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 DEBUG if let s = .....

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

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

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

和西班牙语...

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

希望它可以提供帮助。

于 2019-03-17T08:55:16.517 回答