7 votes

CLPlacemark.locality, la valeur change si la langue de l'appareil est différente

Il utilise le CLGeocoder pour décoder le CLLocation de la longitude/latitude aux noms de lieux. Cela fonctionne bien. Mais il y a encore une chose qui me gêne. Lorsque je règle la langue de l'appareil sur l'anglais, le résultat du code ci-dessous :

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

}

est affiché en anglais, comme : chengdu.

lorsque je change la langue de l'appareil en chinois,

placemarker.locality

renvoie une valeur en caractères chinois.

Mais ce que je veux vraiment, c'est qu'il renvoie toujours une valeur en caractères anglais (pas de valeur en caractères chinois). Je suppose qu'il s'agit d'un problème lié à la locale. Quelqu'un peut-il m'aider ? Je vous remercie.

14voto

adepablor Points 181

En règle générale, il n'est pas judicieux de modifier les paramètres linguistiques des utilisateurs. Si la langue de l'appareil est réglée sur le chinois, c'est parce que l'utilisateur veut lire des caractères chinois. Pourquoi donc lui montrer en anglais alors qu'il vous a déjà dit qu'il voulait du chinois ?

Quoi qu'il en soit, si pour une raison quelconque vous avez besoin de forcer l'anglais, vous pouvez tromper le geoCoder qui utilise la première langue standardUserDefaults. Vous pouvez donc faire quelque chose comme ceci juste avant d'appeler la méthode geoCoder :

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

Ainsi, geoCoder vous donnera toutes les informations en anglais.

Toutefois, cela modifiera les préférences de l'utilisateur et il est donc préférable de les remettre à l'endroit où elles se trouvaient auparavant :

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

Comme je l'ai dit, vous devez vraiment vous demander pourquoi vous avez besoin de cela, mais si vous en avez vraiment besoin, cela pourrait fonctionner.

5voto

Alejandro Luengo Points 433

J'ai trouvé une solution intéressante

NSString *country = placemark.ISOcountryCode;

Cela renverra le pays exact, quel que soit votre lieu d'habitation. Par exemple, le pays sera @"US" au lieu de @"United States".

3voto

el_quick Points 1204

Depuis ios 11, vous pouvez passer un paramètre preferredLocale à la méthode reverseGeocodeLocation de geocoder.

Dans Swift :

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

Un exemple de valeur de preferredLocale :

Locale(identifier: "en_US")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X