4

当我打电话时

geocoder reverseGeocodeLocation:currentLoc completionHandler:

我根据 iPhone 上设置的语言环境获取所有数据(城市、县、...)。

我如何强制始终以英语获取这些数据?

4

5 回答 5

6

对于未来的读者来说,接受的答案是不正确的(至少不再是)。

UserDefaults.standard.set(["en"], forKey: "AppleLanguages")
gc.reverseGeocodeLocation(loc) {
    print($0 ?? $1!)

    UserDefaults.standard.removeObject(forKey: "AppleLanguages")
    print(UserDefaults.standard.object(forKey: "AppleLanguages") as! [String])
}

调用removeObject(forKey:)很重要,因为您要将返回的值重置为UserDefaults系统设置。一些答案使您保持调用的原始值UserDefaults.standard.object(forKey: "AppleLanguages")并在获取地址后对其进行设置,但这将阻止您UserDefaults与 iOS“设置”应用程序中的全局语言首选项同步。

于 2017-01-20T02:19:32.657 回答
4

您不能强制使用从CLGeocoder或检索的地理数据的语言MKReverseGeocoder。它始终是设备的系统语言。如果您想获取英文数据,您需要构建自己的地理编码器,这相对容易使用Google Maps API实现。

这是 Google Maps API 中支持的语言的电子表格: https ://spreadsheets.google.com/pub?key=p9pdwsai2hDMsLkXsoM05KQ&gid=1

于 2012-08-29T13:16:35.250 回答
1

更新斯威夫特 4

只需使用此代码强制以英文返回数据:

func fetchCityAndCountry(from location: CLLocation, completion: @escaping (_ locality: String?, _ country:  String?, _ error: Error?) -> ()) {
    CLGeocoder().reverseGeocodeLocation(location, preferredLocale: Locale.init(identifier: "en")) { placemarks, error in
        completion(placemarks?.first?.locality,
                   placemarks?.first?.country,
                   error)
    }
}

您可以更改区域设置标识符以将数据翻译成任何其他语言(“ca”、“es”、“fr”、“de”...)。

例如,可以像这样调用此函数:

fetchCityAndCountry (from: userLocationCL) { locality, country, error in
   guard let locality = locality, let country = country, error == nil else { return }
   // your code
}

其中 userLocationCL 是当前用户位置。

于 2019-02-15T09:42:16.337 回答
0

iOS 11 有一个新-reverseGeocode...方法可以接受要使用的语言环境:

- (void)reverseGeocodeLocation:(CLLocation *)location preferredLocale:(NSLocale *)locale
    completionHandler:(CLGeocodeCompletionHandler)completionHandler

快速签名:

func reverseGeocodeLocation(_ location: CLLocation, preferredLocale locale: Locale?, completionHandler: @escaping CLGeocodeCompletionHandler)

放置您喜欢的任何语言环境。此示例仅使用当前语言环境

NSLocale *currentLocale = [NSLocale currentLocale];
[self.geocoder reverseGeocodeLocation:self.location preferredLocale:currentLocale
    completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {

    // Handle the result or error
}];
于 2019-02-12T12:42:19.423 回答
0

只需将语言环境设置为特定您的语言

let locale = Locale(identifier: "en_US")
CLGeocoder().reverseGeocodeLocation(location, preferredLocale: locale, completionHandler: {(placemarks, error) in

})
于 2022-02-10T04:36:02.283 回答