CLPlacemark.locality, значение изменяется, если язык устройства отличается

Я использую CLGeocoder для декодирования CLLocation из долготы/широты в географические названия. Это работает нормально. Но есть еще одна вещь, которая меня беспокоит. Когда я устанавливаю язык устройства на английский, результат кода ниже:

- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
       fromLocation:(CLLocation *)oldLocation{
       /* We received the new location */
       NSLog(@"Latitude = %f", newLocation.coordinate.latitude);
       NSLog(@"Longitude = %f", newLocation.coordinate.longitude);
       [self.geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray* placemarks, NSError* error){
           MKPlacemark *placemarker = [placemarks objectAtIndex:0];
           NSLog(@"%@",placemarker.locality);
       }];
      [self.locationManager stopUpdatingLocation];

}

отображается на английском языке, например: chengdu.

когда я меняю язык устройства на китайский,

placemarker.locality

возвращает значение китайского символа.

Но я действительно хочу, чтобы он всегда возвращал значение английского символа (без значения китайского символа). Я предполагаю, что это что-то связанное с локалью. Кто-нибудь может помочь в этом? Спасибо.


person David L    schedule 13.11.2012    source источник


Ответы (3)


Обычно не рекомендуется возиться с локалями пользователя. Если язык устройства установлен на китайский, это потому, что пользователь хочет читать китайские иероглифы, так почему вы хотите показывать его на английском языке, когда он уже сказал вам, что хочет китайский?

В любом случае, если по какой-либо причине вам нужно принудительно использовать английский язык, вы можете обмануть геокодер, который использует первый язык стандарта UserDefaults, чтобы вы могли сделать что-то подобное непосредственно перед вызовом метода геокодера:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"];

Таким образом, geoCoder предоставит вам всю информацию на английском языке.

Однако это изменит пользовательские настройки, поэтому лучше всего вернуть их туда, где они были:

NSMutableArray *userDefaultLanguages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"];

[self.geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray* placemarks, NSError* error){
       MKPlacemark *placemarker = [placemarks objectAtIndex:0];
       NSLog(@"%@",placemarker.locality);
   }];

[[NSUserDefaults standardUserDefaults] setObject:userDefaultLanguages forKey:@"AppleLanguages"];

Как я уже сказал, вы должны действительно подумать, зачем вам это нужно, но если вам это действительно нужно, это сработает.

person adepablor    schedule 08.01.2014
comment
Пробовал это решение, но оно не работает на iOS 9 или это из-за симулятора. Дайте мне знать, если кто-нибудь знает о каком-либо обходном пути. - person Mohammad Ashraful Kabir; 05.09.2016
comment
у меня это тоже не работает .. @MohammadAshrafulKabir у вас есть новости по этому поводу? - person Akshay; 18.04.2017
comment
@MohammadAshrafulKabir Возврат исходного языка: [[NSUserDefaults standardUserDefaults] setObject:userDefaultLanguages ​​forKey:@AppleLanguages] следует поместить в блок завершенияHandler, в этом случае решение работает нормально - person azzie; 13.07.2017

Я нашел хорошее решение

NSString *country = placemark.ISOcountryCode;

Это вернет точную страну независимо от того, где вы находитесь. Например, страна будет @"US" вместо @"United States".

person Alejandro Luengo    schedule 09.01.2013

В iOS 11 вы можете передать параметр PreferredLocale в метод reverseGeocodeLocation геокодера.

В Свифте:

geocoder.reverseGeocodeLocation(
  location: CLLocation,
  preferredLocale: Locale?,
  completionHandler: {}
)

Пример предпочтительного значения Locale:

Locale(identifier: "en_US")
person el_quick    schedule 02.10.2019