如何本地化来自 reverseGeocodeLocation 的地址结果?
Posted
技术标签:
【中文标题】如何本地化来自 reverseGeocodeLocation 的地址结果?【英文标题】:how to localize address result from reverseGeocodeLocation? 【发布时间】:2012-01-10 19:45:19 【问题描述】:我的 iphone 应用程序应该根据用户的纬度和经度来解析地址。 reverseGeocodeLocation 工作正常,但结果是英文的。
有没有办法将结果本地化为其他语言?
在苹果或其他任何地方都找不到任何有关它的信息。
我使用的代码是:
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]];
【问题讨论】:
CLGeocoder 基于 google geocoder,如果在 URL 参数中设置了语言选项,则可以生成本地化结果。我使用 google api,我返回的结果似乎已本地化为其他语言。这可能很明显,但是您是否将设备的语言设置为英语以外的语言?你还试过什么? 是的!它改变了语言,但问题仍然存在,是否可以将结果强制转换为特定语言? 从文档来看,我不这么认为。如果您在几个小时内没有收到更完整的答案,我将向您展示一些可能对您有所帮助的代码。不过,我面前没有它。 @user513790,你有没有得到关于如何将结果强制转换为特定语言的解决方案?对我们来说,它应该总是用英文吗?根据我目前的研究,这似乎是不可能的。 【参考方案1】:我找到了如何本地化国家/地区名称,也许它会有所帮助:
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];
插入任何国家/地区 ID,而不是 @"en_US"
【讨论】:
你知道我怎样才能为 placemark.locality 做同样的事情吗?例如:“罗马”->“罗马”【参考方案2】: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")
)
【讨论】:
【参考方案3】:Mattt Thompson 有一个很棒的 writeup 使用 AddressBookUI.framework 中的方法来本地化他的站点上的地址 NSHipster。他在 github 上还有一个 formatting library,其中包含一个用于执行此类本地化的类,该类使用他描述的 AddressBookUI.framework 方法。
【讨论】:
【参考方案4】:从ios11开始,苹果为我们提供了另外一个API,可以设置locale来打印本地化语言。
- (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));
【讨论】:
以上是关于如何本地化来自 reverseGeocodeLocation 的地址结果?的主要内容,如果未能解决你的问题,请参考以下文章
同步请求 CLGeocoder.reverseGeocodeLocation
使用 reverseGeocodeLocation: 设置地址字符串并从方法返回
从 reverseGeocodeLocation 获取位置名称