使用W10设备当前国家/地区的文化和语言进行地址查找

时间:2017-03-06 08:42:29

标签: c# localization uwp bing-maps uwp-maps

我正在使用地图控件开发一个UWP应用程序,该控件允许用户通过使用各种方法(例如单击UWP地图控件)在地图上添加航点来规划路线。我想允许用户添加航点或位置的方法之一是按实际地址搜索。我使用下面的BING Maps REST服务代码,但如果我不提供应用程序当前使用位置的语言和文化,它总是首先返回美国地址,这对于不在美国的用户来说显然没有用(是的Microsoft ,我们中的一些人实际上住在美国境外 - 震惊,恐怖!)。我发现我是否提供了语言文化字符串,如" en-AU"对澳大利亚而言,它将首先搜索澳大利亚地址,这非常有效。

public async Task<List<WayPoint>> FindAddress(string address)
    {
        List<WayPoint> matchingWaypoints = new List<WayPoint>();

        //Create a Geocode request to submit to the BING Maps REST service.
        var request = new GeocodeRequest()
        {
            Query = address.Trim(),
            Culture = "en-AU",  //HOW CAN I GET THIS FROM THE DEVICE'S CURRENT LOCATION???
            IncludeIso2 = true,
            IncludeNeighborhood = true,
            MaxResults = 10,
            BingMapsKey = MapServiceToken
        };

        //Process the request by using the BING Maps REST services.
        var response = await ServiceManager.GetResponseAsync(request);

        if (response != null &&
            response.ResourceSets != null &&
            response.ResourceSets.Length > 0 &&
            response.ResourceSets[0].Resources != null &&
            response.ResourceSets[0].Resources.Length > 0)
        {
            int wpNumber = 0;
            foreach (BingMapsRESTToolkit.Location loc in response.ResourceSets[0].Resources)
                matchingWaypoints.Add(new WayPoint(wpNumber++, loc.Address.FormattedAddress, loc.Point.Coordinates[0], loc.Point.Coordinates[1]));               
        }

        return matchingWaypoints;
    }

所以我显然想做的是根据设备的当前位置(即国家/地区)而不是设备的区域设置来获取此字符串。因此,例如,如果某人正在使用美国的应用程序,我想指定en-US,如果他们在新西兰,那将是en-NZ,如果在法国,它将是&#34; fr-FR&#34 ;有谁知道我怎么能这样做?我所读到的有关本地化的所有内容都使用了设备设置,而不是当前的物理位置,所以我仍然在努力弄清楚如何去做。

如果有人可以提供帮助,我真的很感激: - )

2 个答案:

答案 0 :(得分:1)

有一个关于如何在https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/Geolocation

获取位置的官方样本

这将返回纬度和经度。然后,您可以使用其他Bing API to get the country based on that lat/long

这将为您提供国家/地区名称。有了这个,您可以查找预先生成的代码列表到国家/地区名称(在您的计算机上使用CultureInfo.GetCultures()创建),或者您可以查看this在运行时以{{1}的方式执行此操作在UWP中不支持。

使用区域设置更简单,但如果您想使用实际位置,那么这是可行的方法。对于无法访问位置的设备,区域设置可能是一个很好的备份。

另一种方法是各种公共API之一,它将为您提供基于IP地址的位置等信息。由于在不同国家/地区使用代理等,这也不是完美的。

答案 1 :(得分:0)

感谢Matt的回复,但我在Bing Maps论坛的帮助下研究了如何做到这一点。使用FindLocationsAsync调用作为UWP Map API传递地址的一部分,使用REST API而不是使用REST API,使用起始引用(也称为&#39;提示&#39;位置)和最大匹配数返回...这里我使用的代码完美无缺。 (请注意,WayPoint是我模型中的一个对象,用于存储有关路线上的航点的各种信息。)

public async Task<List<WayPoint>> FindAddress(string address)
    {
        List<WayPoint> matchingWaypoints = new List<WayPoint>();

        // Use current location as a query hint so nearest addresses are returned.
        BasicGeoposition queryHint = new BasicGeoposition();
        queryHint.Latitude = this.CurrentLocation.Position.Latitude;
        queryHint.Longitude = this.CurrentLocation.Position.Longitude;
        Geopoint hintPoint = new Geopoint(queryHint);

        MapLocationFinderResult result =
           await MapLocationFinder.FindLocationsAsync(address.Trim(), hintPoint, 5);

        // If the query returns results, store in collection of WayPoint objects.
        string addresses = "";
        if (result.Status == MapLocationFinderStatus.Success)
        {
            int i = 0;
            foreach (MapLocation res in result.Locations)
            {
                matchingWaypoints.Add(new WayPoint(i++, res.Address.FormattedAddress, res.Point.Position.Latitude, res.Point.Position.Longitude));
            }
        }
        return matchingWaypoints;
    }