如何强制接收iOS上的反向地理编码数据的语言?

问题描述 投票:3回答:4

我打电话的时候

geocoder reverseGeocodeLocation:currentLoc completionHandler:

我根据iphone上设置的语言设置获取所有语言的数据(城市,县,...)。

我如何强制总是用英语获取这些数据?

iphone objective-c locale reverse-geocoding
4个回答
4
投票

您无法强制从CLGeocoderMKReverseGeocoder检索的地理数据的语言。它始终是设备的系统语言。如果你想用英语获取数据,你需要建立自己的地理编码器,使用Google Maps API相对容易实现。

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


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“设置”应用程序中的全局语言首选项同步。


0
投票

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

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

Swift签名:

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
}];

0
投票

更新Swift 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是当前用户位置。

© www.soinside.com 2019 - 2024. All rights reserved.