Reverse geocoding to return results only in English?
Asked Answered
P

3

8

Using the code below I'm requesting a reverse geocoding for the current coordinate.
Everything works great, except for when the device is set to a different language than English.
Example: If the language of the device is Italian, and I'm in Italy, the result for country is "Italia" instead of "Italy".

How can I force the results to be only in English, regardless of the language of the device?

CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
[geoCoder reverseGeocodeLocation:myCurrentLocation completionHandler:^(NSArray *placemarks, NSError *error) {

    for (CLPlacemark * placemark in placemarks) {

        [locationController setLastKnownCountry:[placemark country]];
    }
}];

Thank you.

Pictor answered 5/8, 2014 at 17:6 Comment(0)
L
19

You have to use the NSLocale class that manages info in every language. Then for your final translation you have to force the locale to be in english language:

CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
[geoCoder reverseGeocodeLocation:myCurrentLocation completionHandler:^(NSArray *placemarks, NSError *error) {

    for (CLPlacemark * placemark in placemarks) {
         //Obtains the country code, that is the same whatever language you are working with (US, ES, IT ...)
         NSString *countryCode = [placemark ISOcountryCode];
         //Obtains a locale identifier. This will handle every language
         NSString *identifier = [NSLocale localeIdentifierFromComponents: [NSDictionary dictionaryWithObject: countryCode forKey: NSLocaleCountryCode]];
         //Obtains the country name from the locale BUT IN ENGLISH (you can set it as "en_UK" also)
         NSString *country = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] displayNameForKey: NSLocaleIdentifier value:identifier];

        //Continues your code
        [locationController setLastKnownCountry:country];
    }
}];
Little answered 13/8, 2014 at 11:12 Comment(2)
what is locationControllerDarrelldarrelle
I don’t know. It was on the asker's code. I left it there to show him/her where to continue writing his/her codeLittle
P
7

It works with the iOS 11 API: reverseGeocodeLocation(_:preferredLocale:completionHandler:)

Sadly I need to support other iOS versions and changing the UserDefaults does neither feel good nor work for me :-(

Parmenides answered 17/1, 2018 at 11:10 Comment(0)
P
-4

You can try the below code to extract the name of the country from the placemark which will show the result in english only regardless the county name

- (void)findAddress:(CLLocationDegrees)latitude with:(CLLocationDegrees)longitude
{
    CLLocation *location =[[CLLocation alloc]initWithLatitude:latitude longitude:longitude];
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
        NSLog(@"Finding address");
        if (error) {
            NSLog(@"Error %@", error.description);
        } else {
            NSLog(@"%@",[placemarks valueForKey:@"country"]);
        }
    }];
}
Perfuse answered 11/8, 2014 at 11:45 Comment(1)
It's pretty much the code I've posted in the question. And no, it does not give the result in English since the request to Apple's servers already contains the "desired" language.Pictor

© 2022 - 2024 — McMap. All rights reserved.