diff --git a/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java b/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java index ae4080b367..06ee6689be 100644 --- a/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java +++ b/OsmAnd-java/src/main/java/net/osmand/GPXUtilities.java @@ -328,6 +328,16 @@ public class GPXUtilities { } } + public void setColor(ColorizationType type, int color) { + if (type == ColorizationType.SPEED) { + speedColor = color; + } else if (type == ColorizationType.ELEVATION) { + altitudeColor = color; + } else if (type == ColorizationType.SLOPE) { + slopeColor = color; + } + } + public String getBackgroundType() { return getExtensionsToRead().get(BACKGROUND_TYPE_EXTENSION); } @@ -1103,6 +1113,15 @@ public class GPXUtilities { return trackBounds; } + public static QuadRect calculateTrackBounds(List segments) { + QuadRect trackBounds = new QuadRect(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, + Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY); + for (TrkSegment segment : segments) { + updateBounds(trackBounds, segment.points, 0); + } + return trackBounds; + } + public static void updateBounds(QuadRect trackBounds, List pts, int startIndex) { for (int i = startIndex; i < pts.size(); i++) { WptPt pt = pts.get(i); diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/edit/OsmMapUtils.java b/OsmAnd-java/src/main/java/net/osmand/osm/edit/OsmMapUtils.java index cf86ca88ed..a29763ee82 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/edit/OsmMapUtils.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/edit/OsmMapUtils.java @@ -340,6 +340,30 @@ public class OsmMapUtils { } } + public static void simplifyDouglasPeucker(List nodes, int start, int end, List survivedNodes, double epsilon) { + double dmax = Double.NEGATIVE_INFINITY; + int index = -1; + + Node startPt = nodes.get(start); + Node endPt = nodes.get(end); + + for (int i = start + 1; i < end; i++) { + Node pt = nodes.get(i); + double d = MapUtils.getOrthogonalDistance(pt.getLatitude(), pt.getLongitude(), + startPt.getLatitude(), startPt.getLongitude(), endPt.getLatitude(), endPt.getLongitude()); + if (d > dmax) { + dmax = d; + index = i; + } + } + if (dmax > epsilon) { + simplifyDouglasPeucker(nodes, start, index, survivedNodes, epsilon); + simplifyDouglasPeucker(nodes, index, end, survivedNodes, epsilon); + } else { + survivedNodes.add(nodes.get(end)); + } + } + private static double orthogonalDistance(int zoom, Node nodeLineStart, Node nodeLineEnd, Node node) { LatLon p = MapUtils.getProjection(node.getLatitude(), node.getLongitude(), nodeLineStart.getLatitude(), nodeLineStart.getLongitude(), nodeLineEnd.getLatitude(), nodeLineEnd.getLongitude()); diff --git a/OsmAnd-java/src/main/java/net/osmand/router/RouteColorize.java b/OsmAnd-java/src/main/java/net/osmand/router/RouteColorize.java index 0a39d57e25..6a0c5c5794 100644 --- a/OsmAnd-java/src/main/java/net/osmand/router/RouteColorize.java +++ b/OsmAnd-java/src/main/java/net/osmand/router/RouteColorize.java @@ -35,6 +35,7 @@ public class RouteColorize { public static final int RED = rgbaToDecimal(243, 55, 77, 255); public static final int[] colors = new int[] {GREEN, YELLOW, RED}; + private static final float DEFAULT_BASE = 17.2f; private static final int MAX_SLOPE_VALUE = 25; public enum ColorizationType { @@ -105,6 +106,10 @@ public class RouteColorize { } for (Track t : gpxFile.tracks) { for (TrkSegment ts : t.segments) { + if (ts.generalSegment || ts.points.size() < 2) { + continue; + } + for (WptPt p : ts.points) { latList.add(p.lat); lonList.add(p.lon); @@ -241,7 +246,6 @@ public class RouteColorize { if (dataList == null) { dataList = new ArrayList<>(); for (int i = 0; i < latitudes.length; i++) { - //System.out.println(latitudes[i] + " " + longitudes[i] + " " + values[i]); dataList.add(new RouteColorizationPoint(i, latitudes[i], longitudes[i], values[i])); } } @@ -250,11 +254,13 @@ public class RouteColorize { for (RouteColorizationPoint data : dataList) { nodes.add(new net.osmand.osm.edit.Node(data.lat, data.lon, data.id)); } - OsmMapUtils.simplifyDouglasPeucker(nodes, zoom + 5, 1, result, true); + + double epsilon = Math.pow(2.0, DEFAULT_BASE - zoom); + result.add(nodes.get(0)); + OsmMapUtils.simplifyDouglasPeucker(nodes, 0, nodes.size() - 1, result, epsilon); List simplified = new ArrayList<>(); - - for (int i = 1; i < result.size() - 1; i++) { + for (int i = 1; i < result.size(); i++) { int prevId = (int) result.get(i - 1).getId(); int currentId = (int) result.get(i).getId(); List sublist = dataList.subList(prevId, currentId); @@ -477,7 +483,7 @@ public class RouteColorize { } public static class RouteColorizationPoint { - int id; + public int id; public double lat; public double lon; public double val; diff --git a/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java b/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java index 97e921a3d4..7704a2685d 100644 --- a/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java +++ b/OsmAnd-java/src/main/java/net/osmand/util/MapUtils.java @@ -747,7 +747,9 @@ public class MapUtils { return Math.sqrt((endX - startX) * (endX - startX) + (endY - startY) * (endY - startY)); } - + public static double getSqrtDistance(float startX, float startY, float endX, float endY) { + return Math.sqrt((endX - startX) * (endX - startX) + (endY - startY) * (endY - startY)); + } } diff --git a/OsmAnd-telegram/res/values-el/strings.xml b/OsmAnd-telegram/res/values-el/strings.xml index 819b9d3d48..ce064f9bc7 100644 --- a/OsmAnd-telegram/res/values-el/strings.xml +++ b/OsmAnd-telegram/res/values-el/strings.xml @@ -53,4 +53,5 @@ Χιλιόμετρα/μέτρα Αλλαγή απόστασης που μετριέται. Μονάδες μήκους + Ταξινόμηση κατά \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-eo/strings.xml b/OsmAnd-telegram/res/values-eo/strings.xml index 800e2c4d0c..b902b91d73 100644 --- a/OsmAnd-telegram/res/values-eo/strings.xml +++ b/OsmAnd-telegram/res/values-eo/strings.xml @@ -32,7 +32,7 @@ Bonvenon m km - marmejlo + nmi min/m min/km Mia loko @@ -97,4 +97,26 @@ Instali OsmAnd Sugestataj Mezuma rapido + Reen + Kunhavigi + Instali + Telefonnumero en internacia formo + Telefonnumero + Pasvorto + kn + mi + ft + yd + mi/h + Marmejloj en horo (nodoj) + Ordigi laŭ + Ordigi + Laŭ grupo + Laŭ nomo + Laŭ distanco + Nomo + Aktiva + Konektante al Interreto + Komencante + Sendante lokon \ No newline at end of file diff --git a/OsmAnd-telegram/res/values-pt/strings.xml b/OsmAnd-telegram/res/values-pt/strings.xml index 28cb4ea7e7..627e293288 100644 --- a/OsmAnd-telegram/res/values-pt/strings.xml +++ b/OsmAnd-telegram/res/values-pt/strings.xml @@ -114,7 +114,7 @@ Sem conexão GPS Sem ligação à Internet Desativar - Gravar + Guardar Adicionar dispositivo Partilhar localização como Contactos e grupos partilhando a localização consigo. diff --git a/OsmAnd/res/values-ar/phrases.xml b/OsmAnd/res/values-ar/phrases.xml index 7d73d700ef..bde210d44b 100644 --- a/OsmAnd/res/values-ar/phrases.xml +++ b/OsmAnd/res/values-ar/phrases.xml @@ -3826,4 +3826,5 @@ المحتوى: بيرة المحتوى: نبيذ مقرض مال + نوع الخليج \ No newline at end of file diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 307f2513cc..e920c24f05 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -3921,7 +3921,7 @@ الحساب تسجيل الدخول \"إمكانية التتبع\" تعني أن التتبع لا يظهر في أي قوائم عامة ولكن نقاط التتبع المعالجة مع طوابع زمنية صادرة عنها(التي لا يمكن أن تكون مرتبطة بك مباشرة) ستظهر خلال التنزيلات من واجهة برمجة التطبيقات GPS API العامة. - سجل تاريخ العلامات + سجل التوجيه المباشر أرسل ملف GPX إلى OpenStreetMap أدخل العلامات مفصولة بفاصلة. \"خاص\"يعني أن التتبع لن يظهر في أي قوائم عامة ، ولكن نقاط التتبع الصادرة عنه ستظل متاحة من خلال واجهة برمجة تطبيقات GPS API العامة بدون طوابع زمنية ولكن لن يتم ترتيبها ترتيبًا زمنيًا. @@ -4075,7 +4075,7 @@ سيارة نسخ اسم POI الرجاء اختيار أنواع أخرى من التلوين. - سيتم القاط أيقونة المكان الحالي إلى مسار التنقل الحالي + سيتم سحب أيقونة المكان الحالي إلى مسار التنقل الحالي حدد الجزء %1$s يحتوي على أكثر من مقطع ، تحتاج إلى تحديد الجزء المطلوب للتنقل. الجزء %1$d diff --git a/OsmAnd/res/values-el/phrases.xml b/OsmAnd/res/values-el/phrases.xml index b8fef87aa9..406acfb19c 100644 --- a/OsmAnd/res/values-el/phrases.xml +++ b/OsmAnd/res/values-el/phrases.xml @@ -2990,7 +2990,7 @@ Ασιατικό Γαλλικό Ελληνικό - Τάι + Ταϊλανδικό Διεθνές Τούρκικο Ισπανικό diff --git a/OsmAnd/res/values-el/strings.xml b/OsmAnd/res/values-el/strings.xml index 1f5c371c25..f172a8639f 100644 --- a/OsmAnd/res/values-el/strings.xml +++ b/OsmAnd/res/values-el/strings.xml @@ -1435,14 +1435,14 @@ Ιρλανδικά Λατινικά Κουρδικά - Ταμιλικά + Ταμίλ Λουξεμβουργιανά Οσσετιανικά Εσπεράντο Ισπανικά (Αργεντινής) Νορβηγικά Bokmål Ταϊλανδικά - τελούγκου + Τελούγκου Νορβηγικά Nynorsk Εσθονικά Έχετε παλιά ασύμβατα δεδομένα της βικιπαίδειας. Να αρχειοθετηθούν; @@ -1709,7 +1709,7 @@ Σήμερα Χθές Τις τελευταίες 7 ημέρες - Εφέτος + Αυτό το έτος Μετακίνηση όλων στο ιστορικό Ένδειξη απόστασης Ταξινόμηση κατά @@ -2205,7 +2205,7 @@ Βεγγαλέζικα Ταγκαλόγκ Βρετονικά - Μαλαγιαλαμικά + Μαλαγιάλαμ Λαοϊκά γεω: Αποφυγή τρένου κλειστής διαδρομής @@ -2582,9 +2582,9 @@ Χρόνος ενημέρωσης Μέγεθος ενημέρωσης Τελευταία αλλαγή χάρτη: %s - Ανά ώρα - Ανά ημέρα - Ανά εβδομάδα + Ωριαία + Ημερήσια + Εβδομαδιαία Πρωί Βράδυ Μήνας και χώρα: diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index 19328a93e7..fa137e6afc 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -219,7 +219,7 @@ Elekti kategorion Difini unuon de rapido. Unuo de rapido - marmejlo + nmi Marmejloj Kilometroj en horo Mejloj en horo @@ -3163,7 +3163,7 @@ Navigaj gvidiloj kaj anoncoj Voĉaj anoncoj Ekranaj avertoj - Agordi parametroj de navigo + Agordi parametrojn de navigo Parametroj de navigo Profilo de aplikaĵo ŝanĝita al “%s” Bufro logcat diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml index c7a7007a59..193189aa46 100644 --- a/OsmAnd/res/values-es-rAR/strings.xml +++ b/OsmAnd/res/values-es-rAR/strings.xml @@ -209,7 +209,7 @@ Reductor de velocidad Radar de velocidad Aviso de tráfico - Favoritos cerca + Favoritos cercanos PDI cercanos Advertencias de tráfico Parar @@ -4054,7 +4054,7 @@ Si se desactiva, la grabación será iniciada al pulsar el widget o el elemento del menú, saltándose el diálogo de confirmación. Personalizar línea de ruta Línea de ruta - La línea de la ruta sería el uso %1$s especificado en el estilo de mapa seleccionado: %2$s. + La línea de ruta usará el %1$s definido en el estilo de mapa elegido: %2$s. Define el color para el modo de mapa: %1$s. • Las actualizaciones de OsmAnd Live se han movido a «Descargas > Actualizaciones». \n diff --git a/OsmAnd/res/values-es-rUS/phrases.xml b/OsmAnd/res/values-es-rUS/phrases.xml index de4e5bbae4..167b01f676 100644 --- a/OsmAnd/res/values-es-rUS/phrases.xml +++ b/OsmAnd/res/values-es-rUS/phrases.xml @@ -3924,4 +3924,6 @@ Kárate Aros Parcela de campamento + Oficina diplomática + Tipo de bahía \ No newline at end of file diff --git a/OsmAnd/res/values-es-rUS/strings.xml b/OsmAnd/res/values-es-rUS/strings.xml index b546e8be86..80780e72e8 100644 --- a/OsmAnd/res/values-es-rUS/strings.xml +++ b/OsmAnd/res/values-es-rUS/strings.xml @@ -209,7 +209,7 @@ Reductor de velocidad Radar de velocidad Aviso de tráfico - Favoritos cerca + Favoritos cercanos PDI cercanos Advertencias de tráfico Parar @@ -4054,7 +4054,7 @@ Si se desactiva, la grabación será iniciada al pulsar el widget o el elemento del menú, saltándose el diálogo de confirmación. Personalizar línea de ruta Línea de ruta - La línea de la ruta sería el uso %1$s especificado en el estilo de mapa seleccionado: %2$s. + La línea de ruta usará el %1$s definido en el estilo de mapa elegido: %2$s. Define el color para el modo de mapa: %1$s. No tienes compras Nuevo dispositivo / nueva cuenta @@ -4083,4 +4083,9 @@ \n \n ¿Actualizar todos los mapas añadidos a %1$s\? + Número de salida + Anunciar al excederse + Puntos de usuario + Salida + %1$s → … \ No newline at end of file diff --git a/OsmAnd/res/values-es/phrases.xml b/OsmAnd/res/values-es/phrases.xml index 3bbabd071b..f33ce085f9 100644 --- a/OsmAnd/res/values-es/phrases.xml +++ b/OsmAnd/res/values-es/phrases.xml @@ -3891,4 +3891,39 @@ Arbolado: sí Nombre de la pista Salto con esquís + Oficina diplomática + Kickboxing + Herradura + Esgrima + Ciclopolo + Curling + Crossfit + Pelea de gallos + Salto de gran altura + Toreo + Bobsleigh + Biatlón + Aikido + Esquí acuático + Waterpolo + Zurkhaneh + Lucha libre + Halterofilia + Wakeboarding + Disco Volador + Taekwondo + Futbolín + Sumo + Pista de carreras + Snooker + Lanzamiento de peso + Pilates + Jiu-jitsu + Kárate + Canastas + Parcela de acampada + Referencia local + Geodésico + Centro de conferencia + Tipo de bahía \ No newline at end of file diff --git a/OsmAnd/res/values-es/strings.xml b/OsmAnd/res/values-es/strings.xml index 7f25cba260..1b1ef24f90 100644 --- a/OsmAnd/res/values-es/strings.xml +++ b/OsmAnd/res/values-es/strings.xml @@ -4052,7 +4052,7 @@ Si se desactiva, la grabación se iniciará justo después de tocar el control o el elemento de menú, saltándose el diálogo de confirmación. Personalizar la línea de ruta Línea de ruta - La línea de ruta sería usar %1$s especificada en el estilo de mapa seleccionado: %2$s. + La línea de ruta usará el %1$s definido en el estilo de mapa elegido: %2$s. Especifica el color para el modo de mapa: %1$s. No tienes compras Nuevo dispositivo / nueva cuenta diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 8fa7588019..22ec8f53c2 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -4015,9 +4015,9 @@ Enregistrement de la trace arrêté Sélectionnez les segments Fréquence de mise à jour - Les cartes seront vérifiées chaque semaine. La prochaine vérification de mise à jour s\'effectuera à %1$s dans %2$s. - Les cartes seront vérifiées tous les jours. La prochaine vérification de mise à jour s\'effectuera à %1$s dans %2$s. - Les cartes seront vérifiées toutes les heures. La prochaine vérification de mise à jour s\'effectuera à %1$s dans %2$s. + Les cartes seront vérifiées chaque semaine. La prochaine vérification de mise à jour s\'effectuera le %1$s dans %2$s. + Les cartes seront vérifiées tous les jours. La prochaine vérification de mise à jour s\'effectuera le %1$s dans %2$s. + Les cartes seront vérifiées toutes les heures. La prochaine vérification de mise à jour s\'effectuera le %1$s dans %2$s. Supprimer les mises à jour Achats Sélectionnez la catégorie ou ajoutez-en une nouvelle diff --git a/OsmAnd/res/values-is/phrases.xml b/OsmAnd/res/values-is/phrases.xml index 943f9ee8e0..2e3ad0b907 100644 --- a/OsmAnd/res/values-is/phrases.xml +++ b/OsmAnd/res/values-is/phrases.xml @@ -3924,4 +3924,6 @@ Pilates Jiu-jitsu Karate + Sendiskrifstofa + Gerð flóa \ No newline at end of file diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml index 2da8e7c238..8b0b8e87a5 100644 --- a/OsmAnd/res/values-is/strings.xml +++ b/OsmAnd/res/values-is/strings.xml @@ -3853,7 +3853,7 @@ Áskrift að OsmAnd Live er í biðstöðu Notandaaðgangur Skrá inn á OpenStreetMap.org - Vinnsluferill kortamerkja + Ferill kortamerkja Bættu við a.m.k. tveimur punktum MGRS Áskrift að OsmAnd Live hefur verið sett í bið @@ -4086,4 +4086,9 @@ Í bið Útrunnið Uppfæra öll kort sem bætt hefur verið við %1$s\? + Númer útkeyrslu + Útkeyrsla + Tilkynna þegar farið er yfir + Punktar notanda + %1$s → … \ No newline at end of file diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml index 710c835669..90220cf9e8 100644 --- a/OsmAnd/res/values-pl/strings.xml +++ b/OsmAnd/res/values-pl/strings.xml @@ -1303,7 +1303,7 @@ Wszystkie Punkty trasy Ostrzeżenia ruchu drogowego - Najbliższe ulubione miejsca + Ulubione w pobliżu Pobliskie użyteczne miejsca Ogólne rejestrowanie pozycji do pliku GPX można włączyć lub wyłączyć za pomocą widgetu rejestrowania GPX na mapie. Częstość rejestrowania @@ -3738,7 +3738,7 @@ Ślady REC Rejestrowanie śladu do pliku GPX - Trasa szlaku + Śledź trasę Dodaj pliki śladów Importowanie lub rejestrowanie plików śladu Dodaj punkt trasy @@ -3989,7 +3989,7 @@ Zaloguj się do OpenPlaceReviews Woda Zima - Skuter + Skuter śnieżny Jazda konna Wyścigi Kolarstwo górskie @@ -4035,7 +4035,7 @@ Nowe urządzenie / nowe konto Kontakt z pomocą techniczną Rozwiązywanie problemów - Jeśli masz jakiekolwiek problemy z zakupami, skorzystaj z tego linku. + Jeśli masz jakiekolwiek problemy z zakupami, kliknij ten link. OsmAnd na żywo Roczna subskrypcja Subskrypcja miesięczna @@ -4066,4 +4066,21 @@ \n \n %1$s → … + Edytuj silnik routingu online + %1$s zawiera więcej niż jeden segment, musisz wybrać wymagany element nawigacji. + Segment %1$d + Zapisz i zatrzymaj nagrywanie + Zapis ścieżki zatrzymany + Czy na pewno chcesz zakończyć nagrywanie\? +\nWszystkie niezapisane dane zostaną utracone. + Pauza + Odległość po dotknięciu + Nagrywanie będzie kontynuowane. + Linia trasy będzie używana %1$s określona w wybranym stylu mapy: %2$s. + W okresie karencji + Wstrzymane + Numer wyjścia + Ogłoś, gdy zostanie przekroczony + Punkty użytkownika + Wyjście \ No newline at end of file diff --git a/OsmAnd/res/values-pt/phrases.xml b/OsmAnd/res/values-pt/phrases.xml index 1dc4d627b4..0d47393185 100644 --- a/OsmAnd/res/values-pt/phrases.xml +++ b/OsmAnd/res/values-pt/phrases.xml @@ -14,7 +14,7 @@ Teleférico Nós da rede de caminhada/ciclismo Rotas de caminhada - Fiscalização de trânsito + Controlo de tráfego Construção humana Construção de meio de transporte Abastecimento de água @@ -40,7 +40,7 @@ Finanças Natural Náutico - Área militar + Militar Wikipédia Definido pelo utilizador Sítio paleontológico @@ -48,19 +48,19 @@ Loja de bebidas alcoólicas Queijaria Loja de chocolates - Café + Loja de cafés Loja de conveniência Centro comercial Loja de bebidas Talho - Loja de gourmet - Loja de produtos agrícolas - Loja de verduras - Loja de produtos do mar - Doçaria + Delicatesse (comida fina e iguarias) + Loja de fazenda + Loja de frutas e verduras + Peixaria + Confeitaria Geladaria Supermercado - Casa de chá + Loja de chás Loja de massas Pastelaria Loja de laticínios @@ -75,7 +75,7 @@ Loja de malas Mobiliário de casa de banho Loja de roupa de cama - Loja de moda + Boutique Câmaras e lentes Loja de tapetes Loja de caridade @@ -89,7 +89,7 @@ Loja de cortinas Loja de tecidos Equipamento de mergulho - Artigos para casa + Loja de bricolagem Portas Loja de artigos eróticos Acessórios de moda @@ -97,7 +97,7 @@ Florista Loja de molduras Artigos de voo livre - Mobiliário + Loja de mobiliário Centro de jardinagem Móveis para jardim Tabacaria @@ -106,7 +106,7 @@ Paragem de tróleicarro Paragem de elétrico Oficial de justiça - Fundo de pensão + Fundo de pensões Local de piquenique Local de equitação Canalizador @@ -116,28 +116,28 @@ Navio-farol Impasse Arquitetura: casa grande alemã - Estrutura maritíma + Duque de alba (golfinho) Loja de gás em botija - Loja genérica + Loja de variedades Loja de lembranças Vidraria Loja de materiais de construção Aparelhos auditivos Ervanária Loja de alta fidelidade - Loja de artigos domésticos + Loja de artigos para o lar Equipamentos de caça Loja de decoração de interiores Joalharia Quiosque Mobiliário de cozinha Loja de artigos em pele - Suprimentos médicos + Produtos médicos Loja de telemóveis Loja de motas Loja de música Instrumentos musicais - Agência de notícias + Loja de jornais e revistas Óptica Produtos orgânicos Loja de artigos de atividades ao ar livre @@ -146,8 +146,8 @@ Loja de fotografia Loja de radiotecnia Loja de artigos usados - Loja de artigos para mergulho - Fornecedor de navios + Loja de artigos para mergulho autónomo + Fornecedor equipamento para barcos Artigos desportivos Papelaria Loja de utensílios de mesa @@ -161,10 +161,10 @@ Loja de persianas Grande armazém Loja de artigos eletrónicos - Loja de artigos de energia + Loja de equipamento energético Loja de automóveis Peças para automóveis - Loja de quadriciclos + Loja de moto quatro Cosméticos Mercado/feira Loja de produtos secos @@ -178,11 +178,11 @@ Armeiro Perfumaria Polícia - Bombeiros + Quartel de bombeiros Telefone de emergência Boca de incêndio Extintor de incêndio - Abafador de incêncio + Abafador de incêndio Mangueira de incêndio Reservatório de água contra incêndios Caixa de sal-gema @@ -196,7 +196,7 @@ Muralha de cidade Cancela elevatória Cabine de portagem - Alfândega + Controlo aduaneiro Lomba Lomba larga (2-4m) Lomba tipo almofada @@ -211,19 +211,19 @@ Lavagem de automóveis Posto de combustível;Posto de abastecimento;Posto de gasolina;Bomba de gasolina Gasóleo - Diesel GPL + Gasóleo GPL Gasóleo para pesados Biodiesel GPL - 80 Octanas - 91 Octanas - 92 Octanas - 95 Octanas - 98 Octanas - 100 Octanas - Gás natural para veículos - Combustível 1:25 - Combustível 1:50 + 80 octanas + 91 octanas + 92 octanas + 95 octanas + 98 octanas + 100 octanas + Gás natural comprimido + Mistura 1:25 + Mistura 1:50 Etanol Metanol Óleo vegetal combustível @@ -234,7 +234,7 @@ Hidrogénio líquido Eletricidade Posto de carregamento;Estação de carregamento; Estação de carregamento de veículos elétricos; Ponto de carregamento elétrico; Ponto de carregamento - Rampa de veículo + Rampa para veículos Ar comprimido Estacionamento Tipo de combustível @@ -252,7 +252,7 @@ Forma de pagamento Som Tipo - Pavimentação tátil + Pavimento tátil Serviço Sem escova Automatizado @@ -263,7 +263,7 @@ Tipo Transporte de bicicleta Aquecimento - Bomba + Bomba de água/motor Designação Tipo Tipo @@ -280,18 +280,18 @@ Acampamento de escuteiros Tipo Género - Assentos ao ar livre + Esplanada Pago Fumar - Entrega - Drive-in - Drive-through + Entrega ao domicílio + Serviço ao volante + Serviço ao volante Serviço de take-away Cocktails Microcervejaria Serviço Tipo - Resíduos aceites + Resíduos admitidos Tipo Lareira Superfície @@ -303,7 +303,7 @@ Caravanas Fornecimento de energia Sistema médico - Prato + Tipos de comida Tipo de pagamento (transporte) Tipo Ar comprimido @@ -347,7 +347,7 @@ Tipo Livros Denotação - Estacionamento integrado + Estacionamento de intercâmbio Categoria de dificuldade Penhasco de escalada Infraestrutura de emergência @@ -357,7 +357,7 @@ Artigos religiosos Estação de combustível de aeronaves Posto de gasolina para embarcações - Estacionamento de moto + Estacionamento para motos Entrada de estacionamento Garagens Paragem de transporte público @@ -368,17 +368,17 @@ Estação rodoviária Estação ferroviária Plataforma ferroviária - Paragem ferroviária + Apeadeiro ferroviário Entrada de metropolitano Sim - Para-choque de via + Pára-choques de via férrea Praça de táxis Aeroporto Heliponto Pista de aterragem/descolagem Terminal de aeroporto Portão de embarque - Rampa náutica + Rampa para barcos Terminal de balsa/ferry Farol Aluguer de bicicletas @@ -398,35 +398,35 @@ Torre de teleférico Túnel Ponte - Radar - Balão de retorno + Radar de velocidade + Círculo de viragem Saída de autoestrada - Entroncamento - Área de repouso + Cruzamento + Área de descanso Poço de água Boca de incêndio (tubo) Estação de tratamento de água Estaleiro naval - Estação de tratamento de esgoto + Estação de tratamento de esgotos (ETAR) Reservatório elevado Comporta de eclusa - Balão de retorno aquático - Represa / açude + Ponto de viragem fluvial + Represa;Açude Barragem Moinho de água - Quebra-mar / molhe - Estacada + Quebra-mar;Molhe + Espigão marítimo Subestação Transformador Cabine de distribuição elétrica Central elétrica Gerador de energia - Torre de transmissão - Poste de transmissão + Torre de eletricidade + Poste de eletricidade Posto de correios Caixa de correio Telefone público - Torre de comunicação + Torre de telecomunicações Torre de observação Campanário Torre de arrefecimento @@ -435,47 +435,47 @@ Reciclagem Centro de reciclagem Contentor - Vidro + Vidros Papel Roupas Latas Garrafas de vidro - Plástico + Plásticos Sucata de metal Pilhas Garrafas de plástico Resíduos verdes Resíduos (sacos pretos) Embalagens de plástico - Jornal - Caixas + Jornais + Papel cartonado de comida e bebida Papelão/cartão Revistas Embalagens de papel - Pequenos eletrodomésticos + Pequenos aparelhos Madeira Livros Calçados Alumínio - Orgânico + Resíduos orgânicos Embalagens de cartão de bebidas Resíduos de jardim Lâmpadas de baixo consumo Lâmpadas fluorescentes Metal Itens elétricos - Linha branca + Eletrodomésticos Óleo de cozinha - Óleo do motor + Óleo de motor Sacos plásticos Resíduos perigosos Telemóveis Mercúrio Computadores Pneus - TV, monitores + Televisores, monitores Tetrapak - Entulho + Escombros de obras CDs Resíduo de óleo Garrafas @@ -487,7 +487,7 @@ Poliestireno extrudido Medicamentos Composto orgânico - Escombros + Escombros de obras Árvores de Natal Lâmpadas incandescentes Cartão prensado @@ -507,7 +507,7 @@ Área residencial Área industrial Área ferroviária - Área de negócios + Área comercial Área de vendas a retalho Pedreira Vinha @@ -528,16 +528,16 @@ Radar Guindaste Construção - Terreno abandonado - Terreno virgem + Terreno industrial abandonado + Terreno com loteamento planeado Fábrica Poço de mineração - Ádito de mineração + Galeria de acesso a mina Poço de petróleo - Ponto de exame geográfico + Vértice geodésico Moinho de vento Salina - Lago artificial + Reservatório artificial Redes de críquete Gasómetro Silo @@ -547,7 +547,7 @@ Escola de condução Escola infantil Escola - Centro de treinamento + Centro de formação Universidade Serviço social Tribunal @@ -559,7 +559,7 @@ Migração Inspeção fiscal Escritório administrativo - Aduaneiro + Alfândega País Capital de distrito Sim @@ -576,7 +576,7 @@ Farmácia Hospital Consultório médico - Clínica;Centro de saúde + Clínica;Centro de saúde;Unidade de Saúde;Posto Médico Primeiros socorros Dentista Clínica geriátrica @@ -603,11 +603,11 @@ Empresa de telecomunicações ONG Junta de freguesia/câmara municipal - Agência de empregos + Agência de emprego Centro de pesquisa e investigação - Escritório de TI - Jornal - Arquiteto + Escritório de tecnologias da informação + Jornal (sede ou agência) + Escritório de arquitetura Agência de publicidade Instituição de ensino Estúdio @@ -620,11 +620,11 @@ Fundação Conselheiro fiscal Estádio - Centro/clube desportivo + Complexo desportivo Campo de golfe Pista de patinagem no gelo Campo desportivo - Pista de desporto + Pista de desportos Pista de atletismo Pista de ciclismo Hipódromo @@ -641,7 +641,7 @@ Voleibol de praia BMX Bocha - Tigelas + Lawn bowls Futebol canadiano Canoa Xadrez @@ -650,7 +650,7 @@ Croquete Ciclismo Mergulho - Mergulho + Mergulho autónomo Corridas de cães Hipismo Hóquei em campo @@ -699,10 +699,10 @@ Chafariz Ruínas históricas Pedra rúnica - Naufrágio + Navio naufragado Navio histórico Mina histórica - Monumento simbólico + Memorial monumental Jardim zoológico Aquário Parque de diversões @@ -716,7 +716,7 @@ Montanha russa Tobogã Tobogã de verão - Carrossel swing + Carrossel de cestas Comboio (atração) Tobogã aquático Alojamento @@ -810,14 +810,14 @@ Shingon shu Maronita Maaiana - Acesso à Internet: wifi + Acesso à Internet: Wi‑Fi Acesso à Internet: terminal Acesso à Internet: com fio Acesso à Internet: público Acesso à Internet: serviço - Com acesso à Internet - Sem acesso à Internet - Acesso à Internet: taxa paga + Acesso à Internet: sim + Acesso à Internet: não + Acesso à Internet: sob pagamento Acesso à Internet: grátis Mosteiro Área religiosa @@ -890,7 +890,7 @@ Circo Galeria de arte Pista de dança - Danceteria;Casa noturna;Boate + Discoteca;Danceteria Clube de striptease Resort de esqui Resort de praia @@ -905,9 +905,9 @@ Piscina Parque aquático Parque urbano - Área de recreação - Área verde - Café / cafetaria + Zona recreativa + Village green (GB) + Café Biergarten Restaurante Comida rápida @@ -919,14 +919,14 @@ Máquinas agrícolas Cesteiro Apicultor - Ferraria - Cervejaria + Ferreiro + Cervejeiro Estaleiro Encadernador - Carpintaria + Carpinteiro Colocador de carpete - Fornecedor de comida - Relojoaria + Fornecedor de comida (catering) + Relojoeiro Costureira Eletricista Jardineiro @@ -934,32 +934,32 @@ Artesão Aquecimento, ventilação, ar condicionado Isolação térmica - Joalheria + Joalheiro Chaveiro Copiador de chaves - Serralharia - Ótica + Serralheiro + Oftalmologista Pintor Instalador de parquet Fotógrafo Laboratório fotográfico Gesseiro Oleiro - Armador + Artesão de mastros e cordas para barcos Telhadista Seleiro Reparador de velas náuticas Serração Montador de andaimes Escultor - Sapataria - Construtor de estande + Sapateiro + Construtor de estandes de feiras Canteiro Fábrica de toldos Vassoureiro - Alfaiataria + Alfaiate Ladrilheiro - Funilaria + Latoeiro Estofador Relojoeiro Fabricante de janelas @@ -968,24 +968,24 @@ Salão de beleza Manicura Cabeleireiro - Salão de massagem + Salão de massagens Estúdio de tatuagem Limpeza de roupa a seco Lavandaria Aluguer de automóveis - Carro partilhado - Ponto de partilha de carros - Barcos partilhados + Ponto de carros partilhados + Ponto de boleia solidária de carro + Ponto de barcos partilhados Doca - Linha de corte florestal + Linha de corte florestal;Atalhada;Linha corta-fogo Casa de banho;Banheiros - Chuveiro + Chuveiros públicos Sauna Bordel Área de fumadores Morgue Crematório - Cyber café + Cibercafé Agência bancária Caixa automática Terminal de pagamento @@ -993,7 +993,7 @@ Casa de penhores Casa de câmbio Contabilista - Pagamento em Bitcoin + Pagamento em bitcoin Entrada de caverna Cume Passo de montanha @@ -1013,7 +1013,7 @@ Recife Vale Água - Zona úmida + Zona húmida Bosque nativo Árvore Reserva natural @@ -1027,8 +1027,8 @@ Baliza luminosa de águas seguras Baliza luminosa de propósito especial Atracadouro - Marco náutico edifício - Marco náutico ponte + Edifício náutico + Marca naval: ponte Bóia cardinal Bóia de instalação Bóia, perigo isolado @@ -1050,7 +1050,7 @@ Atracação Eclusa Marco náutico aviso - Trapiche + Pilar Marco náutico transponder Marco náutico estação de rádio Estação de sinal de tráfego @@ -1090,7 +1090,7 @@ Wiki em galego Wiki em hebraico Wiki em hindi - Wki em croata + Wiki em croata Wiki em haitiano Wiki em húngaro Wiki em indonésio @@ -1121,7 +1121,7 @@ Wiki em volapuque Wiki em chinês Wiki em africâner - Wiki em alemânico + Wiki em alsaciano Wiki em azeri Wiki em bengali Wiki em bishnupriya @@ -1131,9 +1131,9 @@ Wiki em esperanto Wiki em basco Wiki em persa - Wiki em frisão + Wiki em frísio Wiki em irlandês - Wiki em armênio + Wiki em arménio Wiki em islandês Wiki em georgiano Wiki em curdo @@ -1145,7 +1145,7 @@ Wiki em baixo-saxão Wiki em navajo Wiki em osseta - Wiki em piamontês + Wiki em piemontês Wiki em sardenho Wiki em servo-croata Wiki em albanês @@ -1169,7 +1169,7 @@ Wiki em bashkir Wiki em scots Wiki em panjabi - Wiki em tchuvache + Wiki em chuvache Wiki em lombardo Wiki em birmanês Wiki em iorubá @@ -1186,7 +1186,7 @@ Bloco Armadilha anti-carro (autocarros passam) Mata-burro - Catraca de altura completa + Torniquete de altura completa Portão de colisão Barreira genérica Travessia em cerca @@ -1194,16 +1194,16 @@ Barreira de Nova Jersey Limitador de altura Passagem para cavalos - Quebra-corpo - Portão de fortaleza + Cancela anti-gado + Poterna Cancela de balanço - Catraca + Torniquete Pilaretes anti-carro (carroças passam) Passagem sobre um muro ou uma vedação Entrada principal Entrada Saída - Travessia de pedestres + Passadeira de peões Ponto de rede cicloviária internacional Ponto de rede cicloviária nacional Ponto de rede cicloviária regional @@ -1257,19 +1257,19 @@ Outono Inverno Com semáforos - Sem controle de tráfego - Não sinalizado - Data de início/Inauguração + Não controlado (sem semáforo e barreira) + Não sinalizado (sem marcas nem semáforo) + Data de início/inauguração Acesso de cadeiras de rodas Sim Não Limitado - Venda por atacado + Grossista Acesso privado Acesso proibido Acesso para trânsito local - Acesso permissivo - Acesso para cliente + Acesso tolerado + Acesso só para clientes Acesso para entregas Acesso agrícola Conteúdo: silagem @@ -1292,28 +1292,28 @@ Proibido Obrigatório Habitual - Permissivo + Tolerado Materiais de construção - Tubos e conexões - Madeiras + Materiais de pichelaria + Venda de madeiras Artigos agrícolas Telhas População Subterrâneo Vários andares - Âncora - U-invertido - Suporte de roda + Âncoras + Encosto simples comum + Encaixes de roda Prateleira Edifício especial - Abrigo de bicicletas - Poste de amarração - Informal + Abrigo fechado de bicicletas + Pilarete com anel de amarração + Informal (por ex. gradeamento) Latifoliadas - Acicular + Folhas agulhadas Mista Desfolhada - Espécies + Espécie Género Táxon Oliveira @@ -1324,18 +1324,18 @@ Bananeira Aveleira Coqueiro - Caquizeiro + Diospireiro Cerejeira Nogueira Ameixeira Pessegueiro - Erveira + Chá Coca - Kiwizeiro + Kiwi Pomar Nectarineira Mangueira - Seringueira + Árvore-da-borracha Tamareira Cafeeiro Romãzeira @@ -1378,7 +1378,7 @@ Nome antigo Nome alternativo Manual - Elétrica + Bomba a eletricidade Sem bomba Sim Mineral @@ -1389,15 +1389,15 @@ Painel Mapa Posto de turismo - Marca de caminho - Terminal - Marcador de rota + Sinalização de rota + Terminal eletrónico de informação + Sinalização de rota Mapa de caminhadas Natureza História Placa Audioguia - Mapa ciclístico + Mapa de ciclismo Modelo tátil Mapa tátil Quadro de avisos @@ -1411,7 +1411,7 @@ Sim Não coberto Não permitido - Apenas do lado de fora + Apenas no exterior Permitido Em sala separada Em sala isolada @@ -1423,7 +1423,7 @@ Sem piso tátil Sim Som: não - Só quando permitido atravessar + Só ao atravessar Estação de resgate Área de serviço Mini-rotunda @@ -1437,10 +1437,10 @@ Relvado Pradaria Matagal - Campo agrícula + Campo agrícola Desmatamento Areia - Fruto caído + Derrocada inesperada Árvores mortas Lugar de passagem Andar @@ -1462,7 +1462,7 @@ Jardim comunitário Jardim privado Jardim botânico - Estilo de jardim: cozinha + Estilo de jardim: horta, quintal Jardim de rosas Jardim francês Jardim inglês @@ -1479,7 +1479,7 @@ Lugares reservados para pais Sem lugares reservados para pais Lugares reservados para pais - Capacidade de cabine/cadeira/carro + Capacidade da cabine/cadeira/carro Capacidade por hora Tempo de viagem médio, minutos Bolha @@ -1524,7 +1524,7 @@ Cartão de débito Não aceita cartão de débito Bitcoin - Não aceita Bitcoin + Não aceita bitcoin Visa Não aceita cartão Visa MasterCard @@ -1587,7 +1587,7 @@ V PAY Não aceita cartão V PAY Dogecoin - Não aceita Dogecoin + Não aceita dogecoin Cibus Não aceita cartão Cibus Transferência eletrónica @@ -1665,7 +1665,7 @@ Dieta livre de glúten: não Kosher Apenas kosher - kosher + Kosher Dieta kosher: não Halal Apenas halal @@ -1677,9 +1677,9 @@ Dieta livre de lactose: não Piscitariana Sim - Drive-in: não + Serviço ao volante: não Sim - Drive-thru: não + Serviço ao volante: não Nome da cervejaria Sim Sem microcervejaria @@ -1692,17 +1692,17 @@ Sem entrega ao domicílio Apenas entrega ao domicílio Sim - Lugar ao ar livre: sim - Sem lugar ao ar livre - Lugar ao ar livre: terraço - Lugar ao ar livre: passeio - Lugar ao ar livre: zona pedonal - Lugar ao ar livre: jardim - Lugar ao ar livre: pátio + Esplanada: sim + Sem esplanada + Local da esplanada: no terraço + Local da esplanada: no passeio + Local da esplanada: na zona pedonal + Local da esplanada: no jardim + Local da esplanada: no pátio Sim - Artigos de segunda mão - Sem artigos de segunda mão - Apenas artigos de segunda mão + Produtos usados: sim + Produtos usados: não + Produtos usados: unicamente Peças Representante Reparação @@ -1717,7 +1717,7 @@ Sim Sem escova: não Não - Banho público + Banhos públicos Masculino Proibido para homens Feminino @@ -1728,19 +1728,19 @@ Sem casa de banho Acesso de cadeiras de rodas às casas de banho: sim Acesso de cadeiras de rodas às casas de banho: não - Acesso à casa de banho: clientes - Acesso à casa de banho: permitido + Acesso à casa de banho: só clientes + Acesso à casa de banho: tolerado Acesso à casa de banho: comunidade Acesso à casa de banho: público - Fraldário - Com trocador de fralda - Sem trocador de fralda - Sala para trocar fralda + Número de mesas de fraldário + Com fraldário + Sem fraldário + Espaço comum no WC com fraldário Limite de tempo de estacionamento Bilhetes de estacionamento Cigarros - Sacos para excremento - Bilhetes de transporte público + Sacos para excrementos + Bilhetes de transportes públicos Bebidas Doces Retirada de encomenda e correspondência @@ -1755,7 +1755,7 @@ Leite Moeda alongada Pão - Gomas de mascar + Chiclas Bilhetes de estacionamento; bilhetes de transportes públicos Café Bilhete de portagem @@ -1770,18 +1770,18 @@ Velas Brinquedos Gelados - Cartão SIM - Ramal/sucursal + Cartões de telemóvel (SIM) + Filial;Sucursal Memorial de guerra Placa comemorativa Estátua - Pedra + Rocha Estela Busto Koshinto - Placa azul + Blue plaque Jizo - Em forma cruzada + Cruz memorial Veículo Stolpersteine Obelisco @@ -1805,7 +1805,7 @@ Cobre Diamante Rocha ornamental - Dolomita + Dolomite Gás Ouro Grafite @@ -1836,23 +1836,23 @@ Ardósia Pedra Estanho - Tufa + Tufo Urânio Vanádio Água Zinco Zircão - Prado úmido - Pântano - Charco + Prado húmido + Turfeira + Marisma Canavial - Brejo + Pântano Salina Planície de maré Pântano salgado - Mangue + Mangal Cadeia de pântanos - Pântano subeterrâneo + Pântano subterrâneo Pântano palsa Lama Areia @@ -1868,8 +1868,8 @@ Sem caixote do lixo Transporte público Piquenique - Contra intempéries - Alpendre + Abrigo de intempéries + Galpão Cabana básica Edifício Esconderijo para observar vida silvestre @@ -1894,12 +1894,12 @@ Tipo de obra de arte: mural Tipo de obra de arte: arquitetura Tipo de obra de arte: pintura - Tipo de obra de arte: pedra + Tipo de obra de arte: rocha Tipo de obra de arte: busto Tipo de obra de arte: instalação Tipo de obra de arte: mosaico Tipo de obra de arte: relevo - Tipo de obra de arte: grafite + Tipo de obra de arte: grafíti Tipo de obra de arte: estela Tipo de obra de arte: fonte Largura @@ -1961,7 +1961,7 @@ Superfície: cimento Superfície: paralelos Superfície: pedras irregulares - Superfície: piso intertravado + Superfície: blocos de pavimentação Superfície: cascalho Superfície: pedra Superfície: metal @@ -1970,7 +1970,7 @@ Superfície: brita fina Superfície: solo compactado Superfície: areia - Superfície: relvado + Superfície: erva Superfície: blocos com buraco no meio para erva Superfície: chão Superfície: terra @@ -1983,8 +1983,8 @@ Tróleicarro Elétrico Comboio - Veículo leve sobre trilhos - Monotrilho + Comboio ligeiro + Monocarril Funicular Balsa/ferry Metropolitano @@ -1995,43 +1995,43 @@ Venda Venda de bicicletas: não Reparação - Conserto de bicicletas: não + Reparação de bicicletas: não Aluguer Aluguer de bicicletas: não - Bomba - Bomba de bicicleta: não + Bomba de encher pneus + Bomba de encher pneus: não Ferramentas para reparação própria - Ferramentas para reparação de bicicleta DIY: não + Ferramentas para reparação própria: não Limpeza Limpeza de bicicletas: não - Chaintool - Ferramenta para correia de bicicleta: não + Ferramentas para correia de bicicletas + Ferramentas para correia de bicicletas: não Venda de bicicletas em segunda mão Venda de bicicletas em segunda mão: não Cobrança: sim Cobrança: não - Estação de reparação de bicicletas; Estação da auto-reparação da bicicleta + Estação de reparação de bicicletas;Estação de auto-reparação de bicicleta Observatório de vida selvagem - Treinamento: idioma - Treinamento: música - Treinamento: dança - Treinamento: desporto - Treinamento: arte - Treinamento: cozinhar - Treinamento: computação - Treinamento: ioga - Treinamento: arte marcial - Treinamento: aviação - Treinamento: cabeleireiro - Monumento - Tipo: indústria petroleira + Formação: idioma + Formação: música + Formação: dança + Formação: desporto + Formação: arte + Formação: cozinhar + Formação: computação + Formação: ioga + Formação: arte marcial + Formação: aviação + Formação: cabeleireiro + Estrutura monumental + Tipo: indústria petrolífera Tipo: poço Tipo: fábrica Tipo: indústria de gás Tipo: madeira Tipo: refinaria Tipo: armazém - Tipo: guincho de veículos + Tipo: sucateiro Tipo: agricultura Tipo: cervejaria Tipo: olaria @@ -2042,11 +2042,11 @@ Tipo: depósito Nota Bebedouro para animais - Embarque de animais - Tipo de embarque: cão - Tipo de embarque: gato - Tipo de embarque: cão, gato - Tipo de embarque: cavalo + Hotel de animais + Tipo de hotel de animais: para cães + Tipo de hotel de animais: para gatos + Tipo de hotel de animais: para cães e gatos + Tipo de hotel de animais: para cavalos Avião histórico Com elevador Sem elevador @@ -2063,23 +2063,23 @@ Editora de livros Combustível 91UL Combustível 100LL - GPL auto - Combustível Jet A-1 - Fluido de escape diesel + Autogas (etanol livre de chumbo para carros e aviões) + Combustível de jato A-1 + Fluido de escape diesel (ARLA) Combustível: madeira Combustível: carvão vegetal Combustível: carvão Lâmpada de rua Escapatória de paragem de emergência Cultivo: arroz - Cultivo: relvado + Cultivo: erva Cultivo: milho Cultivo: cereais Cultivo: cana de açúcar Cultivo: trigo Cultivo: soja Cultivo: cevada - Cultivo: legumes + Cultivo: vegetais Cultivo: lúpulo Cultivo: colza Cultivo: beterraba @@ -2115,14 +2115,14 @@ Fatos Maternidade Vintage - Tamanho grande + Tamanhos grandes Escolar Trajes de banho Meias Camisas Dança Militares - Marco histórico + Marco miliário Crianças Femininos Desportivos @@ -2151,9 +2151,9 @@ Sim Não Sim - Não - Apenas grupos: sim - Apenas grupos: não + Campismo de escuteiros: não + Só para grupos: sim + Só para grupos: não Sim Máquina de lavar roupa: não Sim @@ -2181,14 +2181,14 @@ Proibido cães Serviços para refugiados Refugiados: não - Moradia assistida + Casa-família Assistência domiciliar - Alcance + Aconselhamento Banco de alimentos Abrigo Assistência em ambulatório Atelier para pessoas desprotegidas/deficientes - Berçário + Assistência médica Idosos Crianças Órfãos @@ -2207,15 +2207,15 @@ Drama Ópera Cabaré - Fantoche + Fantoches Comédia Música de câmara - Marionete + Marionetas Balé Jogo de sombras Coreto Forno - Produto: tijolo + Produto: tijolos Produto: cal viva Produto: couro Produto: cal @@ -2242,7 +2242,7 @@ Condição dos degraus: regular Condição dos degraus: irregular Condição dos degraus: acidentada - Moledro + Moledro;Moledo;Melédro;Mariola Desfibrilhador Desfibrilhador: sim Tipo: túmulo de guerra @@ -2255,27 +2255,27 @@ Tipo: sarcófago Tipo: cripta Tipo: pirâmide - Civilização: roma antiga (753 a.C. – 284 d.C.) + Civilização: romana antiga (753 a.C. – 284 d.C.) Civilização: nuráguica (XVIII a.C. – II d.C.) Civilização: etrusca (XII – VI a.C.) Civilização: pré-histórica Civilização: grega antiga Civilização: romana Civilização: bizantina (285 d.C. – 1453 d.C.) - Civilização: imperial chinês (221 a.C. – 1911 d.C.) + Civilização: imperial chinesa (221 a.C. – 1911 d.C.) Civilização: egípcia antiga (até 332 a.C.) Civilização: celta Civilização: romana ocidental (285 d.C – 476 d.C.) - Civilização: micênica - Civilização: dácios - Civilização: hérnicos + Civilização: micénica + Civilização: dácia + Civilização: hérnica Civilização: grego-egípcia (332 a.C. – 30 a.C.) Civilização: romana e egípcio bizantina Civilização: heládica - Civilização: cíclades + Civilização: cicládica Civilização: minóica - Civilization: tiahuanaco - Treinamento animal + Civilização: tiauanaca + Treino de animais Cães Cavalos Permitido cavalos @@ -2308,7 +2308,7 @@ Período histórico: Egito bizantino (30 a.C. – 641 d.C.) Período histórico: ocupação persa Período histórico: período homérico (1100 – 800 a.C.) - Período histórico: Roma Grécia (146 a.C. – 330 d.C.) + Período histórico: Grécia romana (146 a.C. – 330 d.C.) Período histórico: Império Romano (753 – 509 a.C.) Período histórico: dominato (285 – 476 d.C.) Período histórico: aldeão (época I e II, 1580 a.C. – 133 d.C.) @@ -2319,7 +2319,7 @@ Era histórica: mesolítico Era histórica: neolítico Era histórica: idade do cobre (milénios IV-III a.C.) - Pedra histórica + Rocha histórica Tipo: cruz de conciliação Tipo: brasão Material: madeira @@ -2337,7 +2337,7 @@ Material: vidro Material: bronze Material: terra - Material: composto + Material: compósito Material: calcário Material: mármore Material: alumínio @@ -2360,36 +2360,36 @@ Tipo de fortificação: arandela Tipo de fortificação: vala circular Pa (assentamento fortificado maori) - Fazenda histórica + Quinta histórica;Fazenda histórica Estação ferroviária histórica Eira histórica Forca histórica Ferrovia histórica - Praça; praceta + Praça;Praceta Artista Escultor - Tipo de edificação: igreja - Tipo de edificação: capela - Tipo de edificação: mesquita - Tipo de edificação: templo - Tipo de edificação: catedral - Tipo de edificação: mosteiro - Tipo de edificação: basílica - Tipo de edificação: sinagoga - Tipo de edificação: santuário + Tipo de edifício: igreja + Tipo de edifício: capela + Tipo de edifício: mesquita + Tipo de edifício: templo + Tipo de edifício: catedral + Tipo de edifício: mosteiro + Tipo de edifício: basílica + Tipo de edifício: sinagoga + Tipo de edifício: santuário Cruz - Cruz de cimeira: sim + Cruz cimeira: sim Antigo campo de detenção Tipo: campo de concentração Tipo: campo de prisioneiros de guerra - Tipo: campo de trabalho + Tipo: campo de trabalhos forçados Tipo: nazi Tipo: gulag Temperatura Banho: sim Banho: não - Armazenamento de barco - Transporte: sim + Armazenamento de barcos + Escada ou passadeira rolante: sim Referência da ponte Referência do túnel Referência @@ -2398,10 +2398,10 @@ Bicicletas Contentor Veículos pesados - Ginásio;academia desportiva + Equipamento público de ginástica Hackerspace Reparação de aparelhos eletrónicos - Loja de fogos de artifício + Loja de fogo de artifício Comprimento Clínica geral Oftalmologia @@ -2418,24 +2418,24 @@ Radioterapia Psiquiatria Neurologia - Dermatovenereología + Dermatovenereologia Cardiologia Traumatologia Bioclínica Osteopatia - Anestesia + Anestesiologia Pneumologia Cirurgia dental, oral e maxilofacial Maternidade - Emergência e urgência - Sem emergência e urgência + Medicina de urgência + Sem medicina de urgência Cirurgia plástica Ortodontia Fisioterapia Bioquímica Terapia ocupacional Psiquiatria infantil - Fisiatria + Fisiatria e reabilitação Cirurgia maxilofacial Radiologia diagnóstica Gastroenterologia @@ -2475,7 +2475,7 @@ Psicologia profunda Comportamental Medicina paliativa - Tipo de edificação: pirâmide + Tipo de edifício: pirâmide Ginásio;Academia desportiva Exercício físico Bilhar @@ -2495,7 +2495,7 @@ Judo Golfe de disco Futsal - Corrida de carrinho de controle remoto + Corridas de carros telecomandados Squash Shuffleboard Lacrosse @@ -2518,7 +2518,7 @@ Armário de distribuição Comércio justo: sim Comércio justo: não - Somento produtos de comércio justo + Apenas produtos de comércio justo Bandy Área protegida Tipo de proteção @@ -2558,8 +2558,8 @@ Produto da explosão Buraco da explosão Altura da erupção - Altitude do marco zero - Magnitude da conda do corpo + Altitude do ponto de detonação + Magnitude da onda de propagação Salva de explosão: primeira detonação de um teste de salva Salva de explosão: segunda ou posterior detonação de um teste de salva Explosão: diâmetro da cratera @@ -2581,14 +2581,14 @@ Aterragem Aterragem elevada Reboque - Treinamento + Formação Oficial: sim Oficial: não Parapente Parapente: não Asa-delta Asa-delta: não - Rígido + Rígida Asa-delta rígida: não Orientação do local para voo livre: N Orientação do local para voo livre: NE @@ -2615,8 +2615,8 @@ Serviço de saúde: enfermagem: não Serviço de saúde: aconselhamento: sim Serviço de saúde: aconselhamento: não - Serviço de saúde: exame: sim - Serviço de saúde: exame: não + Serviço de saúde: exames: sim + Serviço de saúde: exames: não Serviço de saúde: cuidados infantis: sim Serviço de saúde: cuidados infantis: não Serviço de saúde: prevenção: sim @@ -2625,8 +2625,8 @@ Serviço de saúde: vacinação: não Serviço de saúde: apoio: sim Serviço de saúde: apoio: não - Serviço de saúde: teste: sim - Serviço de saúde: teste: não + Serviço de saúde: exames: sim + Serviço de saúde: exames: não Consultório médico Tipo de instalação de saúde: hospital de campanha Tipo de instalação de saúde: centro de aconselhamento @@ -2636,7 +2636,7 @@ Tipo de instalação de saúde: farmácia Tipo de instalação de saúde: primeiros socorros Tipo de instalação de saúde: lar de idosos - Tipo de instalação de saúde: casa de grupo de apoio + Tipo de instalação de saúde: apoio a casa-família Ponto de sucção Subterrâneo Coluna @@ -2718,7 +2718,7 @@ Emergências: sim Emergências: não Sim - Visita domiciliar: não + Visitas domiciliárias: não Malária: sim Malária: não Ébola: sim @@ -2728,12 +2728,12 @@ SIDA: sim SIDA: não Consultório médico - Escritório de terapeuta - Escritório de podologista - Escritório de curandeiro - Escritório de psicólogo - Serviço de enfermagem - Escritório de parteira + Gabinete de terapeuta + Gabinete de podologista + Gabinete de curandeiro + Gabinete de psicólogo + Gabinete de enfermagem + Gabinete de parteira Diâmetro da boca de incêndio Pressão da boca de incêndio Número de ligações @@ -2742,12 +2742,12 @@ Relvado Faixa de trânsito Estacionamento - Rua + Estrada Subterrâneo Estilo de boca de incêndio: especial Rede de água Lagoa - Ribeira + Ribeiro ou rio Em serviço: sim Tipo de armário de distribuição: eletricidade Tipo de armário de distribuição: telecomunicações @@ -2758,9 +2758,9 @@ Tipo de armário de distribuição: água Tipo de armário de distribuição: iluminação pública Ponto de controlo militar - Cacifos - Suspenso - De roda + Compartimentos tipo cacifos + Árvore metálica + Ranhura cobre a rota Profundidade Sal Sal: não @@ -2768,26 +2768,26 @@ Rejeito de mineração Acampamento de verão Centro de recreativo - Ativação do cruzamento: automático - Ativação do cruzamento: local - Ativação do cruzamento: remoto - Barreira do cruzamento: não - Barreira do cruzamento - Barreira do cruzamento: total - Barreira do cruzamento: metade - Barreira do cruzamento: dupla metade + Abertura das cancelas: automática + Abertura das cancelas: no local pela empresa + Abertura das cancelas: remota + Passagem de nível com cancelas: não + Passagem de nível com cancelas + Passagem de nível com cancelas: toda a largura da estrada + Passagem de nível com cancelas: metade da estrada + Passagem de nível com cancelas: dupla metade da estrada Sinal sonoro Sinal sonoro: não Sinal luminoso Sinal luminoso: não - Cruzamento sob demanda - Cruzamento sob demanda: não - Cruz de Santo André - Cruz de Santo André: não - Cruzamento vigiado - Cruzamento vigiado: não - Cruzamento vigiado: pessoa física - Cruzamento vigiado: câmara + Abertura das cancelas por botão + Abertura das cancelas por botão: não + Sinal de passagem de nível sem guarda (X) + Sinal de passagem de nível sem guarda (X): não + Atravessamento vigiado + Atravessamento vigiado: não + Atravessamento vigiado: pessoa física + Atravessamento vigiado: câmara Sim Não vende medicamentos sujeitos a receita médica Internacional @@ -2796,7 +2796,7 @@ Militar Militar/público Privado - Pequeno vale + Balka (pequeno vale) Poço de ventilação Tipo de bomba: bomba de vareta Tipo de bomba: Índia Mk II ou III> @@ -2820,9 +2820,9 @@ Uso: espionagem Meteorológico Gravitacional - Horticultura em estufa + Zonas de estufas de hortículas Voltagem - Saída de energia + Potência de saída Saída: eletricidade Potência de saída de água quente Saída: água quente @@ -2835,8 +2835,8 @@ Potência de saída do biogás Saída: biogás Estação de bombeamento - Display: sim - Display: não + Mostrador: sim + Mostrador: não Mostrador analógico Mostrador digital Relógio de sol @@ -2853,7 +2853,7 @@ Suporte: árvore Suporte: pedestal Suporte: de chão - Suporte: outdoor + Suporte: outdoor publicitário Suporte: teto Suporte: suspenso Suporte: telhado @@ -2864,7 +2864,7 @@ Aquicultura: camarão Aquicultura: peixes Aquicultura: mexilhões - Quadro de distribuição principal + Rede de distribuição principal (MDF) Idade mínima Sim Não @@ -2877,11 +2877,11 @@ Delegação Residência do embaixador Alto comissariado - Operador do corpo de bombeiros + Operador de incêndios Tanque de água - Eliminação de dejetos: descarga - Eliminação de dejetos: latrina por poço - Eliminação de dejetos: químico + Eliminação de dejetos: descarga de água + Eliminação de dejetos: latrina tipo poço + Eliminação de dejetos: química Eliminação de dejetos: balde Comprimento Wikipédia @@ -2889,7 +2889,7 @@ Evento de Natal Mercado de Natal Pirâmide de Natal - Loja de Natal + Loja de artigos de Natal Loja de árvores de Natal Árvore de Natal Natal: período para o evento @@ -2907,7 +2907,7 @@ Pizza Hambúrguer Café - Sanduíche + Sanduíches Kebab Döner kebab (shawarma) Frango @@ -2915,14 +2915,14 @@ Sushi Peixe e batatas fritas Frutos do mar - Churrasco - Massas - Donut + Churrascos + Noodles + Donuts Ramen - Crepe + Crepes Café da manhã Gyudon - Bife + Bifes Tapas Gastropub Heuriger @@ -2943,10 +2943,10 @@ Loja de chás Sopas Tortas - Cachorro-quente - Delicatesse + Cachorros-quentes + Delicatesse (comida fina e iguarias) Saladas - Iogurte gelado + Iogurtes gelados Comida frita Panquecas salgadas Bistrô @@ -2958,7 +2958,7 @@ Tacos Piadina Falafel - Batido de frutas + Batidos de frutas Souvlaki Salgados Iogurtes @@ -2966,16 +2966,16 @@ Empanadas Crepes Yakiniku - Suki - Udon + Suki tailandês + Udon (japonês) Brasserie Chá de bolhas - Yakitori - Sagardotegia + Yakitori (japonês) + Sagardotegia (basco) Carnes Asas - Waffles - Chocolate + Waffles (gofre) + Chocolates Vinhos Batatas Brunch @@ -2983,13 +2983,13 @@ Pita Fondue Baguetes - Pastel + Pastéis Burritos - Teriyaki - Xauarma + Teriyaki (japonês) + Xauarma (árabe) Regional Italiana - Chinês + Chinesa Mexicana Japonesa Alemã @@ -3033,7 +3033,7 @@ Húngara Laociana Europeia - Uzbeque + Usbeque Checa Cubana Britânica @@ -3054,7 +3054,7 @@ Inglesa Paquistanesa Taiwanesa - Tex-mex + Tex-mex (texana e mexicana) Holandesa Síria Australiana @@ -3097,8 +3097,8 @@ Sim Vinho: sim Vinho: venda - Vinho servido - Escritório de fornecedor de energia + Vinho: servido + Loja de empresa fornecedora de energia Reparação de aparelhos eletrónicos: computadores Reparação de aparelhos eletrónicos: eletrodomésticos Reparação de aparelhos eletrónicos: telemóveis @@ -3107,7 +3107,7 @@ Escola de música Escola de idiomas Boia salva-vidas - Zoológico interativo + Zoológico para crianças Reserva natural Cativeiro Parque safári @@ -3118,8 +3118,8 @@ Estandes Vendas Vendas: não - Vendas: sim; usado - Vendas: usado + Vendas: sim; usados + Vendas: usados Aluguer Aluguer: não Reparação @@ -3183,27 +3183,27 @@ Casas-barco: não Gaivota: sim Gaivota: não - Jetskis: sim - Jetskis: não + Motas de água: sim + Motas de água: não Veleiros: sim Veleiros: não - Bote: sim - Bote: não + Botes: sim + Botes: não Caiaques: sim Caiaques: não - Canoa: sim - Canoa: não + Canoas: sim + Canoas: não Rede Arquivo Ministério Serviço público Segurança social Serviços sociais - Tesouro - Instituição de transporte - Instituição legislativa + Tesouraria + Instituição governamental de transportes + Instituição legislativa governamental Canal VHF - Desfiladeiro + Desfiladeiro;Canhão Ravina Área montanhosa Argila @@ -3241,14 +3241,14 @@ Poço de água Pipeline Água corrente - Bomba + Bomba de água Poço artesiano Camião cisterna Tanque de água Água engarrafada Comunidade Família - Multifamília + Várias famílias Tomada: CEE azul Tomada: CEE azul: corrente Tomada: CEE azul: saída @@ -3316,23 +3316,23 @@ Carro: não Bicicleta: sim Bicicleta: não - Scooter: sim - Scooter: não + Lambreta: sim + Lambreta: não Camião: sim Camião: não - Taxa de estacionamento: sim - Taxa de estacionamento: não - Taxa de estacionamento + Estacionamento pago: sim + Estacionamento pago: não + Estacionamento pago Amperagem Saída do posto elétrico Tipo de mapa: topográfico Tipo de mapa: ruas Tipo de mapa: esquema Tipo de mapa: toposcópio - Cobertura do mapa: local - Cobertura do mapa: cidade - Cobertura do mapa: região - Estação de recarga elétrica + Tamanho do mapa: local + Tamanho do mapa: cidade + Tamanho do mapa: região + Estação de carregamento elétrico Depósito Caixa de correio privada Rua @@ -3389,7 +3389,7 @@ Tipo: pastagem Alimentos congelados Loja de produtos agrícolas - Loja de lareiras + Loja de lareiras, salamandras e aquecedores Loja de barcos Loja de canábis CEE azul @@ -3480,8 +3480,8 @@ Ponto mais alto Ponto mais baixo Inclinação média - Checkpoint de caminhada - Ponto de carimbo + Ponto de controlo de caminhada + Carimbo Código Caderno Perfurador @@ -3501,7 +3501,7 @@ Risco de inundação Campo minado Ruínas - Categorias + Categorias de carta de condução Colina Reparação de sapatos Sim @@ -3520,9 +3520,9 @@ Válvula Grupo de válvulas Medidor de inspeção - Recolhimento de campo + Colheita de campo Produção de confeitos - Loja de atacado + Loja grossista (cash and carry) Laboratório médico Doação de sangue Banda desenhada @@ -3531,7 +3531,7 @@ Académicos Crianças Atol - Portal de portagem + Pórtico (pagamento eletrónico) Creche Monumento natural Ponto de referência @@ -3577,8 +3577,8 @@ Local da mesa muda-fraldas: WC feminino Local da mesa muda-fraldas: WC unissexo Quantidade de mesas muda-fraldas - Taxa da mesa muda-fraldas: sim - Taxa da mesa muda-fraldas: não + Pagamento da mesa muda-fraldas: sim + Pagamento da mesa muda-fraldas: não Pilha de carvão Tanque histórico Salão Hookah @@ -3595,82 +3595,82 @@ Acesso para veículos ligeiros de mercadorias Acesso para deficientes físicos Empresa de táxis - Acesso de veículos: sim - Acesso de veículos: privado - Acesso de veículos: não - Acesso de veículos: para trânsito local - Acesso de veículos: permissivo - Acesso de veículos: para clientes - Acesso de veículos: militar - Acesso de veículos: entregas - Acesso de veículos: florestal - Acesso de automóveis: sim - Acesso de automóveis: privado - Acesso de automóveis: não - Acesso de automóveis: para trânsito local - Acesso de automóveis: permissivo - Acesso de automóveis: para clientes - Acesso de automóveis: florestal - Acesso de veículos motorizados: sim - Acesso de veículos motorizados: privado - Acesso de veículos motorizados: não - Acesso de veículos motorizados: para trânsito local - Acesso de veículos motorizados: para trânsito local - Acesso de veículos motorizados: clientes - Acesso de veículos motorizados: militar - Acesso de veículos motorizados: entregas - Acesso de veículos motorizados: florestal - Acesso de veículos motorizados: agrícola - Acesso para veículos pesados: privado - Acesso para veículos pesados: não - Acesso para veículos pesados: agrícola - Acesso para veículos pesados: desencorajado - Acesso para veículos pesados: impróprio - Acesso para veículos ligeiros de mercadorias: não - Acesso de motocicletas: privado - Acesso de motocicletas: não - Acesso de ciclomotor: não - Acesso para bicicletas motorizadas: não - Acesso de bicicleta: privado - Acesso de bicicleta: ir a pé - Acesso de bicicleta: para trânsito local - Acesso de bicicleta: permissivo - Acesso de bicicleta: clientes - Acesso a cavalo: privado - Acesso a cavalo: para trânsito local - Acesso a cavalo: permissivo - Acesso a cavalo: florestal - Acesso de pedestre: sim - Acesso de pedestre: privada - Acesso de pedestre: não - Acesso de pedestre: para trânsito local - Acesso de pedestre: permissivo - Acesso de pedestre: clientes - Acesso de caravana: não - Acesso de trailer: não - Acesso de trailer: não - Acesso para transporte público: sim - Acesso para transporte público: designado - Acesso para transporte público: não - Acesso de autocarro: não - Acesso de autocarro turístico: sim - Acesso de autocarro turístico: designado - Acesso de autocarro turístico: não - Acesso para autocarro de longa distância: sim - Acesso para autocarro de longa distância: não - Acesso de esqui: sim - Acesso de esqui: não - Acesso de motos de neve: privado - Acesso de motos de neve: não - Acesso de veículos agrícolas: sim - Acesso de veículos agrícolas: não - Acesso de táxi: sim - Acesso de táxi: designado - Acesso de táxi: não - Acesso para deficientes: não + Acesso a veículos: sim + Acesso a veículos: privado + Acesso a veículos: não + Acesso a veículos: para trânsito local + Acesso a veículos: tolerado + Acesso a veículos: só clientes + Acesso a veículos: militar + Acesso a veículos: entregas + Acesso a veículos: florestal + Acesso a automóveis: sim + Acesso a automóveis: privado + Acesso a automóveis: não + Acesso a automóveis: para trânsito local + Acesso a automóveis: tolerado + Acesso a automóveis: só clientes + Acesso a automóveis: florestal + Acesso a veículos motorizados: sim + Acesso a veículos motorizados: privado + Acesso a veículos motorizados: não + Acesso a veículos motorizados: para trânsito local + Acesso a veículos motorizados: tolerado + Acesso a veículos motorizados: só clientes + Acesso a veículos motorizados: militar + Acesso a veículos motorizados: entregas + Acesso a veículos motorizados: florestal + Acesso a veículos motorizados: agrícola + Acesso a veículos pesados: privado + Acesso a veículos pesados: não + Acesso a veículos pesados: agrícola + Acesso a veículos pesados: desencorajado + Acesso a veículos pesados: impróprio + Acesso a veículos ligeiros de mercadorias: não + Acesso a motocicletas: privado + Acesso a motocicletas: não + Acesso a ciclomotores: não + Acesso a bicicletas motorizadas: não + Acesso a bicicletas: privado + Acesso a bicicletas: a pé (desmontar) + Acesso a bicicletas: para trânsito local + Acesso a bicicletas: tolerado + Acesso a bicicletas: só clientes + Acesso a cavalos: privado + Acesso a cavalos: para trânsito local + Acesso a cavalos: tolerado + Acesso a cavalos: florestal + Acesso a pedestres: sim + Acesso a pedestres: privado + Acesso a pedestres: não + Acesso a pedestres: para trânsito local + Acesso a pedestres: tolerado + Acesso a pedestres: só clientes + Acesso a caravanas: não + Acesso a autocaravanas: não + Acesso a reboques: não + Acesso a transportes públicos: sim + Acesso a transportes públicos: designado + Acesso a transportes públicos: não + Acesso a autocarros: não + Acesso a autocarros turísticos: sim + Acesso a autocarros turísticos: designado + Acesso a autocarros turísticos: não + Acesso a autocarros de longa distância: sim + Acesso a autocarros de longa distância: não + Acesso a esquis: sim + Acesso a esquis: não + Acesso a motos de neve: privado + Acesso a motos de neve: não + Acesso a veículos agrícolas: sim + Acesso a veículos agrícolas: não + Acesso a táxis: sim + Acesso a táxis: designado + Acesso a táxis: não + Acesso a deficientes: não Sim Designado - Permissivo + Tolerado Sim Designado Sim @@ -3680,7 +3680,7 @@ Sim Designado Sim - Permissivo + Tolerado Destino Designado Sim @@ -3689,7 +3689,7 @@ Designado Sim Destino - Permissivo + Tolerado Designado Entregas Sim @@ -3701,7 +3701,7 @@ Construtor Destilaria Carpinteiro de juntas - Assentador de piso + Assentador de pisos Padaria Marceneiro Custo @@ -3736,7 +3736,7 @@ Banho de pés Sim Não - Tipo de mosteiro: monásticos + Tipo de mosteiro: monástico Tipo de mosteiro: convento Tipo de mosteiro: canonaria Tipo de mosteiro: eremitério @@ -3780,19 +3780,19 @@ Primitivo Contrastado Apenas quando é permitido caminhar - Acesso à Internet: clientes + Acesso à Internet: só clientes Não Sim Tipo de cabine Cabine Não Sim - Centro de mergulho Scuba + Centro de mergulho autónomo Base de caça Número de referência da pista Centro de boliche - Loja de segurança - Resgate na montanha + Loja de equipamento de segurança + Resgate de montanha Paintball Bicicleta fantasma Vídeo @@ -3823,7 +3823,7 @@ Pequenos aparelhos elétricos Colmeia Loja de nozes - GNL + GNL (gás natural liquefeito) Barracão Telhado Ponto GPX @@ -3866,7 +3866,7 @@ Vacinação: COVID19 Vacinação Estação de transferência de resíduos - Ponte de peso + Ponte báscula (balança de veículos) Lago Rio Tanque de água diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml index 8d3a99bb75..eaa5dd4833 100644 --- a/OsmAnd/res/values-pt/strings.xml +++ b/OsmAnd/res/values-pt/strings.xml @@ -140,7 +140,7 @@ Rastreia a sua posição enquanto o ecrã está desligado. Executar OsmAnd em segundo plano O serviço em segundo plano necessita aa ativação de um fornecedor da localização. - Especifique as opções da rota. + Especifique as opções de navegação. Navegação Ocultar filtro Mostrar filtro @@ -253,7 +253,7 @@ A carregar ruas… A carregar cidades… POI - Não foi possível gravar o ficheiro GPX. + Não foi possível guardar o ficheiro GPX. Não foi possível calcular a rota. Não foi possível calcular a rota. A rota calculada está vazia. @@ -319,7 +319,7 @@ Encontrar mais Pesquisa progressiva de cidade. Para encontrar cidades/código postal, insira pelo menos os três primeiros caracteres Pesquisa progressiva das ruas - Pesquisa progressiva dos edificios + Pesquisa progressiva dos edifícios Selecione a região da lista Selecione a rua transversal Infraestruturas mais próximas @@ -483,7 +483,7 @@ Camada superior fluorescente Usar cores fluorescentes para mostrar trajetos e rotas. Edição offline - Se a edição offline estiver ativada, as alterações serão primeiro gravadas localmente e enviadas por pedido, caso contrário, as alterações serão enviadas imediatamente. + Se a edição offline estiver ativada, as alterações serão primeiro guardadas localmente e enviadas por pedido, caso contrário, as alterações serão enviadas imediatamente. As alterações de POI dentro da aplicação não afetam os ficheiros de mapas descarregados; essas alterações são guardadas num ficheiro separado no seu dispositivo. A enviar… {0} POI/notas enviados @@ -566,9 +566,9 @@ Rota guardada como \'%1$s\'. Nome do ficheiro: Já existe um ficheiro com o mesmo nome. - Gravar + Guardar Enviar ficheiros de GPX para a comunidade OSM, para ajudar a melhorar os mapas. - %1$d de %2$d items enviados. + %1$d de %2$d itens enviados. Enviar para OSM Ver mais detalhes do mapa Mostrar detalhes do mapa vetorial (estradas, etc.) já em níveis de zoom mais baixos. @@ -589,7 +589,7 @@ %1$d de %2$d item(s) desativados. %1$d de %2$d item(s) eliminados. %1$d de %2$d item(s) ativados. - Sem items para %1$s + Sem itens para %1$s Está prestes a %1$s %2$s item(s). Continuar\? Gerir ficheiros de mapas. Ativar @@ -735,7 +735,7 @@ Aguardando posição para calcular a rota Continuar a navegação a seguir que ficou antes inacabada\? (%1$s segundos) Radares de velocidade - Avisos de tráfego + Informações de circulação Sem estradas com portagem Nome da rua Configuração do ecrã @@ -762,7 +762,7 @@ Parar \na execução em segundo plano Mostrar alertas… - Configure avisos de trânsito (limites de velocidade, paragens forçadas, redutores de velocidade, túneis), avisos de radares de velocidade e informações da faixa de rodagem. + Configure avisos de trânsito (limites de velocidade, portagens, lombas, passadeiras, túneis), radares e a faixa de rodagem. Sem autoestradas Ajustar à estrada Visualização e navegação móvel de mapas globais do OSM offline e online @@ -847,7 +847,7 @@ Executar a aplicação no modo de segurança (usando o código do Android mais lento em vez do nativo). Modo de segurança A aplicação está a ser executada no modo de segurança (desligue-o em \"Configurações\"). - O serviço de segundo plano OsmAnd ainda está em execução. Tambẽm pará-lo\? + O serviço de segundo plano OsmAnd ainda está em execução. Também quer pará-lo\? Fechar conjunto de alterações Pesquisar mais povoações/códigos postais Sincroniza trilhos e notas de vídeo/áudio com a sua conta Dropbox. @@ -970,11 +970,11 @@ Europa, Ásia, América Latina e similares Reino Unido, Índia e similares Anunciar… - Configurar anúncio de nomes de ruas, avisos de trânsito (paragens forçadas, lombas de velocidade), avisos de radares de trânsito, limites de velocidade. + Configure as indicações sobre nomes de ruas, avisos de trânsito (portagens, lombas, passadeiras), radares e limites de velocidade. Nomes das ruas (TTS) Limite de velocidade Radares de velocidade - Avisos de tráfego + Informações de circulação Especifique o nome de utilizador e a palavra-passe no OSM em \"Configurações\" Remover destinos intermédios Manter destinos intermédios @@ -1247,7 +1247,7 @@ Aviso de tráfego Favoritos nas redondezas POIs nas redondezas - Avisos de tráfego + Informações de circulação Parar o GPS quando em segundo plano\? Parar Perguntar sempre @@ -1290,7 +1290,7 @@ Todos os descarregamentos Atualizações Local - Não é possível descarregar, por favor, verifique a sua ligação à Internet. + Não é possível descarregar. Verifique se tem ligação à Internet. Todos os ficheiros foram atualizados Usar o renderizador OpenGL Início @@ -1405,7 +1405,7 @@ Ver mapa de turismo Ver mapa náutico Ver mapa de esqui - Renomeação falhou. + A alteração do nome falhou. Voltar ao mapa Partilhar nota Posição:\n Lat %1$s\n Lon %2$s @@ -1591,7 +1591,7 @@ Tamil Tem dados guardados da Wikipédia que são antigos e incompatíveis. Quer arquivá-los\? Quer descarregar dados adicionais da Wikipédia (%1$s MB)\? - O serviço de localização não está ativado. Ativar\? + O serviço de localização não está ativado. Quer ativá-lo\? Importar para o OsmAnd Ler o artigo completo (on-line) Wikipédia @@ -2095,7 +2095,7 @@ Armazenamento de dados de OsmAnd (para mapas, ficheiros de trilhos, etc.): %1$s. Conceder permissão Permitir acesso à localização - Encontrar a minha posição + Encontrar a minha localização Atualizar todos os mapas agora\? Eliminar todos os mosaicos Percurso económico @@ -2153,7 +2153,7 @@ Renova anualmente %1$.2f %2$s Frequência do pagamento: - As doações ajudam a financiar a cartografia do OpenStreetMap. + Os donativos ajudam a financiar a cartografia do OpenStreetMap. Para condução todo-o-terreno com base no estilo \'Topo\' e para utilização com imagens de satélite verdes na camada inferior. Redução da espessura das estradas principais, aumento da espessura dos trajetos, caminhos, ciclovias e outras vias. Para navegação náutica. Características: bóias, faróis, cursos de rios, vias marítimas e marcas, portos, serviços de navegação, contornos de profundidade. Para esquiar. Contém pistas de esqui, elevadores, pistas de cross country, etc. Escurece objetos de mapa secundários. @@ -2326,7 +2326,7 @@ Especifique a quantidade de indicadores de orientação. Número de casas decimais Direita - Esqueda + Esquerda Mostrar teclado numérico Colar Próximo campo @@ -2424,7 +2424,7 @@ \nRepresenta área: %1$s x %2$s Tolerância do limite de velocidade Selecione a margem de tolerância de limite de velocidade, acima do qual receberá um aviso de voz. - O nome do favorito foi alterado para %1$s para facilitar gravar corretamente a cadeia de caracteres com emoticons num ficheiro. + O nome do favorito foi alterado para %1$s para facilitar guardar corretamente a cadeia de caracteres com emoticons num ficheiro. Imprimir rota Nome de favorito duplicado O nome do favorito especificado já está a ser utilizado, foi alterado para %1$s para evitar a duplicação. @@ -2539,10 +2539,10 @@ \n• Navegação GPS no modo pedestre cria a sua rota usando caminhos para pedestres \n• Enviar e seguir uma rota GPX ou gravar e partilhar a sua própria rota \n - Contribua para o OpenStretMap + Contribua para o OpenStreetMap \n • Envie relatórios de erros -\n • Envie trilhos GPX para o OpenStretMap diretamente da aplicação -\n • Adicione POIs e envie-os diretamente para o OpenStretMap (ou mais tarde se estiver desconectado da Internet) +\n • Envie trilhos GPX para o OpenStreetMap diretamente da aplicação +\n • Adicione POIs e envie-os diretamente para o OpenStreetMap (ou mais tarde se estiver desconectado da Internet) \n OsmAnd é um programa de fonte aberta desenvolvido ativamente. Todos podem contribuir para a aplicação reportando erros, melhorando as traduções ou programando novas funcionalidades. Além disso, o projeto conta com contribuições financeiras para financiar a programação e testes de novas funcionalidades. \n Cobertura de mapa e qualidade aproximada: @@ -2580,13 +2580,13 @@ \n • Veja imagens online especializadas, vistas de satélite (do Bing), diferentes camadas como trilhos de navegação GPX e camadas adicionais com transparência personalizável. \n • Veja opcionalmente nomes de lugares em inglês, na língua local ou grafia fonética. \n - Use dados do OpenStretMap e da Wikipédia + Use dados do OpenStreetMap e da Wikipédia \n • Informações de alta qualidade dos melhores projetos colaborativos do mundo -\n • Dados do OSM disponíveis por país ou região +\n • Dados do OpenStreetMap disponíveis por país ou região \n • POIs da Wikipédia, ótimo para passeios turísticos \n • Descarregamentos grátis ilimitados, diretamente da aplicação -\n • Mapas off-line vetoriais compactos e atualizados mensalmente -\n +\n • Mapas off-line vetoriais compactos e atualizados mensalmente +\n \n • Escolha entre região completa ou apenas a rede rodoviária (exemplo: o Japão inteiro tem 700 MB e a rede rodoviária tem apenas 200 MB) Recursos de segurança \n• Mudança da visualização automática para dia/noite opcional @@ -2603,10 +2603,10 @@ \n• Visualização de curvas de nível e sombreamento de relevo (com uma extensão adicional) Contribua diretamente para o OpenStreetMap \n • Envie relatórios de erros. -\n • Envie trilhos GPX para o OpenStretMap diretamente da aplicação. -\n • Adicione POIs e envie-os diretamente para o OpenStretMap (ou mais tarde se estiver desconectado da Internet). +\n • Envie trilhos GPX para o OpenStreetMap diretamente da aplicação. +\n • Adicione POIs e envie-os diretamente para o OpenStreetMap (ou mais tarde se estiver desconectado da Internet). \n • Gravação de viagem opcional também em plano de fundo (enquanto o dispositivo está no modo adormecido). -\n OsmAnd é um programa de fonte aberta desenvolvido ativamente. Todos podem contribuir para a aplicação reportando erros, a melhorar as traduções ou a programar novas funcionalidades. Além disso, o projeto conta com contribuições financeiras para financiar a programação e testes de novas funcionalidades. +\n O OsmAnd é um programa de fonte aberta desenvolvido ativamente. Todos podem contribuir para a aplicação reportando erros, a melhorar as traduções ou a programar novas funcionalidades. Além disso, o projeto conta com contribuições financeiras para financiar a programação e testes de novas funcionalidades. \n Cobertura de mapa e qualidade aproximada: \n• Europa Ocidental: **** @@ -2718,7 +2718,7 @@ Um botão para ativar ou desativar a orientação por voz durante a navegação. Um botão para adicionar um lugar de estacionamento no local do centro do ecrã. Mostrar uma janela temporal - " gravado em " + " guardado em " Local O nome da ação rápida foi alterado para %1$s para evitar duplicação. Nome de ação rápida duplicado @@ -2733,7 +2733,7 @@ Deixe em branco para automaticamente usar o endereço ou nome de lugar. Esta mensagem está incluída no campo de comentário. Mensagem - Categoria na qual gravar o favorito: + Categoria onde guardar o favorito: Escolha uma categoria opcional. Lista de POIs Adicione uma ou mais categorias de POI para mostrar no mapa. @@ -2762,7 +2762,7 @@ Adicionar ponto de passagem Adicionar linha Guardar ponto de passagem GPX - Gravar ponto de rota + Guardar ponto de rota Ponto de passagem 1 Ponto de rota 1 Adicionar favoritos @@ -2975,8 +2975,8 @@ Nome duplicado Já existe um perfil com esse nome Não pode eliminar perfis base OsmAnd - Gravar alterações - Grave primeiro as alterações no perfil + Guardar alterações + Guarde primeiro as alterações no perfil Eliminar perfil Tem a certeza que quer eliminar o perfil \"%s\" Selecionar o perfil para começar @@ -3093,9 +3093,9 @@ Maioritariamente macio Macio Dureza da superfície - %s está gravado + %s está guardado Abrir trilho - O trilho %s está gravado + O trilho %s está guardado Mostrar zonas de baixas emissões (proibida circulação de veículos poluentes) no mapa. Não afeta o roteamento. Mostrar zonas de baixas emissões Considerar limitações temporárias @@ -3258,7 +3258,7 @@ Branco Adicionar o novo perfil \'%1$s\'\? Incluir a direção - Gravar direção para cada ponto de pista durante a gravação. + Guardar direção para cada ponto do trilho durante a gravação. %1$s • %2$s %1$s, %2$s Pessoal @@ -3289,7 +3289,7 @@ %1$s importado(s). Trocar %1$s por %2$s Ponto de partida - Trilho gravado + Trilho guardado O nome do ficheiro está vazio Reverter Um botão para centrar o ecrã no ponto de partida. Em seguida, solicitará para definir o destino ou acionar o cálculo da rota. @@ -3342,10 +3342,10 @@ Recalcular rota em caso de desvio Selecione a distância após a qual o percurso será recalculado. A rota será recalculada se a distância da rota até o local atual for maior que o valor selecionado. - Todos os dados de %1$s são importados. Pode usar os botões abaixo para abrir a parte necessária da aplicação para o gerir. + Todos os dados de %1$s são importados. Pode usar os botões abaixo para abrir a parte necessária da aplicação para os gerir. Importação terminada Itens adicionados - O OsmAnd verifica %1$s para ver se existem duplicados nos itens existentes na aplicação. + O OsmAnd verifica %1$s para ver se existem duplicados na aplicação. \n \nPode demorar algum tempo. A importar @@ -3717,14 +3717,14 @@ Criar nova rota Pronto Substituir trilho - Gravar como novo trilho + Guardar como novo trilho Rota inversa O trilho inteiro será recalculado a usar o perfil selecionado. Apenas será recalculado o próximo segmento utilizando o perfil selecionado. Escolha como ligar os pontos por uma linha reta ou calcule uma rota entre eles como especificado abaixo. Trilho inteiro Próximo segmento - Em seguida, encaixe a sua pista na estrada mais próxima permitida com um dos seus perfis de navegação para usar esta opção. + Em seguida, encaixe o trilho na estrada mais próxima permitida com um dos seus perfis de navegação para usar esta opção. Distância limiar Perfil de navegação Selecione um ficheiro de trilho no qual será adicionado um novo segmento. @@ -3734,7 +3734,7 @@ Selecionar outro trilho Navegar da minha posição até ao trilho Ponto do trilho para navegar - Início da pista + Início do trilho Ponto mais próximo Fixar às estradas Eliminar endereço @@ -3749,13 +3749,13 @@ No caso de direção inversa Rota de trilho Trilhos - Gravar como ficheiro de trilho + Guardar como ficheiro de trilho Adicionar a um ficheiro de trilho Importar ou gravar ficheiros de trilho Adicionar ficheiros de trilho Adicionar ponto de passagem de trilho Trilhos - Gravar como novo ficheiro de trilho + Guardar como novo ficheiro de trilho Registar o trilho num ficheiro GPX Trilhos Adicionar ponto de passagem de trilho @@ -3772,7 +3772,7 @@ Todos os segmentos subsequentes serão recalculados a utilizar o perfil selecionado. Todos os segmentos anteriores serão recalculados a usar o perfil selecionado. Abrir trilho guardado - está gravado + está guardado Adicione pelo menos dois pontos. Refazer Trilho simplificado @@ -3812,14 +3812,14 @@ Desenvolvimento Dados do OsmAnd Live Dados do OsmAnd Live - Roteamento em duas fases para a navegação automotiva. + Roteamento em duas fases para a navegação automóvel. Desenvolvimento nativos de transportes públicos Mudar para o cálculo de rotas de transportes públicos Java (seguro) - Entre com o OAuth para usar os recursos do osmedit + Inicie sessão com o OAuth para usar os recursos de edição OpenStreetMap Iniciar sessão com OAuth Limpar token do OpenStreetMap OAuth Saiu - O ficheiro já é importado em OsmAnd + O ficheiro já foi importado para o OsmAnd Usar algoritmo de roteamento de 2 fases A* Para a condução de motos de neve com estradas e pistas dedicadas. Gráfico @@ -3856,7 +3856,7 @@ Conta Utilizador Histórico de marcadores - Enviar ficherio de GPX ao OpenStreetMap + Enviar ficheiro de GPX para o OpenStreetMap Introduza etiquetas separadas por vírgula. \"Público\" significa que o rastreamento é mostrado publicamente em Seus traços de GPS e em listas públicas de rastreamento de GPS, e na lista pública de rastreamento com carimbos de data e hora na forma bruta. Os dados servidos através da API não fazem referência à sua página de rastreamento. Os marcadores de ponto de rastreamento não estão disponíveis através da API de GPS pública, e os pontos de rastreamento não estão ordenados cronologicamente. \"Privado\" significa que o rastreamento não aparece em nenhuma listagem pública, mas os pontos de rastreamento dela em ordem não cronológica estão disponíveis através da API pública do GPS sem carimbos de tempo. @@ -3937,7 +3937,7 @@ Sombras de relevo / declives / curvas de nível OpenPlaceReviews é um projeto comunitário sobre lugares públicos como restaurantes, hotéis, museus, pontos de passagem. Recolhe toda a informação pública sobre eles, como fotos, resenhas, ligações para outros sistemas OpenStreetMap, Wikipédia. \n -\nTodos os dados OpenPlaceReview estão abertos e disponíveis para todos: http://openplacereviews.org/data. +\nTodos os dados do OpenPlaceReviews estão abertos e disponíveis para todos: http://openplacereviews.org/data. \n \nPode ler mais em: http://openplacereviews.org OpenPlaceReviews @@ -3946,20 +3946,20 @@ Água Inverno Moto de neve - Equitação - Corrida - Bicicleta de montanha + A cavalo + Corrida competitiva + BTT Ciclismo Correr - Caminhada - Fora da estrada - Motocicleta + A pé + Todo o terreno + Moto Carro Adicionar motor de roteamento online Ao passar Bicicleta elétrica As atualizações ao mapa serão verificadas a todas as horas. Próxima %1$s em %2$s. - Tem a certeza que quer eliminar todas as %s atualizações live\? + Tem a certeza que quer eliminar todas as %s atualizações OsmAnd Live\? • Atualizações OsmAnd Live movidas para \"Descarregamentos > Atualizações\" \n \n • Os trilhos podem ser agora coloridos conforme a altitude, velocidade e declive. @@ -4008,7 +4008,7 @@ Um alternador para mostrar ou ocultar um widget de coordenadas no mapa. As atualizações do mapa serão verificadas todas as semanas. Próxima %1$s em %2$s. As atualizações do mapa serão verificadas todos os dias. Próxima %1$s em %2$s. - Se as suas assinaturas não aparecerem aqui, toque em “%1$s” ou contacte a nossa equipa de apoio. + Se as suas compras não aparecerem aqui, toque em “%1$s” ou contacte a nossa equipa de suporte. Preferir rotas de caminhadas Preferir rotas de caminhadas Caminhada @@ -4022,11 +4022,11 @@ Frequência da atualização Necessário reiniciar a aplicação para aplicar algumas configurações. Período de tempo do intervalo de registo em que o OsmAnd perguntará pelos dados da posição atual. - Não tem assinaturas + Não tem compras Se tiver alguma dúvida, contacte-nos em %1$s. Intervalos de tempo e distância Distância por toque - Contacte o apoio + Contacte o suporte Por favor siga este link se tiver algum problema com assinaturas. Atualizar todos os mapas para %1$s\? Rota mais curta otimizada (mais económica) @@ -4052,7 +4052,7 @@ Guardar e parar de gravar A gravação do trilho parou Tem a certeza que quer parar de gravar\? -\nTodos os dados por gravar serão perdidos. +\nTodos os dados por guardar serão perdidos. Em pausa Eliminar atualizações Compras @@ -4065,9 +4065,9 @@ O trilho não contém dados da altitude. O trilho não contém dados da velocidade. Por favor selecione outro tipo de colorização. - Gravar e continuar - Todos os dados por gravar serão perdidos. - Mostrar janela de confirmação para iniciar + Guardar e continuar + Todos os dados por guardar serão perdidos. + Mostrar janela de diálogo ao iniciar Se desativado, a gravação começará logo a seguir ao tocar no widget ou item do menu, ignorando a janela de confirmação. Personalizar a linha de itinerário Linha de itinerário diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index 9909523cd3..dc63a9788a 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -2456,7 +2456,7 @@ Отметить пройденным Файл %1$s не содержит путевых точек, импортировать его как трек? Выберите трек, чтобы добавить в маркеры его точки. - Трек путевых точек + Путевые точки трека Направо Налево Показать цифровую панель @@ -3480,7 +3480,7 @@ Выберите форму Круг Восьмиугольник - Сообщение о доступности + Объявлять Примечание: проверка скорости > 0: большинство модулей GPS сообщают значение скорости только в том случае, если алгоритм определяет, что вы движетесь, и ничего, если вы не перемещаетесь. Следовательно, использование параметра > 0 в этом фильтре в некотором смысле приводит к обнаружению факта перемещения модуля GPS. Но даже если мы не производим данную фильтрацию во время записи, то всё равно эта функция используется при анализе GPX для определения скорректированного расстояния, то есть значение, отображаемое в этом поле, является расстоянием, записанным во время движения. Разделение записи Укажите веб-адрес со следующими параметрами: lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}. @@ -3607,7 +3607,7 @@ Неподдерживаемый тип OsmAnd сформировал GPX не совсем правильно, пожалуйста, свяжитесь со службой поддержки для выяснения причин. Каждая навигационная инструкция включает экран. - Инструкции по навигации + Навигационные инструкции Если функция «%1$s» включена, время работы будет зависеть от неё. Время работы экрана после включения. («%1$s» отключает выключение экрана.) Нажатие кнопки питания устройства включит экран с OsmAnd на переднем плане экрана блокировки. @@ -3702,7 +3702,7 @@ Составление маршрута Выберите способ разбиения: по времени или по расстоянию. Интервал между метками расстояния или времени на треке. - Заказная + Своё знач. Добавленная точка не будет видна на карте, так как выбранная группа скрыта, найти её можно в «%s». Показывать значки старта и финиша Выберите толщину линии @@ -4086,4 +4086,5 @@ Точки пользователя Вывод %1$s → … + Номер съезда \ No newline at end of file diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml index 631aacada7..ca24c81192 100644 --- a/OsmAnd/res/values-tr/strings.xml +++ b/OsmAnd/res/values-tr/strings.xml @@ -141,7 +141,7 @@ Diğer haritalar Sadece yollar Eş yükselti eğrileri - Standart Harita + Standart harita Yalnızca yolları gösteren harita Sınırlar Bölgesel sınırların gösterilmesini önle (yönetici seviyesi 5-9). @@ -824,7 +824,7 @@ Dönme yok (kuzey her zaman yukarı doğru) Harita hizalaması: Güzergah ayrıntıları - İçe Aktar + İçe aktar GPX yüklenemedi. Hafıza kartında herhangi bir indirilen harita bulunamadı. POI bulmak için yazın @@ -939,7 +939,7 @@ Bu konum için çevrim dışı vektör haritası. \n\t \n\tKullanmak için \'Menü\' → \'Harita Katmanları\' → \'Harita Kaynağı…\' → \'Çevrim dışı vektör haritalar\'. - Sesli yönlendirme çıktısı + Sesli yönlendirme çıkışı Sesli yönlendirme için hoparlörü seçin. Telefon görüşmesi sesi (araç Bluetooth stereolarını kesmek için) Temel harita şeffaflığını ayarlayın. @@ -1153,7 +1153,7 @@ Kayak haritası görünümü Yazı boyutu Haritadaki yazı boyutunu ayarla. - Yakınlardaki Sık Kullanılanlar + Yakındaki sık kullanılanlar Yakınlardaki POI Süre Mesafe @@ -1432,7 +1432,7 @@ En fazla çevrim içi yakınlaştırma Bunun ötesinde yakınlaştırma seviyeleri için çevrim içi haritalara göz atma. En sevdiğim nokta düzenlendi - Sık Kullanılanlara eklenen nokta bulunmuyor + Sık kullanılanlara eklenen nokta yok Değişiklik listesi açılıyor… Değişiklik listesi kapatılıyor… Düğüm işleniyor … @@ -1766,7 +1766,7 @@ Navigasyon sırasında rotayı otomatik kaydet Navigasyon sırasında GPX rotası otomatik olarak rotalar klasörüne kaydedilir. Günlük aralığı - Navigasyon sırasında aralığı Günlüğü + Navigasyon sırasında kayıt aralığı Navigasyon sırasında izlenen yol kaydı için kayıt aralığını belirtin Navigasyon için sesli yönlendirme seç. HTTP proxy\'sini etkinleştir @@ -2000,7 +2000,7 @@ Özel-arazi erişimine izin ver Özel-arazi alanlarına erişime izin ver. Görüntü yakınlaştırma seviyesi: %1$s - Grup ismi + Grup adı Renk değiştir Adı düzenle Kendi pozisyonunu canlandır @@ -2304,7 +2304,6 @@ Ortalama yükseklik Yükseklikte dalgalanma seçin Yükseklik verisi kullan - Şehir veya bölge %1$d çıkışa gir ve ilerle Henüz yol dosyanız yok @@ -4006,4 +4005,86 @@ Arazi Motosiklet Araba + Bölümleri seç + %1$s birden fazla bölüm içeriyor, navigasyon için gerekli kısmı seçmeniz gerekiyor. + Bölüm %1$d + Şu anda haritada etkin olan yol kısıtlamalarını kullan + Optimize edilmiş daha kısa güzergah (enerji tasarrufu) + Daha kısa, daha hızlı veya daha güvenli bir güzergah elde etmek için sürüş amacını seçin + Geçerli konum simgesi, geçerli navigasyon güzergahına tutturulacaktır + Hız belli bir eşikten düşükse harita görünümünü döndürme + Yeniden başlat + Tüm bölgeler + %1$d dosya silinsin mi\? + Kaydetmeden durdur + Kaydet ve kaydı durdur + Yol kaydı durduruldu + Kaydı durdurmak istediğinizden emin misiniz\? +\nKaydedilmemiş tüm veriler kaybolacak. + Duraklatıldığında + Bazı ayarların uygulanması için uygulamanın yeniden başlatılması gerekiyor. + Yönlendirme, dik yokuşlardan kaçınabilir. + Harita üzerinde koordinatlar widget\'ını göstermek veya gizlemek için bir geçiş. + Dokunma mesafesi + En son OpenStreetMap güncellemesi: + Güncellendi: %s + Son denetleme: %s + Güncelleme sıklığı + Harita güncellemeleri her hafta denetlenecek. Bir sonraki: %1$s, %2$s. + Harita güncellemeleri her gün denetlenecek. Bir sonraki: %1$s, %2$s. + Harita güncellemeleri her saat denetlenecek. Bir sonraki: %1$s, %2$s. + Güncellemeleri sil + %s canlı güncellemenin hepsini silmek istediğinizden emin misiniz\? + Satın almalar + Kategori seçin veya yenisini ekleyin + Kayıt devam edecek. + POI adını kopyala + Göster/gizle + Aralık + Doğa koruma bölgelerini, korunan alanları ve milli park sınırlarını gizleyin + Doğa sınırları + Yol, yükseklik verileri içermiyor. + Yol, hız verileri içermiyor. + Lütfen başka bir renklendirme türü seçin. + Kayıt aralığı, OsmAnd\'ın geçerli konum verilerini isteyeceği zaman aralığını ayarlar. + Kaydet ve devam et + Kaydedilmemiş tüm veriler kaybolacak. + Başlat iletişim kutusunu göster + Devre dışı bırakılırsa onay diyaloğu atlanarak, widget veya menü ögesine dokunduktan hemen sonra kayıt başlayacaktır. + Güzergah hattını özelleştir + Güzergah hattı + Güzergah hattı, seçilen harita tarzında belirtilen %1$s seçeneğini kullanacaktır: %2$s. + Harita modu için renk belirt: %1$s. + Herhangi bir satın alma işleminiz yok + Yeni aygıt / yeni hesap + Herhangi bir sorunuz varsa, lütfen %1$s üzerinden bizimle iletişime geçin. + Satın almalarınız burada görünmezse, “%1$s” seçeneğine dokunun veya destek ekibimizle iletişime geçin. + Destek hattına başvurun + Sorun giderme + Satın alma işlemleriyle ilgili herhangi bir sorununuz varsa lütfen bu bağlantıyı takip edin. + OsmAnd Live + Yıllık abonelik + Aylık abonelik + Üç aylık abonelik + Sonraki faturalandırma tarihi: %1$s + İptal edildi + Aboneliği yenile + Ek süre içinde + Beklemede + Süresi doldu + • OsmAnd Live güncellemeleri \"İndirmeler> Güncellemeler\" bölümüne taşındı +\n +\n • Yollar artık rakım, hız veya eğime göre renklendirilebilir +\n +\n • Navigasyon güzergah çizgisinin görünümünü değiştirme seçeneği eklendi +\n +\n • \"Seyahat kaydetme\" iletişim kutusu güncellendi +\n +\n + %1$s için eklenen tüm haritalar güncellensin mi\? + Çıkış numarası + Aşıldığında duyur + Kullanıcı puanları + Çıkış + %1$s → … \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityKeyListener.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityKeyListener.java index e218272c13..33ce52296b 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityKeyListener.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityKeyListener.java @@ -124,7 +124,7 @@ public class MapActivityKeyListener implements KeyEvent.Callback { if (keyCode == KeyEvent.KEYCODE_MINUS) { mapActivity.changeZoom(-1); return true; - } else if (keyCode == KeyEvent.KEYCODE_PLUS) { + } else if (keyCode == KeyEvent.KEYCODE_PLUS || keyCode == KeyEvent.KEYCODE_EQUALS) { mapActivity.changeZoom(1); return true; } diff --git a/OsmAnd/src/net/osmand/plus/quickaction/SwitchableAction.java b/OsmAnd/src/net/osmand/plus/quickaction/SwitchableAction.java index 412eba2323..874fadaa4c 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/SwitchableAction.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/SwitchableAction.java @@ -110,7 +110,7 @@ public abstract class SwitchableAction extends QuickAction { String item = getSelectedItem(application); String arrowDirection = isLayoutRtl(application) ? "\u25c0" : "\u25b6"; - return application.getString(R.string.ltr_or_rtl_combine_via_space, getTranslatedItemName(application, item), arrowDirection + "\u2026"); + return getTranslatedItemName(application, item) + arrowDirection + "\u2026"; } @Override diff --git a/OsmAnd/src/net/osmand/plus/track/TrackColoringCard.java b/OsmAnd/src/net/osmand/plus/track/TrackColoringCard.java index 9e48ca0bbe..63b69b7e1c 100644 --- a/OsmAnd/src/net/osmand/plus/track/TrackColoringCard.java +++ b/OsmAnd/src/net/osmand/plus/track/TrackColoringCard.java @@ -11,6 +11,7 @@ import android.widget.TextView; import com.google.android.material.snackbar.Snackbar; import net.osmand.AndroidUtils; +import net.osmand.GPXUtilities.Elevation; import net.osmand.GPXUtilities.GPXTrackAnalysis; import net.osmand.PlatformUtil; import net.osmand.plus.R; @@ -92,7 +93,15 @@ public class TrackColoringCard extends BaseCard { if (scaleType == GradientScaleType.SPEED) { return gpxTrackAnalysis.isSpeedSpecified(); } else { - return gpxTrackAnalysis.isElevationSpecified(); + if (!gpxTrackAnalysis.isElevationSpecified()) { + return false; + } + for (Elevation elevation : gpxTrackAnalysis.elevationData) { + if (Float.isNaN(elevation.elevation)) { + return false; + } + } + return true; } } diff --git a/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java b/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java index 23bcd0d99b..2eedf2eab5 100644 --- a/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java @@ -380,46 +380,11 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card } private void updateHeader() { - if (menuType == TrackMenuType.OVERVIEW) { - setHeaderTitle(gpxTitle, true); - if (overviewCard != null && overviewCard.getView() != null) { - ViewGroup parent = ((ViewGroup) overviewCard.getView().getParent()); - if (parent != null) { - parent.removeView(overviewCard.getView()); - } - headerContainer.addView(overviewCard.getView()); - } else { - overviewCard = new OverviewCard(getMapActivity(), this, selectedGpxFile); - overviewCard.setListener(this); - headerContainer.addView(overviewCard.build(getMapActivity())); - } - GpxBlockStatisticsBuilder blocksBuilder = overviewCard.getBlockStatisticsBuilder(); - if (isCurrentRecordingTrack()) { - blocksBuilder.runUpdatingStatBlocksIfNeeded(); - } - } else { - if (menuType == TrackMenuType.POINTS && !Algorithms.isEmpty(pointsCard.getGroups())) { - if (groupsCard != null && groupsCard.getView() != null) { - ViewGroup parent = ((ViewGroup) groupsCard.getView().getParent()); - if (parent != null) { - parent.removeView(groupsCard.getView()); - } - headerContainer.addView(groupsCard.getView()); - } else { - groupsCard = new PointsGroupsCard(getMapActivity(), pointsCard.getGroups()); - groupsCard.setListener(this); - headerContainer.addView(groupsCard.build(getMapActivity())); - } - } else if (groupsCard != null && groupsCard.getView() != null) { - headerContainer.removeView(groupsCard.getView()); - } - if (overviewCard != null && overviewCard.getView() != null) { - overviewCard.getBlockStatisticsBuilder().stopUpdatingStatBlocks(); - headerContainer.removeView(overviewCard.getView()); - } - boolean isOptions = menuType == TrackMenuType.OPTIONS; - setHeaderTitle(isOptions ? app.getString(menuType.titleId) : gpxTitle, !isOptions); - } + updateHeaderCard(); + + boolean isOptions = menuType == TrackMenuType.OPTIONS; + setHeaderTitle(isOptions ? app.getString(menuType.titleId) : gpxTitle, !isOptions); + if (menuType == TrackMenuType.POINTS) { AndroidUiHelper.updateVisibility(searchButton, true); } else { @@ -429,6 +394,64 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card } } + private void updateHeaderCard() { + if (menuType == TrackMenuType.OVERVIEW) { + addOverviewCardToHeader(); + removeCardViewFromHeader(groupsCard); + } else { + if (overviewCard != null) { + overviewCard.getBlockStatisticsBuilder().stopUpdatingStatBlocks(); + } + if (menuType == TrackMenuType.POINTS && !Algorithms.isEmpty(pointsCard.getGroups())) { + addPointsGroupsCardToHeader(); + } else { + removeCardViewFromHeader(groupsCard); + } + removeCardViewFromHeader(overviewCard); + } + } + + private void addOverviewCardToHeader() { + if (overviewCard != null && overviewCard.getView() != null) { + addCardViewToHeader(overviewCard); + } else { + MapActivity mapActivity = requireMapActivity(); + overviewCard = new OverviewCard(mapActivity, this, selectedGpxFile); + overviewCard.setListener(this); + headerContainer.addView(overviewCard.build(mapActivity)); + } + if (isCurrentRecordingTrack()) { + overviewCard.getBlockStatisticsBuilder().runUpdatingStatBlocksIfNeeded(); + } + } + + private void addPointsGroupsCardToHeader() { + if (groupsCard != null) { + addCardViewToHeader(groupsCard); + } else { + MapActivity mapActivity = requireMapActivity(); + groupsCard = new PointsGroupsCard(mapActivity, pointsCard.getGroups()); + groupsCard.setListener(this); + headerContainer.addView(groupsCard.build(mapActivity)); + } + } + + private void removeCardViewFromHeader(BaseCard card) { + if (card != null && card.getView() != null) { + headerContainer.removeView(card.getView()); + } + } + + private void addCardViewToHeader(BaseCard card) { + if (card != null && card.getView() != null) { + ViewGroup parent = ((ViewGroup) card.getView().getParent()); + if (parent != null) { + parent.removeView(card.getView()); + } + headerContainer.addView(card.getView()); + } + } + private void setupToolbar() { toolbarTextView.setText(gpxTitle); diff --git a/OsmAnd/src/net/osmand/plus/views/Renderable.java b/OsmAnd/src/net/osmand/plus/views/Renderable.java index 657cf3856a..dd8ba55b8a 100644 --- a/OsmAnd/src/net/osmand/plus/views/Renderable.java +++ b/OsmAnd/src/net/osmand/plus/views/Renderable.java @@ -14,6 +14,7 @@ import net.osmand.data.RotatedTileBox; import net.osmand.plus.track.GradientScaleType; import net.osmand.plus.views.layers.geometry.GpxGeometryWay; import net.osmand.util.Algorithms; +import net.osmand.util.MapUtils; import java.util.ArrayList; import java.util.List; @@ -28,7 +29,6 @@ import java.util.concurrent.atomic.AtomicInteger; import androidx.annotation.NonNull; - public class Renderable { private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); @@ -61,7 +61,6 @@ public class Renderable { public List points = null; // Original list of points protected List culled = new ArrayList<>(); // Reduced/resampled list of points - protected List oldCulled = new ArrayList<>(); protected int pointSize; protected double segmentSize; @@ -89,6 +88,9 @@ public class Renderable { } paint.setColor(p.getColor()); paint.setStrokeWidth(p.getStrokeWidth()); + if (scaleType != null) { + paint.setAlpha(0xFF); + } } public void setBorderPaint(@NonNull Paint paint) { @@ -117,20 +119,19 @@ public class Renderable { updateLocalPaint(p); canvas.rotate(-tileBox.getRotate(), tileBox.getCenterPixelX(), tileBox.getCenterPixelY()); if (scaleType != null) { - drawGradient(getPointsForDrawingWithBorder(), p, canvas, tileBox); + drawSolid(points, borderPaint, canvas, tileBox); + drawGradient(points, paint, canvas, tileBox); } else { - drawSolid(getPointsForDrawing(), p, canvas, tileBox); + drawSolid(getPointsForDrawing(), paint, canvas, tileBox); } canvas.rotate(tileBox.getRotate(), tileBox.getCenterPixelX(), tileBox.getCenterPixelY()); } - public void drawSegment(double zoom, Paint p, Canvas canvas, RotatedTileBox tileBox) { if (QuadRect.trivialOverlap(tileBox.getLatLonBounds(), trackBounds)) { // is visible? - if (tileBox.getZoomAnimation() > 0 && !Algorithms.isEmpty(culled) && scaleType != null) { - oldCulled = new ArrayList<>(culled); + if (scaleType == null) { + startCuller(zoom); } - startCuller(zoom); drawSingleSegment(zoom, p, canvas, tileBox); } } @@ -143,16 +144,6 @@ public class Renderable { return culled.isEmpty() ? points : culled; } - public List getPointsForDrawingWithBorder() { - if (!culled.isEmpty()) { - return culled; - } else if (!oldCulled.isEmpty()) { - return oldCulled; - } else { - return points; - } - } - public void drawGeometry(Canvas canvas, RotatedTileBox tileBox, QuadRect quadRect, int arrowColor, int trackColor, float trackWidth) { if (geometryWay != null) { List points = getPointsForDrawing(); @@ -177,7 +168,7 @@ public class Renderable { float lastX = tileBox.getPixXFromLatLon(lastPt.lat, lastPt.lon); float lastY = tileBox.getPixYFromLatLon(lastPt.lat, lastPt.lon); if (!path.isEmpty()) { - canvas.drawPath(path, paint); + canvas.drawPath(path, p); } path.reset(); path.moveTo(lastX, lastY); @@ -191,58 +182,99 @@ public class Renderable { lastPt = pt; } if (!path.isEmpty()) { - canvas.drawPath(path, paint); + canvas.drawPath(path, p); } } protected void drawGradient(List pts, Paint p, Canvas canvas, RotatedTileBox tileBox) { QuadRect tileBounds = tileBox.getLatLonBounds(); - Path currentPath = new Path(); - Path nextPath = new Path(); - Paint paint = new Paint(this.paint); + Path path = new Path(); + boolean recalculateLastXY = true; + WptPt lastPt = pts.get(0); - WptPt prevWpt = pts.get(0); - WptPt currWpt = pts.get(1); - - PointF prevXY = new PointF(); - PointF currXY = new PointF(); - PointF nextXY = new PointF(); - - boolean currLineVisible = arePointsInsideTile(prevWpt, currWpt, tileBounds); - boolean nextLineVisible; - - if (currLineVisible) { - pixXYFromWptPt(tileBox, prevXY, prevWpt); - pixXYFromWptPt(tileBox, currXY, currWpt); - canvas.drawPath(pathFromStartEnd(currentPath, prevXY, currXY), borderPaint); - } + List gradientPoints = new ArrayList<>(); + List gradientColors = new ArrayList<>(); + float gradientAngle = 0; for (int i = 1; i < pts.size(); i++) { - currWpt = pts.get(i); - WptPt nextWpt = i + 1 == pts.size() ? null : pts.get(i + 1); + WptPt pt = pts.get(i); + WptPt nextPt = i + 1 < pts.size() ? pts.get(i + 1) : null; + float nextX = nextPt == null ? 0 : tileBox.getPixXFromLatLon(nextPt.lat, nextPt.lon); + float nextY = nextPt == null ? 0 : tileBox.getPixYFromLatLon(nextPt.lat, nextPt.lon); + float lastX = 0; + float lastY = 0; + if (arePointsInsideTile(pt, lastPt, tileBounds)) { + if (recalculateLastXY) { + recalculateLastXY = false; + lastX = tileBox.getPixXFromLatLon(lastPt.lat, lastPt.lon); + lastY = tileBox.getPixYFromLatLon(lastPt.lat, lastPt.lon); + if (!path.isEmpty()) { + p.setShader(createGradient(gradientPoints, gradientColors)); + canvas.drawPath(path, p); + } + path.reset(); + path.moveTo(lastX, lastY); - nextLineVisible = arePointsInsideTile(currWpt, nextWpt, tileBounds); - if (nextWpt != null && nextLineVisible) { - pixXYFromWptPt(tileBox, currXY, currWpt); - pixXYFromWptPt(tileBox, nextXY, nextWpt); - canvas.drawPath(pathFromStartEnd(nextPath, currXY, nextXY), borderPaint); + gradientPoints.clear(); + gradientColors.clear(); + gradientPoints.add(new PointF(lastX, lastY)); + gradientColors.add(lastPt.getColor(scaleType.toColorizationType())); + } + float x = tileBox.getPixXFromLatLon(pt.lat, pt.lon); + float y = tileBox.getPixYFromLatLon(pt.lat, pt.lon); + path.lineTo(x, y); + gradientPoints.add(new PointF(x, y)); + gradientColors.add(pt.getColor(scaleType.toColorizationType())); + + if (gradientColors.size() == 2) { + gradientAngle = calculateAngle(lastX, lastY, x, y); + } + if (nextPt != null) { + float nextAngle = calculateAngle(x, y, nextX, nextY); + if (Math.abs(nextAngle - gradientAngle) > 20) { + recalculateLastXY = true; + } + } + } else { + recalculateLastXY = true; } - - if (currLineVisible) { - int prevColor = prevWpt.getColor(scaleType.toColorizationType()); - int currentColor = currWpt.getColor(scaleType.toColorizationType()); - LinearGradient gradient = new LinearGradient(prevXY.x, prevXY.y, currXY.x, currXY.y, - prevColor, currentColor, Shader.TileMode.CLAMP); - paint.setShader(gradient); - canvas.drawPath(currentPath, paint); - } - - prevWpt = currWpt; - currentPath.set(nextPath); - prevXY.set(currXY); - currXY.set(nextXY); - currLineVisible = nextLineVisible; + lastPt = pt; } + if (!path.isEmpty()) { + p.setShader(createGradient(gradientPoints, gradientColors)); + canvas.drawPath(path, p); + } + } + + private LinearGradient createGradient(List gradientPoints, List gradientColors) { + float gradientLength = 0; + List pointsLength = new ArrayList<>(gradientPoints.size() - 1); + for (int i = 1; i < gradientPoints.size(); i++) { + PointF start = gradientPoints.get(i - 1); + PointF end = gradientPoints.get(i); + pointsLength.add((float) MapUtils.getSqrtDistance(start.x, start.y, end.x, end.y)); + gradientLength += pointsLength.get(i - 1); + } + + float[] positions = new float[gradientPoints.size()]; + positions[0] = 0; + for (int i = 1; i < gradientPoints.size(); i++) { + positions[i] = positions[i - 1] + pointsLength.get(i - 1) / gradientLength; + } + + int[] colors = new int[gradientColors.size()]; + for (int i = 0; i < gradientColors.size(); i++) { + colors[i] = gradientColors.get(i); + } + + PointF gradientStart = gradientPoints.get(0); + PointF gradientEnd = gradientPoints.get(gradientPoints.size() - 1); + return new LinearGradient(gradientStart.x, gradientStart.y, gradientEnd.x, gradientEnd.y, + colors, positions, Shader.TileMode.CLAMP); + } + + private float calculateAngle(float startX, float startY, float endX, float endY) { + return (float) Math.abs(Math.toDegrees(Math.atan2(endY - startY, endX - startX))); } protected boolean arePointsInsideTile(WptPt first, WptPt second, QuadRect tileBounds) { @@ -252,19 +284,6 @@ public class Renderable { return Math.min(first.lon, second.lon) < tileBounds.right && Math.max(first.lon, second.lon) > tileBounds.left && Math.min(first.lat, second.lat) < tileBounds.top && Math.max(first.lat, second.lat) > tileBounds.bottom; } - - protected PointF pixXYFromWptPt(RotatedTileBox tileBox, PointF pointF, WptPt wptPt) { - pointF.x = tileBox.getPixXFromLatLon(wptPt.lat, wptPt.lon); - pointF.y = tileBox.getPixYFromLatLon(wptPt.lat, wptPt.lon); - return pointF; - } - - protected Path pathFromStartEnd(Path path, PointF start, PointF end) { - path.reset(); - path.moveTo(start.x, start.y); - path.lineTo(end.x, end.y); - return path; - } } public static class StandardTrack extends RenderableSegment { @@ -316,4 +335,4 @@ public class Renderable { @Override protected void startCuller(double newZoom) {} } -} +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java b/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java index 2531b78a51..007e6fe700 100644 --- a/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/layers/GPXLayer.java @@ -69,6 +69,8 @@ import net.osmand.render.RenderingRuleProperty; import net.osmand.render.RenderingRuleSearchRequest; import net.osmand.render.RenderingRulesStorage; import net.osmand.router.RouteColorize; +import net.osmand.router.RouteColorize.ColorizationType; +import net.osmand.router.RouteColorize.RouteColorizationPoint; import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; @@ -117,6 +119,8 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM private MapMarkersHelper mapMarkersHelper; private GpxSelectionHelper selectedGpxHelper; + private final Map segmentsCache = new HashMap<>(); + private List cache = new ArrayList<>(); private Map pointFileMap = new HashMap<>(); private MapTextLayer textLayer; @@ -459,7 +463,10 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM float trackWidth = getTrackWidth(width, defaultTrackWidth); int trackColor = getTrackColor(selectedGpxFile.getGpxFile(), cachedColor); int arrowColor = UiUtilities.getContrastColor(view.getApplication(), trackColor, false); - for (TrkSegment segment : selectedGpxFile.getPointsToDisplay()) { + GradientScaleType scaleType = getGradientScaleType(selectedGpxFile.getGpxFile()); + List segments = scaleType != null ? + getCachedSegments(selectedGpxFile, scaleType) : selectedGpxFile.getPointsToDisplay(); + for (TrkSegment segment : segments) { if (segment.renderer instanceof Renderable.RenderableSegment) { ((Renderable.RenderableSegment) segment.renderer) .drawGeometry(canvas, tileBox, correctedQuadRect, arrowColor, trackColor, trackWidth); @@ -681,26 +688,24 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM private void drawSelectedFileSegments(SelectedGpxFile selectedGpxFile, boolean currentTrack, Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { - OsmandApplication app = view.getApplication(); - GPXFile gpxFile = selectedGpxFile.getGpxFile(); - List segments = selectedGpxFile.getPointsToDisplay(); - GradientScaleType scaleType = getGradientScaleType(gpxFile); - List colorsOfPoints = null; - - if (needCalculatePointsColors(segments, scaleType)) { - RouteColorize colorize = new RouteColorize(view.getZoom(), gpxFile, selectedGpxFile.getTrackAnalysis(app), - scaleType.toColorizationType(), app.getSettings().getApplicationMode().getMaxSpeed()); - colorize.setPalette(getColorizationPalette(gpxFile, scaleType)); - colorsOfPoints = colorize.getResult(false); + boolean visible = QuadRect.trivialOverlap(tileBox.getLatLonBounds(), GPXUtilities.calculateTrackBounds(selectedGpxFile.getPointsToDisplay())); + if (!selectedGpxFile.getGpxFile().hasTrkPt() || !visible) { + return; + } + + GPXFile gpxFile = selectedGpxFile.getGpxFile(); + GradientScaleType scaleType = getGradientScaleType(gpxFile); + List segments = new ArrayList<>(); + + if (scaleType == null) { + segments.addAll(selectedGpxFile.getPointsToDisplay()); + } else { + segments.addAll(getCachedSegments(selectedGpxFile, scaleType)); } - int startIdx = 0; for (TrkSegment ts : segments) { String width = getTrackWidthName(gpxFile, defaultTrackWidthPref.get()); int color = getTrackColor(gpxFile, ts.getColor(cachedColor)); - if (colorsOfPoints != null) { - startIdx = setColorsToPoints(ts, colorsOfPoints, scaleType, startIdx); - } if (ts.renderer == null && !ts.points.isEmpty()) { Renderable.RenderableSegment renderer; if (currentTrack) { @@ -721,53 +726,16 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM } } - private boolean needCalculatePointsColors(List segments, GradientScaleType scaleType) { - if (scaleType == null) { - return false; + private List getCachedSegments(SelectedGpxFile selectedGpxFile, GradientScaleType scaleType) { + GPXFile gpxFile = selectedGpxFile.getGpxFile(); + String path = gpxFile.path; + long modifiedTime = gpxFile.modifiedTime; + CachedTrack cachedTrack = segmentsCache.get(path); + if (cachedTrack == null) { + cachedTrack = new CachedTrack(view.getApplication(), modifiedTime); + segmentsCache.put(path, cachedTrack); } - RouteColorize.ColorizationType colorizationType = scaleType.toColorizationType(); - for (int segIdx = segments.size() - 1; segIdx >= 0; segIdx--) { - List pts = segments.get(segIdx).points; - if (!Algorithms.isEmpty(pts)) { - for (int wptIdx = pts.size() - 1; wptIdx >= 0; wptIdx--) { - WptPt pt = pts.get(wptIdx); - if (pt.getColor(colorizationType) == 0) { - return true; - } - } - } - } - return false; - } - - private int setColorsToPoints(TrkSegment segment, List colors, GradientScaleType scaleType, int startIdx) { - int pointsSize = segment.points.size(); - RouteColorize.RouteColorizationPoint startColor = colors.get(startIdx); - RouteColorize.RouteColorizationPoint endColor = colors.get(startIdx + pointsSize - 1); - WptPt firstPoint = segment.points.get(0); - WptPt lastPoint = segment.points.get(pointsSize - 1); - while (!compareCoordinates(firstPoint, startColor) && compareCoordinates(lastPoint, endColor)) { - startIdx++; - startColor = colors.get(startIdx); - endColor = colors.get(startIdx + pointsSize - 1); - } - - for (int i = startIdx; i < startIdx + pointsSize; i++) { - WptPt currentPoint = segment.points.get(i - startIdx); - int currentColor = colors.get(i).color; - if (scaleType == GradientScaleType.SPEED) { - currentPoint.speedColor = currentColor; - } else if (scaleType == GradientScaleType.ALTITUDE) { - currentPoint.altitudeColor = currentColor; - } else { - currentPoint.slopeColor = currentColor; - } - } - return startIdx; - } - - private boolean compareCoordinates(WptPt left, RouteColorize.RouteColorizationPoint right) { - return left.lat == right.lat && left.lon == right.lon; + return cachedTrack.getCachedSegments(selectedGpxFile, view.getZoom(), scaleType, getColorizationPalette(gpxFile, scaleType)); } private float getTrackWidth(String width, float defaultTrackWidth) { @@ -1150,9 +1118,9 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM if (!Algorithms.isEmpty(trackPoints)) { MapActivity mapActivity = (MapActivity) view.getContext(); SelectedGpxPoint selectedGpxPoint = (SelectedGpxPoint) trackPoints.get(0); - WptPt wptPt = selectedGpxPoint.getSelectedPoint(); + LatLon latLon = tileBox.getLatLonFromPixel(point.x, point.y); PointDescription description = getObjectName(selectedGpxPoint); - mapActivity.getContextMenu().show(new LatLon(wptPt.lat, wptPt.lon), description, selectedGpxPoint); + mapActivity.getContextMenu().show(latLon, description, selectedGpxPoint); return true; } } @@ -1247,4 +1215,76 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM view.getApplication().getItineraryHelper().runSynchronization(group); } } + + private static class CachedTrack { + + private OsmandApplication app; + + private long modifiedTime; + private final Map> cache = new HashMap<>(); + + public CachedTrack(@NonNull OsmandApplication app, long modifiedTime) { + this.app = app; + this.modifiedTime = modifiedTime; + } + + public List getCachedSegments(@NonNull SelectedGpxFile selectedGpxFile, int zoom, + @NonNull GradientScaleType scaleType, + int[] gradientPalette) { + GPXFile gpxFile = selectedGpxFile.getGpxFile(); + String trackId = zoom + "_" + scaleType.toString(); + if (modifiedTime == gpxFile.modifiedTime) { + List segments = cache.get(trackId); + if (segments == null) { + segments = calculateGradientTrack(selectedGpxFile, zoom, scaleType, gradientPalette); + cache.put(trackId, segments); + } + return segments; + } else { + cache.clear(); + modifiedTime = gpxFile.modifiedTime; + List segments = calculateGradientTrack(selectedGpxFile, zoom, scaleType, gradientPalette); + cache.put(trackId, segments); + return segments; + } + } + + private List calculateGradientTrack(SelectedGpxFile selectedGpxFile, int zoom, + GradientScaleType scaleType, int[] gradientPalette) { + GPXFile gpxFile = selectedGpxFile.getGpxFile(); + RouteColorize colorize = new RouteColorize(zoom, gpxFile, selectedGpxFile.getTrackAnalysis(app), + scaleType.toColorizationType(), app.getSettings().getApplicationMode().getMaxSpeed()); + colorize.setPalette(gradientPalette); + List colorsOfPoints = colorize.getResult(true); + return createSimplifiedSegments(selectedGpxFile.getGpxFile(), colorsOfPoints, scaleType); + } + + private List createSimplifiedSegments(GPXFile gpxFile, + List colorizationPoints, + GradientScaleType scaleType) { + List simplifiedSegments = new ArrayList<>(); + ColorizationType colorizationType = scaleType.toColorizationType(); + int id = 0; + int colorPointIdx = 0; + + for (TrkSegment segment : gpxFile.getNonEmptyTrkSegments(false)) { + TrkSegment simplifiedSegment = new TrkSegment(); + simplifiedSegments.add(simplifiedSegment); + for (WptPt pt : segment.points) { + if (colorPointIdx >= colorizationPoints.size()) { + return simplifiedSegments; + } + RouteColorizationPoint colorPoint = colorizationPoints.get(colorPointIdx); + if (colorPoint.id == id) { + simplifiedSegment.points.add(pt); + pt.setColor(colorizationType, colorPoint.color); + colorPointIdx++; + } + id++; + } + } + + return simplifiedSegments; + } + } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/article/WikivoyageArticleDialogFragment.java b/OsmAnd/src/net/osmand/plus/wikivoyage/article/WikivoyageArticleDialogFragment.java index b281e85f84..7ea563edcc 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/article/WikivoyageArticleDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/article/WikivoyageArticleDialogFragment.java @@ -69,9 +69,9 @@ public class WikivoyageArticleDialogFragment extends WikiArticleBaseDialogFragme private static final String SELECTED_LANG_KEY = "selected_lang"; private static final String EMPTY_URL = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d4//"; - + private static final int MENU_ITEM_SHARE = 0; - + private TravelArticleIdentifier articleId; private ArrayList langs; private String selectedLang; @@ -246,23 +246,16 @@ public class WikivoyageArticleDialogFragment extends WikiArticleBaseDialogFragme private void updateSaveButton() { if (article != null) { - final TravelLocalDataHelper helper = getMyApplication().getTravelHelper().getBookmarksHelper(); - final boolean saved = helper.isArticleSaved(article); + final TravelHelper helper = getMyApplication().getTravelHelper(); + final boolean saved = helper.getBookmarksHelper().isArticleSaved(article); Drawable icon = getActiveIcon(saved ? R.drawable.ic_action_read_later_fill : R.drawable.ic_action_read_later); saveBtn.setText(getString(saved ? R.string.shared_string_remove : R.string.shared_string_bookmark)); saveBtn.setCompoundDrawablesWithIntrinsicBounds(null, null, icon, null); saveBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - if (article != null) { - if (saved) { - helper.removeArticleFromSaved(article); - } else { - getMyApplication().getTravelHelper().createGpxFile(article); - helper.addArticleToSaved(article); - } - updateSaveButton(); - } + helper.saveOrRemoveArticle(article, !saved); + updateSaveButton(); } }); } diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java index 627f6d7945..c1a3bc3405 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java @@ -193,6 +193,15 @@ public class TravelDbHelper implements TravelHelper { return WORLD_WIKIVOYAGE_FILE_NAME; } + @Override + public void saveOrRemoveArticle(@NonNull TravelArticle article, boolean save) { + if (save) { + localDataHelper.addArticleToSaved(article); + } else { + localDataHelper.removeArticleFromSaved(article); + } + } + public List getExistingTravelBooks() { return existingTravelBooks; } diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java index 0cde849fbf..5a545ceffe 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java @@ -70,4 +70,6 @@ public interface TravelHelper { String getSelectedTravelBookName(); String getWikivoyageFileName(); + + void saveOrRemoveArticle(@NonNull TravelArticle article, boolean save); } diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelLocalDataHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelLocalDataHelper.java index e84765a376..4f85cb8b82 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelLocalDataHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelLocalDataHelper.java @@ -4,11 +4,13 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import net.osmand.GPXUtilities; +import net.osmand.GPXUtilities.GPXFile; import net.osmand.IndexConstants; import net.osmand.PlatformUtil; import net.osmand.plus.OsmandApplication; import net.osmand.plus.api.SQLiteAPI.SQLiteConnection; import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; +import net.osmand.plus.wikivoyage.data.TravelHelper.GpxReadCallback; import net.osmand.util.Algorithms; import org.apache.commons.logging.Log; @@ -124,14 +126,6 @@ public class TravelLocalDataHelper { } } - public void restoreSavedArticle(@NonNull TravelArticle article) { - if (!isArticleSaved(article)) { - savedArticles.add(article); - dbHelper.addSavedArticle(article); - notifySavedUpdated(); - } - } - public void removeArticleFromSaved(@NonNull TravelArticle article) { TravelArticle savedArticle = getArticle(article.title, article.lang); if (savedArticle != null) { @@ -305,7 +299,7 @@ public class TravelLocalDataHelper { conn.execSQL("ALTER TABLE " + BOOKMARKS_TABLE_NAME + " ADD " + BOOKMARKS_COL_TRAVEL_BOOK + " TEXT"); String selectedTravelBookName = context.getTravelHelper().getSelectedTravelBookName(); if (selectedTravelBookName != null) { - Object[] args = new Object[]{selectedTravelBookName}; + Object[] args = new Object[] {selectedTravelBookName}; conn.execSQL("UPDATE " + HISTORY_TABLE_NAME + " SET " + HISTORY_COL_TRAVEL_BOOK + " = ?", args); conn.execSQL("UPDATE " + BOOKMARKS_TABLE_NAME + " SET " + BOOKMARKS_COL_TRAVEL_BOOK + " = ?", args); } @@ -368,7 +362,7 @@ public class TravelLocalDataHelper { conn.execSQL("INSERT INTO " + HISTORY_TABLE_NAME + "(" + HISTORY_COL_ARTICLE_TITLE + ", " + HISTORY_COL_LANG + ", " + HISTORY_COL_IS_PART_OF + ", " + HISTORY_COL_LAST_ACCESSED + ", " + HISTORY_COL_TRAVEL_BOOK + ") VALUES (?, ?, ?, ?, ?)", new Object[] { - item.articleTitle, item.lang, item.isPartOf, item.lastAccessed, travelBook }); + item.articleTitle, item.lang, item.isPartOf, item.lastAccessed, travelBook}); } finally { conn.close(); } @@ -389,8 +383,8 @@ public class TravelLocalDataHelper { "WHERE " + HISTORY_COL_ARTICLE_TITLE + " = ? " + " AND " + HISTORY_COL_LANG + " = ?" + " AND " + HISTORY_COL_TRAVEL_BOOK + " = ?", - new Object[]{item.isPartOf, item.lastAccessed, - item.articleTitle, item.lang, travelBook}); + new Object[] {item.isPartOf, item.lastAccessed, + item.articleTitle, item.lang, travelBook}); } finally { conn.close(); } @@ -406,10 +400,10 @@ public class TravelLocalDataHelper { if (conn != null) { try { conn.execSQL("DELETE FROM " + HISTORY_TABLE_NAME + - " WHERE " + HISTORY_COL_ARTICLE_TITLE+ " = ?" + + " WHERE " + HISTORY_COL_ARTICLE_TITLE + " = ?" + " AND " + HISTORY_COL_LANG + " = ?" + " AND " + HISTORY_COL_TRAVEL_BOOK + " = ?", - new Object[]{item.articleTitle, item.lang, travelBook}); + new Object[] {item.articleTitle, item.lang, travelBook}); } finally { conn.close(); } @@ -480,63 +474,84 @@ public class TravelLocalDataHelper { if (travelBook == null) { return; } - context.getTravelHelper().getArticleById(article.generateIdentifier(), article.lang, true, - new TravelHelper.GpxReadCallback() { - @Override - public void onGpxFileReading() { + final TravelHelper travelHelper = context.getTravelHelper(); + travelHelper.getArticleById(article.generateIdentifier(), article.lang, true, new GpxReadCallback() { + @Override + public void onGpxFileReading() { - } + } - @Override - public void onGpxFileRead(@Nullable GPXUtilities.GPXFile gpxFile) { - SQLiteConnection conn = openConnection(false); - if (conn != null) { - try { - String query = "INSERT INTO " + BOOKMARKS_TABLE_NAME + " (" + - BOOKMARKS_COL_ARTICLE_TITLE + ", " + - BOOKMARKS_COL_LANG + ", " + - BOOKMARKS_COL_IS_PART_OF + ", " + - BOOKMARKS_COL_IMAGE_TITLE + ", " + - BOOKMARKS_COL_TRAVEL_BOOK + ", " + - BOOKMARKS_COL_LAT + ", " + - BOOKMARKS_COL_LON + ", " + - BOOKMARKS_COL_ROUTE_ID + ", " + - BOOKMARKS_COL_CONTENT_JSON + ", " + - BOOKMARKS_COL_CONTENT + ", " + - BOOKMARKS_COL_LAST_MODIFIED + ", " + - BOOKMARKS_COL_GPX_GZ + - ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; - conn.execSQL(query, new Object[]{article.title, article.lang, - article.aggregatedPartOf, article.imageTitle, - travelBook, article.lat, article.lon, article.routeId, article.contentsJson, - article.content, article.getFile().lastModified(), - Algorithms.stringToGzip(GPXUtilities.asString(article.gpxFile))}); - } finally { - conn.close(); - } - } + @Override + public void onGpxFileRead(@Nullable GPXFile gpxFile) { + if (gpxFile != null) { + travelHelper.createGpxFile(article); + } + + SQLiteConnection conn = openConnection(false); + if (conn != null) { + try { + String query = "INSERT INTO " + BOOKMARKS_TABLE_NAME + " (" + + BOOKMARKS_COL_ARTICLE_TITLE + ", " + + BOOKMARKS_COL_LANG + ", " + + BOOKMARKS_COL_IS_PART_OF + ", " + + BOOKMARKS_COL_IMAGE_TITLE + ", " + + BOOKMARKS_COL_TRAVEL_BOOK + ", " + + BOOKMARKS_COL_LAT + ", " + + BOOKMARKS_COL_LON + ", " + + BOOKMARKS_COL_ROUTE_ID + ", " + + BOOKMARKS_COL_CONTENT_JSON + ", " + + BOOKMARKS_COL_CONTENT + ", " + + BOOKMARKS_COL_LAST_MODIFIED + ", " + + BOOKMARKS_COL_GPX_GZ + + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + conn.execSQL(query, new Object[] {article.title, article.lang, + article.aggregatedPartOf, article.imageTitle, + travelBook, article.lat, article.lon, article.routeId, article.contentsJson, + article.content, article.getFile().lastModified(), + Algorithms.stringToGzip(GPXUtilities.asString(article.gpxFile))}); + } finally { + conn.close(); } - }); + } + } + }); } - void removeSavedArticle(@NonNull TravelArticle article) { - String travelBook = article.getTravelBook(context); + void removeSavedArticle(@NonNull final TravelArticle article) { + final String travelBook = article.getTravelBook(context); if (travelBook == null) { return; } - SQLiteConnection conn = openConnection(false); - if (conn != null) { - try { - String query = "DELETE FROM " + BOOKMARKS_TABLE_NAME + - " WHERE " + BOOKMARKS_COL_ARTICLE_TITLE + " = ?" + - " AND " + BOOKMARKS_COL_ROUTE_ID + " = ?" + - " AND " + BOOKMARKS_COL_LANG + ((article.lang != null) ? " = '" + article.lang + "'" : " IS NULL") + - " AND " + BOOKMARKS_COL_TRAVEL_BOOK + " = ?"; - conn.execSQL(query, new Object[]{article.title, article.routeId, travelBook}); - } finally { - conn.close(); + final TravelHelper travelHelper = context.getTravelHelper(); + travelHelper.getArticleById(article.generateIdentifier(), article.lang, true, new GpxReadCallback() { + @Override + public void onGpxFileReading() { + } - } + + @Override + public void onGpxFileRead(@Nullable GPXFile gpxFile) { + if (gpxFile != null) { + String name = travelHelper.getGPXName(article); + gpxFile.path = context.getAppPath(IndexConstants.GPX_TRAVEL_DIR + name).getAbsolutePath(); + context.getSelectedGpxHelper().selectGpxFile(gpxFile, false, true); + } + + SQLiteConnection conn = openConnection(false); + if (conn != null) { + try { + String query = "DELETE FROM " + BOOKMARKS_TABLE_NAME + + " WHERE " + BOOKMARKS_COL_ARTICLE_TITLE + " = ?" + + " AND " + BOOKMARKS_COL_ROUTE_ID + " = ?" + + " AND " + BOOKMARKS_COL_LANG + ((article.lang != null) ? " = '" + article.lang + "'" : " IS NULL") + + " AND " + BOOKMARKS_COL_TRAVEL_BOOK + " = ?"; + conn.execSQL(query, new Object[] {article.title, article.routeId, travelBook}); + } finally { + conn.close(); + } + } + } + }); } void updateSavedArticle(@NonNull TravelArticle odlArticle, @NonNull TravelArticle newArticle) { @@ -563,7 +578,7 @@ public class TravelLocalDataHelper { " AND " + BOOKMARKS_COL_ROUTE_ID + " = ?" + " AND " + BOOKMARKS_COL_LANG + " = ?" + " AND " + BOOKMARKS_COL_TRAVEL_BOOK + " = ?", - new Object[]{newArticle.title, newArticle.lang, newArticle.aggregatedPartOf, + new Object[] {newArticle.title, newArticle.lang, newArticle.aggregatedPartOf, newArticle.imageTitle, newArticle.getTravelBook(context), newArticle.lat, newArticle.lon, newArticle.routeId, newArticle.contentsJson, newArticle.content, newArticle.getLastModified(), diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java index cdd90e21bd..1cde05050b 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java @@ -56,10 +56,10 @@ import static net.osmand.GPXUtilities.WptPt; import static net.osmand.GPXUtilities.writeGpxFile; import static net.osmand.plus.helpers.GpxUiHelper.getGpxTitle; import static net.osmand.plus.wikivoyage.data.PopularArticles.ARTICLES_PER_PAGE; +import static net.osmand.plus.wikivoyage.data.TravelGpx.ACTIVITY_TYPE; import static net.osmand.plus.wikivoyage.data.TravelGpx.DIFF_ELE_DOWN; import static net.osmand.plus.wikivoyage.data.TravelGpx.DIFF_ELE_UP; import static net.osmand.plus.wikivoyage.data.TravelGpx.DISTANCE; -import static net.osmand.plus.wikivoyage.data.TravelGpx.ACTIVITY_TYPE; import static net.osmand.plus.wikivoyage.data.TravelGpx.USER; import static net.osmand.util.Algorithms.capitalizeFirstLetter; @@ -1029,6 +1029,15 @@ public class TravelObfHelper implements TravelHelper { return WORLD_WIKIVOYAGE_FILE_NAME; } + @Override + public void saveOrRemoveArticle(@NonNull TravelArticle article, boolean save) { + if (save) { + localDataHelper.addArticleToSaved(article); + } else { + localDataHelper.removeArticleFromSaved(article); + } + } + private class GpxFileReader extends AsyncTask { private final TravelArticle article; diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/SavedArticlesRvAdapter.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/SavedArticlesRvAdapter.java index 9bccece08d..482ce36814 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/SavedArticlesRvAdapter.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/SavedArticlesRvAdapter.java @@ -31,13 +31,13 @@ import net.osmand.plus.wikipedia.WikiArticleHelper; import net.osmand.plus.wikivoyage.WikivoyageUtils; import net.osmand.plus.wikivoyage.data.TravelArticle; import net.osmand.plus.wikivoyage.data.TravelGpx; -import net.osmand.plus.wikivoyage.data.TravelLocalDataHelper; +import net.osmand.plus.wikivoyage.data.TravelHelper; import net.osmand.util.Algorithms; import java.util.ArrayList; import java.util.List; -import static net.osmand.plus.wikivoyage.explore.travelcards.TravelGpxCard.*; +import static net.osmand.plus.wikivoyage.explore.travelcards.TravelGpxCard.TravelGpxVH; import static net.osmand.util.Algorithms.capitalizeFirstLetterAndLowercase; public class SavedArticlesRvAdapter extends RecyclerView.Adapter { @@ -182,20 +182,15 @@ public class SavedArticlesRvAdapter extends RecyclerView.Adapter