HTTPURLResponse.localizedString(forStatusCode:) 不是开发语言
HTTPURLResponse.localizedString(forStatusCode:) not in development language
我正在制作一个 iOS 应用程序,但遇到了这个问题。
- 我的应用程序大多只有西班牙语,所以我更改了开发语言(以困难的方式,更改
project.pbxproj
中的 developmentRegion = es;
并更改 CFBundleDevelopmentRegion=es
Info.plist
)
- 我还在我唯一的语言 (es) 中添加了
Localizable.strings
,以便在一个文档中包含所有 Strings
。我所有的 NSLocalizedStrings
工作正常
使用函数时出现问题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 ";
...
希望对您有所帮助。
我正在制作一个 iOS 应用程序,但遇到了这个问题。
- 我的应用程序大多只有西班牙语,所以我更改了开发语言(以困难的方式,更改
project.pbxproj
中的developmentRegion = es;
并更改CFBundleDevelopmentRegion=es
Info.plist
) - 我还在我唯一的语言 (es) 中添加了
Localizable.strings
,以便在一个文档中包含所有Strings
。我所有的NSLocalizedStrings
工作正常
使用函数时出现问题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 "; ...
希望对您有所帮助。