Merge pull request #11420 from osmandapp/master

update test branch
This commit is contained in:
Hardy 2021-04-13 23:49:02 +02:00 committed by GitHub
commit e328a94d94
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
39 changed files with 1208 additions and 883 deletions

View file

@ -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() { public String getBackgroundType() {
return getExtensionsToRead().get(BACKGROUND_TYPE_EXTENSION); return getExtensionsToRead().get(BACKGROUND_TYPE_EXTENSION);
} }
@ -1103,6 +1113,15 @@ public class GPXUtilities {
return trackBounds; return trackBounds;
} }
public static QuadRect calculateTrackBounds(List<TrkSegment> 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<WptPt> pts, int startIndex) { public static void updateBounds(QuadRect trackBounds, List<WptPt> pts, int startIndex) {
for (int i = startIndex; i < pts.size(); i++) { for (int i = startIndex; i < pts.size(); i++) {
WptPt pt = pts.get(i); WptPt pt = pts.get(i);

View file

@ -340,6 +340,30 @@ public class OsmMapUtils {
} }
} }
public static void simplifyDouglasPeucker(List<Node> nodes, int start, int end, List<Node> 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) { private static double orthogonalDistance(int zoom, Node nodeLineStart, Node nodeLineEnd, Node node) {
LatLon p = MapUtils.getProjection(node.getLatitude(), node.getLongitude(), nodeLineStart.getLatitude(), LatLon p = MapUtils.getProjection(node.getLatitude(), node.getLongitude(), nodeLineStart.getLatitude(),
nodeLineStart.getLongitude(), nodeLineEnd.getLatitude(), nodeLineEnd.getLongitude()); nodeLineStart.getLongitude(), nodeLineEnd.getLatitude(), nodeLineEnd.getLongitude());

View file

@ -35,6 +35,7 @@ public class RouteColorize {
public static final int RED = rgbaToDecimal(243, 55, 77, 255); public static final int RED = rgbaToDecimal(243, 55, 77, 255);
public static final int[] colors = new int[] {GREEN, YELLOW, RED}; 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; private static final int MAX_SLOPE_VALUE = 25;
public enum ColorizationType { public enum ColorizationType {
@ -105,6 +106,10 @@ public class RouteColorize {
} }
for (Track t : gpxFile.tracks) { for (Track t : gpxFile.tracks) {
for (TrkSegment ts : t.segments) { for (TrkSegment ts : t.segments) {
if (ts.generalSegment || ts.points.size() < 2) {
continue;
}
for (WptPt p : ts.points) { for (WptPt p : ts.points) {
latList.add(p.lat); latList.add(p.lat);
lonList.add(p.lon); lonList.add(p.lon);
@ -241,7 +246,6 @@ public class RouteColorize {
if (dataList == null) { if (dataList == null) {
dataList = new ArrayList<>(); dataList = new ArrayList<>();
for (int i = 0; i < latitudes.length; i++) { 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])); dataList.add(new RouteColorizationPoint(i, latitudes[i], longitudes[i], values[i]));
} }
} }
@ -250,11 +254,13 @@ public class RouteColorize {
for (RouteColorizationPoint data : dataList) { for (RouteColorizationPoint data : dataList) {
nodes.add(new net.osmand.osm.edit.Node(data.lat, data.lon, data.id)); 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<RouteColorizationPoint> simplified = new ArrayList<>(); List<RouteColorizationPoint> simplified = new ArrayList<>();
for (int i = 1; i < result.size(); i++) {
for (int i = 1; i < result.size() - 1; i++) {
int prevId = (int) result.get(i - 1).getId(); int prevId = (int) result.get(i - 1).getId();
int currentId = (int) result.get(i).getId(); int currentId = (int) result.get(i).getId();
List<RouteColorizationPoint> sublist = dataList.subList(prevId, currentId); List<RouteColorizationPoint> sublist = dataList.subList(prevId, currentId);
@ -477,7 +483,7 @@ public class RouteColorize {
} }
public static class RouteColorizationPoint { public static class RouteColorizationPoint {
int id; public int id;
public double lat; public double lat;
public double lon; public double lon;
public double val; public double val;

View file

@ -747,7 +747,9 @@ public class MapUtils {
return Math.sqrt((endX - startX) * (endX - startX) + (endY - startY) * (endY - startY)); 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));
}
} }

View file

@ -53,4 +53,5 @@
<string name="si_km_m">Χιλιόμετρα/μέτρα</string> <string name="si_km_m">Χιλιόμετρα/μέτρα</string>
<string name="unit_of_length_descr">Αλλαγή απόστασης που μετριέται.</string> <string name="unit_of_length_descr">Αλλαγή απόστασης που μετριέται.</string>
<string name="unit_of_length">Μονάδες μήκους</string> <string name="unit_of_length">Μονάδες μήκους</string>
<string name="shared_string_sort_by">Ταξινόμηση κατά</string>
</resources> </resources>

View file

@ -32,7 +32,7 @@
<string name="shared_string_welcome">Bonvenon</string> <string name="shared_string_welcome">Bonvenon</string>
<string name="m">m</string> <string name="m">m</string>
<string name="km">km</string> <string name="km">km</string>
<string name="nm">marmejlo</string> <string name="nm">nmi</string>
<string name="min_mile">min/m</string> <string name="min_mile">min/m</string>
<string name="min_km">min/km</string> <string name="min_km">min/km</string>
<string name="my_location">Mia loko</string> <string name="my_location">Mia loko</string>
@ -97,4 +97,26 @@
<string name="install_osmand">Instali OsmAnd</string> <string name="install_osmand">Instali OsmAnd</string>
<string name="shared_string_suggested">Sugestataj</string> <string name="shared_string_suggested">Sugestataj</string>
<string name="average_speed">Mezuma rapido</string> <string name="average_speed">Mezuma rapido</string>
<string name="shared_string_back">Reen</string>
<string name="shared_string_share">Kunhavigi</string>
<string name="shared_string_install">Instali</string>
<string name="phone_number_descr">Telefonnumero en internacia formo</string>
<string name="phone_number_title">Telefonnumero</string>
<string name="shared_string_password">Pasvorto</string>
<string name="nm_h">kn</string>
<string name="mile">mi</string>
<string name="foot">ft</string>
<string name="yard">yd</string>
<string name="mile_per_hour">mi/h</string>
<string name="si_nm_h">Marmejloj en horo (nodoj)</string>
<string name="shared_string_sort_by">Ordigi laŭ</string>
<string name="shared_string_sort">Ordigi</string>
<string name="by_group">Laŭ grupo</string>
<string name="by_name">Laŭ nomo</string>
<string name="by_distance">Laŭ distanco</string>
<string name="shared_string_name">Nomo</string>
<string name="shared_string_enabled">Aktiva</string>
<string name="connecting_to_the_internet">Konektante al Interreto</string>
<string name="initializing">Komencante</string>
<string name="sending_location_messages">Sendante lokon</string>
</resources> </resources>

View file

@ -114,7 +114,7 @@
<string name="no_gps_connection">Sem conexão GPS</string> <string name="no_gps_connection">Sem conexão GPS</string>
<string name="no_internet_connection">Sem ligação à Internet</string> <string name="no_internet_connection">Sem ligação à Internet</string>
<string name="shared_string_disable">Desativar</string> <string name="shared_string_disable">Desativar</string>
<string name="shared_string_save">Gravar</string> <string name="shared_string_save">Guardar</string>
<string name="add_device">Adicionar dispositivo</string> <string name="add_device">Adicionar dispositivo</string>
<string name="share_location_as">Partilhar localização como</string> <string name="share_location_as">Partilhar localização como</string>
<string name="live_now_description">Contactos e grupos partilhando a localização consigo.</string> <string name="live_now_description">Contactos e grupos partilhando a localização consigo.</string>

View file

@ -3826,4 +3826,5 @@
<string name="poi_content_beer">المحتوى: بيرة</string> <string name="poi_content_beer">المحتوى: بيرة</string>
<string name="poi_content_wine">المحتوى: نبيذ</string> <string name="poi_content_wine">المحتوى: نبيذ</string>
<string name="poi_pawnbroker">مقرض مال</string> <string name="poi_pawnbroker">مقرض مال</string>
<string name="poi_bay_filter">نوع الخليج</string>
</resources> </resources>

View file

@ -3921,7 +3921,7 @@
<string name="login_account">الحساب</string> <string name="login_account">الحساب</string>
<string name="user_login">تسجيل الدخول</string> <string name="user_login">تسجيل الدخول</string>
<string name="gpx_upload_trackable_visibility_descr">\"إمكانية التتبع\" تعني أن التتبع لا يظهر في أي قوائم عامة ولكن نقاط التتبع المعالجة مع طوابع زمنية صادرة عنها(التي لا يمكن أن تكون مرتبطة بك مباشرة) ستظهر خلال التنزيلات من واجهة برمجة التطبيقات GPS API العامة.</string> <string name="gpx_upload_trackable_visibility_descr">\"إمكانية التتبع\" تعني أن التتبع لا يظهر في أي قوائم عامة ولكن نقاط التتبع المعالجة مع طوابع زمنية صادرة عنها(التي لا يمكن أن تكون مرتبطة بك مباشرة) ستظهر خلال التنزيلات من واجهة برمجة التطبيقات GPS API العامة.</string>
<string name="markers_history">سجل تاريخ العلامات</string> <string name="markers_history">سجل التوجيه المباشر</string>
<string name="send_files_to_openstreetmap">أرسل ملف GPX إلى OpenStreetMap</string> <string name="send_files_to_openstreetmap">أرسل ملف GPX إلى OpenStreetMap</string>
<string name="enter_text_separated">أدخل العلامات مفصولة بفاصلة.</string> <string name="enter_text_separated">أدخل العلامات مفصولة بفاصلة.</string>
<string name="gpx_upload_private_visibility_descr">\"خاص\"يعني أن التتبع لن يظهر في أي قوائم عامة ، ولكن نقاط التتبع الصادرة عنه ستظل متاحة من خلال واجهة برمجة تطبيقات GPS API العامة بدون طوابع زمنية ولكن لن يتم ترتيبها ترتيبًا زمنيًا.</string> <string name="gpx_upload_private_visibility_descr">\"خاص\"يعني أن التتبع لن يظهر في أي قوائم عامة ، ولكن نقاط التتبع الصادرة عنه ستظل متاحة من خلال واجهة برمجة تطبيقات GPS API العامة بدون طوابع زمنية ولكن لن يتم ترتيبها ترتيبًا زمنيًا.</string>
@ -4075,7 +4075,7 @@
<string name="activity_type_car_name">سيارة</string> <string name="activity_type_car_name">سيارة</string>
<string name="copy_poi_name">نسخ اسم POI</string> <string name="copy_poi_name">نسخ اسم POI</string>
<string name="select_another_colorization">الرجاء اختيار أنواع أخرى من التلوين.</string> <string name="select_another_colorization">الرجاء اختيار أنواع أخرى من التلوين.</string>
<string name="snap_to_road_descr">سيتم القاط أيقونة المكان الحالي إلى مسار التنقل الحالي</string> <string name="snap_to_road_descr">سيتم سحب أيقونة المكان الحالي إلى مسار التنقل الحالي</string>
<string name="select_segments">حدد الجزء</string> <string name="select_segments">حدد الجزء</string>
<string name="select_segments_description">%1$s يحتوي على أكثر من مقطع ، تحتاج إلى تحديد الجزء المطلوب للتنقل.</string> <string name="select_segments_description">%1$s يحتوي على أكثر من مقطع ، تحتاج إلى تحديد الجزء المطلوب للتنقل.</string>
<string name="segments_count">الجزء %1$d</string> <string name="segments_count">الجزء %1$d</string>

View file

@ -2990,7 +2990,7 @@
<string name="poi_cuisine_asian">Ασιατικό</string> <string name="poi_cuisine_asian">Ασιατικό</string>
<string name="poi_cuisine_french">Γαλλικό</string> <string name="poi_cuisine_french">Γαλλικό</string>
<string name="poi_cuisine_greek">Ελληνικό</string> <string name="poi_cuisine_greek">Ελληνικό</string>
<string name="poi_cuisine_thai">Τάι</string> <string name="poi_cuisine_thai">Ταϊλανδικό</string>
<string name="poi_cuisine_international">Διεθνές</string> <string name="poi_cuisine_international">Διεθνές</string>
<string name="poi_cuisine_turkish">Τούρκικο</string> <string name="poi_cuisine_turkish">Τούρκικο</string>
<string name="poi_cuisine_spanish">Ισπανικό</string> <string name="poi_cuisine_spanish">Ισπανικό</string>

View file

@ -1435,14 +1435,14 @@
<string name="lang_ga">Ιρλανδικά</string> <string name="lang_ga">Ιρλανδικά</string>
<string name="lang_la">Λατινικά</string> <string name="lang_la">Λατινικά</string>
<string name="lang_ku">Κουρδικά</string> <string name="lang_ku">Κουρδικά</string>
<string name="lang_ta">Ταμιλικά</string> <string name="lang_ta">Ταμίλ</string>
<string name="lang_lb">Λουξεμβουργιανά</string> <string name="lang_lb">Λουξεμβουργιανά</string>
<string name="lang_os">Οσσετιανικά</string> <string name="lang_os">Οσσετιανικά</string>
<string name="lang_eo">Εσπεράντο</string> <string name="lang_eo">Εσπεράντο</string>
<string name="lang_es_ar">Ισπανικά (Αργεντινής)</string> <string name="lang_es_ar">Ισπανικά (Αργεντινής)</string>
<string name="lang_nb">Νορβηγικά Bokmål</string> <string name="lang_nb">Νορβηγικά Bokmål</string>
<string name="lang_th">Ταϊλανδικά</string> <string name="lang_th">Ταϊλανδικά</string>
<string name="lang_te">τελούγκου</string> <string name="lang_te">Τελούγκου</string>
<string name="lang_nn">Νορβηγικά Nynorsk</string> <string name="lang_nn">Νορβηγικά Nynorsk</string>
<string name="lang_et">Εσθονικά</string> <string name="lang_et">Εσθονικά</string>
<string name="archive_wikipedia_data">Έχετε παλιά ασύμβατα δεδομένα της βικιπαίδειας. Να αρχειοθετηθούν;</string> <string name="archive_wikipedia_data">Έχετε παλιά ασύμβατα δεδομένα της βικιπαίδειας. Να αρχειοθετηθούν;</string>
@ -1709,7 +1709,7 @@
<string name="today">Σήμερα</string> <string name="today">Σήμερα</string>
<string name="yesterday">Χθές</string> <string name="yesterday">Χθές</string>
<string name="last_seven_days">Τις τελευταίες 7 ημέρες</string> <string name="last_seven_days">Τις τελευταίες 7 ημέρες</string>
<string name="this_year">Εφέτος</string> <string name="this_year">Αυτό το έτος</string>
<string name="move_all_to_history">Μετακίνηση όλων στο ιστορικό</string> <string name="move_all_to_history">Μετακίνηση όλων στο ιστορικό</string>
<string name="show_direction">Ένδειξη απόστασης</string> <string name="show_direction">Ένδειξη απόστασης</string>
<string name="sort_by">Ταξινόμηση κατά</string> <string name="sort_by">Ταξινόμηση κατά</string>
@ -2205,7 +2205,7 @@
<string name="lang_bn">Βεγγαλέζικα</string> <string name="lang_bn">Βεγγαλέζικα</string>
<string name="lang_tl">Ταγκαλόγκ</string> <string name="lang_tl">Ταγκαλόγκ</string>
<string name="lang_br">Βρετονικά</string> <string name="lang_br">Βρετονικά</string>
<string name="lang_ml">Μαλαγιαλαμικά</string> <string name="lang_ml">Μαλαγιάλαμ</string>
<string name="lang_lo">Λαοϊκά</string> <string name="lang_lo">Λαοϊκά</string>
<string name="share_geo">γεω:</string> <string name="share_geo">γεω:</string>
<string name="routing_attr_avoid_shuttle_train_name">Αποφυγή τρένου κλειστής διαδρομής</string> <string name="routing_attr_avoid_shuttle_train_name">Αποφυγή τρένου κλειστής διαδρομής</string>
@ -2582,9 +2582,9 @@
<string name="update_time">Χρόνος ενημέρωσης</string> <string name="update_time">Χρόνος ενημέρωσης</string>
<string name="updates_size">Μέγεθος ενημέρωσης</string> <string name="updates_size">Μέγεθος ενημέρωσης</string>
<string name="last_map_change">Τελευταία αλλαγή χάρτη: %s</string> <string name="last_map_change">Τελευταία αλλαγή χάρτη: %s</string>
<string name="hourly">Ανά ώρα</string> <string name="hourly">Ωριαία</string>
<string name="daily">Ανά ημέρα</string> <string name="daily">Ημερήσια</string>
<string name="weekly">Ανά εβδομάδα</string> <string name="weekly">Εβδομαδιαία</string>
<string name="morning">Πρωί</string> <string name="morning">Πρωί</string>
<string name="night">Βράδυ</string> <string name="night">Βράδυ</string>
<string name="select_month_and_country">Μήνας και χώρα:</string> <string name="select_month_and_country">Μήνας και χώρα:</string>

View file

@ -219,7 +219,7 @@
<string name="favorite_category_select">Elekti kategorion</string> <string name="favorite_category_select">Elekti kategorion</string>
<string name="default_speed_system_descr">Difini unuon de rapido.</string> <string name="default_speed_system_descr">Difini unuon de rapido.</string>
<string name="default_speed_system">Unuo de rapido</string> <string name="default_speed_system">Unuo de rapido</string>
<string name="nm">marmejlo</string> <string name="nm">nmi</string>
<string name="si_nm">Marmejloj</string> <string name="si_nm">Marmejloj</string>
<string name="si_kmh">Kilometroj en horo</string> <string name="si_kmh">Kilometroj en horo</string>
<string name="si_mph">Mejloj en horo</string> <string name="si_mph">Mejloj en horo</string>
@ -3163,7 +3163,7 @@
<string name="voice_announces_descr">Navigaj gvidiloj kaj anoncoj</string> <string name="voice_announces_descr">Navigaj gvidiloj kaj anoncoj</string>
<string name="voice_announces">Voĉaj anoncoj</string> <string name="voice_announces">Voĉaj anoncoj</string>
<string name="screen_alerts">Ekranaj avertoj</string> <string name="screen_alerts">Ekranaj avertoj</string>
<string name="route_parameters_descr">Agordi parametroj de navigo</string> <string name="route_parameters_descr">Agordi parametrojn de navigo</string>
<string name="route_parameters">Parametroj de navigo</string> <string name="route_parameters">Parametroj de navigo</string>
<string name="application_profile_changed">Profilo de aplikaĵo ŝanĝita al “%s”</string> <string name="application_profile_changed">Profilo de aplikaĵo ŝanĝita al “%s”</string>
<string name="logcat_buffer">Bufro logcat</string> <string name="logcat_buffer">Bufro logcat</string>

View file

@ -209,7 +209,7 @@
<string name="traffic_warning_calming">Reductor de velocidad</string> <string name="traffic_warning_calming">Reductor de velocidad</string>
<string name="traffic_warning_speed_camera">Radar de velocidad</string> <string name="traffic_warning_speed_camera">Radar de velocidad</string>
<string name="traffic_warning">Aviso de tráfico</string> <string name="traffic_warning">Aviso de tráfico</string>
<string name="speak_favorites">Favoritos cerca</string> <string name="speak_favorites">Favoritos cercanos</string>
<string name="speak_poi">PDI cercanos</string> <string name="speak_poi">PDI cercanos</string>
<string name="way_alarms">Advertencias de tráfico</string> <string name="way_alarms">Advertencias de tráfico</string>
<string name="stop_navigation_service">Parar</string> <string name="stop_navigation_service">Parar</string>
@ -4054,7 +4054,7 @@
<string name="trip_recording_show_start_dialog_setting">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.</string> <string name="trip_recording_show_start_dialog_setting">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.</string>
<string name="customize_route_line">Personalizar línea de ruta</string> <string name="customize_route_line">Personalizar línea de ruta</string>
<string name="shared_string_route_line">Línea de ruta</string> <string name="shared_string_route_line">Línea de ruta</string>
<string name="route_line_use_map_style_appearance">La línea de la ruta sería el uso %1$s especificado en el estilo de mapa seleccionado: %2$s.</string> <string name="route_line_use_map_style_appearance">La línea de ruta usará el %1$s definido en el estilo de mapa elegido: %2$s.</string>
<string name="specify_color_for_map_mode">Define el color para el modo de mapa: %1$s.</string> <string name="specify_color_for_map_mode">Define el color para el modo de mapa: %1$s.</string>
<string name="release_4_0_beta">• Las actualizaciones de OsmAnd Live se han movido a «Descargas &gt; Actualizaciones». <string name="release_4_0_beta">• Las actualizaciones de OsmAnd Live se han movido a «Descargas &gt; Actualizaciones».
\n \n

View file

@ -3924,4 +3924,6 @@
<string name="poi_karate">Kárate</string> <string name="poi_karate">Kárate</string>
<string name="poi_hoops">Aros</string> <string name="poi_hoops">Aros</string>
<string name="poi_camp_pitch">Parcela de campamento</string> <string name="poi_camp_pitch">Parcela de campamento</string>
<string name="poi_office_diplomatic">Oficina diplomática</string>
<string name="poi_bay_filter">Tipo de bahía</string>
</resources> </resources>

View file

@ -209,7 +209,7 @@
<string name="traffic_warning_calming">Reductor de velocidad</string> <string name="traffic_warning_calming">Reductor de velocidad</string>
<string name="traffic_warning_speed_camera">Radar de velocidad</string> <string name="traffic_warning_speed_camera">Radar de velocidad</string>
<string name="traffic_warning">Aviso de tráfico</string> <string name="traffic_warning">Aviso de tráfico</string>
<string name="speak_favorites">Favoritos cerca</string> <string name="speak_favorites">Favoritos cercanos</string>
<string name="speak_poi">PDI cercanos</string> <string name="speak_poi">PDI cercanos</string>
<string name="way_alarms">Advertencias de tráfico</string> <string name="way_alarms">Advertencias de tráfico</string>
<string name="stop_navigation_service">Parar</string> <string name="stop_navigation_service">Parar</string>
@ -4054,7 +4054,7 @@
<string name="trip_recording_show_start_dialog_setting">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.</string> <string name="trip_recording_show_start_dialog_setting">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.</string>
<string name="customize_route_line">Personalizar línea de ruta</string> <string name="customize_route_line">Personalizar línea de ruta</string>
<string name="shared_string_route_line">Línea de ruta</string> <string name="shared_string_route_line">Línea de ruta</string>
<string name="route_line_use_map_style_appearance">La línea de la ruta sería el uso %1$s especificado en el estilo de mapa seleccionado: %2$s.</string> <string name="route_line_use_map_style_appearance">La línea de ruta usará el %1$s definido en el estilo de mapa elegido: %2$s.</string>
<string name="specify_color_for_map_mode">Define el color para el modo de mapa: %1$s.</string> <string name="specify_color_for_map_mode">Define el color para el modo de mapa: %1$s.</string>
<string name="no_purchases">No tienes compras</string> <string name="no_purchases">No tienes compras</string>
<string name="new_device_account">Nuevo dispositivo / nueva cuenta</string> <string name="new_device_account">Nuevo dispositivo / nueva cuenta</string>
@ -4083,4 +4083,9 @@
\n \n
\n</string> \n</string>
<string name="update_all_maps_added">¿Actualizar todos los mapas añadidos a %1$s\?</string> <string name="update_all_maps_added">¿Actualizar todos los mapas añadidos a %1$s\?</string>
<string name="exit_number">Número de salida</string>
<string name="announce_when_exceeded">Anunciar al excederse</string>
<string name="user_points">Puntos de usuario</string>
<string name="output">Salida</string>
<string name="map_quick_action_pattern">%1$s → …</string>
</resources> </resources>

View file

@ -3891,4 +3891,39 @@
<string name="poi_gladed_yes">Arbolado: sí</string> <string name="poi_gladed_yes">Arbolado: sí</string>
<string name="poi_piste_name">Nombre de la pista</string> <string name="poi_piste_name">Nombre de la pista</string>
<string name="poi_piste_ski_jump">Salto con esquís</string> <string name="poi_piste_ski_jump">Salto con esquís</string>
<string name="poi_office_diplomatic">Oficina diplomática</string>
<string name="poi_kickboxing">Kickboxing</string>
<string name="poi_horseshoes">Herradura</string>
<string name="poi_fencing">Esgrima</string>
<string name="poi_cycle_polo">Ciclopolo</string>
<string name="poi_curling">Curling</string>
<string name="poi_crossfit">Crossfit</string>
<string name="poi_cockfighting">Pelea de gallos</string>
<string name="poi_cliff_diving">Salto de gran altura</string>
<string name="poi_bullfighting">Toreo</string>
<string name="poi_bobsleigh">Bobsleigh</string>
<string name="poi_biathlon">Biatlón</string>
<string name="poi_aikido">Aikido</string>
<string name="poi_water_ski">Esquí acuático</string>
<string name="poi_water_polo">Waterpolo</string>
<string name="poi_zurkhaneh_sport">Zurkhaneh</string>
<string name="poi_wrestling">Lucha libre</string>
<string name="poi_weightlifting">Halterofilia</string>
<string name="poi_wakeboarding">Wakeboarding</string>
<string name="poi_ultimate">Disco Volador</string>
<string name="poi_taekwondo">Taekwondo</string>
<string name="poi_table_soccer">Futbolín</string>
<string name="poi_sumo">Sumo</string>
<string name="poi_speedway">Pista de carreras</string>
<string name="poi_snooker">Snooker</string>
<string name="poi_shot_put">Lanzamiento de peso</string>
<string name="poi_pilates">Pilates</string>
<string name="poi_jiu_jitsu">Jiu-jitsu</string>
<string name="poi_karate">Kárate</string>
<string name="poi_hoops">Canastas</string>
<string name="poi_camp_pitch">Parcela de acampada</string>
<string name="poi_local_ref">Referencia local</string>
<string name="poi_geodesist">Geodésico</string>
<string name="poi_conference_centre">Centro de conferencia</string>
<string name="poi_bay_filter">Tipo de bahía</string>
</resources> </resources>

View file

@ -4052,7 +4052,7 @@
<string name="trip_recording_show_start_dialog_setting">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.</string> <string name="trip_recording_show_start_dialog_setting">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.</string>
<string name="customize_route_line">Personalizar la línea de ruta</string> <string name="customize_route_line">Personalizar la línea de ruta</string>
<string name="shared_string_route_line">Línea de ruta</string> <string name="shared_string_route_line">Línea de ruta</string>
<string name="route_line_use_map_style_appearance">La línea de ruta sería usar %1$s especificada en el estilo de mapa seleccionado: %2$s.</string> <string name="route_line_use_map_style_appearance">La línea de ruta usará el %1$s definido en el estilo de mapa elegido: %2$s.</string>
<string name="specify_color_for_map_mode">Especifica el color para el modo de mapa: %1$s.</string> <string name="specify_color_for_map_mode">Especifica el color para el modo de mapa: %1$s.</string>
<string name="no_purchases">No tienes compras</string> <string name="no_purchases">No tienes compras</string>
<string name="new_device_account">Nuevo dispositivo / nueva cuenta</string> <string name="new_device_account">Nuevo dispositivo / nueva cuenta</string>

View file

@ -4015,9 +4015,9 @@
<string name="track_recording_title">Enregistrement de la trace arrêté</string> <string name="track_recording_title">Enregistrement de la trace arrêté</string>
<string name="select_segments">Sélectionnez les segments</string> <string name="select_segments">Sélectionnez les segments</string>
<string name="update_frequency">Fréquence de mise à jour</string> <string name="update_frequency">Fréquence de mise à jour</string>
<string name="live_update_frequency_week_variant">Les cartes seront vérifiées chaque semaine. La prochaine vérification de mise à jour s\'effectuera à %1$s dans %2$s.</string> <string name="live_update_frequency_week_variant">Les cartes seront vérifiées chaque semaine. La prochaine vérification de mise à jour s\'effectuera le %1$s dans %2$s.</string>
<string name="live_update_frequency_day_variant">Les cartes seront vérifiées tous les jours. La prochaine vérification de mise à jour s\'effectuera à %1$s dans %2$s.</string> <string name="live_update_frequency_day_variant">Les cartes seront vérifiées tous les jours. La prochaine vérification de mise à jour s\'effectuera le %1$s dans %2$s.</string>
<string name="live_update_frequency_hour_variant">Les cartes seront vérifiées toutes les heures. La prochaine vérification de mise à jour s\'effectuera à %1$s dans %2$s.</string> <string name="live_update_frequency_hour_variant">Les cartes seront vérifiées toutes les heures. La prochaine vérification de mise à jour s\'effectuera le %1$s dans %2$s.</string>
<string name="delete_updates">Supprimer les mises à jour</string> <string name="delete_updates">Supprimer les mises à jour</string>
<string name="purchases">Achats</string> <string name="purchases">Achats</string>
<string name="select_category_descr">Sélectionnez la catégorie ou ajoutez-en une nouvelle</string> <string name="select_category_descr">Sélectionnez la catégorie ou ajoutez-en une nouvelle</string>

View file

@ -3924,4 +3924,6 @@
<string name="poi_pilates">Pilates</string> <string name="poi_pilates">Pilates</string>
<string name="poi_jiu_jitsu">Jiu-jitsu</string> <string name="poi_jiu_jitsu">Jiu-jitsu</string>
<string name="poi_karate">Karate</string> <string name="poi_karate">Karate</string>
<string name="poi_office_diplomatic">Sendiskrifstofa</string>
<string name="poi_bay_filter">Gerð flóa</string>
</resources> </resources>

View file

@ -3853,7 +3853,7 @@
<string name="subscription_on_hold_title">Áskrift að OsmAnd Live er í biðstöðu</string> <string name="subscription_on_hold_title">Áskrift að OsmAnd Live er í biðstöðu</string>
<string name="login_account">Notandaaðgangur</string> <string name="login_account">Notandaaðgangur</string>
<string name="login_open_street_map_org">Skrá inn á OpenStreetMap.org</string> <string name="login_open_street_map_org">Skrá inn á OpenStreetMap.org</string>
<string name="markers_history">Vinnsluferill kortamerkja</string> <string name="markers_history">Ferill kortamerkja</string>
<string name="message_you_need_add_two_points_to_show_graphs">Bættu við a.m.k. tveimur punktum</string> <string name="message_you_need_add_two_points_to_show_graphs">Bættu við a.m.k. tveimur punktum</string>
<string name="navigate_point_mgrs">MGRS</string> <string name="navigate_point_mgrs">MGRS</string>
<string name="subscription_paused_title">Áskrift að OsmAnd Live hefur verið sett í bið</string> <string name="subscription_paused_title">Áskrift að OsmAnd Live hefur verið sett í bið</string>
@ -4086,4 +4086,9 @@
<string name="on_hold">Í bið</string> <string name="on_hold">Í bið</string>
<string name="expired">Útrunnið</string> <string name="expired">Útrunnið</string>
<string name="update_all_maps_added">Uppfæra öll kort sem bætt hefur verið við %1$s\?</string> <string name="update_all_maps_added">Uppfæra öll kort sem bætt hefur verið við %1$s\?</string>
<string name="exit_number">Númer útkeyrslu</string>
<string name="output">Útkeyrsla</string>
<string name="announce_when_exceeded">Tilkynna þegar farið er yfir</string>
<string name="user_points">Punktar notanda</string>
<string name="map_quick_action_pattern">%1$s → …</string>
</resources> </resources>

View file

@ -1303,7 +1303,7 @@
<string name="shared_string_all">Wszystkie</string> <string name="shared_string_all">Wszystkie</string>
<string name="shared_string_waypoints">Punkty trasy</string> <string name="shared_string_waypoints">Punkty trasy</string>
<string name="way_alarms">Ostrzeżenia ruchu drogowego</string> <string name="way_alarms">Ostrzeżenia ruchu drogowego</string>
<string name="speak_favorites">Najbliższe ulubione miejsca</string> <string name="speak_favorites">Ulubione w pobliżu</string>
<string name="speak_poi">Pobliskie użyteczne miejsca</string> <string name="speak_poi">Pobliskie użyteczne miejsca</string>
<string name="save_track_to_gpx_globally_descr">Ogólne rejestrowanie pozycji do pliku GPX można włączyć lub wyłączyć za pomocą widgetu rejestrowania GPX na mapie.</string> <string name="save_track_to_gpx_globally_descr">Ogólne rejestrowanie pozycji do pliku GPX można włączyć lub wyłączyć za pomocą widgetu rejestrowania GPX na mapie.</string>
<string name="save_track_interval_globally">Częstość rejestrowania</string> <string name="save_track_interval_globally">Częstość rejestrowania</string>
@ -3738,7 +3738,7 @@
<string name="layer_gpx_layer">Ślady</string> <string name="layer_gpx_layer">Ślady</string>
<string name="monitoring_control_start">REC</string> <string name="monitoring_control_start">REC</string>
<string name="save_track_to_gpx_globally">Rejestrowanie śladu do pliku GPX</string> <string name="save_track_to_gpx_globally">Rejestrowanie śladu do pliku GPX</string>
<string name="shared_string_gpx_route">Trasa szlaku</string> <string name="shared_string_gpx_route">Śledź trasę</string>
<string name="empty_state_my_tracks">Dodaj pliki śladów</string> <string name="empty_state_my_tracks">Dodaj pliki śladów</string>
<string name="empty_state_my_tracks_desc">Importowanie lub rejestrowanie plików śladu</string> <string name="empty_state_my_tracks_desc">Importowanie lub rejestrowanie plików śladu</string>
<string name="context_menu_item_add_waypoint">Dodaj punkt trasy</string> <string name="context_menu_item_add_waypoint">Dodaj punkt trasy</string>
@ -3989,7 +3989,7 @@
<string name="login_open_place_reviews">Zaloguj się do OpenPlaceReviews</string> <string name="login_open_place_reviews">Zaloguj się do OpenPlaceReviews</string>
<string name="activity_type_water_name">Woda</string> <string name="activity_type_water_name">Woda</string>
<string name="activity_type_winter_name">Zima</string> <string name="activity_type_winter_name">Zima</string>
<string name="activity_type_snowmobile_name">Skuter</string> <string name="activity_type_snowmobile_name">Skuter śnieżny</string>
<string name="activity_type_riding_name">Jazda konna</string> <string name="activity_type_riding_name">Jazda konna</string>
<string name="activity_type_racing_name">Wyścigi</string> <string name="activity_type_racing_name">Wyścigi</string>
<string name="activity_type_mountainbike_name">Kolarstwo górskie</string> <string name="activity_type_mountainbike_name">Kolarstwo górskie</string>
@ -4035,7 +4035,7 @@
<string name="new_device_account">Nowe urządzenie / nowe konto</string> <string name="new_device_account">Nowe urządzenie / nowe konto</string>
<string name="contact_support">Kontakt z pomocą techniczną</string> <string name="contact_support">Kontakt z pomocą techniczną</string>
<string name="troubleshooting">Rozwiązywanie problemów</string> <string name="troubleshooting">Rozwiązywanie problemów</string>
<string name="troubleshooting_description">Jeśli masz jakiekolwiek problemy z zakupami, skorzystaj z tego linku.</string> <string name="troubleshooting_description">Jeśli masz jakiekolwiek problemy z zakupami, kliknij ten link.</string>
<string name="osmand_live">OsmAnd na żywo</string> <string name="osmand_live">OsmAnd na żywo</string>
<string name="annual_subscription">Roczna subskrypcja</string> <string name="annual_subscription">Roczna subskrypcja</string>
<string name="monthly_subscription">Subskrypcja miesięczna</string> <string name="monthly_subscription">Subskrypcja miesięczna</string>
@ -4066,4 +4066,21 @@
\n \n
\n</string> \n</string>
<string name="map_quick_action_pattern">%1$s → …</string> <string name="map_quick_action_pattern">%1$s → …</string>
<string name="edit_online_routing_engine">Edytuj silnik routingu online</string>
<string name="select_segments_description">%1$s zawiera więcej niż jeden segment, musisz wybrać wymagany element nawigacji.</string>
<string name="segments_count">Segment %1$d</string>
<string name="track_recording_save_and_stop">Zapisz i zatrzymaj nagrywanie</string>
<string name="track_recording_title">Zapis ścieżki zatrzymany</string>
<string name="track_recording_description">Czy na pewno chcesz zakończyć nagrywanie\?
\nWszystkie niezapisane dane zostaną utracone.</string>
<string name="on_pause">Pauza</string>
<string name="map_widget_distance_by_tap">Odległość po dotknięciu</string>
<string name="track_recording_will_be_continued">Nagrywanie będzie kontynuowane.</string>
<string name="route_line_use_map_style_appearance">Linia trasy będzie używana %1$s określona w wybranym stylu mapy: %2$s.</string>
<string name="in_grace_period">W okresie karencji</string>
<string name="on_hold">Wstrzymane</string>
<string name="exit_number">Numer wyjścia</string>
<string name="announce_when_exceeded">Ogłoś, gdy zostanie przekroczony</string>
<string name="user_points">Punkty użytkownika</string>
<string name="output">Wyjście</string>
</resources> </resources>

File diff suppressed because it is too large Load diff

View file

@ -140,7 +140,7 @@
<string name="background_router_service_descr">Rastreia a sua posição enquanto o ecrã está desligado.</string> <string name="background_router_service_descr">Rastreia a sua posição enquanto o ecrã está desligado.</string>
<string name="background_router_service">Executar OsmAnd em segundo plano</string> <string name="background_router_service">Executar OsmAnd em segundo plano</string>
<string name="off_router_service_no_gps_available">O serviço em segundo plano necessita aa ativação de um fornecedor da localização.</string> <string name="off_router_service_no_gps_available">O serviço em segundo plano necessita aa ativação de um fornecedor da localização.</string>
<string name="routing_settings_descr">Especifique as opções da rota.</string> <string name="routing_settings_descr">Especifique as opções de navegação.</string>
<string name="routing_settings">Navegação</string> <string name="routing_settings">Navegação</string>
<string name="hide_poi_filter">Ocultar filtro</string> <string name="hide_poi_filter">Ocultar filtro</string>
<string name="show_poi_filter">Mostrar filtro</string> <string name="show_poi_filter">Mostrar filtro</string>
@ -253,7 +253,7 @@
<string name="loading_streets">A carregar ruas…</string> <string name="loading_streets">A carregar ruas…</string>
<string name="loading_cities">A carregar cidades…</string> <string name="loading_cities">A carregar cidades…</string>
<string name="poi">POI</string> <string name="poi">POI</string>
<string name="error_occurred_saving_gpx">Não foi possível gravar o ficheiro GPX.</string> <string name="error_occurred_saving_gpx">Não foi possível guardar o ficheiro GPX.</string>
<string name="error_calculating_route">Não foi possível calcular a rota.</string> <string name="error_calculating_route">Não foi possível calcular a rota.</string>
<string name="error_calculating_route_occured">Não foi possível calcular a rota.</string> <string name="error_calculating_route_occured">Não foi possível calcular a rota.</string>
<string name="empty_route_calculated">A rota calculada está vazia.</string> <string name="empty_route_calculated">A rota calculada está vazia.</string>
@ -319,7 +319,7 @@
<string name="search_POI_level_btn">Encontrar mais</string> <string name="search_POI_level_btn">Encontrar mais</string>
<string name="incremental_search_city">Pesquisa progressiva de cidade. Para encontrar cidades/código postal, insira pelo menos os três primeiros caracteres</string> <string name="incremental_search_city">Pesquisa progressiva de cidade. Para encontrar cidades/código postal, insira pelo menos os três primeiros caracteres</string>
<string name="incremental_search_street">Pesquisa progressiva das ruas</string> <string name="incremental_search_street">Pesquisa progressiva das ruas</string>
<string name="incremental_search_building">Pesquisa progressiva dos edificios</string> <string name="incremental_search_building">Pesquisa progressiva dos edifícios</string>
<string name="choose_available_region">Selecione a região da lista</string> <string name="choose_available_region">Selecione a região da lista</string>
<string name="choose_intersected_street">Selecione a rua transversal</string> <string name="choose_intersected_street">Selecione a rua transversal</string>
<string name="Closest_Amenities">Infraestruturas mais próximas</string> <string name="Closest_Amenities">Infraestruturas mais próximas</string>
@ -483,7 +483,7 @@
<string name="use_fluorescent_overlays">Camada superior fluorescente</string> <string name="use_fluorescent_overlays">Camada superior fluorescente</string>
<string name="use_fluorescent_overlays_descr">Usar cores fluorescentes para mostrar trajetos e rotas.</string> <string name="use_fluorescent_overlays_descr">Usar cores fluorescentes para mostrar trajetos e rotas.</string>
<string name="offline_edition">Edição offline</string> <string name="offline_edition">Edição offline</string>
<string name="offline_edition_descr">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.</string> <string name="offline_edition_descr">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.</string>
<string name="update_poi_does_not_change_indexes">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.</string> <string name="update_poi_does_not_change_indexes">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.</string>
<string name="local_openstreetmap_uploading">A enviar…</string> <string name="local_openstreetmap_uploading">A enviar…</string>
<string name="local_openstreetmap_were_uploaded">{0} POI/notas enviados</string> <string name="local_openstreetmap_were_uploaded">{0} POI/notas enviados</string>
@ -566,9 +566,9 @@
<string name="route_successfully_saved_at">Rota guardada como \'%1$s\'.</string> <string name="route_successfully_saved_at">Rota guardada como \'%1$s\'.</string>
<string name="filename_input">Nome do ficheiro:</string> <string name="filename_input">Nome do ficheiro:</string>
<string name="file_with_name_already_exist">Já existe um ficheiro com o mesmo nome.</string> <string name="file_with_name_already_exist">Já existe um ficheiro com o mesmo nome.</string>
<string name="shared_string_save">Gravar</string> <string name="shared_string_save">Guardar</string>
<string name="local_index_upload_gpx_description">Enviar ficheiros de GPX para a comunidade OSM, para ajudar a melhorar os mapas.</string> <string name="local_index_upload_gpx_description">Enviar ficheiros de GPX para a comunidade OSM, para ajudar a melhorar os mapas.</string>
<string name="local_index_items_uploaded">%1$d de %2$d items enviados.</string> <string name="local_index_items_uploaded">%1$d de %2$d itens enviados.</string>
<string name="local_index_mi_upload_gpx">Enviar para OSM</string> <string name="local_index_mi_upload_gpx">Enviar para OSM</string>
<string name="show_more_map_detail">Ver mais detalhes do mapa</string> <string name="show_more_map_detail">Ver mais detalhes do mapa</string>
<string name="show_more_map_detail_descr">Mostrar detalhes do mapa vetorial (estradas, etc.) já em níveis de zoom mais baixos.</string> <string name="show_more_map_detail_descr">Mostrar detalhes do mapa vetorial (estradas, etc.) já em níveis de zoom mais baixos.</string>
@ -589,7 +589,7 @@
<string name="local_index_items_backuped">%1$d de %2$d item(s) desativados.</string> <string name="local_index_items_backuped">%1$d de %2$d item(s) desativados.</string>
<string name="local_index_items_deleted">%1$d de %2$d item(s) eliminados.</string> <string name="local_index_items_deleted">%1$d de %2$d item(s) eliminados.</string>
<string name="local_index_items_restored">%1$d de %2$d item(s) ativados.</string> <string name="local_index_items_restored">%1$d de %2$d item(s) ativados.</string>
<string name="local_index_no_items_to_do">Sem items para %1$s</string> <string name="local_index_no_items_to_do">Sem itens para %1$s</string>
<string name="local_index_action_do">Está prestes a %1$s %2$s item(s). Continuar\?</string> <string name="local_index_action_do">Está prestes a %1$s %2$s item(s). Continuar\?</string>
<string name="local_index_descr_title">Gerir ficheiros de mapas.</string> <string name="local_index_descr_title">Gerir ficheiros de mapas.</string>
<string name="local_index_mi_restore">Ativar</string> <string name="local_index_mi_restore">Ativar</string>
@ -735,7 +735,7 @@
<string name="route_updated_loc_found">Aguardando posição para calcular a rota</string> <string name="route_updated_loc_found">Aguardando posição para calcular a rota</string>
<string name="continue_follow_previous_route_auto">Continuar a navegação a seguir que ficou antes inacabada\? (%1$s segundos)</string> <string name="continue_follow_previous_route_auto">Continuar a navegação a seguir que ficou antes inacabada\? (%1$s segundos)</string>
<string name="show_cameras">Radares de velocidade</string> <string name="show_cameras">Radares de velocidade</string>
<string name="show_traffic_warnings">Avisos de tráfego</string> <string name="show_traffic_warnings">Informações de circulação</string>
<string name="avoid_toll_roads">Sem estradas com portagem</string> <string name="avoid_toll_roads">Sem estradas com portagem</string>
<string name="map_widget_top_text">Nome da rua</string> <string name="map_widget_top_text">Nome da rua</string>
<string name="map_widget_config">Configuração do ecrã</string> <string name="map_widget_config">Configuração do ecrã</string>
@ -762,7 +762,7 @@
<string name="bg_service_sleep_mode_on">Parar <string name="bg_service_sleep_mode_on">Parar
\na execução em segundo plano</string> \na execução em segundo plano</string>
<string name="show_warnings_title">Mostrar alertas…</string> <string name="show_warnings_title">Mostrar alertas…</string>
<string name="show_warnings_descr">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.</string> <string name="show_warnings_descr">Configure avisos de trânsito (limites de velocidade, portagens, lombas, passadeiras, túneis), radares e a faixa de rodagem.</string>
<string name="avoid_motorway">Sem autoestradas</string> <string name="avoid_motorway">Sem autoestradas</string>
<string name="snap_to_road">Ajustar à estrada</string> <string name="snap_to_road">Ajustar à estrada</string>
<string name="osmand_short_description_80_chars">Visualização e navegação móvel de mapas globais do OSM offline e online</string> <string name="osmand_short_description_80_chars">Visualização e navegação móvel de mapas globais do OSM offline e online</string>
@ -847,7 +847,7 @@
<string name="safe_mode_description">Executar a aplicação no modo de segurança (usando o código do Android mais lento em vez do nativo).</string> <string name="safe_mode_description">Executar a aplicação no modo de segurança (usando o código do Android mais lento em vez do nativo).</string>
<string name="safe_mode">Modo de segurança</string> <string name="safe_mode">Modo de segurança</string>
<string name="native_library_not_running">A aplicação está a ser executada no modo de segurança (desligue-o em \"Configurações\").</string> <string name="native_library_not_running">A aplicação está a ser executada no modo de segurança (desligue-o em \"Configurações\").</string>
<string name="background_service_is_enabled_question">O serviço de segundo plano OsmAnd ainda está em execução. Tambẽm pará-lo\?</string> <string name="background_service_is_enabled_question">O serviço de segundo plano OsmAnd ainda está em execução. Também quer pará-lo\?</string>
<string name="close_changeset">Fechar conjunto de alterações</string> <string name="close_changeset">Fechar conjunto de alterações</string>
<string name="search_villages_and_postcodes">Pesquisar mais povoações/códigos postais</string> <string name="search_villages_and_postcodes">Pesquisar mais povoações/códigos postais</string>
<string name="dropbox_plugin_description">Sincroniza trilhos e notas de vídeo/áudio com a sua conta Dropbox.</string> <string name="dropbox_plugin_description">Sincroniza trilhos e notas de vídeo/áudio com a sua conta Dropbox.</string>
@ -970,11 +970,11 @@
<string name="driving_region_europe_asia">Europa, Ásia, América Latina e similares</string> <string name="driving_region_europe_asia">Europa, Ásia, América Latina e similares</string>
<string name="driving_region_uk">Reino Unido, Índia e similares</string> <string name="driving_region_uk">Reino Unido, Índia e similares</string>
<string name="speak_title">Anunciar…</string> <string name="speak_title">Anunciar…</string>
<string name="speak_descr">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.</string> <string name="speak_descr">Configure as indicações sobre nomes de ruas, avisos de trânsito (portagens, lombas, passadeiras), radares e limites de velocidade.</string>
<string name="speak_street_names">Nomes das ruas (TTS)</string> <string name="speak_street_names">Nomes das ruas (TTS)</string>
<string name="speak_speed_limit">Limite de velocidade</string> <string name="speak_speed_limit">Limite de velocidade</string>
<string name="speak_cameras">Radares de velocidade</string> <string name="speak_cameras">Radares de velocidade</string>
<string name="speak_traffic_warnings">Avisos de tráfego</string> <string name="speak_traffic_warnings">Informações de circulação</string>
<string name="osb_author_or_password_not_specified">Especifique o nome de utilizador e a palavra-passe no OSM em \"Configurações\"</string> <string name="osb_author_or_password_not_specified">Especifique o nome de utilizador e a palavra-passe no OSM em \"Configurações\"</string>
<string name="clear_intermediate_points">Remover destinos intermédios</string> <string name="clear_intermediate_points">Remover destinos intermédios</string>
<string name="keep_intermediate_points">Manter destinos intermédios</string> <string name="keep_intermediate_points">Manter destinos intermédios</string>
@ -1247,7 +1247,7 @@
<string name="traffic_warning">Aviso de tráfego</string> <string name="traffic_warning">Aviso de tráfego</string>
<string name="speak_favorites">Favoritos nas redondezas</string> <string name="speak_favorites">Favoritos nas redondezas</string>
<string name="speak_poi">POIs nas redondezas</string> <string name="speak_poi">POIs nas redondezas</string>
<string name="way_alarms">Avisos de tráfego</string> <string name="way_alarms">Informações de circulação</string>
<string name="sleep_mode_stop_dialog">Parar o GPS quando em segundo plano\?</string> <string name="sleep_mode_stop_dialog">Parar o GPS quando em segundo plano\?</string>
<string name="stop_navigation_service">Parar</string> <string name="stop_navigation_service">Parar</string>
<string name="confirm_every_run">Perguntar sempre</string> <string name="confirm_every_run">Perguntar sempre</string>
@ -1290,7 +1290,7 @@
<string name="download_tab_downloads">Todos os descarregamentos</string> <string name="download_tab_downloads">Todos os descarregamentos</string>
<string name="download_tab_updates">Atualizações</string> <string name="download_tab_updates">Atualizações</string>
<string name="download_tab_local">Local</string> <string name="download_tab_local">Local</string>
<string name="no_internet_connection">Não é possível descarregar, por favor, verifique a sua ligação à Internet.</string> <string name="no_internet_connection">Não é possível descarregar. Verifique se tem ligação à Internet.</string>
<string name="everything_up_to_date">Todos os ficheiros foram atualizados</string> <string name="everything_up_to_date">Todos os ficheiros foram atualizados</string>
<string name="use_opengl_render">Usar o renderizador OpenGL</string> <string name="use_opengl_render">Usar o renderizador OpenGL</string>
<string name="home_button">Início</string> <string name="home_button">Início</string>
@ -1405,7 +1405,7 @@
<string name="plugin_touringview_name">Ver mapa de turismo</string> <string name="plugin_touringview_name">Ver mapa de turismo</string>
<string name="plugin_nautical_name">Ver mapa náutico</string> <string name="plugin_nautical_name">Ver mapa náutico</string>
<string name="plugin_ski_name">Ver mapa de esqui</string> <string name="plugin_ski_name">Ver mapa de esqui</string>
<string name="rename_failed">Renomeação falhou.</string> <string name="rename_failed">A alteração do nome falhou.</string>
<string name="back_to_map">Voltar ao mapa</string> <string name="back_to_map">Voltar ao mapa</string>
<string name="share_note">Partilhar nota</string> <string name="share_note">Partilhar nota</string>
<string name="location_on_map">Posição:\n Lat %1$s\n Lon %2$s</string> <string name="location_on_map">Posição:\n Lat %1$s\n Lon %2$s</string>
@ -1591,7 +1591,7 @@
<string name="lang_ta">Tamil</string> <string name="lang_ta">Tamil</string>
<string name="archive_wikipedia_data">Tem dados guardados da Wikipédia que são antigos e incompatíveis. Quer arquivá-los\?</string> <string name="archive_wikipedia_data">Tem dados guardados da Wikipédia que são antigos e incompatíveis. Quer arquivá-los\?</string>
<string name="download_wikipedia_files">Quer descarregar dados adicionais da Wikipédia (%1$s MB)\?</string> <string name="download_wikipedia_files">Quer descarregar dados adicionais da Wikipédia (%1$s MB)\?</string>
<string name="gps_network_not_enabled">O serviço de localização não está ativado. Ativar\?</string> <string name="gps_network_not_enabled">O serviço de localização não está ativado. Quer ativá-lo\?</string>
<string name="shared_string_import2osmand">Importar para o OsmAnd</string> <string name="shared_string_import2osmand">Importar para o OsmAnd</string>
<string name="read_full_article">Ler o artigo completo (on-line)</string> <string name="read_full_article">Ler o artigo completo (on-line)</string>
<string name="shared_string_wikipedia">Wikipédia</string> <string name="shared_string_wikipedia">Wikipédia</string>
@ -2095,7 +2095,7 @@
<string name="storage_place_description">Armazenamento de dados de OsmAnd (para mapas, ficheiros de trilhos, etc.): %1$s.</string> <string name="storage_place_description">Armazenamento de dados de OsmAnd (para mapas, ficheiros de trilhos, etc.): %1$s.</string>
<string name="give_permission">Conceder permissão</string> <string name="give_permission">Conceder permissão</string>
<string name="allow_access_location">Permitir acesso à localização</string> <string name="allow_access_location">Permitir acesso à localização</string>
<string name="search_my_location">Encontrar a minha posição</string> <string name="search_my_location">Encontrar a minha localização</string>
<string name="update_all_maps_now">Atualizar todos os mapas agora\?</string> <string name="update_all_maps_now">Atualizar todos os mapas agora\?</string>
<string name="clear_tile_data">Eliminar todos os mosaicos</string> <string name="clear_tile_data">Eliminar todos os mosaicos</string>
<string name="routing_attr_short_way_name">Percurso económico</string> <string name="routing_attr_short_way_name">Percurso económico</string>
@ -2153,7 +2153,7 @@
<string name="osm_live_payment_renews_annually">Renova anualmente</string> <string name="osm_live_payment_renews_annually">Renova anualmente</string>
<string name="default_price_currency_format">%1$.2f %2$s</string> <string name="default_price_currency_format">%1$.2f %2$s</string>
<string name="osm_live_payment_header">Frequência do pagamento:</string> <string name="osm_live_payment_header">Frequência do pagamento:</string>
<string name="osm_live_payment_contribute_descr">As doações ajudam a financiar a cartografia do OpenStreetMap.</string> <string name="osm_live_payment_contribute_descr">Os donativos ajudam a financiar a cartografia do OpenStreetMap.</string>
<string name="off_road_render_descr">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.</string> <string name="off_road_render_descr">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.</string>
<string name="nautical_render_descr">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.</string> <string name="nautical_render_descr">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.</string>
<string name="ski_map_render_descr">Para esquiar. Contém pistas de esqui, elevadores, pistas de cross country, etc. Escurece objetos de mapa secundários.</string> <string name="ski_map_render_descr">Para esquiar. Contém pistas de esqui, elevadores, pistas de cross country, etc. Escurece objetos de mapa secundários.</string>
@ -2326,7 +2326,7 @@
<string name="active_markers_descr">Especifique a quantidade de indicadores de orientação.</string> <string name="active_markers_descr">Especifique a quantidade de indicadores de orientação.</string>
<string name="digits_quantity">Número de casas decimais</string> <string name="digits_quantity">Número de casas decimais</string>
<string name="shared_string_right">Direita</string> <string name="shared_string_right">Direita</string>
<string name="shared_string_left">Esqueda</string> <string name="shared_string_left">Esquerda</string>
<string name="show_number_pad">Mostrar teclado numérico</string> <string name="show_number_pad">Mostrar teclado numérico</string>
<string name="shared_string_paste">Colar</string> <string name="shared_string_paste">Colar</string>
<string name="go_to_next_field">Próximo campo</string> <string name="go_to_next_field">Próximo campo</string>
@ -2424,7 +2424,7 @@
\nRepresenta área: %1$s x %2$s</string> \nRepresenta área: %1$s x %2$s</string>
<string name="speed_limit_exceed">Tolerância do limite de velocidade</string> <string name="speed_limit_exceed">Tolerância do limite de velocidade</string>
<string name="speed_limit_exceed_message">Selecione a margem de tolerância de limite de velocidade, acima do qual receberá um aviso de voz.</string> <string name="speed_limit_exceed_message">Selecione a margem de tolerância de limite de velocidade, acima do qual receberá um aviso de voz.</string>
<string name="fav_point_emoticons_message">O nome do favorito foi alterado para %1$s para facilitar gravar corretamente a cadeia de caracteres com emoticons num ficheiro.</string> <string name="fav_point_emoticons_message">O nome do favorito foi alterado para %1$s para facilitar guardar corretamente a cadeia de caracteres com emoticons num ficheiro.</string>
<string name="print_route">Imprimir rota</string> <string name="print_route">Imprimir rota</string>
<string name="fav_point_dublicate">Nome de favorito duplicado</string> <string name="fav_point_dublicate">Nome de favorito duplicado</string>
<string name="fav_point_dublicate_message">O nome do favorito especificado já está a ser utilizado, foi alterado para %1$s para evitar a duplicação.</string> <string name="fav_point_dublicate_message">O nome do favorito especificado já está a ser utilizado, foi alterado para %1$s para evitar a duplicação.</string>
@ -2539,10 +2539,10 @@
\n• Navegação GPS no modo pedestre cria a sua rota usando caminhos para pedestres \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• Enviar e seguir uma rota GPX ou gravar e partilhar a sua própria rota
\n</string> \n</string>
<string name="osmand_extended_description_part7">Contribua para o OpenStretMap <string name="osmand_extended_description_part7">Contribua para o OpenStreetMap
\n • Envie relatórios de erros \n • Envie relatórios de erros
\n • Envie trilhos GPX para o OpenStretMap diretamente da aplicação \n • Envie trilhos GPX para o OpenStreetMap diretamente da aplicação
\n • Adicione POIs e envie-os diretamente para o OpenStretMap (ou mais tarde se estiver desconectado da Internet) \n • Adicione POIs e envie-os diretamente para o OpenStreetMap (ou mais tarde se estiver desconectado da Internet)
\n</string> \n</string>
<string name="osmand_extended_description_part8">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. <string name="osmand_extended_description_part8">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: \n Cobertura de mapa e qualidade aproximada:
@ -2580,9 +2580,9 @@
\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 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 • Veja opcionalmente nomes de lugares em inglês, na língua local ou grafia fonética.
\n</string> \n</string>
<string name="osmand_plus_extended_description_part4">Use dados do OpenStretMap e da Wikipédia <string name="osmand_plus_extended_description_part4">Use dados do OpenStreetMap e da Wikipédia
\n • Informações de alta qualidade dos melhores projetos colaborativos do mundo \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 • POIs da Wikipédia, ótimo para passeios turísticos
\n • Descarregamentos grátis ilimitados, diretamente da aplicação \n • Descarregamentos grátis ilimitados, diretamente da aplicação
\n • Mapas off-line vetoriais compactos e atualizados mensalmente \n • Mapas off-line vetoriais compactos e atualizados mensalmente
@ -2603,10 +2603,10 @@
\n• Visualização de curvas de nível e sombreamento de relevo (com uma extensão adicional)</string> \n• Visualização de curvas de nível e sombreamento de relevo (com uma extensão adicional)</string>
<string name="osmand_plus_extended_description_part7">Contribua diretamente para o OpenStreetMap <string name="osmand_plus_extended_description_part7">Contribua diretamente para o OpenStreetMap
\n • Envie relatórios de erros. \n • Envie relatórios de erros.
\n • Envie trilhos GPX para o OpenStretMap diretamente da aplicação. \n • Envie trilhos GPX para o OpenStreetMap diretamente da aplicação.
\n • Adicione POIs e envie-os diretamente para o OpenStretMap (ou mais tarde se estiver desconectado da Internet). \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 • 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</string> \n</string>
<string name="osmand_plus_extended_description_part8">Cobertura de mapa e qualidade aproximada: <string name="osmand_plus_extended_description_part8">Cobertura de mapa e qualidade aproximada:
\n• Europa Ocidental: **** \n• Europa Ocidental: ****
@ -2718,7 +2718,7 @@
<string name="quick_action_navigation_voice_descr">Um botão para ativar ou desativar a orientação por voz durante a navegação.</string> <string name="quick_action_navigation_voice_descr">Um botão para ativar ou desativar a orientação por voz durante a navegação.</string>
<string name="quick_action_add_parking_descr">Um botão para adicionar um lugar de estacionamento no local do centro do ecrã.</string> <string name="quick_action_add_parking_descr">Um botão para adicionar um lugar de estacionamento no local do centro do ecrã.</string>
<string name="quick_action_interim_dialog">Mostrar uma janela temporal</string> <string name="quick_action_interim_dialog">Mostrar uma janela temporal</string>
<string name="favorite_autofill_toast_text">" gravado em "</string> <string name="favorite_autofill_toast_text">" guardado em "</string>
<string name="favorite_empty_place_name">Local</string> <string name="favorite_empty_place_name">Local</string>
<string name="quick_action_duplicates">O nome da ação rápida foi alterado para %1$s para evitar duplicação.</string> <string name="quick_action_duplicates">O nome da ação rápida foi alterado para %1$s para evitar duplicação.</string>
<string name="quick_action_duplicate">Nome de ação rápida duplicado</string> <string name="quick_action_duplicate">Nome de ação rápida duplicado</string>
@ -2733,7 +2733,7 @@
<string name="quick_action_fav_name_descr">Deixe em branco para automaticamente usar o endereço ou nome de lugar.</string> <string name="quick_action_fav_name_descr">Deixe em branco para automaticamente usar o endereço ou nome de lugar.</string>
<string name="quick_action_bug_descr">Esta mensagem está incluída no campo de comentário.</string> <string name="quick_action_bug_descr">Esta mensagem está incluída no campo de comentário.</string>
<string name="quick_action_bug_message">Mensagem</string> <string name="quick_action_bug_message">Mensagem</string>
<string name="quick_action_category_descr">Categoria na qual gravar o favorito:</string> <string name="quick_action_category_descr">Categoria onde guardar o favorito:</string>
<string name="quick_action_gpx_category_descr">Escolha uma categoria opcional.</string> <string name="quick_action_gpx_category_descr">Escolha uma categoria opcional.</string>
<string name="quick_action_poi_list">Lista de POIs</string> <string name="quick_action_poi_list">Lista de POIs</string>
<string name="quick_action_sh_poi_descr">Adicione uma ou mais categorias de POI para mostrar no mapa.</string> <string name="quick_action_sh_poi_descr">Adicione uma ou mais categorias de POI para mostrar no mapa.</string>
@ -2762,7 +2762,7 @@
<string name="add_waypoint">Adicionar ponto de passagem</string> <string name="add_waypoint">Adicionar ponto de passagem</string>
<string name="add_line">Adicionar linha</string> <string name="add_line">Adicionar linha</string>
<string name="save_gpx_waypoint">Guardar ponto de passagem GPX</string> <string name="save_gpx_waypoint">Guardar ponto de passagem GPX</string>
<string name="save_route_point">Gravar ponto de rota</string> <string name="save_route_point">Guardar ponto de rota</string>
<string name="waypoint_one">Ponto de passagem 1</string> <string name="waypoint_one">Ponto de passagem 1</string>
<string name="route_point_one">Ponto de rota 1</string> <string name="route_point_one">Ponto de rota 1</string>
<string name="empty_state_favourites">Adicionar favoritos</string> <string name="empty_state_favourites">Adicionar favoritos</string>
@ -2975,8 +2975,8 @@
<string name="profile_alert_duplicate_name_title">Nome duplicado</string> <string name="profile_alert_duplicate_name_title">Nome duplicado</string>
<string name="profile_alert_duplicate_name_msg">Já existe um perfil com esse nome</string> <string name="profile_alert_duplicate_name_msg">Já existe um perfil com esse nome</string>
<string name="profile_alert_cant_delete_base">Não pode eliminar perfis base OsmAnd</string> <string name="profile_alert_cant_delete_base">Não pode eliminar perfis base OsmAnd</string>
<string name="profile_alert_need_save_title">Gravar alterações</string> <string name="profile_alert_need_save_title">Guardar alterações</string>
<string name="profile_alert_need_save_msg">Grave primeiro as alterações no perfil</string> <string name="profile_alert_need_save_msg">Guarde primeiro as alterações no perfil</string>
<string name="profile_alert_delete_title">Eliminar perfil</string> <string name="profile_alert_delete_title">Eliminar perfil</string>
<string name="profile_alert_delete_msg">Tem a certeza que quer eliminar o perfil \"%s\"</string> <string name="profile_alert_delete_msg">Tem a certeza que quer eliminar o perfil \"%s\"</string>
<string name="select_base_profile_dialog_title">Selecionar o perfil para começar</string> <string name="select_base_profile_dialog_title">Selecionar o perfil para começar</string>
@ -3093,9 +3093,9 @@
<string name="rendering_attr_tracktype_grade4_name">Maioritariamente macio</string> <string name="rendering_attr_tracktype_grade4_name">Maioritariamente macio</string>
<string name="rendering_attr_tracktype_grade5_name">Macio</string> <string name="rendering_attr_tracktype_grade5_name">Macio</string>
<string name="routeInfo_tracktype_name">Dureza da superfície</string> <string name="routeInfo_tracktype_name">Dureza da superfície</string>
<string name="shared_string_file_is_saved">%s está gravado</string> <string name="shared_string_file_is_saved">%s está guardado</string>
<string name="shared_string_open_track">Abrir trilho</string> <string name="shared_string_open_track">Abrir trilho</string>
<string name="shared_string_track_is_saved">O trilho %s está gravado</string> <string name="shared_string_track_is_saved">O trilho %s está guardado</string>
<string name="rendering_attr_showLez_description">Mostrar zonas de baixas emissões (proibida circulação de veículos poluentes) no mapa. Não afeta o roteamento.</string> <string name="rendering_attr_showLez_description">Mostrar zonas de baixas emissões (proibida circulação de veículos poluentes) no mapa. Não afeta o roteamento.</string>
<string name="rendering_attr_showLez_name">Mostrar zonas de baixas emissões</string> <string name="rendering_attr_showLez_name">Mostrar zonas de baixas emissões</string>
<string name="temporary_conditional_routing">Considerar limitações temporárias</string> <string name="temporary_conditional_routing">Considerar limitações temporárias</string>
@ -3258,7 +3258,7 @@
<string name="rendering_value_white_name">Branco</string> <string name="rendering_value_white_name">Branco</string>
<string name="add_new_profile_q">Adicionar o novo perfil \'%1$s\'\?</string> <string name="add_new_profile_q">Adicionar o novo perfil \'%1$s\'\?</string>
<string name="save_heading">Incluir a direção</string> <string name="save_heading">Incluir a direção</string>
<string name="save_heading_descr">Gravar direção para cada ponto de pista durante a gravação.</string> <string name="save_heading_descr">Guardar direção para cada ponto do trilho durante a gravação.</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string> <string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_comma">%1$s, %2$s</string> <string name="ltr_or_rtl_combine_via_comma">%1$s, %2$s</string>
<string name="personal_category_name">Pessoal</string> <string name="personal_category_name">Pessoal</string>
@ -3289,7 +3289,7 @@
<string name="file_imported_successfully">%1$s importado(s).</string> <string name="file_imported_successfully">%1$s importado(s).</string>
<string name="swap_two_places">Trocar %1$s por %2$s</string> <string name="swap_two_places">Trocar %1$s por %2$s</string>
<string name="route_start_point">Ponto de partida</string> <string name="route_start_point">Ponto de partida</string>
<string name="track_saved">Trilho gravado</string> <string name="track_saved">Trilho guardado</string>
<string name="empty_filename">O nome do ficheiro está vazio</string> <string name="empty_filename">O nome do ficheiro está vazio</string>
<string name="shared_string_revert">Reverter</string> <string name="shared_string_revert">Reverter</string>
<string name="quick_action_directions_from_desc">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.</string> <string name="quick_action_directions_from_desc">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.</string>
@ -3342,10 +3342,10 @@
<string name="recalculate_route_in_deviation">Recalcular rota em caso de desvio</string> <string name="recalculate_route_in_deviation">Recalcular rota em caso de desvio</string>
<string name="select_distance_route_will_recalc">Selecione a distância após a qual o percurso será recalculado.</string> <string name="select_distance_route_will_recalc">Selecione a distância após a qual o percurso será recalculado.</string>
<string name="recalculate_route_distance_promo">A rota será recalculada se a distância da rota até o local atual for maior que o valor selecionado.</string> <string name="recalculate_route_distance_promo">A rota será recalculada se a distância da rota até o local atual for maior que o valor selecionado.</string>
<string name="import_complete_description">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.</string> <string name="import_complete_description">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.</string>
<string name="shared_string_import_complete">Importação terminada</string> <string name="shared_string_import_complete">Importação terminada</string>
<string name="items_added">Itens adicionados</string> <string name="items_added">Itens adicionados</string>
<string name="checking_for_duplicate_description">O OsmAnd verifica %1$s para ver se existem duplicados nos itens existentes na aplicação. <string name="checking_for_duplicate_description">O OsmAnd verifica %1$s para ver se existem duplicados na aplicação.
\n \n
\nPode demorar algum tempo.</string> \nPode demorar algum tempo.</string>
<string name="shared_string_importing">A importar</string> <string name="shared_string_importing">A importar</string>
@ -3717,14 +3717,14 @@
<string name="plan_route_create_new_route">Criar nova rota</string> <string name="plan_route_create_new_route">Criar nova rota</string>
<string name="shared_string_done">Pronto</string> <string name="shared_string_done">Pronto</string>
<string name="overwrite_track">Substituir trilho</string> <string name="overwrite_track">Substituir trilho</string>
<string name="save_as_new_track">Gravar como novo trilho</string> <string name="save_as_new_track">Guardar como novo trilho</string>
<string name="reverse_route">Rota inversa</string> <string name="reverse_route">Rota inversa</string>
<string name="route_between_points_whole_track_button_desc">O trilho inteiro será recalculado a usar o perfil selecionado.</string> <string name="route_between_points_whole_track_button_desc">O trilho inteiro será recalculado a usar o perfil selecionado.</string>
<string name="route_between_points_next_segment_button_desc">Apenas será recalculado o próximo segmento utilizando o perfil selecionado.</string> <string name="route_between_points_next_segment_button_desc">Apenas será recalculado o próximo segmento utilizando o perfil selecionado.</string>
<string name="route_between_points_desc">Escolha como ligar os pontos por uma linha reta ou calcule uma rota entre eles como especificado abaixo.</string> <string name="route_between_points_desc">Escolha como ligar os pontos por uma linha reta ou calcule uma rota entre eles como especificado abaixo.</string>
<string name="whole_track">Trilho inteiro</string> <string name="whole_track">Trilho inteiro</string>
<string name="next_segment">Próximo segmento</string> <string name="next_segment">Próximo segmento</string>
<string name="route_between_points_warning_desc">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.</string> <string name="route_between_points_warning_desc">Em seguida, encaixe o trilho na estrada mais próxima permitida com um dos seus perfis de navegação para usar esta opção.</string>
<string name="threshold_distance">Distância limiar</string> <string name="threshold_distance">Distância limiar</string>
<string name="navigation_profile">Perfil de navegação</string> <string name="navigation_profile">Perfil de navegação</string>
<string name="route_between_points_add_track_desc">Selecione um ficheiro de trilho no qual será adicionado um novo segmento.</string> <string name="route_between_points_add_track_desc">Selecione um ficheiro de trilho no qual será adicionado um novo segmento.</string>
@ -3734,7 +3734,7 @@
<string name="select_another_track">Selecionar outro trilho</string> <string name="select_another_track">Selecionar outro trilho</string>
<string name="navigate_to_track_descr">Navegar da minha posição até ao trilho</string> <string name="navigate_to_track_descr">Navegar da minha posição até ao trilho</string>
<string name="pass_whole_track_descr">Ponto do trilho para navegar</string> <string name="pass_whole_track_descr">Ponto do trilho para navegar</string>
<string name="start_of_the_track">Início da pista</string> <string name="start_of_the_track">Início do trilho</string>
<string name="nearest_point">Ponto mais próximo</string> <string name="nearest_point">Ponto mais próximo</string>
<string name="attach_to_the_roads">Fixar às estradas</string> <string name="attach_to_the_roads">Fixar às estradas</string>
<string name="delete_address">Eliminar endereço</string> <string name="delete_address">Eliminar endereço</string>
@ -3749,13 +3749,13 @@
<string name="in_case_of_reverse_direction">No caso de direção inversa</string> <string name="in_case_of_reverse_direction">No caso de direção inversa</string>
<string name="shared_string_gpx_route">Rota de trilho</string> <string name="shared_string_gpx_route">Rota de trilho</string>
<string name="shared_string_gpx_files">Trilhos</string> <string name="shared_string_gpx_files">Trilhos</string>
<string name="marker_save_as_track">Gravar como ficheiro de trilho</string> <string name="marker_save_as_track">Guardar como ficheiro de trilho</string>
<string name="add_segment_to_the_track">Adicionar a um ficheiro de trilho</string> <string name="add_segment_to_the_track">Adicionar a um ficheiro de trilho</string>
<string name="empty_state_my_tracks_desc">Importar ou gravar ficheiros de trilho</string> <string name="empty_state_my_tracks_desc">Importar ou gravar ficheiros de trilho</string>
<string name="empty_state_my_tracks">Adicionar ficheiros de trilho</string> <string name="empty_state_my_tracks">Adicionar ficheiros de trilho</string>
<string name="quick_action_add_gpx">Adicionar ponto de passagem de trilho</string> <string name="quick_action_add_gpx">Adicionar ponto de passagem de trilho</string>
<string name="show_gpx">Trilhos</string> <string name="show_gpx">Trilhos</string>
<string name="shared_string_save_as_gpx">Gravar como novo ficheiro de trilho</string> <string name="shared_string_save_as_gpx">Guardar como novo ficheiro de trilho</string>
<string name="save_track_to_gpx_globally">Registar o trilho num ficheiro GPX</string> <string name="save_track_to_gpx_globally">Registar o trilho num ficheiro GPX</string>
<string name="layer_gpx_layer">Trilhos</string> <string name="layer_gpx_layer">Trilhos</string>
<string name="context_menu_item_add_waypoint">Adicionar ponto de passagem de trilho</string> <string name="context_menu_item_add_waypoint">Adicionar ponto de passagem de trilho</string>
@ -3772,7 +3772,7 @@
<string name="all_next_segments_will_be_recalc">Todos os segmentos subsequentes serão recalculados a utilizar o perfil selecionado.</string> <string name="all_next_segments_will_be_recalc">Todos os segmentos subsequentes serão recalculados a utilizar o perfil selecionado.</string>
<string name="all_previous_segments_will_be_recalc">Todos os segmentos anteriores serão recalculados a usar o perfil selecionado.</string> <string name="all_previous_segments_will_be_recalc">Todos os segmentos anteriores serão recalculados a usar o perfil selecionado.</string>
<string name="open_saved_track">Abrir trilho guardado</string> <string name="open_saved_track">Abrir trilho guardado</string>
<string name="shared_string_is_saved">está gravado</string> <string name="shared_string_is_saved">está guardado</string>
<string name="one_point_error">Adicione pelo menos dois pontos.</string> <string name="one_point_error">Adicione pelo menos dois pontos.</string>
<string name="shared_string_redo">Refazer</string> <string name="shared_string_redo">Refazer</string>
<string name="simplified_track">Trilho simplificado</string> <string name="simplified_track">Trilho simplificado</string>
@ -3812,14 +3812,14 @@
<string name="development">Desenvolvimento</string> <string name="development">Desenvolvimento</string>
<string name="use_live_public_transport">Dados do OsmAnd Live</string> <string name="use_live_public_transport">Dados do OsmAnd Live</string>
<string name="use_live_routing">Dados do OsmAnd Live</string> <string name="use_live_routing">Dados do OsmAnd Live</string>
<string name="complex_routing_descr">Roteamento em duas fases para a navegação automotiva.</string> <string name="complex_routing_descr">Roteamento em duas fases para a navegação automóvel.</string>
<string name="use_native_pt">Desenvolvimento nativos de transportes públicos</string> <string name="use_native_pt">Desenvolvimento nativos de transportes públicos</string>
<string name="use_native_pt_desc">Mudar para o cálculo de rotas de transportes públicos Java (seguro)</string> <string name="use_native_pt_desc">Mudar para o cálculo de rotas de transportes públicos Java (seguro)</string>
<string name="perform_oauth_authorization_description">Entre com o OAuth para usar os recursos do osmedit</string> <string name="perform_oauth_authorization_description">Inicie sessão com o OAuth para usar os recursos de edição OpenStreetMap</string>
<string name="perform_oauth_authorization">Iniciar sessão com OAuth</string> <string name="perform_oauth_authorization">Iniciar sessão com OAuth</string>
<string name="clear_osm_token">Limpar token do OpenStreetMap OAuth</string> <string name="clear_osm_token">Limpar token do OpenStreetMap OAuth</string>
<string name="osm_edit_logout_success">Saiu</string> <string name="osm_edit_logout_success">Saiu</string>
<string name="file_already_imported">O ficheiro já é importado em OsmAnd</string> <string name="file_already_imported">O ficheiro já foi importado para o OsmAnd</string>
<string name="use_two_phase_routing">Usar algoritmo de roteamento de 2 fases A*</string> <string name="use_two_phase_routing">Usar algoritmo de roteamento de 2 fases A*</string>
<string name="snowmobile_render_descr">Para a condução de motos de neve com estradas e pistas dedicadas.</string> <string name="snowmobile_render_descr">Para a condução de motos de neve com estradas e pistas dedicadas.</string>
<string name="shared_string_graph">Gráfico</string> <string name="shared_string_graph">Gráfico</string>
@ -3856,7 +3856,7 @@
<string name="login_account">Conta</string> <string name="login_account">Conta</string>
<string name="user_login">Utilizador</string> <string name="user_login">Utilizador</string>
<string name="markers_history">Histórico de marcadores</string> <string name="markers_history">Histórico de marcadores</string>
<string name="send_files_to_openstreetmap">Enviar ficherio de GPX ao OpenStreetMap</string> <string name="send_files_to_openstreetmap">Enviar ficheiro de GPX para o OpenStreetMap</string>
<string name="enter_text_separated">Introduza etiquetas separadas por vírgula.</string> <string name="enter_text_separated">Introduza etiquetas separadas por vírgula.</string>
<string name="gpx_upload_public_visibility_descr">\"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.</string> <string name="gpx_upload_public_visibility_descr">\"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.</string>
<string name="gpx_upload_private_visibility_descr">\"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.</string> <string name="gpx_upload_private_visibility_descr">\"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.</string>
@ -3937,7 +3937,7 @@
<string name="hillshade_slope_contour_lines">Sombras de relevo / declives / curvas de nível</string> <string name="hillshade_slope_contour_lines">Sombras de relevo / declives / curvas de nível</string>
<string name="open_place_reviews_plugin_description">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. <string name="open_place_reviews_plugin_description">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 \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 \n
\nPode ler mais em: http://openplacereviews.org</string> \nPode ler mais em: http://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string> <string name="open_place_reviews">OpenPlaceReviews</string>
@ -3946,20 +3946,20 @@
<string name="activity_type_water_name">Água</string> <string name="activity_type_water_name">Água</string>
<string name="activity_type_winter_name">Inverno</string> <string name="activity_type_winter_name">Inverno</string>
<string name="activity_type_snowmobile_name">Moto de neve</string> <string name="activity_type_snowmobile_name">Moto de neve</string>
<string name="activity_type_riding_name">Equitação</string> <string name="activity_type_riding_name">A cavalo</string>
<string name="activity_type_racing_name">Corrida</string> <string name="activity_type_racing_name">Corrida competitiva</string>
<string name="activity_type_mountainbike_name">Bicicleta de montanha</string> <string name="activity_type_mountainbike_name">BTT</string>
<string name="activity_type_cycling_name">Ciclismo</string> <string name="activity_type_cycling_name">Ciclismo</string>
<string name="activity_type_running_name">Correr</string> <string name="activity_type_running_name">Correr</string>
<string name="activity_type_walking_name">Caminhada</string> <string name="activity_type_walking_name">A pé</string>
<string name="activity_type_offroad_name">Fora da estrada</string> <string name="activity_type_offroad_name">Todo o terreno</string>
<string name="activity_type_motorbike_name">Motocicleta</string> <string name="activity_type_motorbike_name">Moto</string>
<string name="activity_type_car_name">Carro</string> <string name="activity_type_car_name">Carro</string>
<string name="add_online_routing_engine">Adicionar motor de roteamento online</string> <string name="add_online_routing_engine">Adicionar motor de roteamento online</string>
<string name="announcement_time_passing">Ao passar</string> <string name="announcement_time_passing">Ao passar</string>
<string name="routing_engine_vehicle_type_cycling_electric">Bicicleta elétrica</string> <string name="routing_engine_vehicle_type_cycling_electric">Bicicleta elétrica</string>
<string name="live_update_frequency_hour_variant">As atualizações ao mapa serão verificadas a todas as horas. Próxima %1$s em %2$s.</string> <string name="live_update_frequency_hour_variant">As atualizações ao mapa serão verificadas a todas as horas. Próxima %1$s em %2$s.</string>
<string name="live_update_delete_updates_msg">Tem a certeza que quer eliminar todas as %s atualizações live\?</string> <string name="live_update_delete_updates_msg">Tem a certeza que quer eliminar todas as %s atualizações OsmAnd Live\?</string>
<string name="release_4_0_beta">• Atualizações OsmAnd Live movidas para \"Descarregamentos &gt; Atualizações\" <string name="release_4_0_beta">• Atualizações OsmAnd Live movidas para \"Descarregamentos &gt; Atualizações\"
\n \n
\n • Os trilhos podem ser agora coloridos conforme a altitude, velocidade e declive. \n • Os trilhos podem ser agora coloridos conforme a altitude, velocidade e declive.
@ -4008,7 +4008,7 @@
<string name="quick_action_coordinates_widget_descr">Um alternador para mostrar ou ocultar um widget de coordenadas no mapa.</string> <string name="quick_action_coordinates_widget_descr">Um alternador para mostrar ou ocultar um widget de coordenadas no mapa.</string>
<string name="live_update_frequency_week_variant">As atualizações do mapa serão verificadas todas as semanas. Próxima %1$s em %2$s.</string> <string name="live_update_frequency_week_variant">As atualizações do mapa serão verificadas todas as semanas. Próxima %1$s em %2$s.</string>
<string name="live_update_frequency_day_variant">As atualizações do mapa serão verificadas todos os dias. Próxima %1$s em %2$s.</string> <string name="live_update_frequency_day_variant">As atualizações do mapa serão verificadas todos os dias. Próxima %1$s em %2$s.</string>
<string name="empty_purchases_description">Se as suas assinaturas não aparecerem aqui, toque em “%1$s” ou contacte a nossa equipa de apoio.</string> <string name="empty_purchases_description">Se as suas compras não aparecerem aqui, toque em “%1$s” ou contacte a nossa equipa de suporte.</string>
<string name="routing_attr_prefer_hiking_routes_description">Preferir rotas de caminhadas</string> <string name="routing_attr_prefer_hiking_routes_description">Preferir rotas de caminhadas</string>
<string name="routing_attr_prefer_hiking_routes_name">Preferir rotas de caminhadas</string> <string name="routing_attr_prefer_hiking_routes_name">Preferir rotas de caminhadas</string>
<string name="routing_engine_vehicle_type_hiking">Caminhada</string> <string name="routing_engine_vehicle_type_hiking">Caminhada</string>
@ -4022,11 +4022,11 @@
<string name="update_frequency">Frequência da atualização</string> <string name="update_frequency">Frequência da atualização</string>
<string name="app_restart_required">Necessário reiniciar a aplicação para aplicar algumas configurações.</string> <string name="app_restart_required">Necessário reiniciar a aplicação para aplicar algumas configurações.</string>
<string name="trip_recording_logging_interval_info">Período de tempo do intervalo de registo em que o OsmAnd perguntará pelos dados da posição atual.</string> <string name="trip_recording_logging_interval_info">Período de tempo do intervalo de registo em que o OsmAnd perguntará pelos dados da posição atual.</string>
<string name="no_purchases">Não tem assinaturas</string> <string name="no_purchases">Não tem compras</string>
<string name="contact_support_description">Se tiver alguma dúvida, contacte-nos em %1$s.</string> <string name="contact_support_description">Se tiver alguma dúvida, contacte-nos em %1$s.</string>
<string name="announcement_time_intervals">Intervalos de tempo e distância</string> <string name="announcement_time_intervals">Intervalos de tempo e distância</string>
<string name="map_widget_distance_by_tap">Distância por toque</string> <string name="map_widget_distance_by_tap">Distância por toque</string>
<string name="contact_support">Contacte o apoio</string> <string name="contact_support">Contacte o suporte</string>
<string name="troubleshooting_description">Por favor siga este link se tiver algum problema com assinaturas.</string> <string name="troubleshooting_description">Por favor siga este link se tiver algum problema com assinaturas.</string>
<string name="update_all_maps_added">Atualizar todos os mapas para %1$s\?</string> <string name="update_all_maps_added">Atualizar todos os mapas para %1$s\?</string>
<string name="routing_attr_short_way_description">Rota mais curta otimizada (mais económica)</string> <string name="routing_attr_short_way_description">Rota mais curta otimizada (mais económica)</string>
@ -4052,7 +4052,7 @@
<string name="track_recording_save_and_stop">Guardar e parar de gravar</string> <string name="track_recording_save_and_stop">Guardar e parar de gravar</string>
<string name="track_recording_title">A gravação do trilho parou</string> <string name="track_recording_title">A gravação do trilho parou</string>
<string name="track_recording_description">Tem a certeza que quer parar de gravar\? <string name="track_recording_description">Tem a certeza que quer parar de gravar\?
\nTodos os dados por gravar serão perdidos.</string> \nTodos os dados por guardar serão perdidos.</string>
<string name="on_pause">Em pausa</string> <string name="on_pause">Em pausa</string>
<string name="delete_updates">Eliminar atualizações</string> <string name="delete_updates">Eliminar atualizações</string>
<string name="purchases">Compras</string> <string name="purchases">Compras</string>
@ -4065,9 +4065,9 @@
<string name="track_has_no_altitude">O trilho não contém dados da altitude.</string> <string name="track_has_no_altitude">O trilho não contém dados da altitude.</string>
<string name="track_has_no_speed">O trilho não contém dados da velocidade.</string> <string name="track_has_no_speed">O trilho não contém dados da velocidade.</string>
<string name="select_another_colorization">Por favor selecione outro tipo de colorização.</string> <string name="select_another_colorization">Por favor selecione outro tipo de colorização.</string>
<string name="trip_recording_save_and_continue">Gravar e continuar</string> <string name="trip_recording_save_and_continue">Guardar e continuar</string>
<string name="lost_data_warning">Todos os dados por gravar serão perdidos.</string> <string name="lost_data_warning">Todos os dados por guardar serão perdidos.</string>
<string name="show_start_dialog">Mostrar janela de confirmação para iniciar</string> <string name="show_start_dialog">Mostrar janela de diálogo ao iniciar</string>
<string name="trip_recording_show_start_dialog_setting">Se desativado, a gravação começará logo a seguir ao tocar no widget ou item do menu, ignorando a janela de confirmação.</string> <string name="trip_recording_show_start_dialog_setting">Se desativado, a gravação começará logo a seguir ao tocar no widget ou item do menu, ignorando a janela de confirmação.</string>
<string name="customize_route_line">Personalizar a linha de itinerário</string> <string name="customize_route_line">Personalizar a linha de itinerário</string>
<string name="shared_string_route_line">Linha de itinerário</string> <string name="shared_string_route_line">Linha de itinerário</string>

View file

@ -2456,7 +2456,7 @@
<string name="mark_passed">Отметить пройденным</string> <string name="mark_passed">Отметить пройденным</string>
<string name="import_track_desc">Файл %1$s не содержит путевых точек, импортировать его как трек?</string> <string name="import_track_desc">Файл %1$s не содержит путевых точек, импортировать его как трек?</string>
<string name="add_track_to_markers_descr">Выберите трек, чтобы добавить в маркеры его точки.</string> <string name="add_track_to_markers_descr">Выберите трек, чтобы добавить в маркеры его точки.</string>
<string name="shared_string_gpx_waypoints">Трек путевых точек</string> <string name="shared_string_gpx_waypoints">Путевые точки трека</string>
<string name="shared_string_right">Направо</string> <string name="shared_string_right">Направо</string>
<string name="shared_string_left">Налево</string> <string name="shared_string_left">Налево</string>
<string name="show_number_pad">Показать цифровую панель</string> <string name="show_number_pad">Показать цифровую панель</string>
@ -3480,7 +3480,7 @@
<string name="select_shape">Выберите форму</string> <string name="select_shape">Выберите форму</string>
<string name="shared_string_circle">Круг</string> <string name="shared_string_circle">Круг</string>
<string name="shared_string_octagon">Восьмиугольник</string> <string name="shared_string_octagon">Восьмиугольник</string>
<string name="accessibility_announce">Сообщение о доступности</string> <string name="accessibility_announce">Объявлять</string>
<string name="monitoring_min_speed_descr_remark">Примечание: проверка скорости &gt; 0: большинство модулей GPS сообщают значение скорости только в том случае, если алгоритм определяет, что вы движетесь, и ничего, если вы не перемещаетесь. Следовательно, использование параметра &gt; 0 в этом фильтре в некотором смысле приводит к обнаружению факта перемещения модуля GPS. Но даже если мы не производим данную фильтрацию во время записи, то всё равно эта функция используется при анализе GPX для определения скорректированного расстояния, то есть значение, отображаемое в этом поле, является расстоянием, записанным во время движения.</string> <string name="monitoring_min_speed_descr_remark">Примечание: проверка скорости &gt; 0: большинство модулей GPS сообщают значение скорости только в том случае, если алгоритм определяет, что вы движетесь, и ничего, если вы не перемещаетесь. Следовательно, использование параметра &gt; 0 в этом фильтре в некотором смысле приводит к обнаружению факта перемещения модуля GPS. Но даже если мы не производим данную фильтрацию во время записи, то всё равно эта функция используется при анализе GPX для определения скорректированного расстояния, то есть значение, отображаемое в этом поле, является расстоянием, записанным во время движения.</string>
<string name="multimedia_rec_split_title">Разделение записи</string> <string name="multimedia_rec_split_title">Разделение записи</string>
<string name="live_monitoring_adress_descr">Укажите веб-адрес со следующими параметрами: lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}.</string> <string name="live_monitoring_adress_descr">Укажите веб-адрес со следующими параметрами: lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}.</string>
@ -3607,7 +3607,7 @@
<string name="unsupported_type_error">Неподдерживаемый тип</string> <string name="unsupported_type_error">Неподдерживаемый тип</string>
<string name="gpx_parse_error">OsmAnd сформировал GPX не совсем правильно, пожалуйста, свяжитесь со службой поддержки для выяснения причин.</string> <string name="gpx_parse_error">OsmAnd сформировал GPX не совсем правильно, пожалуйста, свяжитесь со службой поддержки для выяснения причин.</string>
<string name="turn_screen_on_navigation_instructions_descr">Каждая навигационная инструкция включает экран.</string> <string name="turn_screen_on_navigation_instructions_descr">Каждая навигационная инструкция включает экран.</string>
<string name="turn_screen_on_navigation_instructions">Инструкции по навигации</string> <string name="turn_screen_on_navigation_instructions">Навигационные инструкции</string>
<string name="screen_timeout_descr">Если функция «%1$s» включена, время работы будет зависеть от неё.</string> <string name="screen_timeout_descr">Если функция «%1$s» включена, время работы будет зависеть от неё.</string>
<string name="turn_screen_on_wake_time_descr">Время работы экрана после включения. («%1$s» отключает выключение экрана.)</string> <string name="turn_screen_on_wake_time_descr">Время работы экрана после включения. («%1$s» отключает выключение экрана.)</string>
<string name="turn_screen_on_power_button_descr">Нажатие кнопки питания устройства включит экран с OsmAnd на переднем плане экрана блокировки.</string> <string name="turn_screen_on_power_button_descr">Нажатие кнопки питания устройства включит экран с OsmAnd на переднем плане экрана блокировки.</string>
@ -3702,7 +3702,7 @@
<string name="plan_a_route">Составление маршрута</string> <string name="plan_a_route">Составление маршрута</string>
<string name="gpx_split_interval_none_descr">Выберите способ разбиения: по времени или по расстоянию.</string> <string name="gpx_split_interval_none_descr">Выберите способ разбиения: по времени или по расстоянию.</string>
<string name="gpx_split_interval_descr">Интервал между метками расстояния или времени на треке.</string> <string name="gpx_split_interval_descr">Интервал между метками расстояния или времени на треке.</string>
<string name="shared_string_custom">Заказная</string> <string name="shared_string_custom">Своё знач.</string>
<string name="add_hidden_group_info">Добавленная точка не будет видна на карте, так как выбранная группа скрыта, найти её можно в «%s».</string> <string name="add_hidden_group_info">Добавленная точка не будет видна на карте, так как выбранная группа скрыта, найти её можно в «%s».</string>
<string name="track_show_start_finish_icons">Показывать значки старта и финиша</string> <string name="track_show_start_finish_icons">Показывать значки старта и финиша</string>
<string name="select_track_width">Выберите толщину линии</string> <string name="select_track_width">Выберите толщину линии</string>
@ -4086,4 +4086,5 @@
<string name="user_points">Точки пользователя</string> <string name="user_points">Точки пользователя</string>
<string name="output">Вывод</string> <string name="output">Вывод</string>
<string name="map_quick_action_pattern">%1$s → …</string> <string name="map_quick_action_pattern">%1$s → …</string>
<string name="exit_number">Номер съезда</string>
</resources> </resources>

View file

@ -141,7 +141,7 @@
<string name="download_select_map_types">Diğer haritalar</string> <string name="download_select_map_types">Diğer haritalar</string>
<string name="download_roads_only_item">Sadece yollar</string> <string name="download_roads_only_item">Sadece yollar</string>
<string name="download_srtm_maps">Eş yükselti eğrileri</string> <string name="download_srtm_maps">Eş yükselti eğrileri</string>
<string name="download_regular_maps">Standart Harita</string> <string name="download_regular_maps">Standart harita</string>
<string name="download_roads_only_maps">Yalnızca yolları gösteren harita</string> <string name="download_roads_only_maps">Yalnızca yolları gösteren harita</string>
<string name="rendering_attr_noAdminboundaries_name">Sınırlar</string> <string name="rendering_attr_noAdminboundaries_name">Sınırlar</string>
<string name="rendering_attr_noAdminboundaries_description">Bölgesel sınırların gösterilmesini önle (yönetici seviyesi 5-9).</string> <string name="rendering_attr_noAdminboundaries_description">Bölgesel sınırların gösterilmesini önle (yönetici seviyesi 5-9).</string>
@ -824,7 +824,7 @@
<string name="rotate_map_none_opt">Dönme yok (kuzey her zaman yukarı doğru)</string> <string name="rotate_map_none_opt">Dönme yok (kuzey her zaman yukarı doğru)</string>
<string name="rotate_map_to_bearing_descr">Harita hizalaması:</string> <string name="rotate_map_to_bearing_descr">Harita hizalaması:</string>
<string name="show_route">Güzergah ayrıntıları</string> <string name="show_route">Güzergah ayrıntıları</string>
<string name="shared_string_import">İçe Aktar</string> <string name="shared_string_import">İçe aktar</string>
<string name="error_occurred_loading_gpx">GPX yüklenemedi.</string> <string name="error_occurred_loading_gpx">GPX yüklenemedi.</string>
<string name="none_region_found">Hafıza kartında herhangi bir indirilen harita bulunamadı.</string> <string name="none_region_found">Hafıza kartında herhangi bir indirilen harita bulunamadı.</string>
<string name="poi_namefinder_query_empty">POI bulmak için yazın</string> <string name="poi_namefinder_query_empty">POI bulmak için yazın</string>
@ -939,7 +939,7 @@
<string name="switch_to_vector_map_to_see">Bu konum için çevrim dışı vektör haritası. <string name="switch_to_vector_map_to_see">Bu konum için çevrim dışı vektör haritası.
\n\t \n\t
\n\tKullanmak için \'Menü\' → \'Harita Katmanları\' → \'Harita Kaynağı…\' → \'Çevrim dışı vektör haritalar\'.</string> \n\tKullanmak için \'Menü\' → \'Harita Katmanları\' → \'Harita Kaynağı…\' → \'Çevrim dışı vektör haritalar\'.</string>
<string name="choose_audio_stream">Sesli yönlendirme çıktısı</string> <string name="choose_audio_stream">Sesli yönlendirme çıkışı</string>
<string name="choose_audio_stream_descr">Sesli yönlendirme için hoparlörü seçin.</string> <string name="choose_audio_stream_descr">Sesli yönlendirme için hoparlörü seçin.</string>
<string name="voice_stream_voice_call">Telefon görüşmesi sesi (araç Bluetooth stereolarını kesmek için)</string> <string name="voice_stream_voice_call">Telefon görüşmesi sesi (araç Bluetooth stereolarını kesmek için)</string>
<string name="map_transparency_descr">Temel harita şeffaflığını ayarlayın.</string> <string name="map_transparency_descr">Temel harita şeffaflığını ayarlayın.</string>
@ -1153,7 +1153,7 @@
<string name="plugin_ski_name">Kayak haritası görünümü</string> <string name="plugin_ski_name">Kayak haritası görünümü</string>
<string name="text_size">Yazı boyutu</string> <string name="text_size">Yazı boyutu</string>
<string name="text_size_descr">Haritadaki yazı boyutunu ayarla.</string> <string name="text_size_descr">Haritadaki yazı boyutunu ayarla.</string>
<string name="speak_favorites">Yakınlardaki Sık Kullanılanlar</string> <string name="speak_favorites">Yakındaki sık kullanılanlar</string>
<string name="speak_poi">Yakınlardaki POI</string> <string name="speak_poi">Yakınlardaki POI</string>
<string name="duration">Süre</string> <string name="duration">Süre</string>
<string name="distance">Mesafe</string> <string name="distance">Mesafe</string>
@ -1432,7 +1432,7 @@
<string name="max_level_download_tile">En fazla çevrim içi yakınlaştırma</string> <string name="max_level_download_tile">En fazla çevrim içi yakınlaştırma</string>
<string name="max_level_download_tile_descr">Bunun ötesinde yakınlaştırma seviyeleri için çevrim içi haritalara göz atma.</string> <string name="max_level_download_tile_descr">Bunun ötesinde yakınlaştırma seviyeleri için çevrim içi haritalara göz atma.</string>
<string name="fav_points_edited">En sevdiğim nokta düzenlendi</string> <string name="fav_points_edited">En sevdiğim nokta düzenlendi</string>
<string name="fav_points_not_exist">Sık Kullanılanlara eklenen nokta bulunmuyor</string> <string name="fav_points_not_exist">Sık kullanılanlara eklenen nokta yok</string>
<string name="opening_changeset">Değişiklik listesi açılıyor…</string> <string name="opening_changeset">Değişiklik listesi açılıyor…</string>
<string name="closing_changeset">Değişiklik listesi kapatılıyor…</string> <string name="closing_changeset">Değişiklik listesi kapatılıyor…</string>
<string name="commiting_node">Düğüm işleniyor …</string> <string name="commiting_node">Düğüm işleniyor …</string>
@ -1766,7 +1766,7 @@
<string name="save_track_to_gpx">Navigasyon sırasında rotayı otomatik kaydet</string> <string name="save_track_to_gpx">Navigasyon sırasında rotayı otomatik kaydet</string>
<string name="save_track_to_gpx_descrp">Navigasyon sırasında GPX rotası otomatik olarak rotalar klasörüne kaydedilir.</string> <string name="save_track_to_gpx_descrp">Navigasyon sırasında GPX rotası otomatik olarak rotalar klasörüne kaydedilir.</string>
<string name="save_track_interval_globally">Günlük aralığı</string> <string name="save_track_interval_globally">Günlük aralığı</string>
<string name="save_track_interval">Navigasyon sırasında aralığı Günlüğü</string> <string name="save_track_interval">Navigasyon sırasında kayıt aralığı</string>
<string name="save_track_interval_descr">Navigasyon sırasında izlenen yol kaydı için kayıt aralığını belirtin</string> <string name="save_track_interval_descr">Navigasyon sırasında izlenen yol kaydı için kayıt aralığını belirtin</string>
<string name="voice_provider_descr">Navigasyon için sesli yönlendirme seç.</string> <string name="voice_provider_descr">Navigasyon için sesli yönlendirme seç.</string>
<string name="enable_proxy_title">HTTP proxy\'sini etkinleştir</string> <string name="enable_proxy_title">HTTP proxy\'sini etkinleştir</string>
@ -2000,7 +2000,7 @@
<string name="routing_attr_allow_private_name">Özel-arazi erişimine izin ver</string> <string name="routing_attr_allow_private_name">Özel-arazi erişimine izin ver</string>
<string name="routing_attr_allow_private_description">Özel-arazi alanlarına erişime izin ver.</string> <string name="routing_attr_allow_private_description">Özel-arazi alanlarına erişime izin ver.</string>
<string name="display_zoom_level">Görüntü yakınlaştırma seviyesi: %1$s</string> <string name="display_zoom_level">Görüntü yakınlaştırma seviyesi: %1$s</string>
<string name="favorite_group_name">Grup ismi</string> <string name="favorite_group_name">Grup adı</string>
<string name="change_color">Renk değiştir</string> <string name="change_color">Renk değiştir</string>
<string name="edit_name">Adı düzenle</string> <string name="edit_name">Adı düzenle</string>
<string name="animate_my_location">Kendi pozisyonunu canlandır</string> <string name="animate_my_location">Kendi pozisyonunu canlandır</string>
@ -2304,7 +2304,6 @@
<string name="average_altitude">Ortalama yükseklik</string> <string name="average_altitude">Ortalama yükseklik</string>
<string name="routing_attr_relief_smoothness_factor_name">Yükseklikte dalgalanma seçin</string> <string name="routing_attr_relief_smoothness_factor_name">Yükseklikte dalgalanma seçin</string>
<string name="routing_attr_height_obstacles_name">Yükseklik verisi kullan</string> <string name="routing_attr_height_obstacles_name">Yükseklik verisi kullan</string>
<string name="search_map_hint">Şehir veya bölge</string> <string name="search_map_hint">Şehir veya bölge</string>
<string name="route_roundabout_short">%1$d çıkışa gir ve ilerle</string> <string name="route_roundabout_short">%1$d çıkışa gir ve ilerle</string>
<string name="gpx_no_tracks_title">Henüz yol dosyanız yok</string> <string name="gpx_no_tracks_title">Henüz yol dosyanız yok</string>
@ -4006,4 +4005,86 @@
<string name="activity_type_offroad_name">Arazi</string> <string name="activity_type_offroad_name">Arazi</string>
<string name="activity_type_motorbike_name">Motosiklet</string> <string name="activity_type_motorbike_name">Motosiklet</string>
<string name="activity_type_car_name">Araba</string> <string name="activity_type_car_name">Araba</string>
<string name="select_segments">Bölümleri seç</string>
<string name="select_segments_description">%1$s birden fazla bölüm içeriyor, navigasyon için gerekli kısmı seçmeniz gerekiyor.</string>
<string name="segments_count">Bölüm %1$d</string>
<string name="temporary_conditional_routing_descr">Şu anda haritada etkin olan yol kısıtlamalarını kullan</string>
<string name="routing_attr_short_way_description">Optimize edilmiş daha kısa güzergah (enerji tasarrufu)</string>
<string name="routing_attr_driving_style_description">Daha kısa, daha hızlı veya daha güvenli bir güzergah elde etmek için sürüş amacını seçin</string>
<string name="snap_to_road_descr">Geçerli konum simgesi, geçerli navigasyon güzergahına tutturulacaktır</string>
<string name="map_orientation_threshold_descr">Hız belli bir eşikten düşükse harita görünümünü döndürme</string>
<string name="restart">Yeniden başlat</string>
<string name="shared_strings_all_regions">Tüm bölgeler</string>
<string name="delete_number_files_question">%1$d dosya silinsin mi\?</string>
<string name="track_recording_stop_without_saving">Kaydetmeden durdur</string>
<string name="track_recording_save_and_stop">Kaydet ve kaydı durdur</string>
<string name="track_recording_title">Yol kaydı durduruldu</string>
<string name="track_recording_description">Kaydı durdurmak istediğinizden emin misiniz\?
\nKaydedilmemiş tüm veriler kaybolacak.</string>
<string name="on_pause">Duraklatıldığında</string>
<string name="app_restart_required">Bazı ayarların uygulanması için uygulamanın yeniden başlatılması gerekiyor.</string>
<string name="routing_attr_height_obstacles_description">Yönlendirme, dik yokuşlardan kaçınabilir.</string>
<string name="quick_action_coordinates_widget_descr">Harita üzerinde koordinatlar widget\'ını göstermek veya gizlemek için bir geçiş.</string>
<string name="map_widget_distance_by_tap">Dokunma mesafesi</string>
<string name="latest_openstreetmap_update">En son OpenStreetMap güncellemesi:</string>
<string name="updated">Güncellendi: %s</string>
<string name="last_time_checked">Son denetleme: %s</string>
<string name="update_frequency">Güncelleme sıklığı</string>
<string name="live_update_frequency_week_variant">Harita güncellemeleri her hafta denetlenecek. Bir sonraki: %1$s, %2$s.</string>
<string name="live_update_frequency_day_variant">Harita güncellemeleri her gün denetlenecek. Bir sonraki: %1$s, %2$s.</string>
<string name="live_update_frequency_hour_variant">Harita güncellemeleri her saat denetlenecek. Bir sonraki: %1$s, %2$s.</string>
<string name="delete_updates">Güncellemeleri sil</string>
<string name="live_update_delete_updates_msg">%s canlı güncellemenin hepsini silmek istediğinizden emin misiniz\?</string>
<string name="purchases">Satın almalar</string>
<string name="select_category_descr">Kategori seçin veya yenisini ekleyin</string>
<string name="track_recording_will_be_continued">Kayıt devam edecek.</string>
<string name="copy_poi_name">POI adını kopyala</string>
<string name="quick_action_show_hide_title">Göster/gizle</string>
<string name="shared_string_interval">Aralık</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">Doğa koruma bölgelerini, korunan alanları ve milli park sınırlarını gizleyin</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">Doğa sınırları</string>
<string name="track_has_no_altitude">Yol, yükseklik verileri içermiyor.</string>
<string name="track_has_no_speed">Yol, hız verileri içermiyor.</string>
<string name="select_another_colorization">Lütfen başka bir renklendirme türü seçin.</string>
<string name="trip_recording_logging_interval_info">Kayıt aralığı, OsmAnd\'ın geçerli konum verilerini isteyeceği zaman aralığını ayarlar.</string>
<string name="trip_recording_save_and_continue">Kaydet ve devam et</string>
<string name="lost_data_warning">Kaydedilmemiş tüm veriler kaybolacak.</string>
<string name="show_start_dialog">Başlat iletişim kutusunu göster</string>
<string name="trip_recording_show_start_dialog_setting">Devre dışı bırakılırsa onay diyaloğu atlanarak, widget veya menü ögesine dokunduktan hemen sonra kayıt başlayacaktır.</string>
<string name="customize_route_line">Güzergah hattını özelleştir</string>
<string name="shared_string_route_line">Güzergah hattı</string>
<string name="route_line_use_map_style_appearance">Güzergah hattı, seçilen harita tarzında belirtilen %1$s seçeneğini kullanacaktır: %2$s.</string>
<string name="specify_color_for_map_mode">Harita modu için renk belirt: %1$s.</string>
<string name="no_purchases">Herhangi bir satın alma işleminiz yok</string>
<string name="new_device_account">Yeni aygıt / yeni hesap</string>
<string name="contact_support_description">Herhangi bir sorunuz varsa, lütfen %1$s üzerinden bizimle iletişime geçin.</string>
<string name="empty_purchases_description">Satın almalarınız burada görünmezse, “%1$s” seçeneğine dokunun veya destek ekibimizle iletişime geçin.</string>
<string name="contact_support">Destek hattına başvurun</string>
<string name="troubleshooting">Sorun giderme</string>
<string name="troubleshooting_description">Satın alma işlemleriyle ilgili herhangi bir sorununuz varsa lütfen bu bağlantıyı takip edin.</string>
<string name="osmand_live">OsmAnd Live</string>
<string name="annual_subscription">Yıllık abonelik</string>
<string name="monthly_subscription">Aylık abonelik</string>
<string name="three_months_subscription">Üç aylık abonelik</string>
<string name="next_billing_date">Sonraki faturalandırma tarihi: %1$s</string>
<string name="osmand_live_cancelled">İptal edildi</string>
<string name="renew_subscription">Aboneliği yenile</string>
<string name="in_grace_period">Ek süre içinde</string>
<string name="on_hold">Beklemede</string>
<string name="expired">Süresi doldu</string>
<string name="release_4_0_beta">• OsmAnd Live güncellemeleri \"İndirmeler&gt; 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</string>
<string name="update_all_maps_added">%1$s için eklenen tüm haritalar güncellensin mi\?</string>
<string name="exit_number">Çıkış numarası</string>
<string name="announce_when_exceeded">ıldığında duyur</string>
<string name="user_points">Kullanıcı puanları</string>
<string name="output">Çıkış</string>
<string name="map_quick_action_pattern">%1$s → …</string>
</resources> </resources>

View file

@ -124,7 +124,7 @@ public class MapActivityKeyListener implements KeyEvent.Callback {
if (keyCode == KeyEvent.KEYCODE_MINUS) { if (keyCode == KeyEvent.KEYCODE_MINUS) {
mapActivity.changeZoom(-1); mapActivity.changeZoom(-1);
return true; return true;
} else if (keyCode == KeyEvent.KEYCODE_PLUS) { } else if (keyCode == KeyEvent.KEYCODE_PLUS || keyCode == KeyEvent.KEYCODE_EQUALS) {
mapActivity.changeZoom(1); mapActivity.changeZoom(1);
return true; return true;
} }

View file

@ -110,7 +110,7 @@ public abstract class SwitchableAction<T> extends QuickAction {
String item = getSelectedItem(application); String item = getSelectedItem(application);
String arrowDirection = isLayoutRtl(application) ? "\u25c0" : "\u25b6"; 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 @Override

View file

@ -11,6 +11,7 @@ import android.widget.TextView;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities.Elevation;
import net.osmand.GPXUtilities.GPXTrackAnalysis; import net.osmand.GPXUtilities.GPXTrackAnalysis;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
import net.osmand.plus.R; import net.osmand.plus.R;
@ -92,7 +93,15 @@ public class TrackColoringCard extends BaseCard {
if (scaleType == GradientScaleType.SPEED) { if (scaleType == GradientScaleType.SPEED) {
return gpxTrackAnalysis.isSpeedSpecified(); return gpxTrackAnalysis.isSpeedSpecified();
} else { } else {
return gpxTrackAnalysis.isElevationSpecified(); if (!gpxTrackAnalysis.isElevationSpecified()) {
return false;
}
for (Elevation elevation : gpxTrackAnalysis.elevationData) {
if (Float.isNaN(elevation.elevation)) {
return false;
}
}
return true;
} }
} }

View file

@ -380,46 +380,11 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
} }
private void updateHeader() { private void updateHeader() {
if (menuType == TrackMenuType.OVERVIEW) { updateHeaderCard();
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; boolean isOptions = menuType == TrackMenuType.OPTIONS;
setHeaderTitle(isOptions ? app.getString(menuType.titleId) : gpxTitle, !isOptions); setHeaderTitle(isOptions ? app.getString(menuType.titleId) : gpxTitle, !isOptions);
}
if (menuType == TrackMenuType.POINTS) { if (menuType == TrackMenuType.POINTS) {
AndroidUiHelper.updateVisibility(searchButton, true); AndroidUiHelper.updateVisibility(searchButton, true);
} else { } 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() { private void setupToolbar() {
toolbarTextView.setText(gpxTitle); toolbarTextView.setText(gpxTitle);

View file

@ -14,6 +14,7 @@ import net.osmand.data.RotatedTileBox;
import net.osmand.plus.track.GradientScaleType; import net.osmand.plus.track.GradientScaleType;
import net.osmand.plus.views.layers.geometry.GpxGeometryWay; import net.osmand.plus.views.layers.geometry.GpxGeometryWay;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -28,7 +29,6 @@ import java.util.concurrent.atomic.AtomicInteger;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
public class Renderable { public class Renderable {
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
@ -61,7 +61,6 @@ public class Renderable {
public List<WptPt> points = null; // Original list of points public List<WptPt> points = null; // Original list of points
protected List<WptPt> culled = new ArrayList<>(); // Reduced/resampled list of points protected List<WptPt> culled = new ArrayList<>(); // Reduced/resampled list of points
protected List<WptPt> oldCulled = new ArrayList<>();
protected int pointSize; protected int pointSize;
protected double segmentSize; protected double segmentSize;
@ -89,6 +88,9 @@ public class Renderable {
} }
paint.setColor(p.getColor()); paint.setColor(p.getColor());
paint.setStrokeWidth(p.getStrokeWidth()); paint.setStrokeWidth(p.getStrokeWidth());
if (scaleType != null) {
paint.setAlpha(0xFF);
}
} }
public void setBorderPaint(@NonNull Paint paint) { public void setBorderPaint(@NonNull Paint paint) {
@ -117,20 +119,19 @@ public class Renderable {
updateLocalPaint(p); updateLocalPaint(p);
canvas.rotate(-tileBox.getRotate(), tileBox.getCenterPixelX(), tileBox.getCenterPixelY()); canvas.rotate(-tileBox.getRotate(), tileBox.getCenterPixelX(), tileBox.getCenterPixelY());
if (scaleType != null) { if (scaleType != null) {
drawGradient(getPointsForDrawingWithBorder(), p, canvas, tileBox); drawSolid(points, borderPaint, canvas, tileBox);
drawGradient(points, paint, canvas, tileBox);
} else { } else {
drawSolid(getPointsForDrawing(), p, canvas, tileBox); drawSolid(getPointsForDrawing(), paint, canvas, tileBox);
} }
canvas.rotate(tileBox.getRotate(), tileBox.getCenterPixelX(), tileBox.getCenterPixelY()); canvas.rotate(tileBox.getRotate(), tileBox.getCenterPixelX(), tileBox.getCenterPixelY());
} }
public void drawSegment(double zoom, Paint p, Canvas canvas, RotatedTileBox tileBox) { public void drawSegment(double zoom, Paint p, Canvas canvas, RotatedTileBox tileBox) {
if (QuadRect.trivialOverlap(tileBox.getLatLonBounds(), trackBounds)) { // is visible? if (QuadRect.trivialOverlap(tileBox.getLatLonBounds(), trackBounds)) { // is visible?
if (tileBox.getZoomAnimation() > 0 && !Algorithms.isEmpty(culled) && scaleType != null) { if (scaleType == null) {
oldCulled = new ArrayList<>(culled);
}
startCuller(zoom); startCuller(zoom);
}
drawSingleSegment(zoom, p, canvas, tileBox); drawSingleSegment(zoom, p, canvas, tileBox);
} }
} }
@ -143,16 +144,6 @@ public class Renderable {
return culled.isEmpty() ? points : culled; return culled.isEmpty() ? points : culled;
} }
public List<WptPt> 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) { public void drawGeometry(Canvas canvas, RotatedTileBox tileBox, QuadRect quadRect, int arrowColor, int trackColor, float trackWidth) {
if (geometryWay != null) { if (geometryWay != null) {
List<WptPt> points = getPointsForDrawing(); List<WptPt> points = getPointsForDrawing();
@ -177,7 +168,7 @@ public class Renderable {
float lastX = tileBox.getPixXFromLatLon(lastPt.lat, lastPt.lon); float lastX = tileBox.getPixXFromLatLon(lastPt.lat, lastPt.lon);
float lastY = tileBox.getPixYFromLatLon(lastPt.lat, lastPt.lon); float lastY = tileBox.getPixYFromLatLon(lastPt.lat, lastPt.lon);
if (!path.isEmpty()) { if (!path.isEmpty()) {
canvas.drawPath(path, paint); canvas.drawPath(path, p);
} }
path.reset(); path.reset();
path.moveTo(lastX, lastY); path.moveTo(lastX, lastY);
@ -191,58 +182,99 @@ public class Renderable {
lastPt = pt; lastPt = pt;
} }
if (!path.isEmpty()) { if (!path.isEmpty()) {
canvas.drawPath(path, paint); canvas.drawPath(path, p);
} }
} }
protected void drawGradient(List<WptPt> pts, Paint p, Canvas canvas, RotatedTileBox tileBox) { protected void drawGradient(List<WptPt> pts, Paint p, Canvas canvas, RotatedTileBox tileBox) {
QuadRect tileBounds = tileBox.getLatLonBounds(); QuadRect tileBounds = tileBox.getLatLonBounds();
Path currentPath = new Path(); Path path = new Path();
Path nextPath = new Path(); boolean recalculateLastXY = true;
Paint paint = new Paint(this.paint); WptPt lastPt = pts.get(0);
WptPt prevWpt = pts.get(0); List<PointF> gradientPoints = new ArrayList<>();
WptPt currWpt = pts.get(1); List<Integer> gradientColors = new ArrayList<>();
float gradientAngle = 0;
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);
}
for (int i = 1; i < pts.size(); i++) { for (int i = 1; i < pts.size(); i++) {
currWpt = pts.get(i); WptPt pt = pts.get(i);
WptPt nextWpt = i + 1 == pts.size() ? null : pts.get(i + 1); 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); gradientPoints.clear();
if (nextWpt != null && nextLineVisible) { gradientColors.clear();
pixXYFromWptPt(tileBox, currXY, currWpt); gradientPoints.add(new PointF(lastX, lastY));
pixXYFromWptPt(tileBox, nextXY, nextWpt); gradientColors.add(lastPt.getColor(scaleType.toColorizationType()));
canvas.drawPath(pathFromStartEnd(nextPath, currXY, nextXY), borderPaint); }
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;
}
lastPt = pt;
}
if (!path.isEmpty()) {
p.setShader(createGradient(gradientPoints, gradientColors));
canvas.drawPath(path, p);
}
} }
if (currLineVisible) { private LinearGradient createGradient(List<PointF> gradientPoints, List<Integer> gradientColors) {
int prevColor = prevWpt.getColor(scaleType.toColorizationType()); float gradientLength = 0;
int currentColor = currWpt.getColor(scaleType.toColorizationType()); List<Float> pointsLength = new ArrayList<>(gradientPoints.size() - 1);
LinearGradient gradient = new LinearGradient(prevXY.x, prevXY.y, currXY.x, currXY.y, for (int i = 1; i < gradientPoints.size(); i++) {
prevColor, currentColor, Shader.TileMode.CLAMP); PointF start = gradientPoints.get(i - 1);
paint.setShader(gradient); PointF end = gradientPoints.get(i);
canvas.drawPath(currentPath, paint); pointsLength.add((float) MapUtils.getSqrtDistance(start.x, start.y, end.x, end.y));
gradientLength += pointsLength.get(i - 1);
} }
prevWpt = currWpt; float[] positions = new float[gradientPoints.size()];
currentPath.set(nextPath); positions[0] = 0;
prevXY.set(currXY); for (int i = 1; i < gradientPoints.size(); i++) {
currXY.set(nextXY); positions[i] = positions[i - 1] + pointsLength.get(i - 1) / gradientLength;
currLineVisible = nextLineVisible;
} }
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) { 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 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; && 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 { public static class StandardTrack extends RenderableSegment {

View file

@ -69,6 +69,8 @@ import net.osmand.render.RenderingRuleProperty;
import net.osmand.render.RenderingRuleSearchRequest; import net.osmand.render.RenderingRuleSearchRequest;
import net.osmand.render.RenderingRulesStorage; import net.osmand.render.RenderingRulesStorage;
import net.osmand.router.RouteColorize; 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.Algorithms;
import net.osmand.util.MapUtils; import net.osmand.util.MapUtils;
@ -117,6 +119,8 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
private MapMarkersHelper mapMarkersHelper; private MapMarkersHelper mapMarkersHelper;
private GpxSelectionHelper selectedGpxHelper; private GpxSelectionHelper selectedGpxHelper;
private final Map<String, CachedTrack> segmentsCache = new HashMap<>();
private List<WptPt> cache = new ArrayList<>(); private List<WptPt> cache = new ArrayList<>();
private Map<WptPt, SelectedGpxFile> pointFileMap = new HashMap<>(); private Map<WptPt, SelectedGpxFile> pointFileMap = new HashMap<>();
private MapTextLayer textLayer; private MapTextLayer textLayer;
@ -459,7 +463,10 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
float trackWidth = getTrackWidth(width, defaultTrackWidth); float trackWidth = getTrackWidth(width, defaultTrackWidth);
int trackColor = getTrackColor(selectedGpxFile.getGpxFile(), cachedColor); int trackColor = getTrackColor(selectedGpxFile.getGpxFile(), cachedColor);
int arrowColor = UiUtilities.getContrastColor(view.getApplication(), trackColor, false); int arrowColor = UiUtilities.getContrastColor(view.getApplication(), trackColor, false);
for (TrkSegment segment : selectedGpxFile.getPointsToDisplay()) { GradientScaleType scaleType = getGradientScaleType(selectedGpxFile.getGpxFile());
List<TrkSegment> segments = scaleType != null ?
getCachedSegments(selectedGpxFile, scaleType) : selectedGpxFile.getPointsToDisplay();
for (TrkSegment segment : segments) {
if (segment.renderer instanceof Renderable.RenderableSegment) { if (segment.renderer instanceof Renderable.RenderableSegment) {
((Renderable.RenderableSegment) segment.renderer) ((Renderable.RenderableSegment) segment.renderer)
.drawGeometry(canvas, tileBox, correctedQuadRect, arrowColor, trackColor, trackWidth); .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, private void drawSelectedFileSegments(SelectedGpxFile selectedGpxFile, boolean currentTrack, Canvas canvas,
RotatedTileBox tileBox, DrawSettings settings) { RotatedTileBox tileBox, DrawSettings settings) {
OsmandApplication app = view.getApplication(); boolean visible = QuadRect.trivialOverlap(tileBox.getLatLonBounds(), GPXUtilities.calculateTrackBounds(selectedGpxFile.getPointsToDisplay()));
GPXFile gpxFile = selectedGpxFile.getGpxFile(); if (!selectedGpxFile.getGpxFile().hasTrkPt() || !visible) {
List<TrkSegment> segments = selectedGpxFile.getPointsToDisplay(); return;
GradientScaleType scaleType = getGradientScaleType(gpxFile); }
List<RouteColorize.RouteColorizationPoint> colorsOfPoints = null;
GPXFile gpxFile = selectedGpxFile.getGpxFile();
if (needCalculatePointsColors(segments, scaleType)) { GradientScaleType scaleType = getGradientScaleType(gpxFile);
RouteColorize colorize = new RouteColorize(view.getZoom(), gpxFile, selectedGpxFile.getTrackAnalysis(app), List<TrkSegment> segments = new ArrayList<>();
scaleType.toColorizationType(), app.getSettings().getApplicationMode().getMaxSpeed());
colorize.setPalette(getColorizationPalette(gpxFile, scaleType)); if (scaleType == null) {
colorsOfPoints = colorize.getResult(false); segments.addAll(selectedGpxFile.getPointsToDisplay());
} else {
segments.addAll(getCachedSegments(selectedGpxFile, scaleType));
} }
int startIdx = 0;
for (TrkSegment ts : segments) { for (TrkSegment ts : segments) {
String width = getTrackWidthName(gpxFile, defaultTrackWidthPref.get()); String width = getTrackWidthName(gpxFile, defaultTrackWidthPref.get());
int color = getTrackColor(gpxFile, ts.getColor(cachedColor)); int color = getTrackColor(gpxFile, ts.getColor(cachedColor));
if (colorsOfPoints != null) {
startIdx = setColorsToPoints(ts, colorsOfPoints, scaleType, startIdx);
}
if (ts.renderer == null && !ts.points.isEmpty()) { if (ts.renderer == null && !ts.points.isEmpty()) {
Renderable.RenderableSegment renderer; Renderable.RenderableSegment renderer;
if (currentTrack) { if (currentTrack) {
@ -721,53 +726,16 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
} }
} }
private boolean needCalculatePointsColors(List<TrkSegment> segments, GradientScaleType scaleType) { private List<TrkSegment> getCachedSegments(SelectedGpxFile selectedGpxFile, GradientScaleType scaleType) {
if (scaleType == null) { GPXFile gpxFile = selectedGpxFile.getGpxFile();
return false; 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(); return cachedTrack.getCachedSegments(selectedGpxFile, view.getZoom(), scaleType, getColorizationPalette(gpxFile, scaleType));
for (int segIdx = segments.size() - 1; segIdx >= 0; segIdx--) {
List<WptPt> 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<RouteColorize.RouteColorizationPoint> 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;
} }
private float getTrackWidth(String width, float defaultTrackWidth) { private float getTrackWidth(String width, float defaultTrackWidth) {
@ -1150,9 +1118,9 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
if (!Algorithms.isEmpty(trackPoints)) { if (!Algorithms.isEmpty(trackPoints)) {
MapActivity mapActivity = (MapActivity) view.getContext(); MapActivity mapActivity = (MapActivity) view.getContext();
SelectedGpxPoint selectedGpxPoint = (SelectedGpxPoint) trackPoints.get(0); SelectedGpxPoint selectedGpxPoint = (SelectedGpxPoint) trackPoints.get(0);
WptPt wptPt = selectedGpxPoint.getSelectedPoint(); LatLon latLon = tileBox.getLatLonFromPixel(point.x, point.y);
PointDescription description = getObjectName(selectedGpxPoint); PointDescription description = getObjectName(selectedGpxPoint);
mapActivity.getContextMenu().show(new LatLon(wptPt.lat, wptPt.lon), description, selectedGpxPoint); mapActivity.getContextMenu().show(latLon, description, selectedGpxPoint);
return true; return true;
} }
} }
@ -1247,4 +1215,76 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
view.getApplication().getItineraryHelper().runSynchronization(group); view.getApplication().getItineraryHelper().runSynchronization(group);
} }
} }
private static class CachedTrack {
private OsmandApplication app;
private long modifiedTime;
private final Map<String, List<TrkSegment>> cache = new HashMap<>();
public CachedTrack(@NonNull OsmandApplication app, long modifiedTime) {
this.app = app;
this.modifiedTime = modifiedTime;
}
public List<TrkSegment> 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<TrkSegment> 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<TrkSegment> segments = calculateGradientTrack(selectedGpxFile, zoom, scaleType, gradientPalette);
cache.put(trackId, segments);
return segments;
}
}
private List<TrkSegment> 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<RouteColorizationPoint> colorsOfPoints = colorize.getResult(true);
return createSimplifiedSegments(selectedGpxFile.getGpxFile(), colorsOfPoints, scaleType);
}
private List<TrkSegment> createSimplifiedSegments(GPXFile gpxFile,
List<RouteColorizationPoint> colorizationPoints,
GradientScaleType scaleType) {
List<TrkSegment> 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;
}
}
} }

View file

@ -246,24 +246,17 @@ public class WikivoyageArticleDialogFragment extends WikiArticleBaseDialogFragme
private void updateSaveButton() { private void updateSaveButton() {
if (article != null) { if (article != null) {
final TravelLocalDataHelper helper = getMyApplication().getTravelHelper().getBookmarksHelper(); final TravelHelper helper = getMyApplication().getTravelHelper();
final boolean saved = helper.isArticleSaved(article); final boolean saved = helper.getBookmarksHelper().isArticleSaved(article);
Drawable icon = getActiveIcon(saved ? R.drawable.ic_action_read_later_fill : R.drawable.ic_action_read_later); 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.setText(getString(saved ? R.string.shared_string_remove : R.string.shared_string_bookmark));
saveBtn.setCompoundDrawablesWithIntrinsicBounds(null, null, icon, null); saveBtn.setCompoundDrawablesWithIntrinsicBounds(null, null, icon, null);
saveBtn.setOnClickListener(new View.OnClickListener() { saveBtn.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
if (article != null) { helper.saveOrRemoveArticle(article, !saved);
if (saved) {
helper.removeArticleFromSaved(article);
} else {
getMyApplication().getTravelHelper().createGpxFile(article);
helper.addArticleToSaved(article);
}
updateSaveButton(); updateSaveButton();
} }
}
}); });
} }
} }

View file

@ -193,6 +193,15 @@ public class TravelDbHelper implements TravelHelper {
return WORLD_WIKIVOYAGE_FILE_NAME; 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<File> getExistingTravelBooks() { public List<File> getExistingTravelBooks() {
return existingTravelBooks; return existingTravelBooks;
} }

View file

@ -70,4 +70,6 @@ public interface TravelHelper {
String getSelectedTravelBookName(); String getSelectedTravelBookName();
String getWikivoyageFileName(); String getWikivoyageFileName();
void saveOrRemoveArticle(@NonNull TravelArticle article, boolean save);
} }

View file

@ -4,11 +4,13 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import net.osmand.GPXUtilities; import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.IndexConstants; import net.osmand.IndexConstants;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection; import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; import net.osmand.plus.api.SQLiteAPI.SQLiteCursor;
import net.osmand.plus.wikivoyage.data.TravelHelper.GpxReadCallback;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log; 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) { public void removeArticleFromSaved(@NonNull TravelArticle article) {
TravelArticle savedArticle = getArticle(article.title, article.lang); TravelArticle savedArticle = getArticle(article.title, article.lang);
if (savedArticle != null) { if (savedArticle != null) {
@ -305,7 +299,7 @@ public class TravelLocalDataHelper {
conn.execSQL("ALTER TABLE " + BOOKMARKS_TABLE_NAME + " ADD " + BOOKMARKS_COL_TRAVEL_BOOK + " TEXT"); conn.execSQL("ALTER TABLE " + BOOKMARKS_TABLE_NAME + " ADD " + BOOKMARKS_COL_TRAVEL_BOOK + " TEXT");
String selectedTravelBookName = context.getTravelHelper().getSelectedTravelBookName(); String selectedTravelBookName = context.getTravelHelper().getSelectedTravelBookName();
if (selectedTravelBookName != null) { 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 " + HISTORY_TABLE_NAME + " SET " + HISTORY_COL_TRAVEL_BOOK + " = ?", args);
conn.execSQL("UPDATE " + BOOKMARKS_TABLE_NAME + " SET " + BOOKMARKS_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 + ", " 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_LANG + ", " + HISTORY_COL_IS_PART_OF + ", " + HISTORY_COL_LAST_ACCESSED
+ ", " + HISTORY_COL_TRAVEL_BOOK + ") VALUES (?, ?, ?, ?, ?)", new Object[] { + ", " + 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 { } finally {
conn.close(); conn.close();
} }
@ -389,7 +383,7 @@ public class TravelLocalDataHelper {
"WHERE " + HISTORY_COL_ARTICLE_TITLE + " = ? " + "WHERE " + HISTORY_COL_ARTICLE_TITLE + " = ? " +
" AND " + HISTORY_COL_LANG + " = ?" + " AND " + HISTORY_COL_LANG + " = ?" +
" AND " + HISTORY_COL_TRAVEL_BOOK + " = ?", " AND " + HISTORY_COL_TRAVEL_BOOK + " = ?",
new Object[]{item.isPartOf, item.lastAccessed, new Object[] {item.isPartOf, item.lastAccessed,
item.articleTitle, item.lang, travelBook}); item.articleTitle, item.lang, travelBook});
} finally { } finally {
conn.close(); conn.close();
@ -406,10 +400,10 @@ public class TravelLocalDataHelper {
if (conn != null) { if (conn != null) {
try { try {
conn.execSQL("DELETE FROM " + HISTORY_TABLE_NAME + conn.execSQL("DELETE FROM " + HISTORY_TABLE_NAME +
" WHERE " + HISTORY_COL_ARTICLE_TITLE+ " = ?" + " WHERE " + HISTORY_COL_ARTICLE_TITLE + " = ?" +
" AND " + HISTORY_COL_LANG + " = ?" + " AND " + HISTORY_COL_LANG + " = ?" +
" AND " + HISTORY_COL_TRAVEL_BOOK + " = ?", " AND " + HISTORY_COL_TRAVEL_BOOK + " = ?",
new Object[]{item.articleTitle, item.lang, travelBook}); new Object[] {item.articleTitle, item.lang, travelBook});
} finally { } finally {
conn.close(); conn.close();
} }
@ -480,15 +474,19 @@ public class TravelLocalDataHelper {
if (travelBook == null) { if (travelBook == null) {
return; return;
} }
context.getTravelHelper().getArticleById(article.generateIdentifier(), article.lang, true, final TravelHelper travelHelper = context.getTravelHelper();
new TravelHelper.GpxReadCallback() { travelHelper.getArticleById(article.generateIdentifier(), article.lang, true, new GpxReadCallback() {
@Override @Override
public void onGpxFileReading() { public void onGpxFileReading() {
} }
@Override @Override
public void onGpxFileRead(@Nullable GPXUtilities.GPXFile gpxFile) { public void onGpxFileRead(@Nullable GPXFile gpxFile) {
if (gpxFile != null) {
travelHelper.createGpxFile(article);
}
SQLiteConnection conn = openConnection(false); SQLiteConnection conn = openConnection(false);
if (conn != null) { if (conn != null) {
try { try {
@ -506,7 +504,7 @@ public class TravelLocalDataHelper {
BOOKMARKS_COL_LAST_MODIFIED + ", " + BOOKMARKS_COL_LAST_MODIFIED + ", " +
BOOKMARKS_COL_GPX_GZ + BOOKMARKS_COL_GPX_GZ +
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
conn.execSQL(query, new Object[]{article.title, article.lang, conn.execSQL(query, new Object[] {article.title, article.lang,
article.aggregatedPartOf, article.imageTitle, article.aggregatedPartOf, article.imageTitle,
travelBook, article.lat, article.lon, article.routeId, article.contentsJson, travelBook, article.lat, article.lon, article.routeId, article.contentsJson,
article.content, article.getFile().lastModified(), article.content, article.getFile().lastModified(),
@ -519,11 +517,26 @@ public class TravelLocalDataHelper {
}); });
} }
void removeSavedArticle(@NonNull TravelArticle article) { void removeSavedArticle(@NonNull final TravelArticle article) {
String travelBook = article.getTravelBook(context); final String travelBook = article.getTravelBook(context);
if (travelBook == null) { if (travelBook == null) {
return; return;
} }
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); SQLiteConnection conn = openConnection(false);
if (conn != null) { if (conn != null) {
try { try {
@ -532,12 +545,14 @@ public class TravelLocalDataHelper {
" AND " + BOOKMARKS_COL_ROUTE_ID + " = ?" + " AND " + BOOKMARKS_COL_ROUTE_ID + " = ?" +
" AND " + BOOKMARKS_COL_LANG + ((article.lang != null) ? " = '" + article.lang + "'" : " IS NULL") + " AND " + BOOKMARKS_COL_LANG + ((article.lang != null) ? " = '" + article.lang + "'" : " IS NULL") +
" AND " + BOOKMARKS_COL_TRAVEL_BOOK + " = ?"; " AND " + BOOKMARKS_COL_TRAVEL_BOOK + " = ?";
conn.execSQL(query, new Object[]{article.title, article.routeId, travelBook}); conn.execSQL(query, new Object[] {article.title, article.routeId, travelBook});
} finally { } finally {
conn.close(); conn.close();
} }
} }
} }
});
}
void updateSavedArticle(@NonNull TravelArticle odlArticle, @NonNull TravelArticle newArticle) { void updateSavedArticle(@NonNull TravelArticle odlArticle, @NonNull TravelArticle newArticle) {
String travelBook = odlArticle.getTravelBook(context); String travelBook = odlArticle.getTravelBook(context);
@ -563,7 +578,7 @@ public class TravelLocalDataHelper {
" AND " + BOOKMARKS_COL_ROUTE_ID + " = ?" + " AND " + BOOKMARKS_COL_ROUTE_ID + " = ?" +
" AND " + BOOKMARKS_COL_LANG + " = ?" + " AND " + BOOKMARKS_COL_LANG + " = ?" +
" AND " + BOOKMARKS_COL_TRAVEL_BOOK + " = ?", " 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.imageTitle, newArticle.getTravelBook(context), newArticle.lat,
newArticle.lon, newArticle.routeId, newArticle.contentsJson, newArticle.content, newArticle.lon, newArticle.routeId, newArticle.contentsJson, newArticle.content,
newArticle.getLastModified(), newArticle.getLastModified(),

View file

@ -56,10 +56,10 @@ import static net.osmand.GPXUtilities.WptPt;
import static net.osmand.GPXUtilities.writeGpxFile; import static net.osmand.GPXUtilities.writeGpxFile;
import static net.osmand.plus.helpers.GpxUiHelper.getGpxTitle; 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.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_DOWN;
import static net.osmand.plus.wikivoyage.data.TravelGpx.DIFF_ELE_UP; 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.DISTANCE;
import static net.osmand.plus.wikivoyage.data.TravelGpx.ACTIVITY_TYPE;
import static net.osmand.plus.wikivoyage.data.TravelGpx.USER; import static net.osmand.plus.wikivoyage.data.TravelGpx.USER;
import static net.osmand.util.Algorithms.capitalizeFirstLetter; import static net.osmand.util.Algorithms.capitalizeFirstLetter;
@ -1029,6 +1029,15 @@ public class TravelObfHelper implements TravelHelper {
return WORLD_WIKIVOYAGE_FILE_NAME; 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<Void, Void, GPXFile> { private class GpxFileReader extends AsyncTask<Void, Void, GPXFile> {
private final TravelArticle article; private final TravelArticle article;

View file

@ -31,13 +31,13 @@ import net.osmand.plus.wikipedia.WikiArticleHelper;
import net.osmand.plus.wikivoyage.WikivoyageUtils; import net.osmand.plus.wikivoyage.WikivoyageUtils;
import net.osmand.plus.wikivoyage.data.TravelArticle; import net.osmand.plus.wikivoyage.data.TravelArticle;
import net.osmand.plus.wikivoyage.data.TravelGpx; 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 net.osmand.util.Algorithms;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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; import static net.osmand.util.Algorithms.capitalizeFirstLetterAndLowercase;
public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
@ -182,20 +182,15 @@ public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.Vi
private void updateSaveButton(final TravelGpxVH holder, final TravelGpx article) { private void updateSaveButton(final TravelGpxVH holder, final TravelGpx article) {
if (article != null) { if (article != null) {
final TravelLocalDataHelper helper = app.getTravelHelper().getBookmarksHelper(); final TravelHelper helper = app.getTravelHelper();
final boolean saved = helper.isArticleSaved(article); final boolean saved = helper.getBookmarksHelper().isArticleSaved(article);
Drawable icon = getActiveIcon(saved ? R.drawable.ic_action_read_later_fill : R.drawable.ic_action_read_later); Drawable icon = getActiveIcon(saved ? R.drawable.ic_action_read_later_fill : R.drawable.ic_action_read_later);
holder.rightButton.setText(saved ? R.string.shared_string_remove : R.string.shared_string_save); holder.rightButton.setText(saved ? R.string.shared_string_remove : R.string.shared_string_save);
holder.rightButton.setCompoundDrawablesWithIntrinsicBounds(null, null, icon, null); holder.rightButton.setCompoundDrawablesWithIntrinsicBounds(null, null, icon, null);
holder.rightButton.setOnClickListener(new View.OnClickListener() { holder.rightButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
if (saved) { helper.saveOrRemoveArticle(article, !saved);
helper.removeArticleFromSaved(article);
} else {
app.getTravelHelper().createGpxFile(article);
helper.addArticleToSaved(article);
}
updateSaveButton(holder, article); updateSaveButton(holder, article);
} }
}); });
@ -286,13 +281,13 @@ public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.Vi
Object item = getItemByPosition(); Object item = getItemByPosition();
if (item instanceof TravelArticle) { if (item instanceof TravelArticle) {
final TravelArticle article = (TravelArticle) item; final TravelArticle article = (TravelArticle) item;
final TravelLocalDataHelper ldh = app.getTravelHelper().getBookmarksHelper(); final TravelHelper helper = app.getTravelHelper();
ldh.removeArticleFromSaved(article); helper.saveOrRemoveArticle(article, false);
Snackbar snackbar = Snackbar.make(itemView, R.string.article_removed, Snackbar.LENGTH_LONG) Snackbar snackbar = Snackbar.make(itemView, R.string.article_removed, Snackbar.LENGTH_LONG)
.setAction(R.string.shared_string_undo, new View.OnClickListener() { .setAction(R.string.shared_string_undo, new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
ldh.restoreSavedArticle(article); helper.saveOrRemoveArticle(article, true);
} }
}); });
boolean nightMode = !settings.isLightContent(); boolean nightMode = !settings.isLightContent();

View file

@ -100,16 +100,9 @@ public class ArticleTravelCard extends BaseTravelCard {
holder.rightButton.setOnClickListener(new View.OnClickListener() { holder.rightButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
if (article != null) { app.getTravelHelper().saveOrRemoveArticle(article, !saved);
if (saved) {
helper.removeArticleFromSaved(article);
} else {
app.getTravelHelper().createGpxFile(article);
helper.addArticleToSaved(article);
}
updateSaveButton(holder); updateSaveButton(holder);
} }
}
}); });
} }
} }

View file

@ -20,7 +20,6 @@ import net.osmand.plus.R;
import net.osmand.plus.track.TrackMenuFragment; import net.osmand.plus.track.TrackMenuFragment;
import net.osmand.plus.wikivoyage.data.TravelGpx; import net.osmand.plus.wikivoyage.data.TravelGpx;
import net.osmand.plus.wikivoyage.data.TravelHelper; import net.osmand.plus.wikivoyage.data.TravelHelper;
import net.osmand.plus.wikivoyage.data.TravelLocalDataHelper;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import java.io.File; import java.io.File;
@ -104,19 +103,15 @@ public class TravelGpxCard extends BaseTravelCard {
private void updateSaveButton(final TravelGpxVH holder) { private void updateSaveButton(final TravelGpxVH holder) {
if (article != null) { if (article != null) {
final TravelLocalDataHelper helper = app.getTravelHelper().getBookmarksHelper(); final TravelHelper helper = app.getTravelHelper();
final boolean saved = helper.isArticleSaved(article); final boolean saved = helper.getBookmarksHelper().isArticleSaved(article);
Drawable icon = getActiveIcon(saved ? R.drawable.ic_action_read_later_fill : R.drawable.ic_action_read_later); Drawable icon = getActiveIcon(saved ? R.drawable.ic_action_read_later_fill : R.drawable.ic_action_read_later);
holder.rightButton.setText(saved ? R.string.shared_string_remove : R.string.shared_string_save); holder.rightButton.setText(saved ? R.string.shared_string_remove : R.string.shared_string_save);
holder.rightButton.setCompoundDrawablesWithIntrinsicBounds(null, null, icon, null); holder.rightButton.setCompoundDrawablesWithIntrinsicBounds(null, null, icon, null);
holder.rightButton.setOnClickListener(new View.OnClickListener() { holder.rightButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
if (saved) { helper.saveOrRemoveArticle(article, !saved);
helper.removeArticleFromSaved(article);
} else {
helper.addArticleToSaved(article);
}
updateSaveButton(holder); updateSaveButton(holder);
} }
}); });