как локализовать адрес результата из reverseGeocodeLocation? - PullRequest
24 голосов
/ 10 января 2012

Мое приложение для iPhone должно разрешать адреса в зависимости от широты и долготы пользователя. reverseGeocodeLocation работает нормально, но результаты на английском языке.

Есть ли способ локализовать результаты на других языках?

не удалось найти какую-либо информацию об этом в Apple или где-либо еще.

Код, который я использую:

CLGeocoder *geocoder = [[[CLGeocoder alloc] init] autorelease];
CLLocation *location = [[[CLLocation alloc] 
       initWithLatitude:coord.latitude longitude:coord.longitude] autorelease];

[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
    NSLog(@"reverseGeocodeLocation:completionHandler: Completion Handler called!");

    if (error){
        NSLog(@"Geocode failed with error: %@", error);
        [self displayError:error];
        return;
    }
    if(placemarks && placemarks.count > 0)
    {
      //do something
        CLPlacemark *topResult = [placemarks objectAtIndex:0];

        NSString *addressTxt = [NSString stringWithFormat:@"%@ %@,%@ %@", 
           [topResult subThoroughfare],[topResult thoroughfare],
           [topResult locality], [topResult administrativeArea]];
    }
}

Ответы [ 4 ]

12 голосов
/ 26 декабря 2013

я нашел, как локализовать название страны, может быть, это поможет:

CLPlacemark *placemark;

NSString *identifier = [NSLocale localeIdentifierFromComponents: [NSDictionary dictionaryWithObject: placemark.ISOcountryCode forKey: NSLocaleCountryCode]];
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
NSString *country = [usLocale displayNameForKey: NSLocaleIdentifier value: identifier];

вместо этого введите любой идентификатор страны @ "en_US"

1 голос
/ 26 января 2019

Решение для Swift 4, iOS 11

Вы можете принудительно получить результаты геокодирования на выбранном языке локали, установив аргумент: preferredLocale: Locale.init(identifier: "en_US").

CLGeocoder().reverseGeocodeLocation(location, preferredLocale: Locale.init(identifier: "en_US"), completionHandler: {(placemarks, error) -> Void in
    print(location)

    if error != nil {
        print("Reverse geocoder failed with error" + error!.localizedDescription)
        return
    }

    if placemarks!.count > 0 {
        let pm = placemarks![0]
        print(pm.administrativeArea!, pm.locality!)
    }
    else {
        print("Problem with the data received from geocoder")
    }
})
1 голос
/ 02 декабря 2012

Мэтт Томпсон имеет отличную рецензию при использовании метода из AddressBookUI.framework для локализации адресов на своем сайте NSHipster . У него также есть библиотека форматирования на github, которая содержит класс для этого типа локализации, который использует описанный им подход AddressBookUI.framework.

0 голосов
/ 12 сентября 2018

Начиная с iOS11, Apple предоставляет нам другой API, который может установить локаль для печати локализованного языка.

- (void)reverseGeocodeLocation:(CLLocation *)location preferredLocale:(nullable NSLocale *)locale
 completionHandler:(CLGeocodeCompletionHandler)completionHandler API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
...