iOS 9中Swift 4实现当前城市名称波斯语本地化方案
兼容iOS 9的城市名称波斯语转换方案
嘿,我来帮你搞定iOS9兼容下的城市名波斯语转换问题!你的核心需求是在iOS9及以上系统中,通过定位获取经纬度后,把城市名称转为波斯语——毕竟iOS11的新API用不了,咱们得用iOS9原生支持的方法来实现。
核心思路
在iOS9中,我们依然可以用CLGeocoder做反向地理编码,关键是直接指定波斯语的Locale,让地理编码服务返回波斯语的城市名称,这样比先拿英文再手动转换更可靠,也避免翻译误差。
完整实现代码
替换你locationManager(_:didUpdateLocations:)里的逻辑,改成下面的代码:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { guard firstUpdate, let location = locations.first else { return } // 标记已更新,避免重复触发请求 firstUpdate = false // 创建波斯语区域设置(fa_IR是波斯语(伊朗)的标准标识符) let persianLocale = Locale(identifier: "fa_IR") // 初始化地理编码器 let geocoder = CLGeocoder() // 执行反向地理编码,指定优先返回波斯语结果 geocoder.reverseGeocodeLocation(location, preferredLocale: persianLocale) { placemarks, error in if let error = error { print("地理编码失败: \(error.localizedDescription)") return } // 提取第一个有效地址标记 guard let placemark = placemarks?.first else { print("未获取到有效地理信息") return } // 获取波斯语城市名称(locality对应城市级别的名称字段) if let persianCityName = placemark.locality { print("当前城市(波斯语): \(persianCityName)") // 在这里把波斯语城市名应用到你的业务逻辑中 } else { print("无法提取城市名称") } } }
关键细节说明
- Locale的选择:
fa_IR是波斯语在伊朗的标准区域设置,地理编码服务会优先返回该语言的地名数据,覆盖绝大多数波斯语使用场景。 - iOS9兼容性:
CLGeocoder的reverseGeocodeLocation(_:preferredLocale:completionHandler:)方法从iOS9开始就支持,完全满足你的兼容要求,不用依赖iOS11才有的postalAddress等新API。 - 错误处理:务必处理地理编码的异常情况(比如网络断开、定位精度不足导致无法匹配地址),避免App出现无响应或崩溃问题。
- 定位权限配置:别忘了在
Info.plist中添加NSLocationWhenInUseUsageDescription(前台定位)或NSLocationAlwaysUsageDescription(iOS9仍支持后台定位)字段,申请定位权限,否则定位功能会直接失效。
备选方案(极端场景兜底)
如果某些偏远地区的地理编码服务没有波斯语数据,可以先获取英文城市名,再通过String.localizedString(for:locale:)方法结合本地化文件做翻译,但这种方法不如直接指定Locale可靠,建议优先用上面的主方案。
内容的提问来源于stack exchange,提问作者Saeed Rahmatolahi
相关产品推荐
相关产品推荐

