对于 Google Places API 中的本地化英语

DNR*_*NRN 3 javascript google-places-api

我正在使用 Google Places API,因此成员可以添加他们的位置。然后我将这些信息保存在我的数据库中。现在我想搜索来自“Copenhagen”的所有成员。但这是一个问题,因为使用完整地址的会员会以丹麦语名称“K\xc3\xb8benhavn”保存。对于居住在具有不同母语和英文名称的城市的所有会员来说,同样的问题。更糟糕的是

\n\n

是否可以强制地址组件(此处特定于地区)使用英语?

\n\n

我很确定我已经将地方 API 强制改为英语,因为国家/地区是正确的。这里是“丹麦”而不是“丹麦”。

\n\n

我如何使用谷歌地点。首先我注册脚本:

\n\n
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBQuOpK6nVv7bmGJbB6WoZcnWxKE2yGIGM&libraries=places&language=en"></script>\n
Run Code Online (Sandbox Code Playgroud)\n\n

接下来,我在输入元素上添加谷歌地点自动完成功能:

\n\n
var autocompleteElm = <HTMLInputElement>document.getElementById(\'autocomplete\');\nif (autocompleteElm) {\n    this.autocomplete = new google.maps.places.Autocomplete(\n        (autocompleteElm), {\n            types: [\'geocode\']\n    });\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我至少但不是最后一次调用,在会员点击保存按钮后,我通过调用 API 来收集数据:

\n\n
this.autocomplete.getPlace();\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是一个用 TypeScript 编写的 Angular2 组件。

\n\n

我从谷歌克隆了 Fiddle 示例,以说明我的问题:\n https://jsfiddle.net/dnrn/71t99yzs/

\n\n

如果您搜索:“Dortheavej”,它会显示城市为“K\xc3\xb8benhavn”,而不是“哥本哈根”。

\n\n

更糟糕的是,有时是国家,有时是城市,不是来自“语言= en”,而是来自当地的成员。

\n

小智 5

我知道这已经是近 4 年后的事了,但我在寻找同一问题的解决方案时发现了你的问题,所以如果其他人需要它,我将保留此解决方法。

\n

长话短说:

\n

通过您想要的城市的邮政编码进行额外的反向地理编码。

\n
\n

问题:无论用户的区域设置是什么,我都需要将位置城市统一保存到数据库(即用英语)。我还添加了language=en我的所有查询,但它似乎不起作用。

\n

示例:\nhttps://maps.googleapis.com/maps/api/place/autocomplete/json?input=St. Basil\'s Cathedral&language=en返回:

\n
{\n      "description": "St. Basil\'s Cathedral, Red Square, Moscow, Russia",\n      ...\n      "place_id": "ChIJBZbmYllKtUYR5TrL54oWz6Q",\n}\n
Run Code Online (Sandbox Code Playgroud)\n

到目前为止一切顺利,我正在寻找的城市是“莫斯科”

\n

然而,另一个获取地点详细信息(即地点)的搜索https://maps.googleapis.com/maps/api/place/details/json?place_id=ChIJBZbmYllKtUYR5TrL54oWz6Q&language=en会返回(除其他外):

\n
      {\n        "long_name": "Moskva",\n        "short_name": "Moskva",\n        "types": [\n          "locality",\n          "political"\n        ]\n      }\n
Run Code Online (Sandbox Code Playgroud)\n

显然“Moskva”不是英语中的城市名称,即使查询参数是langauge=en。显然,这是 API 的预期行为,如此处所述

\n

对我来说,它看起来只是本地化用于名称的字母,或者默认为拉丁文。例如,莫斯科的俄语原始名称是“\xd0\x9c\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0”,并且使用西里尔字母。因此,如果我设置language=en(使用拉丁字母),它将“翻译”为“Moskva”(即“\xd0\x9c\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0”)用拉丁字母,但不是英语)。同样,如果我设置language=sr,我将收到“\xd0\x9c\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0”,因为塞尔维亚语也正式用西里尔字母书写,因此它将其写为原来是这样。第三个选项是language=ja它也会返回“Moskva”而不是日语(既不是语言也不是字母表),因为它似乎默认为拉丁语。

\n

现在来说说解决方法:

\n

如果“官方”城市名称明确是您正在搜索的城市(而不是作为地址、社区等的一部分),则似乎可以将其翻译为您设置的语言。

\n

因此,为了获得“莫斯科”(或任何其他语言的莫斯科名称,或任何其他城市的名称),您需要执行以下操作:

\n
    \n
  1. 搜索您想要的地方(例如在自动完成中) -place_id从结果中获取(如上例所示)
  2. \n
  3. 通过以下方式获取地点详细信息place_id(也如上所示)
  4. \n
  5. 这是解决方法发生的地方:在您收到的详细结果中,address_components除其他外:
  6. \n
\n
 "address_components": [\n      ...\n      {\n        "long_name": "Moskva",\n        "short_name": "Moskva",\n        "types": [\n          "locality",\n          "political"\n        ]\n      },\n      ...\n      {\n        "long_name": "Russia",\n        "short_name": "RU",\n        "types": [\n          "country",\n          "political"\n        ]\n      },\n      {\n        "long_name": "109012",\n        "short_name": "109012",\n        "types": [\n          "postal_code"\n        ]\n      }\n    ]\n
Run Code Online (Sandbox Code Playgroud)\n

现在将postal_codelocalitycountry将它们连接在一起形成一个字符串,如下所示:(109012, Moskva, Russia几乎像邮件格式)。

\n

最后将此字符串作为地理编码 API 的输入,以按地址以及所需的语言 (en) 进行反向搜索:\nhttps://maps.googleapis.com/maps/api/geocode/json?address=109012, Moskva, Russia&language=en

\n

现在只取英文的地方:

\n
        {\n          "long_name": "Moscow",\n          "short_name": "Moscow",\n          "types": [\n            "locality",\n            "political"\n          ]\n        }\n
Run Code Online (Sandbox Code Playgroud)\n

就是这样!

\n

迄今为止已知的“陷阱”:

\n
    \n
  • postal_code可以为空,所以请确保检查它并将其从上面的字符串中排除(它仍然有效)
  • \n
  • 有时位置详细信息中没有位置(在本例中我使用了sublocality_level_1代替)
  • \n
\n

就是这样,希望对某人有帮助!

\n