diff --git a/OsmAnd-java/src/main/java/net/osmand/CollatorStringMatcher.java b/OsmAnd-java/src/main/java/net/osmand/CollatorStringMatcher.java index d6011c6209..693be4bd82 100644 --- a/OsmAnd-java/src/main/java/net/osmand/CollatorStringMatcher.java +++ b/OsmAnd-java/src/main/java/net/osmand/CollatorStringMatcher.java @@ -124,6 +124,9 @@ public class CollatorStringMatcher implements StringMatcher { public static boolean cstartsWith(Collator collator, String searchInParam, String theStart, boolean checkBeginning, boolean checkSpaces, boolean equals, boolean trim) { String searchIn = searchInParam.toLowerCase(Locale.getDefault()); + if (trim && searchIn.length() > 0) { + searchIn += " "; + } int searchInLength = searchIn.length(); if (trim && searchInLength > 0 && theStart.length() > searchInLength) { theStart = theStart.substring(0, searchInLength); diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/edit/Way.java b/OsmAnd-java/src/main/java/net/osmand/osm/edit/Way.java index f55667b1ed..ba71f7645a 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/edit/Way.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/edit/Way.java @@ -194,7 +194,6 @@ public class Way extends Entity { } if (nodeIds != null) { nodeIds.reverse(); - ; } } } diff --git a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java index eab62ef210..f6379410fa 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/SearchUICore.java @@ -319,7 +319,7 @@ public class SearchUICore { SearchAmenityTypesAPI searchAmenityTypesAPI = new SearchAmenityTypesAPI(poiTypes); apis.add(searchAmenityTypesAPI); apis.add(new SearchCoreFactory.SearchAmenityByTypeAPI(poiTypes, searchAmenityTypesAPI)); - apis.add(new SearchCoreFactory.SearchAmenityByNameAPI(searchAmenityTypesAPI)); + apis.add(new SearchCoreFactory.SearchAmenityByNameAPI()); SearchBuildingAndIntersectionsByStreetAPI streetsApi = new SearchCoreFactory.SearchBuildingAndIntersectionsByStreetAPI(); apis.add(streetsApi); @@ -500,7 +500,7 @@ public class SearchUICore { } currentSearchResult = collection; if (phrase.getSettings().isExportObjects()) { - rm.createTestJSON(collection); + //rm.createTestJSON(collection); } rm.searchFinished(phrase); if (onResultsComplete != null) { @@ -841,7 +841,9 @@ public class SearchUICore { @Override public int compare(SearchResult o1, SearchResult o2) { - if (!ObjectType.isTopVisible(o1.objectType) && !ObjectType.isTopVisible(o2.objectType)) { + boolean topVisible1 = ObjectType.isTopVisible(o1.objectType); + boolean topVisible2 = ObjectType.isTopVisible(o2.objectType); + if ((!topVisible1 && !topVisible2) || (topVisible1 && topVisible2)) { if (o1.isUnknownPhraseMatches() != o2.isUnknownPhraseMatches()) { return o1.isUnknownPhraseMatches() ? -1 : 1; } else if (o1.getFoundWordCount() != o2.getFoundWordCount()) { diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java index d4c0f2d4d1..035f106989 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java @@ -316,6 +316,7 @@ public class SearchCoreFactory { String word = phrase.getUnknownWordToSearch(); NameStringMatcher nm = phrase.getNameStringMatcher(word, phrase.isUnknownSearchWordComplete()); NameStringMatcher wordEqualsMatcher = phrase.getNameStringMatcher(word, true); + boolean firstUnknownWordMatches = word.equals(phrase.getUnknownSearchWord()); resArray.clear(); resArray = townCitiesQR.queryInBox(bbox, resArray); int limit = 0; @@ -337,8 +338,8 @@ public class SearchCoreFactory { if (phrase.isEmptyQueryAllowed() && phrase.isEmpty()) { resultMatcher.publish(res); } else if (nm.matches(res.localeName) || nm.matches(res.otherNames)) { - res.firstUnknownWordMatches = word.equals(phrase.getUnknownSearchWord()); - res.unknownPhraseMatches = wordEqualsMatcher.matches(res.localeName) || wordEqualsMatcher.matches(res.otherNames); + res.firstUnknownWordMatches = firstUnknownWordMatches; + res.unknownPhraseMatches = wordEqualsMatcher.matches(res.localeName); subSearchApiOrPublish(phrase, resultMatcher, res, cityApi); } if (limit++ > LIMIT * phrase.getRadiusLevel()) { @@ -465,6 +466,7 @@ public class SearchCoreFactory { String wordToSearch = phrase.getUnknownWordToSearch(); NameStringMatcher wordEqualsMatcher = phrase.getNameStringMatcher(wordToSearch, true); + boolean firstUnknownWordMatches = wordToSearch.equals(phrase.getUnknownSearchWord()); while (offlineIterator.hasNext() && wordToSearch.length() > 0) { BinaryMapIndexReader r = offlineIterator.next(); currentFile[0] = r; @@ -478,8 +480,8 @@ public class SearchCoreFactory { } r.searchAddressDataByName(req); for (SearchResult res : immediateResults) { - res.firstUnknownWordMatches = wordToSearch.equals(phrase.getUnknownSearchWord()); - res.unknownPhraseMatches = wordEqualsMatcher.matches(res.localeName) || wordEqualsMatcher.matches(res.otherNames); + res.firstUnknownWordMatches = firstUnknownWordMatches; + res.unknownPhraseMatches = wordEqualsMatcher.matches(res.localeName); if (res.objectType == ObjectType.STREET) { City ct = ((Street) res.object).getCity(); phrase.countUnknownWordsMatch(res, @@ -501,11 +503,9 @@ public class SearchCoreFactory { private static final int BBOX_RADIUS = 500 * 1000; private static final int BBOX_RADIUS_INSIDE = 10000 * 1000; // to support city search for basemap private static final int FIRST_WORD_MIN_LENGTH = 3; - private SearchAmenityTypesAPI searchAmenityTypesAPI; - public SearchAmenityByNameAPI(SearchAmenityTypesAPI searchAmenityTypesAPI) { + public SearchAmenityByNameAPI() { super(ObjectType.POI); - this.searchAmenityTypesAPI = searchAmenityTypesAPI; } @Override @@ -574,7 +574,7 @@ public class SearchCoreFactory { } sr.priority = SEARCH_AMENITY_BY_NAME_PRIORITY; if (phraseMatcher != null) { - sr.unknownPhraseMatches = phraseMatcher.matches(sr.localeName) || phraseMatcher.matches(sr.otherNames); + sr.unknownPhraseMatches = phraseMatcher.matches(sr.localeName); } phrase.countUnknownWordsMatch(sr); sr.objectType = ObjectType.POI; @@ -662,17 +662,19 @@ public class SearchCoreFactory { categories = types.getCategories(false); } List results = new ArrayList(); - NameStringMatcher nm = - new NameStringMatcher(phrase.getUnknownSearchPhrase(), StringMatcherMode.CHECK_ONLY_STARTS_WITH_TRIM); - - Set filters = new HashSet<>(); + NameStringMatcher nm; + String unknownSearchPhrase = phrase.getUnknownSearchPhrase(); + if (phrase.getUnknownSearchWord().length() < unknownSearchPhrase.length()) { + nm = new NameStringMatcher(unknownSearchPhrase, StringMatcherMode.CHECK_ONLY_STARTS_WITH_TRIM); + } else { + nm = new NameStringMatcher(unknownSearchPhrase, StringMatcherMode.CHECK_STARTS_FROM_SPACE); + } for (AbstractPoiType pf : topVisibleFilters) { if (!phrase.isUnknownSearchWordPresent() || nm.matches(pf.getTranslation()) || nm.matches(pf.getEnTranslation()) || nm.matches(pf.getSynonyms())) { results.add(pf); - filters.add(pf.getTranslation()); } } if (phrase.isUnknownSearchWordPresent()) { @@ -682,7 +684,6 @@ public class SearchCoreFactory { || nm.matches(c.getEnTranslation()) || nm.matches(c.getSynonyms()))) { results.add(c); - filters.add(c.getTranslation()); } } Iterator> it = translatedNames.entrySet().iterator(); @@ -690,7 +691,7 @@ public class SearchCoreFactory { Entry e = it.next(); PoiType pt = e.getValue(); if (pt.getCategory() != types.getOtherMapCategory()) { - if (!results.contains(pt) && !filters.contains(pt.getTranslation()) + if (!results.contains(pt) && (nm.matches(pt.getEnTranslation()) || nm.matches(pt.getTranslation()) || nm.matches(pt.getSynonyms()))) { @@ -714,6 +715,8 @@ public class SearchCoreFactory { phrase.setUnknownSearchWordPoiTypes(new ArrayList<>(results)); if (resultMatcher != null) { + String word = phrase.getUnknownSearchWord(); + NameStringMatcher startMatch = new NameStringMatcher(word, StringMatcherMode.CHECK_ONLY_STARTS_WITH); for (AbstractPoiType pt : results) { SearchResult res = new SearchResult(phrase); res.localeName = pt.getTranslation(); @@ -721,6 +724,7 @@ public class SearchCoreFactory { res.priority = SEARCH_AMENITY_TYPE_PRIORITY; res.priorityDistance = 0; res.objectType = ObjectType.POI_TYPE; + res.firstUnknownWordMatches = startMatch.matches(res.localeName); resultMatcher.publish(res); } for (int i = 0; i < customPoiFilters.size(); i++) { @@ -913,7 +917,7 @@ public class SearchCoreFactory { res.priority = SEARCH_AMENITY_BY_TYPE_PRIORITY; res.priorityDistance = 1; if (phraseMatcher != null) { - boolean unknownPhraseMatches = phraseMatcher.matches(res.localeName) || phraseMatcher.matches(res.otherNames); + boolean unknownPhraseMatches = phraseMatcher.matches(res.localeName); AbstractPoiType unknownSearchWordPoiType = phrase.getUnknownSearchWordPoiType(); if (unknownPhraseMatches && unknownSearchWordPoiType != null) { unknownPhraseMatches = !phraseMatcher.matches(unknownSearchWordPoiType.getTranslation()) @@ -1037,7 +1041,7 @@ public class SearchCoreFactory { phrase.getNameStringMatcher().matches(res.localeName) || phrase.getNameStringMatcher().matches(res.otherNames); if (phraseMatcher != null) { - res.unknownPhraseMatches = phraseMatcher.matches(res.localeName) || phraseMatcher.matches(res.otherNames); + res.unknownPhraseMatches = phraseMatcher.matches(res.localeName); } res.localeRelatedObjectName = c.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate()); res.object = object; diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchExportSettings.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchExportSettings.java index 7c6e938a65..2519d12edc 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchExportSettings.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchExportSettings.java @@ -9,6 +9,11 @@ public class SearchExportSettings { exportBuildings = true; } + public SearchExportSettings(boolean exportEmptyCities, boolean exportBuildings) { + this.exportEmptyCities = exportEmptyCities; + this.exportBuildings = exportBuildings; + } + public boolean isExportEmptyCities() { return exportEmptyCities; } diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchSettings.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchSettings.java index 3d3b9d5de1..3779bb801a 100644 --- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchSettings.java +++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchSettings.java @@ -24,6 +24,7 @@ public class SearchSettings { private boolean emptyQueryAllowed; private boolean sortByName; private SearchExportSettings exportSettings; + //private SearchExportSettings exportSettings = new SearchExportSettings(false, false); public SearchSettings(SearchSettings s) { if(s != null) { diff --git a/OsmAnd-java/src/main/java/net/osmand/util/GeoPointParserUtil.java b/OsmAnd-java/src/main/java/net/osmand/util/GeoPointParserUtil.java index 9eea38d32e..f6ac336605 100644 --- a/OsmAnd-java/src/main/java/net/osmand/util/GeoPointParserUtil.java +++ b/OsmAnd-java/src/main/java/net/osmand/util/GeoPointParserUtil.java @@ -526,11 +526,20 @@ public class GeoPointParserUtil { if (params.containsKey("z")) { zmPart = params.get("z"); } - String[] vls = silentSplit(path, ","); + String[] vls = null; + if(path.contains("@")) { + path = path.substring(path.indexOf("@") + 1); + if(path.contains(",")) { + vls = silentSplit(path, ","); + } + } + if(vls == null) { + vls = silentSplit(path, ","); + } if (vls.length >= 2) { - double lat = parseSilentDouble(vls[0]); - double lon = parseSilentDouble(vls[1]); + double lat = parseSilentDouble(vls[0], Double.NaN); + double lon = parseSilentDouble(vls[1], Double.NaN); int zoom = GeoParsedPoint.NO_ZOOM; if (vls.length >= 3 || zmPart.length() > 0) { if (zmPart.length() == 0) { @@ -543,7 +552,9 @@ public class GeoPointParserUtil { } zoom = parseZoom(zmPart); } - return new GeoParsedPoint(lat, lon, zoom); + if(!Double.isNaN(lat) && !Double.isNaN(lon)) { + return new GeoParsedPoint(lat, lon, zoom); + } } return new GeoParsedPoint(URLDecoder.decode(opath)); } @@ -566,13 +577,17 @@ public class GeoPointParserUtil { } private static double parseSilentDouble(String zoom) { + return parseSilentDouble(zoom, 0); + } + + private static double parseSilentDouble(String zoom, double vl) { try { if (zoom != null) { return Double.valueOf(zoom); } } catch (NumberFormatException e) { } - return 0; + return vl; } private static int parseSilentInt(String zoom) { @@ -739,8 +754,9 @@ public class GeoPointParserUtil { @Override public String toString() { - return isGeoPoint() ? "GeoParsedPoint [lat=" + lat + ", lon=" + lon + ", zoom=" + zoom - + ", label=" + label + "]" : "GeoParsedPoint [query=" + query; + return isGeoPoint() ? + String.format("GeoParsedPoint [lat=%.5f, lon=%.5f, zoom=%d, label=%s]", lat, lon, zoom, label) : + String.format("GeoParsedPoint [query=%s]",query); } } } diff --git a/OsmAnd-java/src/test/java/net/osmand/util/GeoPointParserUtilTest.java b/OsmAnd-java/src/test/java/net/osmand/util/GeoPointParserUtilTest.java index 14c76a0f2b..05138ea91e 100644 --- a/OsmAnd-java/src/test/java/net/osmand/util/GeoPointParserUtilTest.java +++ b/OsmAnd-java/src/test/java/net/osmand/util/GeoPointParserUtilTest.java @@ -19,6 +19,19 @@ public class GeoPointParserUtilTest { GeoParsedPoint test = GeoPointParserUtil.parse("geo:0,0?q=86HJV99P%2B29"); Assert.assertEquals(test.getQuery(), "86HJV99P+29"); } + + @Test + public void testGoogleMaps() { + // https://www.google.com/maps?daddr=Bahnhofplatz+3,+7000+Chur@46.853582,9.529903 + GeoParsedPoint actual = GeoPointParserUtil.parse( + "https://www.google.com/maps?daddr=Bahnhofplatz+3,+7000+Chur"); + assertGeoPoint(actual, new GeoParsedPoint("Bahnhofplatz 3, 7000 Chur")); + + actual = GeoPointParserUtil.parse( + "https://www.google.com/maps?daddr=Bahnhofplatz+3,+7000+Chur@46.853582,9.529903"); + System.out.println(actual); + assertGeoPoint(actual, new GeoParsedPoint(46.853582, 9.529903)); + } @Test public void testGeoPoint() { diff --git a/OsmAnd-java/src/test/resources/search/double_parking.json b/OsmAnd-java/src/test/resources/search/double_parking.json index 8aa7ec748f..0c23cebe3d 100644 --- a/OsmAnd-java/src/test/resources/search/double_parking.json +++ b/OsmAnd-java/src/test/resources/search/double_parking.json @@ -11,8 +11,7 @@ }, "phrase": "parking", "results": [ - "Park (Leisure)", - "Parking (Filter)", + "Parking (Personal transport)", "Parking entrance (Personal transport)", "Parking fee (Charging station / Transportation)", "Parking fee: no (Charging station / Transportation)", @@ -21,8 +20,8 @@ "Parking tickets (Vending machine / Store)", "Parking tickets (Vending machine / Store)", "Parking time limit (Parking / Personal transport)", - "Parking", - "Parking", + "Bicycle parking (Bicycle transport)", + "Motorcycle parking (Personal transport)", "Parking", "Parking", "Parking", diff --git a/OsmAnd-java/src/test/resources/search/poi_biergarten.json b/OsmAnd-java/src/test/resources/search/poi_biergarten.json new file mode 100644 index 0000000000..362e58f4d7 --- /dev/null +++ b/OsmAnd-java/src/test/resources/search/poi_biergarten.json @@ -0,0 +1,662 @@ +{ + "settings": { + "lat": "51.04933", + "lon": "13.73815", + "radiusLevel": 1, + "totalLimit": -1, + "lang": "", + "transliterateIfMissing": false, + "emptyQueryAllowed": false, + "sortByName": false + }, + "phrase": "Biergarten", + "results": [ + "Biergarten (Food)", + "Biergarten Italienisches Dörfchen", + "Biergarten Narrenhäus'l", + "Biergarten Elbsegler", + "Biergarten Elbsegler", + "Biergarten", + "Biergarten", + "Biergarten", + "Biergarten", + "Biergarten" + ], + "amenities": [ + { + "lat": "51.02489", + "lon": "13.69860", + "id": 244538865, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "surface_fine_gravel": "fine_gravel" + } + }, + { + "lat": "51.09478", + "lon": "13.84153", + "id": 865332598, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "operator": "Einkehr" + } + }, + { + "lat": "51.01123", + "lon": "13.67918", + "id": 9712288200, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "website": "http://www.zur-linde-freital.de/", + "operator": "Zur Linde", + "image": "http://commons.wikimedia.org/wiki/File:Hotel_und_Gasthaus_Zur_Linde_Freital-Birkigt.jpg" + } + }, + { + "name": "Altes Wettbüro", + "lat": "51.06472", + "lon": "13.74467", + "id": 11451975032, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "Tu-Sa 17:00-22:00", + "additionalInfo": { + "wheelchair_limited": "limited", + "outdoor_seating_yes": "yes", + "outdoor_seating_filter_yes": "yes", + "opening_hours": "Tu-Sa 17:00-22:00", + "website": "http://www.altes-wettbuero.de", + "phone": "+49 351 6588983", + "operator": "Falk Gruß" + } + }, + { + "name": "Carolaschlösschen", + "lat": "51.03341", + "lon": "13.76392", + "id": 3704353318, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "Mo-Su 11:00-24:00", + "additionalInfo": { + "wheelchair_limited": "limited", + "opening_hours": "Mo-Su 11:00-24:00", + "facebook": "https://www.facebook.com/carolaschloesschen/" + } + }, + { + "lat": "51.01251", + "lon": "13.69407", + "id": 562115695, + "subType": "biergarten", + "type": "sustenance" + }, + { + "name": "Torwirtschaft", + "lat": "51.04156", + "lon": "13.75139", + "id": 517007905, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "wheelchair_yes": "yes", + "website": "http://www.torwirtschaft-dresden.de", + "facebook": "https://www.facebook.com/Torwirtschaft-der-Biergarten-f%C3%BCr-alle-Dynamofans-168677023169963/" + } + }, + { + "name": "Biergarten Italienisches Dörfchen", + "lat": "51.05429", + "lon": "13.73759", + "id": 486232011, + "subType": "biergarten", + "type": "sustenance" + }, + { + "lat": "51.04261", + "lon": "13.75229", + "id": 98518191, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "wheelchair_yes": "yes" + } + }, + { + "name": "Körnergarten", + "names": { + "prefix": "Biergarten" + }, + "lat": "51.05316", + "lon": "13.81192", + "id": 3704353594, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "Mo-Su 11:00-24:00", + "additionalInfo": { + "wheelchair_limited": "limited", + "opening_hours": "Mo-Su 11:00-24:00", + "website": "http://www.koernergarten.de/" + } + }, + { + "lat": "51.06397", + "lon": "13.79748", + "id": 670742479, + "subType": "biergarten", + "type": "sustenance" + }, + { + "name": "Weingut Seifert", + "lat": "51.11134", + "lon": "13.66701", + "id": 789740008, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "note": "not really a 'biergarten' :)" + } + }, + { + "lat": "50.98710", + "lon": "13.65086", + "id": 9037536542, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "operator": "Zum Gründl" + } + }, + { + "lat": "51.10538", + "lon": "13.62622", + "id": 9289210778, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "operator": "Zum Bürgergarten" + } + }, + { + "lat": "51.09459", + "lon": "13.84170", + "id": 5598697742, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "operator": "Einkehr" + } + }, + { + "name": "Trobischhof", + "lat": "51.08649", + "lon": "13.71338", + "id": 409847251, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "wheelchair_limited": "limited" + } + }, + { + "name": "Demnitz Elbegarten", + "lat": "51.05328", + "lon": "13.81175", + "id": 771102016, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "wheelchair_no": "no", + "cuisine_german": "german", + "website": "http://www.elbegarten.de" + } + }, + { + "name": "Augustus Garten am Narrenhäusl", + "lat": "51.05697", + "lon": "13.74166", + "id": 465538291, + "subType": "biergarten", + "type": "sustenance" + }, + { + "lat": "51.01529", + "lon": "13.65107", + "id": 7482890514, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "operator": "Burgwartschänke" + } + }, + { + "name": "el Horst", + "lat": "51.04361", + "lon": "13.78979", + "id": 559979958, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "Oct-Apr: Mo-Fr 17:00-18:00+, Oct-Apr: Sa,PH 11:30-18:00+, May-Sep: Mo-Fr 15:00-18:00+, May-Sep: Sa,PH 11:30-18:00+", + "additionalInfo": { + "opening_hours": "Oct-Apr: Mo-Fr 17:00-18:00+, Oct-Apr: Sa,PH 11:30-18:00+, May-Sep: Mo-Fr 15:00-18:00+, May-Sep: Sa,PH 11:30-18:00+" + } + }, + { + "lat": "51.07376", + "lon": "13.70135", + "id": 553613482, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "operator": "Wirtshaus Lindenschänke" + } + }, + { + "name": "Wachstube", + "lat": "51.04254", + "lon": "13.75222", + "id": 46060263, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "11:00+", + "additionalInfo": { + "wheelchair_no": "no", + "opening_hours": "11:00+", + "website": "https://www.torwirtschaft-dresden.de/wachstube/restaurant.php", + "phone": "+49 351 4466975", + "image": "https://commons.wikimedia.org/wiki/File:Torhaus_N_Grosser_Garten_Dresden-2.jpg", + "wheelchair_description:de": "Zugang ins Gebäude nur über Stufen", + "height": "5.7", + "facebook": "https://www.facebook.com/Wachstube-im-Gro%C3%9Fen-Garten-Dresden-144180698984577/", + "email": "info@wachstube-dresden.de" + } + }, + { + "lat": "51.09050", + "lon": "13.70555", + "id": 6300849046, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "operator": "Bäckerei Werner" + } + }, + { + "name": "Biergarten Elbsegler", + "lat": "51.05731", + "lon": "13.73973", + "id": 465318113, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "wheelchair_limited": "limited" + } + }, + { + "name": "Straußenwirtschaft Weingut Pesterwitz", + "lat": "51.02883", + "lon": "13.64144", + "id": 478369183, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "website": "https://www.gut-pesterwitz.de/" + } + }, + { + "name": "Schillergarten", + "lat": "51.05228", + "lon": "13.80908", + "id": 493702544, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "Mo-Su 11:00-01:00", + "additionalInfo": { + "wheelchair_yes": "yes", + "opening_hours": "Mo-Su 11:00-01:00" + } + }, + { + "lat": "51.04111", + "lon": "13.80554", + "id": 5837244174, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "operator": "Astloch" + } + }, + { + "name": "Spitzwegerich", + "lat": "51.07767", + "lon": "13.70757", + "id": 412610355, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "wheelchair_yes": "yes", + "toilets_wheelchair_no": "no" + } + }, + { + "name": "Biergarten Goldener Anker", + "lat": "51.10399", + "lon": "13.62850", + "id": 143015201, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "Tu-Su,PH 11:00-21:00", + "additionalInfo": { + "wheelchair_yes": "yes", + "opening_hours": "Tu-Su,PH 11:00-21:00" + } + }, + { + "name": "Bottoms Up", + "lat": "51.06516", + "lon": "13.75615", + "id": 1394136626, + "subType": "biergarten", + "type": "sustenance" + }, + { + "name": "Biergarten Narrenhäus'l", + "lat": "51.05666", + "lon": "13.74130", + "id": 466763007, + "subType": "biergarten", + "type": "sustenance" + }, + { + "name": "Zum Schießhaus", + "lat": "51.05464", + "lon": "13.72727", + "id": 326416539, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "Mo-Su,PH 11:00-23:00", + "additionalInfo": { + "wheelchair_yes": "yes", + "toilets_wheelchair_no": "no", + "opening_hours": "Mo-Su,PH 11:00-23:00" + } + }, + { + "name": "Palais Bistro", + "lat": "51.05182", + "lon": "13.73682", + "id": 501015667, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "Apr-Oct: Mo-Su 11:00-24:00, Nov-Mar: Mo-Th 12:00-14:30,17:30-24:00, Nov-Mar: Fr-Su 12:00-24:00", + "additionalInfo": { + "wheelchair_yes": "yes", + "opening_hours": "Apr-Oct: Mo-Su 11:00-24:00, Nov-Mar: Mo-Th 12:00-14:30,17:30-24:00, Nov-Mar: Fr-Su 12:00-24:00" + } + }, + { + "name": "Brauhaus am Waldschlößchen", + "lat": "51.06778", + "lon": "13.77786", + "id": 594989978, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "Mo-Su 11:00-01:00", + "additionalInfo": { + "wheelchair_limited": "limited", + "opening_hours": "Mo-Su 11:00-01:00" + } + }, + { + "lat": "51.00222", + "lon": "13.68504", + "id": 2469999180, + "subType": "biergarten", + "type": "sustenance" + }, + { + "name": "Biergarten Elbsegler", + "lat": "51.05738", + "lon": "13.73913", + "id": 466539133, + "subType": "biergarten", + "type": "sustenance" + }, + { + "lat": "51.01010", + "lon": "13.66208", + "id": 7987508388, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "wheelchair_yes": "yes", + "operator": "Zum goldenen Löwen" + } + }, + { + "lat": "50.99476", + "lon": "13.72701", + "id": 6765029580, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "operator": "Eutschützer Mühle" + } + }, + { + "lat": "50.99295", + "lon": "13.64362", + "id": 6065174964, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "operator": "Alte Schmiede" + } + }, + { + "name": "Louisengarten", + "lat": "51.06681", + "lon": "13.75278", + "id": 68516655, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "Apr-Sep Su-Th 16:00+; Apr-Sep Fr,Sa 15:00+ || off \"Bei unfreundlichem Wetter\"", + "additionalInfo": { + "wheelchair_no": "no", + "opening_hours": "Apr-Sep Su-Th 16:00+; Apr-Sep Fr,Sa 15:00+ || off \"Bei unfreundlichem Wetter\"", + "website": "http://www.biergarten-dresden.de", + "note": "Neustädter Winter Hüttn von Oktober-Dezember", + "alt_name": "Neustädter Winter Hüttn" + } + }, + { + "lat": "51.00871", + "lon": "13.65959", + "id": 9237211698, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "wheelchair_yes": "yes", + "operator": "Akropolis" + } + }, + { + "lat": "51.03435", + "lon": "13.76042", + "id": 595971770, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "Apr-Oct: Mo-Fr 11:00-19:00; Sa-Su 10:00-19:00; PH 10:00-19:00", + "additionalInfo": { + "wheelchair_yes": "yes", + "opening_hours": "Apr-Oct: Mo-Fr 11:00-19:00; Sa-Su 10:00-19:00; PH 10:00-19:00", + "website": "https://www.grosser-garten-dresden.de/de/gaesteservice/gastronomie-shop/", + "phone": "+49 152 37 00 67 53" + } + }, + { + "name": "Landgut Hofewiese", + "lat": "51.10989", + "lon": "13.83207", + "id": 8455509378, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "wheelchair_yes": "yes" + } + }, + { + "name": "Café & Restaurant Saite", + "lat": "51.07636", + "lon": "13.74825", + "id": 577481323, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "Mo-Fr 18:00-24:00, Su 10:00-15:00", + "additionalInfo": { + "wheelchair_limited": "limited", + "opening_hours": "Mo-Fr 18:00-24:00, Su 10:00-15:00" + } + }, + { + "name": "Alt-Dresden", + "lat": "51.04977", + "lon": "13.69881", + "id": 970594717, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "wheelchair_limited": "limited", + "phone": "0351 4135133" + } + }, + { + "lat": "51.08677", + "lon": "13.70081", + "id": 413620001, + "subType": "biergarten", + "type": "sustenance" + }, + { + "lat": "50.98618", + "lon": "13.63208", + "id": 10355747978, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "operator": "Hirschbergschenke" + } + }, + { + "name": "Fährgarten Johannstadt", + "lat": "51.06151", + "lon": "13.76679", + "id": 4415013507072, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "wheelchair_yes": "yes", + "outdoor_seating_yes": "yes", + "outdoor_seating_filter_yes": "yes", + "website": "http://www.faehrgarten.de/", + "phone": "+49 351 4596262", + "brewery_additional": "Radeberger", + "email": "info@faehrgarten.de" + } + }, + { + "lat": "51.02343", + "lon": "13.73347", + "id": 4563637454, + "subType": "biergarten", + "type": "sustenance" + }, + { + "name": "Besenwirtschaft Steinrücken", + "lat": "51.11590", + "lon": "13.62457", + "id": 7474665554, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "website": "http://www.besenwirtschaft-steinruecken.de/index.html" + } + }, + { + "lat": "51.05181", + "lon": "13.81396", + "id": 9819148822, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "operator": "WSV \"Am Blauen Wunder\"" + } + }, + { + "name": "Zacke", + "lat": "51.01300", + "lon": "13.63618", + "id": 7498805230, + "subType": "biergarten", + "type": "sustenance" + }, + { + "name": "Klotzscher Sommerwirtschaft", + "lat": "51.11072", + "lon": "13.76879", + "id": 717794449, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "Mo-Fr 17:00-23:00; Sa-Su 11:00-23:00; Nov-Mar off", + "additionalInfo": { + "opening_hours": "Mo-Fr 17:00-23:00; Sa-Su 11:00-23:00; Nov-Mar off", + "website": "http://klotzschersommerwirtschaft.de", + "phone": "+49 351 8804570", + "fax": "+49 351 8902050", + "email": "Kontakt@klotzscher-sommerwirtschaft.de", + "capacity": "20" + } + }, + { + "name": "Brauhaus Watzke", + "lat": "51.07744", + "lon": "13.71540", + "id": 397976739, + "subType": "biergarten", + "type": "sustenance", + "additionalInfo": { + "wheelchair_limited": "limited", + "toilets_wheelchair_no": "no" + } + }, + { + "name": "Trachauer Sommergarten", + "lat": "51.09166", + "lon": "13.70289", + "id": 1822089672, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "Mo-Su 17:00-21:00", + "additionalInfo": { + "opening_hours": "Mo-Su 17:00-21:00", + "note": "Auch im Winter geöffnet" + } + }, + { + "lat": "51.06520", + "lon": "13.82406", + "id": 11565282314, + "subType": "biergarten", + "type": "sustenance", + "openingHours": "seasonal", + "additionalInfo": { + "outdoor_seating_yes": "yes", + "outdoor_seating_filter_yes": "yes", + "opening_hours": "seasonal" + } + } + ] +} \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-be/strings.xml b/OsmAnd-telegram/res/values-be/strings.xml new file mode 100644 index 0000000000..c6882d64de --- /dev/null +++ b/OsmAnd-telegram/res/values-be/strings.xml @@ -0,0 +1,175 @@ + +Апошняе абнаўленне з Telegram + Абярыце імя, якое вы яшчэ не выкарыстоўвалі + %1$s дададзена. + Дадаць + Не атрымалася дадаць новую прыладу + Максімальная даўжыня назвы новай прылады - 200 сімвалаў. + Назва прылады занадта доўгая + Назва прылады не можа быць пустой + Назва прылады + Схаваць + Вы можаце стварыць і праглядзець ідэнтыфікатар прылады ў кліенце Тэлеграма, выкарыстоўваючы %1$s бота. %2$s + Калі вы хочаце падлучыць некалькі прылад да аднаго рахунка тэлеграм, то вам неабходна выкарыстаць розныя прылады, каб падзяліцца месцазнаходжаннем. + Апошняе абнаўленне месцазнаходжання: + Паспяхова адпраўлена і абноўлена + Немагчыма адправіць у размову Тэлеграм: + Чаканне адказу ад Тэлеграм + Адпраўленне месцазнаходжання + Запуск + Пазіцыянаванне… + Злучэнне з Інтэрнэтам + Змена параметраў аптымізацыі батарэі для стабілізацыі абмену інфармацыяй аб месцазнаходжанні. + Праца ў фонавым рэжыме + Выключыць аптымізацыю батарэі для OsmAnd Telegram, каб прадухіліць нечаканае выключэнне фонавага рэжыму. + Абмен у фонавым рэжыме + Перайсці ў налады + Пазней + Яшчэ не адпраўлена + Яшчэ не знойдзена + Пераадправіць звесткі аб месцазнаходжанні + Апошняе даступнае месца + "Статус абмену " + Абмен: Уключаны + Статус + Злучэнне з GPS адсутнічае + Злучэнне з Інтэрнэтам адсутнічае + Выключыць + Захаваць + Дадаць прыладу + Падзяліцца месцазнаходжаннем як + Кантакты і групы для абмену месцазнаходжаннем. + "Вы не зможаце падзяліцца сваім месцазнаходжаннем і ўбачыць месцазнаходжанне іншых. Сапраўды выйсці з OsmAnd Telegram\? " + Выйсці з OsmAnd Telegram\? + Імя + Па адлегласці + Па імёнах + Па групе + Упарадкаваць + Упарадкаваць па + Абярыце версію OsmAnd, у якой кантакты будуць адлюстроўвацца на мапе. + Абярыце версію OsmAnd для выкарыстання + Выключыць абмен для ўсіх абраных размоў (%1$d). + Выключыць усе абмены + Выключыце ўсе + Выйсці + таму + Апошні адказ + Група + Падлучыцеся да Інтэрнэту, каб карэктна выйсці з Тэлеграм. + Закрыць + Для таго, каб скасаваць абмен месцазнаходжаннем, адкрыйце Тэлеграм, перайдзіце ў Налады → Прыватнасць і бяспека → Сеансы і спыніце сеанс OsmAnd Telegram. + Як выключыць абмен месцазнаходжаннем у OsmAnd праз Тэлеграм + Як выключыць абмен месцазнаходжаннем у OsmAnd праз Тэлеграм + Падлучаны рахунак + Рахунак + у %1$s + Абраць версію OsmAnd, якую OsmAnd Telegram будзе выкарыстоўваць для адлюстравання пазіцыі. + Злучэнне з OsmAnd + Схаваць кантакты, якія не перамяшчаліся пэўны час. + Гісторыя месцазнаходжанняў + Апошні раз кантакт рухаўся. + Не рухаецца + Вызначыць мінімальны інтэрвал для абмену інфармацыяй аб месцазнаходжанні. + Адправіць маё месцазнаходжанне + Пазіцыя + "Час абмену " + Сыходзіць + Абмен уключаны (выключыць) + Выключыць абмен + Адкрыць OsmAnd + Дзейных + Бот + Рэгістрацыя ў Telegram + Для абмену вам неабходны рахунак Тэлеграм. + Калі ласка, ўсталюйце Тэлеграм і наладзьце рахунак. + Пасля гэтага вы зможаце выкарыстоўваць дадатак. + Усе + Выкл + Вам неабходна мець рахунак Тэлеграм і нумар тэлефона + У мяне няма рахунка Тэлеграм + Увядзіце нумар тэлефона + Увядзіце код аўтарызацыі + Вызначце бачны час для ўсіх + %1$d г %2$d хв + %1$d хв + %1$d г + Усталяваць + Падзяліцца + Назад + Бачны для ўсіх час + Задайце час, што будуць бачыць абраныя вамі кантакты і групы ў рэжыме рэальнага часу. + Задаць час + Абярыце кантакты і групы, з якімі хочаце абменьвацца вашым месцазнаходжаннем. + Пошук: група альбо кантакт + Падзяліцца месцазнаходжаннем + Паказаць на мапе + ОsmAnd Telegram + Нумар тэлефона + Нумар тэлефона ў міжнародным фармаце + Пароль + Увядзіце код + Код аўтэнтыфікацыі + Тэлеграм адправіў вам код для OsmAnd для ўваходу ў рахунак. + Увядзіце пароль + Пароль Тэлеграм + Увайсці + Выйсці + Запуск + Выхад + Закрыццё + Уключыць \"Месцазнаходжанне\"\? + Вы не ўвайшлі + Працягнуць + Скасаваць + Налады + Дадатак не мае дазволу на доступ да даных аб месцазнаходжанні. + Калі ласка, ўключыце \"Месцазнаходжанне\" ў сістэмных наладах + Абярыце аднаго пастаўшчыка месцазнаходжання, каб падзяліцца сваім месцазнаходжаннем. + Фонавы рэжым + OsmAnd Telegram працуе ў фонавым рэжыме з выключаным экранам. + Адлегласць + Падзяліцца месцазнаходжаннем + Абмен данымі аб месцазнаходжанні + Сэрвіс OsmAnd Telegram + Лагатып OsmAnd + Спачатку вам неабходна ўсталяваць бясплатную ці платную версію OsmAnd + Усталяваць OsmAnd + Паказаць карыстальнікаў на мапе + Актыўныя размовы + Аўтарызацыя + Калі ласка, увядзіце ваш нумар тэлефона, звязаны з Тэлеграм, ў міжнародным фармаце + Вітаем + + ярд + фут + міл + км + м + м.мілі + хв/м + хв/км + м.міль/г + м/с + км/г + м/г + Кіламетраў за гадзіну + Міляў за гадзіну + Метраў за секунду + Хвілін на кіламетар + Хвілін на мілю + Марскіх міль за гадзіну (вузлоў) + Мілі/футы + Мілі/ярды + Кіламетры/метры + Марскія мілі + Мілі/метры + г + хвіл + сек + Абмен месцазнаходжаннем OsmAnd Дае магчымасць дзяліцца сваім месцазнаходжаннем і бачыць месцазнаходжанне іншых у OsmAnd.

Дадатак выкарыстоўвае Telegram API, таму вам неабходны рахунак Тэлеграм.
+ Маё месцазнаходжанне + Зараз дзейнічае + + +
diff --git a/OsmAnd-telegram/res/values-fa/strings.xml b/OsmAnd-telegram/res/values-fa/strings.xml index 3e41cbed9b..302ffb89d8 100644 --- a/OsmAnd-telegram/res/values-fa/strings.xml +++ b/OsmAnd-telegram/res/values-fa/strings.xml @@ -19,4 +19,5 @@ بازفرستی موقعیت اشتراک‌گذاری: فعال وضعیت + بستن diff --git a/OsmAnd-telegram/res/values-he/strings.xml b/OsmAnd-telegram/res/values-he/strings.xml new file mode 100644 index 0000000000..d26b84de8d --- /dev/null +++ b/OsmAnd-telegram/res/values-he/strings.xml @@ -0,0 +1,29 @@ + +עדכון אחרון מטלגרם + נא לבחור שם שלא השתמשת בו עדיין + %1$s נוסף. + הוספה + לא ניתן להוסיף מכשיר חדש + נא לתת שם באורך של עד 200 תווים למכשיר החדש שלך. + שם המכשיר ארוך מדי + שם המכשיר לא יכול להישאר ריק + שם המכשיר + הסתרה + ניתן ליצור ולצפות במזהה ההתקן בלקוח הטלגרם הזה באמצעות רובוט ההתכתבות %1$s.‏ %2$s + אם ברצונך לחבר מגוון מכשירים לחשבון טלגרם אחד, עליך להשתמש במכשיר אחר כדי לשתף את המיקום שלך. + המיקום האחרון שעודכן: + נשלח ועודכן בהצלחה + אין אפשרות לשלוח להתכתבויות בטלגרם: + שליחת מיקום בתור + נא לבחור כיצד הודעות עם המיקום שלך תיראנה. + מפה + טקסט + מפה וטקסט + בהמתנה לתגובה מטלגרם + המיקום נשלח + מופעל + מתבצע איתור המיקום… + מתבצעת התחברות לאינטרנט + ניתן לשנות הגדרות מיטוב סוללה כדי לייצב את שיתוף המיקום. + עבודת רקע + diff --git a/OsmAnd-telegram/res/values-nb/strings.xml b/OsmAnd-telegram/res/values-nb/strings.xml index 047fa4d4ec..3c4192de7d 100644 --- a/OsmAnd-telegram/res/values-nb/strings.xml +++ b/OsmAnd-telegram/res/values-nb/strings.xml @@ -174,4 +174,9 @@ Siste oppdatering fra Telegram + Send plassering som + Velg hvordan meldinger med din plassering skal se ut. + Kart + Tekst + Kart og tekst diff --git a/OsmAnd-telegram/res/values-uk/strings.xml b/OsmAnd-telegram/res/values-uk/strings.xml index a088ff496f..91c5164ce2 100644 --- a/OsmAnd-telegram/res/values-uk/strings.xml +++ b/OsmAnd-telegram/res/values-uk/strings.xml @@ -159,4 +159,5 @@ Моя позиція Встановіть мінімальний інтервал між надсиланням позиції. Діє до + Нещодавнє оновлення з Telegram diff --git a/OsmAnd-telegram/res/values/strings.xml b/OsmAnd-telegram/res/values/strings.xml index fe976517fb..3e134ade9b 100644 --- a/OsmAnd-telegram/res/values/strings.xml +++ b/OsmAnd-telegram/res/values/strings.xml @@ -1,4 +1,9 @@ + Send location as + Choose how messages with your location will look like. + Map + Text + Map and text Last update from Telegram Pick a name you haven\'t already used %1$s added. diff --git a/OsmAnd-telegram/src/net/osmand/telegram/TelegramSettings.kt b/OsmAnd-telegram/src/net/osmand/telegram/TelegramSettings.kt index a2cb3e34ef..f7c819fbe0 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/TelegramSettings.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/TelegramSettings.kt @@ -7,7 +7,6 @@ import android.support.annotation.DrawableRes import android.support.annotation.StringRes import android.text.SpannableStringBuilder import android.text.style.ForegroundColorSpan -import net.osmand.data.LatLon import net.osmand.telegram.helpers.OsmandAidlHelper import net.osmand.telegram.helpers.TelegramHelper import net.osmand.telegram.utils.AndroidUtils @@ -43,9 +42,15 @@ private val LOC_HISTORY_VALUES_SEC = listOf( 24 * 60 * 60L ) +const val SHARE_TYPE_MAP = "Map" +const val SHARE_TYPE_TEXT = "Text" +const val SHARE_TYPE_MAP_AND_TEXT = "Map_and_text" +private val SHARE_TYPE_VALUES = listOf(SHARE_TYPE_MAP, SHARE_TYPE_TEXT, SHARE_TYPE_MAP_AND_TEXT) + private const val SEND_MY_LOC_DEFAULT_INDEX = 6 -private const val STALE_LOC_DEFAULT_INDEX = 4 -private const val LOC_HISTORY_DEFAULT_INDEX = 2 +private const val STALE_LOC_DEFAULT_INDEX = 0 +private const val LOC_HISTORY_DEFAULT_INDEX = 7 +private const val SHARE_TYPE_DEFAULT_INDEX = 2 private const val SETTINGS_NAME = "osmand_telegram_settings" @@ -60,6 +65,7 @@ private const val SPEED_CONSTANTS_KEY = "speed_constants" private const val SEND_MY_LOC_INTERVAL_KEY = "send_my_loc_interval" private const val STALE_LOC_TIME_KEY = "stale_loc_time" private const val LOC_HISTORY_TIME_KEY = "loc_history_time" +private const val SHARE_TYPE_KEY = "share_type" private const val APP_TO_CONNECT_PACKAGE_KEY = "app_to_connect_package" @@ -94,13 +100,14 @@ class TelegramSettings(private val app: TelegramApplication) { var sendMyLocInterval = SEND_MY_LOC_VALUES_SEC[SEND_MY_LOC_DEFAULT_INDEX] var staleLocTime = STALE_LOC_VALUES_SEC[STALE_LOC_DEFAULT_INDEX] var locHistoryTime = LOC_HISTORY_VALUES_SEC[LOC_HISTORY_DEFAULT_INDEX] + var shareTypeValue = SHARE_TYPE_VALUES[SHARE_TYPE_DEFAULT_INDEX] var appToConnectPackage = "" private set var liveNowSortType = LiveNowSortType.SORT_BY_GROUP - val gpsAndLocPrefs = listOf(SendMyLocPref(), StaleLocPref(), LocHistoryPref()) + val gpsAndLocPrefs = listOf(SendMyLocPref(), StaleLocPref(), LocHistoryPref(), ShareTypePref()) var batteryOptimisationAsked = false @@ -113,6 +120,8 @@ class TelegramSettings(private val app: TelegramApplication) { fun isSharingLocationToChat(chatId: Long) = shareChatsInfo.containsKey(chatId) + fun isSharingLocationToUser(userId: Int) = shareChatsInfo.values.any { it.userId == userId } + fun hasAnyChatToShowOnMap() = !hiddenOnMapChats.containsAll(getLiveNowChats()) fun isShowingChatOnMap(chatId: Long) = !hiddenOnMapChats.contains(chatId) @@ -132,35 +141,33 @@ class TelegramSettings(private val app: TelegramApplication) { addActiveTime: Long = ADDITIONAL_ACTIVE_TIME_VALUES_SEC[0] ) { if (share) { - val lp: Long = when { - livePeriod < TelegramHelper.MIN_LOCATION_MESSAGE_LIVE_PERIOD_SEC -> TelegramHelper.MIN_LOCATION_MESSAGE_LIVE_PERIOD_SEC.toLong() - else -> livePeriod - } var shareChatInfo = shareChatsInfo[chatId] if (shareChatInfo == null) { shareChatInfo = ShareChatInfo() } - val currentTime = System.currentTimeMillis() / 1000 - val user = app.telegramHelper.getCurrentUser() - if (user != null && currentSharingMode != user.id.toString() && shareChatInfo.start == -1L) { - shareChatInfo.shouldSendViaBotMessage = true + val chat = app.telegramHelper.getChat(chatId) + if (chat != null && (chat.type is TdApi.ChatTypePrivate || chat.type is TdApi.ChatTypeSecret)) { + shareChatInfo.userId = app.telegramHelper.getUserIdFromChatType(chat.type) } - shareChatInfo.chatId = chatId - shareChatInfo.start = currentTime - if (shareChatInfo.livePeriod == -1L) { - shareChatInfo.livePeriod = lp - } - shareChatInfo.userSetLivePeriod = lp - shareChatInfo.userSetLivePeriodStart = currentTime - shareChatInfo.currentMessageLimit = currentTime + Math.min(lp, TelegramHelper.MAX_LOCATION_MESSAGE_LIVE_PERIOD_SEC.toLong()) - shareChatInfo.additionalActiveTime = addActiveTime + updateChatShareInfo(shareChatInfo, livePeriod, addActiveTime) shareChatsInfo[chatId] = shareChatInfo } else { shareChatsInfo.remove(chatId) } } + fun shareLocationToUser( + userId: Int, + livePeriod: Long = DEFAULT_VISIBLE_TIME_SECONDS, + addActiveTime: Long = ADDITIONAL_ACTIVE_TIME_VALUES_SEC[0] + ) { + val shareChatInfo = ShareChatInfo() + shareChatInfo.userId = userId + updateChatShareInfo(shareChatInfo, livePeriod, addActiveTime) + app.telegramHelper.createPrivateChatWithUser(userId, shareChatInfo, shareChatsInfo) + } + fun updateShareDevices(list: List) { shareDevices = list.toHashSet() } @@ -195,9 +202,7 @@ class TelegramSettings(private val app: TelegramApplication) { return false } - fun getShareDeviceNameWithExternalId(externalId: String): String? { - return shareDevices.singleOrNull { it.externalId == externalId }?.deviceName - } + fun getCurrentSharingDevice() = shareDevices.singleOrNull { it.externalId == currentSharingMode } fun getLastSuccessfulSendTime() = shareChatsInfo.values.maxBy { it.lastSuccessfulSendTimeMs }?.lastSuccessfulSendTimeMs ?: -1 @@ -235,9 +240,14 @@ class TelegramSettings(private val app: TelegramApplication) { fun updateShareInfo(message: TdApi.Message) { val shareChatInfo = shareChatsInfo[message.chatId] val content = message.content - if (shareChatInfo != null && content is TdApi.MessageLocation) { - shareChatInfo.currentMessageId = message.id - shareChatInfo.lastSuccessfulLocation = LatLon(content.location.latitude, content.location.longitude) + if (shareChatInfo != null) { + when (content) { + is TdApi.MessageLocation -> shareChatInfo.currentMapMessageId = message.id + is TdApi.MessageText -> { + shareChatInfo.currentTextMessageId = message.id + shareChatInfo.updateTextMessageId++ + } + } shareChatInfo.lastSuccessfulSendTimeMs = Math.max(message.editDate, message.date) * 1000L } } @@ -271,6 +281,31 @@ class TelegramSettings(private val app: TelegramApplication) { } } + private fun updateChatShareInfo( + shareChatInfo: ShareChatInfo, + livePeriod: Long = DEFAULT_VISIBLE_TIME_SECONDS, + addActiveTime: Long = ADDITIONAL_ACTIVE_TIME_VALUES_SEC[0] + ) { + val lp: Long = when { + livePeriod < TelegramHelper.MIN_LOCATION_MESSAGE_LIVE_PERIOD_SEC -> TelegramHelper.MIN_LOCATION_MESSAGE_LIVE_PERIOD_SEC.toLong() + else -> livePeriod + } + val currentTime = System.currentTimeMillis() / 1000 + val user = app.telegramHelper.getCurrentUser() + if (user != null && currentSharingMode != user.id.toString() && shareChatInfo.start == -1L) { + shareChatInfo.shouldSendViaBotMessage = true + } + + shareChatInfo.start = currentTime + if (shareChatInfo.livePeriod == -1L) { + shareChatInfo.livePeriod = lp + } + shareChatInfo.userSetLivePeriod = lp + shareChatInfo.userSetLivePeriodStart = currentTime + shareChatInfo.currentMessageLimit = currentTime + Math.min(lp, TelegramHelper.MAX_LOCATION_MESSAGE_LIVE_PERIOD_SEC.toLong()) + shareChatInfo.additionalActiveTime = addActiveTime + } + private fun getNewSharingStatusHistoryItem(): SharingStatus { return SharingStatus().apply { statusChangeTime = System.currentTimeMillis() @@ -357,9 +392,14 @@ class TelegramSettings(private val app: TelegramApplication) { } fun onDeleteLiveMessages(chatId: Long, messages: List) { - val currentMessageId = shareChatsInfo[chatId]?.currentMessageId - if (messages.contains(currentMessageId)) { - shareChatsInfo[chatId]?.currentMessageId = -1 + val currentMapMessageId = shareChatsInfo[chatId]?.currentMapMessageId + if (messages.contains(currentMapMessageId)) { + shareChatsInfo[chatId]?.currentMapMessageId = -1 + } + val currentTextMessageId = shareChatsInfo[chatId]?.currentTextMessageId + if (messages.contains(currentTextMessageId)) { + shareChatsInfo[chatId]?.currentTextMessageId = -1 + shareChatsInfo[chatId]?.updateTextMessageId = 1 } } @@ -383,6 +423,8 @@ class TelegramSettings(private val app: TelegramApplication) { edit.putLong(STALE_LOC_TIME_KEY, staleLocTime) edit.putLong(LOC_HISTORY_TIME_KEY, locHistoryTime) + edit.putString(SHARE_TYPE_KEY, shareTypeValue) + edit.putString(APP_TO_CONNECT_PACKAGE_KEY, appToConnectPackage) edit.putString(LIVE_NOW_SORT_TYPE_KEY, liveNowSortType.name) @@ -433,6 +475,8 @@ class TelegramSettings(private val app: TelegramApplication) { staleLocTime = prefs.getLong(STALE_LOC_TIME_KEY, staleLocDef) val locHistoryDef = LOC_HISTORY_VALUES_SEC[LOC_HISTORY_DEFAULT_INDEX] locHistoryTime = prefs.getLong(LOC_HISTORY_TIME_KEY, locHistoryDef) + val shareTypeDef = SHARE_TYPE_VALUES[SHARE_TYPE_DEFAULT_INDEX] + shareTypeValue = prefs.getString(SHARE_TYPE_KEY, shareTypeDef) currentSharingMode = prefs.getString(SHARING_MODE_KEY, "") @@ -472,10 +516,13 @@ class TelegramSettings(private val app: TelegramApplication) { shareChatsInfo.forEach { (chatId, chatInfo) -> val obj = JSONObject() obj.put(ShareChatInfo.CHAT_ID_KEY, chatId) + obj.put(ShareChatInfo.USER_ID_KEY, chatInfo.userId) obj.put(ShareChatInfo.START_KEY, chatInfo.start) obj.put(ShareChatInfo.LIVE_PERIOD_KEY, chatInfo.livePeriod) obj.put(ShareChatInfo.LIMIT_KEY, chatInfo.currentMessageLimit) - obj.put(ShareChatInfo.CURRENT_MESSAGE_ID_KEY, chatInfo.currentMessageId) + obj.put(ShareChatInfo.UPDATE_TEXT_MESSAGE_ID_KEY, chatInfo.updateTextMessageId) + obj.put(ShareChatInfo.CURRENT_MAP_MESSAGE_ID_KEY, chatInfo.currentMapMessageId) + obj.put(ShareChatInfo.CURRENT_TEXT_MESSAGE_ID_KEY, chatInfo.currentTextMessageId) obj.put(ShareChatInfo.USER_SET_LIVE_PERIOD_KEY, chatInfo.userSetLivePeriod) obj.put(ShareChatInfo.USER_SET_LIVE_PERIOD_START_KEY, chatInfo.userSetLivePeriodStart) obj.put(ShareChatInfo.LAST_SUCCESSFUL_SEND_TIME_KEY, chatInfo.lastSuccessfulSendTimeMs) @@ -493,10 +540,13 @@ class TelegramSettings(private val app: TelegramApplication) { val obj = json.getJSONObject(i) val shareInfo = ShareChatInfo().apply { chatId = obj.optLong(ShareChatInfo.CHAT_ID_KEY) + userId = obj.optInt(ShareChatInfo.USER_ID_KEY) start = obj.optLong(ShareChatInfo.START_KEY) livePeriod = obj.optLong(ShareChatInfo.LIVE_PERIOD_KEY) currentMessageLimit = obj.optLong(ShareChatInfo.LIMIT_KEY) - currentMessageId = obj.optLong(ShareChatInfo.CURRENT_MESSAGE_ID_KEY) + updateTextMessageId = obj.optInt(ShareChatInfo.UPDATE_TEXT_MESSAGE_ID_KEY) + currentMapMessageId = obj.optLong(ShareChatInfo.CURRENT_MAP_MESSAGE_ID_KEY) + currentTextMessageId = obj.optLong(ShareChatInfo.CURRENT_TEXT_MESSAGE_ID_KEY) userSetLivePeriod = obj.optLong(ShareChatInfo.USER_SET_LIVE_PERIOD_KEY) userSetLivePeriodStart = obj.optLong(ShareChatInfo.USER_SET_LIVE_PERIOD_START_KEY) lastSuccessfulSendTimeMs = obj.optLong(ShareChatInfo.LAST_SUCCESSFUL_SEND_TIME_KEY) @@ -572,6 +622,41 @@ class TelegramSettings(private val app: TelegramApplication) { } } + inner class ShareTypePref : DurationPref( + R.drawable.ic_action_location_history, + R.string.send_location_as, + R.string.send_location_as_descr, + emptyList() + ) { + + override fun getCurrentValue(): String { + return getTextValue(shareTypeValue) + } + + override fun setCurrentValue(index: Int) { + val newSharingType = SHARE_TYPE_VALUES[index] + if (shareTypeValue != newSharingType && app.telegramHelper.getCurrentUser()?.id.toString() != currentSharingMode) { + shareChatsInfo.forEach { (_, shareInfo) -> + shareInfo.shouldSendViaBotMessage = true + } + } + shareTypeValue = newSharingType + } + + override fun getMenuItems(): List { + return SHARE_TYPE_VALUES.map { getTextValue(it) } + } + + private fun getTextValue(shareType: String): String { + return when (shareType) { + SHARE_TYPE_MAP -> app.getString(R.string.shared_string_map) + SHARE_TYPE_TEXT -> app.getString(R.string.shared_string_text) + SHARE_TYPE_MAP_AND_TEXT -> app.getString(R.string.map_and_text) + else -> "" + } + } + } + abstract inner class DurationPref( @DrawableRes val iconId: Int, @StringRes val titleId: Int, @@ -583,7 +668,7 @@ class TelegramSettings(private val app: TelegramApplication) { abstract fun setCurrentValue(index: Int) - fun getMenuItems() = values.map { OsmandFormatter.getFormattedDuration(app, it) } + open fun getMenuItems() = values.map { OsmandFormatter.getFormattedDuration(app, it) } } enum class AppConnect( @@ -738,13 +823,15 @@ class TelegramSettings(private val app: TelegramApplication) { class ShareChatInfo { var chatId = -1L + var userId = -1 var start = -1L var livePeriod = -1L + var updateTextMessageId = 1 var currentMessageLimit = -1L - var currentMessageId = -1L + var currentMapMessageId = -1L + var currentTextMessageId = -1L var userSetLivePeriod = -1L var userSetLivePeriodStart = -1L - var lastSuccessfulLocation: LatLon? = null var lastSuccessfulSendTimeMs = -1L var shouldDeletePreviousMessage = false var shouldSendViaBotMessage = false @@ -767,10 +854,13 @@ class TelegramSettings(private val app: TelegramApplication) { companion object { internal const val CHAT_ID_KEY = "chatId" + internal const val USER_ID_KEY = "userId" internal const val START_KEY = "start" internal const val LIVE_PERIOD_KEY = "livePeriod" internal const val LIMIT_KEY = "limit" - internal const val CURRENT_MESSAGE_ID_KEY = "currentMessageId" + internal const val UPDATE_TEXT_MESSAGE_ID_KEY = "updateTextMessageId" + internal const val CURRENT_MAP_MESSAGE_ID_KEY = "currentMapMessageId" + internal const val CURRENT_TEXT_MESSAGE_ID_KEY = "currentTextMessageId" internal const val USER_SET_LIVE_PERIOD_KEY = "userSetLivePeriod" internal const val USER_SET_LIVE_PERIOD_START_KEY = "userSetLivePeriodStart" internal const val LAST_SUCCESSFUL_SEND_TIME_KEY = "lastSuccessfulSendTime" diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShareLocationHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShareLocationHelper.kt index 3860139bf5..bb9106ed83 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShareLocationHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShareLocationHelper.kt @@ -2,8 +2,7 @@ package net.osmand.telegram.helpers import net.osmand.Location import net.osmand.PlatformUtil -import net.osmand.telegram.TelegramApplication -import net.osmand.telegram.TelegramSettings +import net.osmand.telegram.* import net.osmand.telegram.notifications.TelegramNotification.NotificationType import net.osmand.telegram.utils.AndroidNetworkUtils import net.osmand.telegram.utils.BASE_URL @@ -57,9 +56,16 @@ class ShareLocationHelper(private val app: TelegramApplication) { val sharingMode = app.settings.currentSharingMode if (user != null && sharingMode == user.id.toString()) { - app.telegramHelper.sendLiveLocationMessage(chatsShareInfo, latitude, longitude) + when (app.settings.shareTypeValue) { + SHARE_TYPE_MAP -> app.telegramHelper.sendLiveLocationMessage(chatsShareInfo, latitude, longitude) + SHARE_TYPE_TEXT -> app.telegramHelper.sendLiveLocationText(chatsShareInfo, location) + SHARE_TYPE_MAP_AND_TEXT -> { + app.telegramHelper.sendLiveLocationMessage(chatsShareInfo, latitude, longitude) + app.telegramHelper.sendLiveLocationText(chatsShareInfo, location) + } + } } else if (sharingMode.isNotEmpty()) { - val url = "$BASE_URL/device/$sharingMode/send?lat=$latitude&lon=$longitude" + val url = getDeviceSharingUrl(location,sharingMode) AndroidNetworkUtils.sendRequestAsync(app, url, null, "Send Location", false, false, object : AndroidNetworkUtils.OnRequestResultListener { override fun onResult(result: String?) { @@ -150,6 +156,24 @@ class ShareLocationHelper(private val app: TelegramApplication) { refreshNotification() } + private fun getDeviceSharingUrl(loc: Location, sharingMode: String): String { + val url = "$BASE_URL/device/$sharingMode/send?lat=${loc.latitude}&lon=${loc.longitude}" + val builder = StringBuilder(url) + if (loc.hasBearing() && loc.bearing != 0.0f) { + builder.append("&azi=${loc.bearing}") + } + if (loc.hasSpeed() && loc.speed != 0.0f) { + builder.append("&spd=${loc.speed}") + } + if (loc.hasAltitude() && loc.altitude != 0.0) { + builder.append("&alt=${loc.altitude}") + } + if (loc.hasAccuracy() && loc.accuracy != 0.0f) { + builder.append("&hdop=${loc.accuracy}") + } + return builder.toString() + } + private fun updateShareInfoSuccessfulSendTime(result: String?, chatsShareInfo: Map) { if (result != null) { try { @@ -167,11 +191,11 @@ class ShareLocationHelper(private val app: TelegramApplication) { } private fun checkAndSendViaBotMessages(chatsShareInfo: Map, location: TdApi.Location, osmandBot: TdApi.User) { - val deviceName = app.settings.getShareDeviceNameWithExternalId(app.settings.currentSharingMode) - if (deviceName != null) { + val device = app.settings.getCurrentSharingDevice() + if (device != null) { chatsShareInfo.forEach { (_, shareInfo) -> if (shareInfo.shouldSendViaBotMessage) { - app.telegramHelper.sendViaBotLocationMessage(osmandBot.id, shareInfo, location, deviceName) + app.telegramHelper.sendViaBotLocationMessage(osmandBot.id, shareInfo, location, device,app.settings.shareTypeValue) shareInfo.shouldSendViaBotMessage = false } } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt index cb08aafdb1..9d52abdb37 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt @@ -9,6 +9,7 @@ import net.osmand.aidl.maplayer.point.AMapPoint import net.osmand.telegram.R import net.osmand.telegram.TelegramApplication import net.osmand.telegram.helpers.TelegramHelper.MessageOsmAndBotLocation +import net.osmand.telegram.helpers.TelegramHelper.MessageUserTextLocation import net.osmand.telegram.helpers.TelegramUiHelper.ListItem import net.osmand.telegram.utils.AndroidUtils import org.drinkless.td.libcore.telegram.TdApi @@ -79,7 +80,7 @@ class ShowLocationHelper(private val app: TelegramApplication) { val content = message.content val date = telegramHelper.getLastUpdatedTime(message) val stale = System.currentTimeMillis() / 1000 - date > app.settings.staleLocTime - if (chatTitle != null && content is TdApi.MessageLocation) { + if (chatTitle != null && (content is TdApi.MessageLocation || (content is MessageUserTextLocation && content.isValid()))) { var userName = "" var photoPath: String? = null val user = telegramHelper.getUser(message.senderUserId) @@ -102,12 +103,19 @@ class ShowLocationHelper(private val app: TelegramApplication) { } setupMapLayer() val params = generatePointParams(photoPath, stale) - if (update) { - osmandAidlHelper.updateMapPoint(MAP_LAYER_ID, "${chatId}_${message.senderUserId}", userName, userName, - chatTitle, Color.WHITE, ALatLon(content.location.latitude, content.location.longitude), null, params) - } else { - osmandAidlHelper.addMapPoint(MAP_LAYER_ID, "${chatId}_${message.senderUserId}", userName, userName, - chatTitle, Color.WHITE, ALatLon(content.location.latitude, content.location.longitude), null, params) + val aLatLon = when (content) { + is TdApi.MessageLocation -> ALatLon(content.location.latitude, content.location.longitude) + is MessageUserTextLocation -> ALatLon(content.lat, content.lon) + else -> null + } + if (aLatLon != null) { + if (update) { + osmandAidlHelper.updateMapPoint(MAP_LAYER_ID, "${chatId}_${message.senderUserId}", userName, userName, + chatTitle, Color.WHITE, aLatLon, null, params) + } else { + osmandAidlHelper.addMapPoint(MAP_LAYER_ID, "${chatId}_${message.senderUserId}", userName, userName, + chatTitle, Color.WHITE, aLatLon, null, params) + } } } else if (chatTitle != null && content is MessageOsmAndBotLocation && content.isValid()) { val name = content.name @@ -242,7 +250,7 @@ class ShowLocationHelper(private val app: TelegramApplication) { private fun removeMapPoint(chatId: Long, message: TdApi.Message) { val content = message.content - if (content is TdApi.MessageLocation) { + if (content is TdApi.MessageLocation || content is MessageUserTextLocation) { osmandAidlHelper.removeMapPoint(MAP_LAYER_ID, "${chatId}_${message.senderUserId}") } else if (content is MessageOsmAndBotLocation) { osmandAidlHelper.removeMapPoint(MAP_LAYER_ID, "${chatId}_${content.name}") diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt index 0d3091f700..f3d6903a1a 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt @@ -1,11 +1,17 @@ package net.osmand.telegram.helpers import android.text.TextUtils +import net.osmand.Location import net.osmand.PlatformUtil +import net.osmand.telegram.SHARE_TYPE_MAP +import net.osmand.telegram.SHARE_TYPE_MAP_AND_TEXT +import net.osmand.telegram.SHARE_TYPE_TEXT import net.osmand.telegram.TelegramSettings import net.osmand.telegram.helpers.TelegramHelper.TelegramAuthenticationParameterType.* +import net.osmand.telegram.utils.BASE_SHARING_URL import net.osmand.telegram.utils.GRAYSCALE_PHOTOS_DIR import net.osmand.telegram.utils.GRAYSCALE_PHOTOS_EXT +import net.osmand.util.GeoPointParserUtil import org.drinkless.td.libcore.telegram.Client import org.drinkless.td.libcore.telegram.Client.ResultHandler import org.drinkless.td.libcore.telegram.TdApi @@ -34,7 +40,13 @@ class TelegramHelper private constructor() { private const val LOCATION_PREFIX = "Location: " private const val LAST_LOCATION_PREFIX = "Last location: " private const val UPDATED_PREFIX = "Updated: " + private const val USER_TEXT_LOCATION_TITLE = "\uD83D\uDDFA OsmAnd sharing:" + private const val ALTITUDE_PREFIX = "Altitude: " + private const val SPEED_PREFIX = "Speed: " + private const val HDOP_PREFIX = "Horizontal precision: " + + private const val NOW = "now" private const val FEW_SECONDS_AGO = "few seconds ago" private const val SECONDS_AGO_SUFFIX = " seconds ago" private const val MINUTES_AGO_SUFFIX = " minutes ago" @@ -68,6 +80,7 @@ class TelegramHelper private constructor() { var lastTelegramUpdateTime: Int = 0 private val users = ConcurrentHashMap() + private val contacts = ConcurrentHashMap() private val basicGroups = ConcurrentHashMap() private val supergroups = ConcurrentHashMap() private val secretChats = ConcurrentHashMap() @@ -141,6 +154,8 @@ class TelegramHelper private constructor() { fun getChatListIds() = getChatList().map { it.chatId } + fun getContacts() = contacts + fun getChatIds() = chats.keys().toList() fun getChat(id: Long) = chats[id] @@ -197,10 +212,10 @@ class TelegramHelper private constructor() { fun getLastUpdatedTime(message: TdApi.Message): Int { val content = message.content - return if (content is MessageOsmAndBotLocation) { - content.lastUpdated - } else { - Math.max(message.editDate, message.date) + return when (content) { + is MessageOsmAndBotLocation -> content.lastUpdated + is MessageUserTextLocation -> content.lastUpdated + else -> Math.max(message.editDate, message.date) } } @@ -237,6 +252,7 @@ class TelegramHelper private constructor() { fun onTelegramChatsRead() fun onTelegramChatsChanged() fun onTelegramChatChanged(chat: TdApi.Chat) + fun onTelegramChatCreated(chat: TdApi.Chat) fun onTelegramUserChanged(user: TdApi.User) fun onTelegramError(code: Int, message: String) } @@ -387,7 +403,12 @@ class TelegramHelper private constructor() { fun hasGrayscaleUserPhoto(userId: Int): Boolean { return File("$appDir/$GRAYSCALE_PHOTOS_DIR$userId$GRAYSCALE_PHOTOS_EXT").exists() } - + + private fun isUserLocationMessage(message: TdApi.Message): Boolean { + val cont = message.content + return (cont is MessageUserTextLocation || cont is TdApi.MessageLocation) + } + private fun hasLocalUserPhoto(user: TdApi.User): Boolean { val localPhoto = user.profilePhoto?.small?.local return if (localPhoto != null) { @@ -485,9 +506,9 @@ class TelegramHelper private constructor() { } } - fun sendViaBotLocationMessage(userId: Int, shareInfo: TelegramSettings.ShareChatInfo, location: TdApi.Location, query: String) { + fun sendViaBotLocationMessage(userId: Int, shareInfo: TelegramSettings.ShareChatInfo, location: TdApi.Location, device: TelegramSettings.DeviceBot, shareType:String) { log.debug("sendViaBotLocationMessage - ${shareInfo.chatId}") - client?.send(TdApi.GetInlineQueryResults(userId, shareInfo.chatId, location, query, "")) { obj -> + client?.send(TdApi.GetInlineQueryResults(userId, shareInfo.chatId, location, device.deviceName, "")) { obj -> when (obj.constructor) { TdApi.Error.CONSTRUCTOR -> { val error = obj as TdApi.Error @@ -498,7 +519,7 @@ class TelegramHelper private constructor() { } } TdApi.InlineQueryResults.CONSTRUCTOR -> { - sendViaBotMessageFromQueryResults(shareInfo, obj as TdApi.InlineQueryResults, query) + sendViaBotMessageFromQueryResults(shareInfo, obj as TdApi.InlineQueryResults, device.externalId, shareType) } } } @@ -507,16 +528,26 @@ class TelegramHelper private constructor() { private fun sendViaBotMessageFromQueryResults( shareInfo: TelegramSettings.ShareChatInfo, inlineQueryResults: TdApi.InlineQueryResults, - query: String + deviceId: String, + shareType: String ) { val queryResults = inlineQueryResults.results.asList() if (queryResults.isNotEmpty()) { - val resultArticle = queryResults.firstOrNull { - (it is TdApi.InlineQueryResultArticle && it.id.startsWith("t") && it.title == query) + val resultArticles = mutableListOf() + queryResults.forEach { + if (it is TdApi.InlineQueryResultArticle && it.id.substring(1) == deviceId) { + val textLocationArticle = it.id.startsWith("t") + val mapLocationArticle = it.id.startsWith("m") + if (shareType == SHARE_TYPE_MAP && mapLocationArticle + || shareType == SHARE_TYPE_TEXT && textLocationArticle + || shareType == SHARE_TYPE_MAP_AND_TEXT && (textLocationArticle || mapLocationArticle)) { + resultArticles.add(it) + } + } } - if (resultArticle != null && resultArticle is TdApi.InlineQueryResultArticle) { + resultArticles.forEach { client?.send(TdApi.SendInlineQueryResultMessage(shareInfo.chatId, 0, true, - true, inlineQueryResults.inlineQueryId, resultArticle.id)) { obj -> + true, inlineQueryResults.inlineQueryId, it.id)) { obj -> handleLiveLocationMessageUpdate(obj, shareInfo) } } @@ -561,6 +592,73 @@ class TelegramHelper private constructor() { } } + private fun requestContacts(){ + client?.send(TdApi.GetContacts()) { obj -> + when (obj.constructor) { + TdApi.Error.CONSTRUCTOR -> { + val error = obj as TdApi.Error + if (error.code != IGNORED_ERROR_CODE) { + listener?.onTelegramError(error.code, error.message) + } + } + TdApi.Users.CONSTRUCTOR -> { + val usersIds = obj as TdApi.Users + usersIds.userIds.forEach { + requestUser(it) + } + } + } + } + } + + private fun requestUser(id: Int) { + client?.send(TdApi.GetUser(id)) { obj -> + when (obj.constructor) { + TdApi.Error.CONSTRUCTOR -> { + val error = obj as TdApi.Error + if (error.code != IGNORED_ERROR_CODE) { + listener?.onTelegramError(error.code, error.message) + } + } + TdApi.User.CONSTRUCTOR -> { + val user = obj as TdApi.User + contacts[user.id] = user + if (!hasLocalUserPhoto(user) && hasRemoteUserPhoto(user)) { + requestUserPhoto(user) + } + } + } + } + } + + fun createPrivateChatWithUser( + userId: Int, + shareInfo: TelegramSettings.ShareChatInfo, + shareChatsInfo: ConcurrentHashMap + ) { + client?.send(TdApi.CreatePrivateChat(userId, false)) { obj -> + when (obj.constructor) { + TdApi.Error.CONSTRUCTOR -> { + val error = obj as TdApi.Error + needRefreshActiveLiveLocationMessages = true + if (error.code == MESSAGE_CANNOT_BE_EDITED_ERROR_CODE) { + shareInfo.shouldDeletePreviousMessage = true + } else if (error.code != IGNORED_ERROR_CODE) { + shareInfo.hasSharingError = true + outgoingMessagesListeners.forEach { + it.onSendLiveLocationError(error.code, error.message) + } + } + } + TdApi.Chat.CONSTRUCTOR -> { + shareInfo.chatId = (obj as TdApi.Chat).id + shareChatsInfo[shareInfo.chatId] = shareInfo + listener?.onTelegramChatCreated(obj) + } + } + } + } + fun loadMessage(chatId: Long, messageId: Long) { requestMessage(chatId, messageId, this@TelegramHelper::addNewMessage) } @@ -580,7 +678,11 @@ class TelegramHelper private constructor() { val viaBot = isOsmAndBot(message.viaBotUserId) val oldContent = message.content if (oldContent is TdApi.MessageText) { - message.content = parseOsmAndBotLocation(oldContent.text.text) + if (oldContent.text.text.startsWith(DEVICE_PREFIX)) { + message.content = parseTextLocation(oldContent.text) + } else if (oldContent.text.text.startsWith(USER_TEXT_LOCATION_TITLE)) { + message.content = parseTextLocation(oldContent.text, false) + } } else if (oldContent is TdApi.MessageLocation && (fromBot || viaBot)) { message.content = parseOsmAndBotLocation(message) } @@ -609,7 +711,7 @@ class TelegramHelper private constructor() { } } } - } else if (sameSender) { + } else if (sameSender && isUserLocationMessage(message) && isUserLocationMessage(newMessage)) { iterator.remove() } } @@ -638,9 +740,9 @@ class TelegramHelper private constructor() { } fun stopSendingLiveLocationToChat(shareInfo: TelegramSettings.ShareChatInfo) { - if (shareInfo.currentMessageId != -1L && shareInfo.chatId != -1L) { + if (shareInfo.currentMapMessageId != -1L && shareInfo.chatId != -1L) { client?.send( - TdApi.EditMessageLiveLocation(shareInfo.chatId, shareInfo.currentMessageId, null, null)) { obj -> + TdApi.EditMessageLiveLocation(shareInfo.chatId, shareInfo.currentMapMessageId, null, null)) { obj -> handleLiveLocationMessageUpdate(obj, shareInfo) } } @@ -683,20 +785,28 @@ class TelegramHelper private constructor() { } } - private fun recreateLiveLocationMessage(shareInfo: TelegramSettings.ShareChatInfo, content: TdApi.InputMessageLocation) { - if (shareInfo.currentMessageId != -1L && shareInfo.chatId != -1L) { - log.info("recreateLiveLocationMessage - $shareInfo.currentMessageId") + private fun recreateLiveLocationMessage( + shareInfo: TelegramSettings.ShareChatInfo, + content: TdApi.InputMessageContent + ) { + if (shareInfo.chatId != -1L) { val array = LongArray(1) - array[0] = shareInfo.currentMessageId - client?.send(TdApi.DeleteMessages(shareInfo.chatId, array, true)) { obj -> - when (obj.constructor) { - TdApi.Ok.CONSTRUCTOR -> sendNewLiveLocationMessage(shareInfo, content) - TdApi.Error.CONSTRUCTOR -> { - val error = obj as TdApi.Error - if (error.code != IGNORED_ERROR_CODE) { - needRefreshActiveLiveLocationMessages = true - outgoingMessagesListeners.forEach { - it.onSendLiveLocationError(error.code, error.message) + if (content is TdApi.InputMessageLocation) { + array[0] = shareInfo.currentMapMessageId + } else if (content is TdApi.InputMessageLocation) { + array[0] = shareInfo.currentTextMessageId + } + if (array[0] != 0L) { + client?.send(TdApi.DeleteMessages(shareInfo.chatId, array, true)) { obj -> + when (obj.constructor) { + TdApi.Ok.CONSTRUCTOR -> sendNewLiveLocationMessage(shareInfo, content) + TdApi.Error.CONSTRUCTOR -> { + val error = obj as TdApi.Error + if (error.code != IGNORED_ERROR_CODE) { + needRefreshActiveLiveLocationMessages = true + outgoingMessagesListeners.forEach { + it.onSendLiveLocationError(error.code, error.message) + } } } } @@ -706,7 +816,7 @@ class TelegramHelper private constructor() { needRefreshActiveLiveLocationMessages = true } - private fun sendNewLiveLocationMessage(shareInfo: TelegramSettings.ShareChatInfo, content: TdApi.InputMessageLocation) { + private fun sendNewLiveLocationMessage(shareInfo: TelegramSettings.ShareChatInfo, content: TdApi.InputMessageContent) { needRefreshActiveLiveLocationMessages = true log.info("sendNewLiveLocationMessage") client?.send( @@ -728,12 +838,12 @@ class TelegramHelper private constructor() { shareInfo.livePeriod.toInt() } val content = TdApi.InputMessageLocation(location, livePeriod) - val msgId = shareInfo.currentMessageId + val msgId = shareInfo.currentMapMessageId if (msgId != -1L) { if (shareInfo.shouldDeletePreviousMessage) { recreateLiveLocationMessage(shareInfo, content) shareInfo.shouldDeletePreviousMessage = false - shareInfo.currentMessageId = -1 + shareInfo.currentMapMessageId = -1 } else { log.info("EditMessageLiveLocation - $msgId") client?.send( @@ -780,6 +890,94 @@ class TelegramHelper private constructor() { } } + fun sendLiveLocationText(chatsShareInfo: Map, location: Location) { + chatsShareInfo.forEach { (chatId, shareInfo) -> + if (shareInfo.getChatLiveMessageExpireTime() <= 0) { + return@forEach + } + val msgId = shareInfo.currentTextMessageId + if (msgId == -1L) { + shareInfo.updateTextMessageId = 1 + } + val content = getTextMessageContent(shareInfo.updateTextMessageId, location) + if (msgId != -1L) { + if (shareInfo.shouldDeletePreviousMessage) { + recreateLiveLocationMessage(shareInfo, content) + shareInfo.shouldDeletePreviousMessage = false + shareInfo.currentTextMessageId = -1 + shareInfo.updateTextMessageId = 1 + } else { + client?.send(TdApi.EditMessageText(chatId, msgId, null, content)) { obj -> + handleLiveLocationMessageUpdate(obj, shareInfo) + } + } + } else { + client?.send(TdApi.SendMessage(chatId, 0, false, false, null, content)) { obj -> + handleLiveLocationMessageUpdate(obj, shareInfo) + } + } + } + } + + private fun formatLocation(sig: Location): String { + return String.format(Locale.US, "%.5f, %.5f", sig.latitude, sig.longitude) + } + + private fun formatTime(ti: Long, now: Boolean): String { + val dt = Date(ti) + val current = System.currentTimeMillis() / 1000 + val tm = ti / 1000 + return when { + current - tm < 10 -> if (now) NOW else FEW_SECONDS_AGO + current - tm < 50 -> (current - tm).toString() + SECONDS_AGO_SUFFIX + current - tm < 60 * 60 * 2 -> ((current - tm) / 60).toString() + MINUTES_AGO_SUFFIX + current - tm < 60 * 60 * 24 -> ((current - tm) / (60 * 60)).toString() + HOURS_AGO_SUFFIX + else -> UTC_DATE_FORMAT.format(dt) + " " + UTC_TIME_FORMAT.format(dt) + UTC_FORMAT_SUFFIX + } + } + + private fun formatFullTime(ti: Long): String { + val dt = Date(ti) + return UTC_DATE_FORMAT.format(dt) + " " + UTC_TIME_FORMAT.format(dt) + " UTC" + } + + private fun getTextMessageContent(updateId: Int, location: Location): TdApi.InputMessageText { + val entities = mutableListOf() + val builder = StringBuilder() + val locationMessage = formatLocation(location) + val locationTime = formatTime(location.time, true) + + builder.append("$USER_TEXT_LOCATION_TITLE\n") + + entities.add(TdApi.TextEntity(builder.lastIndex, LOCATION_PREFIX.length, TdApi.TextEntityTypeBold())) + builder.append(LOCATION_PREFIX) + + entities.add(TdApi.TextEntity(builder.length, locationMessage.length, + TdApi.TextEntityTypeTextUrl("$BASE_SHARING_URL?lat=${location.latitude}&lon=${location.longitude}"))) + builder.append("$locationMessage ($locationTime)\n") + + if (location.hasAltitude() && location.altitude != 0.0) { + entities.add(TdApi.TextEntity(builder.lastIndex, ALTITUDE_PREFIX.length, TdApi.TextEntityTypeBold())) + builder.append(String.format(Locale.US, "$ALTITUDE_PREFIX%.1f m\n", location.altitude)) + } + if (location.hasSpeed() && location.speed > 0) { + entities.add(TdApi.TextEntity(builder.lastIndex, SPEED_PREFIX.length, TdApi.TextEntityTypeBold())) + builder.append(String.format(Locale.US, "$SPEED_PREFIX%.1f m/s\n", location.speed)) + } + if (location.hasAccuracy() && location.accuracy != 0.0f && location.speed == 0.0f) { + entities.add(TdApi.TextEntity(builder.lastIndex, HDOP_PREFIX.length, TdApi.TextEntityTypeBold())) + builder.append(String.format(Locale.US, "$HDOP_PREFIX%d m\n", location.accuracy.toInt())) + } + if (updateId == 0) { + builder.append(String.format("$UPDATED_PREFIX%s\n", formatFullTime(location.time))) + } else { + builder.append(String.format("$UPDATED_PREFIX%s (%d)\n", formatFullTime(location.time), updateId)) + } + val textMessage = builder.toString().trim() + + return TdApi.InputMessageText(TdApi.FormattedText(textMessage, entities.toTypedArray()), false, true) + } + /** * @chatId Id of the chat * @message Text of the message @@ -896,6 +1094,7 @@ class TelegramHelper private constructor() { if (haveAuthorization) { requestChats(true) requestCurrentUser() + requestContacts() } } val newAuthState = getTelegramAuthorizationState() @@ -915,9 +1114,10 @@ class TelegramHelper private constructor() { return false } val content = content + val isUserTextLocation = (content is TdApi.MessageText) && content.text.text.startsWith(USER_TEXT_LOCATION_TITLE) return when (content) { is TdApi.MessageLocation -> true - is TdApi.MessageText -> (isOsmAndBot) && content.text.text.startsWith(DEVICE_PREFIX) + is TdApi.MessageText -> (isOsmAndBot) && content.text.text.startsWith(DEVICE_PREFIX) || (isUserTextLocation && senderUserId != currentUser?.id) else -> false } } @@ -942,13 +1142,16 @@ class TelegramHelper private constructor() { } } - private fun parseOsmAndBotLocation(text: String): MessageOsmAndBotLocation { - val res = MessageOsmAndBotLocation() + private fun parseTextLocation(text: TdApi.FormattedText, botLocation: Boolean = true): MessageLocation { + val res = if (botLocation) MessageOsmAndBotLocation() else MessageUserTextLocation() + var locationNA = false - for (s in text.lines()) { + for (s in text.text.lines()) { when { s.startsWith(DEVICE_PREFIX) -> { - res.name = s.removePrefix(DEVICE_PREFIX) + if (res is MessageOsmAndBotLocation) { + res.name = s.removePrefix(DEVICE_PREFIX) + } } s.startsWith(LOCATION_PREFIX) || s.startsWith(LAST_LOCATION_PREFIX) -> { var locStr: String @@ -965,7 +1168,15 @@ class TelegramHelper private constructor() { parse = false } } - if (parse) { + val urlTextEntity = text.entities.firstOrNull { it.type is TdApi.TextEntityTypeTextUrl } + if (urlTextEntity != null && urlTextEntity.offset == text.text.indexOf(locStr)) { + val url = (urlTextEntity.type as TdApi.TextEntityTypeTextUrl).url + val point: GeoPointParserUtil.GeoParsedPoint? = GeoPointParserUtil.parse(url) + if (point != null) { + res.lat = point.latitude + res.lon = point.longitude + } + } else if (parse) { try { val (latS, lonS) = locStr.split(" ") val updatedS = locStr.substring(locStr.indexOf("("), locStr.length) @@ -1029,10 +1240,8 @@ class TelegramHelper private constructor() { return 0 } - class MessageOsmAndBotLocation : TdApi.MessageContent() { + abstract class MessageLocation : TdApi.MessageContent() { - var name: String = "" - internal set var lat: Double = Double.NaN internal set var lon: Double = Double.NaN @@ -1042,7 +1251,21 @@ class TelegramHelper private constructor() { override fun getConstructor() = -1 - fun isValid() = name != "" && lat != Double.NaN && lon != Double.NaN + abstract fun isValid(): Boolean + } + + class MessageOsmAndBotLocation : MessageLocation() { + + var name: String = "" + internal set + + override fun isValid() = name != "" && lat != Double.NaN && lon != Double.NaN + } + + class MessageUserTextLocation : MessageLocation() { + + override fun isValid() = lat != Double.NaN && lon != Double.NaN + } class OrderedChat internal constructor(internal val order: Long, internal val chatId: Long, internal val isChannel: Boolean) : Comparable { @@ -1085,6 +1308,9 @@ class TelegramHelper private constructor() { val updateUser = obj as TdApi.UpdateUser val user = updateUser.user users[updateUser.user.id] = user + if (user.outgoingLink is TdApi.LinkStateIsContact) { + contacts[user.id] = user + } if (isOsmAndBot(user.id)) { osmandBot = user } @@ -1256,8 +1482,10 @@ class TelegramHelper private constructor() { synchronized(message) { lastTelegramUpdateTime = Math.max(message.date, message.editDate) val newContent = updateMessageContent.newContent + val fromBot = isOsmAndBot(message.senderUserId) + val viaBot = isOsmAndBot(message.viaBotUserId) message.content = if (newContent is TdApi.MessageText) { - parseOsmAndBotLocation(newContent.text.text) + parseTextLocation(newContent.text, (fromBot || viaBot)) } else if (newContent is TdApi.MessageLocation && (isOsmAndBot(message.senderUserId) || isOsmAndBot(message.viaBotUserId))) { parseOsmAndBotLocationContent(message.content as MessageOsmAndBotLocation, newContent) @@ -1377,6 +1605,13 @@ class TelegramHelper private constructor() { fullInfoUpdatesListeners.forEach { it.onSupergroupFullInfoUpdated(id, info) } } } + TdApi.UpdateMessageSendSucceeded.CONSTRUCTOR -> { + val udateMessageSendSucceeded = obj as TdApi.UpdateMessageSendSucceeded + val message = udateMessageSendSucceeded.message + outgoingMessagesListeners.forEach { + it.onUpdateMessages(listOf(message)) + } + } } } } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt index e9b11f081d..a1670f1912 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt @@ -7,6 +7,7 @@ import net.osmand.data.LatLon import net.osmand.telegram.R import net.osmand.telegram.TelegramApplication import net.osmand.telegram.helpers.TelegramHelper.MessageOsmAndBotLocation +import net.osmand.telegram.helpers.TelegramHelper.MessageUserTextLocation import org.drinkless.td.libcore.telegram.TdApi object TelegramUiHelper { @@ -67,6 +68,8 @@ object TelegramUiHelper { val content = message.content if (content is TdApi.MessageLocation) { res.latLon = LatLon(content.location.latitude, content.location.longitude) + } else if (content is MessageUserTextLocation) { + res.latLon = LatLon(content.lat, content.lon) } } if (user != null) { @@ -106,6 +109,7 @@ object TelegramUiHelper { val content = message.content return when (content) { is MessageOsmAndBotLocation -> botMessageToLocationItem(chat, content) + is MessageUserTextLocation -> locationMessageToLocationItem(helper, chat, message) is TdApi.MessageLocation -> locationMessageToLocationItem(helper, chat, message) else -> null } @@ -120,6 +124,7 @@ object TelegramUiHelper { return when (content) { is MessageOsmAndBotLocation -> botMessageToChatItem(helper, chat, content) is TdApi.MessageLocation -> locationMessageToChatItem(helper, chat, message) + is MessageUserTextLocation -> locationMessageToChatItem(helper, chat, message) else -> null } } @@ -148,12 +153,16 @@ object TelegramUiHelper { message: TdApi.Message ): LocationItem? { val user = helper.getUser(message.senderUserId) ?: return null - val content = message.content as TdApi.MessageLocation + val content = message.content return LocationItem().apply { chatId = chat.id chatTitle = chat.title name = TelegramUiHelper.getUserName(user) - latLon = LatLon(content.location.latitude, content.location.longitude) + latLon = when (content) { + is TdApi.MessageLocation -> LatLon(content.location.latitude, content.location.longitude) + is MessageUserTextLocation -> LatLon(content.lat, content.lon) + else -> null + } photoPath = helper.getUserPhotoPath(user) grayscalePhotoPath = helper.getUserGreyPhotoPath(user) placeholderId = R.drawable.img_user_picture @@ -190,12 +199,16 @@ object TelegramUiHelper { message: TdApi.Message ): ChatItem? { val user = helper.getUser(message.senderUserId) ?: return null - val content = message.content as TdApi.MessageLocation + val content = message.content return ChatItem().apply { chatId = chat.id chatTitle = chat.title name = TelegramUiHelper.getUserName(user) - latLon = LatLon(content.location.latitude, content.location.longitude) + latLon = when (content) { + is TdApi.MessageLocation -> LatLon(content.location.latitude, content.location.longitude) + is MessageUserTextLocation -> LatLon(content.lat, content.lon) + else -> null + } if (helper.isGroup(chat)) { photoPath = helper.getUserPhotoPath(user) groupPhotoPath = chat.photo?.small?.local?.path diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt index 382f8a4be8..f962a1f3f8 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt @@ -171,6 +171,10 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage updateList() } + override fun onTelegramChatCreated(chat: TdApi.Chat) { + updateList() + } + override fun onTelegramUserChanged(user: TdApi.User) { updateList() } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/MainActivity.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/MainActivity.kt index d3a84743d8..0ac6356a0b 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/MainActivity.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/MainActivity.kt @@ -254,6 +254,12 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene } } + override fun onTelegramChatCreated(chat: TdApi.Chat) { + runOnUi { + listeners.forEach { it.get()?.onTelegramChatCreated(chat) } + } + } + override fun onTelegramUserChanged(user: TdApi.User) { val photoPath = telegramHelper.getUserPhotoPath(user) if (photoPath != null) { diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt index 91fbb97f1e..bb56ec9643 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt @@ -28,6 +28,7 @@ import net.osmand.telegram.utils.OsmandFormatter import org.drinkless.td.libcore.telegram.TdApi private const val SELECTED_CHATS_KEY = "selected_chats" +private const val SELECTED_CHATS_USERS = "selected_users" private const val SHARE_LOCATION_CHAT = 1 private const val DEFAULT_CHAT = 0 @@ -71,6 +72,7 @@ class MyLocationTabFragment : Fragment(), TelegramListener { private lateinit var appBarOutlineProvider: ViewOutlineProvider private val selectedChats = HashSet() + private val selectedUsers = HashSet() private var actionButtonsListener: ActionButtonsListener? = null @@ -96,10 +98,15 @@ class MyLocationTabFragment : Fragment(), TelegramListener { sharingMode = settings.hasAnyChatToShareLocation() savedInstanceState?.apply { - selectedChats.addAll(getLongArray(SELECTED_CHATS_KEY).toSet()) - if (selectedChats.isNotEmpty()) { - actionButtonsListener?.switchButtonsVisibility(true) + val chatsArray = getLongArray(SELECTED_CHATS_KEY) + val usersArray = getLongArray(SELECTED_CHATS_KEY) + if (chatsArray != null) { + selectedChats.addAll(chatsArray.toSet()) } + if (usersArray != null) { + selectedUsers.addAll(usersArray.toSet()) + } + actionButtonsListener?.switchButtonsVisibility((selectedUsers.isNotEmpty() || selectedChats.isNotEmpty())) } val mainView = inflater.inflate(R.layout.fragment_my_location_tab, container, false) @@ -191,7 +198,7 @@ class MyLocationTabFragment : Fragment(), TelegramListener { mainView.findViewById(R.id.stop_all_sharing_row).setOnClickListener { fragmentManager?.also { fm -> - DisableSharingBottomSheet.showInstance(fm, this, adapter.chats.size) + DisableSharingBottomSheet.showInstance(fm, this, adapter.items.size) } } @@ -236,6 +243,7 @@ class MyLocationTabFragment : Fragment(), TelegramListener { override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putLongArray(SELECTED_CHATS_KEY, selectedChats.toLongArray()) + outState.putLongArray(SELECTED_CHATS_USERS, selectedUsers.toLongArray()) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -274,7 +282,7 @@ class MyLocationTabFragment : Fragment(), TelegramListener { TelegramHelper.TelegramAuthorizationState.LOGGING_OUT, TelegramHelper.TelegramAuthorizationState.CLOSED, TelegramHelper.TelegramAuthorizationState.UNKNOWN -> { - adapter.chats = mutableListOf() + adapter.items = mutableListOf() } else -> Unit } @@ -292,6 +300,11 @@ class MyLocationTabFragment : Fragment(), TelegramListener { updateContent() } + override fun onTelegramChatCreated(chat: TdApi.Chat) { + sharingMode = settings.hasAnyChatToShareLocation() + updateContent() + } + override fun onTelegramUserChanged(user: TdApi.User) { if (user.id == telegramHelper.getCurrentUser()?.id) { updateCurrentUserPhoto() @@ -303,9 +316,9 @@ class MyLocationTabFragment : Fragment(), TelegramListener { } fun onPrimaryBtnClick() { - if (selectedChats.isNotEmpty()) { + if (selectedChats.isNotEmpty() || selectedUsers.isNotEmpty()) { val fm = fragmentManager ?: return - SetTimeDialogFragment.showInstance(fm, selectedChats, this) + SetTimeDialogFragment.showInstance(fm, selectedChats, selectedUsers, this) } } @@ -351,6 +364,7 @@ class MyLocationTabFragment : Fragment(), TelegramListener { private fun clearSelection() { selectedChats.clear() + selectedUsers.clear() adapter.notifyDataSetChanged() actionButtonsListener?.switchButtonsVisibility(false) } @@ -453,8 +467,10 @@ class MyLocationTabFragment : Fragment(), TelegramListener { } private fun updateList() { + val items: MutableList = mutableListOf() val chats: MutableList = mutableListOf() val currentUser = telegramHelper.getCurrentUser() + val contacts = telegramHelper.getContacts() val chatList = if (sharingMode) { settings.getShareLocationChats() } else { @@ -473,27 +489,55 @@ class MyLocationTabFragment : Fragment(), TelegramListener { chats.add(chat) } } + items.addAll(chats) + if (!sharingMode) { + for (user in contacts.values) { + val containsInChats = chats.any { telegramHelper.getUserIdFromChatType(it.type) == user.id } + if ((!sharingMode && settings.isSharingLocationToUser(user.id)) || user.id == currentUser?.id || containsInChats) { + continue + } + items.add(user) + } + } if (sharingMode && settings.hasAnyChatToShareLocation()) { - adapter.chats = sortAdapterItems(chats) + adapter.items = sortAdapterItems(items) } else { - adapter.chats = chats + adapter.items = items } } - private fun sortAdapterItems(list: MutableList): MutableList { - list.sortWith(Comparator { o1, o2 -> o1.title.compareTo(o2.title) }) + private fun sortAdapterItems(list: MutableList): MutableList { + list.sortWith(Comparator { o1, o2 -> + val title1 = when (o1) { + is TdApi.Chat -> o1.title + is TdApi.User -> TelegramUiHelper.getUserName(o1) + else -> "" + } + val title2 = when (o2) { + is TdApi.Chat -> o2.title + is TdApi.User -> TelegramUiHelper.getUserName(o2) + else -> "" + } + title1.compareTo(title2) + }) return list } inner class MyLocationListAdapter : RecyclerView.Adapter() { - var chats = mutableListOf() + var items = mutableListOf() set(value) { field = value notifyDataSetChanged() } override fun getItemViewType(position: Int): Int { - return if (settings.isSharingLocationToChat(chats[position].id) && sharingMode) { + val item = items[position] + val id = when (item) { + is TdApi.Chat -> item.id + is TdApi.User -> item.id.toLong() + else -> -1 + } + return if (settings.isSharingLocationToChat(id) && sharingMode) { SHARE_LOCATION_CHAT } else { DEFAULT_CHAT @@ -518,14 +562,34 @@ class MyLocationTabFragment : Fragment(), TelegramListener { @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { - val chat = chats[position] - val lastItem = position == itemCount - 1 - val placeholderId = if (telegramHelper.isGroup(chat)) R.drawable.img_group_picture else R.drawable.img_user_picture - val live = settings.isSharingLocationToChat(chat.id) - val shareInfo = settings.getChatsShareInfo()[chat.id] + val item = items[position] + val isChat = item is TdApi.Chat + val itemId = if (isChat) { + (item as TdApi.Chat).id + } else { + (item as TdApi.User).id.toLong() + } - TelegramUiHelper.setupPhoto(app, holder.icon, chat.photo?.small?.local?.path, placeholderId, false) - holder.title?.text = chat.title + val lastItem = position == itemCount - 1 + val placeholderId = if (isChat && telegramHelper.isGroup(item as TdApi.Chat)) R.drawable.img_group_picture else R.drawable.img_user_picture + val live = (isChat && settings.isSharingLocationToChat(itemId)) + val shareInfo = if (isChat) settings.getChatsShareInfo()[itemId] else null + + val photoPath = when (item) { + is TdApi.Chat -> item.photo?.small?.local?.path + is TdApi.User -> item.profilePhoto?.small?.local?.path + else -> null + } + + TelegramUiHelper.setupPhoto(app, holder.icon, photoPath, placeholderId, false) + + val title = when (item) { + is TdApi.Chat -> item.title + is TdApi.User -> TelegramUiHelper.getUserName(item) + else -> null + } + + holder.title?.text = title if (holder is ChatViewHolder) { holder.description?.visibility = View.GONE @@ -535,21 +599,33 @@ class MyLocationTabFragment : Fragment(), TelegramListener { holder.checkBox?.apply { visibility = View.VISIBLE setOnCheckedChangeListener(null) - isChecked = selectedChats.contains(chat.id) + isChecked = if (isChat) { + selectedChats.contains(itemId) + } else { + selectedUsers.contains(itemId) + } setOnCheckedChangeListener { _, isChecked -> if (isChecked) { - selectedChats.add(chat.id) + if (isChat) { + selectedChats.add(itemId) + } else { + selectedUsers.add(itemId) + } } else { - selectedChats.remove(chat.id) + if (isChat) { + selectedChats.remove(itemId) + } else { + selectedUsers.remove(itemId) + } } - actionButtonsListener?.switchButtonsVisibility(selectedChats.isNotEmpty()) + actionButtonsListener?.switchButtonsVisibility(selectedChats.isNotEmpty() || selectedUsers.isNotEmpty()) } } } holder.bottomShadow?.visibility = if (lastItem) View.VISIBLE else View.GONE holder.itemView.setOnClickListener { if (live) { - settings.shareLocationToChat(chat.id, false) + settings.shareLocationToChat(itemId, false) shareLocationHelper.stopSharingLocation() notifyItemChanged(position) } else { @@ -563,11 +639,11 @@ class MyLocationTabFragment : Fragment(), TelegramListener { isChecked = live setOnCheckedChangeListener { _, isChecked -> if (!isChecked) { - settings.shareLocationToChat(chat.id, false) + settings.shareLocationToChat(itemId, false) if (shareInfo != null) { telegramHelper.stopSendingLiveLocationToChat(shareInfo) } - removeItem(chat) + removeItem(item) } } } @@ -591,7 +667,11 @@ class MyLocationTabFragment : Fragment(), TelegramListener { val expireTime = shareInfo?.getChatLiveMessageExpireTime() ?: 0 val newLivePeriod = expireTime + (shareInfo?.additionalActiveTime ?: ADDITIONAL_ACTIVE_TIME_VALUES_SEC[0]) val nextAdditionalActiveTime = shareInfo?.getNextAdditionalActiveTime() ?: ADDITIONAL_ACTIVE_TIME_VALUES_SEC[1] - settings.shareLocationToChat(chat.id, true, newLivePeriod, nextAdditionalActiveTime) + if (isChat) { + settings.shareLocationToChat(itemId, true, newLivePeriod, nextAdditionalActiveTime) + } else { + settings.shareLocationToUser(itemId.toInt(), newLivePeriod, nextAdditionalActiveTime) + } notifyItemChanged(position) } } @@ -616,9 +696,9 @@ class MyLocationTabFragment : Fragment(), TelegramListener { private fun getStopSharingVisibility(expiresIn: Long) = if (expiresIn > 0) View.VISIBLE else View.INVISIBLE - private fun removeItem(chat: TdApi.Chat) { - chats.remove(chat) - if (chats.isEmpty()) { + private fun removeItem(chat: TdApi.Object) { + items.remove(chat) + if (items.isEmpty()) { sharingMode = false updateContent() shareLocationHelper.stopSharingLocation() @@ -627,7 +707,7 @@ class MyLocationTabFragment : Fragment(), TelegramListener { } } - override fun getItemCount() = chats.size + override fun getItemCount() = items.size abstract inner class BaseViewHolder(view: View) : RecyclerView.ViewHolder(view) { val icon: ImageView? = view.findViewById(R.id.icon) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt index c7d49771fe..48616165db 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt @@ -14,8 +14,8 @@ import android.widget.TextView import net.osmand.Location import net.osmand.data.LatLon import net.osmand.telegram.R -import net.osmand.telegram.TelegramLocationProvider.TelegramLocationListener import net.osmand.telegram.TelegramLocationProvider.TelegramCompassListener +import net.osmand.telegram.TelegramLocationProvider.TelegramLocationListener import net.osmand.telegram.helpers.ShareLocationHelper import net.osmand.telegram.helpers.TelegramUiHelper import net.osmand.telegram.ui.SetTimeDialogFragment.SetTimeListAdapter.ChatViewHolder @@ -36,6 +36,7 @@ class SetTimeDialogFragment : BaseDialogFragment(), TelegramLocationListener, Te private lateinit var timeForAllValue: TextView private val chatLivePeriods = HashMap() + private val userLivePeriods = HashMap() private var location: Location? = null private var heading: Float? = null @@ -90,6 +91,9 @@ class SetTimeDialogFragment : BaseDialogFragment(), TelegramLocationListener, Te chatLivePeriods.forEach { (chatId, livePeriod) -> settings.shareLocationToChat(chatId, true, livePeriod) } + userLivePeriods.forEach { (userId, livePeriod) -> + settings.shareLocationToUser(userId.toInt(), livePeriod) + } app.shareLocationHelper.startSharingLocation() targetFragment?.also { it.onActivityResult(targetRequestCode, LOCATION_SHARED_REQUEST_CODE, null) @@ -121,7 +125,13 @@ class SetTimeDialogFragment : BaseDialogFragment(), TelegramLocationListener, Te chats.add(id) chats.add(livePeriod) } + val users = mutableListOf() + for ((id, livePeriod) in userLivePeriods) { + users.add(id) + users.add(livePeriod) + } outState.putLongArray(CHATS_KEY, chats.toLongArray()) + outState.putLongArray(USERS_KEY, users.toLongArray()) } override fun updateLocation(location: Location?) { @@ -167,17 +177,27 @@ class SetTimeDialogFragment : BaseDialogFragment(), TelegramLocationListener, Te private fun readFromBundle(bundle: Bundle?) { chatLivePeriods.clear() + userLivePeriods.clear() bundle?.getLongArray(CHATS_KEY)?.also { for (i in 0 until it.size step 2) { val livePeriod = settings.getChatLivePeriod(it[i]) chatLivePeriods[it[i]] = livePeriod ?: it[i + 1] } } + bundle?.getLongArray(USERS_KEY)?.also { + for (j in 0 until it.size step 2) { + val livePeriod = settings.getChatLivePeriod(it[j]) + userLivePeriods[it[j]] = livePeriod ?: it[j + 1] + } + } } private fun getTimeForAll(useDefValue: Boolean = false): Long { val returnVal = if (useDefValue) DEFAULT_VISIBLE_TIME_SECONDS else NO_VALUE - val iterator = chatLivePeriods.values.iterator() + val allTime = mutableListOf() + allTime.addAll(chatLivePeriods.values) + allTime.addAll(userLivePeriods.values) + val iterator = allTime.iterator() if (!iterator.hasNext()) { return returnVal } @@ -202,7 +222,7 @@ class SetTimeDialogFragment : BaseDialogFragment(), TelegramLocationListener, Te } } - private fun selectDuration(id: Long? = null) { + private fun selectDuration(id: Long? = null, isChat: Boolean = true) { val timeForAll = getTimeForAll(true) val defSeconds = if (id == null) timeForAll else chatLivePeriods[id] ?: timeForAll val (defHours, defMinutes) = secondsToHoursAndMinutes(defSeconds) @@ -213,11 +233,18 @@ class SetTimeDialogFragment : BaseDialogFragment(), TelegramLocationListener, Te TimeUnit.MINUTES.toSeconds(minutes.toLong()) if (seconds >= ShareLocationHelper.MIN_LOCATION_MESSAGE_LIVE_PERIOD_SEC) { if (id != null) { - chatLivePeriods[id] = seconds + if (isChat) { + chatLivePeriods[id] = seconds + } else { + userLivePeriods[id] = seconds + } } else { chatLivePeriods.keys.forEach { chatLivePeriods[it] = seconds } + userLivePeriods.keys.forEach { + userLivePeriods[it] = seconds + } } updateTimeForAllRow() adapter.notifyDataSetChanged() @@ -242,17 +269,19 @@ class SetTimeDialogFragment : BaseDialogFragment(), TelegramLocationListener, Te } private fun updateList() { - val chats: MutableList = mutableListOf() + val items: MutableList = mutableListOf() telegramHelper.getChatList().filter { chatLivePeriods.keys.contains(it.chatId) } .forEach { orderedChat -> - telegramHelper.getChat(orderedChat.chatId)?.also { chats.add(it) } + telegramHelper.getChat(orderedChat.chatId)?.also { items.add(it) } } - adapter.chats = chats + telegramHelper.getContacts().values.filter { userLivePeriods.keys.contains(it.id.toLong()) } + .forEach { user -> items.add(user) } + adapter.items = items } inner class SetTimeListAdapter : RecyclerView.Adapter() { - var chats: List = emptyList() + var items: List = emptyList() set(value) { field = value notifyDataSetChanged() @@ -265,18 +294,38 @@ class SetTimeDialogFragment : BaseDialogFragment(), TelegramLocationListener, Te } override fun onBindViewHolder(holder: ChatViewHolder, position: Int) { - val chat = chats[position] - val placeholderId = if (telegramHelper.isGroup(chat)) R.drawable.img_group_picture else R.drawable.img_user_picture + val item = items[position] + val isChat = item is TdApi.Chat + val itemId = if (isChat) { + (item as TdApi.Chat).id + } else { + (item as TdApi.User).id.toLong() + } - TelegramUiHelper.setupPhoto(app, holder.icon, chat.photo?.small?.local?.path, placeholderId, false) - holder.title?.text = chat.title + val placeholderId = if (isChat && telegramHelper.isGroup((item as TdApi.Chat))) R.drawable.img_group_picture else R.drawable.img_user_picture - if (telegramHelper.isGroup(chat)) { + val photoPath = when (item) { + is TdApi.Chat -> item.photo?.small?.local?.path + is TdApi.User -> item.profilePhoto?.small?.local?.path + else -> null + } + + TelegramUiHelper.setupPhoto(app, holder.icon, photoPath, placeholderId, false) + + val title = when (item) { + is TdApi.Chat -> item.title + is TdApi.User -> TelegramUiHelper.getUserName(item) + else -> null + } + + holder.title?.text = title + + if (isChat && telegramHelper.isGroup((item as TdApi.Chat))) { holder.locationViewContainer?.visibility = View.GONE holder.description?.visibility = View.VISIBLE holder.description?.text = getString(R.string.shared_string_group) } else { - val message = telegramHelper.getChatMessages(chat.id).firstOrNull() + val message = telegramHelper.getChatMessages(itemId).firstOrNull() val content = message?.content if (message != null && content is TdApi.MessageLocation && (location != null && content.location != null)) { val lastUpdated = telegramHelper.getLastUpdatedTime(message) @@ -301,15 +350,19 @@ class SetTimeDialogFragment : BaseDialogFragment(), TelegramLocationListener, Te holder.textInArea?.apply { visibility = View.VISIBLE - chatLivePeriods[chat.id]?.also { text = formatLivePeriod(it) } + if (isChat) { + chatLivePeriods[itemId]?.also { text = formatLivePeriod(it) } + } else { + userLivePeriods[itemId]?.also { text = formatLivePeriod(it) } + } } holder.bottomShadow?.visibility = View.GONE holder.itemView.setOnClickListener { - selectDuration(chat.id) + selectDuration(itemId, isChat) } } - override fun getItemCount() = chats.size + override fun getItemCount() = items.size inner class ChatViewHolder(val view: View) : RecyclerView.ViewHolder(view) { val icon: ImageView? = view.findViewById(R.id.icon) @@ -329,18 +382,31 @@ class SetTimeDialogFragment : BaseDialogFragment(), TelegramLocationListener, Te private const val TAG = "SetTimeDialogFragment" private const val CHATS_KEY = "chats_key" + private const val USERS_KEY = "users_key" private const val DEFAULT_VISIBLE_TIME_SECONDS = 60 * 60L // 1 hour private const val NO_VALUE = -1L - fun showInstance(fm: FragmentManager, chatIds: Set, target: Fragment): Boolean { + fun showInstance(fm: FragmentManager, chatIds: Set, usersIds: Set, target: Fragment): Boolean { return try { val chats = mutableListOf() for (id in chatIds) { chats.add(id) chats.add(DEFAULT_VISIBLE_TIME_SECONDS) } + val users = mutableListOf() + for (id in usersIds) { + users.add(id) + users.add(DEFAULT_VISIBLE_TIME_SECONDS) + } SetTimeDialogFragment().apply { - arguments = Bundle().apply { putLongArray(CHATS_KEY, chats.toLongArray()) } + arguments = Bundle().apply { + if (chats.isNotEmpty()) { + putLongArray(CHATS_KEY, chats.toLongArray()) + } + if (users.isNotEmpty()) { + putLongArray(USERS_KEY, users.toLongArray()) + } + } setTargetFragment(target, LOCATION_SHARED_REQUEST_CODE) show(fm, TAG) } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/SettingsDialogFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/SettingsDialogFragment.kt index 2c169ce44d..44db164777 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/SettingsDialogFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/SettingsDialogFragment.kt @@ -228,7 +228,11 @@ class SettingsDialogFragment : BaseDialogFragment() { isModal = true anchorView = valueView setContentWidth(AndroidUtils.getPopupMenuWidth(ctx, menuList)) - height = AndroidUtils.getPopupMenuHeight(ctx) + height = if (menuList.size < 6) { + ListPopupWindow.WRAP_CONTENT + } else { + AndroidUtils.getPopupMenuHeight(ctx) + } setDropDownGravity(Gravity.END or Gravity.TOP) setAdapter(ArrayAdapter(ctx, R.layout.popup_list_text_item, menuList)) setOnItemClickListener { _, _, position, _ -> diff --git a/OsmAnd-telegram/src/net/osmand/telegram/utils/OsmandApiUtils.kt b/OsmAnd-telegram/src/net/osmand/telegram/utils/OsmandApiUtils.kt index d836158570..fe58650860 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/utils/OsmandApiUtils.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/utils/OsmandApiUtils.kt @@ -10,6 +10,8 @@ import org.json.JSONObject const val BASE_URL = "https://live.osmand.net" +const val BASE_SHARING_URL = "http://osmand.net/go" + object OsmandApiUtils { private val log = PlatformUtil.getLog(OsmandApiUtils::class.java) diff --git a/OsmAnd/build.gradle b/OsmAnd/build.gradle index b0a4d3a82e..9251af903e 100644 --- a/OsmAnd/build.gradle +++ b/OsmAnd/build.gradle @@ -52,10 +52,10 @@ android { minSdkVersion System.getenv("MIN_SDK_VERSION") ? System.getenv("MIN_SDK_VERSION").toInteger() : (analytics ? 15 : 14) targetSdkVersion 26 - versionCode 320 + versionCode 330 versionCode System.getenv("APK_NUMBER_VERSION") ? System.getenv("APK_NUMBER_VERSION").toInteger() : versionCode multiDexEnabled true - versionName "3.2.0" + versionName "3.3.0" versionName System.getenv("APK_VERSION")? System.getenv("APK_VERSION").toString(): versionName versionName System.getenv("APK_VERSION_SUFFIX")? versionName + System.getenv("APK_VERSION_SUFFIX").toString(): versionName } diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index dbbaba293d..35cba65052 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -63,7 +63,7 @@ الخطوط المحيطية (الكنتورية) الخرائط العادية الحدود - حدّ السرعة + حد السرعة @@ -91,7 +91,7 @@ متاجر المواد الغذائية للسياح وقود - إظهار تنبيهات… + إظهار التنبيهات… استخدم البوصلة تجنب الطرق السريعة @@ -208,7 +208,7 @@ أوروبا، آسيا، أمريكا اللاتينية، وغيرها المملكة المتحدة، الهند وما شابه ذلك - أعلن… + أعلان… يرجى تحديد مستخدم OSM وكلمة سره في الإعدادات محو الوجهات الوسيطة الحفاظ على الوجهات الوسيطة @@ -326,17 +326,17 @@ ضبط إعدادات نطق أسماء الشوارع، وتحذيرات المرور (توقيفات الإجبارية، ومطبات السرعة)، و تحذيرات كاميرات السرعة، و السرعة القصوى. - نطق أسماء الشوارع ( نطق آلي TTS ) - السرعة القصوى + أسماء الشوارع (TTS) + حد السرعة كاميرات السرعة تحذيرات حركة المرور الخريطة: الوجهة %1$s البحث عن الشارع في المدن المجاورة - فرز باب لـ باب + فرز باب لـ باب الرجاء الانتظار حتى انتهاء المهمة الحالية توفر %1$d ملفات للتنزيل - ألغ المسار + صرف المسار تسجيل الرحلة قم بضبط كيفية تسجيل الرحلات. @@ -397,9 +397,9 @@ أضف كآخر وجهة وسيطة أضف كأول وجهة وسيطة الوجهة %1$s بعيدة جدا من أقرب طريق. - إنك قد وصلت إلى وجهتك الوسيطة + لقد وصلت إلى وجهتك الوسيطة أضف كوجهة وسيطة - وجهة متوسطة + وجهة وسيطة نقطة الوصول بعيدة جدا عن أقرب طريق. أضف وسما ضبط تحذيرات المرور ( حدود السرعة، والتوقف القسري، والمطبات الصناعية ) ، وتحذيرات كاميرا السرعة ، ومعلومات الممرات. @@ -409,7 +409,7 @@ حُفِظ المصدر التّجانبي %1$s بنجاح استخدم البوصلة عندما لا تكون هناك أي وجهة محددة. ملائمة تقريب الخريطة وفقا لسرعتك (هذا بينما تتزامن الخريطة مع الموقع الحالي). - تقريب الخريطة تلقائيًا + تكبير الخريطة تلقائيًا ألصق الموقع إلى الشوارع أثناء الملاحة. الالتصاق بالطريق خرائط OsmAnd وملاحة @@ -625,16 +625,16 @@ تفعيل الإخطار التلقائي لم يتم ربط الملاحظة بأي موقع. إضغط على \"استخدام المكان …\" لترفق ملاحظة بالمكان المحدد. - الرجاء، احتسب المسار أولا + الرجاء حساب الطريق أولا حاكي باستخدام المسار المحتسب حاكي باستخدام مسار GPX تذكر اختياري إجمالي الذاكرة الأصلية المخصصة من قبل التطبيق %1$s ميغابايت (Dalvik %2$s ميغابايت، الأخرى %3$s ميغابايت). الذاكرة النسبية %4$s ميغابايت (حد الجهاز %5$s ميغابايت Dalvik %6$s ميغابايت). - مشي + التنزه دراجة نارية قارب - الطائرات + طائرة اختر أوضاع الاستخدام لتكون مرئية في التطبيق. ملامح التطبيق @@ -976,7 +976,7 @@ ساعة دقيقة ثانية - اظهر الموضع في المنتصف دائماً + اظهر الموقع في الوسط دائما التوطين الكرواتية البرتغالية (البرازيل) @@ -1005,11 +1005,11 @@ معلومات الطريق تجنب الطرق ذات الرسوم - إجتناب الطرق التي يجب دفع رسوم للمرور فيها. - تجنب الطرق غير المعبّدة + تجنب الطرق ذات الرسوم + تجنب الطرق غير المعبدة اجتناب الطرق الترابية والوعرة. تجنب العبّارات - حد الوزن المسموح + الوزن الأقصى منذ نسخة أندرويد كتكات 4.4، لا يمكنك تنزيل أو تحديث الخرائط في مكان التخزين السابق (%s). هل تريد تغيير المكان إلى مكان مسموح ونسخ كل الملفات إليه ؟ ملاحظة 1 : الملفات القديمة ستبقى كما هي دون لمس (ولكن يمكن حذفها يدويا). @@ -1142,7 +1142,7 @@ الاتجاهات إستخدام الموقع … مفضلة - نقاط مفضلة مجاورة + النقاط المفضلة مجاورة إحفظ كمجموعة مفضلة أدخل اسم المفضلة "تم إضافة النقطة المفضلة \'\'{0}\'\' بنجاح." @@ -1221,12 +1221,12 @@ خطوط الترام طرق المواصلات - سمات أخرى للخريطة + ميزات آخرى للخريطة العناصر المتبقية شريط المعلومات اللوحة اليمنى اللوحة اليسرى - ضمن + في غضون مستخدم مجهول سجل الدخول بـ %1$s @@ -1285,7 +1285,7 @@ الطرق السريعة غير المخصصة للمركبات النص المباني في التقريب 15 - مزيد من التفاصيل + التفاصيل اكثر تفاصيل أقل إظهار جودة الطريق @@ -1327,21 +1327,21 @@ طرق الحافلات سكك مترو الأنفاق شارك طرق التاكسي - حدد حد السرعة المسموح به لتلقي تنبيه صوتي ما إذا تجاوزته. + حدد مجال السرعة المسموح به لتتلقى تنبيه صوتي ما إذا تجاوزته. مراقبة الحدود كشك الرسوم تخفيف الازدحام - كاميرا مراقبة السرعة - تنبيه مروري - POI مجاورة + كاميرا السرعة + تحذير حركة المرور + POI المجاورة تنبيهات مرورية تسجيل المسار حسب الطلب حمّل الخرائط المفقودة %1$s (%2$d MB)؟ قيود الدخول عرض قيود الدخول - عرض سطح الطريق - عرض الطرق الدائرية + إظهار سطح الطريق + عرض الطرق الخاصة بالدرجات ابدأ التوجيه دروان بدوران تلقائيا @@ -1410,14 +1410,14 @@ احسب قسم طريق OsmAnd بدون إنترنت احسب طريق OsmAnd لأول وآخر قسمين في الطريق هل ترغب باستخدام المسار المعروض للملاحة؟ - أضافة كنقطة وجهة لاحقة + اضافة كنقطة وجهة لاحقة اختر GPX… حدد الوجهة - تفضيل طرق الدراجات النارية - تفضيل طرق الدراجات النارية. - تجنب العبّارات المائية. + تفضل الطرق السريعة + تفضيل الطرق السريعة + تجنب العبّارات المائية تجنب الطرق السريعة - تجنب طرق الدراجات النارية. + تجنب الطرق السريعة حدد وزن المركبة الأقصى المسموح به على الطرقات. نسخ ملفات بيانات OsmAnd إلى المسار الجديد (%s)… احسب طريق OsmAnd بدون اتصال @@ -1640,7 +1640,7 @@ الإسبانية (الأرجنتين) ميل بحري داكن - تحديد الإرتفاع + الإرتفاع الاقصى تحديد وحدة السرعة. وحدة السرعة ملحقات @@ -1819,7 +1819,7 @@ العلامات المفعلة علامات خرائطية - منع تخطي الحدود + تجنب عبور الحدود حدد الطرق التي تريد تجنبها أثناء التنقل. فئات قرب @@ -2075,7 +2075,7 @@ خرائط واسعة النطاق طبقة التضاريس غير مفعلة الخطوط الكفافية معطلة - nmi + ميل بحري ميل بحري/ساعة محاكاة موقعك باستخدام طريق مقاس أو مسار GPX مسجل. تجنب قطار المدينة @@ -2128,11 +2128,11 @@ الهنغارية (الرسمية) تجنب الأدراج - تجنب الأدراج. + تجنب الأدراج تجنب عبور الحدود إلى بلد آخر. تحديد ارتفاع السيارة المسموح على الطرق. تعطيل 2-مرحلة التوجيه للملاحة بالسيارة. - مقياس جبال الألب للتنزه (نادي جبال الألب السويسرية) + مقياس جبال الألب للتنزه (SAC) تقديم مسارات وفقا لمقياس SAC. غطاء رمز التنزه تقديم مسارات وفقا لآثار OSMC. @@ -2810,7 +2810,7 @@ ج ش الإسم الإختياري للنقطة - المسارات القريبة مِن + المسارات القريبة في غضون أدخل إسم الملف. خطأ أثناء استرجاع الخريطة تمت عملية استيراد الخريطة @@ -2911,4 +2911,33 @@ البحث عن شارع اختر المدينة أولا استعادة + تطبيق من طرف-ثالث + العلامات المضافة كمجموعة مفضلة أو نقاط طريق GPX ستظل على الخريطة. اذا كانت المجموعة غير نشطة، العلامات سوف تختفي من الخريطة. + إبقاء العلامات المتجاوزة على الخريطة + هناك المزيد من النقل في هذا الموقف. + يرجى إعطاء إذن الموقع للتطبيق لكي يواصل. + شكرا على ردود الفعل + النقطة أو الطريق غير موجود. + لا نتائج بحث؟ +\nاخبرنا بانطباعك + توسيع دائرة البحث بقطر %1$s + ارسال استفسار البحث؟ + العالم + تم حذف %1$s نقطة + تحرير نقطة + إضافة نقطة + حفظ كمسار + لقد أضفت %1$s نقطة. اكتب اسم الملف و اضغط على \"حفظ\". + يرجى إرسال لقطة شاشة من هذا الإخطار الى support@osmand.net + تعديل الإجراءات + احصل على OsmAnd Live لفتح جميع الميزات: تحديثات يومية للخريطة مع تنزيلات غير محدودة، جميع الإضافات المدفوعة والمجانية، Wikipedia ،wikivoyage وأكثر من ذلك بكثير. + الاشتراكات + %1$.2f %2$s + احصل على اشتراك OsmAnd Live لقراءة مقالات Wikipedia و wikivoyage. + جدد الاشتراك لتستمر في استخدام كافة الميزات: + + استنادا إلى المقالات التي قمتم بحفظها، الخرائط التالية موصى بتحميلها: + تطبيق مدفوع + أداة مدفوعة + دليل السفر العالمي المجانا الذي بامكان أي شخص التعديل عليه. diff --git a/OsmAnd/res/values-be-rBY/strings.xml b/OsmAnd/res/values-be-rBY/strings.xml index e7a1b9d019..8c292bd243 100644 --- a/OsmAnd/res/values-be-rBY/strings.xml +++ b/OsmAnd/res/values-be-rBY/strings.xml @@ -3168,4 +3168,5 @@ Praparcyjnaj pamiacі %4$s MB (Abmiežavańnie Android %5$s MB, Dalvik %6$s MB). Častka dachodu idzie ŭdzieĺnikam OpenStreetMap. Pracuje na OsmAnd Pakazać tolki 360° malunki + Padpiski diff --git a/OsmAnd/res/values-be/phrases.xml b/OsmAnd/res/values-be/phrases.xml index 37af08e64f..78cd90cf0e 100644 --- a/OsmAnd/res/values-be/phrases.xml +++ b/OsmAnd/res/values-be/phrases.xml @@ -1,13 +1,13 @@ Пякарня Вінна-гарэлкавая крама - Крама + Прадуктовая крама Палеанталагічны сайт Гандлёвы цэнтр Напоі - Ятка - Дэлікатэсы + Мясная крама + Далікатэсы Фермерскія прадукты Гародніна і садавіна Морапрадукты @@ -27,7 +27,7 @@ Месца ядзернага выбуху Гістарычная шахта Крама дываноў - Кветі + Кветкі Мэбля Сад і агарод Газ у балонах @@ -35,19 +35,19 @@ Падарункі, сувеніры Тавары для дзяцей Сантэхніка, ванныя - Крама пасьцельнай бялізны + Крама пасцельнай бялізны Буцік Аптэка - Крама адзеньня - Дзіцячае адзеньне + Крама адзення + Дзіцячае адзенне Крама абутку Кампутары - Капіявальныя паслугі + Капіравальныя паслугі Салон штор Тканіны Пасьцельная бялізна - Абсталяваньне для дайвінгу - Інструмэнты і будматэрыялы + Абсталяванне для дайвінгу + Інструменты і будматэрыялы Сэкс-шоп Рыбалоўная крама Рамкі, багет @@ -58,22 +58,22 @@ Hi-Fi апаратура Гаспадарчыя тавары Паляўнічая крама - Дэкор і афармленьне + Дэкор і афармленне Ювелірная крама Кіёск Кухонная мэбля Мабільныя тэлефоны Матацыклы - Музычныя інструмэнты - Газэты і часопісы + Музычныя інструменты + Газеты і часопісы Акуліст Арганічныя прадукты харчаваньня Тавары для актыўнага адпачынку Фарбы Тавары для жывёл - Радыёдэталі + Радыядэталі Сэканд-хэнд - Яхты, запчасткі, абсталяваньне + Яхты, запчасткі, абсталяванне Спорттавары Канцылярскія тавары Посуд @@ -90,7 +90,7 @@ Аўтасалон Аўтазапчасткі Квадрацыклы - Касметыка, парфумерыя + Касметыка Рынак Галантарэя @@ -99,18 +99,18 @@ Экстраны тэлефон Пажарны гідрант Вогнетушыцель - Ручны сродак пажаратушэньня + Ручны сродак пажаратушэння Пажарны шланг Пажарны вадаём - Скрыня зь пяском + Скрыня з пяском Станцыя хуткай дапамогі Санэпідэмстанцыя - Таблічка з кодам для службы выратаваньня + Таблічка з кодам для службы выратавання Брод Перавал Вароты - Гарадзкая сьцяна + Гарадская сцяна Шлагбаўм Пункт аплаты праезду Памежны кантроль @@ -120,7 +120,7 @@ Шыкана Ляжачы паліцыянт (пральная дошка) Ляжачы паліцыянт (стол) - Звужэньне + Звужэнне Святлафор Аўтасэрвіс @@ -128,7 +128,7 @@ Пункт тэхагляду Аўтамыйка Запраўка;АЗС;Аўтазаправачная станцыя - Зарадная станцыя + Станцыя сілкавання Рамонтная эстакада/яма Кампрэсар для падпампоўкі шын Паркоўка @@ -136,26 +136,26 @@ Заезд на паркоўку Гаражы - Прыпынак грамадзкага транспарту - Прыпынак аўтобусу - Прыпынак тралейбусу + Прыпынак грамадскага транспарту + Аўтобусны прыпынак + Тралейбусны прыпынак Аўтобусны прыпынак - Прыпынак трамваю - Чайная крама + Трамвайны прыпынак + Крама гарбаты Трамвайны прыпынак - Станцыя грамадзкага транспарту + Станцыя грамадскага транспарту Аўтобусная станцыя Чыгуначная станцыя - Чыгуначная плятформа - Уваход у мэтро + Чыгуначная платформа + Уваход у метро Так Стаянка таксі Аэрапорт - Шрубалётная пляцоўка + Верталётная пляцоўка Узлётная паласа Тэрмінал аэрапорту - Выйсьце на пасадку ў аэрапорце + Выхад на пасадку ў аэрапорце Пахіл для лодак Прычал парому @@ -166,12 +166,12 @@ Станцыя канатнай дарогі Канатная дарога з кабінамі - Канатная дарога зь невялікімі кабінамі + Канатная дарога з невялікімі кабінамі Канатная дарога з адкрытымі крэсламі - T-вобразны пад\'ёмнік - J-вобразны пад\'ёмнік + Пад\'ёмнік у выглядзе Т + Пад\'ёмнік у выглядзе J Талерачны пад\'ёмнік - Пад\'ёмнік змяшанага тыпу + Пад\'ёмнік змешанага тыпу Бугельная канатная дарога Рухомы канат Грузавы пад\'ёмнік @@ -180,13 +180,13 @@ Тунэль Мост - Камэра для замеру хуткасьці + Камера для замеру хуткасці Разваротнае кальцо Студня Напорная труба Водазабор Cудабудаўнічая майстэрня - Вычышчальныя збудаваньні + Вычышчальныя збудаванні Воданапорная вежа Вароты шлюзу Паваротная кропка на вадзе @@ -197,7 +197,7 @@ Падстанцыя Трансфарматар Электрастанцыя - Генэратар + Генератар Пошта Паштовая скрыня @@ -205,33 +205,33 @@ Вежа сувязі АТС - Перапрацоўка адыходаў + Перапрацоўка адходаў Звалка - Сьмецьцевы кантэйнэр - Сьметніца + Смеццевы кантэйнер + Сметніца Пірс - Камэра відэаназіраньня - Абсэрваторыя + Камера відэаназірання + Абсерваторыя Астранамічная Будоўля Завод Шахтавы ствол Ходня - Нафтавая сьвідравіна + Нафтавая свідравіна Трыангуляцыйны знак Вятрак Кар\'ер Вінаграднік Сад - Сажалка для асаджэньня солі + Сажалка для асаджэння солі Сетка для крыкету Аўташкола Школа Дзіцячы сад Каледж - Унівэрсытэт + Універсітэт Сацыяльная ўстанова Суд @@ -241,7 +241,7 @@ Дзяржаўная ўстанова Служба судовых прыставаў Пракуратура - Пэнсійны фонд + Пенсіённы фонд Міграцыйная служба Падатковая Адміністрацыйная ўстанова @@ -253,81 +253,81 @@ Сяліба Урочышча Садоўніцкае таварыства - Фэрма + Ферма Аптэка Лякарня Лекар Паліклініка, клініка Першая дапамога - Стаматалёгія + Стаматалогія Дом састарэлых Бэбі-бокс - Вэтэрынарная лякарня + Ветэрынарная лякарня Санаторый Альтэрнатыўная медыцына - Оталярынголяг + Оталарынголаг Банк крыві - Медыцынскі цэнтар + Медыцынскі цэнтр Акушэрка - Прафэсыйны лекар - Оптамэтрыст - Фізыятэрапэўт + Прафесійны лекар + Оптаметрыст + Фізыятэрапеўт Артапед - Псыхатэрапэўт + Псіхатэрапеўт Рэабілітацыя - Лягапэд + Лагапед Медыцынская ўстанова Фірма Страхавая кампанія - Агенцтва нерухомасьці + Агенцтва нерухомасці Юрыдычныя паслугі Тэлекамунікацыйная кампанія - Грамадзкая арганізацыя + Грамадская арганізацыя Адміністрацыя населенага пункта Біржа працы - Дасьледчы цэнтар - Інфармацыйныя тэхналёгіі - Друкаванае выданьне + Даследавачны цэнтр + Інфармацыйныя тэхналогіі + Друкаванае выданне Праектнае бюро Рэкламнае агенцтва Адукацыйная ўстанова (адміністрацыя) - Студыя гукапісу, тэлестудыя - Букмэкерская кантора + Студыя гуказапісу, тэлестудыя + Букмекерская кантора Стадыён - Спартовы цэнтар + Спартовы цэнтр Поле для гольфу Коўзанка Спартовая пляцоўка, поле, корт Спартовая дарожка Бегавая дарожка - Велатрэк + Роварная дарожка Іпадром Гоначная/ралійная траса - 9-кегельный боўлінг - 10-кегельный боўлінг (звычайны) + 9-кегельны боўлінг + 10-кегельны боўлінг (звычайны) Стральба з луку Лёгкая атлетыка - Амэрыканскі футбол + Амерыканскі футбол Аўстралійскі футбол Бэйзджампінг - Бэйзбол + Бейсбол Баскетбол Пляжны валейбол Веламотакрос Бул Боўлз - Канадзкі футбол - Плаваньне на байдарках і каяках + Канадскі футбол + Плаванне на байдарках і каяках Шахматы - Скалалазаньне + Скалалазанне Крыкет Кракет - Веласіпедны спорт - Скачкі ў ваду - Падводнае плаваньне + Роварны спорт + Дайвінг + Падводнае плаванне Сабачыя бягі Верхавая язда Гольф @@ -335,71 +335,71 @@ Гандбол Хакей Конскія скокі - Катаньне на каньках + Коўзанне на каньках Айсшток Корфбол Аўтамотаспорт - Унівэрсальная спортпляцоўка - Спартовае арыентаваньне + Універсальная спортпляцоўка + Спартовае арыентаванне Настольны тэніс - Парапланэрызм + Парапланерызм Пялота Бадмінтон, сквош - Катаньне на роліках - Акадэмічнае веславаньне + Катанне на роліках + Акадэмічнае веславанне Рэгбі-юніён Рэгбі-ліг Стральба - Катаньне на роліках (каньках) + Катанга на роліках Скейтборд Лыжны спорт - Традыцыйны футбол + Футбол Сёрфінг - Плаваньне + Плаванне Пінг-понг Тэніс Санкавы спорт Валейбол - Музэй - Помнік, мэмарыял + Музей + Помнік, мемарыял Твор мастацтва - Раскопы + Раскопкі Поле бітвы Межавы камень Гістарычныя гарматы Замак - Гарадзкая брама - Фартыфікацыйныя збудаваньні + Гарадская брама + Фартыфікацыйныя збудаванні Фантан Гістарычныя руіны - Руніцкі камень - Месца караблекрушэньня - Судна (музэй) - Манумэнт (помнік) + Рунны камень + Месца караблекрушэння + Судна (музей) + Манумент (помнік) Заапарк Парк забаў - Турыстычная славутасьць + Турыстычная славутасць Кола агляду - Карусэль - Лябірынт - Арэлі-карусэлі + Карусель + Лабірынт + Арэлі-каруселі Цягнік (атракцыён) Водныя горкі Гатэль - Гасьцявы дом - Гостэл + Гасцявы дом + Хостэль Матэль Горны прытулак Шале - Месца пакланеньня - Хрысьціянства - Юдаізм + Месца пакланення + Хрысціянства + Іудаізм Іслам - Сыкхізм + Сікхізм Будызм Індуізм Сінтаізм @@ -407,59 +407,59 @@ Кляштар Гістарычны кляштар Прыдарожны крыж - Прыдарожная сьвятыня + Прыдарожная святыня Інфармацыйны стэнд - Гадзіньнік + Гадзіннік Турагент - Месца з добрым відам + Месца з добрым краявідам Месца для лагера Месца для начлегу Месца для пікніка Крыніца Гарачая крыніца - Гейзэр + Гейзер Могілкі Могілкі (невялікія) Хованка ад непагадзі Фунікулёр Курорт - Клюб аматараў мастацтва - Астранамічны клюб - Кампутарны клюб + Клуб аматараў мастацтва + Астранамічны клуб + Кампутарны клуб Настольныя гульні - Мотаклюб - Спартовы клюб - Гульнявы клюб - Аўтаклюб - Шахматны клюб - Кінаклюб - Фанклюб - Клюб рыбаловаў - Клюб вэтэранаў - Клюб аматараў Linux - Тэатральны клюб - Гістарычны клюб - Музычны клюб - Клюб этнічнай культуры - Клюб натуралістаў - Фотаклюб - Клюб паляўнічых - Зброевы клюб - Турыстычны клюб - Дабрачыннны клюб + Мотаклуб + Спартовы клуб + Гульнявы клуб + Аўтаклуб + Шахматны клуб + Кінаклуб + Фанклуб + Клуб рыбаловаў + Клуб ветэранаў + Клуб аматараў Linux + Тэатральны клуб + Гістарычны клуб + Музычны клуб + Клуб этнічнай культуры + Клуб натуралістаў + Фотаклуб + Клуб паляўнічых + Збройны клуб + Турыстычны клуб + Дабрачыннны клуб Бібліятэка - Мастацкі цэнтар + Мастацкі цэнтр Кінатэатр Казіно - Грамадзкі цэнтар - Грамада, клюб - Тэатр, канцэртная заля + Грамадскі цэнтр + Грамада, клуб + Тэатр, канцэртная зала Цырк Танцпляцоўка - Начны клюб;Дыска - Стрыпклюб + Начны клуб;Дыска + Стрыпклуб Пляжны комплекс Пляцоўка для выгулу сабак Месца для рыбалкі @@ -468,14 +468,14 @@ Прыстань, яхт-клуб Міні-гольф Дзіцячая пляцоўка - Басэйн + Басейн Аквапарк Парк Кафэ Летняе кафэ Рэстаран - Фастфуд (хуткае харчаваньне) + Фастфуд (хуткае харчаванне) Бар Паб Рэстаранны панадворак @@ -483,7 +483,7 @@ Ўстаноўка для барбекю Рамонт с/г тэхнікі - Пляценьне з лазы + Пляценне з лазы Пчаляр Гамарня Бровар @@ -492,36 +492,36 @@ Сталярная майстэрня Укладка дываноў, каўраліна Кэйтэрынг - Гадзіньнікавая майстэрня + Гадзіннікавая майстэрня Пашыў, рамонт адзежы Электрык Садоўнік, ландшафтны дызайнер Шклорэзная майстэрня - Рукадзельле, упрыгожваньні - Мантаж кандыцыянераў, сыстэм вэнтыляцыі - Паслугі па ўцяпленьні памяшканьняў + Рукадзелле, упрыгожванні + Мантаж кандыцыянераў, сістэм вентыляцыі + Паслугі па ўцяпленні памяшканняў Ювелірная майстэрня Слясарныя працы Выраб ключоў - Мэталаканструкцыі + Металаканструкцыі Оптык Маляр Паркетныя працы Фатограф - Фоталябараторыя + Фоталабараторыя Тынковачныя працы Сантэхнік Ганчарная майстэрня - Абсталяваньне для яхт, катэраў + Абсталяванне для яхт, катэраў Страхар Пашыў і рамонт аўтакрэслаў Пашыў і рамонт ветразяў Піларама - Узвядзеньне будаўнічых лясоў + Узвядзенне будаўнічых лясоў Скульптар Абутковая майстэрня Выраб выставачных стэндаў - Каменярэзная майстэрня + Каменарэзная майстэрня Выраб падстрэшкаў, жалюзі Камінар Атэлье @@ -529,15 +529,15 @@ Бляхар, лудзільнік Драпавальнік, абіўка мэблі Гадзіннікавы майстар - Выраб вокнаў + Выраб акон Рытуальныя паслугі Зборка кампутараў - Салон прыгажосьці + Салон прыгажосці Манікюр Цырульня - Масажны салён - Тату салён + Масажны салон + Татусалон Хімчыстка Пральня Пракат аўтамабіляў @@ -553,7 +553,7 @@ Банк Банкамат Ліхвяр - Лямбард + Ламбард Абмен валют Бухгалтарскія паслугі Аплата bitcoin @@ -574,43 +574,43 @@ Мыс Пляж Заліў, бухта - Фіёрд + Ф’ёрд Рыф Балота Запаведнік Праліў - Выспа - Выспа (невялікая) + Востраў + Востраў (невялікі) Якарная стаянка Якарны прычал Бакен - Бакен адмысловага прызначэньня + Бакен адмысловага прызначэння Прычал - Знак ізаляванай небясьпекі + Знак ізаляванай небяспекі Адмысловы буй - Сыгнал пры смузе + Сігнал пры смузе Гавань Прычал - Апавяшчэньне (навігацыйны знак) - Радыёстанцыя (навігацыйны знак) - Сыгнал небясьпекі - Караблекрушэньне (навігацыйны знак) + Апавяшчэнне (навігацыйны знак) + Радыястанцыя (навігацыйны знак) + Сігнал небяспекі + Караблекрушэнне (навігацыйны знак) Вайсковае Ваенны аэрадром Ваенны бункер Баракі - Небясьпечная зона + Небяспечная зона Ваеннае стрэльбішча Прыгарад Ваколіцы Док - Дарожная разьвязка + Дарожная развязка Атракцыён Жывёла (атракцыён) - Амэрыканскія горкі + Амерыканскія горкі Жолаб Летнія сані Скала (навігацыйны знак) @@ -619,21 +619,21 @@ Вежа Шчогла Радар - Акварыюм - Буй (ізаляваная небясьпека) + Акварыум + Буй (ізаляваная небяспека) Латэральны буй Дамба Кардынальны бакен Латэральны бакен Кардынальны буй - Радыёлакацыйны транспондар (навігацыйны знак) + Радыялакацыйны транспондар (навігацыйны знак) Навігацыйны знак на палях Сігнальная станцыя (трафік) Топавая фігура (навігацыйны знак) Будынак (арыентыр) Мост (арыентыр) - Бясьпечная вада (буй) - Бясьпечная вада (бакен) + Бяспечная вада (буй) + Бяспечная вада (бакен) Акваторыя порту Берагавы знак Агонь маяка @@ -641,7 +641,7 @@ Асноўны агонь маяка Малы агонь маяка Агонь плывучага маяка - Пазнака дальнасьці + Пазнака дальнасці Агонь плывучага маяка (судна) Лодкавая станцыя Гандбол @@ -655,7 +655,7 @@ Сэрвіс Фінансы Прырода - Вікіпэдыя + Вікіпедыя Карыстальніцкія Вайсковая зона @@ -665,51 +665,51 @@ Марское Адпачынак Антрапагеннае - Апартамэнты + Апартаменты Вінная крама - Месца прыпынку грамадзкага транспарту + Месца прыпынку грамадскага транспарту Чыгуначны прыпынак Доступ у Інтэрнэт: WLAN Доступ у Інтэрнэт: тэрмінал Доступ у Інтэрнэт: дротавы - Доступ у Інтэрнэт: агульны + Доступ у Інтэрнэт: публічны Доступ у Інтэрнэт: паслугі Начлег Чыгуначны тупіковы ўпор - Клюб + Клуб Майстэрня Уласны транспарт - Грамадзкі транспарт - Славутасьці + Грамадскі транспарт + Славутасці Доступ у Інтэрнэт Кафэ і рэстаран АЗС Водны транспарт Роварны транспарт - Водазабесьпячэньне - Сьметнік - Прадуктовая крама і супэрмаркет + Водазабеспячэнне + Сметнік + Прадуктовая крама і супермаркет Дарожная перашкода - Авія транспарт + Авіятранспарт Лінная дарога Транспартнае будаўніцтва Энэргетыка Сувязь - Жыльлё - Медыцынскае забесьпячэньне + Жыллё + Медыцынскае забеспячэнне Хакей на траве - Зона для паленьня - Навучальны цэнтар + Зона для палення + Навучальны цэнтр Квартал Зона адпачынку - Рэзэрвуар + Рэзервуар Газасховішча Сілас - Бак (рэзэрвуар) + Бак (рэзервуар) Лыжня Сноўпарк @@ -720,7 +720,7 @@ Санкавы схіл Нартавая дарога - Сьцежка + Сцежка Канал Лаўка Вада @@ -729,11 +729,11 @@ Даліна Лес - Землекарыстаньне - Дызэль - GTL-дызэль - HGV-дызэль - Біядызэль + Землекарыстанне + Дызель + GTL-дызель + HGV-дызель + Біядызель Звадкаваны газ Актан 80 Актан 91 @@ -741,18 +741,18 @@ Актан 95 Актан 98 Актан 100 - Сьціснуты прыродны газ + Сціснуты прыродны газ Паліва 1:25 Паліва 1:50 - Этаноль - Мэтаноль + Этанол + Метанол Алейнае паліва E10 E20 E85 Біягаз Вадкі вадарод - Электрычнасьць + Электрычнасць Падворак Луг @@ -764,7 +764,7 @@ Чыгуначная паласа - Перакрыжаваньне + Перакрыжаванне Парусны спорт Дабрачынная крама Фота @@ -791,79 +791,79 @@ Турыстычная славутасьць Станцыя для вершнікаў - Вікіпэдыя - Англійская Вікіпэдыя - Фота і оптыка + Вікіпедыя + Вікіпедыя на англійскай мове + Камеры і аб’ектывы Рэлігійны пляц - Арабская Вікі - Беларуская Вікі - Баўгарская Вікі - Каталанская Вікі - Кітайская Вікі + Вікіпедыя на арабскай мове + Вікіпедыя на беларускай мове + Вікіпедыя на балгарскай мове + Вікіпедыя на каталанскай мове + Вікіпедыя на кітайскай мове -Чэская Вікі - Дацкая Вікі - Нямецкая Вікі - Грэцкая Вікі - Эстонская Вікі - Гішпанская Вікі - Фінская Вікі - Французкая Вікі - Галіцкая Вікі - Габрэйская Вікі - Харвацкая Вікі - Гаіцянская Вікі - Вугорская Вікі - Інданэзійская Вікі - Італійская Вікі - Японская Вікі - Карэйская Вікі - Літоўская Вікі - Латвійская Вікі - Малайская Вікі - Нэварская Вікі - Галяндзкая Вікі - Нованарвежская Вікі - Нарвежская Вікі - Польская Вікі - Партугальская Вікі - Румынская Вікі - Расейская Вікі - Славацкая Вікі - Славенская Вікі - Сербская Вікі - Швэдзкая Вікі - Тайская Вікі - Турэцкая Вікі - Украінская Вікі - В\'етнамская Вікі - Суахільская Вікі - Праход у сьцяне ці плоце +Вікіпедыя на чэшскай мове + Вікіпедыя на дацкай мове + Вікіпедыя на нямецкай мове + Вікіпедыя на грэчаскай мове + Вікіпедыя на эстонскай мове + Вікіпедыя на іспанскай мове + Вікіпедыя на фінскай мове + Вікіпедыя на французскай мове + Вікіпедыя на галіцкай мове + Вікіпедыя на іўрыце + Вікіпедыя на харвацкай мове + Вікіпедыя на гаіцянскай мове + Вікіпедыя на венгерскай мове + Вікіпедыя на інданэзійскай мове + Вікіпедыя на італьянскай мове + Вікіпедыя на японскай мове + Вікіпедыя на карэйскай мове + Вікіпедыя на летувісскай мове + Вікіпедыя на латышскай мове + Вікіпедыя на малазійскай мове + Вікіпедыя на неварскай мове + Вікіпедыя на галандскай мове + Вікіпедыя на нарвежскай (Нюнорск) мове + Вікіпедыя на нарвежскай мове + Вікіпедыя на польскай мове + Вікіпедыя на партугальскай мове + Вікіпедыя на румынскай мове + Вікіпедыя на расійскай мове + Вікіпедыя на славацкай мове + Вікіпедыя на славенскай мове + Вікіпедыя на сербскай мове + Вікіпедыя шведскай мове + Вікіпедыя на тайскай мове + Вікіпедыя на турэцкай мове + Вікіпедыя на украінскай мове + Вікіпедыя на в’етнамскай мове + Вікіпедыя на суахілі + Праход у сцяне ці плоце Асноўны ўваход Уваход Выхад - Сыр + Сырная крама Шакаладніца Макаронныя вырабы - Сьвечы + Свечы Садовая мэбля Музыка Шыны - Гадзіньнікі + Гадзіннікі Гульні - Відэа гульні + Відэагульні Піратэхніка Зброя Крама кавы Цукерня - Галянтарэя - Тавары для басэйна + Скураныя вырабы + Тавары для басейна Мадэлістам Крама моды Крама абагравальнікаў - Крама для плаваньня з маскамі + Крама тавараў для дайвінгу Узнагароды, прызы Абмежавальнік вышыні Крама для парашутыстаў @@ -880,15 +880,15 @@ Праезд для вершнікаў Брамка Брама - Хіндзі Вікі - Тэлугу Вікі - Валапюк Вікі + Вікіпедыя на хіндзі + Вікіпедыя на тэлугу + Вікіпедыя на валапюк Паваротны шлагбаўм Турнікет Праезд для фурманак - Пешаходныя пераход + Пешаходны пераход -Себуанская Вікі +Вікіпедыя на себуанскай мове Энэргетыка Хвалялом Хвалярэз @@ -896,13 +896,13 @@ Турыстычная славутасьць Дрэва Гадзіны працы - Апісаньне + Апісанне Тэлефон Вэб-сайт - Апэратар + Аператар Брэнд - Разьмеркавальная скрыня + Размеркавальная скрыня Штучны вадаём Кран Краіна @@ -927,40 +927,40 @@ Пункт міжнароднай роварнай сеткі Пункт нацыянальнай роварнай сеткі Пункт рэгіянальнай роварнай сеткі - Пункт лякальнай роварнай сеткі + Пункт мясцовай роварнай сеткі Пункт міжнароднай сеткі пешых маршрутаў Пункт нацыянальнай сеткі пешых маршрутаў Пункт рэгіянальнай сеткі пешых маршрутаў - Пункт лякальнай сеткі пешых маршрутаў + Пункт мясцовай сеткі пешых маршрутаў Міжнародны пешы маршрут Нацыянальны пешы маршрут Рэгіянальны пешы маршрут - Лякальны пешы маршрут + Мясцовы пешы маршрут Абароненая вобласьць Вузлы пешаходнай ці рованай сеткі Пешыя маршруты Кантроль руху - Гадзіны выманьня - Абазначэньне пешага маршруту + Гадзіны вымання + Абазначэнне пешага маршруту Прыватны доступ Няма доступу Доступ з дазволу Доступ спажыўцам Доступ для дастаўкі - Сельгасп. доступ + Сельгас доступ Транзіт забаронены Так Не - Станцыя назіраньня + Станцыя назірання Эл. пошта Факс Facebook - Сотавы тэлефон + Мабільны тэлефон Сабакі Каты Сабакі, каты @@ -968,20 +968,20 @@ Душ Пункт прыёму - Кантэйнэр + Кантэйнер Шкло Папера Вопратка Бляшанкі Шкляныя бутэлькі - Плястык - Мэталалом + Пластык + Металалом Батарэйкі - Плястыкавыя бутэлькі - Расьліннае сьмецьце - Сьмецьце (чорныя мяхі) - Плястыкавая тара - Газэты + Пластыкавыя бутэлькі + Расліннае сьмецце + Смецце (чорныя мяхі) + Пластыкавая тара + Газеты Часопісы Кнігі Абутак @@ -998,16 +998,16 @@ Алюміній Арганічныя харчовыя адходы Скрынкі з-пад гародніны - Садовае сьмецьце - Энэргазьберагальныя лямпы - Люмінесцэнтныя лямпы - Мэталь + Садовае смецце + Энэргазберагальныя лампы + Люмінесцэнтныя лампы + Метал Буйная бытавая тэхніка Бытавая тэхніка - Алей для смажаньня + Алей для смажання Аліва - Плястыкавыя мяхі - Небясьпечныя адходы + Пластыкавыя мяхі + Небяспечныя адходы Мабільныя тэлефоны Ртуць Кампутары @@ -1018,15 +1018,15 @@ Кампакт-дыскі Бутэлькі Вінныя коркі - Картрыджы для друкарак + Картрыджы для прынтараў Бляшаныя вырабы Фальга Фарба - Пенапляст + Пенапласт Лекі Кампост - Будаўнічае сьмецьце - Навагоднія елкі + Будаўнічае смецце + Калядныя елкі Лямпачкі ДСП Поліэстэр @@ -1045,27 +1045,27 @@ Некантралюемы аб\'ект Так Не - Сухі сэзон - Сэзон дажджоў - Са сьвятлафорам + Сухі сезон + Сезон дажджоў + Са святлафорам Нерэгулюемы - Неразьмечаны + Неразмечаны Адпрацаваная алiва - Парфумэрыя + Парфумерыя - Твітар - Скайп - Ютуб - Інстаграм + Twitter + Skype + YouTube + Instagram УКантакце - Гугл+ + Google+ Млынавая сажалка Будынак Ваенкамат - Натарыўс - Ядравыя адыходы + Натарыус + Радыяактыўныя адходы Насельніцтва Гранат @@ -1085,10 +1085,10 @@ Лютэранства Сунізм Пратэстантызм - Мэтадызм + Метадызм Англіканства - Расейкае праваслаўе - Грэцкае праваслаўе + Расійкае праваслаўе + Грэчаскае праваслаўе Кальвінізм Адвентысты сёмага дня Новаапостальская царква @@ -1097,15 +1097,15 @@ Аб\'яднаная царква Грэка-каталіцызм Тыбецкі будызм - Царква Шатляндыі - Армія выратаваньня + Царква Шатландыі + Армія выратавання Царква Хрыста Квакерства - Баўгарскае праваслаўе + Балгарскае праваслаўе Без дэнамінацыі Стараверства Сербскае праваслаўе - Сьпірытызм + Спірытызм Армянская апостальская царква Вышыня Вышыня над узроўнем мора @@ -1142,8 +1142,8 @@ Тэхналёгія Астраномія - Камерцыйнае землекарыстаньне - Раздробны гандаль (землекарыстаньне) + Камерцыйнае землекарыстанне + Раздробны гандаль (землекарыстанне) Так Забаронена @@ -1152,24 +1152,24 @@ Спэцыялізаваная ўстанова для тых, хто паліць Платна - Дзьверы + Дзверы Рудыментарны мост з камянёў Зона паслуг, прылеглая да шашы Землі пад забудову (выкарыстаныя раней) Зямля пад забудову - Збудаваньне для захоўваньня сіласу - Пэдыятар + Збудаванне для захоўвання сіласу + Педыятр - Офіс рэлігійнай арганізацыі + Офіс рэлігійнай установы Офіс таварыства, асацыяцыі Фінансавая кантора Офіс палітычнай партыі - Офіс фонду (грамадзкай арганізацыі) - Спэцыяліст па падрыхтоўцы падатковых дэклярацый + Офіс фонду (грамадскай арганізацыі) + Спецыяліст па падрыхтоўцы падатковых дэкларацый Спірытуалізм - Тэнрыкё + Тэнрыко Катэгорыя складанасьці перавала Сад @@ -1353,7 +1353,7 @@ Фінікі Бахаізм Прэсбітарыянства - Эвангелізм + Евангелізм Пяцідзесятніцтва Марманізм Шыізм @@ -1369,26 +1369,26 @@ Абмежавана Опт - Астравок (перашкода) + Выспа (перашкода) Турыстычны аб\'ект Унітарны ўніверсалізм - Шматканфесійнасьць + Шматканфесійнасць Джайнізм - Саенталёгія - Сьведкі Іеговы + Саенталогія + Сведкі Іеговы Аб\'яднаная рэфармаваная царква - Мэнаніцтва + Менаніцтва Асамблеі Бога Назаране Аб\'яднаная метадысцкая царква Кангрэгацыйная царква - Нідэрляндзкая рэфармацкая царква + Нідэрландская рэфарматарская царква Апостальская царква - Рух сьвятых апошніх дзён + Рух святых апошніх дзён Саентызм - Эфіёпская (абісінская) праваслаўная царква + Эфіопская (абісінская) праваслаўная царква Унітарыянства - Вэсліянская царква + Весліянская царква Шактызм Сінгон Мараніцкая каталіцкая царква @@ -1524,20 +1524,20 @@ Цыркон Сходы - Зьмесьціва: сілас - Зьмесьціва: вада - Зьмесьціва: нафта - Зьмесьціва: паліва - Зьмесьціва: гной - Зьмесьціва: віно - Зьмесьціва: стокавыя воды - Зьмесьціва: газ - Зьмесьціва: біямаса - Зьмесьціва: ураджай - Зьмесьціва: корм - Зьмесьціва: піва - Зьмесьціва: соль - Зьмесьціва: збожжа + Змесціва: сілас + Змесціва: вада + Змесціва: нафта + Змесціва: паліва + Змесціва: гной + Змесціва: віно + Змесціва: стокавыя воды + Змесціва: газ + Змесціва: біямаса + Змесціва: ураджай + Змесціва: корм + Змесціва: піва + Змесціва: соль + Змесціва: збожжа Дазволены Забаронены @@ -1546,24 +1546,24 @@ З дазволу Будаўнічыя матэрыялы - Матэрыялы для вадавода + Матэрыялы для вадаавода Лесаматэрыялы Сельгаспрадукцыя Кафля - Зьмесьціва: завісь - Замацаванае кольца + Змесціва: завісь + Замацаванае кальцо Стойка - Мацаваньне толькі для пярэдняга кола + Мацаванне толькі для пярэдняга кола Рама Адмысловы будынак Падстрэшак - Слупок з мацаваньнем + Слупок з мацаваннем Неафіцыйная - Шырокалісьцевая расьліннасьць - Хвойная расьліннасьць - Зьмяшанага тыпу + Шырокалісцевая расліннасць + Хвойная расліннасць + Змяшанага тыпу Бязьлісьцевая расьліннасьць Від Род @@ -2368,8 +2368,8 @@ Гістарычная чыгуначная станцыя Масонскае Ложа - Клюб ветразьнага спорту - Клюб скаўтаў + Клуб ветразевага спорту + Клуб скаўтаў Гістарычнае гумно Гістарычная шыбеніца @@ -2422,67 +2422,67 @@ Хакерспэйс - Вікіпэдыя на афрыкаанс - Вікіпэдыя на алеманскай - Вікіпэдыя на азербайджанскай - Вікіпэдыя на бенгальскай - Вікіпэдыя на бішнупрыя-маніпуры - Вікіпэдыя на брэтонскай - Вікіпэдыя на баснійскай - Вікіпэдыя на валійскай - Вікіпэдыя на эспэранта - Вікіпэдыя на баскскай - Вікіпэдыя на пэрсідзкай - Вікіпэдыя на заходнефрызкай - Вікіпэдыя на ірляндзкай - Вікіпэдыя на армянскай - Вікіпэдыя на ісьляндзкай - Вікіпэдыя на грузінскай - Вікіпэдыя на курдзкай - Вікіпэдыя на лацінскай - Вікіпэдыя на люксэмбургскай - Вікіпэдыя на македонскай - Вікіпэдыя на малаялам - Вікіпэдыя на маратхі - Вікіпэдыя на ніжненямецкай - Вікіпэдыя на наваха - Вікіпэдыя на асяцінскай - Вікіпэдыя на п\'емонцкай - Вікіпэдыя на сардынскай - Вікіпэдыя на сэрбахарвацкай - Вікіпэдыя на альбанскай - Вікіпэдыя на тамільскай - Вікіпэдыя на тагальскай + Вікіпедыя на афрыкаанс + Вікіпедыя на алеманскай мове + Вікіпедыя на азербайджанскай мове + Вікіпедыя на бенгальскай мове + Вікіпедыя на бішнупрыя-маніпуры + Вікіпедыя на брэтонскай мове + Вікіпедыя на баснійскай мове + Вікіпедыя на валійскай мове + Вікіпедыя на эсперанта + Вікіпедыя на басконскай мове + Вікіпедыя на персідскай мове + Вікіпедыя на заходнефрызскай мове + Вікіпедыя на ірландскай мове + Вікіпедыя на армянскай мове + Вікіпедыя на ісландскай мове + Вікіпедыя на грузінскай мове + Вікіпедыя на курдскай мове + Вікіпедыя на лацінскай мове + Вікіпедыя на люксембургскай мове + Вікіпедыя на македонскай мове + Вікіпедыя на малаялам + Вікіпедыя на маратхі + Вікіпедыя на ніжненямецкай мове + Вікіпедыя на наваха + Вікіпедыя на асяцінскай мове + Вікіпедыя на п\'емонцкай мове + Вікіпедыя на сардынскай мове + Вікіпедыя на сербскахарвацкай мове + Вікіпедыя на албанскай мове + Вікіпедыя на тамільскай мове + Вікіпедыя на тагальскай мове - Вікіпэдыя на варайскай - Вікіпэдыя на мінангкабаў - Вікіпэдыя на казахскай - Вікіпэдыя на ўзбецкай - Вікіпэдыя на чачэнскай - Вікіпэдыя на урду - Вікіпэдыя на аксітанскай - Вікіпэдыя на паўднёваміньскай - Вікіпэдыя на малагасійскай - Вікіпэдыя на татарскай - Вікіпэдыя на яванскай - Вікіпэдыя на кіргізкай - Вікіпэдыя на кантонскай - Вікіпэдыя на астурлеонскай - Вікіпэдыя на таджыцкай - Вікіпэдыя на башкірскай - Вікіпэдыя на шатляндзкай - Вікіпэдыя на заходнім панджабі - Вікіпэдыя на чувашскай - Вікіпэдыя на лямбардзкай - Вікіпэдыя на бірманскай - Вікіпэдыя на ёруба - Вікіпэдыя на арагонскай - Вікіпэдыя на нэпальскай - Вікіпэдыя на гуджараці - Вікіпэдыя на сіцылійскай - Вікіпэдыя на баварскай - Вікіпэдыя на мангольскай - Вікіпэдыя на нэапалітанскай + Вікіпедыя на варайскай мове + Вікіпедыя на мінангкабаў + Вікіпедыя на казахскай мове + Вікіпедыя на ўзбецкай мове + Вікіпедыя на чачэнскай мове + Вікіпедыя на урду + Вікіпедыя на аксітанскай мове + Вікіпедыя на паўднёваміньскай мове + Вікіпедыя на малагасійскай мове + Вікіпедыя на татарскай мове + Вікіпедыя на яванскай мове + Вікіпедыя на кіргізскай мове + Вікіпедыя на кантонскай мове + Вікіпедыя на астурлеонскай мове + Вікіпедыя на таджыцкай мове + Вікіпедыя на башкірскай мове + Вікіпедыя на шатландскай мове + Вікіпедыя на заходнім панджабі + Вікіпедыя на чувашскай мове + Вікіпедыя на ламбардскай мове + Вікіпедыя на бірманскай мове + Вікіпедыя на ёруба + Вікіпедыя на арагонскай мове + Вікіпедыя на непальскай мове + Вікіпедыя на гуджараці + Вікіпедыя на сіцылійскай мове + Вікіпедыя на баварскай мове + Вікіпедыя на мангольскай мове + Вікіпедыя на неапалітанскай мове Крама феервэркаў @@ -3041,7 +3041,7 @@ Дэльфінарыюм Вадзяны знак: насып - Зьмесьціва: сьцёкі + Змесціва: сцёкі Трава Вікіпэдыя @@ -3052,15 +3052,15 @@ Дадатковы Рахункавыя карткі Карткі не прымаюцца - Крама з прыправамі + Крама з заправамі Яднаючая Царква ў Аўстраліі - Рэфармісцкі юдаізм + Рэфарматарскі іудаізм Кашынта Зарадка: не Зарадка: ёсць - Тавары для рукадзельля + Тавары для рукадзелля Тып авіяцыйнага паліва Паліўныя карткі @@ -3070,15 +3070,15 @@ Тып адзежы Тып абутку Тып - Разьмяшчэньне + Размяшчэнне Крыніца вады Тып аплаты Гукавы сігнал Тып - Тактыльнае пакрыцьцё + Тактыльнае пакрыццё Паслугі Безкантактная - Самаабслугоўваньне + Самаабслугоўванне Тып Станцыя метро Груз @@ -3086,34 +3086,34 @@ Правоз ровараў Абагрэў Помпа - Прызначэньне + Прызначэнне Тып Тып Тып Сталіца Продаж лекаў па рэцэптам - Спэцыялізацыя + Спецыялізацыя Характарыстыка Тып - Колькасьць зорак + Колькасць зорак Рэлігія Аўтаматызацыя Крыты - Веравызнаньне + Веравызнанне Тып - Зьмест + Змест Дадаткова Скаўцкі лагер Месца для лагера на прыродзе без выгод Тып - Складанасьць трасы - Абслугоўваньне трасы + Складанасць трасы + Абслугоўванне трасы Жанр Месцы на адкрытым паветры Аплата - Паленьне + Паленне Дастаўка - Абслугоўваньне кліентаў, якія сядзяць у аўтамабілі + Абслугоўванне кліентаў, якія сядзяць у аўтамабілі Абслугоўванне кліентаў, якія сядзяць у аўтамабілі На вынас Кактэйлі @@ -3122,19 +3122,19 @@ Тып Прыманыя адыходы Тып - Месца для развядзеньня агню - Сэзоннасьць + Месца для развядзення агню + Сезоннасць Характарыстыка вады Паверхня Нудызм - Харчовыя абмежаваньні - Спэцыялізацыя - Від масажу + Харчовыя абмежаванні + Спецыялізацыя + Тып масажу Усталёўка намётаў Пральная машына Аўтапрычэпы - Крыніца сілкаваньня - Мэдычная сыстэма + Крыніца сілкавання + Медыцынская сістэма Выезд на дом Стравы Тып аплаты (транспарт) @@ -3767,7 +3767,7 @@ Крама канопляў - Раздым + Штэкер CEE блакітны CEE чырвоны 16A @@ -3884,7 +3884,7 @@ Ніжэйшая кропка Сярэдні ўхіл -Тып кантрольнага пункта +Тып кантрольнага пункту Пешаходны кантрольны пункт Пункт штампоўкі @@ -3928,7 +3928,7 @@ Тып Так - Аптовая купля: толькі + Толькі Трубаправодная падстанцыя Перадавальная diff --git a/OsmAnd/res/values-be/strings.xml b/OsmAnd/res/values-be/strings.xml index b50ef9d4a7..832f3832b2 100644 --- a/OsmAnd/res/values-be/strings.xml +++ b/OsmAnd/res/values-be/strings.xml @@ -4,48 +4,48 @@ Для сярэдняга маштабу Драбней Лупа мапы - Асноўная мапа сьвету + Асноўная мапа свету Версія: - Аб праграме - Вэрсія, ліцэнзіі, удзельнікі праекту + Аб дадатку + Версія, ліцэнзіі, удзельнікі праекта - Сьцягнутыя маштабы: %1$s - Тэрмін дзеяньня (у хвілінах): %1$s - Можна сьцягнуць: %1$s - Максымальнае павелічэньне: %1$s - Мінімальнае павелічэньне: %1$s - Зьвесткі фрагмэнту: %1$s + Спампаваныя маштабы: %1$s + Тэрмін дзеяння (у хвілінах): %1$s + Можна спампаваць: %1$s + Максімальнае павелічэнне: %1$s + Мінімальнае павелічэнне: %1$s + Даныя фрагменту: %1$s Крыніца фрагментаў мапы «%1$s» захаваная Эліптычны меркатар - Максімальнае павелічэньне - Тэрмін дзеяньня (у хвілінах) - Мінімальнае павелічэньне + Максімальнае павелічэнне + Тэрмін дзеяння (у хвілінах) + Мінімальнае павелічэнне URL Абярыце наяўную… - Вызначыць/зьмянiць… + Вызначыць/змянiць… Адладачная інфармацыя FPS - Абярыце рэгіён кіраваньня: ЗША, Эўропа, Вялікабрытанія, Азія і іншыя. + Абярыце рэгіён кіраваньня: ЗША, Еўропа, Вялікабрытанія, Азія і іншыя. Рэгіён кіравання Японія ЗША Канада - Эўропа, Азія, Лацінская Амерыка ды іншыя + Еўропа, Азія, Лацінская Амерыка ды іншыя Вялікабрытанія, Індыія ды іншыя Агалошваць… - Агалошваць назвы вуліц, дарожныя перасцярогі (вымушаныя прыпынкі, ляжачыя паліцэйскія), перасцярогі аб камерах хуткасці, абмежаванні хуткасці. + Агалошваць назвы вуліц, дарожныя папярэджанні (вымушаныя прыпынкі, ляжачыя паліцэйскія), перасцярогі аб камерах хуткасці, абмежаванні хуткасці. Назвы вуліц (TTS) Абмежаванне хуткасці Камеры хуткасці - Перасцярогі руху + Папярэджанні руху Калі ласка, пазначце карыстальніка OSM і ягоны пароль у «Наладах» - Ачысьціць прамежкавыя пункты прызначэньня - Захаваць прамежкавыя пункты прызначэньня - У вас ужо ёсьць набор прамежкавых пунктаў прызначэньня. + Ачысціць прамежкавыя пункты прызначэння + Захаваць прамежкавыя пункты прызначэння + У вас ужо ёсць набор прамежкавых пунктаў прызначэння. Маршрут да Маршрут адсюль Мапа: @@ -57,25 +57,25 @@ Прагляд мапы - Стандартны профіль - Выгляд мапы й налады навігацыі захоўваюцца для кожнага асобнага профілю. Вызначце Ваш стандартны профіль. - Месца прызначэньня %1$s - Ужыць як прызначэньне + Прадвызначаны профіль + Выгляд мапы і налады навігацыі захоўваюцца для кожнага асобнага профілю. Вызначце ваш прадвызначаны профіль. + Месца прызначэння %1$s + Ужыць як пункт прызначэння Абярыце спачатку горад ці вуліцу Пошук вуліцы ў суседніх гарадах Аптымальны парадак прамежкавых пунктаў прызначэння па шляху да месца прызначэння. - Упарадкаваць ад дзьвярэй да дзьвярэй + Упарадкаваць ад дзвярэй да дзвярэй Файл OSM-змен створаны ў %1$s - Не атрымалася зарэзерваваць OSM-зьмены - Рэзервовае капіяваньне файлу зьмен OSM - Выдаліць кропку + Не атрымалася зарэзерваваць OSM-змены + Рэзервовае капіраванне файлу змен OSM + Выдаліць пункт час - дакладнасьць - хуткасьць + дакладнасць + хуткасць вышыня Пункт - Назва GPX файлу + Назва файла GPX GPX-файл захаваны ў {0} Убудова дадае на экран мапы віджэт, які дазваляе ствараць маршруты, націснуйшы на мапу, а таксама выкарыстоўваць ці змяняць наяўныя файлы GPX, планаваць паездку і вымяраць адлегласць паміж пунктамі. Вынікі могуць быць захаваныя ў выглядзе файла GPX, які пасля можа быць выкарыстаны для навігацыі. Прылада для разліку адлегласцяў і плянавання @@ -83,24 +83,24 @@ \n * Доўга ўтрымлівайце на мапе, каб выдаліць папярэдні пункт. \n * Доўга ўтрымлівайце на пункце, каб паглядзець і дадаць апісанне. \n * Націсніце на віджэце вымярэння, каб убачыць больш дзеянняў.
- Пачаць рэдагаваньне - Скончыць рэдагаваньне - Пачаць новы падтрэк + Пачаць рэдагаванне + Скончыць рэдагаванне + Пачаць новы падслед Выдаліць ўсе пункты Адкрыць існы GPX-файл - Калі ласка, пачакайце пакуль дзейная задача не будзе завершаная - Зніжае шум паказаньняў компасу, але дадае інэрцыю. - Выкарыстоўваць фільтар Калмана + Калі ласка, пачакайце пакуль бягучая задача не будзе завершаная + Зніжае шум паказанняў компасу, але дадае інэрцыю. + Выкарыстоўваць фільтр Калмана Выкарыстоўваць для працы компаса магнітны датчык замест датчыка арыентацыі. - Выкарыстоўваць магнітомэтр + Выкарыстоўваць магнітометр Іншае засталося %1$d файлаў Засталося %1$d файлаў для спампоўвання - Поўная вэрсія + Поўная версія Скасаваць маршрут Спыніць навігацыю - Сьцерці месца прызначэньня + Выдаліць месца прызначэння Wi-Fi не падлучаны. Выкарыстаць дзейнае падлучэнне да Інтэрнэту для спампоўвання? Назва вуліцы Нумар дома @@ -111,81 +111,81 @@ Налады запісу вашых падарожжаў. - Паказвае налады ўключэньня фонавага адсочвання і навігацыі праз перыядычнае абуджэнне GPS-прыймача (з адключаным экранам). - Усталяваньне версіі - Абраць, як выглядае прыкладанне. + Паказвае налады ўключэння фонавага адсочвання і навігацыі праз перыядычнае абуджэнне GPS прылады (з выключаным экранам). + Усталёўка версіі + Абраць выгляд дадатка. Выгляд - Налады даступнасьці + Налады даступнасці Абраць адрас - Абярыце ўпадабанае + Абярыце ўлюбёнае Мадыфікацыі OSM - Слой рэльефу мясцовасьці - Зьвесткі GPS + Слой рэльефу мясцовасці + Інфармацыя GPS - Час прыбыцьця + Час прыбыцця адзначана не адзначана - Надаваць перавагу аўтамагістралям - Надаваць перавагу… - Надаваць перавагу аўтамагістралям. + Аддаваць перавагу аўтамагістралям + Аддаваць перавагу… + Аддаваць перавагу аўтамагістралям. няма - OpenMaps Эўропа + OpenMaps Еўропа - Слой з рэльефам мясцовасьці + Пласт з рэльефам мясцовасці Ізалініі вышынь - Аўдыё/відэа зьвесткі + Аўдыё/відэа даныя Сапраўды спыніць навігацыю? - Сапраўды сьцерці месца прызначэньня (і прамежкавыя пункты прызначэньня)? - Разлічыць дакладныя маршруты без памылак. Усё яшчэ абмежавана адлегласцю і павольная. + Сапраўды выдаліць месца прызначэння (і прамежкавыя пункты прызначэння)\? + Разлічыць дакладныя маршруты без памылак. Усё яшчэ абмежаваная адлегласцю і павольная. Дакладны маршрут (эксп.) Паказаць Фота %1$s %2$s Сфатаграфаваць Сфатаграфаваць - Модуль Dropbox дазваляе вам сінхранізаваць трэкі і аўдыё/відэа-натакi з вашым Dropbox-контам. - Модуль Dropbox + Убудова Dropbox дазваляе вам сінхранізаваць сляды і аўдыё/відэа натакi з вашым рахункам Dropbox. + Убудова Dropbox - Зьмяніць парадак - Калі ласка, падумайце пра набыццё дадатку «Contour lines» для падтрымкі далейшай распрацоўкі. + Змяніць парадак + Калі ласка, падумайце пра набыццё ўбудовы «Contour lines» для падтрымкі далейшай распрацоўкі. Убудова Ізалініі вышынь Выбар па запыце Запіс відэа Запіс аўдыё - Выберыце агаданае дзеянне віджэта. - Дзеяньне віджэта па змаўчанні - Выбар выхаднога фармату відэа. + Абярыце прадвызначанае дзеянне віджэта. + Прадвызначанае дзеянне віджэта + Выбар выоднага фармату відэа. Фармат відэа - Выкарыстоўваць сістэмную праграму для запісу відэа. - Выкарыстоўваць сістэмны рэкордэр - Выкарыстоўваць сістэмнае прыкладанне для фота. - Выкарыстоўваць праграму камеры - Настроіць параметры аўдыё і відэа. + Выкарыстоўваць сістэмны дадатак для запісу відэа. + Выкарыстоўваць сістэмны дадатак для запісу + Выкарыстоўваць сістэмны дадатак для фота. + Выкарыстоўваць дадатак камеры + Наладзіць параметры аўдыё і відэа. Налады аўдыё і відэа - Запіс не ўдаўся - Камера не даступная + Запісаць не атрымалася + Камера недаступная Аўдыё/відэа запісваецца. Каб спыніць, націсніце на AV-віджэт. Прайграецца аўдыё з абранага запісу.\n%1$s - Адкрыць зьнешні прайгравальнік - Выдаліць гэты запіс? - недаступны - Запісаць аўдыё-нататку - Запісаць відэа-нататку - Слой запісу - Запіс не можа быць прайграны + Адкрыць вонкавы прайгравальнік + Выдаліць гэты аб’ект\? + недаступна + Запісаць аўдыянататку + Запісаць відэанататку + Пласт запісу + Запіс немагчыма прайграць Выдаліць запіс Граць Запіс %1$s %3$s %2$s Запіс - Аўдыё/відэа-нататкі + Аўдыё/відэа нататкі Убудова OsmAnd для пазасеціўных ізаліній вышынь - Вымярэньне адлегласьці - Месцазнаходжанне для прывязкі нататкі пакуль яшчэ не вызначылася. «Выкарыстаць месцазнаходжаньне…» каб прызначыць нататку ў выбраным месцы. + Вымярэнне адлегласці + Месцазнаходжанне для прывязкі нататкі пакуль яшчэ не вызначылася. «Выкарыстаць месцазнаходжанне…» для запісу нататкі ў абраным месцы. - Аўдыё-нататкі + Аўдыянататкі Убудова для стварэння аўдыё/відэа нататак падчас падарожжаў, з дапамогай кнопкі на экране мапы альбо праз кантэкстнае меню на любым месцы на мапе. Аўдыё/відэа нататкі частак @@ -204,117 +204,117 @@ Абмежаванне хуткасці GPX - Будынкаў ня знойдзена. - Выберыце горад + Будынкаў не знойдзена. + Абярыце горад Дадатковы пошук вёсак і паштовага індэкса Абярыце калі паказваць дарожныя мапы: Мапы толькі дарог - Працаваць у бяспечным рэжыме (трохі павольней але без свойскіх бібліятэк). - Бясьпечны рэжым - Прыкладанне працуе ў бяспечным рэжыме (адключыць яго ў «Наладах»). + Працаваць у бяспечным рэжыме (трохі павольней, але без уласных бібліятэк). + Бяспечны рэжым + Дадатак працуе ў бяспечным рэжыме (выключыць яго можна ў «Наладах»). Фонавы рэжым OsmAnd па-ранейшаму працуе. Спыніць яго? - Зачыніць мноства зьмен - Прыкладанне «ZXing Barcode Scanner» не ўстаноўленае. Шукаць у Google Play? - Выберыце схему колераў дарог: + Закрыць набор змен + Дадатак «ZXing Barcode Scanner» не ўсталяваны. Знайсці ў Google Play\? + Абярыце схему колераў дарог: Схема колераў дарог - Паказваць напрамак да месца прызначэньня - Дазволіць модулю запісу падарожжа выкарыстоўваць сэрвісы запісу сьледу (запіс GPX, адсочваньне праз сетку) - Разлічваць прыблізны шлях на вялікія адлегласьці + Паказваць напрамак да месца прызначэння + Дазволіць убудове запісу падарожжа выкарыстоўваць сэрвісы запісу следу (запіс GPX, адсочванне праз сетку) + Разлічваць прыблізны шлях на вялікія адлегласці Калі ласка, уключыце GPS у наладах - Службы адсочваньня + Сэрвісы адсочвання Няма маршруту - Выдаліць пункт прызначэньня - Пункт прызначэньня %1$s + Выдаліць пункт прызначэння + Пункт прызначэння %1$s Прамежкавы пункт %1$s - Дадаць апошнім пунктам прызначэньня - Дадаць першым пунктам прызначэньня - Дадаць апошнім прамежкавым пунктам прызначэньня - Дадаць першым прамежкавым пунктам прызначэньня - Замяніць пункт прызначэньня - Вы ўжо абралі пункт прызначэньня: - Пункты прызначэньня - Прамежкавы пункт прызначэньня %1$s занадта далёка ад бліжэйшай дарогі. + Дадаць апошнім пунктам прызначэння + Дадаць першым пунктам прызначэння + Дадаць апошнім прамежкавым пунктам прызначэння + Дадаць першым прамежкавым пунктам прызначэння + Замяніць пункт прызначэння + Вы ўжо абралі пункт прызначэння: + Пункты прызначэння + Прамежкавы пункт прызначэння %1$s занадта далёка ад бліжэйшай дарогі. Вы дасягнулі прамежкавага пункта - Дадаць прамежкавым пунктам прызначэньня - Прамежкавы пункт прызначэньня + Дадаць прамежкавым пунктам прызначэння + Прамежкавы пункт прызначэння Канцавы пункт занадта далёка ад бліжэйшай дарогі. - Дадаць тэг + Дадаць пазнаку Пашыраны рэжым… Паркоўка Аварыйныя службы - Грамадзкі транспарт + Грамадскі транспарт Забавы - Жыльлё + Жыллё Рэстараны - Славутасьці + Славутасці Аўтамабільная дапамога Прадуктовая крама Для турыстаў Паліва - Паказваць папярэджванні… + Паказваць папярэджанні… Наладзіць папярэджанні руху (абмежаванні хуткасці, вымушаныя прыпынкі, штучныя няроўнасці, тунэлі), камеры хуткасці, інфармацыю аб палосах. Выкарыстоўваць компас калі інакш немагчыма вызначыць напрамак. Выкарыстоўваць компас - Пазьбягаць аўтамагістраляў - Узровень павелічэння згодна вашай хуткасці (калі мапа сінхранізуецца з дзейным становішчам). + Пазбягаць аўтамагістраляў + Узровень павелічэння згодна вашай хуткасці (калі мапа сінхранізуецца з бягучым становішчам). Аўтаматычнае памяншэнне/павелічэнне Прывязвацца да дарог падчас навігацыі. Прывязвацца да дарог - OsmAnd Мапы й навігацыя - Глабальная мабільная мапа і навігатар для аўтаномных і сеткавых мапаў OSM - OsmAnd (OSM Automated Navigation Directions) + OsmAnd Мапы і навігацыя + Глабальная мабільная мапа і навігатар для аўтаномных і сеціўных мапаў OSM + "OsmAnd (OSM Automated Navigation Directions) \n -\nOsmAnd — праграмнае навігацыйнае дастасаванне з адкрытым кодам з доступам да розных картаграфічных дадзеных ад OpenStreetMap (OSM). Усе картаграфічныя дадзеныя (вектарныя і растравыя) могуць быць захаваныя на карце памяці для аўтаномнага выкарыстання. Аўтаномная і анлайн-маршрутызацыя падтрымліваецца таксама, уключаючы пакрокавае галасавое суправаджэнне. +\nOsmAnd — навігацыйн дадатак з адкрытым кодам з доступам да разнастайных даных ад OpenStreetMap (OSM). Усе даныя (вектарныя і растравыя) можна захаваць на картцы памяці для аўтаномнага выкарыстання. Таксама падтрымліваецца аўтаномная і сеціўная маршрутызацыя, уключаючы пакрокавае галасавое суправаджэнне. \n \nНекалькі асноўных магчымасцяў: -\n - паўнавартасная праца без інтэрнэт-злучэння (захоўвае вектарныя або растравыя дадзеныя ў памяці прыстасавання); +\n - паўнавартасная праца без інтэрнэт-злучэння (захоўвае вектарныя або растравыя даныя ў памяці прылады); \n - кампактная вектарная мапа ўсяго свету; -\n - загрузка мапаў краін або рэгіёну непасрэдна ў праграме; -\n - магчымасць адлюстравання звестак на мапе, напрыклад пласт для пракладкі маршруту або пласт з запісам GPX-следу, з POI, упадабанымі, ізалініямі вышынь, грамадзкім транспартам, дадатковымі мапамі з магчымасцю налады ўзроўню празрыстасці; +\n - спампоўванне мапаў краін або рэгіёну непасрэдна ў праграме; +\n - магчымасць адлюстравання звестак на мапе, напрыклад пласт для пракладкі маршруту або пласт з запісам GPX-следу, з POI, улюбёныміі, ізалініямі вышынь, грамадскім транспартам, дадатковымі мапамі з магчымасцю налады ўзроўня празрыстасці; \n - аўтаномны пошук адрасоў і POI; -\n - пракладка маршрутаў афлайн на кароткія адлегласці (эксперыментальная функцыя); -\n - рэжымы для пешаходнай, аўтамабільнай і веланавігацыі з: +\n - пракладка маршрутаў па-за сецівам на кароткія адлегласці (эксперыментальная функцыя); +\n - рэжымы для пешаходнай, аўтамабільнай і роваравай навігацыі з: \n - магчымасцю аўтаматычнага пераключэння дзённага/начнога адлюстравання; \n - аўтамаштабаваннем мапы ў адпаведнасці з хуткасцю руху; \n - магчымасцю арыентацыі мапы па компасе або кірунку руху, \n - паказам руху па палосах і абмежаванняў хуткасці, запісанае і сінтэзуемае галасавое суправаджэнне. \n -\nАбмежаванні бясплатнай вэрсіі: -\n - колькасць сцягванняў мапаў абмежаванае; -\n - адсутнічае афлайн доступ да інфармацыі з Вікіпэдыі для POI. +\nАбмежаванні бясплатнай версіі: +\n - колькасць спамповак мапаў абмежаваная; +\n - адсутнічае пазасеціўны доступ да інфармацыі з Вікіпедыі для POI. \n -\nOsmAnd актыўна развіваецца, яго далейшае развіццё забяспечваецца фінансавымі паступленнямі ад яго карыстальнікаў, за кошт якіх адбываецца далейшая распрацоўка і тэставанне новых функцый. Калі ласка, разгледзьце магчымасць набыцця OsmAnd+ або падтрымайце распрацоўку пэўных функцый, або зрабіце дабрачынны ўнёсак на https://osmand.net. +\nOsmAnd актыўна развіваецца, яго далейшае развіццё забяспечваецца фінансавымі паступленнямі ад яго карыстальнікаў, за кошт якіх адбываецца далейшая распрацоўка і тэставанне новых функцый. Калі ласка, разгледзьце магчымасць набыцця OsmAnd+ або падтрымайце распрацоўку пэўных функцый, або зрабіце дабрачынны ўнёсак на https://osmand.net." - OsmAnd+ Мапы й навігацыя - Глабальная мабільная мапа і навігатар для аўтаномных і сеткавых мапаў OSM - OsmAnd+ (OSM Automated Navigation Directions) + OsmAnd+ Мапы і навігацыя + Глабальная мабільная мапа і навігатар для аўтаномных і сеціўных мапаў OSM + "OsmAnd+ (OSM Automated Navigation Directions) \n -\n OsmAnd+ — праграмнае навігацыйнае дастасаванне з адкрытым кодам з доступам да розных картаграфічных дадзеных ад OpenStreetMap (OSM). Усе картаграфічныя дадзеныя (вектарныя і растравыя) могуць быць захаваныя на карце памяці для далейшага аўтаномнага выкарыстання. Аўтаномная і анлайн-маршрутызацыя падтрымліваецца таксама, уключаючы пакрокавае галасавое суправаджэнне. +\n OsmAnd+ — навігацыйны дадатак з адкрытым кодам з доступам да разнастайных даных ад OpenStreetMap (OSM). Усе даныя (вектарныя і растравыя) можна захаваць на картцы памяці для далейшага аўтаномнага выкарыстання. Таксама падтрымліваецца аўтаномная і сеціўная маршрутызацыя, уключаючы пакрокавае галасавое суправаджэнне. \n \n OsmAnd+ — гэта платная версія, купляючы якую вы падтрымліваеце праект, фінансуеце распрацоўку новых функцый, і атрымліваеце апошнія абнаўленні. \n \n Некалькі асноўных магчымасцяў: -\n - поўнасцю аўтаномная праца (захаванне вектарных або растравых мапаў у памяці прыстасавання); -\n - кампактная вэктарная мапа для ўсяго cвету; -\n - неабмежаваная колькасць сцягванняў мапаў асобнай краіны або рэгіёну непасрэдна ў праграме; -\n - магчымасць аўтаномнай працы з дадзенымі Вікіпэдыі (загрузіце POI з Вікіпеэдыі) з\'яўляецца цудоўным інструмэнтам для падарожнікаў; -\n - магчымасць адлюстравання звестак на мапе, напрыклад слой для пракладкі маршруту або слой з запісам GPX-следу, з POI, упадабанымі, ізалініямі вышынь, грамадзкім транспартам, дадатковымі мапамі з магчымасцю налады ўзроўню празрыстасці; +\n - поўнасцю аўтаномная праца (захаванне вектарных або растравых мапаў у памяці прылады); +\n - кампактная вектарная мапа для ўсяго cвету; +\n - неабмежаваная колькасць спампоўванняў мапаў асобнай краіны або рэгіёну непасрэдна ў праграме; +\n - магчымасць аўтаномнай працы з данымі Вікіпедыі (спампоўванне POI з Вікіпедыі) з\'яўляецца цудоўным інструментам для падарожнікаў; +\n - магчымасць адлюстравання звестак на мапе, напрыклад пласт для пракладкі маршруту або пласт з запісам GPX-следу, з POI, улюбёнымі, ізалініямі вышынь, грамадскім транспартам, дадатковымі мапамі з магчымасцю налады ўзроўня празрыстасці; \n \n - аўтаномны пошук адрасоў і POI; \n - аўтаномная пракладка маршрутаў для сярэдніх адлегласцяў; -\n - рэжымы для пешаходнай, аўтамабільнай і веланавігацыі з: +\n - рэжымы для пешаходнай, аўтамабільнай і роварнай навігацыі з: \n - пераключэннем паміж дзённым і начным рэжымамі; \n - маштабаваннем мапы ў адпаведнасці з хуткасцю руху; \n - арыентацыяй мапы па компасе або кірунку руху; \n - паказ палос руху і абмежаванняў хуткасці, галасавое суправаджэнне -\n +\n" - Стварыць фільтар POI - Від транспарту: - Выберыце від транспарту + Стварыць фільтр POI + Тып транспарту: + Абярыце тып транспарту Узыход: %1$s \nЗаход: %2$s Узыход/заход @@ -324,74 +324,74 @@ - Сканфігураваць экран + Наладзіць экран Палосы руху - Пазьбягаць дарог без пакрыцьця - Пазьбягаць паромаў + Пазбягаць дарог без пакрыцця + Пазбягаць паромаў Пазбягаць… Пазбягаць, напрыклад, платных і дарог без пакрыцця, паромаў. Люмінесцэнтныя маршруты Лінейка - Кірунак погляду - Празрыстае афармленьне + Накірунак погляду + Празрыстыя віджэты - Запусьціць у\n фонавым рэжыме + Запусціць у +\n фонавым рэжыме Спынiць\n фонавы рэжым - Iнтэрвал абуджэньня GPS: %s + Iнтэрвал абуджэння GPS: %s Безперапынны - Націсніце значок блакавання каб разблакаваць экран + Націсніце значок блакавання, каб разблакаваць экран Назва вуліцы - Сканфігураваць экран + Наладзіць экран Дзе я - Блякаваць экран + Заблакаваць экран Компас - Вярнуцца да стандартных + Скінуць да прадвызначаных Паркоўка Запіс GPX - Хуткасьць - Пункт прызначэньня + Хуткасць + Пункт прызначэння Вышыня Час у дарозе Наступны паварот Наступны паварот (малы) Паварот праз адзін Малая мапа маршруту - Блякаваць экран - Разблякіраваць экран + Заблакаваць экран + Разблакаваць экран Экран заблакаваны - Задайце інтэрвал абуджэньня: + Задайце інтэрвал абуджэння: Камеры хуткасці Абмежаванні руху - Пазьбягаць платныя дарогі - Працягнуць прытрымлівацца папярэдняй нескончанай навігацыі? (%1$s сэкундаў) + Пазбягаць платных дарог + Працягнуць прытрымлівацца папярэдняй незавершанай навігацыі\? (%1$s секунд) Чаканне пазіцыі для разліку маршруту Гадзін Хвiлiн Аўтамабіль прыпаркаваны ў - Абярыце хуткасьць сімуляцыі - Выдзелена памяці %1$s МБ (Абмежаваньне Android %2$s МБ, Dalvik %3$s МБ). - Выдзеленая памяць - Усяго фізычнай памяці занятай праграмай %1$s МБ (Dalvik %2$s МБ, іншае %3$s МБ). -Прапарцыйнай памяці %4$s МБ (Абмежаваньне Android %5$s МБ, Dalvik %6$s МБ). - Усяго фізічнай памяці + Абярыце хуткасць сімуляцыі + Адведзена памяці %1$s МБ (Абмежаванне Android %2$s МБ, Dalvik %3$s МБ). + Адведзеная памяць + Агулам фізічнай памяці занятай дадаткам %1$s МБ (Dalvik %2$s МБ, іншае %3$s МБ). Прапарцыйнай памяці %4$s МБ (Абмежаванне Android %5$s МБ, Dalvik %6$s МБ). + Фізічнай памяці агулам Пачатковы пункт занадта далёка ад бліжэйшай дарогі. Агульныя месцы Забраць машыну са стаянкі - Папярэджаньне - Напамін аб абмежаванні часу паркоўкі аўтамабіля ўжо дададзены ў каляндар. Вам будзе неабходна яго выдаліць ўручную. + Папярэджанне + Напамін аб абмежаванні часу паркоўкі аўтамабіля ўжо дададзены ў каляндар. Вам будзе неабходна яго выдаліць ўласнаручна. Задайце абмежаванне часу стаянкі - Выдаліць пазнаку прыпаркаванага аўтамабіля\? - Выдаліць пазнаку стаянкі - Выберыце тып паркоўкі - З абмежаваньнем па часе - Без абмежаваньня па часе + Выдаліць адмеціну прыпаркаванага аўтамабіля\? + Выдаліць адмеціну стаянкі + Абярыце тып паркоўкі + З абмежаваннем па часе + Без абмежавання па часе Дадаць напамін ў каляндар Час стаянкі абмежаваны Час стаянкі неабмежаваны @@ -403,7 +403,7 @@ Убудова месца паркоўкі дазваляе запісаць дзе быў прыпаркаваны ваш аўтамабіль і колькі часу засталося ў выпадку абмежаванай па часе стаянкі. Месца паркоўкі і час відаць на панэлі кіравання OsmAnd і на віджэце на экране з мапай. У каляндар Android можна дадаць напамін. Месца паркоўкі Пазначыць месца стаянкі - Выдаліць пазнаку месца стаянкі + Выдаліць адмеціну месца стаянкі Агульны Ідэнтыфікуемы Адсочвальны @@ -417,42 +417,42 @@ Палігоны Рэжым візуалізацыі Аптымізаваць мапу для - Мінімальны ўзровень маштабу з адлюстраваньнем ізаліній вышынь: + Мінімальны ўзровень маштабу з адлюстраваннем ізаліній вышынь: Паказваць ізалініі вышынь Адлюстроўваць больш дэталяў на мапе. - Паказаць больш дэталей мапы - Дадзеныя маршрутызацыі + Паказаць больш дэталяў мапы + Даныя маршрутызацыі Фармат Пошук POI Пошук па адрасе Каардынаты - Пошук грамадзкага транспарту - Спосаб пошуку ўпадабаных + Пошук грамадскага транспарту + Спосаб пошуку ўлюбёных Аўтаномная навігацыя OsmAnd часова недаступная. Левабаковы рух - Для краін, дзе людзі ездзяць па левай старане дарогі. + Для краін, дзе людзі ездзяць па леваму боку дарогі. - Пачатковая кропка не вызначаная - Становішча пакуль ня вызначанае - Зьмяніць празрыстасьць (0 - празрысты, 255 - непразрысты) - Скасаваць cьцягваньне файлу? - Дзякуй за карыстаньне OsmAnd. Спампаваць рэгіянальныя даныя для аўтаномнага карыстання можна праз «Налады» → «Кіраваць файламі мапаў». Пасьля гэтага вы зможаце глядзець мапу, шукаць адрасы, бачыць POI, грамадзкі транспарт і іншае. - Базавая мапа абраная для спампоўкі, бо неабходная для карэктнай працы. + Пачатковы пункт не вызначаны + Становішча пакуль не вызначана + Змяніць празрыстасць (0 - празрысты, 255 - непразрысты) + Скасаваць cпампоўванне файла\? + Дзякуй за выкарыстанне OsmAnd. Спампаваць рэгіянальныя даныя для аўтаномнага выкарыстання можна праз «Налады» → «Кіраваць файламі мапаў». Пасля гэтага вы зможаце глядзець мапу, шукаць адрасы, бачыць POI, грамадскі транспарт і іншае. + Базавая мапа абраная для спампоўвання, бо неабходная для карэктнай працы. Нічога не знойдзена. Калі вы не знайшлі свой рэгіён, вы можаце стварыць мапу самастойна (гл. https://osmand.net). Сеціўныя і кэшаваныя растравыя мапы - Стандартныя мапы (вэктарныя) - Сцягванне і кіраванне файламі мапаў, што захоўваюцца на вашым прыстасаванні. - Актывуйце модуль «Анлайн мапаў», каб выбіраць розныя крыніцы для мапаў + Стандартныя мапы (вектарныя) + Спампоўка і кіраванне файламі мапаў, што захоўваюцца на вашай прыладзе. + Уключыце ўбудову «Сеціўныя мапы», каб мець магчымасць абраць розныя крыніцы для мапаў Сеціўныя і растравыя мапы - Карыстацца сеціўнымі мапамі (cцягнуць і захоўваць фрагменты на картцы памяці). + Выкарвстоўваць сеціўныя мапы (cпампаваць і захоўваць фрагменты на картцы памяці). Сеціўныя мапы - Наладзьце крыніцы сеціўных або кэшаваных растравых мапаў. + Наладзіць крыніцы сеціўных або кэшаваных растравых мапаў. - З дапамогай гэтай убудовы вы можаце атрымаць доступ да мноства відаў сеціўных мапаў (тайлавых альбо растравых), ад папярэдне створаных фрагментаў OpenStreetMap (Mapnik) да спадарожнікавых здымкаў і пластоў адмысловага прызначэння, такіх як мапы надвор\'я, кліматычныя мапы, геалагічныя мапы, пласты зацямнення вышынь і г.д. + З дапамогай гэтай убудовы вы можаце атрымаць доступ да мноства тыпаў сеціўных мапаў (тайлавых альбо растравых), ад папярэдне створаных фрагментаў OpenStreetMap (Mapnik) да спадарожнікавых здымкаў і пластоў адмысловага прызначэння, такіх як мапы надвор\'я, кліматычныя мапы, геалагічныя мапы, пласты зацямнення вышынь і г.д. \n -\nЛюбая з гэтых мапаў можа быць выкарыстана ў якасці асноўнай (базавай) мапы для адлюстравання на экране OsmAnd або ў выглядзе накладання / падкладкі да іншай базавай мапы (стандартнай аўтаномнай мапы OsmAnd). Для таго каб зрабіць любую падкладку больш бачнай, некаторыя элементы вектарнай мапы OsmAnd могуць быць па жаданні лёгка схаваныя праз меню «Налады мапы». +\nЛюбая з гэтых мапаў можа быць выкарыстана ў якасці асноўнай (базавай) мапы для адлюстравання на экране OsmAnd або ў выглядзе накладкі / падкладкі да іншай базавай мапы (стандартнай аўтаномнай мапы OsmAnd). Для таго каб зрабіць любую падкладку больш бачнай, некаторыя элементы вектарнай мапы OsmAnd могуць быць па жаданні лёгка схаваныя праз меню «Налады мапы». \n \nТайлавыя мапы могуць быць атрыманыя непасрэдна з дапамогай сеціўных крыніц або могуць быць падрыхтаваныя для выкарыстання ў аўтаномным рэжыме (і ўласнаручна скапіраваныя ў каталог даных OsmAnd) як база даных SQLite, якую можна атрымаць з дапамогай розных інструментаў падрыхтоўкі мапаў іншых вытворцаў. @@ -461,10 +461,10 @@ Убудова адлюстроўвае параметры для распрацоўкі і адладкі функцый, такіх як, праверка або мадэляванне маршруту, адлюстраванне прадукцыйнасці адмалёўкі, праверка галасавых падказак. Гэтыя налады прызначаныя для распрацоўшчыкаў і не патрэбныя звычайнаму карыстальніку. - Дадатковыя модулі + Убудовы - Модулі актывуюць дадатковыя налады і магчымасці. - Дадатковыя модулі + Убудовы актывуюць дадатковыя налады і магчымасці. + Убудовы З дапамогай гэтай убудовы OsmAnd можа быць выкарыстаны для паляпшэння OSM праз стварэнне альбо змену аб\'ектаў OSM POI, адкрыццё або каментаванне OSM-нататак, адпраўленне запісаных GPX-файлаў. OSM развіваецца грамадствам. Гэта глабальны праект па стварэнні свабоднай мапы. Для атрымання дадатковай інфармацыі, калі ласка, наведайце https://openstreetmap.org. Актыўны ўдзел цэніцца, і ўнёскі могуць быць зробленыя непасрэдна праз OsmAnd, калі вы ўкажаце даныя свайго рахунка OSM у наладах. Вектарныя мапы могуць адлюстроўвацца хутчэй. Падтрымліваецца не ўсімі прыладамі. @@ -472,23 +472,23 @@ Для распрацоўшчыкаў OsmAnd Хуткая адмалёўка Пратэставаць галасавыя падказкі - Для гэтай мясцовасьці мапа адсутнічае. Сцягніце мапу з дапамогай «Налады» («Кіраваць файламі мапаў») або пераключыцца на выкарыстанне сеткавых мапаў. + Для гэтай мясцовасці мапа адсутнічае. Спампуйце мапу з дапамогай «Налады» («Кіраваць файламі мапаў») або пераключыцца на выкарыстанне сеціўных мапаў. - Адаслаць GPX файлы ў OSM? - Бачнасьць - Цэтлікі - Апісаньне + Адаслаць GPX-файлы ў OSM\? + Бачнасць + Пазнакі + Апісанне Калі ласка, пазначце імя і пароль карыстальніка OSM, каб адсылаць GPX-файлы. Падтрымка - Падтрымка новых уласьцівасьцяў - Ахвяраваць, каб убачыць новыя магчымасці, рэалізаваныя ў прыкладанні. + Падтрымка новых магчымасцяў + Ахвяраваць, каб убачыць новыя магчымасці, рэалізаваныя ў дадатку. Паказваць маштаб Інфармацыя Вярнуцца да становішча - Рэжым даступнасьці + Рэжым даступнасці Уключае функцыі для карыстальнікаў з абмежаваннямі. - Паводле сістэмных наладаў Андроіда + Паводле сістэмных налад Android Назад да меню Аддаліць Наблізіць @@ -519,75 +519,75 @@ налева наперад гадзін у кірунку - Дакладнасьць + Дакладнасць Вышыня - Няма зьвестак - Па кірункам сьвету (8 сэктараў) - Па стрэлцы гадзіньніка (12 сэктараў) + Інфармацыя адсутнічае + Па накірункам свету (8 сектараў) + Па стрэлцы гадзінніка (12 сектараў) Стыль напрамку - Абярыце стыль як паказваць адносныя напрамкі падчас руху. - Уключыць аўтаматычнае агалошваньне - Выключыць аўтаматычнае агалошваньне + Абярыце стыль адлюстроўвання адносных напрамкаў падчас руху. + Уключыць аўтаматычнае агалошванне + Выключыць аўтаматычнае агалошванне Я тут Змяняць маштаб гарызантальнымі рухамі трэкболу. - Карыстацца трэкболам для зьмены маштабу + Карыстацца трэкболам для змены маштабу Налады даступнасці. Даступнасць - Недастаткова памяці каб паказаць абраную прастору + Недастаткова памяці, каб паказаць абраную прастору Флюарэсцэнтныя пласты - Ужываць флюарэсцэнтныя колеры для трэкаў і шляхоў. - Аўтаномнае рэдагаваньне + Ужываць флюарэсцэнтныя колеры для слядоў і шляхоў. + Пазасеціўнае рэдагаванне Заўсёды выкарыстоўваць аўтаномнае рэдагаванне. - Змены POI у прыкладанні не паўплываюць на cпампаваныя файлы мапаў, змены захоўваюцца як файлы на вашай наладзе. - Перадача… - {0} POI/Нататкі былі адасланы - Адаслаць усё + Змены POI у дадатку не паўплываюць на cпампаваныя файлы мапаў, змены захоўваюцца як файлы на вашай прыладзе. + Запампоўка… + {0} POI/Нататкі запампаваныя + Запампаваць усё - Адаслаць зьмены ў OSM - Выдаліць зьмены - Асінхроннае рэдагаваньне OSM: + Адаслаць змены ў OSM + Выдаліць змены + Асінхроннае рэдагаванне OSM: OSM POI/нататкі захаваныя на прыладзе Паказаць і кіраваць OSM POI/нататкамі ў базе даных на прыладзе. - Задайце інтэрвал сеткавага сачэння. - Інтэрвал сеткавага сачэньня + Задайце інтэрвал сеціўнага сачэння. + Інтэрвал сеціўнага сачэння Задайце вэб-адрас з наступнымі параметрамі: lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}. - Вэб-адрас для сеткавага сачэньня - Запісвайце сьлед выкарыстоўваючы GPX-віджэт ці пункт мэню \"Запіс падарожжа\". - Паказаць бягучы сьлед + Вэб-адрас для сеціўнага сачэння + Запісвайце след выкарыстоўваючы GPX-віджэт ці пункт меню \"Запіс падарожжа\". + Паказаць бягучы след - Вы можаце сьцягнуць ці абнавіль %1$s мап. - Бясплатная вэрсія + Вы можаце спампаваць ці абнавіць %1$s мапаў. + Бясплатная версія Паказваць апісанні POI. - Паўночная Амэрыка - Паўночная Амэрыка - Злучаныя Штаты - Цэнтральная Амэрыка - Паўднёвая Амэрыка - Эўропа - Эўропа - Францыя - Эўропа - Германія + Паўночная Амерыка + Паўночная Амерыка - Злучаныя Штаты + Цэнтральная Амерыка + Паўднёвая Амерыка + Еўропа + Еўропа - Францыя + Еўропа - Германія РФ Афрыка Азія Аўстралія і Акіянія - Сусьветныя і тэматычныя мапы - Сусьветная Вікіпэдыя - Галасавыя падказкі (запісаныя, абмежаваныя магчымасьці) + Сусветныя і тэматычныя мапы + Сусветная Вікіпедыя + Галасавыя падказкі (запісаныя, абмежаваныя магчымасці) Галасавыя падказкі (TTS, пажадана) - Вікіпэдыя (пазасеціўная) + Вікіпедыя (пазасеціўная) Вызначанае карыстальнікам - Файл з экспартаванымі ўпадабанымі ўжо існуе. Замяніць яго? + Файл з экспартаванымі ўлюбёнымі ўжо існуе. Замяніць яго\? Налады профіля Навігацыя - Вызначыць налады навігацыі. + Вызначыць параметры навігацыі. Агульныя налады Кіраваць файламі мапаў Агульныя - Налады экрану і агульныя налады прыкладання. - Агульныя налады праграмы - Ваша імя карыстальніка OSM + Налады экрана і агульныя налады дадатка. + Агульныя налады дадатка + Вашае імя карыстальніка OSM Патрэбна для прадстаўлення ў openstreetmap.org. Ваш пароль OSM @@ -600,24 +600,24 @@ - Няма вольнага месца каб сьцягнуць %1$s МБ (вольна: %2$s). + Не стае вольнага месца для спампоўвання %1$s МБ (вольна: %2$s). Спампаваць {0} файл(аў)\? Выкарыстоўваецца {1} МБ. (Зараз ё {2} МБ вольнага месца.) Празрыстая тэма - Свойскія бібліятэкі не падтрымліваюцца гэтай прыладай. - Ініцыалізацыя свойскіх бібліятэк… + Уласныя бібліятэкі не падтрымліваюцца гэтай прыладай. + Ініцыалізацыя ўласных бібліятэк… Аўтаматычнае цэнтраванне мапы Час, праз які мапа вернецца да цяперашняга становішча. - Аўтаматычнае цэнтраваньне толькі падчас навігацыі - Аўтаматычнае цэнтраваньне толькі падчас навігацыі. - Аўтаматычнае цэнтраваньне падчас карыстаньня. - Налады вэктарнай адмалёўкі - Ніжні і верхні слаі + Аўтаматычнае цэнтраванне толькі падчас навігацыі + Аўтаматычнае цэнтраванне толькі падчас навігацыі. + Аўтаматычнае цэнтраванне падчас выкарыстання. + Налады вектарнай адмалёўкі + Ніжні/верхні пласты Налады крыніцы мапы - Налады вэктарнай мапы + Налады вектарнай мапы Выдаліць %1$s? Мікрараён Вёска @@ -625,80 +625,80 @@ Мястэчка Горад - Спыніць мадэляваньне - Пачаць мадэляваньне + Спыніць мадэляванне + Пачаць мадэляванне - Файл ня можа быць пераназваны. + Немагчыма змяніць назву файла. Файл з такой назвай ужо існуе. GPX-маршрут - Некалькі катэгорый POI знойдзены, што адпавядаюць запыту: - Лякальных зьвестак для пошуку POI няма. + Знойдзена екалькі катэгорый POI, што адпавядаюць запыту: + Лакальныя даныя для пошуку POI адсутнічаюць. Пошук па назве Файл POI \'%1$s\' залішні і можа быць выдалены. - Лякальны файл для падтрымкі зьменаў у POI ня знойдзены і ня можа быць створаны. - Абнавіць да OsmAnd+ - Сьцягнуць новую версію праграмы каб мець магчымасць выкарыстоўваць новыя файлы мап. + Лакальны файл для падтрымкі змен у POI не знойдзены і не можа быць створаны. + Палепшыць да OsmAnd+ + Спампаваць новую версію дадатка, каб мець магчымасць выкарыстоўваць новыя файлы мапаў. - Сеткавы Nominatim - Вызначэньне становішча… + Сеціўны Nominatim + Вызначэнне становішча… Маё становішча (знойдзена) Адрас… - Упадабаныя… + Улюбёныя… Нявызначана - Цяперашні цэнтр мапы + Бягучы цэнтр мапы Пачатак: Шукаць навокал Маршрут захаваны як \'%1$s\'. Назва файла: Файл з такой назвай ужо існуе. - Адаслаць GPX-файлы ў OSM-супальнасць для паляпшэння мап. + Адаслаць GPX-файлы ў OSM-супальнасць для паляпшэння мапаў. %1$d з %2$d аб\'ектаў адасланыя. Адаслаць у OSM - Паказаць больш дэталей мапы + Паказаць больш дэталяў мапы Паказаць некаторыя дэталі вектарнай мапы (дарогі і іншыя) на меншым маштабе. - Упадабаныя пункты выдаленыя. - Вы збіраецеся выдаліць %1$d упадабаных і %2$d груп упадабаных. Вы ўпэўненыя? + Улюбёныя пункты выдаленыя. + Вы збіраецеся выдаліць %1$d улюбёных і %2$d груп улюбёных. Вы ўпэўненыя\? Дом Сябры Месцы Іншае - Назва + Імя Катэгорыя Не, дзякуй - Сьцягнуць асноўную мапу сьвету, каб мець агляд усяго сьвету на малых узроўнях набліжэння. - Сьцягнуць даныя, каб выкарыстоўваць мапы аўтаномна. + Спампаваць асноўную мапу свету, каб мець агляд усяго свету на малых узроўнях набліжэння. + Спампаваць даныя, каб выкарыстоўваць мапы аўтаномна. " \n \nДоўга ўтрымлівайце для паказу параметраў" - Лякальная вэрсія + Лакальная версія %1$d з %2$d аб\'ектаў дэактываваныя. %1$d з %2$d аб\'ектаў выдаленыя. %1$d з %2$d аб\'ектаў актываваныя. Няма аб\'ектаў да %1$s - Вы зьбіраецеся %1$s %2$s аб\'ектаў. Працягнуць? + Вы збіраецеся %1$s %2$s аб\'ектаў. Працягнуць\? Кіраваць файламі мапаў. Актываваць Дэактываваць - Зьвесткі POI + Даныя POI Адрас - Зьвесткi грамадзкага транспарту - Дадзеныя мапы + Звесткi грамадскага транспарту + Даныя мапы Не актыўны Галасавыя падказкі (TTS) Галасавыя падказкі (запісаныя) - Зьвесткі POI - TTS голас + Даныя POI + Голас TTS Новы пошук - Выберыце памер шрыфта для назваў на мапе. + Абярыце памер шрыфту для назваў на мапе. Памер шрыфту мапы Адладачная інфармацыя пра адмалёўку Паказаць прадукцыйнасць адмалёўкі. @@ -706,38 +706,40 @@ - Распакоўваюцца новыя дадзеныя… - Абраны сеткавы навігацыйны сэрвіс, але вы не злучаныя з Інтэрнэтам. + Распакоўваюцца новыя даныя… + Вы абралі сеціўны навігацыйны сэрвіс, але злучэнне з Інтэрнэтам адсутнічае. Мова не падтрымліваецца - Абраная мова не падтрымліваецца устаноўленым Android TTS (пераўтварэньне тэксту ў гук). Пашукаць іншы TTS у краме? Калі не, то будзе выкарыстоўвацца другая ўстаноўленая мова TTS. - Адсутнічаюць дадзеныя - Пайсці ў краму каб сьцягнуць абраную мову? - Развярнуць кірунак GPX - Выкарыстоўваць цяперашні пункт прызначэньня + Абраная мова не падтрымліваецца ўсталяваным Android TTS (пераўтварэнне тэксту ў гук). Пашукаць іншы TTS у краме\? Калі не, то будзе выкарыстоўвацца іншая ўсталяваная мова TTS. + Даныя адсутнічаюць + Перайсці ў краму, каб спампаваць абраную мову\? + Развярнуць накірунак GPX + Выкарыстоўваць бягучы пункт прызначэння Прайсці ўвесь шлях - Для гэтага рэгіёну даступныя лякальныя вэктарныя мапы.\n\t\n\tДля іх выкарыстаньня абярыце пункт мэню \'Налада мапы\' → \'Крыніца мапы…\' → \'Лякальныя вэктарныя мапы\'. + Для гэтага рэгіёну даступныя лакальныя вектарныя мапы. +\n\t +\n\tДля іх выкарыстання абярыце пункт меню \'Наладзіць мапы\' → \'Крыніца мапы…\' → \'Лакальныя вектарныя мапы\'. Вывад галасавых падказак Абярыце канал для галасавых падказак. - Канал телефанаваньня (таксама спыняе музыку з дынамікаў) - Канал апавяшчэньня - Мэдыя/музычны канал - Прыкладанне не можа спампаваць слой мапы %1$s. Пераўсталёўка можа дапамагчы. - Змяніць празрыстасьць накладзенага слою. - Празрыстасьць накладаньня + Канал телефанавання (таксама спыняе музыку з дынамікаў) + Канал апавяшчэння + Медыя/музычны канал + Дадатак не можа спампаваць пласт мапы %1$s. Можа дапамагчы пераўсталёўка. + Змяніць празрыстаць накладзенага пласта. + Празрыстасць накладкі Змяніць празрыстасць асноўнай мапы. - Празрыстасьць асноўнай мапы + Празрыстасць асноўнай мапы Мапа падкладкі… Мапа падкладкі Абраць мапу для падкладкі. - Мапа пакрыцьця… - Мапа для накладаньня + Накладзеная мапа… + Мапа для накладання Абраць мапу для накладання. Мапа ўжо ўсталяваная, «Налады» будуць абноўленыя. - Выберыце (растравыя) мапы для ўсталёўкі або абнаўлення. - Не магчыма выканаць аперацыю без падлучэнне да Інтэрнэту. + Абярыце (растравыя) мапы для ўсталёўкі або абнаўлення. + Немагчыма выканаць аперацыю без падлучэнне да Інтэрнэту. Усталяваць яшчэ… - Выкарыстоўваць растравыя мапы для ўсяго да гэтага ўзроўню. - Мінімальнае ўзровнь набліжэння для вектарных мапаў + Выкарыстоўваць агульныя растравыя мапы да гэтага ўзроўня. + Мінімальны ўзровень набліжэння для вектарных мапаў @@ -745,8 +747,8 @@ Немагчыма апрацаваць запыт \'%s\'. Пошук па геаграфічнаму становішчу Сістэмная - Выбар мовы адлюстравання (набудзе сілу пасля перазапуску OsmAnd). - Мова інтэрфэйсу + Абраць мову адлюстравання (набудзе моц пасля перазапуску OsmAnd). + Мова інтэрфейсу няпоўны @@ -756,23 +758,24 @@ - Змяніць адзінкі вымярэння адлегласцей. + Змяніць адзінкі вымярэння адлегласцяў. Адзінкі даўжыні Мілі/футы Мілі/ярды Кіламетры/метры ярд фут - мл/г - мл + м/г + міл Даслаць каардынаты праз - Месцазнаходжаньне: %1$s\n%2$s - Каб убачыць месцазнаходжаньне націсьніце на спасылку %1$s ці android-спасылку %2$s + Месцазнаходжанне: %1$s +\n%2$s + Каб убачыць месцазнаходжанне націсніце на спасылку %1$s ці android-спасылку %2$s Даслаць каардынаты Даслаць каардынаты - GPX-кропка «{0}» дададзеная - Дадаць кропку да запісанага GPX-сьледу - Дадаць GPX кропку + GPX-пункт «{0}» дададзены + Дадаць пункт да запісанага GPX-следу + Дадаць пункт GPX Адміністрацыйны Перашкода Адукацыя @@ -782,7 +785,7 @@ Геакэшынг Ахова здароўя Гістарычны - Землекарыстаньне + Землекарыстанне Вольны час Антрапагеннае Ваеннае @@ -794,129 +797,129 @@ Ежа Турызм Транспарт - Індэксаваньне адрасоў… - Індэксаваньне мапаў… - Індэксаваньне POI… + Індэксаванне адрасоў… + Індэксаванне мапаў… + Індэксаванне POI… Індэксуецца транспарт… км км/г м Састарэлы фармат даных мапы «{0}» не падтрымліваецца Бліжэйшыя POI - Свой фільтр - Сеткавы NameFinder - Чытаньне захаваных фрагмэнтаў… - Недастаткова памяці для лякальнай мапы \'\'{0}\'\' + Адвольны фільтр + Сеціўны NameFinder + Чытанне захаваных фрагментаў… + Недастаткова памяці для лакальнай мапы \'\'{0}\'\' Версія індэкса \'\'{0}\'\' не падтрымліваецца - Аўтаномная навігацыя OsmAnd зьяўляецца экспэрыментальнай і не працуе на доўгіх адлегласьцях каля 20 км. -\n + Аўтаномная навігацыя OsmAnd з’яўляецца эксперыментальнай і не працуе на доўгіх адлегласцях каля 20 км. +\n \nНавігацыя часова пераключаецца на сэрвіс CloudMade. - Указаны каталог не знойдзены. + Вызначаны каталог не знойдзены. Каталог захоўвання даных - Усе аўтаномныя даныя ў старой усталяванай праграме будуць падтрымлівацца новай, але ўпадабаныя кропкі трэба экспартаваць са старой версіі і імпартаваць у новую. + Усе аўтаномныя даныя ў старой усталяванай праграме будуць падтрымлівацца новай, але ўлюбёныя пункты патрэбна экспартаваць са старой версіі і імпартаваць у новую. Зборка {0} ўсталяваная ({1}). - Сьцягваецца зборка… + Спампоўваецца зборка… Усталяваць OsmAnd - {0} з {1} {2} МБ? - Не ўдалося атрымаць сьпіс зборак OsmAnd + Не ўдалося атрымаць спіс зборак OsmAnd Загружаюцца зборкі OsmAnd… - Выберыце зборку OsmAnd для ўстаноўкі - Дастасаваньне стану GPS не ўсталяваная. Пашукаць ў краме? - Галасавыя каманды недаступныя. Калі ласка, перайдзіце ў «Налады» → «Налады навігацыі» → «Галасавыя дадзеныя» і абярыце ці сцягніце пакет галасавых падказак. + Абярыце зборку OsmAnd для ўсталёўкі + Дадатак стану GPS не ўсталяваны. Пашукаць ў краме\? + Галасавыя загады недаступныя. Калі ласка, перайдзіце ў «Налады» → «Налады навігацыі» → «Галасавыя даныя» і абярыце ці спампуйце пакунак галасавых падказак. Галасавыя падказкі не абраныя Дзень Ноч Усход/Захад - Сэнсар сьвятла + Датчык святла Абярыце абгрунтаванне пераключэння рэжыму дзень/ноч. Рэжым дзень/ноч - Сьцягнуць {0} файл(ы) ({1} МБ)? + Спампаваць {0} файл(ы) ({1} МБ)\? {0} абрана - Сьцягнутае + Спампаванае Найхутчэйшы шлях - Пазначыць каб разлічваць найхутчэйшы шлях, ці зняць пазнаку для паліўна-ашчаднага шляху. - На маштабе {0} сьцягнуць {1} фрагмэнтаў ({2} МБ) - Сьцягнуць мапу - Выберыце максімальнае павелічэньне для папярэдняй загрузкі - Гэтую мапу нельга сьцягнуць - Бесперапынная адмалёўка - Паказваць бесперапынную адмалёўку замест выявы цалкам. - Не атрымалася адмаляваць абраную вобласьць + Уключыць, каб разлічваць найхутчэйшы шлях, ці выключыць для паліўна-ашчаднага шляху. + На маштабе {0} спампаваць {1} фрагментаў ({2} МБ) + Спампаваць мапу + Абярыце максімальнае павелічэньне для папярэдняй загрузкі + Гэтую мапу немагчыма спампаваць + Безперапынная адмалёўка + Паказваць безперапынную адмалёўку замест выявы цалкам. + Не атрымалася адмаляваць абраную вобласць Адмалёўшчык загружаны - Не атрымалася загрузіць адмалёўнік + Не атрымалася загрузіць адмалёўшчык Адмалёўка вектарнай мапы Гэтае месца… Абярыце стыль адмалёўкі мапы. Паказаць сайт POI Паказаць тэлефон POI фільтраваць - Дысплей высокай рэзалюцыі - Не расцягваць (з размыццём) фрагменты мапы на дысплэях з высокай шчыльнасцю. + Дысплей з высокай раздзяляльнай здольнасцю + Не расцягваць (з размыццём) фрагменты мапы на дысплеях з высокай шчыльнасцю. - Шукаць грамадзкi транспарт - Вынiк пошуку транспарту (няма цэлі): - Вынiк пошуку транспарту ({0} да цэлі): + Шукаць грамадскi транспарт + Вынiк пошуку транспарту (няма пункту прызначэння): + Вынiк пошуку транспарту ({0} да пункту прызначэння): Шукаць транспарт зноў Запісаны голас - Вектарныя мапы не былі загружаны + Вектарныя мапы не былі загружаныя - GPX файлы не знойдзены ў каталогу tracks + GPX-файлаў не знойдзена ў каталогзе слядоў GPX-файлы… Не атрымалася прачытаць GPX-даныя - Лакальныя вектарныя мапы + Пазасеціўныя вектарныя мапы Шукаць транспарт на прыпынку - Правіць POI + Змяніць POI Выдаліць POI У напрамку компаса У напрамку руху Не варочаць (поўнач заўсёды ўверсе) - Абраць раўнаваньне мапы. + Абраць выроўніванне мапы. Арыентацыя мапы - Падрабязнасьці маршруту - Упадабаныя імпартаваныя - GPX-файл з упадабанымі не знойдзены ў {0} - Упадабаныя захаваныя ў {0} - Няма ўпадабаных месцаў для захоўвання + Падрабязнасці маршруту + Улюбёныя імпартаваныя + GPX-файл з улюбёнымі не знойдзены ў {0} + Улюбёныя захаваныя ў {0} + Улюбёныя месцы для захавання адсутнічаюць Не атрымалася загрузіць GPX Даслаць справаздачу - Не атрымалася знайсці спампованых мап на картцы памяці. - Надрукуйце для пошуку POI + На картцы памяці не атрымалася знайсці спампаваных мапаў. + Увядзіце для пошуку POI Усе Дзякуй Яндэксу за дарожную інфармацыю. Яндэкс заторы Маршрут - OSM-нататкі (анлайн) + OSM-нататкі (у сеціве) POI-накладка… Крыніца мапы… - Слаі мапы + Пласты мапы Пошук POI Выкарыстоўвайце трэкбол для перамяшчэння мапы. Выкарыстоўвайце трэкбол Задае максімальна дазволены час чакання для кожнага фонавага вызначэння становішча. - Максімальны час чаканьня вызначэньня каардынат + Максімальны час чакання вызначэння каардынат Дзе я? Навігацыйны сэрвіс OsmAnd Сетка GPS - сэкундаў + секунд хв. Абярыце інтэрвал абуджэння для фонавага рэжыму. Інтэрвал абуджэння GPS - Абяраць крыніцу месцазнаходжання для выкарыстання фонавым сэрвісам. + Абраць крыніцу месцазнаходжання для выкарыстання фонавым сэрвісам. Крыніца каардынат - Адсочвае ваша становішча пры адключаным экране. - Запусьціць OsmAnd у фоне - Фонаваму сэрвісу неабходная інфармацыя пра месцазнаходжаньне. + Адсочвае вашае становішча пры адключаным экране. + Запусціць OsmAnd у фоне + Фонаваму сэрвісу неабходная інфармацыя пра месцазнаходжанне. Схаваць фільтр Паказаць фільтр Фільтраваць @@ -924,14 +927,14 @@ Гук выключаны Абярыце галасавыя падказкі для навігацыі. Галасавыя падказкі - Ініцыялізуюцца галасавыя дадзеныя … - Непадтрымліваемая версія галасавых дадзеных - Абраныя галасавыя дадзеныя пашкоджаны - Абраныя галасавыя дадзеныя не даступныя - Картка памяці не даступная. -\nВы не зможаце бачыць мапу або штосьці знайсці. - Картка памяці толькі для чытання. -\nЗараз можна ўбачыць толькі загружаную мапу, а не загружаць новуя вобласці. + Ініцыялізуюцца галасавыя даныя … + Непадтрымліваемая версія галасавых даных + Абраныя галасавыя даныя пашкоджаныя + Абраныя галасавыя даныя недаступныя + Картка памяці недаступная. +\nВы не зможаце ўбачыць мапу або штосці знайсці. + Картка памяці даступная толькі для чытання. +\nЗараз можна ўбачыць толькі загружаную мапу, а не загружаць новыя вобласці. Файл распакоўваецца… Паварочвайце направа і рухайцеся Рэзка паварочвайце направа і рухайцеся @@ -942,15 +945,15 @@ Развярніцеся і рухайцеся Рухайцеся Далей - Сьцягнуць рэгіёны + Спампаваць рэгіёны Чаканне сігналу… - Шукаць побач з цяперашнім цэнтрам мапы + Шукаць побач з бягучым цэнтрам мапы Шукаць паблізу - Па змаўчаньні - Вэртыкальная + Як у прылады + Вертыкальная Гарызантальная - Арыентацыя экрану - Вертыкальная, гарызантальная, ці як прылада. + Арыентацыя экрана + Вертыкальная, гарызантальная, ці як у прылады. Фармат гадзін працы не можа быць зменены Дадаць новае правіла Маршруты @@ -959,66 +962,66 @@ Далейшы маршрут Папярэдні маршрут Скончыць пошук - Выберыце прыпынак для сходу - ісьці пасьля - ісьці да + Абярыце прыпынак для сходу + ісці пасля + ісці да прыпынкаў на шляху Даўжыня маршруту Транспарт - Паказаць прыпынкі грамадзкага транспарту на мапе. + Паказаць прыпынкі грамадскага транспарту на мапе. Паказваць прыпынкі транспарту - Навігацыйнае дастасаваньне OsmAnd - Дадзеныя POI былі абноўленыя ({0} аб\'ектаў загружана) - Не атрымалася абнавіць лакальны POI-спіс - Не атрымалася загрузіць даных з сервера - Для гэтай мясцовасьці адсутнічаюць лякальныя дадзеныя пра POI + Навігацыйны дадатак OsmAnd + Даныя POI былі абноўленыя ({0} аб\'ектаў загружана) + Не атрымалася абнавіць лакальны спіс POI + Не атрымалася загрузіць даныя з сервера + Для гэтай мясцовасці адсутнічаюць пазасеціўныя даныя пра POI Павелічэнне маштабу дазваляе вам абнавіць POI Абнавіць POI - Абнавіць лякальныя даныя з Інтэрнэту? + Абнавіць лакальныя даныя з Інтэрнэту\? Горад: {0} Вуліца: {0}, {1} - Скрыжаваньне: {0} х {1} праз {2} + Скрыжаванне: {0} х {1} праз {2} Будынак: {0}, {1}, {2} - Упадабанае - Адсылка дадзеных… - Адсылка… + Улюбёнае + Запампоўванне даных… + Запампоўванне… Нічога не знойдзена Пошук… Пошук адрасу… - Сеткавы пошук праз OSM Nominatim - Інтэрнэт-пошук: горад, вуліца, дом + Сеціўны пошук праз OSM Nominatim + Сеціўны пошук: горад, вуліца, дом Пазасеціўны пошук Сеціўны пошук - Максімальнае павелічэньне онлайн мапаў - Не праглядаць онлайн фрагменты мапы для узроўняў маштабавання за межамі гэтага. - Агульная адлегласьць %1$s, час у дарозе %2$d г. %3$d хв. + Максімальнае павелічэнне сеціўных мапаў + Не праглядаць сеціўныя фрагменты мапы для ўзроўняў маштабавання за межамі гэтага. + Агульная адлегласць %1$s, час у дарозе %2$d г. %3$d хв. Абраць сеціўны ці пазасеціўны сэрвіс навігацыі. Сэрвіс навігацыі - Каталог на карце памяці недаступны для захоўваньня! - Сьцягнуць {0} - {1} ? - Лакальная мапа для {0} ужо існуе ({1}). Абнавіць ({2})? + Каталог на картцы памяці непрыдатны для захавання! + Спампаваць {0} - {1} \? + Пазасеціўная мапа для {0} ужо існуе ({1}). Абнавіць ({2})\? Адрас - Сьцягваецца сьпіс даступных рэгіёнаў… + Спампоўваецца спіс даступных рэгіёнаў… Не ўдалося атрымаць спіс рэгіёнаў з https://osmand.net. - Упадабаны пункт быў зьменены - Няма ўпадабаных месцаў + Улюбёны пункт быў зменены + Улюбёныя месцы адсутнічаюць Замяніць Паказаць маршрут Пачаць навігацыю - Абярыце спачатку месца прызначэньня + Спачатку абярыце пункт прызначэння Навігацыя Гадзіны працы - Адкрыцьцё пакета паправак… - Закрыцьцё пакета паправак… - Захаваньне аб\'екта… - Чытаньне POI… + Адкрыццё набору правак… + Закрыццё набору правак… + Захаванне аб\'екта… + Загрузка POI… Не атрымалася выканаць аўтарызацыю не ўдалося - Канвэртацыя мясцовых/ангельскіх назваў… + Канверсія мясцовых/англійскіх назваў… Загружаюцца вуліцы і дамы… Загружаюцца паштовыя індэксы… Загружаюцца вуліцы… @@ -1026,16 +1029,16 @@ POI Не атрымалася захаваць GPX-файл - Не ўдалося разлічыць маршрут - Не ўдалося разлічыць маршрут + Не атрымалася разлічыць маршрут + Не атрымалася разлічыць маршрут Разлічаны маршрут пусты - Новы шлях разьлічаны, адлегласьць - Вы прыбылі ў пункт прызначэньня - Несапраўдныя каардынаты + Новы шлях разлічаны, адлегласць + Вы прыбылі ў пункт прызначэння + Хібныя каардынаты Вярнуцца да мапы OsmAnd - Дадзеныя загружаюцца… - Чытаньне лякальных зьвестак… - Папярэдні старт OsmAnd скончыўся аварыйна. Хроніка запісаная ў файл {0}. Калі ласка, паведаміце пра праблему й прычапіце файл хронікі. + Даныя загружаюцца… + Чытанне лакальных даных… + Папярэдні старт OsmAnd скончыўся аварыйна. Хроніка запісаная ў файл {0}. Калі ласка, паведаміце пра праблему і дадайце лог. Захаванне GPX-файла… Скончана @@ -1043,10 +1046,10 @@ Выкарыстоўваць Інтэрнэт для разліку маршруту. - Выкарыстоўваць онлайн навігацыю + Выкарыстоўваць сеціўную навігацыю Задаць налады для OpenStreetMap.org (OSM), неабходныя для ўнёска. - Выбар мовы, абнаўленне дадзеных. - Зьвесткі + Выбар мовы, абнаўленне даных. + Даныя Рэдагаванне OSM Дадатковыя налады @@ -1057,14 +1060,14 @@ GPX-след аўтаматычна захаваны ў каталог слядоў падчас навігацыі. Аўтаматычна запісваць след падчас навігацыі Абнавіць мапу - Абнавіць фрагмэнт мапы - Цэль + Абнавіць фрагмент мапы + Мэта - Выбар паміж мясцовымі і ангельскімі назвамі. - Выкарыстоўваць ангельскія назвы - Налады дастасавання + Выбар паміж мясцовымі і англійскімі назвамі. + Выкарыстоўваць англійскія назвы + Налады дадатка Пошук адраса Абраць будынак Абраць вуліцу @@ -1072,37 +1075,37 @@ Абраць краіну Адлюстроўваць напрамак позірку Уключыць 3D-выгляд для мапы. - 3D від + 3D-выгляд Паказаць апошнюю POI-накладку на мапе. Паказаць POI-накладку - Выберыце крыніцу анлайн або кэшаваных фрагментаў мапы. + Абярыце крыніцу сеціўных альбо кэшаваных фрагментаў мапы. Крыніца растравых мапаў Крыніца мапы Выкарыстоўваць Інтэрнэт - Паказаць ваша становішча + Паказаць вашае становішча Паказаць GPS-каардынаты на мапе - Сцягнуць адсутныя фрагменты мапы - Навігацыйнае дастасаваньне + Спампаваць адсутныя фрагменты мапы + Навігацыйны дадатак Пошук Пошук Абраць POI - Знайсці больш + Знайсці яшчэ Шукаць вуліцу Шукаць дом - Выбраць рэгіён са сьпісу - Абраць скрыжаваньне + Абраць рэгіён са спіса + Абраць скрыжаванне Бліжэйшыя паслугі - Ваджэнне + Кіраванне Язда на ровары Хада У цэнтры - Зьнізу - Увядзіце шырату й даўгату ў абраным фармаце (D - градусы, M - хвіліны, S - сэкунды) + Знізу + Увядзіце шырату і даўгату ў абраным фармаце (D - градусы, M - хвіліны, S - секунды) Шырата Даўгата DDD.DD @@ -1115,19 +1118,19 @@ Вуліца Будынак Дом - Перакрыжаваньне + Скрыжаванне Абнавіць мапу Стварыць POI - Увядзіце назву ўпадабанага - Упадабанае - Упадабаная кропка «{0}» дададзеная. - Рэдагаваць упадабанае - Выдаліць упадабанае - Выдаліць упадабаную кропку «%s»? - Упадабаная кропка {0} выдаленая. + Увядзіце назву ўлюбёнага + Улюбёнае + Улюбёны пункт «{0}» дададзены. + Рэдагаваць улюбёнае + Выдаліць улюбёнае + Выдаліць улюбёны пункт «%s»\? + Улюбёны пункт {0} выдалены. @@ -1144,23 +1147,23 @@ - Правіць POI + Рэдагаваць POI Стварыць POI Вузел не знойдзены або зручнасць (amenity) складаецца з некалькіх вузлоў, што не падтрымліваецца. Выдаліць {0} (каментар)? Выдаліць POI - POI выдаленая + POI выдалены дадаць - зьмяніць - Дзеянне {0} завершанае. - Не ўдалося выканаць дзеянне {0}. - Адбылася памылка ўводу/вываду падчас выкананні дзеяння {0}. - Адбылася памылка пры чытаньні інфармацыі пра POI + змяніць + Дзеянне {0} завершана. + Не атрымалася выканаць дзеянне {0}. + Падчас выканання дзеяння {0} адбылася памылка ўводу/вываду . + Падчас чытання інфармацыі пра POI адбылася памылка Гадзіны працы Каментар - Зьмена POI - Усе астатнія тэгі захоўваюцца - Зьберагчы + Змена POI + Усе астатнія пазнакі захоўваюцца + Пацвердзіць Фільтраваць Захаваць як @@ -1169,16 +1172,16 @@ Фільтр {0} быў створаны e-mail - Тып факусоўкі камеры - Выберыце тып фокусу ўбудаванай камеры. + Тып факусавання камеры + Абярыце тып фокусу ўбудаванай камеры. Аўтафокус Гіперфакальны фокус - Павялічаная глыбіня рэзкасьці (EDOF) - Фокус усталяваны на бясконцасьці - Макра-рэжым факусоўкі (буйны план) - Камера пастаянна спрабуе сфакусавацца - Прайграваць гук пры фатаграфаваньні - Выберыце, ці трэба прайграваць гук пры здымцы фатаграфій. + Павялічаная глыбіня рэзкасці (EDOF) + Фокус усталяваны на бясконцасці + Макрарэжым факусавання (буйны план) + Камера заўсёды спрабуе сфакусавацца + Прайграваць гук пры фатаграфаванні + Абярыце, ці трэба прайграваць гук пры фатаграфаванні. Харвацкая @@ -1221,13 +1224,13 @@ Шведская Турэцкая Украінская - Віетнамская + В’етнамская Валійская - Паўночная Амэрыка - Канада - Эўропа - Італія - Эўропа - Вялікабрытанія - Аўтаномны разлік адрэзак маршруту OsmAnd - Разлічыць маршрут OsmAnd для першага і апошняга ўчастка маршруту + Паўночная Амерыка - Канада + Еўропа - Італія + Еўропа - Вялікабрытанія + Пазасеціўны разлік адрэзку маршруту OsmAnd + Разлічыць маршрут OsmAnd для першага і апошняга адрэзку маршруту Выкарыстаць паказаны след для навігацыі? Маршрутная інфармацыя Аддаваць перавагу аўтамагістралям @@ -1235,8 +1238,8 @@ Пазбягаць платных дарог Пазбягаць платных дарог - Пазбягаць грунтавых дарог - Пазбягаць грунтавых дарог. + Пазбягаць грунтовых дарог + Пазбягаць грунтовых дарог. Пазбягаць паромных перапраў Пазбягаць перапраў Пазбягаць аўтамагістраляў @@ -1244,12 +1247,12 @@ Абмежаванне вагі Пазначыць дазволеную вагу аўтамабіля на маршрутах. - Капіраваньне файла (%s) у новае месца… - Капіяваньне дадзеных OsmAnd у новае месца (%s)… - Капіяваньне дадзеных OsmAnd… + Капіраванне файла (%s) у новае месца… + Капіраванне даных OsmAnd у новае месца (%s)… + Капіраванне даных OsmAnd… Грузавік Задайце хуткасць вымаўлення для TTS. - Хуткасьць вымаўленьня + Хуткасць вымаўлення Адключыць складаную маршрутызацыю Адмалёўка мапы Матацыкл @@ -1263,33 +1266,33 @@ Сусветная лыжная мапа Абраць GPX… Аддаваць перавагу аўтамагістралям - Імітацыя з выкарыстаньнем разлічанага маршруту - Імітацыя з выкарыстаньнем GPX-сьледу - Профілі прыкладання + Імітацыя з выкарыстаннем разлічанага маршруту + Імітацыя з выкарыстаннем GPX-следу + Профілі дадатка Глабальная карэкцыя вышыні Навігацыйныя знакі ўсяго свету Плацяжы Bitcoin ўсяго свету - Дадаць наступным пунктам прызначэньня - Выбраць месца прызначэньня - Настройкі маршрута - Аўтаномны разлік маршруту ў OsmAnd - Навігацыйныя настройкі - Настройкі маршрутызацыі - Хуткі разлік маршруту ня ўдаўся (%s), пераход на марудны разлік. + Дадаць наступным пунктам прызначэння + Абраць месца прызначэння + Налады маршруту + Пазасеціўны разлік маршруту ў OsmAnd + Налады навігацыі + Налады маршрутызацыі + Хуткі разлік маршруту схібіў (%s), пераход на марудны разлік. Адключэнне дзвюхфазнай маршрутызацыі для аўтамабільнай навігацыі. Навігацыйны знак Пешы турызм Човен - Вы зьбіраецеся выдаліць %1$d зьмены OSM. Вы ўпэўненыя? - Калі ласка, спачатку разьлічыце маршрут + Вы збіраецеся выдаліць %1$d змены OSM. Вы ўпэўненыя\? + Калі ласка, спачатку разлічыце маршрут - З версіі 4.4 Android (KitKat) вы ня можаце загружаць і абнаўляць мапу ў старым каталогу захоўваньня (%s). Скапіяваць усе файлы OsmAnd у новае сховішча? + З версіі 4.4 Android (KitKat) вы не можаце спампоўваць і абнаўляць мапу ў старым каталогу захоўвання (%s). Скапіраваць усе файлы OsmAnd у новае сховішча\? \n Заўвага 1: Вашы старыя файлы застануцца некранутымі (вы можаце выдаліць іх самастойна).          -\n Заўвага 2: У новым месцы захоўваньня будзе немагчыма адначасова выкарыстоўваць файлы ў OsmAnd і OsmAnd+. +\n Заўвага 2: У новым месцы захоўвання будзе немагчыма адначасова выкарыстоўваць файлы ў OsmAnd і OsmAnd+. - Абярыце профілі, бачныя ў праграме. + Абярыце профілі, бачныя ў дадатку. Голас Рознае Лакалізацыя @@ -1300,13 +1303,13 @@ Паказваць становішча заўсёды ў цэнтры - Пункт прызначэньня + Пункт прызначэння Галасавыя падказкі прыпыняюць музыку, а не толькі прыглушаюць яе. - Падзяліцца маршрутам праз GPX файл + Падзяліцца маршрутам праз GPX-файл Маршрут апублікаваны з дапамогай OsmAnd - Няправільны фармат: %s + Хібны фармат: %s Online OSM мапа з выявамі. - Толькі ўручную (націскаць на стрэлку) + Толькі ўласнаручна (націскаць на стрэлку) Паўтараць навігацыйныя інструкцыі праз рэгулярныя прамежкі часу. Паўтараць навігацыйныя інструкцыі Абвяшчэнне прыбыцця @@ -1331,7 +1334,7 @@ - Упадабаныя адасланы праз OsmAnd + Улюбёныя адасланыя праз OsmAnd Разлічыць маршрут паміж пунктамі @@ -1375,7 +1378,7 @@ - Захаваць звесткі як GPX-файл або імпартаваць пункты ва ўпадабаныя? + Захаваць даныя як GPX-файл альбо імпартаваць пункты ва ўлюбёныя\? @@ -1514,8 +1517,8 @@ Прыпыніць навігацыю Пешы горны турызм Візуалізацыя шляху па шкале SAC. - Накладаньне знакаў пешага турызму - Візуалізацыя шляху згодна трасам OSMC. + Накладанне знакаў пешага турызму + Візуалізацыя шляху згодна трас OSMC. Раней Звычайна @@ -1569,7 +1572,7 @@ Улюбёнае з такой назвай ўжо існуе, таму будзе выкарыстана %1$s для прадухілення дублявання назваў. - Націсьніце на любы элемэнт сьпісу для прагляду больш падрабязнай інфармацыі, доўга ўтрымлівайце, каб зьмясьціць у архіў ці выдаліць. Наяўныя дадзеныя на прыстасаваньні (%1$s вольна): + Націсніце на любы элемент спіса для прагляду больш падрабязнай інфармацыі, доўга ўтрымлівайце, каб змясціць у архіў ці выдаліць. Бягучыя даныя прылады (%1$s вольна): Ананімны карыстальнік Вы ўвайшлі як %1$s @@ -1662,11 +1665,11 @@ Стан GPS Парковачнае месца ВЫДАЛІЦЬ ПАЗНАКУ -Апісаньне +Апісанне Рэдагаваць групу - Вам неабходна падлучэнне да Інтэрнэту, каб усталяваць гэты дадатак. + Каб усталяваць гэтую ўбудову неабходна злучыцца з інтэрнэтам. Атрымаць Лыжныя мапы Марскія мапы @@ -1699,7 +1702,7 @@ Так Не Уключыць - Выключыць + Выкл Назад Далей Уключыць @@ -1744,7 +1747,7 @@ Нечаканая памылка Дзеянне {0} Закрыць - Выхад + Выйсці Паказаць Паказаць усе Паказаць на мапе @@ -1789,7 +1792,7 @@ Турыстычная мапа Змяніць назву не атрымалася. д. таму абнаўлялі - Выдана + Выдадзена Улюбёныя Ачысціць гісторыю\? Задайце час затрымкі на экране планавання маршруту. @@ -1834,7 +1837,7 @@ Адчынена Фільтраваць па назве Увядзіце, каб знайсці ўсё - Эўропа - Нідэрлянды + Еўропа - Нідэрланды Прадвызначана Высокая кантрастнасць дарог Немагчыма стварыць мапы ў вызначаным каталозе @@ -1849,10 +1852,10 @@ Скапіраваць файлы даных OsmAnd у новае месца\? Нумары дамоў - Пазбягаць перасячэння нацыянальных меж + Пазбягаць перасячэння нацыянальных межаў Абмежаванне па вышыні - Пазначце вышыню транспартнага сродку для разліку маршруту. - Разумны пераразьлік маршруту + Пазначыць вышыню транспартнага сродку для разліку маршруту. + Разумны пераразлік маршруту Пераразлічваць толькі пачатак маршруту для доўгіх паездак. Выйсці @@ -1864,7 +1867,7 @@ Вікіпедыя Паказаць падрабязнасці - Вікіпэдыя + Вікіпедыя Вы збіраецеся выдаліць %1$d нататкі. Вы ўпэўнены\? Імпартаваць у OsmAnd Прадухіліць аўтаномны запіс @@ -1926,64 +1929,65 @@ Прадвызначана (празрысты сіні) Вам падабаецца OsmAnd? - Ацаніце гэту праграму + Ацаніце гэты дадатак Калі ласка, дайце ацэнку OsmAnd на Google Play Скажыце нам чаму. - Калі ласка, раскажыце нам, што вы хацелі б зьмяніць у гэтай праграме. + Калі ласка, раскажыце нам, што вы хацелі б змяніць у гэтым дадатку. Аўтаматычныя абнаўленні - Не ўдалося адаслаць - Выдаліць зьмены - Адасланыя {0}/{1} + Не атрымалася запампаваць + Выдаліць змены + Запампаваныя {0}/{1} Паўтарыць спробу Памылка: {0} Даступныя абнаўленні адсутнічаюць - Нас цікавіць ваша меркаваньне і ваш водгук важны для нас. + Нас цікавіць вашае меркаванне і ваш водгук важны для нас. Тлусты абрыс Небяспека OsmAnd - Аўтаномныя мапы\nі навігацыя -Налады Панэлі кіраваньня - Картка схавана + Пазасеціўныя мапы +\nі навігацыя +Наладзіць панэль кіравання + Картка схаваная Вярнуць - Прапусьціць + Прамінуць Убудовы - Укласьці POI + Пацвердзіць POI Пазбягаць прыгарадных цягнікоў Пазбягаць выкарыстання прыгарадных цягнікоў Асноўнае Нумар будынка Далей - Адчыняецца ў - Зачыняецца ў + Адчыняецца а + Зачыняецца а Пашыранае Кантакты - Апісаньне + Апісанне Дадаць гадзіны працы Тып POI - Калі ласка, пазначце тып POI. + Калі ласка, вызначце тып POI. GPX-файл з мецазнаходжаннем заўваг. Месцазнаходжанні - Колькасьць радкоў на галоўным экране %1$s + Колькасць радкоў на галоўным экране %1$s выдаліць Працоўныя дні Нядаўнія месцы - Упадабаныя + Улюбёныя Цяпер захаваны а %1$s Паказаць GPX-даныя -POI будуць выдаленыя, як толькі вы загрузіце вашы зьмены +POI будуць выдаленыя, як толькі вы запампуеце вашыя змены Паказваць падчас запуску - Колькасьць радкоў + Колькасць радкоў Вы ўпэўненыя? - Усе незахаваныя зьмены будуць страчаны. Працягваць? + Усе незахаваныя змены будуць страчаны. Працягваць\? Спыніць эмуляцыю свайго становішча. Эмуляваць вашую пазіцыю, выкарыстоўваючы разлічаны маршрут або запісаны GPX-след. - %1$s сьцягваньняў засталося + %1$s спамповак засталося Вікіпедыя Дарогі Звесткі пра ўлюбёнае - Дадаць упадабанае + Дадаць улюбёнае Запіс падарожжа Навігацыя Працуе ў фоне @@ -2005,39 +2009,39 @@ м/с Ізалініі вышынь выключаныя - Сьцягваецца - %1$d файл + Спампоўваецца - %1$d файл Паказваць банер бясплатнай версіі нават у платнай версіі. -Паказваць банэр бясплатнай вэрсіі +Паказваць банэр бясплатнай версіі Набыць - Пазьней - Паўнавартасная вэрсія + Пазней + Поўная версія Зацяненне рэльефу выключана - Калі ласка, актывуйце дадатак «Контурныя лініі» - Калі ласка, актывуйце дадатак «Прагляд марской мапы» + Калі ласка, ўключыце ўбудову «Контурныя лініі» + Калі ласка, ўключяце ўбудову «Прагляд марской мапы» Рэгіёны Рэгіянальныя мапы Сусветныя мапы - Сьцягваньні + Спампоўкі Назва катэгорыі Дадаць новую катэгорыю Калі ласка, выкарыстайце назву катэгорыі, якая яшчэ не існуе. - Мапа аўтадарог не патрэбная, бо вы маеце стандартную (поўную) мапу? Сцягнуць усё роўна? + Мапа аўтадарог не патрэбная, бо вы маеце стандартную (поўную) мапу\? Спампаваць усё роўна\? %1$.1f з %2$.1f Мб %.1f Мб Абнавіць усе (%1$s МБ) - Выкарыстана бясплатных загрузак - Паказвае колькі бясплатных загрузак засталося. + Выкарыстана бясплатных спампоўванняў + Паказвае колькі бясплатных спампоўванняў засталося. Адаслаць - Выберыце, дзе вы хочаце захоўваць мапы і іншыя файлы са зьвесткамі. + Абярыце, дзе вы хочаце захоўваць мапы і іншыя файлы даных. Падзяліцца месцазнаходжаннем геа: «Выключана» непасрэдна запускае экран мапы. Імітаваць першы запуск дадатка QR-код Мапа спампаваная - галасаваньне + Зваротная сувязь Запампаваць Створана OSM POI @@ -2045,12 +2049,12 @@ Паказаць мапу - Новая вэрсія - Адметнасьці + Новая версія + Магчымасці Іншае - Модулі - Часта задаваныя пытаньні - Вэрсіі + Убудовы + Частыя пытанні + Версіі Кантакты Легенда мапы Абнавіць @@ -2061,13 +2065,13 @@ Першыя крокі з OsmAnd Дапамажыце палепшыць OsmAnd Першы запуск - Як загрузіць мапы, усталяваць асноўныя налады. + Як спампаваць мапы, задаць асноўныя налады. Налады навігацыі. - Планаваньне паездкі - Часта задаваныя пытаньні + Планаванне паездкі + Частыя пытанні Агляд мапы Пошук на мапе - Усталёўка і вырашэньне праблемаў + Усталёўка і вырашэнне праблемаў Тэхнічныя артыкулы Падрабязней Што новага ў @@ -2104,7 +2108,7 @@ Шырыня следу GPX Колер следу GPX Пераадкрыць - Выкарыстоўваць мэню + Выкарыстоўваць меню Кнопка «Меню» паказвае панэль кіравання, а не меню Доступ з мапы Выдаліць пункт шляху GPX\? @@ -2112,10 +2116,10 @@ Пазбягаць лесвіц Пазбягаць лесвіц Пазбягаць перасячэння мяжы - Выкарыстоўваць панэль кіраваньня - Панэль кіраваньня ці мэню + Выкарыстоўваць панэль кіравання + Панэль кіравання ці меню Калі ласка, ўвядзіце правільны тып POI або мініце яго. - Прапануецца выбар асноўнага элементу кіравання праграмаю праз панэль кіравання або статычнае меню. Ваш выбар можа быць зменены ў наладах галоўнага экрана. + Прапануецца выбар асноўнага элементу кіравання: праз панэль кіравання або статычнае меню. Ваш выбар можа быць зменены ў наладах галоўнага экрана. Схаваць Якасць відэа @@ -2132,9 +2136,9 @@ Адлегласць: Час: Конныя маршруты - Абнавіць кожны - Сьцягваць толькі праз Wi-Fi - Аўтаабнаўленьне + Абнавіць + Спампоўваць толькі праз Wi-Fi + Аўтаабнаўленне Абнавіць зараз OsmAnd не мае дазволу на выкарыстанне карткі памяці Дадатаа не мае дазволу на выкарыстанне GPS. @@ -2142,15 +2146,15 @@ Дадатак не мае дазволу на выкарыстанне мікрафону. Даступныя мапы Гук - Апошняе абнаўленьне: %s + Апошняе абнаўленне: %s Аўтаматычныя абнаўленні Абярыце галасавыя падказкі Абярыце ці спампуйце галасавыя падказкі для вашай мовы. Абярыце дарогі, якія вы хочаце пазбягаць падчас навігацыі. - Час абнаўленьня -Абнаўленьні: %s - Апошняя зьмена мапы: %s + Час абнаўлення +Абнаўленні: %s + Апошняя змена мапы: %s Не абрана Штогадзінна Штодзённа @@ -2161,7 +2165,7 @@ Пачатковы пункт Вярнуць усё Памер сховішча - Выберыце месяц і краіну + Абярыце месяц і краіну Абраць Выдаліць Дарога заблакаваная @@ -2173,8 +2177,8 @@ Працягласць відэакліпа Верхняя мяжа часу запісанага кліпа. Аб\'ём памяці, які можа быць заняты ўсімі відэакліпамі. - Колькасьць удзельнікаў - Колькасьць правак + Колькасць удзельнікаў + Колькасць правак Паказваць палігоны Знайсці паркоўку Статус @@ -2247,7 +2251,7 @@ Падтрымліваемы рэгіён Калі ласка, ўвядзіце публічнае імя Абярыце адмеціны - Назва файлу зьмяшчае недапушчальны сымбаль + Назва файла змяшчае недапушчальны сімвал Тонкі Сярэдні Тоўсты @@ -2426,10 +2430,10 @@ Нізкая Схаваць ваду Экран %d - Дадаць пазнаку + Дадаць адмеціну Дадаць POI - Зьмяніць стыль мапы - Стыль мапы быў зьменены на \"%s\". + Змяніць стыль мапы + Стыль мапы быў зменены на \"%s\". Дадаць месца паркоўкі Фільтр: не запісваць кропкі ніжэй гэтай хуткасці. Запіс мінімальнага зруху @@ -2441,45 +2445,45 @@ \nКалі ласка, увядзіце поўны код Карэктны поўны OLC \nАпісвае вобласць: %1$s x %2$s - Хуткае дзеяньне + Хуткае дзеянне - Дзеяньне %d - Дадаць пункт да сьледу - Дадаць дзеяньне - Рэдагаваць дзеяньне - Дадаць упадабанае - Дадаць дзеяньне - Выдаліць дзеяньне - Вы ўпэўненыя, што хочаце выдаліць дзеяньне \"%s\"? + Дзеянне %d + Дадаць пункт да следу + Дадаць дзеянне + Рэдагаваць дзеянне + Дадаць улюбёнае + Дадаць дзеянне + Выдаліць дзеянне + Сапраўды выдаліць дзеянне \"%s\"\? Месца - Паказаць/схаваць упадабаныя - Паказаць упадабаныя - Схаваць упадабаныя + Паказаць/схаваць улюбёныя + Паказаць улюбёныя\' + Схаваць улюбёныя Паказаць/схаваць POI Паказаць %1$s Схаваць %1$s Дадаць катэгорыю - Налада мапы + Наладзіць мапу Навігацыя - Пакіньце пустым, каб прымяніць адрас або назву гораду. - Гэта паведамленьне уключанае ў поле камэнтара. - Паведамленьне - Выберыце катэгорыю, каб захаваць упадабанае там. - Пералік POI - Дадаць адну або некалькі катэгорый POI для адлюстраваньня на мапе. + Пакінце пустым, каб ужыць адрас або назву гораду. + Гэтае паведамленне дададзена ў поле камэнтара. + Паведамленне + Абярыце катэгорыю, каб захаваць там улюбёнае. + Спіс POI + Дадаць адну або некалькі катэгорый POI для адлюстравання на мапе. Дадаць стыль мапы Запоўніце ўсе параметры Стылі мапы Крыніцы мапаў Дадаць крыніцу мапы Крыніца мапы была зьменена на \"%s\". - Зьмяніць становішча кнопкі - Назва дзеяньня + Змяніць становішча кнопкі + Назва дзеяння Новая гукавая нататка - Новая відэа-нататка - Новая фота-нататка + Новая відэанататка + Новая фотанататка Голас прыглушаны - Голас актыўны + Голас уключаны Паказваць контуры і пункты глыбіні. Контуры марскіх глыбінь @@ -2521,36 +2525,36 @@ Адкрыты код месцазнаходжання (OLC) Дадаць OSM-нататку Голас укл/адкл - Паказаць дыялог упадабаных - Назва перадусталёўкі - Націск на гэтую кнопку дадасць пазнаку мапы ў цэнтры экрана. - Націск на гэтую кнопку дадасьць GPX-кропку ў сярэдзіне экрана. - Націск на гэтую кнопку дадасць аўдыянататку на мапу ў сярэдзіне экрана. - Націск на гэтую кнопку дадасць відэанататку на мапу ў сярэдзіне экрана. - Націск на гэтую кнопку дадасць фотанататку на мапу ў сярэдзіне экрана. - Націск на гэтую кнопку дадасць OSM-нататку на мапу ў сярэдзіне экрана. - Націск на гэтую кнопку дадасць POI ў сярэдзіне экрана. - Націск на гэтую кнопку адключыць ці ўключыць галасавыя падказкі падчас навігацыі. - Націск на гэтую кнопку дадасьць месца паркоўкі ў сярэдзіне экрана. - Паказаць прамежкавы дыялёг + Паказаць дыялог улюбёных + Назва перадналад + Націск на гэтую кнопку дадасць адмеціну ў цэнтры экрана. + Націск на гэтую кнопку дадасць пункт GPX у цэнтры экрана. + Націск на гэтую кнопку дадасць аўдыянататку на мапу ў цэнтры экрана. + Націск на гэтую кнопку дадасць відэанататку на мапу ў цэнтры экрана. + Націск на гэтую кнопку дадасць фотанататку на мапу ў цэнтры экрана. + Націск на гэтую кнопку дадасць OSM-нататку на мапу ў цэнтры экрана. + Націск на гэтую кнопку дадасць POI ў цэнтры экрана. + Націск на гэтую кнопку выключыць ці ўключыць галасавыя падказкі падчас навігацыі. + Націск на гэтую кнопку дадасць месца паркоўкі ў цэнтры экрана. + Паказаць прамежкавы дыялог " было захавана ў " - Назва для хуткага дзеяньня ўжо існуе. Назва будзе змененая на %1$s, каб пазбавіцца дубляваньня. + Назва для хуткага дзеяння ўжо існуе. Назва будзе змененая на %1$s, каб пазбавіцца дублявання. Знойдзены дублікат назвы - Націск на гэтую кнопку пакажа ці схавае ўпадабаныя кропкі на мапе. + Націск на гэтую кнопку пакажа ці схавае ўлюбёныя пункты на мапе. Націск на гэтую кнопку пакажа ці схавае POI на мапе. Стварэнне элементаў - Абярыце катэгорыю (апцыянальна). - Націск на гэтую кнопку гартае старонкі данага спісу. - Змяніць мапу пакрыцця - Мапа пакрыцця - Дадаць мапу пакрыцця - Мапа пакрыцця зменена на «%s». - Падкладка мапы зменена на «%s». + Абярыце катэгорыю (неабавязкова). + Націск на гэтую кнопку прагортвае старонкі дадзенага спіса. + Змяніць накладзеную мапу + Накладзеная мапа + Дадаць мапу накладання + Мапа накладання змененая на «%s». + Падкладка мапы змененая на «%s». Змяніць падкладку мапы Падкладка мапы Дадаць падкладку Змяніць крыніцу мапы - Доўгі націск і перацягванне дазваляе перамясціць пазіцыю на экране. + Доўгі націск і перацягванне дазваляе змяніць пазіцыю на экране. Павароты на маршруце Пераважны рэльеф: раўнінны ці гарысты. Гарысты @@ -2589,7 +2593,7 @@ Націск на гэтую кнопку зробіць цэнтр экрана пунктам прызначэння, а папярэдні пункт прызначэння стане апошняй прамежкавай кропкай. Націск на гэтую кнопку зробіць цэнтр экрана пунктам прызначэння, замяняючы папярэдні пункт прызначэння, калі ён ёсць. Націск на гэтую кнопку зробіць цэнтр экрана першым прамежкавым пунктам прызначэння . - Няма пакрыцця + Накладка адсутнічае Няма падкладкі Падпішыцеся на нашу паштовую рассылку аб зніжках на праграму і атрымайце 3 дадатковыя мапы! Контурныя лініі марскіх глыбінь і марскія знакі. @@ -2602,9 +2606,9 @@ Аналізуй на мапе Бачны Прыпынена - OsmAnd (OSM Automated Navigation Directions) мапа і праграма навігацыі з доступам да дармовых святовых якасных даных OpenStreetMap (OSM). -\n -\nАтрымлівайце асалоду ад голасавога і аптычнага навігатара, прагляда карысных месцаў (анг. POI, points of interest), стварэння і кіравання GPX-трэкамі, выкарыстання контурных ліній і інфармацыі аб вышыні (праз плагін), выбару паміж кіраваннем аўтамабілем, яздой на ровары і шпацырам, рэдагавання OSM і шмат іншым. + OsmAnd (OSM Automated Navigation Directions) мапа і навігацыйны дадатак з доступам да бясплатных якасных мапаў усяго свету OpenStreetMap (OSM). +\n +\nАтрымлівайце асалоду ад голасавога і візуальнага навігатара, прагляду карысных месцаў (анг. POI, points of interest), стварэння і кіравання GPX-слядоў, выкарыстання контурных ліній і інфармацыі аб вышыні (праз убудову), выбару паміж кіраваннем аўтамабілем, яздой на ровары і шпацырам, рэдагавання OSM і шмат іншым. Агляд Прыблізнае пакрыццё і якасць мапы: \n • Заходняя Еўропа: **** @@ -2648,113 +2652,113 @@ Паказваць ад узроўня маштабавання Узровень маштабавання паказу: %1$s Калі ласка, дадайце прамежкавыя пункты, калі разлік не завяршыўся цягам 10 хвілін. - Лыжня -\nOsmAnd-дадатак лыжных мап дазваляе бачыць лыжныя трасы з узроўнем складанасці і некаторай дадатковай інфармацыяй, як размяшчэнне пад\'ёмнікаў і іншых аб\'ектаў. - Назва змяшчае занадта шмат вялікіх літар. Прадоўжыць? + Лыжня +\nУбудова лыжных мап для OsmAnd дазваляе бачыць лыжныя трасы з узроўнем складанасці і некаторай дадатковай інфармацыяй: размяшчэнне пад\'ёмнікаў і іншых аб\'ектаў. + Назва змяшчае занадта шмат вялікіх літар. Працягнуць\? Мапа -\n• Адлюстроўвае POI (пункт інтарэсаў) каля вас +\n• Адлюстроўвае POI (пункт інтарэсаў) побач вас \n• Адаптуе мапу ў напрамку вашага руху (ці компаса) \n• Паказвае, дзе вы знаходзіцеся і куды вы глядзіце -\n• Дзяліцеся сваім размяшчэннем, каб сябры змаглі знайсці вас -\n• Захоўвае вашы самыя важныя месцы ва «Ўпадабаных» -\n• Дазваляе вам абраць як адлюстроўваць назвы на мапе: на англійскай, лакальнай ці з фанетычным напісаннем -\n• Адлюстроўвае адмысловыя анлайн-тайлы, спадарожнікавыя здымкі (з Bing), розныя пазнакі, як турыстычныя/навігацыйныя GPX-трэкі і дадатковыя слаі з наладжвальнай празрыстасцю - Язда на ровары -\n • Вы можаце знайсці рованыя шляхі на мапе -\n • GPS-навігацыя ў роварным рэжыме будуе маршрут выкарыстоўваючы роварныя шляхі -\n • Глядзіце вашу хуткасць і вышыню над узроўнем мора -\n • Опцыя GPX-запісу дазваляе вам запісваць ваша падарожжа і дзяліцца ім -\n • Праз дадатак вы можаце ўключыць адлюстраванне гарызанталяў і зацямненне рэльефу +\n• Дзяліцеся сваім месцазнаходжаннем, каб сябры змаглі знайсці вас +\n• Захоўвае вашы самыя важныя месцы ва «Ўлюбёных» +\n• Дазваляе вам абраць як адлюстроўваць назвы на мапе: на англійскай мове, мясцовай мове, ці фанетычным напісаннем +\n• Адлюстроўвае адмысловыя сеціўныя тайлы, спадарожнікавыя здымкі (з Bing), розныя адмеціны, як турыстычныя/навігацыйныя GPX-сляды і дадатковыя пласты з наладжваемай празрыстасцю + Язда на ровары +\n • Вы можаце знайсці роварныя шляхі на мапе +\n • GPS-навігацыя ў роварным рэжыме будуе маршрут выкарыстоўваючы роварныя шляхі +\n • Глядзіце вашу хуткасць і вышыню над узроўнем мора +\n • Параметр GPX-запісу дазваляе вам запісваць ваша падарожжа і дзяліцца ім +\n • Праз убудову вы можаце ўключыць адлюстраванне гарызанталяў і зацямненне рэльефу Mapillary Віджэт Mapillary Дазваляе хутка дадаць фотаздымкі ў Mapillary. Вулічныя фота праз сеціва для кожнага. Адкрывайце для сябе месцы, дапамагайце, здымайце свет. Дадаць фотаздымкі Падзяліцца сваімі вулічнымі краявідамі гэтай мясцовасці праз Mapillary. - Шпацыры, паходы, экскурсіі -\n • Мапа паказвае пешаходныя сцежкі -\n • Вікіпедыя ўпадабанай мовай распавядзе вам шмат чаго цікавага падчас экскурсіі -\n • Прыпынкі грамадскага транспарту (аўтобус, травай, цягнік), уключаючы назвы маршрутаў, дапамогуць арыентавацца ў новым горадзе -\n • GPS-навігацыя ў пешаходным рэжыме вылічвае маршрут, выкарыстоўваючы пешаходныя сцежкі -\n • Загрузка і прытрымліванне GPX-маршрута або запіс і магчымасць дзяліцца сваім уласным - Удзел у OSM -\n • Паведамленне аб памылках -\n • Загрузка GPX-трэкаў у OSM проста з праграмы -\n • Даданне цікавых кропак (POI) і загрузка іх у OSM (ці пазней, калі афлайн) + Шпацыры, паходы, экскурсіі +\n • Мапа паказвае пешаходныя сцежкі +\n • Вікіпедыя абранай мовай распавядзе вам шмат чаго цікавага падчас экскурсіі +\n • Прыпынкі грамадскага транспарту (аўтобус, травай, цягнік), уключаючы назвы маршрутаў, дапамогуць арыентавацца ў новым горадзе +\n • GPS-навігацыя ў пешаходным рэжыме вылічвае маршрут, выкарыстоўваючы пешаходныя сцежкі +\n • Спампоўванне і прытрымліванне GPX-маршрута або запіс і магчымасць дзяліцца сваім уласным + Удзел у OSM +\n • Паведамленне аб памылках +\n • Спампоўванне GPX-слядоў у OSM проста з дадатка +\n • Даданне цікавых пунктаў (POI) і запампоўка іх у OSM (ці пазней, па-за сецівам) \n - Навігацыя -\n • Працуе праз Інтэрнэт (хутка) або аўтаномна (без платы за роўмінг за мяжой) -\n • Пакрокавыя галасавыя падказкі (запісаныя ці сінтэзаваныя галасы) -\n • Магчымае прытрымліванне палос руху, адлюстраванне назвы вуліцы і прыблізны час прыбыцця -\n • Падтрымка прамежкавых кропак на вашым маршруце -\n • Аўтаматычнае перапракладванне маршрута пры адхіленні ад існага -\n • Пошук месцаў па адрасе, тыпу (напрыклад, рэстарацыя, гатэль, запраўка, музей) ці геаграфічным каардынатам + Навігацыя +\n • Працуе праз Інтэрнэт (хутка) або аўтаномна (без платы за роўмінг за мяжой) +\n • Пакрокавыя галасавыя падказкі (запісаныя ці сінтэзаваныя галасы) +\n • Магчымае прытрымліванне палос руху, адлюстраванне назвы вуліцы і прыблізны час прыбыцця +\n • Падтрымка прамежкавых пунктаў на вашым маршруце +\n • Аўтаматычная змена маршруту пры адхіленні ад бягучага +\n • Пошук месцаў па адрасе, тыпу (напрыклад, рэстарацыя, гатэль, запраўка, музей) ці геаграфічных каардынатах \n Сеціўныя фотаздымкі Фотаздымкі для гэтага месца адсутнічаюць. Вулічныя фотаздымкі для ўсіх. Адкрывайце для сябе месцы, дапамагайце, здымайце свет. - GPS-навігацыя -\n • Выбар паміж аўтаномным рэжымам (без платы за роўмінг) і праз Інтэрнэт (хутчэй) -\n • Пакрокавыя галасавыя падказкі (запісаныя або сінтэзаваныя галасы) даставяць вас да месца прызначэння -\n • Паўторны разлік маршруту пасля значнага адхілення ад дзейнага -\n • Паласы руху, назвы вуліц і прыблізны час прыбыцця дапамогуць у дарозе -\n • Для таго, каб зрабіць ваша падарожжа больш бяспечным, рэжым дня/ночы пераключаецца аўтаматычна -\n • Паказ абмежаванняў хуткасці ды папярэджанні пры яе прывышэнні -\n • Мапа маштабуецца адпаведна вашай хуткасці -\n • Пошук месцы па адрасе, тыпу (паркінг, рэстарацыя, гатэль, запраўка, музей і г.д.) ці геаграфічным каардынатам -\n • Падтрымка прамежкавых кропак маршруту -\n • Запіс уласнага GPX-трэка або загрузка гатовага і прытрымліванне яго - OsmAnd — адкрытае праграмнае забяспячэнне з актыўным развіццём. Кожны можа ўнесць свой уклад паведамляючы аб памылках, паляпшаючы пераклад ці распрацоўваючы навыя функцыі. Ход праекта таксама залежыць ад фінансавых унёскаў для забяспячэння працэса кадавання і тэставання новай функцыянальнасці. -\n Прыблізнае ахапленне мап ды якасць: -\n • Заходняя Еўропа: **** -\n • Усходняя Еўропа: *** -\n • Расія: *** -\n • Паўночная Амерыка: *** -\n • Паўднёвая Амерыка: ** -\n • Азія: ** -\n • Японія і Карэя: *** -\n • Сярэдні Усход: ** -\n • Афрыка: ** -\n • Антарктыда: -\n Большасць краін свету даступны да запампоўкі! + GPS-навігацыя +\n • Выбар паміж аўтаномным рэжымам (без платы за роўмінг) і праз Інтэрнэт (хутчэй) +\n • Пакрокавыя галасавыя падказкі (запісаныя або сінтэзаваныя галасы) даставяць вас да месца прызначэння +\n • Паўторны разлік маршруту пасля значнага адхілення ад бягучага +\n • Палосы руху, назвы вуліц і прыблізны час прыбыцця дапамогуць у дарозе +\n • Для таго, каб зрабіць вашае падарожжа больш бяспечным, рэжым дня/ночы пераключаецца аўтаматычна +\n • Паказ абмежаванняў хуткасці ды папярэджанні пры яе прывышэнні +\n • Мапа маштабуецца адпаведна вашай хуткасці +\n • Пошук месца па адрасе, тыпу (паркінг, рэстарацыя, гатэль, запраўка, музей і г.д.) ці геаграфічным каардынатам +\n • Падтрымка прамежкавых пунктаў маршруту +\n • Запіс уласнага GPX-следу або спампоўванне гатовага і прытрымліванне яго + OsmAnd — адкрытае праграмнае забяспячэнне з актыўным развіццём. Кожны можа ўнесць свой уклад паведамляючы аб памылках, паляпшаючы пераклад ці распрацоўваючы навыя функцыі. Ход праекта таксама залежыць ад фінансавых унёскаў для забяспячэння працэса кадавання і тэставання новай функцыянальнасці. +\n Прыблізнае ахапленне мап ды якасць: +\n • Заходняя Еўропа: **** +\n • Усходняя Еўропа: *** +\n • Расія: *** +\n • Паўночная Амерыка: *** +\n • Паўднёвая Амерыка: ** +\n • Азія: ** +\n • Японія і Карэя: *** +\n • Сярэдні Усход: ** +\n • Афрыка: ** +\n • Антарктыда: +\n Большасць краін свету даступныя да спампоўвання! \n Атрымайце надзейны навігатар у вашай краіне — будзь то Беларусь, Францыя, Германія, Мексіка, Вялікабрытанія, Гіспанія, Нідэрланды, ЗША, Расія, Бразілія ці якая іншая. - OsmAnd+ (OSM Automated Navigation Directions) — картаграфічная і навігацыйная праграма з доступам да вольных, сусветных і высокаякасных даных OpenStreetMap (OSM). -\n Атрымоўвайце асалоду ад галасавай і візуальная навігацыі, праглядайце цікавыя кропкі (POI), запісвайце GPX-трэкі, выкарыстоўвайце візуалізацыю контурных ліній ды даных вышыні, пераключайцеся паміж рэжымамі кіравання, яздой на ровары ды шпацырамі, рэдагуйце OSM-даныя і шмат іншага. -\n OsmAnd+ — платная версія праграмы. Пры набыцці, вы падтрымаеце праект, фінансуеце распрацоўку новых мажлівасцей ды атрымаеце апошнія абнаўленні. -\nНекаторыя з галоўных мажлівасцей: - Прагляд мапы -\n • Паказвае, дзе вы знаходзіся і куды глядзіце + OsmAnd+ (OSM Automated Navigation Directions) — мапа і навігацыйны дадатак з доступам да бясплатных, сусветных і высокаякасных даных OpenStreetMap (OSM). +\n Атрымоўвайце асалоду ад галасавой і візуальная навігацыі, праглядайце пукты інтарэсаў (POI), запісвайце GPX-сляды, выкарыстоўвайце візуалізацыю контурных ліній ды даных вышыні, пераключайцеся паміж рэжымамі кіравання, яздой на ровары ды шпацырамі, рэдагуйце OSM-даныя і шмат іншага. +\n OsmAnd+ — платная версія праграмы. Пры набыцці, вы падтрымоўваеце праект, фінансуеце распрацоўку новых магчымасцяў ды атрымоўваце апошнія абнаўленні. +\nНекаторыя з галоўных магчымасцяў: + "Прагляд мапы +\n • Паказвае дзе вы знаходзіцеся і куды глядзіце \n • Пры патрэбе выраўняе мапу па компасе ці па напрамку вашага руху -\n • Зберагае вашы найважнейшыя месцы ва ўпадабаных -\n • Адлюстроўвае цікавыя кропкі вакол вас -\n • Паказвае адмысловыя анлайн-мапы, спадарожнікавыя здымкі (Bing), розныя накладкі накшталт турыстычных/навігацыйных GPX-трэкаў і дадатковыя слаі з наладжвальнай празрыстасцю -\n • Можа адлюстроўваць на мапе беларускія, англійскія, лакальныя назвы ці з фанетычным напісаннем - Выкарыстоўваюцца даныя OSM ды Вікіпедыі -\n • Высокаякасная інфармацыя ад найлепшых праектаў свету -\n • OSM-даныя даступныя па краіне ці рэгіёну -\n • Цікавыя месцы з Вікіпедыі, выдатна падыходзіць для агляду выбітнасцяў -\n • Неабмежаваная колькасць бясплатных спамповак проста з праграмы -\n • Кампактныя афлайнавыя вектарныя мапы абноўляюцца не радзей разу ў месяц +\n • Захавае вашыя найважнейшыя месцы ва ўлюблёных +\n • Адлюстроўвае пункты інтарэсаў вакол вас +\n • Паказвае адмысловыя сеціўныя мапы, спадарожнікавыя здымкі (Bing), розныя накладкі накшталт турыстычных/навігацыйных GPX-слядоў і дадатковыя пласты з наладжваемай празрыстасцю +\n • Можа адлюстроўваць на мапе беларускія, англійскія, мясцовыя назвы ці фанетычным напісаннем" + Выкарыстоўваюцца даныя OSM ды Вікіпедыі +\n • Высокаякасная інфармацыя ад найлепшых праектаў свету +\n • OSM-даныя даступныя па краіне ці рэгіёну +\n • Пункты інтарэсаў з Вікіпедыі, выдатна падыходзіць для агляду выбітнасцяў +\n • Неабмежаваная колькасць бясплатных спампоўванняў непасрэдна з дадатка +\n • Кампактныя пазасеціўныя вектарныя мапы абнаўляюцца не радзей за раз на месяц \n • Выбар паміж поўнымі данымі рэгіёна ці толькі дарожнай сеткай (напрыклад, уся Японія займае 700 МБ, а дарожная сетка — 200 МБ) - Асаблівасці бяспекі -\n • Магчамасць аўтаматычнага пераключэння рэжыма дзень/ноч -\n • Магчымасць адлюстравання абмежавання хуткасці з нагадваннем пры перавышэнні -\n • Магчымасць змены маштабу ў залежнасці ад хуткасці -\n • Магчамасць дзяліцца сваім месцазнаходжаннем, каб сябры змаглі знайсці вас + Асаблівасці бяспекі +\n • Магчамасць аўтаматычнага пераключэння рэжыма дзень/ноч +\n • Магчымасць адлюстравання абмежавання хуткасці з апавяшчэннем пры перавышэнні +\n • Магчымасць змены маштабу ў залежнасці ад хуткасці +\n • Магчамасць дзяліцца сваім месцазнаходжаннем, каб сябры змаглі знайсці вас \n - Мажлівасці для пешаходаў і раварыстаў -\n • Прагляд пешаходных, турыстычных і роварных сцежак, выдатна падыходзіць для актыўнага адпачынку -\n • Адмысловы рэжымы маршрутызацыі ды адлюстравання для раварыстаў і пешаходаў -\n • Апцыянальныя прыпынкі грамадскага транспарту (аўтобус, трамвай, цягнік), уключаючы назвы маршрутаў -\n • Магчымасць запісу падарожжа ў лакальны GPX-файл ці інтэрнэт-сэрвіс -\n • Магчымасць адлюстравання хуткасці ды вышыні + Магчымасці для пешаходаў і раварыстаў +\n • Прагляд пешаходных, турыстычных і роварных сцежак, выдатна падыходзіць для актыўнага адпачынку +\n • Адмысловы рэжымы маршрутызацыі ды адлюстравання для раварыстаў і пешаходаў +\n • Прыпынкі грамадскага транспарту (аўтобус, трамвай, цягнік), уключаючы назвы маршрутаў +\n • Магчымасць запісу падарожжа ў лакальны GPX-файл ці інтэрнэт-сэрвіс +\n • Магчымасць адлюстравання хуткасці ды вышыні \n • Адлюстраванне контурных ліній ды зацянення вышынь (праз дадатак) - Непасрэдны ўклад у OSM -\n • Заявы аб памылках у даных -\n • Загрузка GPX-трэкаў у OSM проста з праграмы -\n • Дадаванне цікавых кропак (POI) і непасрэдная загрузка іх у OSM (ці пазней, калі афлайн) -\n • Магчымасць запісу падарожжа ў фонавым рэжыме (у той час, як прылада знаходзіцца ў спячым рэжыме) -\n OsmAnd — адкрытае праграмнае забяспячэнне ў актыўнай распрацоўцы. Кожны можа ўнесці ўклад паведамляючы аб памылках, паляпшаючы пераклад ці распрацоўваючы новыя мажлівасці. Ход праекта залежыць таксама ад фінансавых унёскаў для забяспячэння прадаўжэння кадавання і тэставання новай функцыянальнасці. + Непасрэдны ўклад у OSM +\n • Заявы аб памылках у даных +\n • Запампоўванне GPX-слядоў у OSM проста з дадатка +\n • Даданне пунктаў інтарэсаў (POI) і непасрэдная запампоўка іх у OSM (ці пазней, па-за сецівам) +\n • Магчымасць запісу падарожжа ў фонавым рэжыме (у той час, як прылада знаходзіцца ў спячым рэжыме) +\n OsmAnd — адкрытае праграмнае забяспячэнне ў актыўнай распрацоўцы. Кожны можа ўнесці ўклад паведамляючы аб памылках, паляпшаючы пераклад ці распрацоўваючы новыя магчымасці. Ход праекта залежыць таксама ад фінансавых унёскаў для забяспячэння кадавання і тэставання новай функцыянальнасці. \n Усталяваць Палепшыць фотапакрыццё Mapillary @@ -2798,9 +2802,9 @@ Паказаць дыялог «Завяршэнне навігацыі» Пачаць/спыніць навігацыю Націсніце гэтую кнопку, каб пачаць або скончыць навігацыю. - Час буферызацыі для анлайн сачэньня - Задае час буферызацыі для зьберажэньня месцаў для адпраўкі без злучэньня - Вам патрэбна падлучэнне да Інтэрнэту для прагляду фатаграфій з Mapillary. + Час буферызацыі для сеціўнага сачэння + Задае час буферызацыі для зберажэння месцаў для адпраўкі без злучэння + Для прагляду фотаздымкаў з Mapillary неабходна злучыцца з інтэрнэтам. Паўтарыць @@ -2808,11 +2812,11 @@ Назва файла GPX: Паказаць на мапе пасля захавання - Дадаць кропку шляху - Захаваць GPX-кропку шляху - Захаваць кропку маршруту - Кропка шляху 1 - Кропка маршруту 1 + Дадаць пункт шляху + Захаваць GPX-пункт шляху + Захаваць пункт маршруту + Пункт шляху 1 + Пункт маршруту 1 Лінія @@ -2826,15 +2830,15 @@ OsmAnd злучыць пункты з маршрутам для абранага профіля. Захаваць пункты як пункты маршруту ці як лінію. Абраць профіль навігацыі - Дадаць кропкі маршруту + Дадаць пункты маршруту Дадаць лінію Дадаць GPX-файлы - Запісаць GPX-файлы ці запісаныя сляды. - Дадаць упадабаныя - Імпартаваць упадабаныя ці дадаць з дапамогай маркіроўкі пунктаў на мапе. + Імпартаваць GPX-файлы ці запісаныя сляды. + Дадаць улюбёныя + Імпартаваць улюбёныя ці дадаць з адмецін на мапе. Імпартаваць GPX-файл - Файл %1$s не зьмяшчае кропкі шляху, імпартаваць як сьлед? - Перамясціць кропку + Файл %1$s не змяшчае пункты шляху, імпартаваць як след\? + Перамясціць пункт Дадаць у GPX-файл Працягваць паказваць на мапе Выйсці без захавання\? @@ -2875,7 +2879,7 @@ Маё становішча Фініш Планаваць маршрут - Сартаваць + Упарадкаваць Увод каардынат захаваны Экспартаваць вашыя адмеціны ў наступны GPX-файл: @@ -2973,7 +2977,7 @@ Адмеціна Змен %1$s, сума %2$s mBTC OSM-атрымальнікі - Усяго ахвяраванняў + Агулам ахвяраванняў Адчынена з Адчынена да Зачыніцца а @@ -2983,12 +2987,12 @@ Лаоская Назвы POI - вых. + выкл Зімовы/лыжны Турыстычны выгляд Марскі Адчыніцца заўтра а - Капіяваць назву кропкі/POI + Скапіраваць назву пункта/POI Месца без назвы Цяперашні Дадае прамежкавы прыпынак @@ -3093,7 +3097,7 @@ Абраць дзённік падарожжаў Дзённік падарожжаў Спампаваць выявы - Спампаваць артыкулы Вікіпэдыі для %1$s для аўтаномнага чытання. + Спампаваць артыкулы Вікіпедыі для %1$s для аўтаномнага чытання. Спампаваць даныя Вікіпедыі Адкрыць артыкул у сеціве Праглядзець артыкул у браўзеры. @@ -3177,7 +3181,7 @@ \n Выдаліць адмеціну мапы \"%s\"\? Рэдагаваць адмеціну мапы - Дадатак іншага распрацоўшчыка + Асобны дадатак Пошук вуліцы Спачатку абярыце горад Аднавіць @@ -3217,7 +3221,5 @@ Частка даходу ідзе ўдзельнікам OpenStreetMap. Працуе на OsmAnd Паказаць толькі 360° малюнкі - README: -\n\t- Лепш за ўсё дапамагчы з перакладам вы можаце тут: https://hosted.weblate.org/engage/osmand/ -\n + Падпіскі diff --git a/OsmAnd/res/values-da/strings.xml b/OsmAnd/res/values-da/strings.xml index 67af24e064..bad69d6b85 100644 --- a/OsmAnd/res/values-da/strings.xml +++ b/OsmAnd/res/values-da/strings.xml @@ -2251,7 +2251,7 @@ Proportional hukommelse %4$s MB (Android grænse %5$s MB, Dalvik %6$s MB). En del af donationen vil blive sendt til OSM-brugere, som indsender ændringer til kortet i det pågældende område. Indstillinger for abonnement - Køb først OsnAnd Live-abonnement + Køb først OsmAnd Live-abonnement "Abonnementet giver timebaserede opdateringer til alle kort i hele verden. \nEn del af indtægten går tilbage til OSM-fællesskabet og udbetales for hvert OSM-bidrag. @@ -2795,7 +2795,7 @@ Repræsenterer område: %1$s x %2$s Indtast brugernavn Se kun billeder tilføjet af Brugernavn - Filtrer billeder efter indsender eller dato. Kun aktiv for højere zoomniveauer. + Filtrer billeder efter indsender, dato eller type. Kun aktiv for højere zoomniveauer. Se kun de billeder, der er tilføjet Genindlæs Genindlæs kortbrikker for at se opdaterede data. @@ -3222,17 +3222,19 @@ Repræsenterer område: %1$s x %2$s Behold passerede markører på kortet Plan & Priser Betal månedligt - Betal én gang i 3 måneder + Betal én gang hver 3. måned Betal en gang om året %1$s / måned %1$.2f %2$s / måned Spar %1$s! Nuværende abonnement - Forny månedlig - Forny kvartalsvis - Forny hvert år + Fornyes månedligt + Fornyes kvartalsvis + Fornyes hvert år %1$.2f %2$s Vælg en passende betalingsperiode: - En del af indtægterne går til OpenStreetMap bidragydere. + En del af indtægterne går til OpenStreetMap bidragsydere. Drevet af OsmAnd + Abonnementer + Vis kun 360° billeder diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml index 281c5d40e4..2fe5dfc948 100644 --- a/OsmAnd/res/values-de/phrases.xml +++ b/OsmAnd/res/values-de/phrases.xml @@ -1200,7 +1200,7 @@ Ohne Aufzug Avgas UL 91 - Avgas 100 LL + Avgas 100LL Autogas Flugzeug A-1 Kraftstoff AdBlue diff --git a/OsmAnd/res/values-es-rAR/phrases.xml b/OsmAnd/res/values-es-rAR/phrases.xml index 46075259c2..2e39f8b0e8 100644 --- a/OsmAnd/res/values-es-rAR/phrases.xml +++ b/OsmAnd/res/values-es-rAR/phrases.xml @@ -3921,7 +3921,7 @@ No acepta Pagos sin contacto Peligro nuclear - Peligro de erosión + Peligro de derrumbe por erosión Peligro de avalancha Camino resbaladizo Peligro de inundación diff --git a/OsmAnd/res/values-es-rUS/phrases.xml b/OsmAnd/res/values-es-rUS/phrases.xml index 8c3556450f..fdf4e90a8f 100644 --- a/OsmAnd/res/values-es-rUS/phrases.xml +++ b/OsmAnd/res/values-es-rUS/phrases.xml @@ -3680,7 +3680,7 @@ No acepta Pagos sin contacto Peligro nuclear - Peligro de erosión + Peligro de derrumbe por erosión Peligro de avalancha Camino resbaladizo Peligro de inundación diff --git a/OsmAnd/res/values-es/phrases.xml b/OsmAnd/res/values-es/phrases.xml index a690d6efb8..a382bd0c86 100644 --- a/OsmAnd/res/values-es/phrases.xml +++ b/OsmAnd/res/values-es/phrases.xml @@ -3903,7 +3903,7 @@ Sin contacto: no se acepta Peligro nuclear - Peligro de erosión + Peligro de derrumbe por erosión Peligro de avalancha Carretera resbaladiza Peligro de inundación diff --git a/OsmAnd/res/values-eu/phrases.xml b/OsmAnd/res/values-eu/phrases.xml index 253608947e..b8694ef609 100644 --- a/OsmAnd/res/values-eu/phrases.xml +++ b/OsmAnd/res/values-eu/phrases.xml @@ -153,7 +153,7 @@ Tren andena Tren geltokia Metro sarrera - Metro geltokia + Bai Taxi geltokia Aireportua @@ -444,7 +444,7 @@ Kartzela Migrazioa Ogasun ikuskaritza - Hiriburua + Bai Herria Auzoa Baratza komunitarioak @@ -1541,7 +1541,7 @@ Peszetarianoa Garagardotegiaren izena - Mikro-garagardotegia + Bai Ez da mikro-garagardotegia Patinajea @@ -3878,8 +3878,8 @@ Handizkaria Mota -Handizkaria: bai - Handizkaria: besterik ez +Bai + Besterik ez Transmisioa Banaketa @@ -3887,7 +3887,7 @@ Industriala Trantsizioa Trakzioa - + Bihurtzailea Konpentsazioa Konpresioa diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml index 00281966ce..deeee28871 100644 --- a/OsmAnd/res/values-fa/strings.xml +++ b/OsmAnd/res/values-fa/strings.xml @@ -1755,7 +1755,7 @@ بی‌خیال استفاده از رندرگیری OpenGL از رندرگیری سرعت‌یافتهٔ سخت‌افزاری OpenGL استفاده کن (شاید مصرف باتری افزایش یابد یا روی دستگاه‌های خیلی قدیمی کار نکند). - %1$s به این مجوز نیاز دارد تا برای صرفه‌جویی در انرژی، بتواند نمایشگر را خاموش کند. + ‏%1$s به این مجوز نیاز دارد تا برای صرفه‌جویی در انرژی بتواند نمایشگر را خاموش کند. هنگام نزدیک‌شدن به پیچ، نمایشگر روشن شود (اگر خاموش است). هرگز مسیرهای اتوبوس برقی diff --git a/OsmAnd/res/values-fr/phrases.xml b/OsmAnd/res/values-fr/phrases.xml index 0ef546d6d8..5db62611a1 100644 --- a/OsmAnd/res/values-fr/phrases.xml +++ b/OsmAnd/res/values-fr/phrases.xml @@ -3514,4 +3514,5 @@ Type d\'explosion : sous-terrain, tunnel Type d\'explosion : espace (au delà de 80 km d\'altitude) Type d\'explosion : sous-marine + Type d\'explosion : sous terre, tunnel diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 0b279c5643..0c69e277e7 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -2737,7 +2737,7 @@ représentant la zone : %1$s x %2$s Cache des tuiles Afficher uniquement les images ajoutées Afficher uniquement les images ajoutées par - Filtrer les images par date ou nom d\'utilisateur. Le filtre n\'est appliqué qu\'après avoir zoomé. + Filtrez les images par date, nom d\'utilisateur ou type. Le filtre n\'est appliqué qu\'après avoir zoomé. Réinitialiser Moyenne Croissant / Décroissant @@ -3207,8 +3207,10 @@ représentant la zone : %1$s x %2$s Sélectionnez la fréquence de règlement qui vous convient : Une partie des revenus est reversée aux contributeurs OpenStreetMap. Plans et Tarifs - Abonnement mensuel - Abonnement trimestriel - Abonnement annuel + Abonnements mensuels + Abonnements trimestriels + Abonnements annuels Propulsé par OsmAnd + Abonnements + N\'afficher que les images à 360° diff --git a/OsmAnd/res/values-he/phrases.xml b/OsmAnd/res/values-he/phrases.xml index b87edad980..f9cd527a6e 100644 --- a/OsmAnd/res/values-he/phrases.xml +++ b/OsmAnd/res/values-he/phrases.xml @@ -2272,4 +2272,11 @@ כן שימוש: ריגול + שימוש: ריגול + שימוש: חינוך + שימוש: מחקר + + מטאורולוגי + כבידתי + diff --git a/OsmAnd/res/values-it/phrases.xml b/OsmAnd/res/values-it/phrases.xml index 913f0c9753..a621b04776 100644 --- a/OsmAnd/res/values-it/phrases.xml +++ b/OsmAnd/res/values-it/phrases.xml @@ -967,8 +967,8 @@ Tempi di raccolta Email Fax - "Facebook " - "Twitter " + Facebook + Twitter Skype YouTube Instagram diff --git a/OsmAnd/res/values-sr/strings.xml b/OsmAnd/res/values-sr/strings.xml index c11a7d4682..f0f1cb8340 100644 --- a/OsmAnd/res/values-sr/strings.xml +++ b/OsmAnd/res/values-sr/strings.xml @@ -1733,8 +1733,8 @@ Додаје прво стајање Прикажи/Сакриј ОСМ белешке на карти. GPX фајл - • Ново: Подршка за глобалне туристичке водиче без потребе за интернет конекцијом. Референтни положају су повезани на карти. Иницијални подаци са сајта Wikivoyage. -\n + • Ново: Подршка за глобалне туристичке водиче без потребе за интернет конекцијом. Референтни положаји су повезани на карти. Иницијални подаци са сајта Wikivoyage. +\n \n • Википедија: нови изглед, активне везе, слике \n \n • Open Track UI: приказ група пролазних тачака diff --git a/OsmAnd/res/values-sv/strings.xml b/OsmAnd/res/values-sv/strings.xml index 0e323b7756..ae6525ae3e 100644 --- a/OsmAnd/res/values-sv/strings.xml +++ b/OsmAnd/res/values-sv/strings.xml @@ -476,7 +476,7 @@ Nyttjat utrymme är {1} MB. Det gick inte att tolka geo-uppsåt \'%s\'. Sök adress med hjälp av offline-kartor System - Välj visningsspråk (starta om OsmAnd efter språkbyte). + Välj visningsspråk (träder i kraft när OsmAnd startas om). Visningsspråk @@ -3041,7 +3041,24 @@ Vänligen tillhandahåll fullständig kod Vi skickar din sökfråga: \"%1$s\", såväl som din plats.

Vi samlar inte in personlig information, vi behöver bara sökdata för att förbättra sökalgoritmen.
Tredjepartsprogram Sök gata - Börja sökning från stad + Välj en stad först Återställ Behåll passerade markörer på kartan + Drivs av OsmAnd + Abonnemang & Priser + Betala månadsvis + Betala var 3:e månad + Betala en gång om året + %1$s / månad + %1$.2f %2$s / månad + Spara %1$s! + Ditt nuvarande abonnemang + Förnyas varje månad + Förnyas kvartalsvis + Förnyas årligen + %1$.2f %2$s + Välj en passande betalningsperiod: + En del av intäkterna går till OpenStreetMap bidragsgivare. + Ta bort kartmarkör \'%s\'\? + Redigera kartmarkör diff --git a/OsmAnd/res/values-zh-rCN/strings.xml b/OsmAnd/res/values-zh-rCN/strings.xml index 193e0045f6..9a5c2ca4e8 100644 --- a/OsmAnd/res/values-zh-rCN/strings.xml +++ b/OsmAnd/res/values-zh-rCN/strings.xml @@ -523,7 +523,7 @@ 选择何时显示仅包含道路的地图: 仅包含道路的地图 在安全模式运行应用(使用较慢的 Android 代码代替原生代码)。 - 应用正运行在安全模式下(可在设置中关闭)。 + 应用正运行在安全模式下(可在“设置”中关闭)。 OsmAnd 睡眠模式服务仍在运行。是否要关闭? 关闭修改集 ZXing 条形码扫描应用未安装,是否转到应用市场中搜索? @@ -680,13 +680,13 @@ 兴趣点数据 TTS语音 新搜索 - 选择地图上名称的字体大小 + 选择地图上名称的字体大小。 地图字体大小 - 显示渲染性能 + 显示渲染性能。 解包新数据… 已选择在线导航服务,但网络连接不可用。 - 语言不支持 + 不支持的语言 数据丢失 使用当前终点 提醒语音音频 @@ -1424,7 +1424,7 @@ 管理 铁路线路 隐藏 - 人行橫道 + 人行横道 线路 铁道交口 详细信息 @@ -1844,7 +1844,7 @@ 速度限制 边境管制 收费站 - 停车标志 + 停止标志 交通稳静化 测速摄像机 交通警告 @@ -2730,5 +2730,10 @@ %1$.2f %2$s / 月 节省 %1$s! 您的当前订阅 - + 在网页浏览器中查看文章。 + 订阅 + 每月续期 + 每季度续期 + 每年续期 + 第三方应用程序