如何本地化来自 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 获取位置名称

reverseGeocodeLocation 存储为 NSString 产生错误

如何等到 CLGeocoder 完成工作

使用 reverseGeocodeLocation 将用户的状态作为 NSString 返回