7

CLGeocoderを使用して、CLLocationを経度/緯度から地名にデコードします。正常に動作します。しかし、私を悩ませていることがまだ1つあります。デバイスの言語を英語に設定すると、次のコードの結果が表示されます。

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

漢字の値を返します。

しかし、私が本当に望んでいるのは、常に英語の文字値を返すことです(漢字の値は返しません)。これはロケールに関連するものだと思います。誰かがこれを手伝うことができますか?ありがとう。

4

3 に答える 3

14

通常、ユーザーロケールをいじるのは良い習慣ではありません。デバイスの言語が中国語に設定されているのは、ユーザーが漢字を読みたいためである場合、彼がすでに中国語が必要だと言っているのに、なぜ彼を英語で表示したいのですか?

とにかく、何らかの理由で英語を強制する必要がある場合は、standardUserDefaultsの第一言語を使用するgeoCoderをだまして、geoCoderメソッドを呼び出す直前に次のようなことを行うことができます。

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

私が言ったように、あなたは本当にこれが必要な理由を考える必要があります、しかしあなたが本当にこれを必要とするならば、それはうまくいくでしょう。

于 2014-01-08T00:59:49.250 に答える
5

いい解決策を見つけました

NSString *country = placemark.ISOcountryCode;

これにより、ロケールに関係なく正確な国が返されます。たとえば、国は@"UnitedStates"ではなく@"US"になります

于 2013-01-09T07:52:13.747 に答える
3

iOS 11から、preferredLocaleパラメーターをジオコーダーreverseGeocodeLocationメソッドに渡すことができます。

Swiftの場合:

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

PreferredLocale値の例:

Locale(identifier: "en_US")
于 2019-10-02T19:26:11.193 に答える