Merge branch 'master' into RouteLine

# Conflicts:
#	OsmAnd/res/values/strings.xml
This commit is contained in:
nazar-kutz 2021-03-24 01:37:43 +02:00
commit 3ecfbfc087
103 changed files with 4118 additions and 1986 deletions

View file

@ -1117,8 +1117,8 @@ public class RouteResultPreparation {
if (UNMATCHED_HIGHWAY_TYPE.equals(rr.getObject().getHighway())) { if (UNMATCHED_HIGHWAY_TYPE.equals(rr.getObject().getHighway())) {
bearingDist = RouteSegmentResult.DIST_BEARING_DETECT_UNMATCHED; bearingDist = RouteSegmentResult.DIST_BEARING_DETECT_UNMATCHED;
} }
double mpi = MapUtils.degreesDiff(prev.getBearingEnd(prev.getEndPointIndex(), bearingDist), double mpi = MapUtils.degreesDiff(prev.getBearingEnd(prev.getEndPointIndex(), Math.min(prev.getDistance(), bearingDist)),
rr.getBearingBegin(rr.getStartPointIndex(), bearingDist)); rr.getBearingBegin(rr.getStartPointIndex(), Math.min(rr.getDistance(), bearingDist)));
if (mpi >= TURN_DEGREE_MIN) { if (mpi >= TURN_DEGREE_MIN) {
if (mpi < TURN_DEGREE_MIN) { if (mpi < TURN_DEGREE_MIN) {
// Slight turn detection here causes many false positives where drivers would expect a "normal" TL. Best use limit-angle=TURN_DEGREE_MIN, this reduces TSL to the turn-lanes cases. // Slight turn detection here causes many false positives where drivers would expect a "normal" TL. Best use limit-angle=TURN_DEGREE_MIN, this reduces TSL to the turn-lanes cases.

View file

@ -457,7 +457,7 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
} }
public float getBearingBegin() { public float getBearingBegin() {
return getBearingBegin(startPointIndex, DIST_BEARING_DETECT); return getBearingBegin(startPointIndex, distance > 0 && distance < DIST_BEARING_DETECT ? distance : DIST_BEARING_DETECT);
} }
public float getBearingBegin(int point, float dist) { public float getBearingBegin(int point, float dist) {
@ -465,7 +465,7 @@ public class RouteSegmentResult implements StringExternalizable<RouteDataBundle>
} }
public float getBearingEnd() { public float getBearingEnd() {
return getBearingEnd(endPointIndex, DIST_BEARING_DETECT); return getBearingEnd(endPointIndex, distance > 0 && distance < DIST_BEARING_DETECT ? distance : DIST_BEARING_DETECT);
} }
public float getBearingEnd(int point, float dist) { public float getBearingEnd(int point, float dist) {

View file

@ -39,7 +39,7 @@
<string name="shared_string_share">Κοινοποίηση</string> <string name="shared_string_share">Κοινοποίηση</string>
<string name="shared_string_back">Προηγούμενο</string> <string name="shared_string_back">Προηγούμενο</string>
<string name="shared_string_continue">Συνέχεια</string> <string name="shared_string_continue">Συνέχεια</string>
<string name="shared_string_cancel">Ακύρωση</string> <string name="shared_string_cancel">Άκυρο</string>
<string name="shared_string_settings">Επιλογές</string> <string name="shared_string_settings">Επιλογές</string>
<string name="shared_string_enabled">Ενεργοποιημένο</string> <string name="shared_string_enabled">Ενεργοποιημένο</string>
<string name="units_and_formats">Μονάδες μέτρησης &amp; φορμά</string> <string name="units_and_formats">Μονάδες μέτρησης &amp; φορμά</string>

View file

@ -81,5 +81,5 @@
<string name="send_report">ارسال گزارش</string> <string name="send_report">ارسال گزارش</string>
<string name="shared_string_export">برون‌برد</string> <string name="shared_string_export">برون‌برد</string>
<string name="logcat_buffer">بافر لاگ‌کت</string> <string name="logcat_buffer">بافر لاگ‌کت</string>
<string name="logcat_buffer_descr">لاگ‌های جزئی برنامه را بررسی و هم‌رسانی کنید</string> <string name="logcat_buffer_descr">لاگ‌های باجزئیات برنامه را بررسی و هم‌رسانی کنید</string>
</resources> </resources>

View file

@ -213,7 +213,7 @@
<string name="by_group">Par groupe</string> <string name="by_group">Par groupe</string>
<string name="by_distance">Par distance</string> <string name="by_distance">Par distance</string>
<string name="logout_from_osmand_telegram">Se déconnecter d\'OsmAnd Tracker \?</string> <string name="logout_from_osmand_telegram">Se déconnecter d\'OsmAnd Tracker \?</string>
<string name="logout_from_osmand_telegram_descr">Êtes-vous sûr·e de vouloir vous déconnecter d\'OsmAnd Tracker ; vous ne pourrez pas partager votre position ni vous la position des autres \?</string> <string name="logout_from_osmand_telegram_descr">Êtes-vous certain de vouloir vous déconnecter d\'OsmAnd Tracker \? Vous ne pourrez pas partager votre position ni voir la position des autres.</string>
<string name="live_now_description">Contacts et groupes partageant leur position avec vous.</string> <string name="live_now_description">Contacts et groupes partageant leur position avec vous.</string>
<string name="share_location_as">Partager la position comme</string> <string name="share_location_as">Partager la position comme</string>
<string name="add_device">Ajouter un périphérique</string> <string name="add_device">Ajouter un périphérique</string>

View file

@ -1,4 +1,274 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="last_update_from_telegram_date">Senaste uppdatering från Telegram: %1$s</string> <string name="last_update_from_telegram_date">Senaste uppdatering från Telegram: %1$s</string>
<string name="timeline">Tidslinje</string>
<string name="live_now">Direkt nu</string>
<string name="my_location">Min plats</string>
<string name="welcome_descr"><b>OsmAnd Tracker</b> låter dig dela din plats och se andras i OsmAnd. <br/> <br/>Appen använder Telegram API, så du behöver ett Telegram-konto.</string>
<string name="shared_string_second_short">sek</string>
<string name="shared_string_minute_short">min</string>
<string name="shared_string_hour_short">t</string>
<string name="si_mi_meters">Miles/meter</string>
<string name="si_nm">Distansminuter</string>
<string name="si_km_m">Kilomter/meter</string>
<string name="si_mi_yard">Miles/yard</string>
<string name="si_mi_feet">Miles/fot</string>
<string name="si_nm_h">Sjömil per timme (knop)</string>
<string name="si_min_m">Minuter per mile</string>
<string name="si_min_km">Minuter per kilometer</string>
<string name="si_m_s">Meter per sekund</string>
<string name="si_mph">Miles per timme</string>
<string name="si_kmh">Kilometer per timme</string>
<string name="mile_per_hour">mph</string>
<string name="km_h">km/h</string>
<string name="m_s">m/s</string>
<string name="nm_h">di/h</string>
<string name="min_km">min/km</string>
<string name="min_mile">min/mi</string>
<string name="nm">di</string>
<string name="m">m</string>
<string name="km">km</string>
<string name="mile">mi</string>
<string name="foot">ft</string>
<string name="yard">yd</string>
<string name="shared_string_welcome">Välkommen</string>
<string name="shared_string_authorization_descr">Ange ditt Telegram-telefonnummer i internationellt format</string>
<string name="shared_string_authorization">Tillstånd</string>
<string name="active_chats">Aktivera chattar</string>
<string name="show_users_on_map">Visa användare på kartan</string>
<string name="install_osmand">Installera OsmAnd</string>
<string name="install_osmand_dialog_message">Du måste installera den gratis eller betalda versionen av OsmAnd först</string>
<string name="osmand_logo">OsmAnd logotyp</string>
<string name="process_service">OsmAnd Tracker tjänst</string>
<string name="sharing_location">Delar plats</string>
<string name="share_location">Dela plats</string>
<string name="shared_string_distance">Avstånd</string>
<string name="osmand_service_descr">OsmAnd Tracker körs i bakgrunden med skärmen av.</string>
<string name="osmand_service">Bakgrundsläge</string>
<string name="location_service_no_gps_available">Välj en av platsleverantörerna för att dela din plats.</string>
<string name="gps_not_available">Aktivera \"Plats\" i systeminställningarna</string>
<string name="no_location_permission">App saknar behörighet för plats data.</string>
<string name="shared_string_settings">Inställningar</string>
<string name="shared_string_cancel">Avbryt</string>
<string name="shared_string_continue">Fortsätt</string>
<string name="not_logged_in">Du är inte inloggad</string>
<string name="gps_network_not_enabled">Starta \"Platsdelning\"\?</string>
<string name="closing">Stänger</string>
<string name="logging_out">Loggar ut</string>
<string name="initialization">Startar</string>
<string name="shared_string_logout">Logga ut</string>
<string name="shared_string_login">Logga in</string>
<string name="password_descr">Telegram-lösenord</string>
<string name="enter_password">Ange lösenord</string>
<string name="authentication_code_descr">Telegram har skickat en kod till dig för OmsAnd för inloggning till ditt konto.</string>
<string name="authentication_code">Autentiseringskod</string>
<string name="enter_code">Ange kod</string>
<string name="shared_string_password">Lösenord</string>
<string name="phone_number_descr">Telefonnummer i internationellt format</string>
<string name="phone_number_title">Telefonnummer</string>
<string name="app_name">OsmAnd Online GPS Tracker</string>
<string name="show_on_map">Visa på karta</string>
<string name="start_location_sharing">Platsdelning</string>
<string name="my_location_search_hint">Sök: Grupp och kontakt</string>
<string name="location_sharing_description">Välj de kontakter och grupper du vill dela din plats med.</string>
<string name="set_time">Ange tid</string>
<string name="set_time_description">Ställ in tiden att dina valda kontakter och grupper ska se din plats i realtid.</string>
<string name="visible_time_for_all">Synlig tid för alla</string>
<string name="shared_string_back">Bakåt</string>
<string name="shared_string_share">Dela</string>
<string name="shared_string_install">Installera</string>
<string name="hours_format">%1$d t</string>
<string name="minutes_format">%1$d m</string>
<string name="hours_and_minutes_format">%1$d t %2$d m</string>
<string name="set_visible_time_for_all">Ställ in synlig tid för alla</string>
<string name="enter_authentication_code">Ange autentiseringskod</string>
<string name="enter_phone_number">Skriv in telefonnummer</string>
<string name="do_not_have_telegram">Jag har inget Telegramkonto</string>
<string name="already_registered_in_telegram">Du behöver ett registrerat Telegramkonto och ett telefonnummer</string>
<string name="shared_string_off">Av</string>
<string name="shared_string_all">Alla</string>
<string name="get_telegram_after_creating_account">Efter det kan du använda denna app.</string>
<string name="get_telegram_description_continue">Installera Telegram och registrera ett konto.</string>
<string name="get_telegram_account_first">Du behöver ett Telegramkonto för att använda platsdelning.</string>
<string name="get_telegram_title">Registrering i Telegram</string>
<string name="shared_string_bot">Bot</string>
<string name="shared_string_live">Direkt</string>
<string name="open_osmand">Öppna OsmAnd</string>
<string name="turn_off_location_sharing">Stäng av platsdelning</string>
<string name="stop_sharing_all">Delning är påslagen (stäng av)</string>
<string name="expire_at">Går ut</string>
<string name="sharing_time">Delningstid</string>
<string name="gps_and_location">Plats</string>
<string name="send_my_location">Skicka min plats</string>
<string name="send_my_location_desc">Ställ in minsta intervall för platsdelning.</string>
<string name="stale_location">Ingen rörelse</string>
<string name="stale_location_desc">Senaste tid en kontakt rört sig.</string>
<string name="location_history">Platshistorik</string>
<string name="location_history_desc">Göm kontakter som inte har rört sig inom given tid.</string>
<string name="osmand_connect">Anslutning till OsmAnd</string>
<string name="osmand_connect_desc">Välj den OsmAnd-version som OsmAnd Tracker använder för att visa positioner.</string>
<string name="in_time">i %1$s</string>
<string name="shared_string_account">Konto</string>
<string name="connected_account">Anlutet konto</string>
<string name="logout_help_desc">Hur man stänger av OsmAnd Tracker från Telegram</string>
<string name="disconnect_from_telegram">Hur man stänger av OsmAnd Tracker från Telegram</string>
<string name="disconnect_from_telegram_desc">För att återkalla platsdelningsåtkomst. Öppna Telegram, gå till Inställningar → Sekretess och säkerhet → Sessioner och avsluta OsmAnd Tracker-sessionen.</string>
<string name="shared_string_close">Stäng</string>
<string name="logout_no_internet_msg">Anslut till internet för att logga ut ordentligt från Telegram.</string>
<string name="shared_string_group">Grupp</string>
<string name="last_response">Senaste svar</string>
<string name="time_ago">sedan</string>
<string name="shared_string_exit">Utgång</string>
<string name="turn_off_all">Stäng av allt</string>
<string name="disable_all_sharing">Inaktivera all delning</string>
<string name="disable_all_sharing_desc">Stäng av platsdelning i alla valda chatter (%1$d).</string>
<string name="choose_osmand">Välj OsmAnd version att använda</string>
<string name="choose_osmand_desc">Välj OsmAnd version där kontakter kommer att visas på kartan.</string>
<string name="shared_string_sort_by">Sortera efter</string>
<string name="shared_string_sort">Sortera</string>
<string name="by_group">Efter grupp</string>
<string name="by_name">Efter namn</string>
<string name="by_distance">Avstånd</string>
<string name="shared_string_name">Namn</string>
<string name="logout_from_osmand_telegram">Logga ut från OsmAnd Tracker\?</string>
<string name="logout_from_osmand_telegram_descr">Är du säker på att du vill logga ut från OsmAnd Tracker så att du inte kan dela plats eller se andras plats\?</string>
<string name="live_now_description">Kontakter och grupper delar plats med dig.</string>
<string name="share_location_as">Dela plats som</string>
<string name="add_device">Lägg till enhet</string>
<string name="shared_string_save">Spara</string>
<string name="shared_string_disable">Inaktivera</string>
<string name="no_internet_connection">Ingen internet-anslutning</string>
<string name="no_gps_connection">Ingen GPS-anslutning</string>
<string name="shared_string_status">Status</string>
<string name="shared_string_enabled">Aktiverat</string>
<string name="location_sharing_status">Delar: %1$s</string>
<string name="sharing_status">Delar status</string>
<string name="last_available_location">Senaste tillgängliga plats</string>
<string name="re_send_location">Skicka plats igen</string>
<string name="not_found_yet">Hittades inte än</string>
<string name="not_sent_yet">Inte skickat än</string>
<string name="shared_string_later">Senare</string>
<string name="go_to_settings">Gå till inställningar</string>
<string name="sharing_in_background">Delar i bakgrunden</string>
<string name="battery_optimization_description">Stäng av batterioptimering för OsmAnd Tracker så att den inte plötsligt stängs av i bakgrunden.</string>
<string name="background_work">Bakgrundsarbete</string>
<string name="background_work_description">Ändra batterioptimeringsinställningarna för att stabilisera platsdelning.</string>
<string name="connecting_to_the_internet">Ansluter till internet</string>
<string name="searching_for_gps">Positionering …</string>
<string name="initializing">Startar</string>
<string name="sending_location_messages">Skickar plats</string>
<string name="waiting_for_response_from_telegram">Väntar på svar från Telegram</string>
<string name="not_possible_to_send_to_telegram_chats">Inte möjligt att skicka till Telegram-chattar:</string>
<string name="successfully_sent_and_updated">Skickades och uppdaterades</string>
<string name="last_updated_location">Senast uppdaterad plats:</string>
<string name="share_location_as_description">Om du vill ansluta flera enheter till ett telegramkonto måste du använda olika enheter för att dela din plats.</string>
<string name="share_location_as_description_second_line">Du kan skapa och visa enhets-ID i Telegram-klienten genom att använda %1$s chatt-bot. %2$s</string>
<string name="shared_string_hide">Göm</string>
<string name="device_name">Enhetsnamn</string>
<string name="device_name_cannot_be_empty">Enhetsnamn kan inte vara tomt</string>
<string name="device_name_is_too_long">Enhetsnamn för långt</string>
<string name="enter_device_name_description">Namnge din nya enhet med max 200 symboler.</string>
<string name="error_adding_new_device">Kunde inte lägga till ny enhet</string>
<string name="shared_string_add">Lägg till</string>
<string name="device_added_successfully">%1$s tillagt.</string>
<string name="enter_another_device_name">Välj ett namn som du inte redan har använt</string>
<string name="last_update_from_telegram">Senaste uppdatering från Telegram</string>
<string name="map_and_text">Karta och text</string>
<string name="shared_string_text">Text</string>
<string name="shared_string_map">Karta</string>
<string name="send_location_as_descr">Välj hur meddelanden med din plats ska se ut.</string>
<string name="send_location_as">Skicka plats som</string>
<string name="start_date">Start datum</string>
<string name="end_date">Slutdatum</string>
<string name="open_in_osmand">Visa i OsmAnd</string>
<string name="average_speed">Genomsnittlig hastighet</string>
<string name="average_altitude">Genomsnittlig höjd</string>
<string name="time_on_the_move">Rörelse tid</string>
<string name="monitoring_is_disabled">Övervakning är inaktiverad</string>
<string name="monitoring_is_enabled">Övervakning är aktiverad</string>
<string name="shared_string_sent">Skickat</string>
<string name="gps_points">GPS-punkter</string>
<string name="shared_string_collected">Samlade</string>
<string name="shared_string_date">Datum</string>
<string name="points_size">%1$d punkter</string>
<string name="gps_points_in_buffer">skicka (%1$d i buffer)</string>
<string name="shared_string_update">Uppdatering</string>
<string name="please_update_osmand">var snäll uppdatera OsmAnd för att visa data på kartan</string>
<string name="show_gps_points_descr">Visa antal samlade och skickade GPS-punkter.</string>
<string name="show_gps_points">Visa GPS-punkter</string>
<string name="shared_string_appearance">Utseende</string>
<string name="received_gps_points">Fick GPX-punkter: %1$s</string>
<string name="how_it_works">Hur det fungerar</string>
<string name="osmand_privacy_policy">OsmAnd integritetspolicy</string>
<string name="telegram_privacy_policy">Telegram integritetspolicy</string>
<string name="shared_string_accept">Acceptera</string>
<string name="privacy_policy_agree">Genom att klicka på \"Fortsätt\" godkänner du villkoren i Telegram- och OsmAnds integritetspolicy.</string>
<string name="privacy_policy_telegram_client">OsmAnd tracker är en av klienterna som använder Telegram öppen plattform. Dina kontakter kan använda vilken Telegram-klient som helst.</string>
<string name="privacy_policy_use_telegram">Telegram (meddelandeappen) används för att ansluta och kommunicera med människor.</string>
<string name="shared_string_telegram">Telegram</string>
<string name="app_name_short">OsmAnd Tracker</string>
<string name="timeline_description">Aktivera övervakning för att spara alla platser i historiken.</string>
<string name="location_recording_enabled">Platsinspelning aktiverad</string>
<string name="disable_monitoring">Deaktivera övervakning</string>
<string name="timeline_available_for_free_now">Tidslinje är nu tillgängligt utan extra kostnad.</string>
<string name="shared_string_ok">OK</string>
<string name="shared_string_search">Sök</string>
<string name="type_contact_or_group_name">Skriv kontakt eller gruppnamn</string>
<string name="search_contacts_descr">Sök i alla dina grupper och kontakter.</string>
<string name="search_contacts">Sök kontakter</string>
<string name="bearing">Riktning</string>
<string name="altitude">Höjd över havet</string>
<string name="precision">Precision</string>
<string name="direction">Riktning</string>
<string name="privacy">Integritet</string>
<string name="proxy">Proxy</string>
<string name="proxy_settings">Proxy-inställningar</string>
<string name="proxy_disconnected">Frånkopplad</string>
<string name="proxy_connected">Ansluten</string>
<string name="proxy_type">Proxy-typ</string>
<string name="shared_string_enable">Aktivera</string>
<string name="shared_string_connection">Anslutning</string>
<string name="proxy_server">Server</string>
<string name="proxy_port">Port</string>
<string name="proxy_credentials">Referenser</string>
<string name="proxy_username">Användarnamn</string>
<string name="proxy_password">Lösenord</string>
<string name="proxy_key">Nyckel</string>
<string name="gpx_settings">GPX-inställningar</string>
<string name="min_logging_speed_descr">Filter: ingen loggning under valda hastigheten</string>
<string name="min_logging_speed">Minsta loggningshastighet</string>
<string name="min_logging_accuracy_descr">Filter: ingen loggning utan att nogranheten är nodd</string>
<string name="min_logging_accuracy">Minsta loggningsnoggrannhet</string>
<string name="min_logging_distance_descr">Filter: minsta avstånd för att logga en ny punkt</string>
<string name="min_logging_distance">Minsta loggningsavstånd</string>
<string name="shared_string_select">Välj</string>
<string name="timeline_no_data">Ingen data</string>
<string name="timeline_no_data_descr">Vi har inget sparad data för den valda dagen</string>
<string name="start_end_date">Start - Slut datum</string>
<string name="set_time_timeline_descr">Välj tid att visa</string>
<string name="shared_string_apply">Verkställ</string>
<string name="shared_string_start">Start</string>
<string name="shared_string_end">Slut</string>
<string name="saved_messages">Sparade meddelanden</string>
<string name="unit_of_speed_system">Enhet för hastighet</string>
<string name="unit_of_speed_system_descr">Definera enhet för hastighet.</string>
<string name="unit_of_length">Enhet för längd</string>
<string name="unit_of_length_descr">Ändra vad avstånd mäts i.</string>
<string name="units_and_formats">Enheter &amp; format</string>
<string name="time_zone">Tidszon</string>
<string name="time_zone_descr">Välj tidszon som ska visas i dina platsmeddelanden.</string>
<string name="buffer_time">Buffertens utgångstid</string>
<string name="buffer_time_descr">Maximal tid att lagra poäng i bufferten</string>
<string name="status_widget_title">OsmAnd Tracler status</string>
<string name="shared_string_suggested">Förslagen</string>
<string name="back_to_osmand">Tillbaka till OsmAnd</string>
<string name="duration_ago">%1$s sedan</string>
<string name="last_response_duration">Senaste svar: %1$s sedan</string>
<string name="last_update_from_telegram_duration">Senaste uppdatering från Telegram: %1$s sedan</string>
<string name="last_response_date">Senast response: %1$s</string>
<string name="shared_string_error_short">ERR</string>
<string name="shared_string_export">Export</string>
<string name="logcat_buffer">Logcat buffer</string>
<string name="logcat_buffer_descr">Kontrollera och dela detaljerade loggar för appen</string>
<string name="send_report">Skicka rapport</string>
</resources> </resources>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/switch_button_active_light" />
<corners android:radius="4dp" />
</shape>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/switch_button_active_dark" />
<corners android:radius="4dp" />
</shape>

View file

@ -0,0 +1,63 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M22,2V19C22,20.6569 20.6569,22 19,22H5C3.3431,22 2,20.6569 2,19V2H4V18H20V2H22Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M13,14.2C13,14.0895 13.0895,14 13.2,14H17.8C17.9105,14 18,14.0895 18,14.2V15.8C18,15.9105 17.9105,16 17.8,16H13.2C13.0895,16 13,15.9105 13,15.8V14.2Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M6,6H9V8H6V6Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M11,6H18V8H11V6Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M4,4H20V2H4V4Z"
android:strokeAlpha="0.7"
android:fillColor="#ffffff"
android:fillAlpha="0.7"/>
<path
android:pathData="M4,4H20V18H4V4Z"
android:strokeAlpha="0.1"
android:fillColor="#ffffff"
android:fillAlpha="0.1"/>
<path
android:pathData="M6,9H11V10H6V9Z"
android:strokeAlpha="0.5"
android:fillColor="#ffffff"
android:fillAlpha="0.5"/>
<path
android:pathData="M6,11H7V12H6V11Z"
android:strokeAlpha="0.5"
android:fillColor="#ffffff"
android:fillAlpha="0.5"/>
<path
android:pathData="M12,9H14V10H12V9Z"
android:strokeAlpha="0.5"
android:fillColor="#ffffff"
android:fillAlpha="0.5"/>
<path
android:pathData="M15,9H18V10H15V9Z"
android:strokeAlpha="0.5"
android:fillColor="#ffffff"
android:fillAlpha="0.5"/>
<path
android:pathData="M8,11H12V12H8V11Z"
android:strokeAlpha="0.5"
android:fillColor="#ffffff"
android:fillAlpha="0.5"/>
<path
android:pathData="M13,11H18V12H13V11Z"
android:strokeAlpha="0.5"
android:fillColor="#ffffff"
android:fillAlpha="0.5"/>
<path
android:pathData="M6.2,14C6.0895,14 6,14.0895 6,14.2V15.8C6,15.9105 6.0895,16 6.2,16H10.8C10.9105,16 11,15.9105 11,15.8V14.2C11,14.0895 10.9105,14 10.8,14H6.2Z"
android:strokeAlpha="0.5"
android:fillColor="#ffffff"
android:fillAlpha="0.5"/>
</vector>

View file

@ -3,14 +3,13 @@
xmlns:osmand="http://schemas.android.com/apk/res-auto" xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
tools:background="@drawable/btn_background_inactive_dark">
<LinearLayout <LinearLayout
android:id="@+id/button_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:clickable="true" android:background="?attr/selectableItemBackground"
android:focusable="true"
android:gravity="center_vertical" android:gravity="center_vertical"
android:minHeight="@dimen/bottom_sheet_list_item_height" android:minHeight="@dimen/bottom_sheet_list_item_height"
android:orientation="horizontal" android:orientation="horizontal"
@ -20,7 +19,6 @@
android:paddingEnd="@dimen/content_padding_small" android:paddingEnd="@dimen/content_padding_small"
android:paddingRight="@dimen/content_padding_small" android:paddingRight="@dimen/content_padding_small"
android:paddingBottom="@dimen/text_margin_small" android:paddingBottom="@dimen/text_margin_small"
tools:background="@drawable/btn_background_inactive_dark"
tools:ignore="UselessParent"> tools:ignore="UselessParent">
<LinearLayout <LinearLayout

View file

@ -4,80 +4,94 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:baselineAligned="false" android:baselineAligned="false"
android:gravity="center_vertical" android:gravity="center_vertical"
android:minHeight="@dimen/bottom_sheet_selected_item_title_height"> android:minHeight="@dimen/bottom_sheet_list_item_height">
<LinearLayout <androidx.cardview.widget.CardView
android:id="@+id/basic_item_body" android:id="@+id/compound_container"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/content_padding_half"
android:layout_marginRight="@dimen/content_padding_half"
android:layout_weight="1" android:layout_weight="1"
android:background="?attr/selectableItemBackground" android:gravity="center_vertical"
android:paddingStart="@dimen/content_padding" app:cardCornerRadius="4dp"
android:paddingLeft="@dimen/content_padding" app:cardElevation="0dp"
android:paddingEnd="@dimen/content_padding" tools:cardBackgroundColor="?attr/switch_button_active">
android:paddingRight="@dimen/content_padding">
<LinearLayout <LinearLayout
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_gravity="center_vertical" android:background="?attr/selectableItemBackground"
android:layout_weight="1" android:orientation="horizontal">
android:orientation="vertical">
<TextView <net.osmand.plus.widgets.TextViewEx
android:id="@+id/title" android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/context_menu_first_line_top_margin"
android:layout_marginBottom="@dimen/context_menu_first_line_top_margin"
android:layout_weight="1"
android:ellipsize="end"
android:letterSpacing="@dimen/description_letter_spacing"
android:maxLines="1"
android:textColor="?attr/active_color_basic"
android:textSize="@dimen/default_desc_text_size"
app:typeface="@string/font_roboto_medium"
tools:text="Some title" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/compound_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ellipsize="end" android:layout_gravity="center_vertical"
android:maxLines="1" android:layout_marginStart="@dimen/bottom_sheet_content_margin"
android:paddingTop="@dimen/content_padding_small" android:layout_marginLeft="@dimen/bottom_sheet_content_margin"
android:paddingBottom="@dimen/content_padding" android:layout_marginEnd="@dimen/bottom_sheet_content_margin"
android:textAppearance="@style/TextAppearance.ListItemTitle" android:layout_marginRight="@dimen/bottom_sheet_content_margin"
tools:text="Some title" /> android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
tools:checked="true" />
</LinearLayout> </LinearLayout>
<com.google.android.material.switchmaterial.SwitchMaterial </androidx.cardview.widget.CardView>
android:id="@+id/switch_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="@dimen/bottom_sheet_content_margin"
android:layout_marginLeft="@dimen/bottom_sheet_content_margin"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
tools:checked="true" />
</LinearLayout> <androidx.cardview.widget.CardView
android:id="@+id/additional_button_container"
<LinearLayout
android:id="@+id/additional_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="horizontal"> app:cardCornerRadius="4dp"
app:cardElevation="0dp"
tools:cardBackgroundColor="?attr/switch_button_active">
<View <FrameLayout
android:layout_width="1dp" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginTop="@dimen/content_padding_half" android:background="?android:attr/selectableItemBackground">
android:layout_marginBottom="@dimen/content_padding_half"
android:background="?attr/divider_color_basic" />
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon_after_divider" android:id="@+id/additional_button_icon"
style="@style/Widget.AppCompat.Toolbar.Button.Navigation" android:layout_width="@dimen/favorites_icon_right_margin"
android:layout_width="@dimen/favorites_icon_right_margin" android:layout_height="@dimen/favorites_icon_right_margin"
android:layout_height="@dimen/favorites_icon_right_margin" android:layout_gravity="center"
android:layout_gravity="center" android:layout_marginStart="@dimen/content_padding"
android:layout_marginStart="@dimen/content_padding" android:layout_marginLeft="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding" android:layout_marginEnd="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding" android:layout_marginRight="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding" app:srcCompat="@drawable/ic_action_track_line_bold_color"
app:srcCompat="@drawable/ic_action_track_line_bold_color" /> tools:tint="?attr/active_color_basic" />
</LinearLayout> </FrameLayout>
</androidx.cardview.widget.CardView>
</LinearLayout> </LinearLayout>

View file

@ -52,7 +52,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/average_range" android:id="@+id/top_line_blocks"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
@ -171,7 +171,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/ascent_descent" android:id="@+id/bottom_line_blocks"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
@ -273,6 +273,7 @@
</LinearLayout> </LinearLayout>
<View <View
android:id="@+id/details_divider"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1dp" android:layout_height="1dp"
android:background="?attr/dashboard_divider" /> android:background="?attr/dashboard_divider" />

View file

@ -52,7 +52,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/distance_time_span" android:id="@+id/top_line_blocks"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
@ -171,7 +171,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/start_end_time" android:id="@+id/bottom_line_blocks"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
@ -291,6 +291,7 @@
</LinearLayout> </LinearLayout>
<View <View
android:id="@+id/details_divider"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1dp" android:layout_height="1dp"
android:background="?attr/dashboard_divider" /> android:background="?attr/dashboard_divider" />

View file

@ -52,7 +52,7 @@
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/average_max" android:id="@+id/top_line_blocks"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
@ -172,7 +172,7 @@
<LinearLayout <LinearLayout
android:id="@+id/time_distance" android:id="@+id/bottom_line_blocks"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
@ -275,6 +275,7 @@
</LinearLayout> </LinearLayout>
<View <View
android:id="@+id/details_divider"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1dp" android:layout_height="1dp"
android:background="?attr/dashboard_divider" /> android:background="?attr/dashboard_divider" />

View file

@ -4,7 +4,9 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<include layout="@layout/list_item_divider" /> <include
android:id="@+id/list_item_divider"
layout="@layout/list_item_divider" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="@dimen/context_menu_top_right_button_min_width"
android:minHeight="@dimen/setting_list_item_large_height"
app:cardCornerRadius="4dp"
app:cardElevation="0dp"
tools:cardBackgroundColor="?attr/switch_button_active">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackground"
android:gravity="center"
android:minWidth="@dimen/context_menu_top_right_button_min_width"
android:minHeight="@dimen/setting_list_item_large_height"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
android:layout_marginTop="@dimen/content_padding_small"
android:layout_marginBottom="@dimen/content_padding_small_half"
tools:srcCompat="@drawable/ic_action_close"
tools:tint="?attr/active_color_basic" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/button_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding_small_half"
android:layout_marginLeft="@dimen/content_padding_small_half"
android:layout_marginEnd="@dimen/content_padding_small_half"
android:layout_marginRight="@dimen/content_padding_small_half"
android:layout_marginBottom="@dimen/content_padding_small_half"
android:letterSpacing="@dimen/description_letter_spacing"
app:typeface="@string/font_roboto_medium"
tools:text="Title"
tools:textColor="?attr/active_color_basic" />
</LinearLayout>
</androidx.cardview.widget.CardView>

View file

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:baselineAligned="false"
android:minHeight="@dimen/setting_list_item_large_height"
android:orientation="horizontal">
<include
android:id="@+id/button_left"
layout="@layout/preference_button_with_icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:minWidth="@dimen/context_menu_top_right_button_min_width"
android:minHeight="@dimen/setting_list_item_large_height" />
<include
android:id="@+id/button_center_left"
layout="@layout/preference_button_with_icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_marginStart="@dimen/content_padding_half"
android:layout_marginLeft="@dimen/content_padding_half"
android:minWidth="@dimen/context_menu_top_right_button_min_width"
android:minHeight="@dimen/setting_list_item_large_height" />
<include
android:id="@+id/button_center_right"
layout="@layout/preference_button_with_icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/content_padding_half"
android:layout_weight="1"
android:layout_marginLeft="@dimen/content_padding_half"
android:minWidth="@dimen/context_menu_top_right_button_min_width"
android:minHeight="@dimen/setting_list_item_large_height" />
<include
android:id="@+id/button_right"
android:layout_weight="1"
layout="@layout/preference_button_with_icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/content_padding_half"
android:layout_marginLeft="@dimen/content_padding_half"
android:minWidth="@dimen/context_menu_top_right_button_min_width"
android:minHeight="@dimen/setting_list_item_large_height" />
</LinearLayout>

View file

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:baselineAligned="false"
android:minHeight="@dimen/setting_list_item_large_height"
android:orientation="horizontal">
<include
android:id="@+id/button_left"
layout="@layout/preference_button_with_icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:minWidth="@dimen/context_menu_top_right_button_min_width"
android:minHeight="@dimen/setting_list_item_large_height" />
<include
android:id="@+id/button_center"
layout="@layout/preference_button_with_icon"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/content_padding_half"
android:layout_marginLeft="@dimen/content_padding_half"
android:layout_weight="1"
android:minHeight="@dimen/setting_list_item_large_height" />
<include
android:id="@+id/button_right"
layout="@layout/preference_button_with_icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/content_padding_half"
android:layout_marginLeft="@dimen/content_padding_half"
android:minWidth="@dimen/context_menu_top_right_button_min_width"
android:minHeight="@dimen/setting_list_item_large_height" />
</LinearLayout>

View file

@ -1,172 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingTop="@dimen/content_padding_small"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingBottom="@dimen/content_padding_small"
android:weightSum="2">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:letterSpacing="@dimen/text_button_letter_spacing"
android:text="@string/monitoring_settings"
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_medium" />
<LinearLayout
android:id="@+id/status_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:clickable="true"
android:focusable="true"
android:gravity="end|center_vertical"
android:orientation="horizontal">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/text_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:letterSpacing="@dimen/description_letter_spacing"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:text="@string/recording_default_name"
tools:textColor="@color/icon_color_osmand_light" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon_status"
android:layout_width="@dimen/map_widget_icon"
android:layout_height="@dimen/map_widget_icon"
android:layout_marginStart="@dimen/content_padding_small"
android:layout_marginLeft="@dimen/content_padding_small"
tools:srcCompat="@drawable/ic_action_polygom_dark"
tools:tint="@color/icon_color_osmand_light" />
</LinearLayout>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/block_statistics"
android:layout_width="match_parent"
android:layout_height="@dimen/list_header_height"
android:layout_marginTop="@dimen/content_padding_small_half"
android:clipToPadding="false"
android:orientation="horizontal"
tools:itemCount="4"
tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_gpx_stat_block" />
<include
android:id="@+id/show_track_on_map"
layout="@layout/bottom_sheet_with_switch_divider_and_additional_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/content_padding_half"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:layout_marginBottom="@dimen/content_padding" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/dashboard_divider" />
<include
android:id="@+id/button_clear"
layout="@layout/bottom_sheet_button_with_icon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:layout_marginBottom="@dimen/content_padding" />
<include
android:id="@+id/button_online"
layout="@layout/bottom_sheet_button_with_icon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/content_padding_half"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:layout_marginBottom="@dimen/content_padding"
android:visibility="gone" />
<include
android:id="@+id/button_segment"
layout="@layout/bottom_sheet_button_with_icon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/content_padding_half"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding" />
<include
android:id="@+id/button_save"
layout="@layout/bottom_sheet_button_with_icon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/content_padding_small"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:layout_marginBottom="@dimen/content_padding" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/content_padding_half"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:layout_marginBottom="@dimen/content_padding"
android:baselineAligned="false"
android:orientation="horizontal"
android:weightSum="2">
<include
android:id="@+id/button_pause"
layout="@layout/bottom_sheet_button_with_icon"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<include
android:id="@+id/button_stop"
layout="@layout/bottom_sheet_button_with_icon"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_weight="1" />
</LinearLayout>
</LinearLayout>

View file

@ -1,117 +1,97 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:osmand="http://schemas.android.com/apk/res-auto" xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical"
android:paddingBottom="@dimen/content_padding">
<net.osmand.plus.widgets.TextViewEx <LinearLayout
android:id="@+id/title"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:letterSpacing="@dimen/text_button_letter_spacing" android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="@dimen/content_padding" android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding" android:paddingLeft="@dimen/content_padding"
android:paddingTop="@dimen/content_padding_small" android:paddingTop="@dimen/content_padding_small"
android:paddingEnd="@dimen/content_padding" android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding" android:paddingRight="@dimen/content_padding"
android:paddingBottom="@dimen/content_padding_small" android:paddingBottom="@dimen/content_padding"
android:text="@string/monitoring_settings" android:weightSum="2">
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_medium" /> <net.osmand.plus.widgets.TextViewEx
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:letterSpacing="@dimen/text_button_letter_spacing"
android:text="@string/monitoring_settings"
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_medium" />
<LinearLayout
android:id="@+id/status_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:clickable="true"
android:focusable="true"
android:gravity="end|center_vertical"
android:orientation="horizontal">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/text_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:letterSpacing="@dimen/description_letter_spacing"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:text="@string/recording_default_name"
tools:textColor="@color/icon_color_osmand_light" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon_status"
android:layout_width="@dimen/map_widget_icon"
android:layout_height="@dimen/map_widget_icon"
android:layout_marginStart="@dimen/content_padding_small"
android:layout_marginLeft="@dimen/content_padding_small"
tools:srcCompat="@drawable/ic_action_polygom_dark"
tools:tint="@color/icon_color_osmand_light" />
</LinearLayout>
</LinearLayout>
<include <include
android:id="@+id/show_track_on_map" android:id="@+id/show_track_on_map"
layout="@layout/bottom_sheet_with_switch_divider_and_additional_button" /> layout="@layout/bottom_sheet_with_switch_divider_and_additional_button"
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/dashboard_divider" />
<LinearLayout
android:id="@+id/interval_view_container"
android:background="?attr/selectableItemBackground"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:orientation="horizontal"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingTop="@dimen/bottom_sheet_content_margin"
android:paddingBottom="@dimen/bottom_sheet_content_margin"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/interval_value"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:textSize="@dimen/default_list_text_size"
tools:text="Interval value" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/up_down_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@null"
app:srcCompat="@drawable/ic_action_arrow_down" />
</LinearLayout>
<LinearLayout
android:id="@+id/always_ask_and_range_slider_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:layout_marginStart="@dimen/content_padding"
android:paddingStart="@dimen/content_padding" android:layout_marginLeft="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding" android:layout_marginEnd="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding" android:layout_marginRight="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"> android:layout_marginBottom="@dimen/context_menu_padding_margin_small" />
<com.google.android.material.slider.RangeSlider <LinearLayout
android:id="@+id/interval_slider" android:id="@+id/segments_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/save_track_interval_globally"
android:stepSize="1"
app:haloRadius="@dimen/content_padding_small"
app:labelBehavior="gone"
app:thumbColor="@color/profile_icon_color_blue_light"
app:thumbRadius="@dimen/content_padding_small_half"
app:trackColorActive="@color/profile_icon_color_blue_light"
app:trackColorInactive="#4D007EB3"
app:tickColorInactive="#007EB3"
app:trackHeight="@dimen/slider_track_height"
tools:visibility="visible" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/confirm_every_run"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:letterSpacing="@dimen/text_button_letter_spacing"
android:minHeight="@dimen/context_menu_buttons_bottom_height"
android:paddingLeft="@dimen/content_padding_small"
android:paddingRight="@dimen/content_padding_small"
android:text="@string/confirm_every_run"
android:textColor="?attr/color_dialog_buttons"
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_regular"
tools:visibility="visible" />
</LinearLayout>
<View
android:id="@+id/second_divider"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1dp" android:layout_height="wrap_content"
android:background="?attr/dashboard_divider" /> android:orientation="vertical" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/block_statistics"
android:layout_width="match_parent"
android:layout_height="@dimen/list_header_height"
android:layout_marginTop="@dimen/content_padding_small_half"
android:layout_marginBottom="@dimen/dialog_content_margin"
android:clipToPadding="false"
android:orientation="horizontal"
tools:itemCount="4"
tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_gpx_stat_block" />
<include layout="@layout/preference_button_with_icon_quadruple" />
</LinearLayout> </LinearLayout>

View file

@ -0,0 +1,111 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/content_padding">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:letterSpacing="@dimen/text_button_letter_spacing"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingTop="@dimen/content_padding_small"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingBottom="@dimen/content_padding_small"
android:text="@string/monitoring_settings"
android:textSize="@dimen/default_list_text_size"
app:typeface="@string/font_roboto_medium" />
<include
android:id="@+id/show_track_on_map"
layout="@layout/bottom_sheet_with_switch_divider_and_additional_button" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="@dimen/content_padding"
android:background="?attr/dashboard_divider" />
<LinearLayout
android:id="@+id/interval_view_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:background="?attr/selectableItemBackground"
android:orientation="horizontal"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingTop="@dimen/bottom_sheet_content_margin"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingBottom="@dimen/bottom_sheet_content_margin">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/interval_value"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:textSize="@dimen/default_list_text_size"
tools:text="Interval value" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/up_down_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@null"
app:srcCompat="@drawable/ic_action_arrow_down" />
</LinearLayout>
<LinearLayout
android:id="@+id/always_ask_and_range_slider_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding">
<com.google.android.material.slider.RangeSlider
android:id="@+id/interval_slider"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/save_track_interval_globally"
android:stepSize="1"
app:haloRadius="@dimen/content_padding_small"
app:labelBehavior="gone"
app:thumbColor="@color/profile_icon_color_blue_light"
app:thumbRadius="@dimen/content_padding_small_half"
app:tickColorInactive="#007EB3"
app:trackColorActive="@color/profile_icon_color_blue_light"
app:trackColorInactive="#4D007EB3"
app:trackHeight="@dimen/slider_track_height"
tools:visibility="visible" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/content_padding_small"
android:letterSpacing="@dimen/description_letter_spacing"
android:text="@string/trip_recording_logging_interval_info"
android:textColor="?attr/dialog_text_description_color" />
</LinearLayout>
<Space
android:layout_width="match_parent"
android:layout_height="@dimen/context_menu_first_line_top_margin" />
<include layout="@layout/preference_button_with_icon_triple" />
</LinearLayout>

View file

@ -3702,4 +3702,5 @@
<string name="poi_piste_ski_jump">القفز على الجليد</string> <string name="poi_piste_ski_jump">القفز على الجليد</string>
<string name="poi_geodesist">الجيوديسيا (شكل الأرض ومساحتها)</string> <string name="poi_geodesist">الجيوديسيا (شكل الأرض ومساحتها)</string>
<string name="poi_local_ref">المرجع المحلي</string> <string name="poi_local_ref">المرجع المحلي</string>
<string name="poi_piste">الزحلقه</string>
</resources> </resources>

View file

@ -1232,7 +1232,7 @@
<string name="poi_material_metal">Material: Metall</string> <string name="poi_material_metal">Material: Metall</string>
<string name="poi_material_steel">Material: Stahl</string> <string name="poi_material_steel">Material: Stahl</string>
<string name="poi_material_stone">Material: Stein</string> <string name="poi_material_stone">Material: Stein</string>
<string name="poi_material_plastic">Martial: Plastik</string> <string name="poi_material_plastic">Material: Plastik</string>
<string name="poi_material_sandstone">Material: Sandstein</string> <string name="poi_material_sandstone">Material: Sandstein</string>
<string name="poi_material_granite_stone">Material: Granit</string> <string name="poi_material_granite_stone">Material: Granit</string>
<string name="poi_material_metal_wood">Material: Metall, Holz</string> <string name="poi_material_metal_wood">Material: Metall, Holz</string>
@ -1479,7 +1479,7 @@
<string name="poi_material_reinforced_concrete">Material: Stahlbeton</string> <string name="poi_material_reinforced_concrete">Material: Stahlbeton</string>
<string name="poi_material_concrete">Material: Beton</string> <string name="poi_material_concrete">Material: Beton</string>
<string name="poi_material_masonry">Material: Mauerwerk</string> <string name="poi_material_masonry">Material: Mauerwerk</string>
<string name="poi_material_brick">Martial: Ziegel</string> <string name="poi_material_brick">Material: Ziegel</string>
<string name="poi_material_composite">Material: Verbundstoff</string> <string name="poi_material_composite">Material: Verbundstoff</string>
<string name="poi_material_limestone">Material: Kalkstein</string> <string name="poi_material_limestone">Material: Kalkstein</string>
<string name="poi_material_marble">Material: Marmor</string> <string name="poi_material_marble">Material: Marmor</string>

View file

@ -1873,7 +1873,6 @@
<string name="total_distance">Συνολική απόσταση</string> <string name="total_distance">Συνολική απόσταση</string>
<string name="routing_attr_relief_smoothness_factor_name">Επιλέξτε διακύμανση ανύψωσης</string> <string name="routing_attr_relief_smoothness_factor_name">Επιλέξτε διακύμανση ανύψωσης</string>
<string name="routing_attr_height_obstacles_name">Χρήση υψομετρικών δεδομένων</string> <string name="routing_attr_height_obstacles_name">Χρήση υψομετρικών δεδομένων</string>
<string name="rendering_attr_depthContours_description">Εμφάνιση ισοβαθών καμπυλών και σημείων.</string> <string name="rendering_attr_depthContours_description">Εμφάνιση ισοβαθών καμπυλών και σημείων.</string>
<string name="rendering_attr_depthContours_name">Ναυτικές ισοβαθείς καμπύλες</string> <string name="rendering_attr_depthContours_name">Ναυτικές ισοβαθείς καμπύλες</string>
<string name="auto_split_recording_title">Αυτόματος διαχωρισμός καταγραφών μετά από κενό</string> <string name="auto_split_recording_title">Αυτόματος διαχωρισμός καταγραφών μετά από κενό</string>
@ -2516,7 +2515,7 @@
<string name="commit_poi">Υποβολή ΣΕ</string> <string name="commit_poi">Υποβολή ΣΕ</string>
<string name="tab_title_basic">Βασικό</string> <string name="tab_title_basic">Βασικό</string>
<string name="tab_title_advanced">Προχωρημένο</string> <string name="tab_title_advanced">Προχωρημένο</string>
<string name="building_number">Αριθμός κτιρίου</string> <string name="building_number">Αριθμός κτηρίου</string>
<string name="next_proceed">Επόμενο</string> <string name="next_proceed">Επόμενο</string>
<string name="opening_at">Άνοιγμα στις</string> <string name="opening_at">Άνοιγμα στις</string>
<string name="closing_at">Κλείσιμο στις</string> <string name="closing_at">Κλείσιμο στις</string>

View file

@ -4045,4 +4045,7 @@
<string name="shared_string_interval">Intertempo</string> <string name="shared_string_interval">Intertempo</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">Kaŝi limojn de naturaj rezervejoj, protektataj areoj kaj naciaj parkoj</string> <string name="rendering_attr_noNatureReserveBoundaries_description">Kaŝi limojn de naturaj rezervejoj, protektataj areoj kaj naciaj parkoj</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">Limoj de rezervejoj</string> <string name="rendering_attr_noNatureReserveBoundaries_name">Limoj de rezervejoj</string>
<string name="trip_recording_logging_interval_info">Agordita periodo de intertempo de registrado, dum kiu OsmAnd petos la nunajn poziciajn datumojn.</string>
<string name="lost_data_warning">Ĉiuj nekonservitaj datumoj perdiĝos.</string>
<string name="trip_recording_save_and_continue">Konservi kaj daŭrigi</string>
</resources> </resources>

View file

@ -4032,9 +4032,9 @@
<string name="updated">Actualizado: %s</string> <string name="updated">Actualizado: %s</string>
<string name="last_time_checked">Última comprobación: %s</string> <string name="last_time_checked">Última comprobación: %s</string>
<string name="update_frequency">Frecuencia de actualización</string> <string name="update_frequency">Frecuencia de actualización</string>
<string name="live_update_frequency_week_variant">Las actualizaciones del mapa serán comprobadas cada semana. La próxima vez %1$s en %2$s.</string> <string name="live_update_frequency_week_variant">Las actualizaciones del mapa serán comprobadas cada semana. Próxima vez el %1$s a las %2$s hs.</string>
<string name="live_update_frequency_day_variant">Las actualizaciones del mapa serán comprobadas cada día. La próxima vez %1$s en %2$s.</string> <string name="live_update_frequency_day_variant">Las actualizaciones del mapa serán comprobadas cada día. Próxima vez el %1$s a las %2$s hs.</string>
<string name="live_update_frequency_hour_variant">Las actualizaciones del mapa serán comprobadas cada hora. La próxima vez %1$s en %2$s.</string> <string name="live_update_frequency_hour_variant">Las actualizaciones del mapa serán comprobadas cada hora. Próxima vez el %1$s a las %2$s hs.</string>
<string name="delete_updates">Borrar actualizaciones</string> <string name="delete_updates">Borrar actualizaciones</string>
<string name="live_update_delete_updates_msg">¿Borrar todas las actualizaciones en vivo de «%s»\?</string> <string name="live_update_delete_updates_msg">¿Borrar todas las actualizaciones en vivo de «%s»\?</string>
<string name="purchases">Compras</string> <string name="purchases">Compras</string>
@ -4045,4 +4045,6 @@
<string name="track_has_no_altitude">La traza no contiene datos de altitud.</string> <string name="track_has_no_altitude">La traza no contiene datos de altitud.</string>
<string name="track_has_no_speed">La traza no contiene datos de velocidad.</string> <string name="track_has_no_speed">La traza no contiene datos de velocidad.</string>
<string name="select_another_colorization">Elige otro tipo de color.</string> <string name="select_another_colorization">Elige otro tipo de color.</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">Fronteras naturales</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">Oculta fronteras de reservas naturales, áreas protegidas y parques nacionales</string>
</resources> </resources>

View file

@ -380,7 +380,7 @@
<string name="error_avoid_specific_road">No se ha encontrado un desvío</string> <string name="error_avoid_specific_road">No se ha encontrado un desvío</string>
<string name="map_update">Actualización disponible para %1$s mapa(s)</string> <string name="map_update">Actualización disponible para %1$s mapa(s)</string>
<string name="wake_on_voice">Encender pantalla</string> <string name="wake_on_voice">Encender pantalla</string>
<string name="osmand_rastermaps_plugin_description">Accede a tantos tipos de mapas en línea (llamados teselas o ráster) que desees, desde teselas predefinidas de OSM (como Mapnik) a imágenes satelitales y capas de propósito especial como mapas del tiempo, mapas del clima, mapas geológicos, capas de sombreado, etc. <string name="osmand_rastermaps_plugin_description">Accede a tantos tipos de mapas en línea (llamados teselas o ráster) que desees, desde teselas predefinidas de OSM (como Mapnik) a imágenes satelitales y capas de propósito especial como mapas meteorológicos, mapas del clima, mapas geológicos, capas de sombreado, etc.
\n \n
\nCualquiera de estos mapas puede usarse como el mapa predefinido que se mostrará, o como una superposición o subyacencia de otro mapa base (como los mapas estándar de OsmAnd en línea). Ciertos elementos de los mapas vectoriales de OsmAnd pueden ocultarse a través del menú «Configurar mapa» para hacer cualquier subyacencia mas visible. \nCualquiera de estos mapas puede usarse como el mapa predefinido que se mostrará, o como una superposición o subyacencia de otro mapa base (como los mapas estándar de OsmAnd en línea). Ciertos elementos de los mapas vectoriales de OsmAnd pueden ocultarse a través del menú «Configurar mapa» para hacer cualquier subyacencia mas visible.
\n \n
@ -418,7 +418,7 @@
<string name="osmand_parking_plugin_description">Registra dónde se ha estacionado el automóvil, incluyendo cuánto tiempo queda. <string name="osmand_parking_plugin_description">Registra dónde se ha estacionado el automóvil, incluyendo cuánto tiempo queda.
\n Tanto la ubicación como el tiempo del estacionamiento se muestran en el menú principal y en un widget sobre el mapa. Se puede añadir una alarma de recordatorio al calendario de Android.</string> \n Tanto la ubicación como el tiempo del estacionamiento se muestran en el menú principal y en un widget sobre el mapa. Se puede añadir una alarma de recordatorio al calendario de Android.</string>
<string name="osmand_distance_planning_plugin_description">Crea caminos pulsando el mapa, usando o modificando archivos GPX existentes, para planificar un viaje y medir la distancia entre puntos. El resultado puede guardarse como un archivo GPX y usarse luego para la orientación.</string> <string name="osmand_distance_planning_plugin_description">Crea caminos pulsando el mapa, usando o modificando archivos GPX existentes, para planificar un viaje y medir la distancia entre puntos. El resultado puede guardarse como un archivo GPX y usarse luego para la orientación.</string>
<string name="osmand_accessibility_description">Activa las funciones de accesibilidad del dispositivo, directamente en OsmAnd. Facilita por ejemplo, el ajuste de la velocidad de la voz para voces de texto a voz, la configuración de navegación D-pad, usando la rueda de desplazamiento para el control del zoom, o la retroalimentación de texto a voz, por ejemplo, para anunciar la ubicación automáticamente.</string> <string name="osmand_accessibility_description">Activa las funciones de accesibilidad del dispositivo, directamente en OsmAnd. Facilita por ejemplo, el ajuste de la velocidad de la voz para voces de texto a voz, la configuración de navegación del pad direccional, usando la rueda de desplazamiento para el control del zoom, o la retroalimentación de texto a voz, por ejemplo, para anunciar la ubicación automáticamente.</string>
<string name="osm_editing_plugin_description">Haz contribuciones en OSM, como el crear o modificar objetos PDI, abrir o comentar notas de OSM y contribuir con archivos de trazas GPX grabados en OsmAnd, proporcionando tu nombre de usuario y contraseña. OpenStreetMap.org es un proyecto de mapeo de dominio público, global, libre e impulsado por la comunidad.</string> <string name="osm_editing_plugin_description">Haz contribuciones en OSM, como el crear o modificar objetos PDI, abrir o comentar notas de OSM y contribuir con archivos de trazas GPX grabados en OsmAnd, proporcionando tu nombre de usuario y contraseña. OpenStreetMap.org es un proyecto de mapeo de dominio público, global, libre e impulsado por la comunidad.</string>
<string name="osmand_development_plugin_description">Ajusta las funciones de desarrollo y depuración, como la simulación de navegación, el rendimiento del renderizado o las indicaciones por voz. Destinado para desarrolladores, no es necesario para el normal uso de la aplicación.</string> <string name="osmand_development_plugin_description">Ajusta las funciones de desarrollo y depuración, como la simulación de navegación, el rendimiento del renderizado o las indicaciones por voz. Destinado para desarrolladores, no es necesario para el normal uso de la aplicación.</string>
<string name="world_ski_missing">Descargar el mapa especial sin conexión para mostrar las instalaciones de esquí.</string> <string name="world_ski_missing">Descargar el mapa especial sin conexión para mostrar las instalaciones de esquí.</string>
@ -1057,7 +1057,7 @@
<string name="city_type_suburb">Suburbio</string> <string name="city_type_suburb">Suburbio</string>
<string name="city_type_hamlet">Aldea</string> <string name="city_type_hamlet">Aldea</string>
<string name="city_type_village">Villa</string> <string name="city_type_village">Villa</string>
<string name="city_type_town">Pueblo</string> <string name="city_type_town">Ciudad pequeña</string>
<string name="city_type_city">Ciudad</string> <string name="city_type_city">Ciudad</string>
<string name="animate_route_off">Parar simulación</string> <string name="animate_route_off">Parar simulación</string>
<string name="animate_route">Iniciar simulación</string> <string name="animate_route">Iniciar simulación</string>
@ -1662,7 +1662,7 @@
<string name="shared_string_navigation">Navegación</string> <string name="shared_string_navigation">Navegación</string>
<string name="osmand_running_in_background">Ejecutar en modo reposo</string> <string name="osmand_running_in_background">Ejecutar en modo reposo</string>
<string name="favourites_edit_dialog_title">Información del favorito</string> <string name="favourites_edit_dialog_title">Información del favorito</string>
<string name="favourites_context_menu_add">Añadir a Favoritos</string> <string name="favourites_context_menu_add">Añadir favorito</string>
<string name="roads">Caminos</string> <string name="roads">Caminos</string>
<string name="default_speed_system_descr">Define la unidad de velocidad.</string> <string name="default_speed_system_descr">Define la unidad de velocidad.</string>
<string name="default_speed_system">Unidad de velocidad</string> <string name="default_speed_system">Unidad de velocidad</string>
@ -2667,7 +2667,7 @@
<string name="shared_string_wikivoyage">Wikiviajes</string> <string name="shared_string_wikivoyage">Wikiviajes</string>
<string name="index_item_world_wikivoyage">Artículos de Wikiviajes en todo el mundo</string> <string name="index_item_world_wikivoyage">Artículos de Wikiviajes en todo el mundo</string>
<string name="online_webpage_warning">La página sólo está disponible en línea. ¿Abrirla en el navegador web?</string> <string name="online_webpage_warning">La página sólo está disponible en línea. ¿Abrirla en el navegador web?</string>
<string name="images_cache">Caché de imágenes</string> <string name="images_cache">Almacén de imágenes</string>
<string name="delete_search_history">Borrar historial de búsquedas</string> <string name="delete_search_history">Borrar historial de búsquedas</string>
<string name="show_images">Mostrar imágenes</string> <string name="show_images">Mostrar imágenes</string>
<string name="shared_string_dont">No</string> <string name="shared_string_dont">No</string>
@ -3301,7 +3301,7 @@
<string name="select_color">Elegir el color</string> <string name="select_color">Elegir el color</string>
<string name="edit_profiles_descr">Los perfiles predefinidos de OsmAnd no se pueden borrar, sino desactivar (en la pantalla anterior) u ordenarse en la parte inferior.</string> <string name="edit_profiles_descr">Los perfiles predefinidos de OsmAnd no se pueden borrar, sino desactivar (en la pantalla anterior) u ordenarse en la parte inferior.</string>
<string name="edit_profiles">Editar perfiles</string> <string name="edit_profiles">Editar perfiles</string>
<string name="select_nav_profile_dialog_message">El «Tipo de navegación» rige la forma en que se calculan las rutas.</string> <string name="select_nav_profile_dialog_message">El «Tipo de navegación» determina cómo se calculan las rutas.</string>
<string name="profile_appearance">Aspecto del perfil</string> <string name="profile_appearance">Aspecto del perfil</string>
<string name="choose_icon_color_name">Icono, color y nombre</string> <string name="choose_icon_color_name">Icono, color y nombre</string>
<string name="reorder_profiles">Editar la lista de perfiles</string> <string name="reorder_profiles">Editar la lista de perfiles</string>
@ -3530,7 +3530,7 @@
<string name="search_poi_types">Buscar por tipos de PDI</string> <string name="search_poi_types">Buscar por tipos de PDI</string>
<string name="radius_ruler_item">Regla radial</string> <string name="radius_ruler_item">Regla radial</string>
<string name="quick_action_item">Acción rápida</string> <string name="quick_action_item">Acción rápida</string>
<string name="osmand_purchases_item">Compras de OsmAnd</string> <string name="osmand_purchases_item">Compras en OsmAnd</string>
<string name="osm_live_payment_subscription_management">El pago será cargado a la cuenta de Google Play al confirmar la compra. <string name="osm_live_payment_subscription_management">El pago será cargado a la cuenta de Google Play al confirmar la compra.
\n \n
\nLa suscripción se renueva automáticamente a menos que se cancele antes de la fecha de renovación. Se le cobrará a su cuenta el período de renovación (mes/trimestre/año) sólo en la fecha de renovación. \nLa suscripción se renueva automáticamente a menos que se cancele antes de la fecha de renovación. Se le cobrará a su cuenta el período de renovación (mes/trimestre/año) sólo en la fecha de renovación.
@ -3561,7 +3561,7 @@
<string name="lang_ky">Kirguís</string> <string name="lang_ky">Kirguís</string>
<string name="lang_kk">Kazajo</string> <string name="lang_kk">Kazajo</string>
<string name="lang_jv">Javanés</string> <string name="lang_jv">Javanés</string>
<string name="lang_gu">Gujarati</string> <string name="lang_gu">Gujaratí</string>
<string name="lang_cv">Chuvash</string> <string name="lang_cv">Chuvash</string>
<string name="lang_ce">Checheno</string> <string name="lang_ce">Checheno</string>
<string name="lang_bar">Bávaro</string> <string name="lang_bar">Bávaro</string>
@ -3905,7 +3905,7 @@
<string name="plan_route_add_new_segment">Añadir nuevo segmento</string> <string name="plan_route_add_new_segment">Añadir nuevo segmento</string>
<string name="ltr_or_rtl_combine_via_star">%1$s * %2$s</string> <string name="ltr_or_rtl_combine_via_star">%1$s * %2$s</string>
<string name="lang_de_casual">Alemán (casual)</string> <string name="lang_de_casual">Alemán (casual)</string>
<string name="app_mode_light_aircraft">Avión ligero</string> <string name="app_mode_light_aircraft">Aeronave ligera</string>
<string name="shared_string_last_used">Usado por última vez</string> <string name="shared_string_last_used">Usado por última vez</string>
<string name="routing_attr_prefer_hiking_routes_name">Preferir rutas de senderismo</string> <string name="routing_attr_prefer_hiking_routes_name">Preferir rutas de senderismo</string>
<string name="routing_attr_prefer_hiking_routes_description">Prefiere rutas de senderismo</string> <string name="routing_attr_prefer_hiking_routes_description">Prefiere rutas de senderismo</string>
@ -4006,4 +4006,45 @@
<string name="activity_type_hiking_name">Senderismo</string> <string name="activity_type_hiking_name">Senderismo</string>
<string name="activity_type_cycling_name">Bicicleta</string> <string name="activity_type_cycling_name">Bicicleta</string>
<string name="activity_type_car_name">Automóvil</string> <string name="activity_type_car_name">Automóvil</string>
<string name="select_segments">Elegir segmentos</string>
<string name="select_segments_description">«%1$s» contiene más de un segmento, debe marcar la parte necesaria para la navegación.</string>
<string name="segments_count">Segmento %1$d</string>
<string name="temporary_conditional_routing_descr">Usar las restricciones viales que están activas ahora en el mapa</string>
<string name="routing_attr_short_way_description">Ruta optimizada más corta (bajo consumo)</string>
<string name="routing_attr_driving_style_description">Elige el propósito de la conducción para obtener la ruta más corta, más rápida o más segura</string>
<string name="snap_to_road_descr">El icono de la ubicación actual se ajustará a la ruta de navegación actual</string>
<string name="map_orientation_threshold_descr">No girar la vista del mapa si la velocidad es inferior a un umbral</string>
<string name="restart">Reiniciar</string>
<string name="shared_strings_all_regions">Todas las regiones</string>
<string name="delete_number_files_question">¿Borrar %1$d archivos\?</string>
<string name="track_recording_stop_without_saving">Parar sin guardar</string>
<string name="track_recording_save_and_stop">Guardar y parar la grabación</string>
<string name="track_recording_title">Grabación de la traza detenida</string>
<string name="track_recording_description">¿Dejar de grabar\?
\nTodos los datos no guardados se perderán.</string>
<string name="on_pause">En pausa</string>
<string name="app_restart_required">Es necesario reiniciar la aplicación para aplicar algunos ajustes.</string>
<string name="routing_attr_height_obstacles_description">La ruta podría evitar las fuertes subidas.</string>
<string name="quick_action_coordinates_widget_descr">Alternar para mostrar u ocultar el widget de coordenadas en el mapa.</string>
<string name="map_widget_distance_by_tap">Distancia al pulsar</string>
<string name="latest_openstreetmap_update">Última actualización de OpenStreetMap disponible:</string>
<string name="updated">Actualizado: %s</string>
<string name="last_time_checked">Última comprobación: %s</string>
<string name="update_frequency">Frecuencia de actualización</string>
<string name="live_update_frequency_week_variant">Las actualizaciones del mapa serán comprobadas cada semana. Próxima vez el %1$s a las %2$s hs.</string>
<string name="live_update_frequency_day_variant">Las actualizaciones del mapa serán comprobadas cada día. Próxima vez el %1$s a las %2$s hs.</string>
<string name="live_update_frequency_hour_variant">Las actualizaciones del mapa serán comprobadas cada hora. Próxima vez el %1$s a las %2$s hs.</string>
<string name="delete_updates">Borrar actualizaciones</string>
<string name="live_update_delete_updates_msg">¿Borrar todas las actualizaciones en vivo de «%s»\?</string>
<string name="purchases">Compras</string>
<string name="select_category_descr">Marca una categoría o añade una nueva</string>
<string name="track_recording_will_be_continued">La grabación continuará.</string>
<string name="copy_poi_name">Copiar nombre del PDI</string>
<string name="quick_action_show_hide_title">Mostrar/Ocultar</string>
<string name="shared_string_interval">Intervalo</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">Oculta fronteras de reservas naturales, áreas protegidas y parques nacionales</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">Fronteras naturales</string>
<string name="track_has_no_altitude">La traza no contiene datos de altitud.</string>
<string name="track_has_no_speed">La traza no contiene datos de velocidad.</string>
<string name="select_another_colorization">Elige otro tipo de color.</string>
</resources> </resources>

View file

@ -3925,9 +3925,9 @@
<string name="upload_photo_completed">Sai üleslaaditud</string> <string name="upload_photo_completed">Sai üleslaaditud</string>
<string name="upload_photo">Laadin üles</string> <string name="upload_photo">Laadin üles</string>
<string name="activity_type_offroad_name">Maastikul</string> <string name="activity_type_offroad_name">Maastikul</string>
<string name="live_update_frequency_week_variant">Kaardi värskendusi kontrollitakse kord nädalas. Järgmine kord %1$s %2$s.</string> <string name="live_update_frequency_week_variant">Kaardi värskendusi kontrollitakse kord nädalas. Järgmine kord: %1$s %2$s.</string>
<string name="live_update_frequency_day_variant">Kaardi värskendusi kontrollitakse kord päevas. Järgmine kord %1$s %2$s.</string> <string name="live_update_frequency_day_variant">Kaardi värskendusi kontrollitakse kord päevas. Järgmine kord: %1$s %2$s.</string>
<string name="live_update_frequency_hour_variant">Kaardi värskendusi kontrollitakse kord tunnis. Järgmine kord %1$s %2$s.</string> <string name="live_update_frequency_hour_variant">Kaardi värskendusi kontrollitakse kord tunnis. Järgmine kord: %1$s %2$s.</string>
<string name="voice_prompts_timetable">Häälteavituste ajad</string> <string name="voice_prompts_timetable">Häälteavituste ajad</string>
<string name="routing_attr_prefer_hiking_routes_description">Eelista matkaradu</string> <string name="routing_attr_prefer_hiking_routes_description">Eelista matkaradu</string>
<string name="routing_attr_prefer_hiking_routes_name">Eelista matkaradu</string> <string name="routing_attr_prefer_hiking_routes_name">Eelista matkaradu</string>
@ -4052,4 +4052,6 @@
<string name="map_widget_distance_by_tap">Kaugus toksamise järgi</string> <string name="map_widget_distance_by_tap">Kaugus toksamise järgi</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">Peida (loodus)kaitsealade ja rahvusparkide piirid</string> <string name="rendering_attr_noNatureReserveBoundaries_description">Peida (loodus)kaitsealade ja rahvusparkide piirid</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">Looduse piirid</string> <string name="rendering_attr_noNatureReserveBoundaries_name">Looduse piirid</string>
<string name="trip_recording_save_and_continue">Salvesta ja jätka</string>
<string name="lost_data_warning">Kõik salvestamata andmed lähevad kaotsi.</string>
</resources> </resources>

View file

@ -8,10 +8,10 @@
<string name="poi_beverages">فروشگاه نوشیدنی</string> <string name="poi_beverages">فروشگاه نوشیدنی</string>
<string name="poi_butcher">فروشگاه گوشت</string> <string name="poi_butcher">فروشگاه گوشت</string>
<string name="poi_deli">بقالی</string> <string name="poi_deli">بقالی</string>
<string name="poi_farm">فروشگاه محصولات دامی</string> <string name="poi_farm">فروشگاه محصولات مزرعه</string>
<string name="poi_greengrocer">میوه و سبزی‌فروشی</string> <string name="poi_greengrocer">میوه و سبزی‌فروشی</string>
<string name="poi_seafood">فروشگاه غذاهای دریایی</string> <string name="poi_seafood">فروشگاه غذاهای دریایی</string>
<string name="poi_confectionery">شیرینی و آجیل فروشی</string> <string name="poi_confectionery">شیرینی و آب‌نبات فروشی</string>
<string name="poi_ice_cream">بستنی فروشی</string> <string name="poi_ice_cream">بستنی فروشی</string>
<string name="poi_supermarket">فروشگاه بزرگ</string> <string name="poi_supermarket">فروشگاه بزرگ</string>
<string name="poi_tea">فروشگاه چای</string> <string name="poi_tea">فروشگاه چای</string>
@ -19,18 +19,18 @@
<string name="poi_vending_machine">دستگاه فروش خودکار</string> <string name="poi_vending_machine">دستگاه فروش خودکار</string>
<string name="poi_books">کتابفروشی</string> <string name="poi_books">کتابفروشی</string>
<string name="poi_bicycle">فروشگاه دوچرخه</string> <string name="poi_bicycle">فروشگاه دوچرخه</string>
<string name="poi_anime">فروشگاه کارتون</string> <string name="poi_anime">فروشگاه انیمه</string>
<string name="poi_antiques">عتیقه فروشی</string> <string name="poi_antiques">عتیقه فروشی</string>
<string name="poi_art">فروشگاه هنر</string> <string name="poi_art">فروشگاه هنر</string>
<string name="poi_baby_goods">کالای کودک</string> <string name="poi_baby_goods">کالای کودک</string>
<string name="poi_bag">فروشگاه کیف</string> <string name="poi_bag">کیف فروشی</string>
<string name="poi_bathroom_furnishing">لوازم حمام</string> <string name="poi_bathroom_furnishing">لوازم حمام</string>
<string name="poi_bed">مبلمان اتاق خواب</string> <string name="poi_bed">مبلمان اتاق خواب</string>
<string name="poi_boutique">بوتیک</string> <string name="poi_boutique">بوتیک</string>
<string name="poi_carpet">فروشگاه فرش</string> <string name="poi_carpet">فرش فروشی</string>
<string name="poi_chemist">فروشگاه محصولات بهداشتی و آرایشی</string> <string name="poi_chemist">فروشگاه محصولات بهداشتی و آرایشی</string>
<string name="poi_clothes">فروشگاه پوشاک</string> <string name="poi_clothes">فروشگاه پوشاک</string>
<string name="poi_clothes_children">\فروشگاه پوشاک کودکان</string> <string name="poi_clothes_children">فروشگاه پوشاک کودک</string>
<string name="poi_shoes">کفش فروشی</string> <string name="poi_shoes">کفش فروشی</string>
<string name="poi_computer">فروشگاه کامپیوتر</string> <string name="poi_computer">فروشگاه کامپیوتر</string>
<string name="poi_copyshop">فروشگاه چاپ و تکثیر</string> <string name="poi_copyshop">فروشگاه چاپ و تکثیر</string>
@ -63,7 +63,7 @@
<string name="poi_musical_instrument">فروشگاه لوزم موسیقی</string> <string name="poi_musical_instrument">فروشگاه لوزم موسیقی</string>
<string name="poi_newsagent">روزنامه فروشی</string> <string name="poi_newsagent">روزنامه فروشی</string>
<string name="poi_optician">عینک سازی</string> <string name="poi_optician">عینک سازی</string>
<string name="poi_organic">مواد غذایی ارگانیک</string> <string name="poi_organic">محصولات ارگانیک</string>
<string name="poi_outdoor">بازار روز</string> <string name="poi_outdoor">بازار روز</string>
<string name="poi_paint">رنگ فروشی</string> <string name="poi_paint">رنگ فروشی</string>
<string name="poi_pet">فروشگاه حیوانات خانگی</string> <string name="poi_pet">فروشگاه حیوانات خانگی</string>
@ -72,8 +72,8 @@
<string name="poi_ship_chandler">کشتی</string> <string name="poi_ship_chandler">کشتی</string>
<string name="poi_sports">لوازم ورزشی</string> <string name="poi_sports">لوازم ورزشی</string>
<string name="poi_stationery">فروشگاه نوشت افزار</string> <string name="poi_stationery">فروشگاه نوشت افزار</string>
<string name="poi_tableware">فروشگاه کارد و چنگال</string> <string name="poi_tableware">فروشگاه ظروف غذاخوری</string>
<string name="poi_ticket">فروشگاه بلیط</string> <string name="poi_ticket">بلیت فروشی</string>
<string name="poi_tobacco">دخانیات</string> <string name="poi_tobacco">دخانیات</string>
<string name="poi_toys">اسباب بازی فروشی</string> <string name="poi_toys">اسباب بازی فروشی</string>
<string name="poi_trade"/> <string name="poi_trade"/>
@ -121,7 +121,7 @@
<string name="poi_vehicle_inspection">معاینه فنی خودرو</string> <string name="poi_vehicle_inspection">معاینه فنی خودرو</string>
<string name="poi_car_wash">کارواش</string> <string name="poi_car_wash">کارواش</string>
<string name="poi_fuel">جایگاه سوخت; جایگاه سوخت‌گیری; پمپ بنزین; پمپ گاز</string> <string name="poi_fuel">جایگاه سوخت; جایگاه سوخت‌گیری; پمپ بنزین; پمپ گاز</string>
<string name="poi_electricity_combined_charging">ایستگاه شارژ</string> <string name="poi_electricity_combined_charging">ایستگاه شارژ; ایستگاه شارژ خودروی برقی</string>
<string name="poi_vehicle_ramp">سطح شیب دار خودرو</string> <string name="poi_vehicle_ramp">سطح شیب دار خودرو</string>
<string name="poi_compressed_air">هوای فشرده</string> <string name="poi_compressed_air">هوای فشرده</string>
<string name="poi_parking">پارکینگ</string> <string name="poi_parking">پارکینگ</string>
@ -196,7 +196,7 @@
<string name="poi_pier">اسکله</string> <string name="poi_pier">اسکله</string>
<string name="poi_surveillance">نظارت</string> <string name="poi_surveillance">نظارت</string>
<string name="poi_observatory">رصد خانه</string> <string name="poi_observatory">رصد خانه</string>
<string name="poi_astronomical_observatory">رصدخانه نجوم</string> <string name="poi_astronomical_observatory">نجومی</string>
<string name="poi_construction">ساخت و ساز</string> <string name="poi_construction">ساخت و ساز</string>
<string name="poi_works">کارگاه</string> <string name="poi_works">کارگاه</string>
<string name="poi_mineshaft">معدن</string> <string name="poi_mineshaft">معدن</string>
@ -317,7 +317,7 @@
<string name="poi_ice_skating">اسکیت روی یخ</string> <string name="poi_ice_skating">اسکیت روی یخ</string>
<string name="poi_ice_stock">زمین یخ</string> <string name="poi_ice_stock">زمین یخ</string>
<string name="poi_korfbal">زمین بسکتبال اسکاتلندی</string> <string name="poi_korfbal">زمین بسکتبال اسکاتلندی</string>
<string name="poi_sport_motor">پیست موتور سواری</string> <string name="poi_sport_motor">ورزش موتورسواری</string>
<string name="poi_sport_multi">چندورزشی</string> <string name="poi_sport_multi">چندورزشی</string>
<string name="poi_orienteering">ورزش جهت یابی</string> <string name="poi_orienteering">ورزش جهت یابی</string>
<string name="poi_paddle_tennis">تنیس پدالی</string> <string name="poi_paddle_tennis">تنیس پدالی</string>
@ -428,11 +428,11 @@
<string name="poi_club_tourism">باشگاه گردشگری</string> <string name="poi_club_tourism">باشگاه گردشگری</string>
<string name="poi_club_charity">کلوپ خیریه</string> <string name="poi_club_charity">کلوپ خیریه</string>
<string name="poi_library">کتابخانه</string> <string name="poi_library">کتابخانه</string>
<string name="poi_arts_centre">مرکز هنر</string> <string name="poi_arts_centre">مرکز هنری</string>
<string name="poi_cinema">سینما</string> <string name="poi_cinema">سینما</string>
<string name="poi_casino">کازینو</string> <string name="poi_casino">کازینو</string>
<string name="poi_community_centre">مرکز اجتماع</string> <string name="poi_community_centre">مرکز اجتماع</string>
<string name="poi_social_centre">مرکز سوسیال</string> <string name="poi_social_centre">مرکز اجتماعی</string>
<string name="poi_theatre">تئاتر</string> <string name="poi_theatre">تئاتر</string>
<string name="poi_theatre_genre_circus">سیرک</string> <string name="poi_theatre_genre_circus">سیرک</string>
<string name="poi_dance_floor">رقص</string> <string name="poi_dance_floor">رقص</string>
@ -446,7 +446,7 @@
<string name="poi_marina">لنگرگاه تفریحی</string> <string name="poi_marina">لنگرگاه تفریحی</string>
<string name="poi_miniature_golf">گلف کوچک</string> <string name="poi_miniature_golf">گلف کوچک</string>
<string name="poi_playground">زمین بازی</string> <string name="poi_playground">زمین بازی</string>
<string name="poi_swimming_pool">استخر</string> <string name="poi_swimming_pool">استخر شنا</string>
<string name="poi_water_park">پارک آبی</string> <string name="poi_water_park">پارک آبی</string>
<string name="poi_park">پارک</string> <string name="poi_park">پارک</string>
<string name="poi_cafe">کافه</string> <string name="poi_cafe">کافه</string>
@ -509,7 +509,7 @@
<string name="poi_funeral_directors">قبرکن</string> <string name="poi_funeral_directors">قبرکن</string>
<string name="poi_craft_computer">صنایع کامپیوتر</string> <string name="poi_craft_computer">صنایع کامپیوتر</string>
<string name="poi_beauty">سالن زیبایی</string> <string name="poi_beauty">سالن زیبایی</string>
<string name="poi_beauty_salon_nails">کاشت ناخن</string> <string name="poi_beauty_salon_nails">کاشت ناخن; مانیکور</string>
<string name="poi_hairdresser">آرایشگر</string> <string name="poi_hairdresser">آرایشگر</string>
<string name="poi_massage">سالن ماساژ</string> <string name="poi_massage">سالن ماساژ</string>
<string name="poi_tattoo">سالن تاتو</string> <string name="poi_tattoo">سالن تاتو</string>
@ -519,7 +519,7 @@
<string name="poi_car_sharing">جمعه بازار خودرو</string> <string name="poi_car_sharing">جمعه بازار خودرو</string>
<string name="poi_boat_sharing">جمعه بازار قایق</string> <string name="poi_boat_sharing">جمعه بازار قایق</string>
<string name="poi_dock">بارانداز</string> <string name="poi_dock">بارانداز</string>
<string name="poi_toilets">سرویس بهداشتی</string> <string name="poi_toilets">سرویس بهداشتی; دستشویی; مستراح</string>
<string name="poi_sauna">سونا</string> <string name="poi_sauna">سونا</string>
<string name="poi_brothel"/> <string name="poi_brothel"/>
<string name="poi_mortuary">سردخانه مردگان</string> <string name="poi_mortuary">سردخانه مردگان</string>
@ -667,7 +667,7 @@
<string name="poi_clock_option">تنظیمات ساعت</string> <string name="poi_clock_option">تنظیمات ساعت</string>
<string name="poi_scout_camp">کمپ گردشگری</string> <string name="poi_scout_camp">کمپ گردشگری</string>
<string name="poi_backcountry">کمپ بدون امکانات</string> <string name="poi_backcountry">کمپ بدون امکانات</string>
<string name="poi_piste_grooming">مراقبت از پیست</string> <string name="poi_piste_grooming">آماده‌سازی پیست</string>
<string name="poi_outdoor_seating">نشستن بیرون</string> <string name="poi_outdoor_seating">نشستن بیرون</string>
<string name="poi_smoking">دخانیات</string> <string name="poi_smoking">دخانیات</string>
<string name="poi_delivery">تحویل</string> <string name="poi_delivery">تحویل</string>
@ -766,7 +766,7 @@
<string name="poi_office">دفتر</string> <string name="poi_office">دفتر</string>
<string name="poi_tourism">گردشگری</string> <string name="poi_tourism">گردشگری</string>
<string name="poi_sightseeing">دیدنی‌ها</string> <string name="poi_sightseeing">دیدنی‌ها</string>
<string name="poi_accomodation">محل اسکان</string> <string name="poi_accomodation">محل اسکان; اقامت</string>
<string name="poi_internet_access">دسترسی اینترنت</string> <string name="poi_internet_access">دسترسی اینترنت</string>
<string name="poi_entertainment">اوقات فراغت</string> <string name="poi_entertainment">اوقات فراغت</string>
<string name="poi_club">باشگاه</string> <string name="poi_club">باشگاه</string>
@ -1070,13 +1070,13 @@
<string name="poi_cuisine_soup">سوپ</string> <string name="poi_cuisine_soup">سوپ</string>
<string name="poi_tourism_yes">نقطهٔ گردشگری</string> <string name="poi_tourism_yes">نقطهٔ گردشگری</string>
<string name="poi_internet_access_no">دسترسی اینترنت: ندارد</string> <string name="poi_internet_access_no">دسترسی اینترنت: ندارد</string>
<string name="poi_internet_access_fee_no">دسترسی اینترنت - رایگان</string> <string name="poi_internet_access_fee_no">دسترسی اینترنت: رایگان</string>
<string name="poi_fee_no">خیر</string> <string name="poi_fee_no">خیر</string>
<string name="poi_drinking_water_no">خیر</string> <string name="poi_drinking_water_no">خیر</string>
<string name="poi_seasonal_no">خیر</string> <string name="poi_seasonal_no">خیر</string>
<string name="poi_traffic_signals_sound_no">خیر</string> <string name="poi_traffic_signals_sound_no">صدا: خیر</string>
<string name="poi_piste_grooming_no">خیر</string> <string name="poi_piste_grooming_no">خیر</string>
<string name="poi_historic_quarry">"معدن تاریخی سنگ "</string> <string name="poi_historic_quarry">معدن تاریخی سنگ</string>
<string name="poi_diet_vegetarian_filter_yes">گیاه‌خواری</string> <string name="poi_diet_vegetarian_filter_yes">گیاه‌خواری</string>
<string name="poi_diet_vegetarian_only">فقط گیاه‌خواری</string> <string name="poi_diet_vegetarian_only">فقط گیاه‌خواری</string>
<string name="poi_diet_vegetarian_yes">گیاه‌خواری</string> <string name="poi_diet_vegetarian_yes">گیاه‌خواری</string>
@ -1188,7 +1188,7 @@
<string name="poi_internet_access_public">دسترسی اینترنت: عمومی</string> <string name="poi_internet_access_public">دسترسی اینترنت: عمومی</string>
<string name="poi_internet_access_service">دسترسی اینترنت: با خدمات</string> <string name="poi_internet_access_service">دسترسی اینترنت: با خدمات</string>
<string name="poi_internet_access_yes">دسترسی اینترنت: دارد</string> <string name="poi_internet_access_yes">دسترسی اینترنت: دارد</string>
<string name="poi_internet_access_fee_yes">دسترسی اینترنت - پولی</string> <string name="poi_internet_access_fee_yes">دسترسی اینترنت: پولی</string>
<string name="poi_smoking_separated">در اتاق جداگانه</string> <string name="poi_smoking_separated">در اتاق جداگانه</string>
<string name="poi_smoking_isolated">در یک اتاق جدا</string> <string name="poi_smoking_isolated">در یک اتاق جدا</string>
<string name="poi_piste_grooming_scooter">اسکوتر</string> <string name="poi_piste_grooming_scooter">اسکوتر</string>
@ -1448,4 +1448,8 @@
<string name="poi_climbing_crag">بله</string> <string name="poi_climbing_crag">بله</string>
<string name="poi_protected_area">منطقهٔ حفاظت‌شده</string> <string name="poi_protected_area">منطقهٔ حفاظت‌شده</string>
<string name="poi_badminton">بدمینتون</string> <string name="poi_badminton">بدمینتون</string>
<string name="poi_service_car">خدمات خودرو; مکانیکی</string>
<string name="poi_substation_type">نوع</string>
<string name="poi_mini_roundabout">فلکهٔ کوچک</string>
<string name="poi_square">میدان</string>
</resources> </resources>

View file

@ -56,7 +56,7 @@
<string name="recording_can_not_be_played">فایل ضبط‌شده قابل‌پخش نیست.</string> <string name="recording_can_not_be_played">فایل ضبط‌شده قابل‌پخش نیست.</string>
<string name="recording_context_menu_delete">حذف فایل ضبط‌شده</string> <string name="recording_context_menu_delete">حذف فایل ضبط‌شده</string>
<string name="recording_context_menu_play">پخش</string> <string name="recording_context_menu_play">پخش</string>
<string name="recording_default_name">ضبط</string> <string name="recording_default_name">در حال ضبط</string>
<string name="shared_string_control_stop">توقف</string> <string name="shared_string_control_stop">توقف</string>
<string name="shared_string_control_start">شروع</string> <string name="shared_string_control_start">شروع</string>
<string name="map_widget_av_notes">یادداشت‌های صوتی/تصویری</string> <string name="map_widget_av_notes">یادداشت‌های صوتی/تصویری</string>
@ -118,7 +118,7 @@
<string name="osmand_parking_minutes">دقیقه</string> <string name="osmand_parking_minutes">دقیقه</string>
<string name="osmand_parking_position_description_add_time">ساعت پارک خودرو</string> <string name="osmand_parking_position_description_add_time">ساعت پارک خودرو</string>
<string name="global_app_allocated_memory">حافظهٔ اختصاص‌یافته</string> <string name="global_app_allocated_memory">حافظهٔ اختصاص‌یافته</string>
<string name="native_app_allocated_memory">حافظهٔ کل سیستم</string> <string name="native_app_allocated_memory">کل حافظهٔ native</string>
<string name="starting_point_too_far">مبدأ از نزدیک‌ترین جاده خیلی دور است.</string> <string name="starting_point_too_far">مبدأ از نزدیک‌ترین جاده خیلی دور است.</string>
<string name="osmand_parking_event">خودرو را از پارکینگ بردارید</string> <string name="osmand_parking_event">خودرو را از پارکینگ بردارید</string>
<string name="osmand_parking_warning">هشدار</string> <string name="osmand_parking_warning">هشدار</string>
@ -489,10 +489,10 @@
<string name="rendering_attr_noAdminboundaries_description">مرزهای مناطق را نشان نده (تقسیمات سیاسی سطح ۵–۹).</string> <string name="rendering_attr_noAdminboundaries_description">مرزهای مناطق را نشان نده (تقسیمات سیاسی سطح ۵–۹).</string>
<string name="incremental_search_city">جست‌وجوی حرف‌به‌حرف نام شهر</string> <string name="incremental_search_city">جست‌وجوی حرف‌به‌حرف نام شهر</string>
<string name="rendering_attr_showRoadMaps_name">نقشه‌های فقط-جاده</string> <string name="rendering_attr_showRoadMaps_name">نقشه‌های فقط-جاده</string>
<string name="safe_mode_description">اجرای برنامه در حالت ایمن (به‌جای کد اصلی از اندروید کُندتر استفاده می‌کند).</string> <string name="safe_mode_description">اجرای برنامه در حالت ایمن (به‌جای کد native از کد Android که کُندتر است استفاده می‌کند).</string>
<string name="native_library_not_running">برنامه در حالت ایمن اجرا شده است (از طریق تنظیمات آن را غیرفعال کنید).</string> <string name="native_library_not_running">برنامه در حالت ایمن اجرا شده است (از طریق تنظیمات آن را غیرفعال کنید).</string>
<string name="background_service_is_enabled_question">سرویس پس‌زمینهٔ OsmAnd هنوز در حال اجراست. آن را هم متوقف می‌کنید؟</string> <string name="background_service_is_enabled_question">سرویس پس‌زمینهٔ OsmAnd هنوز در حال اجراست. آن را هم متوقف می‌کنید؟</string>
<string name="close_changeset">بستن بستهٔ تغییرات</string> <string name="close_changeset">بستن بستهٔ تغییر</string>
<string name="zxing_barcode_scanner_not_found">برنامهٔ اسکنر بارکد ZXing نصب نشده است. در گوگل‌پلی جست‌وجو می‌کنید؟</string> <string name="zxing_barcode_scanner_not_found">برنامهٔ اسکنر بارکد ZXing نصب نشده است. در گوگل‌پلی جست‌وجو می‌کنید؟</string>
<string name="rendering_attr_roadColors_description">یکی از رنگ‌بندی‌های راه را انتخاب کنید:</string> <string name="rendering_attr_roadColors_description">یکی از رنگ‌بندی‌های راه را انتخاب کنید:</string>
<string name="rendering_attr_roadColors_name">رنگ‌بندی راه</string> <string name="rendering_attr_roadColors_name">رنگ‌بندی راه</string>
@ -617,11 +617,11 @@
<string name="bg_service_screen_unlock">قفل‌گشایی</string> <string name="bg_service_screen_unlock">قفل‌گشایی</string>
<string name="bg_service_interval">تنظیم فواصل بیدارباش:</string> <string name="bg_service_interval">تنظیم فواصل بیدارباش:</string>
<string name="select_animate_speedup">سرعت شبیه‌سازی مسیر:</string> <string name="select_animate_speedup">سرعت شبیه‌سازی مسیر:</string>
<string name="native_app_allocated_memory_descr">کل حافظهٔ اختصاص‌یافته به برنامه %1$s مگابایت (دالویک %2$s مگابایت، بقیه %3$s مگابایت). <string name="native_app_allocated_memory_descr">کل حافظهٔ native اختصاص‌یافته به برنامه %1$s مگابایت (دالویک %2$s مگابایت، بقیه %3$s مگابایت).
\nحافظهٔ نسبی %4$s مگابایت (حد آندروئید %5$s مگابایت، دالویک %6$s مگابایت).</string> \nحافظهٔ proportional %4$s مگابایت (حد اندروید %5$s مگابایت، دالویک %6$s مگابایت).</string>
<string name="global_app_allocated_memory_descr">حافظهٔ اختصاص‌یافته %1$s مگابایت (حد اندروید %2$s مگابایت، دالویک %3$s مگابایت).</string> <string name="global_app_allocated_memory_descr">حافظهٔ اختصاص‌یافته %1$s مگابایت (حد اندروید %2$s مگابایت، دالویک %3$s مگابایت).</string>
<string name="shared_location">مکان هم‌رسانده</string> <string name="shared_location">مکان هم‌رسانده</string>
<string name="gpxup_trackable">قابل‌ردگیری</string> <string name="gpxup_trackable">قابل‌ردیابی</string>
<string name="gpxup_identifiable">قابل‌شناسایی</string> <string name="gpxup_identifiable">قابل‌شناسایی</string>
<string name="navigate_point_format">قالب</string> <string name="navigate_point_format">قالب</string>
<string name="basemap_was_selected_to_download">نقشهٔ پایه برای کارکرد اولیه موردنیاز است و در صف دانلود قرار گرفت.</string> <string name="basemap_was_selected_to_download">نقشهٔ پایه برای کارکرد اولیه موردنیاز است و در صف دانلود قرار گرفت.</string>
@ -679,8 +679,8 @@
<string name="download_files_question_space">آیا {0} فایل را دانلود می‌کنید؟ <string name="download_files_question_space">آیا {0} فایل را دانلود می‌کنید؟
\n {1} مگابایت (از {2} مگابایت) استفاده خواهد شد.</string> \n {1} مگابایت (از {2} مگابایت) استفاده خواهد شد.</string>
<string name="use_transparent_map_theme">پوستهٔ شفاف</string> <string name="use_transparent_map_theme">پوستهٔ شفاف</string>
<string name="native_library_not_supported">کتابخانهٔ بومی بر روی این دستگاه پشتیبانی نمی‌شود.</string> <string name="native_library_not_supported">کتابخانهٔ native بر روی این دستگاه پشتیبانی نمی‌شود.</string>
<string name="init_native_library">مقداردهی اولیهٔ کتابخانهٔ بومی</string> <string name="init_native_library">مقداردهی اولیهٔ کتابخانهٔ native</string>
<string name="choose_auto_follow_route">نمای نقشه خودکار-مرکز</string> <string name="choose_auto_follow_route">نمای نقشه خودکار-مرکز</string>
<string name="choose_auto_follow_route_descr">مدت‌زمانی که طول می‌کشد تا نقشه با موقعیت کنونی همگام شود.</string> <string name="choose_auto_follow_route_descr">مدت‌زمانی که طول می‌کشد تا نقشه با موقعیت کنونی همگام شود.</string>
<string name="auto_follow_route_navigation">ناوبری فقط با حالت خودکار-مرکز</string> <string name="auto_follow_route_navigation">ناوبری فقط با حالت خودکار-مرکز</string>
@ -787,8 +787,8 @@
<string name="converting_names">در حال تبدیل اسامی محلی/انگلیسی…</string> <string name="converting_names">در حال تبدیل اسامی محلی/انگلیسی…</string>
<string name="failed_op">ناموفق</string> <string name="failed_op">ناموفق</string>
<string name="auth_failed">اجازهٔ دسترسی احراز نشد</string> <string name="auth_failed">اجازهٔ دسترسی احراز نشد</string>
<string name="closing_changeset">بستن بستهٔ تغییرات</string> <string name="closing_changeset">بستن بستهٔ تغییر…</string>
<string name="opening_changeset">بازکردن بستهٔ تغییرات</string> <string name="opening_changeset">بازکردن بستهٔ تغییر…</string>
<string name="list_index_files_was_not_loaded">دریافت لیست مناطق از https://osmand.net ناموفق بود.</string> <string name="list_index_files_was_not_loaded">دریافت لیست مناطق از https://osmand.net ناموفق بود.</string>
<string name="downloading_list_indexes">در حال دانلود لیست مناطق موجود…</string> <string name="downloading_list_indexes">در حال دانلود لیست مناطق موجود…</string>
<string name="download_question_exist">دادهٔ آفلاینِ {0} از قبل وجود دارد ({1}). آن را روزآمد می‌کنید ({2})؟</string> <string name="download_question_exist">دادهٔ آفلاینِ {0} از قبل وجود دارد ({1}). آن را روزآمد می‌کنید ({2})؟</string>
@ -973,7 +973,7 @@
<string name="osmand_accessibility_description">این افزونه امکانات قابلیت‌دسترسی (accessibility) در دستگاهتان را مستقیماً در OsmAnd به کار می‌گیرد و تسهیلاتی را در اختیارتان می‌گذارد؛ مانند تنظیم‌کردن سرعت گفتار موتور صوتی، تبدیل متن به گفتار (مثل اعلام موقعیت شما)، پیمایش صفحه به‌کمک صفحهٔ جهتی (D-pad) و استفاده از توپک (trackball) برای تنظیم زوم.</string> <string name="osmand_accessibility_description">این افزونه امکانات قابلیت‌دسترسی (accessibility) در دستگاهتان را مستقیماً در OsmAnd به کار می‌گیرد و تسهیلاتی را در اختیارتان می‌گذارد؛ مانند تنظیم‌کردن سرعت گفتار موتور صوتی، تبدیل متن به گفتار (مثل اعلام موقعیت شما)، پیمایش صفحه به‌کمک صفحهٔ جهتی (D-pad) و استفاده از توپک (trackball) برای تنظیم زوم.</string>
<string name="osm_editing_plugin_description">با ایجاد یا اصلاح نقاط توجه (POI)، ایجاد یادداشت‌های OSM یا نظردادن روی آن‌ها و بارگذاری فایل‌های GPXای که ضبط کرده‌اید در تکمیل نقشهٔ OSM مشارکت کنید. برای این منظور لازم است نام کاربری و گذرواژهٔ خود را در OsmAnd وارد کنید. OpenStreetMap.org یک پروژهٔ نقشه‌کشی جامعه‌محور، جهانی و در مالکیت عمومی است.</string> <string name="osm_editing_plugin_description">با ایجاد یا اصلاح نقاط توجه (POI)، ایجاد یادداشت‌های OSM یا نظردادن روی آن‌ها و بارگذاری فایل‌های GPXای که ضبط کرده‌اید در تکمیل نقشهٔ OSM مشارکت کنید. برای این منظور لازم است نام کاربری و گذرواژهٔ خود را در OsmAnd وارد کنید. OpenStreetMap.org یک پروژهٔ نقشه‌کشی جامعه‌محور، جهانی و در مالکیت عمومی است.</string>
<string name="play_commands_of_currently_selected_voice">گفتاری را انتخاب کنید و با پخش پیام‌ها، آن را امتحان کنید:</string> <string name="play_commands_of_currently_selected_voice">گفتاری را انتخاب کنید و با پخش پیام‌ها، آن را امتحان کنید:</string>
<string name="native_rendering">رندر بومی</string> <string name="native_rendering">رندرگیری native</string>
<string name="accessibility_mode">حالت قابلیت دسترسی</string> <string name="accessibility_mode">حالت قابلیت دسترسی</string>
<string name="accessibility_mode_descr">امکانات موردنیاز برای کاربران مبتلا به نارسایی جسمی را فعال می‌کند.</string> <string name="accessibility_mode_descr">امکانات موردنیاز برای کاربران مبتلا به نارسایی جسمی را فعال می‌کند.</string>
<string name="direction_style_sidewise">جهت‌ها (۸سویه)</string> <string name="direction_style_sidewise">جهت‌ها (۸سویه)</string>
@ -1275,7 +1275,7 @@
<string name="shared_string_all">همه</string> <string name="shared_string_all">همه</string>
<string name="shared_string_waypoints">راه‌نشان‌ها</string> <string name="shared_string_waypoints">راه‌نشان‌ها</string>
<string name="way_alarms">هشدارهای ترافیکی</string> <string name="way_alarms">هشدارهای ترافیکی</string>
<string name="speak_favorites">نقاط علاقه‌مندی نزدیک</string> <string name="speak_favorites">علاقه‌مندی‌های نزدیک</string>
<string name="speak_poi">نقاط توجه نزدیک</string> <string name="speak_poi">نقاط توجه نزدیک</string>
<string name="download_additional_maps">آیا نقشه‌های ناموجود را دانلود می‌کنید %1$s (%2$d مگابایت)؟</string> <string name="download_additional_maps">آیا نقشه‌های ناموجود را دانلود می‌کنید %1$s (%2$d مگابایت)؟</string>
<string name="shared_string_more">بیشتر…</string> <string name="shared_string_more">بیشتر…</string>
@ -1478,7 +1478,7 @@
<string name="welcome_text">برنامهٔ OsmAnd نقشه‌گردی و ناوبری آفلاین را برایتان به ارمغان می‌آورد.</string> <string name="welcome_text">برنامهٔ OsmAnd نقشه‌گردی و ناوبری آفلاین را برایتان به ارمغان می‌آورد.</string>
<string name="welcome_header">خوش آمدید</string> <string name="welcome_header">خوش آمدید</string>
<string name="current_route">مسیر فعلی</string> <string name="current_route">مسیر فعلی</string>
<string name="osm_changes_added_to_local_edits">تغییرات OSM به بستهٔ تغییرات محلی اضافه شد</string> <string name="osm_changes_added_to_local_edits">تغییرات OSM به بستهٔ تغییر محلی اضافه شد</string>
<string name="mark_to_delete">برای حذف‌کردن علامت بزنید</string> <string name="mark_to_delete">برای حذف‌کردن علامت بزنید</string>
<string name="local_osm_changes_upload_all_confirm">از آپلود این %1$d تغییر در OSM مطمئن هستید؟</string> <string name="local_osm_changes_upload_all_confirm">از آپلود این %1$d تغییر در OSM مطمئن هستید؟</string>
<string name="confirmation_to_clear_history">سوابق را پاک می‌کنید؟</string> <string name="confirmation_to_clear_history">سوابق را پاک می‌کنید؟</string>
@ -1540,7 +1540,7 @@
<string name="rendering_value_translucent_blue_name">آبی شفاف</string> <string name="rendering_value_translucent_blue_name">آبی شفاف</string>
<string name="rendering_value_purple_name">بنفش</string> <string name="rendering_value_purple_name">بنفش</string>
<string name="rendering_value_translucent_purple_name">بنفش شفاف</string> <string name="rendering_value_translucent_purple_name">بنفش شفاف</string>
<string name="restart_is_required">برای اینکه تغییرات به کار بسته شود، یک بار برنامه را ببندید و باز کنید.</string> <string name="restart_is_required">برای به کار بستن تغییرات، لازم است برنامه باز و بسته شود.</string>
<string name="light_theme">روشن</string> <string name="light_theme">روشن</string>
<string name="dark_theme">تیره</string> <string name="dark_theme">تیره</string>
<string name="lang_bn">بنگالی</string> <string name="lang_bn">بنگالی</string>
@ -1631,7 +1631,7 @@
<string name="osmand_plus_banner_desc">دانلود نامحدود نقشه‌ها، روزآمدسازی‌های نامحدود و افزونهٔ ویکی‌پدیا.</string> <string name="osmand_plus_banner_desc">دانلود نامحدود نقشه‌ها، روزآمدسازی‌های نامحدود و افزونهٔ ویکی‌پدیا.</string>
<string name="si_mi_meters">مایل/متر</string> <string name="si_mi_meters">مایل/متر</string>
<string name="skip_map_downloading">صرف‌نظر از دانلود نقشه‌ها</string> <string name="skip_map_downloading">صرف‌نظر از دانلود نقشه‌ها</string>
<string name="skip_map_downloading_desc">شما نقشهٔ آفلاینی را نصب نکرده‌اید. نقشه‌ای را از لیست انتخاب کنید یا اینکه بعداً از طریق «منو ← %1$s»، آن را دانلود کنید.</string> <string name="skip_map_downloading_desc">نقشهٔ آفلاینی نصب نکرده‌اید. نقشه‌ای را از لیست انتخاب نمایید یا بعداً از طریق «منو ← %1$s»، آن را دانلود کنید.</string>
<string name="search_another_country">منطقهٔ دیگری را انتخاب کنید</string> <string name="search_another_country">منطقهٔ دیگری را انتخاب کنید</string>
<string name="search_map">جست‌وجوی نقشه‌ها…</string> <string name="search_map">جست‌وجوی نقشه‌ها…</string>
<string name="first_usage_wizard_desc">اجازه دهید برنامه موقعیت شما را پیدا کند تا نقشهٔ آنجا را برای دانلود پیشنهاد بدهد.</string> <string name="first_usage_wizard_desc">اجازه دهید برنامه موقعیت شما را پیدا کند تا نقشهٔ آنجا را برای دانلود پیشنهاد بدهد.</string>
@ -1755,7 +1755,7 @@
<string name="subscribe_email_error">خطا</string> <string name="subscribe_email_error">خطا</string>
<string name="sea_depth_thanks">از اینکه منحنی‌های میزان عمق دریا را خریدید سپاسگزاریم</string> <string name="sea_depth_thanks">از اینکه منحنی‌های میزان عمق دریا را خریدید سپاسگزاریم</string>
<string name="analyze_on_map">آنالیز روی نقشه</string> <string name="analyze_on_map">آنالیز روی نقشه</string>
<string name="shared_string_visible">در حال نمایش</string> <string name="shared_string_visible">نمایان</string>
<string name="restore_purchases">بازیابی خریدها</string> <string name="restore_purchases">بازیابی خریدها</string>
<string name="fonts_header">فونت‌های نقشه</string> <string name="fonts_header">فونت‌های نقشه</string>
<string name="right_side_navigation">رانندگی از راست</string> <string name="right_side_navigation">رانندگی از راست</string>
@ -1813,7 +1813,7 @@
<string name="rendering_attr_depthContours_name">منحنی‌های میزان عمق دریا</string> <string name="rendering_attr_depthContours_name">منحنی‌های میزان عمق دریا</string>
<string name="rendering_attr_contourDensity_description">تراکم منحنی میزان</string> <string name="rendering_attr_contourDensity_description">تراکم منحنی میزان</string>
<string name="rendering_attr_contourDensity_name">تراکم منحنی میزان</string> <string name="rendering_attr_contourDensity_name">تراکم منحنی میزان</string>
<string name="rendering_attr_contourWidth_description">عرض منحنی میزان</string> <string name="rendering_attr_contourWidth_description">ضخامت منحنی میزان</string>
<string name="rendering_attr_contourWidth_name">ضخامت منحنی میزان</string> <string name="rendering_attr_contourWidth_name">ضخامت منحنی میزان</string>
<string name="routing_attr_allow_motorway_name">استفاده از آزادراه</string> <string name="routing_attr_allow_motorway_name">استفاده از آزادراه</string>
<string name="routing_attr_allow_motorway_description">مسیردهی از آزادراه مجاز می‌شود.</string> <string name="routing_attr_allow_motorway_description">مسیردهی از آزادراه مجاز می‌شود.</string>
@ -2409,7 +2409,7 @@
\n • اعلام محدودیت‌های سرعت را فعال کنید تا در صورت تجاوز از سرعت مجاز به شما هشدار دهد \n • اعلام محدودیت‌های سرعت را فعال کنید تا در صورت تجاوز از سرعت مجاز به شما هشدار دهد
\n • زوم نقشه متناسب با سرعتتان تنظیم می‌شود \n • زوم نقشه متناسب با سرعتتان تنظیم می‌شود
\n • با استفاده از نشانی، نوع مکان (مثلاً پارکینگ، رستوران، هتل، پمپ گاز، موزه) یا مختصات جغرافیایی به جست‌وجو بپردازید \n • با استفاده از نشانی، نوع مکان (مثلاً پارکینگ، رستوران، هتل، پمپ گاز، موزه) یا مختصات جغرافیایی به جست‌وجو بپردازید
\n • نقاط بین‌راهی مسیرتان را مشخص کنید \n • پشتیبانی از نقاط میانی در برنامه‌ریزی سفر
\n • رد خودتان را ثبت کنید یا یک رد GPX را دانلود و آن را دنبال کنید \n • رد خودتان را ثبت کنید یا یک رد GPX را دانلود و آن را دنبال کنید
\n</string> \n</string>
<string name="distance_moving">مسافت اصلاح‌شده</string> <string name="distance_moving">مسافت اصلاح‌شده</string>
@ -2496,7 +2496,7 @@
\n • امکان انتخاب بین حالت آنلاین (سریع) و آفلاین (بدون هزینهٔ اضافی بابت اینترنت) \n • امکان انتخاب بین حالت آنلاین (سریع) و آفلاین (بدون هزینهٔ اضافی بابت اینترنت)
\n • راهنمای گام‌به‌گام گفتاری (پیام‌های گفتاری انسانی و ماشینی) \n • راهنمای گام‌به‌گام گفتاری (پیام‌های گفتاری انسانی و ماشینی)
\n • راهنمای خطوط عبوری، نام خیابان‌ها و زمان تخمینی رسیدن \n • راهنمای خطوط عبوری، نام خیابان‌ها و زمان تخمینی رسیدن
\n • پشتیبانی از نقاط بین‌راهی مسیر \n • پشتیبانی از نقاط میانی در برنامه‌ریزی سفر
\n • اگر از مسیر منحرف شوید، مسیر جدیدی برایتان پیدا می‌کند \n • اگر از مسیر منحرف شوید، مسیر جدیدی برایتان پیدا می‌کند
\n • جست‌وجو با استفاده از نشانی، نوع مکان (مثلاً پارکینگ، رستوران، هتل، پمپ گاز، موزه) یا مختصات جغرافیایی</string> \n • جست‌وجو با استفاده از نشانی، نوع مکان (مثلاً پارکینگ، رستوران، هتل، پمپ گاز، موزه) یا مختصات جغرافیایی</string>
<string name="osmand_plus_extended_description_part8">پوشش و کیفیت تقریبی نقشه: <string name="osmand_plus_extended_description_part8">پوشش و کیفیت تقریبی نقشه:
@ -2589,7 +2589,7 @@
<string name="empty_state_markers_history_desc">نشانه‌هایی که به‌عنوان گذرانده مشخص شود در این صفحه نشان داده می‌شود.</string> <string name="empty_state_markers_history_desc">نشانه‌هایی که به‌عنوان گذرانده مشخص شود در این صفحه نشان داده می‌شود.</string>
<string name="shared_string_more_without_dots">بیشتر</string> <string name="shared_string_more_without_dots">بیشتر</string>
<string name="looking_for_tracks_with_waypoints">در حال جست‌وجوی ردهای دارای راه‌نشان</string> <string name="looking_for_tracks_with_waypoints">در حال جست‌وجوی ردهای دارای راه‌نشان</string>
<string name="empty_state_osm_edits">اشیای OSM را بسازید یا ویرایش کنید</string> <string name="empty_state_osm_edits">مکان‌های OSM را ایجاد یا ویرایش کنید</string>
<string name="empty_state_osm_edits_descr">POIها را اضافه یا ویرایش کنید، یادداشت‌های OSMای اضافه کنید یا روی آن‌ها نظر بدهید و فایل‌های GPX ضبط‌شده را آپلود کنید.</string> <string name="empty_state_osm_edits_descr">POIها را اضافه یا ویرایش کنید، یادداشت‌های OSMای اضافه کنید یا روی آن‌ها نظر بدهید و فایل‌های GPX ضبط‌شده را آپلود کنید.</string>
<string name="shared_string_deleted">حذف‌شده(ها)</string> <string name="shared_string_deleted">حذف‌شده(ها)</string>
<string name="shared_string_edited">ویرایش شد</string> <string name="shared_string_edited">ویرایش شد</string>
@ -3169,7 +3169,7 @@
<string name="general_settings_profile_descr">پوستهٔ برنامه، یکاها، منطقه</string> <string name="general_settings_profile_descr">پوستهٔ برنامه، یکاها، منطقه</string>
<string name="configure_profile">پیکربندی پروفایل</string> <string name="configure_profile">پیکربندی پروفایل</string>
<string name="voice_announces_info">پیام‌های گفتاری فقط در هنگام ناوبری پخش می‌شود.</string> <string name="voice_announces_info">پیام‌های گفتاری فقط در هنگام ناوبری پخش می‌شود.</string>
<string name="voice_announces_descr">راهنما و فرمان‌های ناوبری</string> <string name="voice_announces_descr">فرمان‌های ناوبری و اعلام پیام‌ها</string>
<string name="voice_announces">پیام‌های گفتاری</string> <string name="voice_announces">پیام‌های گفتاری</string>
<string name="screen_alerts">هشدارهای تصویری</string> <string name="screen_alerts">هشدارهای تصویری</string>
<string name="application_profile_changed">پروفایل برنامه به «%s» تغییر کرد</string> <string name="application_profile_changed">پروفایل برنامه به «%s» تغییر کرد</string>
@ -3205,7 +3205,7 @@
<string name="rendering_attr_piste_type_snow_park_name">پارک برفی</string> <string name="rendering_attr_piste_type_snow_park_name">پارک برفی</string>
<string name="rendering_attr_piste_type_sleigh_name">سورتمه کالسکه‌ای</string> <string name="rendering_attr_piste_type_sleigh_name">سورتمه کالسکه‌ای</string>
<string name="rendering_attr_piste_type_sled_name">سورتمه</string> <string name="rendering_attr_piste_type_sled_name">سورتمه</string>
<string name="rendering_attr_piste_type_hike_name"/> <string name="rendering_attr_piste_type_hike_name">پیاده‌گردی</string>
<string name="rendering_attr_piste_type_skitour_name">تور اسکی</string> <string name="rendering_attr_piste_type_skitour_name">تور اسکی</string>
<string name="rendering_attr_piste_type_downhill_name">دان‌هیل</string> <string name="rendering_attr_piste_type_downhill_name">دان‌هیل</string>
<string name="rendering_attr_piste_type_nordic_name">نوردیک</string> <string name="rendering_attr_piste_type_nordic_name">نوردیک</string>
@ -3307,7 +3307,7 @@
<string name="clear_confirmation_msg">%1$s پاک‌سازی شود؟</string> <string name="clear_confirmation_msg">%1$s پاک‌سازی شود؟</string>
<string name="rendering_value_walkingRoutesOSMCNodes_name">شبکه‌های گره</string> <string name="rendering_value_walkingRoutesOSMCNodes_name">شبکه‌های گره</string>
<string name="shared_string_turn_off">خاموش</string> <string name="shared_string_turn_off">خاموش</string>
<string name="join_segments">پیوند پاره‌ها</string> <string name="join_segments">اتصال پاره‌ها</string>
<string name="save_heading">ثبت جهت</string> <string name="save_heading">ثبت جهت</string>
<string name="save_heading_descr">هنگام ضبط، جهت (heading) را برای هر یک از نقطه‌های رد ثبت می‌کند.</string> <string name="save_heading_descr">هنگام ضبط، جهت (heading) را برای هر یک از نقطه‌های رد ثبت می‌کند.</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>
@ -3382,7 +3382,7 @@
<string name="tracks_view_descr">ردهای ضبط‌شدهٔ شما در %1$s یا در پوشهٔ OsmAnd قرار دارند.</string> <string name="tracks_view_descr">ردهای ضبط‌شدهٔ شما در %1$s یا در پوشهٔ OsmAnd قرار دارند.</string>
<string name="multimedia_notes_view_descr">یادداشت‌های OSMای شما در %1$s قرار دارند.</string> <string name="multimedia_notes_view_descr">یادداشت‌های OSMای شما در %1$s قرار دارند.</string>
<string name="osm_edits_view_descr">همهٔ ویرایش‌ها یا یادداشت‌های OSMای آپلودنشدهٔ خود را در %1$s ببینید. تغییرات آپلودشده را دیگر نمی‌بینید.</string> <string name="osm_edits_view_descr">همهٔ ویرایش‌ها یا یادداشت‌های OSMای آپلودنشدهٔ خود را در %1$s ببینید. تغییرات آپلودشده را دیگر نمی‌بینید.</string>
<string name="logcat_buffer_descr">لاگ‌های جزئی برنامه را بررسی و هم‌رسانی کنید</string> <string name="logcat_buffer_descr">لاگ‌های باجزئیات برنامه را بررسی و هم‌رسانی کنید</string>
<string name="multimedia_use_system_camera">استفاده از برنامهٔ سیستم</string> <string name="multimedia_use_system_camera">استفاده از برنامهٔ سیستم</string>
<string name="multimedia_photo_play_sound">صدای شاتر دوربین</string> <string name="multimedia_photo_play_sound">صدای شاتر دوربین</string>
<string name="osm_authorization_success">احراز هویت موفقیت‌آمیز بود</string> <string name="osm_authorization_success">احراز هویت موفقیت‌آمیز بود</string>
@ -3479,7 +3479,7 @@
<string name="shared_string_importing">در حال درون‌برد</string> <string name="shared_string_importing">در حال درون‌برد</string>
<string name="shared_string_import_complete">درون‌برد کامل شد</string> <string name="shared_string_import_complete">درون‌برد کامل شد</string>
<string name="import_complete_description">همهٔ داده از %1$s درون‌برد شد. با استفاده از دکمه‌های زیر می‌توانید بخش موردنیاز برنامه را برای مدیریت آن باز کنید.</string> <string name="import_complete_description">همهٔ داده از %1$s درون‌برد شد. با استفاده از دکمه‌های زیر می‌توانید بخش موردنیاز برنامه را برای مدیریت آن باز کنید.</string>
<string name="shared_string_poi_types">انواع POI</string> <string name="shared_string_poi_types">گونه‌های POI</string>
<string name="listed_exist">%1$s که در زیر آمده، هم‌اکنون در OsmAnd وجود دارد.</string> <string name="listed_exist">%1$s که در زیر آمده، هم‌اکنون در OsmAnd وجود دارد.</string>
<string name="checking_for_duplicate_description">OsmAnd در حال بررسی %1$s برای چیزهای تکراری موجود در برنامه است. <string name="checking_for_duplicate_description">OsmAnd در حال بررسی %1$s برای چیزهای تکراری موجود در برنامه است.
\n \n
@ -3554,7 +3554,7 @@
<string name="ltr_or_rtl_combine_via_slash_with_space">%1$s / %2$s</string> <string name="ltr_or_rtl_combine_via_slash_with_space">%1$s / %2$s</string>
<string name="osm_live_payment_subscription_management">هنگام تأیید خرید، بها از حساب گوگل‌پلی شما پرداخت می‌شود. <string name="osm_live_payment_subscription_management">هنگام تأیید خرید، بها از حساب گوگل‌پلی شما پرداخت می‌شود.
\n \n
\nاگر اشتراک خود را پیش از پایان زمان اشتراک از تنظیمات گوگل‌پلی لغو کرده باشید، اشتراک شما به‌طور خودکار تمدید نخواهد شد. فقط در موعد تمدید اشتراک، برای دورهٔ (ماهانه/سه‌ماهه/سالانه) از حسابتان برداشت می‌شود. \nاشتراک شما به‌طور خودکار تمدید خواهد شد مگر اینکه پیش از تاریخ تمدید، اشتراک خود را از تنظیمات گوگل‌پلی لغو کرده باشید. فقط در موعد تمدید اشتراک، برای دورهٔ تمدید (ماهانه / سه‌ماهه / سالانه) از حسابتان برداشت می‌شود.
\n \n
\nبرای مدیریت یا لغو اشتراک خود، به تنظیمات گوگل‌پلی بروید.</string> \nبرای مدیریت یا لغو اشتراک خود، به تنظیمات گوگل‌پلی بروید.</string>
<string name="tracker_item">OsmAnd tracker</string> <string name="tracker_item">OsmAnd tracker</string>
@ -3629,7 +3629,7 @@
<string name="parking_positions">جاهای پارک</string> <string name="parking_positions">جاهای پارک</string>
<string name="reset_deafult_order">بازنشانی ترتیب پیشفرض اقلام</string> <string name="reset_deafult_order">بازنشانی ترتیب پیشفرض اقلام</string>
<string name="gpx_parse_error">OsmAnd GPX قالب درستی ندارد. لطفاً برای بررسی بیشتر با گروه پشتیبانی تماس بگیرید.</string> <string name="gpx_parse_error">OsmAnd GPX قالب درستی ندارد. لطفاً برای بررسی بیشتر با گروه پشتیبانی تماس بگیرید.</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="screen_timeout_descr">اگر «%1$s» روشن باشد، زمان فعالیت به آن وابسته خواهد بود.</string> <string name="screen_timeout_descr">اگر «%1$s» روشن باشد، زمان فعالیت به آن وابسته خواهد بود.</string>
<string name="shared_string_always">همیشه</string> <string name="shared_string_always">همیشه</string>
<string name="screen_control">کنترل صفحه</string> <string name="screen_control">کنترل صفحه</string>
@ -3641,11 +3641,11 @@
<string name="turn_screen_on_power_button_descr">فشردن دکمهٔ خاموش/روشن دستگاه، صفحه را روشن می‌کند و OsmAnd را روی صفحهٔ قفل نمایش می‌دهد.</string> <string name="turn_screen_on_power_button_descr">فشردن دکمهٔ خاموش/روشن دستگاه، صفحه را روشن می‌کند و OsmAnd را روی صفحهٔ قفل نمایش می‌دهد.</string>
<string name="turn_screen_on_power_button">دکمهٔ خاموش/روشن</string> <string name="turn_screen_on_power_button">دکمهٔ خاموش/روشن</string>
<string name="turn_screen_on_proximity_sensor">حسگر مجاورتی</string> <string name="turn_screen_on_proximity_sensor">حسگر مجاورتی</string>
<string name="keep_screen_on">روشن نگه داشتن صفحه</string> <string name="keep_screen_on">صفحه روشن بماند</string>
<string name="keep_screen_off">صفحه را خاموش نگه دار</string> <string name="keep_screen_off">صفحه را خاموش نگه دار</string>
<string name="mercator_projection">فراتابی مرکاتور</string> <string name="mercator_projection">فراتابی مرکاتور</string>
<string name="one_image_per_tile">یک فایل تصویر برای هر کاشی</string> <string name="one_image_per_tile">یک فایل تصویر برای هر کاشی</string>
<string name="map_source_zoom_levels_descr">هنگام استفاده از منبع به‌عنوان نقشه یا رولایه/زیرلایه، بر نمایش آن اثر می‌گذارند. <string name="map_source_zoom_levels_descr">هنگامی که به‌عنوان نقشه یا رولایه/زیرلایه استفاده می‌شود، نمایش آن تحت تأثیر قرار می‌گیرد:
\n \n
\n%1$s: نقشه به دامنهٔ زوم انتخاب‌شده محدود می‌شود. \n%1$s: نقشه به دامنهٔ زوم انتخاب‌شده محدود می‌شود.
\n \n
@ -3657,7 +3657,7 @@
<string name="expire_time">زمان انقضا</string> <string name="expire_time">زمان انقضا</string>
<string name="storage_format">قالب ذخیره‌گاه</string> <string name="storage_format">قالب ذخیره‌گاه</string>
<string name="map_source_zoom_levels">کمترین و بیشترین درجهٔ زوم را برای نمایش یا بارکردن نقشهٔ آنلاین تنظیم کنید.</string> <string name="map_source_zoom_levels">کمترین و بیشترین درجهٔ زوم را برای نمایش یا بارکردن نقشهٔ آنلاین تنظیم کنید.</string>
<string name="expire_time_descr">کاشی‌های ذخیره‌شده پس از این مدت (به دقیقه) مجدداً دانلود می‌شوند. این خانه را خالی بگذارید تا کاشی‌های این منبع هیچ‌گاه تازه‌سازی نشود. <string name="expire_time_descr">کاشی‌های ذخیره‌شده پس از این مدت (به دقیقه) مجدداً دانلود می‌شوند. این خانه را خالی بگذارید تا کاشی‌های این منبع هیچ‌گاه تازه‌سازی نشوند.
\n \n
\nیک روز ۱ ۴۴۰ دقیقه است. \nیک روز ۱ ۴۴۰ دقیقه است.
\nیک هفته ۱۰ ۰۸۰ دقیقه است. \nیک هفته ۱۰ ۰۸۰ دقیقه است.
@ -3675,7 +3675,7 @@
<string name="shared_string_meters">متر</string> <string name="shared_string_meters">متر</string>
<string name="details_dialog_decr">جزئیات اضافه‌تر را روی نقشه آشکار یا پنهان کنید</string> <string name="details_dialog_decr">جزئیات اضافه‌تر را روی نقشه آشکار یا پنهان کنید</string>
<string name="shared_string_night_map">نقشهٔ شب</string> <string name="shared_string_night_map">نقشهٔ شب</string>
<string name="turn_screen_on_power_button_disabled">غیرفعال است. به گزینهٔ «روشن نگه داشتن صفحه» در قسمت «زمان خاموشی پس از بیدارباش» نیاز دارد.</string> <string name="turn_screen_on_power_button_disabled">غیرفعال است. به گزینهٔ «صفحه روشن بماند» در قسمت «زمان خاموشی پس از بیدارباش» نیاز دارد.</string>
<string name="pseudo_mercator_projection">فراتابی شبه مرکاتور</string> <string name="pseudo_mercator_projection">فراتابی شبه مرکاتور</string>
<string name="rendering_attr_piste_type_connection_name">اتصال</string> <string name="rendering_attr_piste_type_connection_name">اتصال</string>
<string name="rendering_attr_piste_difficulty_connection_name">اتصال</string> <string name="rendering_attr_piste_difficulty_connection_name">اتصال</string>
@ -3770,7 +3770,7 @@
<string name="route_between_points_desc">مشخص کنید نقطه‌ها با خط مستقیم به هم وصل شوند یا مسیر بینشان مطابق تنظیمات زیر محاسبه شود.</string> <string name="route_between_points_desc">مشخص کنید نقطه‌ها با خط مستقیم به هم وصل شوند یا مسیر بینشان مطابق تنظیمات زیر محاسبه شود.</string>
<string name="whole_track">تمام رد</string> <string name="whole_track">تمام رد</string>
<string name="next_segment">پارهٔ بعدی</string> <string name="next_segment">پارهٔ بعدی</string>
<string name="route_between_points_warning_desc">در ادامه برای استفاده از این گزینه، با یکی از پروفایل‌های ناوبری‌تان رد خود را به نزدیک‌ترین جادهٔ مجاز بچسبانید.</string> <string name="route_between_points_warning_desc">در ادامه، رد خود را به نزدیک‌ترین جادهٔ مجاز متناسب با یکی از پروفایل‌های ناوبری‌تان بچسبانید، تا از این گزینه استفاده کنید.</string>
<string name="navigation_profile">پروفایل ناوبری</string> <string name="navigation_profile">پروفایل ناوبری</string>
<string name="route_between_points_add_track_desc">یک فایل رد انتخاب کنید تا پارهٔ جدید را به آن بیفزایید.</string> <string name="route_between_points_add_track_desc">یک فایل رد انتخاب کنید تا پارهٔ جدید را به آن بیفزایید.</string>
<string name="street_level_imagery">تصاویر سطح خیابان</string> <string name="street_level_imagery">تصاویر سطح خیابان</string>
@ -3794,7 +3794,7 @@
<string name="shared_string_file_name">نام فایل</string> <string name="shared_string_file_name">نام فایل</string>
<string name="system_default_theme">پیشفرض سیستم</string> <string name="system_default_theme">پیشفرض سیستم</string>
<string name="only_selected_segment_recalc">فقط پارهٔ انتخاب‌شده با استفاده از پروفایل انتخابی بازمحاسبه می‌شود.</string> <string name="only_selected_segment_recalc">فقط پارهٔ انتخاب‌شده با استفاده از پروفایل انتخابی بازمحاسبه می‌شود.</string>
<string name="sort_last_modified">آخرین تغییر</string> <string name="sort_last_modified">آخرین تغییریافته</string>
<string name="sort_name_descending">نام: ی - الف</string> <string name="sort_name_descending">نام: ی - الف</string>
<string name="sort_name_ascending">نام: الف - ی</string> <string name="sort_name_ascending">نام: الف - ی</string>
<string name="save_track_to_gpx">ردنگاری خودکار در هنگام ناوبری</string> <string name="save_track_to_gpx">ردنگاری خودکار در هنگام ناوبری</string>
@ -3820,7 +3820,7 @@
<string name="app_mode_enduro_motorcycle">موتور پرشی</string> <string name="app_mode_enduro_motorcycle">موتور پرشی</string>
<string name="app_mode_motor_scooter">اسکوتر موتوری</string> <string name="app_mode_motor_scooter">اسکوتر موتوری</string>
<string name="app_mode_wheelchair_forward">ویلچر رو به جلو</string> <string name="app_mode_wheelchair_forward">ویلچر رو به جلو</string>
<string name="threshold_distance">فاصله آستانه</string> <string name="threshold_distance">فاصلهٔ آستانه</string>
<string name="start_finish_icons">نمادهای ابتدا و انتها</string> <string name="start_finish_icons">نمادهای ابتدا و انتها</string>
<string name="routing_attr_avoid_footways_name">راه‌های پیاده</string> <string name="routing_attr_avoid_footways_name">راه‌های پیاده</string>
<string name="routing_attr_avoid_footways_description">از راه‌های پیاده پرهیز می‌کند</string> <string name="routing_attr_avoid_footways_description">از راه‌های پیاده پرهیز می‌کند</string>
@ -3828,7 +3828,7 @@
<string name="use_live_public_transport">دادهٔ OsmAnd Live</string> <string name="use_live_public_transport">دادهٔ OsmAnd Live</string>
<string name="use_live_routing">دادهٔ OsmAnd Live</string> <string name="use_live_routing">دادهٔ OsmAnd Live</string>
<string name="complex_routing_descr">مسیریابی دومرحله‌ای برای ناوبری خودرویی.</string> <string name="complex_routing_descr">مسیریابی دومرحله‌ای برای ناوبری خودرویی.</string>
<string name="use_native_pt_desc">برای مسیریابی حمل‌ونقل عمومی از محاسبات جاوا (امن) استفاده می‌کند</string> <string name="use_native_pt_desc">برای مسیریابی حمل‌ونقل عمومی از محاسبات جاوا (ایمن) استفاده می‌کند</string>
<string name="shared_string_local_maps">نقشه‌های محلی</string> <string name="shared_string_local_maps">نقشه‌های محلی</string>
<string name="icon_group_special">ویژه</string> <string name="icon_group_special">ویژه</string>
<string name="icon_group_transport">حمل‌ونقل</string> <string name="icon_group_transport">حمل‌ونقل</string>
@ -3838,8 +3838,8 @@
<string name="icon_group_emergency">اورژانس</string> <string name="icon_group_emergency">اورژانس</string>
<string name="icon_group_travel">سفر</string> <string name="icon_group_travel">سفر</string>
<string name="what_is_new">تازه‌ها</string> <string name="what_is_new">تازه‌ها</string>
<string name="perform_oauth_authorization_description">برای استفاده از قابلیت‌های ویرایشی، از طریق OAuth ثبت ورود کنید</string> <string name="perform_oauth_authorization_description">برای استفاده از قابلیت‌های ویرایشی، از طریق OAuth وارد شوید</string>
<string name="perform_oauth_authorization">ثبت ورود از طریق OAuth</string> <string name="perform_oauth_authorization">ورود از طریق OAuth</string>
<string name="clear_osm_token">پاک‌سازی توکن OAuth اوپن‌استریت‌مپ</string> <string name="clear_osm_token">پاک‌سازی توکن OAuth اوپن‌استریت‌مپ</string>
<string name="osm_edit_logout_success">خارج شدید</string> <string name="osm_edit_logout_success">خارج شدید</string>
<string name="file_already_imported">فایل قبلاً در OsmAnd درون‌برد شده است</string> <string name="file_already_imported">فایل قبلاً در OsmAnd درون‌برد شده است</string>
@ -3852,7 +3852,7 @@
<string name="message_you_need_add_two_points_to_show_graphs">دست‌کم دو نقطه اضافه کنید</string> <string name="message_you_need_add_two_points_to_show_graphs">دست‌کم دو نقطه اضافه کنید</string>
<string name="login_open_street_map">ورود به اوپن‌استریت‌مپ</string> <string name="login_open_street_map">ورود به اوپن‌استریت‌مپ</string>
<string name="login_open_street_map_org">ورود به OpenStreetMap.org</string> <string name="login_open_street_map_org">ورود به OpenStreetMap.org</string>
<string name="sign_in_with_open_street_map">ثبت ورود از طریق اوپن‌استریت‌مپ</string> <string name="sign_in_with_open_street_map">ورود از طریق اوپن‌استریت‌مپ</string>
<string name="open_street_map_login_mode">برای آپلود تغییرات جدید باید وارد شوید (login). <string name="open_street_map_login_mode">برای آپلود تغییرات جدید باید وارد شوید (login).
\n \n
\nبرای ورود می‌توانید از روش امن OAuth یا روش نام کاربری و گذرواژه استفاده کنید.</string> \nبرای ورود می‌توانید از روش امن OAuth یا روش نام کاربری و گذرواژه استفاده کنید.</string>
@ -3877,20 +3877,20 @@
<string name="export_not_enough_space_descr">دستگاه شما تنها %1$s فضای خالی دارد. لطفا مقادری فضا خالی کنید و یا تعداد موارد برون‌ریزی را کاهش دهید.</string> <string name="export_not_enough_space_descr">دستگاه شما تنها %1$s فضای خالی دارد. لطفا مقادری فضا خالی کنید و یا تعداد موارد برون‌ریزی را کاهش دهید.</string>
<string name="export_not_enough_space">فضای کافی موجود نیست</string> <string name="export_not_enough_space">فضای کافی موجود نیست</string>
<string name="select_groups_for_import">گروه‌هایی را که درون‌ریزی خواهند شد را انتخاب کنید.</string> <string name="select_groups_for_import">گروه‌هایی را که درون‌ریزی خواهند شد را انتخاب کنید.</string>
<string name="select_items_for_import">مواردی را که درون‌ریزی خواهند شد را انتخاب کنید.</string> <string name="select_items_for_import">مواردی که درون‌برد خواهند شد را انتخاب کنید.</string>
<string name="add_to_mapillary">افزودن به مپیلاری</string> <string name="add_to_mapillary">افزودن به مپیلاری</string>
<string name="add_to_opr">افزودن به OpenPlaceReviews</string> <string name="add_to_opr">افزودن به OpenPlaceReviews</string>
<string name="use_dev_url_descr">برای امتحان کردن بارگذاری یادداشت / نقاط توجه و GPX از dev.openstreetmap.org به جای openstreetmep.org استفاده کنید.</string> <string name="use_dev_url_descr">برای آپلود آزمایشی یادداشت / نقطهٔ توجه / GPX، به‌جای openstreetmep.org از dev.openstreetmap.org استفاده کنید.</string>
<string name="use_dev_url">از dev.openstreetmap.org استفاده کنید</string> <string name="use_dev_url">استفاده از dev.openstreetmap.org</string>
<string name="add_photos_descr">برنامه OsmAnd عکس‌ها را از چند منبع نشان می‌دهد: <string name="add_photos_descr">برنامه OsmAnd عکس‌ها را از چند منبع نشان می‌دهد:
\nاز OpenPlaceReview برای عکس‌های نقاط توجه؛ \nاز OpenPlaceReview برای عکس‌های نقاط توجه؛
\nاز مپیلاری برای تصویر سطح خیابان؛ \nاز مپیلاری برای تصویر سطح خیابان؛
\nاز وب و ویکی‌پدیا برای عکس‌های نقاط توجه متناسب با داده‌های اوپن‌استریت‌مپ.</string> \nاز وب و ویکی‌پدیا برای عکس‌های نقاط توجه متناسب با داده‌های اوپن‌استریت‌مپ.</string>
<string name="app_mode_light_aircraft">هواپیمای سبک</string> <string name="app_mode_light_aircraft">هواپیمای سبک</string>
<string name="plan_route_join_segments">اتصال بخشها</string> <string name="plan_route_join_segments">اتصال پارهها</string>
<string name="plan_route_split_before">تقطیع از اینجا به قبل</string> <string name="plan_route_split_before">تقطیع از اینجا به قبل</string>
<string name="plan_route_split_after">تقطیع از این جا به بعد</string> <string name="plan_route_split_after">تقطیع از این جا به بعد</string>
<string name="plan_route_add_new_segment">افزودن یک بخش جدید</string> <string name="plan_route_add_new_segment">افزودن یک پارهٔ جدید</string>
<string name="profile_type_osmand_string">نمایهٔ OsmAnd</string> <string name="profile_type_osmand_string">نمایهٔ OsmAnd</string>
<string name="profile_type_user_string">نمایهٔ کاربر</string> <string name="profile_type_user_string">نمایهٔ کاربر</string>
<string name="voice_prompts_timetable">زمان‌های پیام‌های گفتاری</string> <string name="voice_prompts_timetable">زمان‌های پیام‌های گفتاری</string>
@ -3911,7 +3911,7 @@
<string name="file_size_needed_for_import">برای درون‌برد لازم است</string> <string name="file_size_needed_for_import">برای درون‌برد لازم است</string>
<string name="reverse_all_points">برعکس‌کردن همهٔ نقطه‌ها</string> <string name="reverse_all_points">برعکس‌کردن همهٔ نقطه‌ها</string>
<string name="profile_by_default_description">پروفایلِ هنگام شروع برنامه را انتخاب کنید.</string> <string name="profile_by_default_description">پروفایلِ هنگام شروع برنامه را انتخاب کنید.</string>
<string name="shared_string_last_used">آخرین استفاده</string> <string name="shared_string_last_used">آخرین استفاده‌شده</string>
<string name="add_online_routing_engine">افزودن موتور مسیریابی آنلاین</string> <string name="add_online_routing_engine">افزودن موتور مسیریابی آنلاین</string>
<string name="edit_online_routing_engine">ویرایش موتور مسیریابی آنلاین</string> <string name="edit_online_routing_engine">ویرایش موتور مسیریابی آنلاین</string>
<string name="shared_string_vehicle">وسیله نقلیه</string> <string name="shared_string_vehicle">وسیله نقلیه</string>
@ -3923,7 +3923,7 @@
<string name="routing_engine_vehicle_type_foot">پا</string> <string name="routing_engine_vehicle_type_foot">پا</string>
<string name="routing_engine_vehicle_type_bike">دوچرخه</string> <string name="routing_engine_vehicle_type_bike">دوچرخه</string>
<string name="routing_engine_vehicle_type_car">خودرو</string> <string name="routing_engine_vehicle_type_car">خودرو</string>
<string name="app_restart_required">برای اینکه برخی تنظیمات به کار بسته شود، لازم است برنامه را ببندید و دوباره باز کنید.</string> <string name="app_restart_required">برای به کار بستن برخی تنظیمات، لازم است برنامه باز و بسته شود.</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">پنهان‌کردن مرز ذخیره‌گاه‌های طبیعی، مناطق حفاظت‌شده و پارک‌های ملی</string> <string name="rendering_attr_noNatureReserveBoundaries_description">پنهان‌کردن مرز ذخیره‌گاه‌های طبیعی، مناطق حفاظت‌شده و پارک‌های ملی</string>
<string name="last_time_checked">آخرین زمان بررسی: %s</string> <string name="last_time_checked">آخرین زمان بررسی: %s</string>
<string name="latest_openstreetmap_update">آخرین روزآمدسازهٔ اوپن‌استریت‌مپ:</string> <string name="latest_openstreetmap_update">آخرین روزآمدسازهٔ اوپن‌استریت‌مپ:</string>
@ -3997,7 +3997,7 @@
<string name="activity_type_car_name">خودرو</string> <string name="activity_type_car_name">خودرو</string>
<string name="temporary_conditional_routing_descr">محدودیت‌های جاده که اکنون روی نقشه فعال هستند را لحاظ کن</string> <string name="temporary_conditional_routing_descr">محدودیت‌های جاده که اکنون روی نقشه فعال هستند را لحاظ کن</string>
<string name="routing_attr_driving_style_description">هدف رانندگی را انتخاب نمایید تا مسیری کوتاه‌تر، سریع‌تر یا ایمن‌تر دریافت کنید</string> <string name="routing_attr_driving_style_description">هدف رانندگی را انتخاب نمایید تا مسیری کوتاه‌تر، سریع‌تر یا ایمن‌تر دریافت کنید</string>
<string name="map_orientation_threshold_descr">اگر سرعت پایین‌تر از حدی است نمای نقشه را نچرخان</string> <string name="map_orientation_threshold_descr">اگر سرعت پایین‌تر از مقدار زیر بود، نمای نقشه را نچرخان</string>
<string name="shared_strings_all_regions">همهٔ مناطق</string> <string name="shared_strings_all_regions">همهٔ مناطق</string>
<string name="delete_number_files_question">%1$d فایل را حذف می‌کنید؟</string> <string name="delete_number_files_question">%1$d فایل را حذف می‌کنید؟</string>
<string name="track_recording_stop_without_saving">توقف بدون ذخیره‌سازی</string> <string name="track_recording_stop_without_saving">توقف بدون ذخیره‌سازی</string>
@ -4005,4 +4005,68 @@
<string name="track_recording_title">ضبط رد متوقف شد</string> <string name="track_recording_title">ضبط رد متوقف شد</string>
<string name="track_recording_description">آیا برای توقف ضبط مطمئن هستید؟ <string name="track_recording_description">آیا برای توقف ضبط مطمئن هستید؟
\nهرچه که ذخیره نشده، از دست خواهد رفت.</string> \nهرچه که ذخیره نشده، از دست خواهد رفت.</string>
<string name="shared_string_subtype">زیرنوع</string>
<string name="use_native_pt">پیاده‌سازی Native حمل‌ونقل عمومی</string>
<string name="ltr_or_rtl_combine_via_star">%1$s * %2$s</string>
<string name="release_3_9">• گزینه‌ای برای برون‌برد و درون‌برد همهٔ داده‌ها شامل تنظیمات، منابع و مکان‌های من اضافه شد.
\n
\n • طراحی مسیر: برای پاره‌هایی از رد که مسیر دارند نمودار رسم می‌شود. امکان ساخت و ویرایش چندین پارهٔ رد اضافه شد.
\n
\n • شیوهٔ احراز هویت OAuth برای OpenStreetMap اضافه شد، رابط کاربری کادرهای OSM بهبود یافت.
\n
\n • پشتیبانی از رنگ‌های دلخواه برای علاقه‌مندی‌ها (favorites) و راه‌نشان‌های رد (track waypoints)
\n
\n</string>
<string name="routing_engine_vehicle_type_mtb">MTB</string>
<string name="routing_attr_prefer_hiking_routes_description">ترجیح مسیرهای پیاده‌گردی</string>
<string name="routing_attr_prefer_hiking_routes_name">ترجیح مسیرهای پیاده‌گردی</string>
<string name="routing_attr_allow_streams_name">رودهای کوچک و نهرهای مصنوعی مجاز باشد</string>
<string name="routing_attr_allow_streams_description">مسیریابی از رودهای کوچک (stream) و نهرهای مصنوعی (drain) مجاز باشد</string>
<string name="routing_attr_allow_intermittent_description">مسیریابی از آبراه‌های دوره‌ای و غیردائمی را مجاز می‌کند</string>
<string name="routing_attr_allow_intermittent_name">آبراه‌های غیردائمی مجاز باشد</string>
<string name="shared_string_sec">sec</string>
<string name="routing_engine_vehicle_type_scooter">اسکوتر</string>
<string name="context_menu_read_full">تمام‌صفحه</string>
<string name="select_another_colorization">لطفاً رنگ‌بندی دیگری انتخاب کنید.</string>
<string name="lang_de_casual">آلمانی (خودمانی)</string>
<string name="snowmobile_render_descr">مناسب برای اسنوموبیل‌سواری (برف‌روسواری) است. دارای مسیرها و جاده‌های ویژه.</string>
<string name="osm_live_payment_desc_hw">هزینهٔ اشتراک با رسیدن موعد دورهٔ انتخابی از حسابتان پرداخت می‌شود. هر زمان که خواستید در AppGallery آن را لغو کنید.</string>
<string name="osm_live_payment_subscription_management_hw">هنگام تأیید خرید، بها از حساب AppGallery شما پرداخت می‌شود.
\n
\nاشتراک شما به‌طور خودکار ادامه می‌یابد مگر اینکه پیش از تاریخ تمدید، اشتراک خود را لغو کرده باشید. فقط در موعد تمدید اشتراک، برای دورهٔ تمدید (ماهانه / سه‌ماهه / سالانه) از حسابتان برداشت می‌شود.
\n
\nبرای مدیریت یا لغو اشتراک خود، به تنظیمات AppGallery بروید.</string>
<string name="subscription_expired_title">اشتراک OsmAnd Live لغو شده است (expired)</string>
<string name="subscription_paused_title">اشتراک OsmAnd Live موقتاً متوقف شده است (paused)</string>
<string name="subscription_on_hold_title">اشتراک OsmAnd Live در انتظار است (on hold)</string>
<string name="app_mode_kayak">کایاک</string>
<string name="shared_string_server_url">Server URL</string>
<string name="keep_it_empty_if_not">اگر نیاز ندارد خالی بگذارید</string>
<string name="copy_address">کپی آدرس</string>
<string name="online_routing_engine">موتور مسیریابی آنلاین</string>
<string name="online_routing_engines">موتورهای مسیریابی آنلاین</string>
<string name="shared_string_folders">پوشه‌ها</string>
<string name="select_folder">انتخاب پوشه</string>
<string name="select_folder_descr">پوشه را انتخاب کنید یا یکی جدید اضافه نمایید</string>
<string name="shared_string_empty">تهی</string>
<string name="analyze_by_intervals">تحلیل بازه‌های تقسیم‌شده</string>
<string name="upload_to_openstreetmap">آپلود در OpenStreetMap</string>
<string name="edit_track">ویرایش رد</string>
<string name="rename_track">تغییر نام رد</string>
<string name="change_folder">تغییر پوشه</string>
<string name="shared_string_turn">پیچ</string>
<string name="announcement_time_passing">هنگام گذر</string>
<string name="announcement_time_approach">نزدیک‌شدن</string>
<string name="announcement_time_prepare_long">آمادگی زودتر</string>
<string name="announcement_time_prepare">آمادگی</string>
<string name="announcement_time_off_route">خروج از مسیر</string>
<string name="announcement_time_arrive">رسیدن به مقصد</string>
<string name="announcement_time_intervals">بازه‌های زمانی و مسافتی</string>
<string name="announcement_time_descr">زمان اعلام پیام‌های گفتاری به نوع پیام، سرعت ناوبری جاری و سرعت ناوبری پیش‌فرض بستگی دارد.</string>
<string name="announcement_time_title">زمان اعلام پیام</string>
<string name="restart">شروع دوباره</string>
<string name="on_pause">مکث کرده</string>
<string name="quick_action_coordinates_widget_descr">دکمه‌ای برای آشکار یا پنهان کردن ابزارک مختصات روی نقشه.</string>
<string name="shared_string_interval">بازه</string>
<string name="map_widget_distance_by_tap">مسافت با لمس</string>
</resources> </resources>

View file

@ -3886,4 +3886,10 @@
<string name="poi_piste_status_open">Statut de la piste : ouvert</string> <string name="poi_piste_status_open">Statut de la piste : ouvert</string>
<string name="poi_piste_name">Nom de la piste</string> <string name="poi_piste_name">Nom de la piste</string>
<string name="poi_piste_ski_jump">Saut à ski</string> <string name="poi_piste_ski_jump">Saut à ski</string>
<string name="poi_summit_register_no">Livre d\'or au sommet : non</string>
<string name="poi_summit_register_yes">Livre d\'or au sommet : oui</string>
<string name="poi_patrolled_no">Surveillé : non</string>
<string name="poi_patrolled_yes">Surveillé : oui</string>
<string name="poi_local_ref">Référence locale</string>
<string name="poi_geodesist">Géodésien</string>
</resources> </resources>

View file

@ -1192,11 +1192,11 @@
<string name="gpx_file_is_empty">Fichier GPX vide</string> <string name="gpx_file_is_empty">Fichier GPX vide</string>
<string name="shared_string_tracks">Traces</string> <string name="shared_string_tracks">Traces</string>
<string name="shared_string_my_favorites">Favoris</string> <string name="shared_string_my_favorites">Favoris</string>
<string name="shared_string_my_places">Mes lieux favoris</string> <string name="shared_string_my_places">Lieux favoris</string>
<string name="selected_gpx_info_show">\n\nAppui long pour afficher sur la carte</string> <string name="selected_gpx_info_show">\n\nAppui long pour afficher sur la carte</string>
<string name="delay_navigation_start">Démarrer la navigation pas à pas automatiquement</string> <string name="delay_navigation_start">Démarrer la navigation pas à pas automatiquement</string>
<string name="shared_string_selected_lowercase">sélectionné(s)</string> <string name="shared_string_selected_lowercase">sélectionné(s)</string>
<string name="gpx_split_interval">Intervalle de division</string> <string name="gpx_split_interval">Intervalle de fractionnement</string>
<string name="local_index_gpx_info_show">\n\nAppui long pour afficher les options</string> <string name="local_index_gpx_info_show">\n\nAppui long pour afficher les options</string>
<string name="gpx_info_subtracks">Sections : %1$s </string> <string name="gpx_info_subtracks">Sections : %1$s </string>
<string name="gpx_info_waypoints">Points de passage : %1$s</string> <string name="gpx_info_waypoints">Points de passage : %1$s</string>
@ -4030,4 +4030,12 @@
<string name="routing_attr_short_way_description">Itinéraire court optimisé (plus économe en énergie)</string> <string name="routing_attr_short_way_description">Itinéraire court optimisé (plus économe en énergie)</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">Masquer les limites des réserves naturelles, des zones protégées et des parcs nationaux</string> <string name="rendering_attr_noNatureReserveBoundaries_description">Masquer les limites des réserves naturelles, des zones protégées et des parcs nationaux</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">Limites naturelles</string> <string name="rendering_attr_noNatureReserveBoundaries_name">Limites naturelles</string>
<string name="select_segments_description">%1$s contient plus d\'un segment, vous devez sélectionner le tronçon nécessaire à la navigation.</string>
<string name="routing_attr_driving_style_description">Sélectionnez le mode de conduite pour avoir l\'itinéraire le plus court, le plus rapide, ou le plus sûr</string>
<string name="quick_action_coordinates_widget_descr">Appuyer pour afficher ou cacher le widget Coordonnées sur la carte.</string>
<string name="snap_to_road_descr">Licône de localisation va se déplacer sur le trajet en cours.</string>
<string name="select_another_colorization">Veuillez sélectionner un autre type de colorisation.</string>
<string name="trip_recording_logging_interval_info">L\'intervalle denregistrement définit la fréquence à laquelle OsmAnd récupérera les données de localisation.</string>
<string name="trip_recording_save_and_continue">Enregistrer et continuer</string>
<string name="lost_data_warning">Toutes les données non enregistrées seront perdues.</string>
</resources> </resources>

View file

@ -3881,4 +3881,17 @@
<string name="poi_wildlife_crossing_bat_bridge">Ponte para morcegos</string> <string name="poi_wildlife_crossing_bat_bridge">Ponte para morcegos</string>
<string name="poi_wildlife_crossing">Paso de fauna</string> <string name="poi_wildlife_crossing">Paso de fauna</string>
<string name="poi_swimming_area">Área de natación</string> <string name="poi_swimming_area">Área de natación</string>
<string name="poi_local_ref">Referencia local</string>
<string name="poi_geodesist">Xeodésico</string>
<string name="poi_conference_centre">Centro de conferencias</string>
<string name="poi_mobile_library">Posición de parada de biblioteca móbil</string>
<string name="poi_summit_register_no">Rexistro do cumio: no</string>
<string name="poi_summit_register_yes">Rexistro do cumio: si</string>
<string name="poi_piste_status_closed">Estado da pista: pechada</string>
<string name="poi_piste_status_open">Estado da pista: aberta</string>
<string name="poi_patrolled_no">Patrullado: non</string>
<string name="poi_patrolled_yes">Patrullado: si</string>
<string name="poi_gladed_yes">Arborado: si</string>
<string name="poi_piste_name">Nome da pista</string>
<string name="poi_piste_ski_jump">Salto de esquí</string>
</resources> </resources>

View file

@ -2567,7 +2567,7 @@ Lon %2$s</string>
<string name="routing_attr_relief_smoothness_factor_name">Escoller variación da altitude</string> <string name="routing_attr_relief_smoothness_factor_name">Escoller variación da altitude</string>
<string name="rendering_attr_depthContours_description">Amosar curvas e puntos do afundimento.</string> <string name="rendering_attr_depthContours_description">Amosar curvas e puntos do afundimento.</string>
<string name="rendering_attr_depthContours_name">Curvas do afundimento náuticos</string> <string name="rendering_attr_depthContours_name">Curvas do afundimento náuticos</string>
<string name="auto_split_recording_title">División automática das gravacións en intres</string> <string name="auto_split_recording_title">Dividir gravacións após unha pausa</string>
<string name="auto_split_recording_descr">Comezar novo segmento despois dun intre de 6 min, nova pista despois dun intre de 2 h, ou novo ficheiro despois dun intre máis longo se mudaches a data.</string> <string name="auto_split_recording_descr">Comezar novo segmento despois dun intre de 6 min, nova pista despois dun intre de 2 h, ou novo ficheiro despois dun intre máis longo se mudaches a data.</string>
<string name="shared_string_paused">Detido</string> <string name="shared_string_paused">Detido</string>
<string name="save_track_min_distance">Mínimo desprazamento para o rexistro</string> <string name="save_track_min_distance">Mínimo desprazamento para o rexistro</string>
@ -3695,9 +3695,9 @@ Lon %2$s</string>
<string name="lenght_limit_description">Fornece a lonxitude do teu vehículo. Algunhas restricións de ruta poden ser aplicadas a vehículos longos.</string> <string name="lenght_limit_description">Fornece a lonxitude do teu vehículo. Algunhas restricións de ruta poden ser aplicadas a vehículos longos.</string>
<string name="quick_action_remove_next_destination">Eliminar punto de destino máis preto</string> <string name="quick_action_remove_next_destination">Eliminar punto de destino máis preto</string>
<string name="please_provide_point_name_error">Fornece un nome para o punto</string> <string name="please_provide_point_name_error">Fornece un nome para o punto</string>
<string name="quick_action_remove_next_destination_descr">O punto de destino actual na ruta será eliminado. Se fora o destino, a navegación sería interrompida.</string> <string name="quick_action_remove_next_destination_descr">Elimina o seguinte destino da ruta. Se é o destino final, a navegación será detida.</string>
<string name="search_download_wikipedia_maps">Baixar mapas da Wikipedia</string> <string name="search_download_wikipedia_maps">Baixar mapas da Wikipedia</string>
<string name="plugin_wikipedia_description">Obter información sobre os puntos de interese da Wikipedia. É o teu guía de peto sen conexión - só activar o complemento da Wikipedia e desfrutar dos artigos sobre os elementos ó teu redor.</string> <string name="plugin_wikipedia_description">Obtén información sobre os puntos de interese da Wikipedia, unha guía de peto sen conexión que inclúe artigos sobre obxectos e destinos.</string>
<string name="app_mode_enduro_motorcycle">Enduro</string> <string name="app_mode_enduro_motorcycle">Enduro</string>
<string name="app_mode_motor_scooter">Scooter</string> <string name="app_mode_motor_scooter">Scooter</string>
<string name="app_mode_wheelchair">Cadeira de rodas</string> <string name="app_mode_wheelchair">Cadeira de rodas</string>
@ -3808,11 +3808,11 @@ Lon %2$s</string>
<string name="start_finish_icons">Iconas de inicio e fin</string> <string name="start_finish_icons">Iconas de inicio e fin</string>
<string name="contour_lines_thanks">Grazas por mercar \'Curvas de nivel\'</string> <string name="contour_lines_thanks">Grazas por mercar \'Curvas de nivel\'</string>
<string name="osm_live_payment_desc_hw">A subscrición é cobrada por período escollido. Cancélaa na AppGallery en calquera intre.</string> <string name="osm_live_payment_desc_hw">A subscrición é cobrada por período escollido. Cancélaa na AppGallery en calquera intre.</string>
<string name="osm_live_payment_subscription_management_hw">O pagamento será cargado na túa conta da AppGallery no mesmo intre da confirmación da compra. <string name="osm_live_payment_subscription_management_hw">O pagamento será cobrado á túa conta do AppGallery ao confirmar a compra.
\n \n
\nA subscrición é renovada de xeito automático a menos que sexa cancelada antes da data de renovación. A túa conta será cargada polo período de renovación (mes/trimestre/ano) só na data de renovación. \nA subscrición é renovada de xeito automático a menos que se cancele antes da data de renovación. A conta será cobrada polo período de renovación (mes/trimestre/ano) só na data de renovación.
\n \n
\nPodes xestionar e cancelar as túas subscricións indo ós axustes da AppGallery.</string> \nPodes administrar e desbotar as subscricións nos axustes do AppGallery.</string>
<string name="routing_attr_avoid_footways_description">Evitar sendas peonís, camiños e beirarrúas</string> <string name="routing_attr_avoid_footways_description">Evitar sendas peonís, camiños e beirarrúas</string>
<string name="routing_attr_avoid_footways_name">Evitar sendas peonís</string> <string name="routing_attr_avoid_footways_name">Evitar sendas peonís</string>
<string name="development">Desenvolvemento</string> <string name="development">Desenvolvemento</string>
@ -4033,4 +4033,25 @@ Lon %2$s</string>
<string name="track_has_no_altitude">A pista non contén datos de altitude.</string> <string name="track_has_no_altitude">A pista non contén datos de altitude.</string>
<string name="track_has_no_speed">A pista non contén datos de velocidade.</string> <string name="track_has_no_speed">A pista non contén datos de velocidade.</string>
<string name="select_another_colorization">Escolle outro tipo de cor.</string> <string name="select_another_colorization">Escolle outro tipo de cor.</string>
<string name="live_update_frequency_hour_variant">As actualizacións de mapas serán comprobadas cada hora. A seguinte vez %1$s en %2$s.</string>
<string name="select_segments">Escoller segmentos</string>
<string name="select_segments_description">%1$s contén máis dun segmento, precisas selecionar a parte necesaria para a navegación.</string>
<string name="segments_count">Segmento %1$d</string>
<string name="activity_type_water_name">Auga</string>
<string name="activity_type_winter_name">Inverno</string>
<string name="activity_type_snowmobile_name">Motoneve</string>
<string name="activity_type_riding_name">Equitación</string>
<string name="activity_type_racing_name">Carreira</string>
<string name="activity_type_mountainbike_name">Bicicleta de montaña</string>
<string name="activity_type_cycling_name">Bicicleta</string>
<string name="activity_type_hiking_name">Sendeirismo</string>
<string name="activity_type_running_name">Correndo</string>
<string name="activity_type_walking_name">A pé</string>
<string name="activity_type_offroad_name">Todo terreo</string>
<string name="activity_type_motorbike_name">Motocicleta</string>
<string name="activity_type_car_name">Automóbil</string>
<string name="temporary_conditional_routing_descr">Empregar as restricións de estrada que están activas agora no mapa</string>
<string name="routing_attr_short_way_description">Ruta optimizada máis curta (baixo consumo)</string>
<string name="routing_attr_driving_style_description">Escolle o propósito da condución para obter unha ruta máis curta, máis rápida ou máis segura</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">Agochar reservas naturais, áreas protexidas e de parques nacionais</string>
</resources> </resources>

View file

@ -4039,4 +4039,7 @@
<string name="live_update_frequency_week_variant">Az alkalmazás hetente ellenőrzi a térképfrissítéseket. Következő ellenőrzés: %1$s (ennyi idő múlva: %2$s).</string> <string name="live_update_frequency_week_variant">Az alkalmazás hetente ellenőrzi a térképfrissítéseket. Következő ellenőrzés: %1$s (ennyi idő múlva: %2$s).</string>
<string name="live_update_frequency_day_variant">Az alkalmazás naponta ellenőrzi a térképfrissítéseket. Következő ellenőrzés: %1$s (ennyi idő múlva: %2$s).</string> <string name="live_update_frequency_day_variant">Az alkalmazás naponta ellenőrzi a térképfrissítéseket. Következő ellenőrzés: %1$s (ennyi idő múlva: %2$s).</string>
<string name="live_update_frequency_hour_variant">Az alkalmazás óránként ellenőrzi a térképfrissítéseket. Következő ellenőrzés: %1$s (ennyi idő múlva: %2$s).</string> <string name="live_update_frequency_hour_variant">Az alkalmazás óránként ellenőrzi a térképfrissítéseket. Következő ellenőrzés: %1$s (ennyi idő múlva: %2$s).</string>
<string name="trip_recording_logging_interval_info">A naplózási intervallum az az időköz, amelyben az OsmAnd lekéri az aktuális helyadatokat.</string>
<string name="trip_recording_save_and_continue">Mentés és folytatás</string>
<string name="lost_data_warning">Minden nem mentett adat törlődni fog.</string>
</resources> </resources>

View file

@ -3893,4 +3893,5 @@
<string name="poi_piste_ski_jump">Skíðastökk</string> <string name="poi_piste_ski_jump">Skíðastökk</string>
<string name="poi_local_ref">Staðvær tilvísun</string> <string name="poi_local_ref">Staðvær tilvísun</string>
<string name="poi_conference_centre">Ráðstefnumiðstöð</string> <string name="poi_conference_centre">Ráðstefnumiðstöð</string>
<string name="poi_geodesist">Landmælingar</string>
</resources> </resources>

View file

@ -4035,9 +4035,9 @@
<string name="updated">Uppfært: %s</string> <string name="updated">Uppfært: %s</string>
<string name="last_time_checked">Síðast athugað: %s</string> <string name="last_time_checked">Síðast athugað: %s</string>
<string name="update_frequency">Uppfærslutíðni</string> <string name="update_frequency">Uppfærslutíðni</string>
<string name="live_update_frequency_week_variant">Uppfærslur korta verða athugaðar í hverri viku. Næsta skipti%1$s eftir %2$s.</string> <string name="live_update_frequency_week_variant">Uppfærslur korta verða athugaðar í hverri viku. Næsta skipti %1$s eftir %2$s.</string>
<string name="live_update_frequency_day_variant">Uppfærslur korta verða athugaðar á hverjum degi. Næsta skipti%1$s eftir %2$s.</string> <string name="live_update_frequency_day_variant">Uppfærslur korta verða athugaðar á hverjum degi. Næsta skipti %1$s eftir %2$s.</string>
<string name="live_update_frequency_hour_variant">Uppfærslur korta verða athugaðar á klukkustundar fresti. Næsta skipti%1$s eftir %2$s.</string> <string name="live_update_frequency_hour_variant">Uppfærslur korta verða athugaðar á klukkustundar fresti. Næsta skipti %1$s eftir %2$s.</string>
<string name="delete_updates">Eyða uppfærslum</string> <string name="delete_updates">Eyða uppfærslum</string>
<string name="live_update_delete_updates_msg">Ertu viss um að þú viljir eyða öllum %s raunuppfærslum\?</string> <string name="live_update_delete_updates_msg">Ertu viss um að þú viljir eyða öllum %s raunuppfærslum\?</string>
<string name="purchases">Innkaup</string> <string name="purchases">Innkaup</string>

View file

@ -9,7 +9,7 @@
<string name="map_widget_show_destination_arrow">הצגת הכיוון ליעד</string> <string name="map_widget_show_destination_arrow">הצגת הכיוון ליעד</string>
<string name="enable_plugin_monitoring_services">יש להפעיל את תוסף „מעקב הטיול” כדי להשתמש בשירותי רישום מיקום (מעקב חי, רישום GPX)</string> <string name="enable_plugin_monitoring_services">יש להפעיל את תוסף „מעקב הטיול” כדי להשתמש בשירותי רישום מיקום (מעקב חי, רישום GPX)</string>
<string name="non_optimal_route_calculation">יש לחשב מסלול בלתי יעיל למרחקים ארוכים</string> <string name="non_optimal_route_calculation">יש לחשב מסלול בלתי יעיל למרחקים ארוכים</string>
<string name="gps_not_available">נא להפעיל את רכיב האיכון (GPS) בהגדרות</string> <string name="gps_not_available">נא להפעיל את ה־GPS בהגדרות</string>
<string name="map_widget_monitoring_services">שירותי רישום</string> <string name="map_widget_monitoring_services">שירותי רישום</string>
<string name="no_route">אין מסלול</string> <string name="no_route">אין מסלול</string>
<string name="delete_target_point">הסרת יעד</string> <string name="delete_target_point">הסרת יעד</string>
@ -1881,7 +1881,7 @@
<string name="si_m_s">מטרים לשנייה</string> <string name="si_m_s">מטרים לשנייה</string>
<string name="si_min_km">דקות לקילומטר</string> <string name="si_min_km">דקות לקילומטר</string>
<string name="si_min_m">דקות למייל</string> <string name="si_min_m">דקות למייל</string>
<string name="si_nm_h">מיל ימי לשעה (קשר)</string> <string name="si_nm_h">מייל ימי לשעה (קשר)</string>
<string name="nm_h">קשר</string> <string name="nm_h">קשר</string>
<string name="m_s">מ/שנ׳</string> <string name="m_s">מ/שנ׳</string>
<string name="shared_string_trip_recording">הקלטת טיול</string> <string name="shared_string_trip_recording">הקלטת טיול</string>
@ -4047,4 +4047,8 @@
<string name="latest_openstreetmap_update">קיים עדכון ל־OpenStreetMap:</string> <string name="latest_openstreetmap_update">קיים עדכון ל־OpenStreetMap:</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">להסתיר גבולות של שמורות טבע, אזורים מוגנים ופארקים ציבוריים</string> <string name="rendering_attr_noNatureReserveBoundaries_description">להסתיר גבולות של שמורות טבע, אזורים מוגנים ופארקים ציבוריים</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">גבולות טבעיים</string> <string name="rendering_attr_noNatureReserveBoundaries_name">גבולות טבעיים</string>
<string name="live_update_delete_updates_msg">למחוק את כל העדכונים החיים של %s\?</string>
<string name="trip_recording_logging_interval_info">הגדרת הפרש קבוע בין הבקשות של OsmAnd לקבלת נתוני המיקום הנוכחיים.</string>
<string name="trip_recording_save_and_continue">לשמור ולהמשיך</string>
<string name="lost_data_warning">כל הנתונים שלא נשמרו יאבדו.</string>
</resources> </resources>

View file

@ -2084,7 +2084,6 @@ POIの更新は利用できません</string>
<string name="shared_string_time">時間</string> <string name="shared_string_time">時間</string>
<string name="total_distance">総走行距離</string> <string name="total_distance">総走行距離</string>
<string name="routing_attr_height_obstacles_name">標高データを使用</string> <string name="routing_attr_height_obstacles_name">標高データを使用</string>
<string name="rendering_attr_hideWaterPolygons_description">水域</string> <string name="rendering_attr_hideWaterPolygons_description">水域</string>
<string name="rendering_attr_hideWaterPolygons_name">水域ポリゴン</string> <string name="rendering_attr_hideWaterPolygons_name">水域ポリゴン</string>
<string name="wiki_around">近隣のWikipedia記事</string> <string name="wiki_around">近隣のWikipedia記事</string>
@ -2133,14 +2132,14 @@ POIの更新は利用できません</string>
<string name="quick_action_take_photo_note_descr">画面中央に写真メモを追加するボタンです。</string> <string name="quick_action_take_photo_note_descr">画面中央に写真メモを追加するボタンです。</string>
<string name="quick_action_add_osm_bug_descr">画面中央にOSMメモを追加するボタンです。</string> <string name="quick_action_add_osm_bug_descr">画面中央にOSMメモを追加するボタンです。</string>
<string name="quick_action_add_poi_descr">画面中央にPOIを追加できるボタンです。</string> <string name="quick_action_add_poi_descr">画面中央にPOIを追加できるボタンです。</string>
<string name="quick_action_navigation_voice_descr">ナビゲーション中の案内音声の有効無効を切り替えることが出来ます。</string> <string name="quick_action_navigation_voice_descr">ナビゲーション中の案内音声の有効/無効を切り替えます。</string>
<string name="quick_action_add_parking_descr">画面中央に駐車場所を追加するボタンです。</string> <string name="quick_action_add_parking_descr">画面中央に駐車場所を追加するボタンです。</string>
<string name="quick_action_interim_dialog">実行時に入力画面を表示</string> <string name="quick_action_interim_dialog">実行時に入力画面を表示</string>
<string name="favorite_empty_place_name">場所</string> <string name="favorite_empty_place_name">場所</string>
<string name="quick_action_duplicates">重複を避けるためにクイックアクション名は[%1$s]に変更されました。</string> <string name="quick_action_duplicates">重複を避けるためにクイックアクション名は[%1$s]に変更されました。</string>
<string name="quick_action_duplicate">クイックアクション名の重複</string> <string name="quick_action_duplicate">クイックアクション名の重複</string>
<string name="quick_action_showhide_favorites_descr">マップ画面でのお気に入り地点の表示/非表示の切替が出来ます。</string> <string name="quick_action_showhide_favorites_descr">マップ画面でのお気に入り地点の表示/非表示を切り替えます。</string>
<string name="quick_action_showhide_poi_descr">マップ画面でのPOIの表示/非表示の切替が出来ます。</string> <string name="quick_action_showhide_poi_descr">マップ画面でのPOIの表示/非表示を切り替えます。</string>
<string name="quick_action_poi_show">%1$sを表示</string> <string name="quick_action_poi_show">%1$sを表示</string>
<string name="quick_action_poi_hide">%1$sを非表示</string> <string name="quick_action_poi_hide">%1$sを非表示</string>
<string name="quick_action_add_category">カテゴリーを追加</string> <string name="quick_action_add_category">カテゴリーを追加</string>
@ -2546,7 +2545,7 @@ POIの更新は利用できません</string>
<string name="by_type">種類別</string> <string name="by_type">種類別</string>
<string name="digits_quantity">小数点以下の桁数</string> <string name="digits_quantity">小数点以下の桁数</string>
<string name="go_to_next_field">次の入力項目へ移動</string> <string name="go_to_next_field">次の入力項目へ移動</string>
<string name="tap_on_map_to_hide_interface_descr">マップ画面のタップで操作ボタンやウィジェットの表示と交互に切り替えます。</string> <string name="tap_on_map_to_hide_interface_descr">マップ画面のタップで操作ボタンやウィジェットの表示切り替えます。</string>
<string name="tap_on_map_to_hide_interface">フルスクリーンモード</string> <string name="tap_on_map_to_hide_interface">フルスクリーンモード</string>
<string name="live_monitoring_max_interval_to_send">オンライン追跡用のバッファ指定</string> <string name="live_monitoring_max_interval_to_send">オンライン追跡用のバッファ指定</string>
<string name="live_monitoring_max_interval_to_send_desrc">送信用現在地データをネット接続せずにどのくらいの時間記録するか、バッファを指定します</string> <string name="live_monitoring_max_interval_to_send_desrc">送信用現在地データをネット接続せずにどのくらいの時間記録するか、バッファを指定します</string>
@ -2829,7 +2828,7 @@ POIの更新は利用できません</string>
<string name="osm_recipient_stat">編集 %1$s, 合計 %2$s mBTC</string> <string name="osm_recipient_stat">編集 %1$s, 合計 %2$s mBTC</string>
<string name="shared_string_launch">起動</string> <string name="shared_string_launch">起動</string>
<string name="lang_gn_py">グアラニー語</string> <string name="lang_gn_py">グアラニー語</string>
<string name="quick_action_switch_day_night_descr">OsmAndマップ表示の昼/夜モードを切り替えることが出来ます。</string> <string name="quick_action_switch_day_night_descr">OsmAndマップ表示の昼/夜モードを切り替えます。</string>
<string name="quick_action_switch_day_mode">昼モード</string> <string name="quick_action_switch_day_mode">昼モード</string>
<string name="quick_action_switch_night_mode">夜モード</string> <string name="quick_action_switch_night_mode">夜モード</string>
<string name="quick_action_day_night_switch_mode">昼/夜モードの切り替え</string> <string name="quick_action_day_night_switch_mode">昼/夜モードの切り替え</string>
@ -3715,7 +3714,7 @@ POIの更新は利用できません</string>
<string name="vessel_height_warning">低い橋を避けるために船の高さを調整できます。橋が可動式の場合は、開いた状態の高さが参照されます。</string> <string name="vessel_height_warning">低い橋を避けるために船の高さを調整できます。橋が可動式の場合は、開いた状態の高さが参照されます。</string>
<string name="vessel_height_limit_description">低い橋を避けるために船の高さを設定します。注:橋が可動式の場合は、開いた状態の高さが参照されます。</string> <string name="vessel_height_limit_description">低い橋を避けるために船の高さを設定します。注:橋が可動式の場合は、開いた状態の高さが参照されます。</string>
<string name="vessel_width_limit_description">狭い橋を避けるために船の幅を設定します</string> <string name="vessel_width_limit_description">狭い橋を避けるために船の幅を設定します</string>
<string name="quick_action_showhide_mapillary_descr">マップ上のMapillaryレイヤーの表示/非表示を切り替えるトグルボタンです。</string> <string name="quick_action_showhide_mapillary_descr">マップ上のMapillaryレイヤーの表示/非表示を切り替えす。</string>
<string name="routing_attr_length_description">ルート検索時に指定した車両の長さを考慮します。</string> <string name="routing_attr_length_description">ルート検索時に指定した車両の長さを考慮します。</string>
<string name="routing_attr_length_name">長さ制限</string> <string name="routing_attr_length_name">長さ制限</string>
<string name="shared_string_bearing">ベアリング</string> <string name="shared_string_bearing">ベアリング</string>
@ -3849,4 +3848,109 @@ POIの更新は利用できません</string>
\nグラフは再計算後に利用できるようになります。</string> \nグラフは再計算後に利用できるようになります。</string>
<string name="use_dev_url_descr">OSM通知/ POI / GPXのアップロードをテストする場合、openstreetmap.orgではなくdev.openstreetmap.orgを使用するよう切り替えます。</string> <string name="use_dev_url_descr">OSM通知/ POI / GPXのアップロードをテストする場合、openstreetmap.orgではなくdev.openstreetmap.orgを使用するよう切り替えます。</string>
<string name="use_dev_url">dev.openstreetmap.orgを使用</string> <string name="use_dev_url">dev.openstreetmap.orgを使用</string>
<string name="announcement_time_prepare">次々回案内(中距離)</string>
<string name="announcement_time_prepare_long">次回案内(長距離)</string>
<string name="shared_string_sec"></string>
<string name="announcement_time_passing">通過する</string>
<string name="announcement_time_approach">目標に接近</string>
<string name="shared_string_turn">方向転換</string>
<string name="announcement_time_off_route">ルートからの逸脱</string>
<string name="announcement_time_arrive">目的地に到着</string>
<string name="announcement_time_intervals">タイミングと距離の間隔</string>
<string name="announcement_time_title">案内タイミング</string>
<string name="announcement_time_descr">音声による案内タイミングは、音声形式、現在のナビゲーション速度、および標準のナビゲーション速度によって異なります。</string>
<string name="start_recording">記録の開始</string>
<string name="show_track_on_map">マップ上に経路を表示</string>
<string name="routing_engine_vehicle_type_wheelchair">車椅子</string>
<string name="routing_engine_vehicle_type_hiking">ハイキング</string>
<string name="routing_engine_vehicle_type_walking">徒歩</string>
<string name="routing_engine_vehicle_type_cycling_electric">電動自転車</string>
<string name="routing_engine_vehicle_type_cycling_mountain">山岳(MTB)サイクリング</string>
<string name="routing_engine_vehicle_type_cycling_road">ロードサイクリング</string>
<string name="routing_engine_vehicle_type_cycling_regular">一般的なサイクリング</string>
<string name="routing_engine_vehicle_type_hgv">重量物運搬車</string>
<string name="routing_engine_vehicle_type_small_truck">小型トラック</string>
<string name="routing_engine_vehicle_type_truck">トラック</string>
<string name="routing_engine_vehicle_type_scooter">スクーター</string>
<string name="routing_engine_vehicle_type_racingbike">レーシングバイク</string>
<string name="routing_engine_vehicle_type_mtb">マウンテンバイク</string>
<string name="message_server_error">サーバーエラー: %1$s</string>
<string name="message_name_is_already_exists">この名前はすでに存在します</string>
<string name="delete_online_routing_engine">このオンラインルーティングエンジンを削除しますか?</string>
<string name="context_menu_read_full">全文を読む</string>
<string name="context_menu_edit_descr">説明の編集</string>
<string name="delete_waypoints">経由地点を削除</string>
<string name="copy_to_map_markers">マップマーカーにコピー</string>
<string name="copy_to_map_favorites">お気に入りにコピー</string>
<string name="upload_photo">アップロード中</string>
<string name="upload_photo_completed">アップロードが完了しました</string>
<string name="uploading_count">%2$d個中%1$d個をアップロード中</string>
<string name="select_segments">セグメントの選択</string>
<string name="select_segments_description">%1$sには複数のセグメントが含まれているため、ナビゲーションに必要な部分を選択する必要があります。</string>
<string name="segments_count">%1$dセグメント</string>
<string name="uploaded_count">%2$d個中%1$d個をアップロードしました</string>
<string name="toast_select_edits_for_upload">アップロードする編集を選択</string>
<string name="hillshade_slope_contour_lines">陰影起伏図 / 勾配 / 等高線</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviewsは、レストラン、ホテル、美術館、中途経由地点などの公共の場所に関するコミュニティが運営するプロジェクトです。写真、レビュー、他のシステムへのリンク、OpenStreetMap、Wikipediaへのリンクなど、それらに関するすべての公開情報を収集しています。
\n
\nOpenPlaceReviewデータは全て公開されており、誰でもアクセス可能です。http://openplacereviews.org/data
\n
\n詳細については下記サイトをご覧ください。http://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">test.openplacereviews.orgを使用</string>
<string name="login_open_place_reviews">OpenPlaceReviewsにログイン</string>
<string name="activity_type_water_name"></string>
<string name="activity_type_winter_name"></string>
<string name="activity_type_snowmobile_name">スノーモービル</string>
<string name="activity_type_riding_name">乗馬</string>
<string name="activity_type_racing_name">レーシング</string>
<string name="activity_type_mountainbike_name">マウンテンバイク</string>
<string name="activity_type_cycling_name">自転車</string>
<string name="activity_type_hiking_name">ハイキング</string>
<string name="activity_type_running_name">ランニング</string>
<string name="activity_type_walking_name">徒歩</string>
<string name="activity_type_offroad_name">未舗装道路</string>
<string name="activity_type_motorbike_name">オートバイ</string>
<string name="routing_attr_short_way_description">最適化されたなるべく短いルート (省エネ)</string>
<string name="activity_type_car_name"></string>
<string name="temporary_conditional_routing_descr">マップ上で現在有効になっている道路の制限を使用します</string>
<string name="routing_attr_driving_style_description">運転の目的を選択することで、より短くより速くより安全なルートを取得します</string>
<string name="snap_to_road_descr">現在地アイコンが現在のナビゲーションルートに保持されます</string>
<string name="map_orientation_threshold_descr">速度がしきい値未満の場合は、マップビューを回転させないでください</string>
<string name="restart">再起動</string>
<string name="shared_strings_all_regions">すべての地域</string>
<string name="delete_number_files_question">%1$d個のファイルを削除しますか</string>
<string name="track_recording_stop_without_saving">保存せずに終了</string>
<string name="track_recording_description">記録を停止してもよろしいですか?
\n保存しない場合データはすべて失われます。</string>
<string name="track_recording_save_and_stop">記録を保存して終了</string>
<string name="track_recording_title">記録を停止しました</string>
<string name="on_pause">一時停止中</string>
<string name="app_restart_required">一部の設定を適用するには、アプリケーションの再起動が必要です。</string>
<string name="routing_attr_height_obstacles_description">ルート検索時になるべく急な上り坂を回避するようにします。</string>
<string name="quick_action_coordinates_widget_descr">マップ上で座標ウィジェットの表示/非表示を切り替えます。</string>
<string name="map_widget_distance_by_tap">タップで距離</string>
<string name="latest_openstreetmap_update">利用可能な最新OpenStreetMapの更新:</string>
<string name="updated">更新: %s</string>
<string name="last_time_checked">最後にチェック時間: %s</string>
<string name="update_frequency">更新間隔</string>
<string name="live_update_frequency_week_variant">マップの更新は毎週チェックされます。次回は%2$sの%1$sです。</string>
<string name="live_update_frequency_day_variant">マップの更新は毎日チェックされます。次回は%2$sの%1$sです。</string>
<string name="live_update_frequency_hour_variant">マップの更新は1時間ごとにチェックされます。次回は%2$sの%1$sです。</string>
<string name="delete_updates">更新の削除</string>
<string name="live_update_delete_updates_msg">%sのライブアップデートをすべて削除してもよろしいですか</string>
<string name="purchases">購入</string>
<string name="select_category_descr">カテゴリを選択するか、新しいカテゴリを追加します</string>
<string name="track_recording_will_be_continued">記録を継続します。</string>
<string name="copy_poi_name">POI名をコピー</string>
<string name="quick_action_show_hide_title">表示/非表示</string>
<string name="shared_string_interval">間隔</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">自然保護区、保護地域、国立公園の境界を非表示にします</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">自然保護区の境界</string>
<string name="track_has_no_altitude">経路には標高データは含まれていません。</string>
<string name="track_has_no_speed">経路には速度データは含まれていません。</string>
<string name="select_another_colorization">別タイプのカラーを選択してください。</string>
<string name="trip_recording_logging_interval_info">ログ記録間隔は、OsmAndが現在の位置データを要求する期間を設定します。</string>
<string name="trip_recording_save_and_continue">保存して続行</string>
<string name="lost_data_warning">保存されていないデータはすべて失われます。</string>
</resources> </resources>

View file

@ -1622,4 +1622,67 @@
<string name="poi_video_telephone">Video</string> <string name="poi_video_telephone">Video</string>
<string name="poi_volcano_status">Status</string> <string name="poi_volcano_status">Status</string>
<string name="poi_volcano_type">Type</string> <string name="poi_volcano_type">Type</string>
<string name="poi_historic_civilization_greek_egyptian">Sivilisasjon: gresk-egyptisk (332 f.Kr. 30 f.Kr.)</string>
<string name="poi_historic_civilization_ancient_egyptian">Sivilisasjon: Det gamle Egypt (inntil 332 f.Kr.)</string>
<string name="poi_historic_civilization_imperial_chinese">Sivilisasjon: Det kinesiske keiserriket (221 f.Kr. 1911 e.Kr.)</string>
<string name="poi_historic_stone">Historisk stein</string>
<string name="poi_historic_era_neolithic">Historisk periode: neolittisk tid (yngre steinalder)</string>
<string name="poi_historic_era_mesolithic">Historisk periode: mesolittisk tid</string>
<string name="poi_historic_era_paleolithic">Historisk periode: paleolittisk tid (2,6 millioner 10000 år før nåtid)</string>
<string name="poi_historic_period_ptolemaic_egypt">Historisk periode: Det ptolemeiske Egypt (305 f.Kr. 30 f.Kr.)</string>
<string name="poi_historic_period_hellenistic_greece">Historisk periode: Det hellenistiske Hellas</string>
<string name="poi_historic_period_roman_republic">Historisk periode: Den romerske republikk (508 f.Kr. 27 f.Kr.)</string>
<string name="poi_historic_civilization_ancient_roman">Sivilisasjon: Den romerske antikken (753 f.Kr. 284 e.Kr.)</string>
<string name="poi_historic_period_iron_age">Historisk periode: jernalder</string>
<string name="poi_historic_period_archaic_greece">Historisk periode: Det arkaiske Hellas</string>
<string name="poi_historic_period_classical_greece">Historisk periode: Det klassiske Hellas (5. 4. århundre f.Kr.)</string>
<string name="poi_historic_period_bronze_age">Historisk periode: bronsealder</string>
<string name="poi_historic_period_stone_bronze_undetermined">Historisk periode: steinalder / bronsealder (ubestemt)</string>
<string name="poi_historic_civilization_minoan">Sivilisasjon: minoisk</string>
<string name="poi_historic_civilization_western_roman">Sivilisasjon: vestromersk (285 476)</string>
<string name="poi_historic_civilization_celtic">Sivilisasjon: keltisk</string>
<string name="poi_historic_civilization_byzantine">Sivilisasjon: bysantinsk (285 1453)</string>
<string name="poi_historic_civilization_roman">Sivilisasjon: romersk</string>
<string name="poi_historic_civilization_ancient_greek">Sivilisasjon: Den greske antikken</string>
<string name="poi_historic_civilization_prehistoric">Sivilisasjon: forhistorisk tid</string>
<string name="poi_historic_manor">Historisk herregård</string>
<string name="poi_historic_yes">Historisk objekt</string>
<string name="poi_material_limestone">Materiale: kalkstein</string>
<string name="poi_material_granite_stone">Materiale: granittstein</string>
<string name="poi_material_sandstone">Materiale: sandstein</string>
<string name="poi_material_stone">Materiale: stein</string>
<string name="poi_social_facility_shelter">Husly</string>
<string name="poi_route_subway_ref">T-bane</string>
<string name="poi_route_ferry_ref">Ferge</string>
<string name="poi_route_bus_ref">Buss</string>
<string name="poi_surface_snow">Overflate: snø</string>
<string name="poi_surface_salt">Overflate: salt</string>
<string name="poi_surface_ice">Overflate: is</string>
<string name="poi_surface_mud">Overflate: gjørme</string>
<string name="poi_surface_dirt">Overflate: jord</string>
<string name="poi_surface_ground">Overflate: jord</string>
<string name="poi_surface_grass">Overflate: gress</string>
<string name="poi_surface_sand">Overflate: sand</string>
<string name="poi_surface_compacted">Overflate: komprimert</string>
<string name="poi_surface_fine_gravel">Overflate: fin grus</string>
<string name="poi_surface_gravel">Overflate: grus</string>
<string name="poi_surface_wood">Overflate: tre</string>
<string name="poi_surface_metal">Overflate: metall</string>
<string name="poi_surface_stone">Overflate: stein</string>
<string name="poi_surface_pebblestone">Overflate: rullestein (liten)</string>
<string name="poi_surface_paving_stones">Overflate: belegningsstein</string>
<string name="poi_surface_cobblestone">Overflate: kuppelstein</string>
<string name="poi_surface_sett">Overflate: brostein</string>
<string name="poi_surface_concrete">Overflate: betong</string>
<string name="poi_surface_asphalt">Overflate: asfalt</string>
<string name="poi_surface_paved">Overflate: fast dekke</string>
<string name="poi_surface_unpaved">Overflate: uten fast dekke</string>
<string name="poi_shelter_type_lean_to">Gapahuk</string>
<string name="poi_resource_stone">Stein</string>
<string name="poi_resource_sandstone">Sandstein</string>
<string name="poi_resource_limestone">Kalkstein</string>
<string name="poi_memorial_stone">Stein</string>
<string name="poi_barrier_entrance">Passasje i en mur eller et gjerde</string>
<string name="poi_shelter">Ly</string>
<string name="poi_boundary_stone">Grensestein</string>
</resources> </resources>

View file

@ -167,7 +167,7 @@
<string name="use_fluorescent_overlays">Fluorescerende overlegg</string> <string name="use_fluorescent_overlays">Fluorescerende overlegg</string>
<string name="use_fluorescent_overlays_descr">Bruk fluorescerende farger til å vise spor og ruter.</string> <string name="use_fluorescent_overlays_descr">Bruk fluorescerende farger til å vise spor og ruter.</string>
<string name="offline_edition">Frakoblet redigering</string> <string name="offline_edition">Frakoblet redigering</string>
<string name="offline_edition_descr">Bruk alltid frakoblet redigering.</string> <string name="offline_edition_descr">Hvis redigering uten nett er aktivert, lagres endringer lokalt først og lastes opp på forespørsel, ellers vil endringer bli lastet opp umiddelbart.</string>
<string name="free_version_message">Du kan laste ned eller oppdatere %1$s kart.</string> <string name="free_version_message">Du kan laste ned eller oppdatere %1$s kart.</string>
<string name="free_version_title">Gratisversjon</string> <string name="free_version_title">Gratisversjon</string>
<string name="poi_context_menu_showdescription">Vis interessepunkt-beskrivelse.</string> <string name="poi_context_menu_showdescription">Vis interessepunkt-beskrivelse.</string>
@ -401,7 +401,7 @@
<string name="search_offline_address">Offline-søk</string> <string name="search_offline_address">Offline-søk</string>
<string name="search_online_address">Nettbasert søk</string> <string name="search_online_address">Nettbasert søk</string>
<string name="max_level_download_tile">Maks. nettbasert zoom</string> <string name="max_level_download_tile">Maks. nettbasert zoom</string>
<string name="max_level_download_tile_descr">Ikke bla gjennom nettbaserte kartfliser for zoomnivåer utover dette.</string> <string name="max_level_download_tile_descr">Ikke bla gjennom nettbaserte kart for zoomnivåer utover dette.</string>
<string name="route_general_information">Total distanse %1$s, reisetid %2$d t %3$d min.</string> <string name="route_general_information">Total distanse %1$s, reisetid %2$d t %3$d min.</string>
<string name="router_service_descr">Nettbasert eller frakoblet navigeringstjeneste.</string> <string name="router_service_descr">Nettbasert eller frakoblet navigeringstjeneste.</string>
<string name="router_service">Navigeringstjeneste</string> <string name="router_service">Navigeringstjeneste</string>
@ -699,7 +699,7 @@
<string name="save_global_track_interval">Generelt loggeintervall</string> <string name="save_global_track_interval">Generelt loggeintervall</string>
<string name="int_hour">t</string> <string name="int_hour">t</string>
<string name="duration">Varighet</string> <string name="duration">Varighet</string>
<string name="distance">Avstand</string> <string name="distance">Distanse</string>
<string name="index_tours">Turer</string> <string name="index_tours">Turer</string>
<string name="shared_string_all">Alle</string> <string name="shared_string_all">Alle</string>
<string name="shared_string_more">Mer…</string> <string name="shared_string_more">Mer…</string>
@ -796,7 +796,7 @@
<string name="loading_cities">Laster byer…</string> <string name="loading_cities">Laster byer…</string>
<string name="invalid_locations">Ugyldige koordinater</string> <string name="invalid_locations">Ugyldige koordinater</string>
<string name="go_back_to_osmand">Tilbake til kartet</string> <string name="go_back_to_osmand">Tilbake til kartet</string>
<string name="osb_comment_dialog_success">Kommentar er lagt til</string> <string name="osb_comment_dialog_success">Kommentar lagt til</string>
<string name="no_buildings_found">Ingen bygninger funnet.</string> <string name="no_buildings_found">Ingen bygninger funnet.</string>
<string name="loading_streets_buildings">Laster gater/bygninger…</string> <string name="loading_streets_buildings">Laster gater/bygninger…</string>
<string name="fav_point_dublicate_message">Favorittnavn endret til \"%1$s\" for å unngå duplisering.</string> <string name="fav_point_dublicate_message">Favorittnavn endret til \"%1$s\" for å unngå duplisering.</string>
@ -924,7 +924,7 @@
<string name="copying_osmand_files">Kopierer OsmAnd-datafiler…</string> <string name="copying_osmand_files">Kopierer OsmAnd-datafiler…</string>
<string name="route_descr_destination">Reisemål</string> <string name="route_descr_destination">Reisemål</string>
<string name="gpx_file_name">GPX-filnavn</string> <string name="gpx_file_name">GPX-filnavn</string>
<string name="osmand_distance_planning_plugin_name">Distansekalkulator &amp; planleggingsverktøy</string> <string name="osmand_distance_planning_plugin_name">Distansekalkulator og planleggingsverktøy</string>
<string name="layer_hillshade">Relieffskyggelag</string> <string name="layer_hillshade">Relieffskyggelag</string>
<string name="download_hillshade_maps">Relieffskygger</string> <string name="download_hillshade_maps">Relieffskygger</string>
<string name="local_indexes_cat_av">Audio/Video-data</string> <string name="local_indexes_cat_av">Audio/Video-data</string>
@ -1339,7 +1339,7 @@
<string name="osn_comment_dialog_title">Legg til kommentar</string> <string name="osn_comment_dialog_title">Legg til kommentar</string>
<string name="navigation_item_description">Navigeringsoppsett.</string> <string name="navigation_item_description">Navigeringsoppsett.</string>
<string name="free_downloads_used_description">Viser hvor mange gratis nedlastinger som er igjen.</string> <string name="free_downloads_used_description">Viser hvor mange gratis nedlastinger som er igjen.</string>
<string name="route_distance">Avstand:</string> <string name="route_distance">Distanse:</string>
<string name="route_duration">Tid:</string> <string name="route_duration">Tid:</string>
<string name="shared_string_sound">Lyd</string> <string name="shared_string_sound">Lyd</string>
<string name="available_maps">Tilgjengelige kart</string> <string name="available_maps">Tilgjengelige kart</string>
@ -1492,7 +1492,7 @@
<string name="wait_current_task_finished">Vent til gjeldende oppgave er ferdig</string> <string name="wait_current_task_finished">Vent til gjeldende oppgave er ferdig</string>
<string name="recording_delete_confirm">Slett dette elementet\?</string> <string name="recording_delete_confirm">Slett dette elementet\?</string>
<string name="osmand_parking_delete">Slett parkeringsplassmarkør</string> <string name="osmand_parking_delete">Slett parkeringsplassmarkør</string>
<string name="local_openstreetmap_delete">Slett endring</string> <string name="local_openstreetmap_delete">Slett redigering</string>
<string name="poi_dialog_reopen">Gjenåpne</string> <string name="poi_dialog_reopen">Gjenåpne</string>
<string name="do_you_like_osmand">Liker du OsmAnd\?</string> <string name="do_you_like_osmand">Liker du OsmAnd\?</string>
<string name="building_number">Bygningsnummer</string> <string name="building_number">Bygningsnummer</string>
@ -1520,7 +1520,7 @@
<string name="lang_kn">Kannada</string> <string name="lang_kn">Kannada</string>
<string name="app_mode_bus">Buss</string> <string name="app_mode_bus">Buss</string>
<string name="app_mode_train">Tog</string> <string name="app_mode_train">Tog</string>
<string name="voice_data_unavailable">Valgte taledata er ikke tilgjengelig</string> <string name="voice_data_unavailable">Valgte talemeldingspakke er ikke tilgjengelig</string>
<string name="voice_data_corrupted">Spesifisert taledata er ødelagt</string> <string name="voice_data_corrupted">Spesifisert taledata er ødelagt</string>
<string name="voice_data_not_supported">Taledataversjon som ikke støttes</string> <string name="voice_data_not_supported">Taledataversjon som ikke støttes</string>
<string name="background_router_service_descr">Sporer posisjonen din mens skjermen er slått av.</string> <string name="background_router_service_descr">Sporer posisjonen din mens skjermen er slått av.</string>
@ -1878,7 +1878,7 @@
<string name="context_menu_item_add_parking_point">Marker som parkeringsplass</string> <string name="context_menu_item_add_parking_point">Marker som parkeringsplass</string>
<string name="route_roundabout">Rundkjøring: Ta avkjøring %1$d og fortsett</string> <string name="route_roundabout">Rundkjøring: Ta avkjøring %1$d og fortsett</string>
<string name="support_new_features">Støtt nye funksjoner</string> <string name="support_new_features">Støtt nye funksjoner</string>
<string name="max_speed">Maksimumshastighet</string> <string name="max_speed">Maksimumsfart</string>
<string name="shared_string_start_time">Starttid</string> <string name="shared_string_start_time">Starttid</string>
<string name="shared_string_end_time">Sluttid</string> <string name="shared_string_end_time">Sluttid</string>
<string name="shared_string_color">Farge</string> <string name="shared_string_color">Farge</string>
@ -2173,7 +2173,7 @@
<string name="validate_gpx_upload_name_pwd">Angi ditt OSM-brukernavn og passord for å laste opp GPX-filer.</string> <string name="validate_gpx_upload_name_pwd">Angi ditt OSM-brukernavn og passord for å laste opp GPX-filer.</string>
<string name="support_new_features_descr">Doner for å se nye funksjoner implementert i programmet.</string> <string name="support_new_features_descr">Doner for å se nye funksjoner implementert i programmet.</string>
<string name="local_openstreetmap_uploadall">Last opp alle</string> <string name="local_openstreetmap_uploadall">Last opp alle</string>
<string name="local_openstreetmap_upload">Last opp endring til OSM</string> <string name="local_openstreetmap_upload">Last opp redigering til OSM</string>
<string name="local_openstreetmap_descr_title">Asynkron OSM-redigering:</string> <string name="local_openstreetmap_descr_title">Asynkron OSM-redigering:</string>
<string name="live_monitoring_interval_descr">Oppgi det nettbaserte sporingsintervallet.</string> <string name="live_monitoring_interval_descr">Oppgi det nettbaserte sporingsintervallet.</string>
<string name="live_monitoring_interval">Nettbasert sporingsintervall</string> <string name="live_monitoring_interval">Nettbasert sporingsintervall</string>
@ -2239,7 +2239,7 @@
<string name="quick_action_add_parking">Legg til parkeringsplass</string> <string name="quick_action_add_parking">Legg til parkeringsplass</string>
<string name="quick_action_edit_action">Rediger handling</string> <string name="quick_action_edit_action">Rediger handling</string>
<string name="quick_actions_delete">Slett handling</string> <string name="quick_actions_delete">Slett handling</string>
<string name="quick_favorites_name_preset">Navneforvalg</string> <string name="quick_favorites_name_preset">Forhåndsinnstilt navn</string>
<string name="quick_action_add_marker_descr">En knapp for å legge til en kartmarkør i skjermsenteret.</string> <string name="quick_action_add_marker_descr">En knapp for å legge til en kartmarkør i skjermsenteret.</string>
<string name="quick_action_add_gpx_descr">En knapp for å legge til et GPX-rutepunkt i midten av skjermen.</string> <string name="quick_action_add_gpx_descr">En knapp for å legge til et GPX-rutepunkt i midten av skjermen.</string>
<string name="quick_action_take_audio_note_descr">En knapp for å legge til et lydnotat i midten av skjermen.</string> <string name="quick_action_take_audio_note_descr">En knapp for å legge til et lydnotat i midten av skjermen.</string>
@ -2829,7 +2829,7 @@
<string name="routeInfo_roadClass_name">Veitype</string> <string name="routeInfo_roadClass_name">Veitype</string>
<string name="routeInfo_surface_name">Overflate</string> <string name="routeInfo_surface_name">Overflate</string>
<string name="routeInfo_smoothness_name">Jevnhet</string> <string name="routeInfo_smoothness_name">Jevnhet</string>
<string name="routeInfo_steepness_name">Stigning</string> <string name="routeInfo_steepness_name">Bratthet</string>
<string name="add_home">Legg til bosted</string> <string name="add_home">Legg til bosted</string>
<string name="add_work">Legg til arbeidssted</string> <string name="add_work">Legg til arbeidssted</string>
<string name="work_button">Arbeid</string> <string name="work_button">Arbeid</string>
@ -2865,9 +2865,9 @@
<string name="rendering_attr_surface_paved_name">Fast dekke</string> <string name="rendering_attr_surface_paved_name">Fast dekke</string>
<string name="rendering_attr_surface_concrete_name">Betong</string> <string name="rendering_attr_surface_concrete_name">Betong</string>
<string name="rendering_attr_surface_sett_name">Brostein</string> <string name="rendering_attr_surface_sett_name">Brostein</string>
<string name="rendering_attr_surface_cobblestone_name">Naturlig brostein</string> <string name="rendering_attr_surface_cobblestone_name">Kuppelstein</string>
<string name="rendering_attr_surface_paving_stones_name">Steinbelagt</string> <string name="rendering_attr_surface_paving_stones_name">Belegningsstein</string>
<string name="rendering_attr_surface_pebblestone_name">Rullestein</string> <string name="rendering_attr_surface_pebblestone_name">Rullestein (liten)</string>
<string name="rendering_attr_surface_stone_name">Stein</string> <string name="rendering_attr_surface_stone_name">Stein</string>
<string name="rendering_attr_surface_metal_name">Metall</string> <string name="rendering_attr_surface_metal_name">Metall</string>
<string name="rendering_attr_surface_wood_name">Tre</string> <string name="rendering_attr_surface_wood_name">Tre</string>
@ -2907,8 +2907,8 @@
<string name="shared_string_milliradians">Milliradianer</string> <string name="shared_string_milliradians">Milliradianer</string>
<string name="angular_measeurement">Vinkel-måleenheter</string> <string name="angular_measeurement">Vinkel-måleenheter</string>
<string name="angular_measeurement_descr">Endre hva asimut måles i.</string> <string name="angular_measeurement_descr">Endre hva asimut måles i.</string>
<string name="routing_attr_avoid_sett_name">Ingen rustikk brostein eller brostein</string> <string name="routing_attr_avoid_sett_name">Ingen kuppelstein eller brostein</string>
<string name="routing_attr_avoid_sett_description">Unngår rustikk brostein og brostein</string> <string name="routing_attr_avoid_sett_description">Unngår kuppelstein og brostein</string>
<string name="routing_attr_avoid_tram_name">Ingen trikk</string> <string name="routing_attr_avoid_tram_name">Ingen trikk</string>
<string name="routing_attr_avoid_tram_description">Unngår trikk</string> <string name="routing_attr_avoid_tram_description">Unngår trikk</string>
<string name="routing_attr_avoid_bus_name">Ingen buss</string> <string name="routing_attr_avoid_bus_name">Ingen buss</string>
@ -2945,7 +2945,7 @@
<string name="choose_data_to_share">Velg typen data du vil dele:</string> <string name="choose_data_to_share">Velg typen data du vil dele:</string>
<string name="downloaded_maps">Nedlastede kart</string> <string name="downloaded_maps">Nedlastede kart</string>
<string name="visited_screens">Besøkte skjermer</string> <string name="visited_screens">Besøkte skjermer</string>
<string name="collected_data_descr">Definer hvilken data du ønsker å dele med OsmAnd.</string> <string name="collected_data_descr">Bestem hvilke data OsmAnd kan dele.</string>
<string name="downloaded_maps_collect_descr">Hjelp oss å forstå hvilke land- og regionkart som er mest populære.</string> <string name="downloaded_maps_collect_descr">Hjelp oss å forstå hvilke land- og regionkart som er mest populære.</string>
<string name="visited_screens_collect_descr">Hjelp oss å forstå hvilke OsmAnd-funksjoner som er mest populære.</string> <string name="visited_screens_collect_descr">Hjelp oss å forstå hvilke OsmAnd-funksjoner som er mest populære.</string>
<string name="privacy_and_security_change_descr">Trykk \"Tillat\" hvis du er enig med vår %1$s</string> <string name="privacy_and_security_change_descr">Trykk \"Tillat\" hvis du er enig med vår %1$s</string>
@ -3145,7 +3145,8 @@
<string name="shared_string_other">Annet</string> <string name="shared_string_other">Annet</string>
<string name="shared_preference">Delt</string> <string name="shared_preference">Delt</string>
<string name="layer_osm_edits">OSM-redigeringer</string> <string name="layer_osm_edits">OSM-redigeringer</string>
<string name="new_route_calculated_dist_dbg">Rute: Distanse %1$s, rutingstid %2$s \nUtregning: %3$.1f sec, %4$d veier, %5$d flis)</string> <string name="new_route_calculated_dist_dbg">Rute: Distanse %1$s, rutetid %2$s
\nBeregning: %3$.1f sek., %4$d veier, %5$d fliser)</string>
<string name="contour_lines_and_hillshade">Koter og relieffskygge</string> <string name="contour_lines_and_hillshade">Koter og relieffskygge</string>
<string name="update_all_maps">Oppdater alle kart</string> <string name="update_all_maps">Oppdater alle kart</string>
<string name="update_all_maps_q">Er du sikker på at du vil oppdatere alle (%1$d) kart\?</string> <string name="update_all_maps_q">Er du sikker på at du vil oppdatere alle (%1$d) kart\?</string>
@ -3832,7 +3833,7 @@
<string name="shared_string_resources">Ressurser</string> <string name="shared_string_resources">Ressurser</string>
<string name="profile_by_default_description">Velg profilen som skal brukes når programmet starter.</string> <string name="profile_by_default_description">Velg profilen som skal brukes når programmet starter.</string>
<string name="shared_string_last_used">Sist brukt</string> <string name="shared_string_last_used">Sist brukt</string>
<string name="routing_attr_allow_streams_name">Tillat bekker og avløp</string> <string name="routing_attr_allow_streams_name">Tillat bekker og dreneringsgrøfter</string>
<string name="routing_attr_allow_intermittent_name">Tillat periodiske vannveier</string> <string name="routing_attr_allow_intermittent_name">Tillat periodiske vannveier</string>
<string name="routing_attr_allow_intermittent_description">Tillat periodiske vannveier</string> <string name="routing_attr_allow_intermittent_description">Tillat periodiske vannveier</string>
<string name="shared_string_vehicle">Kjøretøy</string> <string name="shared_string_vehicle">Kjøretøy</string>
@ -3854,7 +3855,7 @@
<string name="change_folder">Endre mappe</string> <string name="change_folder">Endre mappe</string>
<string name="select_data_to_export">Velg data å eksportere til filen.</string> <string name="select_data_to_export">Velg data å eksportere til filen.</string>
<string name="export_not_enough_space_descr">Din enhet har kun %1$s ledig. Frigjør litt plass eller velg bort noen elementer fra eksporten.</string> <string name="export_not_enough_space_descr">Din enhet har kun %1$s ledig. Frigjør litt plass eller velg bort noen elementer fra eksporten.</string>
<string name="select_groups_for_import">ffffffffff|</string> <string name="select_groups_for_import">Velg grupper som skal importeres.</string>
<string name="reverse_all_points">Reverser alle punkter</string> <string name="reverse_all_points">Reverser alle punkter</string>
<string name="routing_engine_vehicle_type_small_truck">Liten lastebil</string> <string name="routing_engine_vehicle_type_small_truck">Liten lastebil</string>
<string name="routing_engine_vehicle_type_truck">Lastebil</string> <string name="routing_engine_vehicle_type_truck">Lastebil</string>
@ -3874,18 +3875,18 @@
<string name="announcement_time_prepare">Forberedelse</string> <string name="announcement_time_prepare">Forberedelse</string>
<string name="announcement_time_arrive">Ankom målet</string> <string name="announcement_time_arrive">Ankom målet</string>
<string name="shared_string_turn">Sving</string> <string name="shared_string_turn">Sving</string>
<string name="announcement_time_intervals">Tid og avstansintervaller</string> <string name="announcement_time_intervals">Tid og avstandsintervaller</string>
<string name="announcement_time_descr">kunngjøringstid for forskjellige stemmeforespørsler avhenger av forespørselstype, nåværende navigasjonshastighet og forvalgt navigasjonshastighet.</string> <string name="announcement_time_descr">Kunngjøringstid for forskjellige talemeldinger avhenger av meldingstype, gjeldende navigasjonshastighet og standard-navigasjonshastighet.</string>
<string name="routing_engine_vehicle_type_hiking">Turgåing</string> <string name="routing_engine_vehicle_type_hiking">Turgåing</string>
<string name="routing_engine_vehicle_type_walking">Fotgjengeri</string> <string name="routing_engine_vehicle_type_walking">Gåing</string>
<string name="shared_string_sec">sek</string> <string name="shared_string_sec">sek</string>
<string name="announcement_time_title">Kunngjøringstid</string> <string name="announcement_time_title">Kunngjøringstid</string>
<string name="start_recording">Start opptak</string> <string name="start_recording">Start opptak</string>
<string name="show_track_on_map">Vis spor på kart</string> <string name="show_track_on_map">Vis spor på kart</string>
<string name="routing_engine_vehicle_type_wheelchair">Rullestol</string> <string name="routing_engine_vehicle_type_wheelchair">Rullestol</string>
<string name="routing_engine_vehicle_type_cycling_electric">El-sykkel</string> <string name="routing_engine_vehicle_type_cycling_electric">El-sykkel</string>
<string name="routing_engine_vehicle_type_cycling_mountain">Terrengsykkel</string> <string name="routing_engine_vehicle_type_cycling_mountain">Terrengsykling</string>
<string name="routing_engine_vehicle_type_racingbike">Temposykkel</string> <string name="routing_engine_vehicle_type_racingbike">Racersykkel</string>
<string name="routing_engine_vehicle_type_cycling_road">Landeveissykling</string> <string name="routing_engine_vehicle_type_cycling_road">Landeveissykling</string>
<string name="routing_engine_vehicle_type_cycling_regular">Vanlig sykling</string> <string name="routing_engine_vehicle_type_cycling_regular">Vanlig sykling</string>
<string name="message_server_error">Tjenerfeil: %1$s</string> <string name="message_server_error">Tjenerfeil: %1$s</string>
@ -3895,7 +3896,7 @@
<string name="routing_engine_vehicle_type_hgv">Stor lastebil</string> <string name="routing_engine_vehicle_type_hgv">Stor lastebil</string>
<string name="delete_online_routing_engine">Slett denne nettbaserte rutingsmotoren\?</string> <string name="delete_online_routing_engine">Slett denne nettbaserte rutingsmotoren\?</string>
<string name="context_menu_read_full">Les hele</string> <string name="context_menu_read_full">Les hele</string>
<string name="delete_waypoints">Slett rutepunkt</string> <string name="delete_waypoints">Slett rutepunkter</string>
<string name="app_mode_gap">Luke</string> <string name="app_mode_gap">Luke</string>
<string name="login_open_street_map">Logg inn på OpenStreetMap</string> <string name="login_open_street_map">Logg inn på OpenStreetMap</string>
<string name="user_login">Logg inn</string> <string name="user_login">Logg inn</string>
@ -3921,10 +3922,23 @@
<string name="purchases">Kjøp</string> <string name="purchases">Kjøp</string>
<string name="select_category_descr">Velg kategori eller legg til en ny</string> <string name="select_category_descr">Velg kategori eller legg til en ny</string>
<string name="track_recording_will_be_continued">Opptaket vil fortsette.</string> <string name="track_recording_will_be_continued">Opptaket vil fortsette.</string>
<string name="copy_poi_name">Kopier POI-navn</string> <string name="copy_poi_name">Kopier interessepunktnavn</string>
<string name="quick_action_show_hide_title">Vis/skjul</string> <string name="quick_action_show_hide_title">Vis/skjul</string>
<string name="shared_string_interval">Intervall</string> <string name="shared_string_interval">Intervall</string>
<string name="track_has_no_altitude">Sporet inneholder ikke høydedata.</string> <string name="track_has_no_altitude">Sporet inneholder ikke høydedata.</string>
<string name="track_has_no_speed">Sporet inneholder ikke hastighetsdata.</string> <string name="track_has_no_speed">Sporet inneholder ikke hastighetsdata.</string>
<string name="select_another_colorization">Velg en annen type fargelegging.</string> <string name="select_another_colorization">Velg en annen type fargelegging.</string>
<string name="shared_strings_all_regions">Alle regioner</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">Skjul grenser for naturreservat, beskyttede områder og nasjonalparker</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">Naturgrenser</string>
<string name="hillshade_slope_contour_lines">Relieffskygge / Bakkehelling / Koter</string>
<string name="activity_type_riding_name">Ridning</string>
<string name="activity_type_hiking_name">Turgåing</string>
<string name="activity_type_running_name">Løping</string>
<string name="activity_type_walking_name">Gåing</string>
<string name="routing_attr_short_way_description">Optimalisert kortere rute (energisparende)</string>
<string name="snap_to_road_descr">Aktuelle posisjonsikon vil bli festet til gjeldende navigeringsrute</string>
<string name="routing_attr_height_obstacles_description">Ruting kan unngå kraftige oppoverbakker.</string>
<string name="trip_recording_save_and_continue">Lagre og fortsett</string>
<string name="lost_data_warning">All ulagret data vil gå tapt.</string>
</resources> </resources>

View file

@ -3748,7 +3748,7 @@
\n \n
\n</string> \n</string>
<string name="what_is_new">Wat is er nieuw</string> <string name="what_is_new">Wat is er nieuw</string>
<string name="snowmobile_render_descr">Voor sneeuwscooter, rijden met speciale wegen en tracks.</string> <string name="snowmobile_render_descr">Voor sneeuwscooter, rijden op speciale wegen en tracks.</string>
<string name="set_working_days_to_continue">Stel werkdagen in om door te gaan</string> <string name="set_working_days_to_continue">Stel werkdagen in om door te gaan</string>
<string name="gpx_split_interval_descr">Selecteer het interval waarmee markeringen met afstand of tijd op de track worden weergegeven.</string> <string name="gpx_split_interval_descr">Selecteer het interval waarmee markeringen met afstand of tijd op de track worden weergegeven.</string>
<string name="gpx_split_interval_none_descr">Selecteer de gewenste splitsingsoptie: op tijd of op afstand.</string> <string name="gpx_split_interval_none_descr">Selecteer de gewenste splitsingsoptie: op tijd of op afstand.</string>

View file

@ -3892,4 +3892,6 @@
<string name="poi_piste_name">Nome da pista</string> <string name="poi_piste_name">Nome da pista</string>
<string name="poi_piste_ski_jump">Salto de esqui</string> <string name="poi_piste_ski_jump">Salto de esqui</string>
<string name="poi_conference_centre">Centro de conferências</string> <string name="poi_conference_centre">Centro de conferências</string>
<string name="poi_local_ref">Geodesia</string>
<string name="poi_geodesist">Geodesia</string>
</resources> </resources>

View file

@ -4038,4 +4038,8 @@
<string name="track_has_no_altitude">A trilha não contém dados de altitude.</string> <string name="track_has_no_altitude">A trilha não contém dados de altitude.</string>
<string name="track_has_no_speed">A trilha não contém dados de velocidade.</string> <string name="track_has_no_speed">A trilha não contém dados de velocidade.</string>
<string name="select_another_colorization">Selecione outro tipo de colorização.</string> <string name="select_another_colorization">Selecione outro tipo de colorização.</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">Limites naturais</string>
<string name="segments_count">Segmento %1$d</string>
<string name="trip_recording_save_and_continue">Salvar e continuar</string>
<string name="lost_data_warning">Todos os dados não salvos serão perdidos.</string>
</resources> </resources>

View file

@ -467,7 +467,7 @@
<string name="poi_information">Информация</string> <string name="poi_information">Информация</string>
<string name="poi_clock">Часы</string> <string name="poi_clock">Часы</string>
<string name="poi_travel_agent">Турагентство;Туристическое агентство</string> <string name="poi_travel_agent">Турагентство;Туристическое агентство</string>
<string name="poi_viewpoint">Место с хорошим видом;Обзорная площадка</string> <string name="poi_viewpoint">Обзорная площадка;Место с хорошим видом</string>
<string name="poi_camp_site">Место для лагеря</string> <string name="poi_camp_site">Место для лагеря</string>
<string name="poi_caravan_site">Ночлег</string> <string name="poi_caravan_site">Ночлег</string>
<string name="poi_picnic_site">Место для пикника</string> <string name="poi_picnic_site">Место для пикника</string>
@ -2785,7 +2785,7 @@
<string name="poi_organic_no">Отсутствуют</string> <string name="poi_organic_no">Отсутствуют</string>
<string name="poi_organic_only">Исключительно</string> <string name="poi_organic_only">Исключительно</string>
<string name="poi_traffic_mirror">Дорожное зеркало</string> <string name="poi_traffic_mirror">Дорожное зеркало</string>
<string name="poi_diplomatic_filter">Вид</string> <string name="poi_diplomatic_filter">Дипломатическое учреждение</string>
<string name="poi_diplomatic_consulate">Консульство</string> <string name="poi_diplomatic_consulate">Консульство</string>
<string name="poi_diplomatic_consulate_general">Генеральное консульство</string> <string name="poi_diplomatic_consulate_general">Генеральное консульство</string>
<string name="poi_diplomatic_honorary_consulate">Почётное консульство</string> <string name="poi_diplomatic_honorary_consulate">Почётное консульство</string>

View file

@ -3902,7 +3902,7 @@
\n \n
\n• Добавлен OAuth метод аутентификации для OpenStreetMap, улучшен интерфейс диалоговых OSM. \n• Добавлен OAuth метод аутентификации для OpenStreetMap, улучшен интерфейс диалоговых OSM.
\n \n
\n • Поддержка пользовательских цветов для избранного и путевых точек трека. \n• Поддержка пользовательских цветов для избранных и путевых точек.
\n \n
\n</string> \n</string>
<string name="copy_address">Скопировать адрес</string> <string name="copy_address">Скопировать адрес</string>
@ -4036,4 +4036,11 @@
<string name="select_category_descr">Выберите категорию или добавьте новую</string> <string name="select_category_descr">Выберите категорию или добавьте новую</string>
<string name="copy_poi_name">Копировать имя POI</string> <string name="copy_poi_name">Копировать имя POI</string>
<string name="shared_string_interval">Интервал</string> <string name="shared_string_interval">Интервал</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">Скрыть природный заповедник, особо охраняемые природные территории и границы национального парка</string>
<string name="gpx_upload_trackable_visibility_descr">«Отслеживаемый» означает, что трек не будет виден в любых общедоступных списках, но обработанные точки c отметками времени из него будут доступны через public GPS API (при этом трек не будет ассоциирован с вами). Другие пользователи смогут лишь загружать обработанные точки из вашего трека.</string>
<string name="gpx_upload_identifiable_visibility_descr">«Идентифицируемый» означает, что трек будет виден всем в разделе треки пользователя, загрузившего трек и в общем списке треков, доступном на странице GPS-треки. Другие пользователи смогут загрузить данные трека и в свойствах трека будет указано имя пользователя, загрузившего трек. Отметки времени точек трека доступны через public GPS API будут ссылаться на страницу с вашим оригинальным треком.</string>
<string name="gpx_upload_public_visibility_descr">«Общедоступный» означает, что трек будет виден всем в разделе треки пользователя, загрузившего трек и в общем списке треков, доступном на странице GPS-треки. Отметки времени точек трека не доступны через public GPS API. Однако, другие пользователи по-прежнему могут загрузить файл трека из общего списка треков и данные трека будут иметь все отметки времени.</string>
<string name="gpx_upload_private_visibility_descr">«Частный» означает, что трек не будет виден в любых общедоступных списках, но точки из него будут доступны через public GPS API без отметок времени.</string>
<string name="routing_attr_driving_style_description">Выберите цель, чтобы проложить к ней короткий, быстрый или безопасный маршрут</string>
<string name="delete_number_files_question">Удалить %1$d файлов\?</string>
</resources> </resources>

View file

@ -3891,4 +3891,7 @@
<string name="poi_gladed_yes">Cun àrbores: eja</string> <string name="poi_gladed_yes">Cun àrbores: eja</string>
<string name="poi_piste_name">Nùmene de sa pista</string> <string name="poi_piste_name">Nùmene de sa pista</string>
<string name="poi_piste_ski_jump">Brincu cun sos iscì</string> <string name="poi_piste_ski_jump">Brincu cun sos iscì</string>
<string name="poi_local_ref">Riferimentu locale</string>
<string name="poi_geodesist">Geodesista</string>
<string name="poi_conference_centre">Tzentru pro cunferèntzias</string>
</resources> </resources>

View file

@ -1370,7 +1370,7 @@
<string name="no_internet_connection">Impossìbile iscarrigare. Pro praghere còmpida sa connessione tua pro sighire.</string> <string name="no_internet_connection">Impossìbile iscarrigare. Pro praghere còmpida sa connessione tua pro sighire.</string>
<string name="download_tab_downloads">Totu sos iscarrigamentos</string> <string name="download_tab_downloads">Totu sos iscarrigamentos</string>
<string name="download_tab_updates">Agiornamentos</string> <string name="download_tab_updates">Agiornamentos</string>
<string name="download_tab_local">Iscarrigadas</string> <string name="download_tab_local">Installadas</string>
<string name="navigate_point_zone">Zona</string> <string name="navigate_point_zone">Zona</string>
<string name="navigate_point_northing">In diretzione Nord</string> <string name="navigate_point_northing">In diretzione Nord</string>
<string name="navigate_point_easting">In diretzione Est</string> <string name="navigate_point_easting">In diretzione Est</string>
@ -2163,7 +2163,6 @@
<string name="rendering_attr_depthContours_name">Curvas de profondidade nàuticas</string> <string name="rendering_attr_depthContours_name">Curvas de profondidade nàuticas</string>
<string name="rendering_attr_depthContours_description">Ammustra sas lìnias de profondidade.</string> <string name="rendering_attr_depthContours_description">Ammustra sas lìnias de profondidade.</string>
<string name="routing_attr_height_obstacles_name">Imprea sos datos de s\'artària</string> <string name="routing_attr_height_obstacles_name">Imprea sos datos de s\'artària</string>
<string name="routing_attr_driving_style_name">Istile de ghia</string> <string name="routing_attr_driving_style_name">Istile de ghia</string>
<string name="route_altitude">Artària de su caminu</string> <string name="route_altitude">Artària de su caminu</string>
<string name="altitude_descent">Falada</string> <string name="altitude_descent">Falada</string>
@ -3163,7 +3162,7 @@
<string name="vehicle_parameters">Paràmetros de su veìculu</string> <string name="vehicle_parameters">Paràmetros de su veìculu</string>
<string name="voice_announces_info">Sos annùntzios vocales benint riproduidos petzi durante sa navigatzione.</string> <string name="voice_announces_info">Sos annùntzios vocales benint riproduidos petzi durante sa navigatzione.</string>
<string name="voice_announces_descr">Istrutziones e annùntzios de navigatzione</string> <string name="voice_announces_descr">Istrutziones e annùntzios de navigatzione</string>
<string name="voice_announces">Annùntzios vocales</string> <string name="voice_announces">Indicatziones vocales</string>
<string name="screen_alerts">Avisos in s\'ischermu</string> <string name="screen_alerts">Avisos in s\'ischermu</string>
<string name="route_parameters_descr">Cunfigura sos paràmetros de s\'àndala</string> <string name="route_parameters_descr">Cunfigura sos paràmetros de s\'àndala</string>
<string name="route_parameters">Paràmetros de s\'àndala</string> <string name="route_parameters">Paràmetros de s\'àndala</string>
@ -4002,4 +4001,45 @@
<string name="activity_type_offroad_name">Foras de camineras</string> <string name="activity_type_offroad_name">Foras de camineras</string>
<string name="activity_type_motorbike_name">Moto</string> <string name="activity_type_motorbike_name">Moto</string>
<string name="activity_type_car_name">Màchina</string> <string name="activity_type_car_name">Màchina</string>
<string name="select_segments">Ischerta sos segmentos</string>
<string name="select_segments_description">%1$s cuntenet prus de unu segmentu. Depes ischertare sa parte chi serbit pro sa navigatzione.</string>
<string name="segments_count">Segmentu %1$d</string>
<string name="temporary_conditional_routing_descr">Imprea sas restritziones de sos caminos chi sunt ativas como in sa mapa</string>
<string name="routing_attr_short_way_description">Àndala prus curtza otimizada (rispàrmiu energèticu)</string>
<string name="routing_attr_driving_style_description">Ischerta sa modalidade pro sa ghia pro otènnere un\'àndala prus curtza, prus lestra o prus segura</string>
<string name="snap_to_road_descr">S\'icona de sa positzione atuale s\'at a ligare a s\'àndala de navigatzione atuale</string>
<string name="map_orientation_threshold_descr">Non rodes sa vista de sa mapa si sa lestresa est in suta de unu lìmite</string>
<string name="restart">Torra a incumintzare</string>
<string name="shared_strings_all_regions">Totu sas regiones</string>
<string name="delete_number_files_question">Iscantzellare %1$d documentos\?</string>
<string name="track_recording_stop_without_saving">Acabba chene sarvare</string>
<string name="track_recording_save_and_stop">Sarva e acabba sa registratzione</string>
<string name="track_recording_title">Registratzione de sa rasta firmada</string>
<string name="track_recording_description">Ses seguru de chèrrere acabbare cun sa registratzione\?
\nTotu sos datos non sarvados s\'ant a pèrdere.</string>
<string name="on_pause">In pàusa</string>
<string name="app_restart_required">Pro aplicare unas cantas impostatziones diat pòdere èssere netzessàriu torrare a allùghere s\'aplicatzione.</string>
<string name="routing_attr_height_obstacles_description">Su càrculu de s\'àndala diat pòdere evitare artziadas mannas.</string>
<string name="quick_action_coordinates_widget_descr">Unu butone pro ammustrare o cuare su widget de sas coordinadas in sa mapa.</string>
<string name="latest_openstreetmap_update">Ùrtimu agiornamentu de OpenStreetMap a disponimentu:</string>
<string name="updated">Agiornadu: %s</string>
<string name="last_time_checked">Ùrtima verìfica: %s</string>
<string name="update_frequency">Frecuèntzia de sos agiornamentos</string>
<string name="live_update_frequency_week_variant">Sos agiornamentos de sa mapa ant a èssere verificados cada chida. Sa borta chi benit: %1$s in %2$s.</string>
<string name="live_update_frequency_day_variant">Sos agiornamentos de sa mapa ant a èssere verificados cada die. Sa borta chi benit: %1$s in %2$s.</string>
<string name="live_update_frequency_hour_variant">Sos agiornamentos de sa mapa ant a èssere verificados cada ora. Sa borta chi benit: %1$s in %2$s.</string>
<string name="delete_updates">Iscantzella sos agiornamentos</string>
<string name="live_update_delete_updates_msg">Ses seguru de chèrrere iscantzellare totu sos %s agiornamentos in direta\?</string>
<string name="select_category_descr">Ischerta una categoria o annanghe·nde una noa</string>
<string name="track_recording_will_be_continued">Sa registratzione at a sighire.</string>
<string name="copy_poi_name">Còpia su nùmene de su PDI</string>
<string name="quick_action_show_hide_title">Ammustra/cua</string>
<string name="shared_string_interval">Intervallu</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">Cua sas làcanas de sas riservas naturales, de sas àreas amparadas e de sos parcos natzionales</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">Làcanas naturales</string>
<string name="track_has_no_altitude">Sa rasta non cuntenet datos de artària.</string>
<string name="track_has_no_speed">Sa rasta non cuntenet datos de lestresa.</string>
<string name="select_another_colorization">Ischerta un\'àtera casta de coloratzione.</string>
<string name="purchases">Còmporas</string>
<string name="map_widget_distance_by_tap">Distàntzia pro tocu</string>
</resources> </resources>

View file

@ -3704,4 +3704,40 @@
<string name="poi_health_specialty_depth_psychology_yes">Hlbinná psychológia</string> <string name="poi_health_specialty_depth_psychology_yes">Hlbinná psychológia</string>
<string name="poi_health_specialty_chiropractic_yes">Chiropraxia</string> <string name="poi_health_specialty_chiropractic_yes">Chiropraxia</string>
<string name="poi_health_specialty_obstetrics_postnatal_yes">Pôrodníctvo (postnatálne)</string> <string name="poi_health_specialty_obstetrics_postnatal_yes">Pôrodníctvo (postnatálne)</string>
<string name="poi_radar_tower">Radarová veža</string>
<string name="poi_parking_layby">Malé odpočívadlo</string>
<string name="poi_parking_sheds">Prístrešky</string>
<string name="poi_parking_rooftop">Na streche</string>
<string name="poi_gpx_point">Bod GPX</string>
<string name="poi_summit_register_no">Vrcholová kniha: nie</string>
<string name="poi_summit_register_yes">Vrcholová kniha: áno</string>
<string name="poi_piste_status_closed">Stav zjazdovky: zatvorená</string>
<string name="poi_piste_status_open">Stav zjazdovky: otvorená</string>
<string name="poi_patrolled_no">Strážené: nie</string>
<string name="poi_patrolled_yes">Strážené: áno</string>
<string name="poi_piste_name">Názov zjazdovky</string>
<string name="poi_piste_ski_jump">Lyžiarsky skok</string>
<string name="poi_wildlife_crossing_bat_tunnel">Netopierí tunel</string>
<string name="poi_wildlife_crossing_bat_bridge">Netopierí most</string>
<string name="poi_wildlife_crossing">Ekodukt</string>
<string name="poi_swimming_area">Plavecká zóna</string>
<string name="poi_lavoir">Miesto na pranie šiat</string>
<string name="poi_waste_transfer_station">Prekladisko odpadu</string>
<string name="poi_ranger_station">Sídlo lesnej správy</string>
<string name="poi_water_source_lake">Jazero</string>
<string name="poi_water_source_river">Rieka</string>
<string name="poi_water_source_well">Studňa</string>
<string name="poi_water_source_powered_pump">Poháňané čerpadlo</string>
<string name="poi_water_source_water_tank">Vodná nádrž</string>
<string name="poi_water_source_tap">Kohútik</string>
<string name="poi_water_source_water_works">Vodáreň</string>
<string name="poi_water_source_tube_well">Potrubná studňa</string>
<string name="poi_vaccination_covid19">Očkovanie: COVID19</string>
<string name="poi_health_specialty_vaccination_yes">Očkovanie</string>
<string name="poi_lifeguard_base">Stanica záchranárov</string>
<string name="poi_siren">Siréna</string>
<string name="poi_local_ref">Číslo nástupišťa</string>
<string name="poi_geodesist">Geodet</string>
<string name="poi_conference_centre">Konferenčné centrum</string>
<string name="poi_couloir">Horský žľab</string>
</resources> </resources>

View file

@ -316,7 +316,7 @@
<string name="poi_fuel_electricity">El</string> <string name="poi_fuel_electricity">El</string>
<string name="poi_aeroway_fuel">Flygbränsle</string> <string name="poi_aeroway_fuel">Flygbränsle</string>
<string name="poi_waterway_fuel">Bensinstation för båtar</string> <string name="poi_waterway_fuel">Bensinstation för båtar</string>
<string name="poi_electricity_combined_charging">Laddstation</string> <string name="poi_electricity_combined_charging">Laddstation; Laddningsstation för elfordon; Laddningsstation för el; Elektrisk laddningspunkt; Laddningspunkt; Elektronisk laddstation; Utrustning för elförsörjning av elfordon</string>
<string name="poi_vehicle_ramp">Fordonsramp</string> <string name="poi_vehicle_ramp">Fordonsramp</string>
<string name="poi_compressed_air">Tryckluft</string> <string name="poi_compressed_air">Tryckluft</string>
<string name="poi_parking">Parkering</string> <string name="poi_parking">Parkering</string>
@ -627,7 +627,7 @@
<string name="poi_horse_racing">Hästkapplöpning</string> <string name="poi_horse_racing">Hästkapplöpning</string>
<string name="poi_ice_skating">Skridskoåkning</string> <string name="poi_ice_skating">Skridskoåkning</string>
<string name="poi_ice_stock">Islager</string> <string name="poi_ice_stock">Islager</string>
<string name="poi_korfbal">Korfbal</string> <string name="poi_korfbal">Korfball</string>
<string name="poi_sport_motor">Motorsport</string> <string name="poi_sport_motor">Motorsport</string>
<string name="poi_sport_multi">Multisport</string> <string name="poi_sport_multi">Multisport</string>
<string name="poi_orienteering">Orientering</string> <string name="poi_orienteering">Orientering</string>
@ -780,8 +780,8 @@
<string name="poi_internet_access_service">Tillgång till Internet: service</string> <string name="poi_internet_access_service">Tillgång till Internet: service</string>
<string name="poi_internet_access_yes">Tillgång till Internet: ja</string> <string name="poi_internet_access_yes">Tillgång till Internet: ja</string>
<string name="poi_internet_access_no">Tillgång till Internet: nej</string> <string name="poi_internet_access_no">Tillgång till Internet: nej</string>
<string name="poi_internet_access_fee_yes">Tillgång till Internet - avgift</string> <string name="poi_internet_access_fee_yes">Tillgång till internet: avgift</string>
<string name="poi_internet_access_fee_no">Tillgång till Internet - ingen avgift</string> <string name="poi_internet_access_fee_no">Tillgång till internet: ingen avgift</string>
<string name="poi_monastery">Kloster</string> <string name="poi_monastery">Kloster</string>
<string name="poi_religious">Religiöst område</string> <string name="poi_religious">Religiöst område</string>
<string name="poi_wayside_cross">Vägkors</string> <string name="poi_wayside_cross">Vägkors</string>
@ -1342,7 +1342,7 @@
<string name="poi_pump_no">Ingen pump</string> <string name="poi_pump_no">Ingen pump</string>
<string name="poi_pump_yes">Ja</string> <string name="poi_pump_yes">Ja</string>
<string name="poi_water_characteristic_mineral">Mineral</string> <string name="poi_water_characteristic_mineral">Mineral</string>
<string name="poi_water_characteristic_mud">Vattenegenskap: lera</string> <string name="poi_water_characteristic_mud">Lera</string>
<string name="poi_water_characteristic_sulfuric">Svavel</string> <string name="poi_water_characteristic_sulfuric">Svavel</string>
<string name="poi_water_point">Vattenpunkt</string> <string name="poi_water_point">Vattenpunkt</string>
<string name="poi_information_guidepost">Vägstolpe</string> <string name="poi_information_guidepost">Vägstolpe</string>
@ -1382,7 +1382,7 @@
<string name="poi_tactile_paving_yes">Ja</string> <string name="poi_tactile_paving_yes">Ja</string>
<string name="poi_tactile_paving_no">Utan taktil beläggning</string> <string name="poi_tactile_paving_no">Utan taktil beläggning</string>
<string name="poi_traffic_signals_sound_yes">Ja</string> <string name="poi_traffic_signals_sound_yes">Ja</string>
<string name="poi_traffic_signals_sound_no">Nej</string> <string name="poi_traffic_signals_sound_no">Ljud: nej</string>
<string name="poi_traffic_signals_sound_walk">Endast när gång är tillåtet</string> <string name="poi_traffic_signals_sound_walk">Endast när gång är tillåtet</string>
<string name="poi_rescue_station">Räddningsstation</string> <string name="poi_rescue_station">Räddningsstation</string>
<string name="poi_services">Serviceområde</string> <string name="poi_services">Serviceområde</string>
@ -1669,13 +1669,13 @@
<string name="poi_service_electrical">Reparation av elektriska fordon</string> <string name="poi_service_electrical">Reparation av elektriska fordon</string>
<string name="poi_motorcycle_repair">Mc-reparation</string> <string name="poi_motorcycle_repair">Mc-reparation</string>
<string name="poi_self_service_yes">Ja</string> <string name="poi_self_service_yes">Ja</string>
<string name="poi_self_service_no">Ingen självbetjäning</string> <string name="poi_self_service_no">Nej</string>
<string name="poi_automated_yes">Ja</string> <string name="poi_automated_yes">Ja</string>
<string name="poi_automated_no">Inte automatisk</string> <string name="poi_automated_no">Inte automatisk</string>
<string name="poi_full_service_yes">Full service</string> <string name="poi_full_service_yes">Full service</string>
<string name="poi_brushless_yes">Ja</string> <string name="poi_brushless_yes">Ja</string>
<string name="poi_brushless_no">Borstlös: nej</string> <string name="poi_brushless_no">Borstlös: nej</string>
<string name="poi_car_wash_no">Biltvätt: ingen</string> <string name="poi_car_wash_no">Nej</string>
<string name="poi_public_bath">Offentligt bad</string> <string name="poi_public_bath">Offentligt bad</string>
<string name="poi_male_yes">Hane</string> <string name="poi_male_yes">Hane</string>
<string name="poi_male_no">Förbjudet för män</string> <string name="poi_male_no">Förbjudet för män</string>
@ -2055,7 +2055,7 @@
<string name="poi_fuel_100ll">100LL bränsle</string> <string name="poi_fuel_100ll">100LL bränsle</string>
<string name="poi_fuel_autogas">Autogas</string> <string name="poi_fuel_autogas">Autogas</string>
<string name="poi_fuel_jeta1">Jet A-1 bränsle</string> <string name="poi_fuel_jeta1">Jet A-1 bränsle</string>
<string name="poi_fuel_adblue">AdBlue bränsle</string> <string name="poi_fuel_adblue">Dieselavgasvätska</string>
<string name="poi_fuel_wood">Bränsle: trä</string> <string name="poi_fuel_wood">Bränsle: trä</string>
<string name="poi_fuel_charcoal">Bränsle: träkol</string> <string name="poi_fuel_charcoal">Bränsle: träkol</string>
<string name="poi_fuel_coal">Bränsle: kol</string> <string name="poi_fuel_coal">Bränsle: kol</string>
@ -3165,4 +3165,168 @@
<string name="poi_surface_artificial_turf">Konstgräs</string> <string name="poi_surface_artificial_turf">Konstgräs</string>
<string name="poi_surface_decoturf">Hard court</string> <string name="poi_surface_decoturf">Hard court</string>
<string name="poi_surface_metal_grid">Metallgitter</string> <string name="poi_surface_metal_grid">Metallgitter</string>
<string name="poi_location_overhead">Plats: ovan</string>
<string name="poi_location_overground">Plats: ovan jord</string>
<string name="poi_location_underwater">Plats: under vattnet</string>
<string name="poi_location_underground">Plats: underjordisk</string>
<string name="poi_government_social_security">Social trygghet</string>
<string name="poi_winter_room_no">Vinterrum: nej</string>
<string name="poi_winter_room_yes">Vinterrum: ja</string>
<string name="poi_motorcycle_type_standard">Standard</string>
<string name="poi_motorcycle_type_dualsport">Enduro</string>
<string name="poi_motorcycle_type_offroad">Off-road</string>
<string name="poi_motorcycle_type_chopper">Chopper</string>
<string name="poi_motorcycle_type_sportbike">Sport motorcykel</string>
<string name="poi_motorcycle_type_scooter">Skoter</string>
<string name="poi_motorcycle_clothes_no">Motorcykelkläder: nej</string>
<string name="poi_motorcycle_clothes_yes">Motorcykelkläder</string>
<string name="poi_motorcycle_tyres_no">Däck: nej</string>
<string name="poi_motorcycle_tyres_yes">Däck</string>
<string name="poi_motorcycle_parts_no">Delar: nej</string>
<string name="poi_motorcycle_parts_yes">Delar</string>
<string name="poi_motorcycle_repair_yes">Reparation</string>
<string name="poi_motorcycle_repair_no">Reparation: nej</string>
<string name="poi_motorcycle_rental_no">Uthyrning: nej</string>
<string name="poi_motorcycle_rental_yes">Uthyrning</string>
<string name="poi_motorcycle_sales_yes_used">Försäljning: ja, begagnad</string>
<string name="poi_motorcycle_sales_used">Försäljning: begagnad</string>
<string name="poi_motorcycle_sales_no">Försäljning: nej</string>
<string name="poi_motorcycle_sales_yes">Försäljning</string>
<string name="poi_coworking_space">Samarbetsyta</string>
<string name="poi_cuisine_souvlaki">Souvlaki</string>
<string name="poi_cuisine_piadina">Piadina</string>
<string name="poi_cuisine_savory_pancakes">Salta pannkakor</string>
<string name="poi_cuisine_soba">Soba</string>
<string name="poi_cuisine_buschenschank">Buschenschank</string>
<string name="poi_cuisine_heuriger">Heuriger</string>
<string name="poi_cuisine_gastropub">Gastropub</string>
<string name="poi_cuisine_beef_bowl">Gyudon</string>
<string name="poi_cuisine_ramen">Ramen</string>
<string name="poi_public_bookcase_type_reading_box">Typ: läsruta</string>
<string name="poi_xmas_url">Jul: hemsida</string>
<string name="poi_xmas_location">Jul: plats</string>
<string name="poi_xmas_opening_hours">Jul: öppettider</string>
<string name="poi_xmas_note">Jul: Obs</string>
<string name="poi_xmas_day_date">Xmas: period för evenemanget</string>
<string name="poi_fire_operator">Brandoperatör</string>
<string name="poi_diplomatic_high_commission">Hög provision</string>
<string name="poi_diplomatic_permanent_mission">Permanent representation</string>
<string name="poi_mdf">Huvudfördelningsram</string>
<string name="poi_generator_output_electricity_no">Effekt (el): nej</string>
<string name="poi_atm_yes">ATM: ja</string>
<string name="poi_health_specialty_radiotherapy_yes">Strålbehandling</string>
<string name="poi_denotation">Beteckning</string>
<string name="poi_generator_source_biomass">Energikälla: biomassa</string>
<string name="reddit">Reddit</string>
<string name="poi_historic_tank">Historisk tank</string>
<string name="poi_recycling_small_electrical_appliances">Små elektriska apparater</string>
<string name="poi_diplomatic_services_citizen_services_filter">Medborgartjänster</string>
<string name="poi_diplomatic_services_immigrant_visas_filter">Invandrarvisum</string>
<string name="poi_diplomatic_services_non_immigrant_visas_filter">Visum som inte är invandrare</string>
<string name="poi_liaison_filter">Förbindelse</string>
<string name="poi_consulate_filter">Konsulat</string>
<string name="poi_embassy_filter">Ambasad</string>
<string name="poi_departures_board">Avgångstavlan</string>
<string name="poi_drinking_water_refill">Påfyllning av dricksvatten</string>
<string name="poi_traffic_signals_arrow">Pil</string>
<string name="poi_traffic_signals_vibration">Vibrationer</string>
<string name="poi_fire_hydrant_pressure_filter">Tryck</string>
<string name="poi_video_telephone">Video</string>
<string name="poi_sms">SMS</string>
<string name="poi_volcano_status">Status</string>
<string name="poi_volcano_type">Typ</string>
<string name="poi_bath_open_air">Utomhus</string>
<string name="poi_bath_type">Typ</string>
<string name="poi_cash_withdrawal_bank_card">Kontantuttag</string>
<string name="poi_access_disabled">Tillgänglighet för funktionshindrade</string>
<string name="poi_access_goods">Tillgång för lätta lastbilar</string>
<string name="poi_access_hgv">HGV-åtkomst</string>
<string name="poi_access_mofa">Mofa-åtkomst</string>
<string name="poi_access_moped">Mopedåtkomst</string>
<string name="poi_access_motorcycle">Motorcykelåtkomst</string>
<string name="poi_access_trailer">Släpvangsåtkomst</string>
<string name="poi_access_motorhome">Husbilsåtkomst</string>
<string name="poi_access_caravan">Husvangsåtkomst</string>
<string name="poi_access_bus">Bussåtkomst</string>
<string name="poi_snowmobile_filter">Snöskoteråtkomst</string>
<string name="poi_climbing_crag">Ja</string>
<string name="poi_climbing_crag_filter">Klättring</string>
<string name="poi_rtsa_scale_filter">Svårighetskategori</string>
<string name="poi_park_ride">Parkera och åk</string>
<string name="poi_socket_tesla_roadster_output">Uttag: Tesla Roadster: utgående</string>
<string name="poi_socket_tesla_roadster_current">Uttag: Tesla Roadster: ström</string>
<string name="poi_socket_tesla_roadster">Uttag: Tesla Roadster</string>
<string name="poi_socket_tesla_supercharger">Uttag: Tesla Supercharger</string>
<string name="poi_socket_tesla_supercharger_output">Uttag: Tesla Supercharger: utgående</string>
<string name="poi_socket_tesla_supercharger_current">Uttag: Tesla Supercharger: ström</string>
<string name="poi_socket_tesla_standard_output">Uttag: Tesla standard: utgående</string>
<string name="poi_socket_tesla_standard_current">Uttag: Tesla standard: ström</string>
<string name="poi_socket_tesla_standard">Uttag: Tesla standard</string>
<string name="poi_socket_chademo_output">Uttag: CHAdeMO: utgående</string>
<string name="poi_socket_chademo_current">Uttag: CHAdeMO: ström</string>
<string name="poi_socket_chademo">Uttag: CHAdeMO</string>
<string name="poi_socket_type3_output">Uttag: Typ 3: utgeånde</string>
<string name="poi_socket_type3_current">Uttag: Typ 3: ström</string>
<string name="poi_socket_type3">Uttag: Typ 3</string>
<string name="poi_socket_type2_combo_output">Uttag: Typ 2: utgeånde</string>
<string name="poi_socket_type2_combo_current">Uttag: Typ 2 kombo: ström</string>
<string name="poi_socket_type2_combo">Uttag: Typ 2 kombo</string>
<string name="poi_socket_type2_output">Uttag: Typ 2: utgående</string>
<string name="poi_socket_type2_current">Uttag: Typ 2: ström</string>
<string name="poi_socket_type2">Uttag: Typ 2</string>
<string name="poi_socket_type1_combo_current">Uttag: Typ 1 kombo: ström</string>
<string name="poi_socket_type1_combo">Uttag: Typ 1 kombo</string>
<string name="poi_socket_type1_output">Uttag: Typ 1: utgående</string>
<string name="poi_socket_type1_current">Uttag: Typ 1: ström</string>
<string name="poi_socket_type1">Uttag: Typ 1</string>
<string name="poi_socket_type1_combo_output">Uttag: Typ 1 kombo: utgående</string>
<string name="poi_socket_cee_red_125a_output">Uttag: CEE röd 125A: utgående</string>
<string name="poi_socket_cee_red_125a_current">Uttag: CEE röd 125A: ström</string>
<string name="poi_socket_cee_red_125a">Uttag: CEE röd 125A</string>
<string name="poi_socket_cee_red_64a_output">Uttag: CEE röd 64A: utgående</string>
<string name="poi_socket_cee_red_64a_current">Uttag: CEE röd 64A: ström</string>
<string name="poi_socket_cee_red_64a">Uttag: CEE röd 64A</string>
<string name="poi_socket_cee_red_32a_output">Uttag: CEE röd 32A: utgående</string>
<string name="poi_socket_cee_red_32a_current">Uttag: CEE röd 32A: ström</string>
<string name="poi_socket_cee_red_32a">Uttag: CEE röd 32A</string>
<string name="poi_socket_cee_red_16a_output">Uttag: CEE röd 16A: utgående</string>
<string name="poi_socket_cee_red_16a_current">Uttag: CEE röd 16A: ström</string>
<string name="poi_socket_cee_red_16a">Uttag: CEE röd 16A</string>
<string name="poi_socket_cee_blue_output">Uttag: CEE blå: utgående</string>
<string name="poi_socket_cee_blue_current">Uttag: CEE blå: ström</string>
<string name="poi_socket_cee_blue">Uttag: CEE blå</string>
<string name="poi_water_place_access_multifamilies">Multi familj</string>
<string name="poi_water_place_access_family">Familj</string>
<string name="poi_water_place_access_community">Gemenskap</string>
<string name="poi_water_supply_bottled_water">Flaskvatten</string>
<string name="poi_water_supply_water_tank">Vattentank</string>
<string name="poi_water_supply_water_trucking">Vattentransporter</string>
<string name="poi_water_supply_borehole">Borrhål</string>
<string name="poi_water_supply_pump">Pump</string>
<string name="poi_water_supply_running_water">Rinnande vatten</string>
<string name="poi_water_supply_pipeline">Rörledning</string>
<string name="poi_water_supply_water_well">Vattenbrunn</string>
<string name="poi_water_purification_aquatabs">Aquatabs</string>
<string name="poi_water_purification_reverse_osmosis">Omvänd osmos</string>
<string name="poi_water_purification_chlorine">Klor</string>
<string name="poi_water_purification_none">Ingen</string>
<string name="poi_water_place_durability_emergency">Hållbarhet på vattenplats: kritiskt</string>
<string name="poi_water_place_durability_durable">Hållbarhet på vattenplats: hållbar</string>
<string name="poi_operational_status_needs_maintenance">Behöver underhåll</string>
<string name="poi_operational_status_broken">Trasig</string>
<string name="poi_operational_status_restricted">Begränsad</string>
<string name="poi_operational_status_closed">Stängd</string>
<string name="poi_operational_status_open">Öppen</string>
<string name="poi_visibility_area">Plats: area</string>
<string name="poi_visibility_street">Plats: väg</string>
<string name="poi_visibility_house">Plats: hus</string>
<string name="poi_location_entrance">Plats: entre</string>
<string name="poi_location_wall">Plats: vägg</string>
<string name="poi_location_bridge">Plats: bro</string>
<string name="poi_location_kiosk">Plats: kiosk</string>
<string name="poi_location_platform">Plats: plattform</string>
<string name="poi_location_indoor">Plats: inne</string>
<string name="poi_location_outdoor">Plats: ute</string>
<string name="poi_location_rooftop">Plats: tak</string>
<string name="poi_location_roof">Plats: tak</string>
</resources> </resources>

View file

@ -84,7 +84,8 @@
<string name="select_animate_speedup">Välj animerad ruttacceleration</string> <string name="select_animate_speedup">Välj animerad ruttacceleration</string>
<string name="global_app_allocated_memory_descr">Allokerat minne %1$s MB (Android-gräns %2$s MB, Dalvik %3$s MB).</string> <string name="global_app_allocated_memory_descr">Allokerat minne %1$s MB (Android-gräns %2$s MB, Dalvik %3$s MB).</string>
<string name="global_app_allocated_memory">Allokerat minne</string> <string name="global_app_allocated_memory">Allokerat minne</string>
<string name="native_app_allocated_memory_descr">Totalt inbyggt minne allokerat av appen %1$s MB (Dalvik %2$s MB, övrigt %3$s MB). Proportionellt minne %4$s MB (Android-gräns %5$s MB, Dalvik %6$s MB).</string> <string name="native_app_allocated_memory_descr">Totalt inbyggt minne allokerat av appen %1$s MB (Dalvik %2$s MB, övrigt %3$s MB).
\nProportionellt minne %4$s MB (Android-gräns %5$s MB, Dalvik %6$s MB).</string>
<string name="native_app_allocated_memory">Totalt inbyggt minne</string> <string name="native_app_allocated_memory">Totalt inbyggt minne</string>
<string name="starting_point_too_far">Startpunkten ligger för långt från närmaste väg.</string> <string name="starting_point_too_far">Startpunkten ligger för långt från närmaste väg.</string>
<string name="shared_location">Delad plats</string> <string name="shared_location">Delad plats</string>
@ -159,15 +160,14 @@
<string name="left">till vänster</string> <string name="left">till vänster</string>
<string name="front_left">framåt till vänster</string> <string name="front_left">framåt till vänster</string>
<string name="towards">mot</string> <string name="towards">mot</string>
<string name="altitude">Höjd</string> <string name="altitude">Höjd över havet</string>
<string name="map_widget_renderer">Kartutseende</string> <string name="map_widget_renderer">Kartutseende</string>
<string name="osmand_parking_position_description_add">Att hämta bilen på:</string> <string name="osmand_parking_position_description_add">Att hämta bilen på:</string>
<string name="osmand_parking_pm">em</string> <string name="osmand_parking_pm">em</string>
<string name="osmand_parking_am">fm</string> <string name="osmand_parking_am">fm</string>
<string name="osmand_parking_position_name">Parkeringsplats</string> <string name="osmand_parking_position_name">Parkeringsplats</string>
<string name="osmand_parking_plugin_description">Modulen Parkeringsplats hjälper dig att hålla reda på var din bil är parkerad och vid behov hur mycket parkeringstid det är kvar. <string name="osmand_parking_plugin_description">Låter dig spara var din bil är parkerad, inklusive hur mycket parkeringstid som finns kvar.
\nBåde plats och tid är synliga både på instrumentpanelen och i en kartwidget. En larmpåminnelse kan läggas till i Android-kalendern.</string>
Du hittar din parkeringsplats och -tid på instrumentbrädan och i widgeten på kartskärmen. Du kan lägga till ett larm i kalendern som en påminnelse.</string>
<string name="osmand_parking_plugin_name">Parkeringsplats</string> <string name="osmand_parking_plugin_name">Parkeringsplats</string>
<string name="context_menu_item_add_parking_point">Markera som parkeringsplats</string> <string name="context_menu_item_add_parking_point">Markera som parkeringsplats</string>
<string name="context_menu_item_delete_parking_point">Ta bort P-markering</string> <string name="context_menu_item_delete_parking_point">Ta bort P-markering</string>
@ -192,11 +192,11 @@ Du hittar din parkeringsplats och -tid på instrumentbrädan och i widgeten på
<string name="map_online_data">Online-kartor och kartrutor</string> <string name="map_online_data">Online-kartor och kartrutor</string>
<string name="map_online_data_descr">Använd online-kartor (hämta och cacha kartbitar på SD-kortet).</string> <string name="map_online_data_descr">Använd online-kartor (hämta och cacha kartbitar på SD-kortet).</string>
<string name="online_map_settings_descr">Konfigurera online- eller cachade källor för kartbitar.</string> <string name="online_map_settings_descr">Konfigurera online- eller cachade källor för kartbitar.</string>
<string name="osmand_rastermaps_plugin_description">"Med denna modul får man tillgång till många typer av online-kartor, från fördefinierade Openstreetmap-rutor (som Mapnik) till satellitbilder och speciella lager såsom väderkartor, klimatkartor, geologiska kartor, reliefkartor o.s.v. <string name="osmand_rastermaps_plugin_description">Med denna modul får man tillgång till många typer av online-kartor, från fördefinierade Openstreetmap-rutor (som Mapnik) till satellitbilder och speciella lager såsom väderkartor, klimatkartor, geologiska kartor, reliefkartor o.s.v.
\n \n
\nDessa kartor kan användas antingen som huvudkarta (baskarta) och visas på kartskärmen i OsmAnd eller som ett över- eller underlägg till en annan baskarta (som OsmAnds vanliga offline-kartor). För att göra en underliggande karta tydligare kan vissa element i OsmAnds vektorkartor lätt döljas via menyn \'Konfigurera karta\'. \nDessa kartor kan användas antingen som huvudkarta (baskarta) och visas på kartskärmen i OsmAnd eller som ett över- eller underlägg till en annan baskarta (som OsmAnds vanliga offline-kartor). För att göra en underliggande karta tydligare kan vissa element i OsmAnds vektorkartor lätt döljas via menyn \'Konfigurera karta\'.
\n \n
\nKartbitar (tile maps) kan hämtas direkt på nätet eller förberedas för användning frånkopplad (och kopieras manuellt till OsmAnds datamapp) som en SQLite-databas som kan skapas med olika tredjepartsverktyg. "</string> \nKartbitar (tile maps) kan hämtas direkt på nätet eller förberedas för användning frånkopplad (och kopieras manuellt till OsmAnds datamapp) som en SQLite-databas som kan skapas med olika tredjepartsverktyg.</string>
<string name="osmand_background_plugin_description">Visa inställningarna för att aktivera spårning och navigering i bakgrundsläge (skärm av) genom att periodvis väcka GPS-enheten.</string> <string name="osmand_background_plugin_description">Visa inställningarna för att aktivera spårning och navigering i bakgrundsläge (skärm av) genom att periodvis väcka GPS-enheten.</string>
<string name="osmand_development_plugin_description">Denna modul visar inställningarna för utvecklings- och felsökningsfunktioner som rutt-testning och -simulering eller visning av renderingsprestanda eller röststyrning. Dessa inställningar är avsedda för utvecklare och behövs inte för den vanliga användaren.</string> <string name="osmand_development_plugin_description">Denna modul visar inställningarna för utvecklings- och felsökningsfunktioner som rutt-testning och -simulering eller visning av renderingsprestanda eller röststyrning. Dessa inställningar är avsedda för utvecklare och behövs inte för den vanliga användaren.</string>
<string name="plugins_screen">Hantera insticksmoduler</string> <string name="plugins_screen">Hantera insticksmoduler</string>
@ -208,19 +208,33 @@ Du hittar din parkeringsplats och -tid på instrumentbrädan och i widgeten på
<string name="osmand_parking_position_description">Din parkerade bils plats. %1$s</string> <string name="osmand_parking_position_description">Din parkerade bils plats. %1$s</string>
<string name="prefs_plugins_descr">Insticksmoduler aktiverar avancerade inställningar samt ger ytterligare funktionalitet.</string> <string name="prefs_plugins_descr">Insticksmoduler aktiverar avancerade inställningar samt ger ytterligare funktionalitet.</string>
<string name="prefs_plugins">Insticksmoduler</string> <string name="prefs_plugins">Insticksmoduler</string>
<string name="osm_editing_plugin_description">"Med denna modul kan OsmAnd användas för att göra bidrag till OSM såsom skapa eller modifiera OSM POI-objekt, öppna eller kommentera OSM-anteckningar, och bidra med inspelade GPX-filer. OSM är ett globalt kartprojekt inom public domain, För mer info, se https://openstreetmap.org. Aktivt deltagande uppskattas och bidrag kan göras direkt från OsmAnd om du anger dina autentiseringsuppgifter till OSM i appen."</string> <string name="osm_editing_plugin_description">Ge OSM-bidrag som att skapa eller modifiera OSM POI-objekt, öppna eller kommentera OSM-anteckningar och bidra med inspelade GPX-filer i OsmAnd genom att ange ditt användarnamn och lösenord. OpenStreetMap.org är ett community-driven, globalt kartläggningsprojekt för allmän domän.</string>
<string name="vector_maps_may_display_faster_on_some_devices">Vektorkartor ritas sannolikt upp snabbare. Fungerar kanske inte så bra på vissa enheter.</string> <string name="vector_maps_may_display_faster_on_some_devices">Vektorkartor ritas sannolikt upp snabbare. Fungerar kanske inte så bra på vissa enheter.</string>
<string name="play_commands_of_currently_selected_voice">Spela upp kommandon med vald röst</string> <string name="play_commands_of_currently_selected_voice">Spela upp kommandon med vald röst</string>
<string name="test_voice_prompts">Test av röstmeddelanden</string> <string name="test_voice_prompts">Test av röstmeddelanden</string>
<string name="switch_to_raster_map_to_see">Det finns ingen offline vektorkarta för den här platsen. Du kan hämta en i Inställningar (Hantera kartfiler) eller byta till online-kartor (aktivera modulen för online-kartor för detta).</string> <string name="switch_to_raster_map_to_see">Det finns ingen offline vektorkarta för den här platsen. Du kan hämta en i Inställningar (Hantera kartfiler) eller byta till online-kartor (aktivera modulen för online-kartor för detta).</string>
<string name="osmand_long_description_1000_chars">"OsmAnd (Open Street Maps Automated Navigation Directions) <string name="osmand_long_description_1000_chars">OsmAnd (OSM Automated Navigation Directions)
\n \n
\nOsmAnd är ett öppen källkodsprogram med tillgång till ett brett utbud av global OpenStreetMap-data. Alla kartdata (vektor- eller rasterkartor) kan lagras i telefonens minneskort för offlineanvändning. OsmAnd erbjuder även navigering offline och online, inklusive röstguidning. Några av de viktigaste funktionerna: - Komplett offline-funktionalitet (lagra nedladdade vektorkartor eller kartbitar på enheten) - Kompakta offline-vektorkartor för hela världen finns tillgängliga - Nedladdning av land- eller regionkartor direkt från appen - Överlägg av flera kartlager möjligt, som GPX- eller navigationsspår, sevärdheter, favoriter, höjddata, offentliga hållplatser, extra kartor med anpassningsbara transparens - Sökning offline efter adresser och platser (POIs) - Offline-dirigering för medellånga sträckor (experimentell) - Bil-, cykel- och fotgängarlägen med: - Tillval automatisk växling mellan dag- och nattvisning - Tillval hastighetsberoende zoomning - Valfri inställningen enligt kompass eller färdriktningen - Frivillig körfältsvägledning, visning av hastighetsgräns, inspelade röster samt TTS-röster \nOsmAnd är en programvara för öppen källkodsnavigering med tillgång till ett stort antal globala OSM-data. Alla kartdata (vektor- eller brickor) kan lagras på telefonens minneskort för offline-användning. Offline- och online-dirigeringsfunktioner erbjuds också, inklusive röstvägledning för sväng.
\n \n
\nBegränsningar i denna gratisversion av OsmAnd: - Antalet hämtningar av kartor är begränsat - Ingen tillgång till Wikipedia offline POIs \nNågra av kärnfunktionerna:
\n- Komplett offline-funktionalitet (lagra nedladdad vektor eller kakelkartor i enhetens lagring)
\n- Kompakta offlinevektorkartor för hela världen
\n- Ladda ner land- eller regionkartor direkt från appen
\n- Överlagring av flera kartlager möjliga, som GPX eller navigationsspår, intressanta platser, favoriter, konturlinjer, kollektivtrafikstopp, ytterligare kartor med anpassningsbar transparens
\n- Offline sökning efter adresser och platser (POI)
\n- Offline-dirigering för medelstora avstånd
\n- Lägen för bil, cykel och fotgängare med tillval:
\n- Automatisk växling mellan dag och natt
\n- Hastighetsberoende kartzoomning
\n- Kartinriktning enligt kompass eller rörelseriktning
\n- Fältvägledning, hastighetsgränsvisning, inspelade och text-till-tal-röster
\n \n
\nOsmAnd utvecklas aktivt och vårt projekt och dess fortsatta framsteg bygger på ekonomiska bidrag för att finansiera utveckling och testning av ny funktionalitet. Vänligen överväg att köpa OsmAnd+, finansiera specifika nya funktioner eller göra en allmän donation på osmand.net. \nBegränsningar av denna gratisversion av OsmAnd:
\n "</string> \n- Antalet nedladdningar av kartor begränsat
\n- Ingen offlineåtkomst till Wikipedia-intressepunkter
\n
\nOsmAnd utvecklas aktivt och vårt projekt och dess fortsatta framsteg är beroende av ekonomiska bidrag för utveckling och testning av ny funktionalitet. Överväg att köpa OsmAnd +, eller finansiera specifika nya funktioner eller göra en allmän donation på https://osmand.net.</string>
<string name="native_rendering">Inbyggd rendering</string> <string name="native_rendering">Inbyggd rendering</string>
<string name="default_buttons_support">Support</string> <string name="default_buttons_support">Support</string>
<string name="support_new_features">Ge stöd till nya funktioner</string> <string name="support_new_features">Ge stöd till nya funktioner</string>
@ -297,9 +311,8 @@ Du hittar din parkeringsplats och -tid på instrumentbrädan och i widgeten på
<string name="osmand_service">Bakgrundsläge</string> <string name="osmand_service">Bakgrundsläge</string>
<string name="osmand_service_descr">OsmAnd körs i bakgrunden medan skärmen är avstängd.</string> <string name="osmand_service_descr">OsmAnd körs i bakgrunden medan skärmen är avstängd.</string>
<string name="download_files_not_enough_space">Det finns inte tillräckligt med ledigt utrymme för att hämta %1$s MB (ledigt: %2$s).</string> <string name="download_files_not_enough_space">Det finns inte tillräckligt med ledigt utrymme för att hämta %1$s MB (ledigt: %2$s).</string>
<string name="download_files_question_space">Hämta {0} fil(er)? <string name="download_files_question_space">Hämta {0} fil(er)\?
Nyttjat utrymme är {1} MB. \n{1} MB (av {2} MB) kommer att användas.</string>
(Tillgängligt utrymme är {2} MB.)</string>
<string name="use_transparent_map_theme">Genomskinligt tema</string> <string name="use_transparent_map_theme">Genomskinligt tema</string>
<string name="native_library_not_supported">Inbyggt bibliotek stöds inte på den här enheten.</string> <string name="native_library_not_supported">Inbyggt bibliotek stöds inte på den här enheten.</string>
<string name="init_native_library">Initierar inbyggt bibliotek …</string> <string name="init_native_library">Initierar inbyggt bibliotek …</string>
@ -382,7 +395,7 @@ Nyttjat utrymme är {1} MB.
<string name="installing_new_resources">Packar upp nya data …</string> <string name="installing_new_resources">Packar upp nya data …</string>
<string name="internet_connection_required_for_online_route">En online-navigeringstjänst är vald men ingen internetanslutning är tillgänglig.</string> <string name="internet_connection_required_for_online_route">En online-navigeringstjänst är vald men ingen internetanslutning är tillgänglig.</string>
<string name="tts_language_not_supported_title">Språket stöds inte</string> <string name="tts_language_not_supported_title">Språket stöds inte</string>
<string name="tts_language_not_supported">Det valda språket stöds inte av den installerade Android TTS (text-till-tal)-motorn. Vill du söka efter en annan TTS-motor på Market? Annars kommer det förinställda TTS-språket att användas.</string> <string name="tts_language_not_supported">Det valda språket stöds inte av Android TTS (text-till-tal) -motorn installerad, dess förinställda TTS-språk används istället. Leta efter en annan TTS-motor i butiken\?</string>
<string name="tts_missing_language_data_title">Data saknas</string> <string name="tts_missing_language_data_title">Data saknas</string>
<string name="tts_missing_language_data">Inga data för det valda språket är installerade. Vill du besöka Google Play för att installera?</string> <string name="tts_missing_language_data">Inga data för det valda språket är installerade. Vill du besöka Google Play för att installera?</string>
<string name="gpx_option_reverse_route">Omvänd GPX-riktning</string> <string name="gpx_option_reverse_route">Omvänd GPX-riktning</string>
@ -419,11 +432,11 @@ Nyttjat utrymme är {1} MB.
<string name="preferred_locale">Visningsspråk</string> <string name="preferred_locale">Visningsspråk</string>
<string name="shared_string_next">Nästa</string> <string name="shared_string_next">Nästa</string>
<string name="shared_string_previous">Föregående</string> <string name="shared_string_previous">Föregående</string>
<string name="unit_of_length_descr">Ändra enheter för avstånd.</string> <string name="unit_of_length_descr">Ändra vad avstånd mäts i.</string>
<string name="unit_of_length">Enheter för avstånd</string> <string name="unit_of_length">Enhet för längd</string>
<string name="si_mi_feet">Eng. mil/fot</string> <string name="si_mi_feet">Miles/fot</string>
<string name="si_mi_yard">Eng. mil/yard</string> <string name="si_mi_yard">Miles/yard</string>
<string name="si_km_m">Kilometer/meter</string> <string name="si_km_m">Kilomter/meter</string>
<string name="yard">yd</string> <string name="yard">yd</string>
<string name="send_location_way_choose_title">Dela platsen med</string> <string name="send_location_way_choose_title">Dela platsen med</string>
<string name="send_location_sms_pattern">Plats: %1$s\n%2$s</string> <string name="send_location_sms_pattern">Plats: %1$s\n%2$s</string>
@ -701,7 +714,7 @@ Nyttjat utrymme är {1} MB.
<string name="search_villages_and_postcodes">Sök efter fler byar/postnummer</string> <string name="search_villages_and_postcodes">Sök efter fler byar/postnummer</string>
<string name="rendering_attr_showRoadMaps_description">Välj när du vill visa kartor som endast har vägar:</string> <string name="rendering_attr_showRoadMaps_description">Välj när du vill visa kartor som endast har vägar:</string>
<string name="rendering_attr_showRoadMaps_name">Kartor med enbart vägar</string> <string name="rendering_attr_showRoadMaps_name">Kartor med enbart vägar</string>
<string name="download_roads_only_item">"Vägar "</string> <string name="download_roads_only_item">Bara vägar</string>
<string name="download_regular_maps">Standardkartor</string> <string name="download_regular_maps">Standardkartor</string>
<string name="download_roads_only_maps">Karta med enbart vägar</string> <string name="download_roads_only_maps">Karta med enbart vägar</string>
<string name="safe_mode_description">Kör appen i felsäkert läge (för långsammare Android istället för intern kod).</string> <string name="safe_mode_description">Kör appen i felsäkert läge (för långsammare Android istället för intern kod).</string>
@ -783,9 +796,9 @@ Nyttjat utrymme är {1} MB.
<string name="av_settings">Inställningar för ljud och video </string> <string name="av_settings">Inställningar för ljud och video </string>
<string name="recording_error">Ett fel uppstod under inspelningen </string> <string name="recording_error">Ett fel uppstod under inspelningen </string>
<string name="recording_camera_not_available">Ingen kamera tillgänglig</string> <string name="recording_camera_not_available">Ingen kamera tillgänglig</string>
<string name="srtm_plugin_description">"Denna modul erbjuder överlägg med höjdkurvor som kan visas i kombination med OsmAnds standardkartor. Denna funktion kommer att uppskattas av idrottsmän, vandrare och alla som är intresserade av höjdskillnader i landskapet. <string name="srtm_plugin_description">Denna modul erbjuder överlägg med höjdkurvor som kan visas i kombination med OsmAnds standardkartor. Denna funktion kommer att uppskattas av idrottsmän, vandrare och alla som är intresserade av höjdskillnader i landskapet.
\n \n
\nDessa globala data (mellan 70 grader norr och 70 grader syd) baseras på mätningar av SRTM (Shuttle Radar Topography Mission) och ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), ett bildinstrument ombord Terra, flaggskeppet i NASA:s Earth Observing System. ASTER är ett samprojekt mellan NASA, Japans Ministry of Economy, Trade and Industry (METI), and Japan Space Systems (J-spacesystems). "</string> \nDessa globala data (mellan 70 grader norr och 70 grader syd) baseras på mätningar av SRTM (Shuttle Radar Topography Mission) och ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), ett bildinstrument ombord Terra, flaggskeppet i NASA:s Earth Observing System. ASTER är ett samprojekt mellan NASA, Japans Ministry of Economy, Trade and Industry (METI), and Japan Space Systems (J-spacesystems).</string>
<string name="delete_target_point">Ta bort destination</string> <string name="delete_target_point">Ta bort destination</string>
<string name="intermediate_point">Mellanliggande destination %1$s</string> <string name="intermediate_point">Mellanliggande destination %1$s</string>
<string name="poi_filter_nominatim">Online Nominatim</string> <string name="poi_filter_nominatim">Online Nominatim</string>
@ -874,11 +887,11 @@ Nyttjat utrymme är {1} MB.
<string name="prefer_in_routing_descr">Föredra motorvägar.</string> <string name="prefer_in_routing_descr">Föredra motorvägar.</string>
<string name="item_checked">markerad</string> <string name="item_checked">markerad</string>
<string name="item_unchecked">ej markerad</string> <string name="item_unchecked">ej markerad</string>
<string name="av_def_action_choose">Välj vid användning</string> <string name="av_def_action_choose">På förfrågan\?</string>
<string name="enable_plugin_monitoring_services">Aktivera Trippinspelningspluginen för att använda positionsloggningstjänster (GPX-loggning, online-spårning)</string> <string name="enable_plugin_monitoring_services">Aktivera Trippinspelningspluginen för att använda positionsloggningstjänster (GPX-loggning, online-spårning)</string>
<string name="osmand_srtm_long_description_1000_chars">"Denna modul erbjuder både ett överlägg med konturlinjer och ett höjdkurvslager som kan visas ovanpå OsmAnds offline-kartor. Denna funktion kommer att uppskattas av idrottsmän, vandrare och alla som är intresserade av höjdskillnader i landskapet. <string name="osmand_srtm_long_description_1000_chars">Denna modul erbjuder både ett överlägg med konturlinjer och ett höjdkurvslager som kan visas ovanpå OsmAnds offline-kartor. Denna funktion kommer att uppskattas av idrottsmän, vandrare och alla som är intresserade av höjdskillnader i landskapet.
\n \n
\nDessa globala data (mellan 70 grader norr och 70 grader syd) är baserade på SRTM (Shuttle Radar Topography Mission) och ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), ett bildinstrument på Terra, NASA:s Earth Observing Systems satellit. ASTER är ett samarbete mellan NASA, Japans finansdepartement, Trade and Industry (METI) och Japan Space Systems (J-spacesystems). "</string> \nDessa globala data (mellan 70 grader norr och 70 grader syd) är baserade på SRTM (Shuttle Radar Topography Mission) och ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer), ett bildinstrument på Terra, NASA:s Earth Observing Systems satellit. ASTER är ett samarbete mellan NASA, Japans finansdepartement, Trade and Industry (METI) och Japan Space Systems (J-spacesystems).</string>
<string name="access_arrival_time">Ankomsttid</string> <string name="access_arrival_time">Ankomsttid</string>
<string name="index_name_openmaps">OpenMaps EU</string> <string name="index_name_openmaps">OpenMaps EU</string>
<string name="layer_hillshade">Skuggad relief-lager</string> <string name="layer_hillshade">Skuggad relief-lager</string>
@ -892,7 +905,7 @@ Nyttjat utrymme är {1} MB.
<string name="files_limit">%1$d filer kvar</string> <string name="files_limit">%1$d filer kvar</string>
<string name="available_downloads_left">Du har %1$d filer kvar att hämta</string> <string name="available_downloads_left">Du har %1$d filer kvar att hämta</string>
<string name="install_paid">Fullversion</string> <string name="install_paid">Fullversion</string>
<string name="cancel_route">Avbryt rutten</string> <string name="cancel_route">Avbryt rutten\?</string>
<string name="cancel_navigation">Avbryt navigeringen</string> <string name="cancel_navigation">Avbryt navigeringen</string>
<string name="clear_destination">Ta bort destinationen</string> <string name="clear_destination">Ta bort destinationen</string>
<string name="download_using_mobile_internet">Wi-Fi är för tillfället inte anslutet. Vill du hämta med din nuvarande anslutning till Internet?</string> <string name="download_using_mobile_internet">Wi-Fi är för tillfället inte anslutet. Vill du hämta med din nuvarande anslutning till Internet?</string>
@ -1218,9 +1231,9 @@ Nyttjat utrymme är {1} MB.
<string name="speak_poi">Närbelägna intresssepunkter</string> <string name="speak_poi">Närbelägna intresssepunkter</string>
<string name="index_tours">Rundturer</string> <string name="index_tours">Rundturer</string>
<string name="shared_string_all">Alla</string> <string name="shared_string_all">Alla</string>
<string name="record_plugin_description">"Denna modul aktiverar funktionen att antingen spela in och spara dina spår genom att du trycker på widgeten GPX-loggning på kartskärmen eller att alla dina rutter sparas automatiskt i en GPX-fil. <string name="record_plugin_description">Denna modul aktiverar funktionen att antingen spela in och spara dina spår genom att du trycker på widgeten GPX-loggning på kartskärmen eller att alla dina rutter sparas automatiskt i en GPX-fil.
\n \n
\nInspelade spår kan delas ut till vänner eller användas som bidrag till OSM. Idrottsmän kan använda inspelade spår för att följa sin träning. Viss grundläggande spåranalys kan göras direkt i OsmAnd, såsom varvtider, genomsnittshastighet o.s.v. och spår kan givetvis också analyseras i efterhand i speciella analysverktyg från tredje part. "</string> \nInspelade spår kan delas ut till vänner eller användas som bidrag till OSM. Idrottsmän kan använda inspelade spår för att följa sin träning. Viss grundläggande spåranalys kan göras direkt i OsmAnd, såsom varvtider, genomsnittshastighet o.s.v. och spår kan givetvis också analyseras i efterhand i speciella analysverktyg från tredje part.</string>
<string name="record_plugin_name">Inspelning av resa</string> <string name="record_plugin_name">Inspelning av resa</string>
<string name="int_hour">h</string> <string name="int_hour">h</string>
<string name="duration">Längd</string> <string name="duration">Längd</string>
@ -1279,7 +1292,7 @@ Nyttjat utrymme är {1} MB.
<string name="everything_up_to_date">Alla filer är uppdaterade</string> <string name="everything_up_to_date">Alla filer är uppdaterade</string>
<string name="use_opengl_render">Använd OpenGL-rendering</string> <string name="use_opengl_render">Använd OpenGL-rendering</string>
<string name="use_opengl_render_descr">Använd hårdvaruaccelererad OpenGL-rendering (fungerar kanske inte på vissa enheter).</string> <string name="use_opengl_render_descr">Använd hårdvaruaccelererad OpenGL-rendering (fungerar kanske inte på vissa enheter).</string>
<string name="no_internet_connection">Kan inte hämta; kontrollera din internetsanslutning.</string> <string name="no_internet_connection">Kan inte hämta, kontrollera din internetsanslutning.</string>
<string name="rendering_attr_roadStyle_name">Vägtyp</string> <string name="rendering_attr_roadStyle_name">Vägtyp</string>
<string name="rendering_value_default_name">Standard</string> <string name="rendering_value_default_name">Standard</string>
<string name="rendering_value_orange_name">Brandgul</string> <string name="rendering_value_orange_name">Brandgul</string>
@ -1326,7 +1339,7 @@ Nyttjat utrymme är {1} MB.
<string name="version_settings">Versioner</string> <string name="version_settings">Versioner</string>
<string name="shared_string_gpx_points">Punkter</string> <string name="shared_string_gpx_points">Punkter</string>
<string name="shared_string_disabled">Inaktiverad</string> <string name="shared_string_disabled">Inaktiverad</string>
<string name="shared_string_enabled">Aktiverad</string> <string name="shared_string_enabled">Aktiverat</string>
<string name="edit_group">Redigera grupp</string> <string name="edit_group">Redigera grupp</string>
<string name="plugin_install_needs_network">En Internetuppkoppling krävs för att installera denna modul.</string> <string name="plugin_install_needs_network">En Internetuppkoppling krävs för att installera denna modul.</string>
<string name="shared_string_enable">Aktivera</string> <string name="shared_string_enable">Aktivera</string>
@ -1349,13 +1362,20 @@ Nyttjat utrymme är {1} MB.
\nEn kartfil som innehåller alla nautiska symboler globalt finns tillgänglig som en enda nedladdning med namnet \'World seamarks\'. \nEn kartfil som innehåller alla nautiska symboler globalt finns tillgänglig som en enda nedladdning med namnet \'World seamarks\'.
\n \n
\nDenna vy kan ändras genom att antingen inaktivera den här igen eller genom att ändra kartstilen under Konfigurera kartor.</string> \nDenna vy kan ändras genom att antingen inaktivera den här igen eller genom att ändra kartstilen under Konfigurera kartor.</string>
<string name="plugin_ski_descr">"Om du aktiverar denna vy ändras kartstilen till Vinter och skidor, och visar landskapet i vinterskrud. <string name="plugin_ski_descr">Detta plugin för OsmAnd ger dig detaljer om globala utförsåkning, längdskidspår, alpina skidvägar, linbanor och skidliftar. Rutter och pister visas färgkodade av svårigheter och avbildas i en speciell \"vinter\" -stil som liknar ett snöfärgat vinterlandskap.
\n\nEn global karta med alla pister och längdskidspår i denna vy finns tillgänglig under Alla kartor som \'World ski map\'. \n
\n\nDenna vy kan ändras genom att antingen inaktivera den här igen eller genom att ändra kartstilen under Konfigurera kartor. "</string> \nOm du aktiverar den här vyn ändras kartstilen till \"Vinter och skidor\" och visar alla landskapsfunktioner under vinterförhållanden. Denna vy kan återställas genom att antingen avaktivera den igen här, eller genom att ändra \'Kartstil\' under \'Konfigurera karta\' efter önskemål.</string>
<string name="plugin_touringview_descr">"Om du aktiverar denna vy ändras kartan till \'Vägkartsvy\', som är en speciell vy med mycket detaljer för resenärer och yrkesförare. <string name="plugin_touringview_descr">Om du aktiverar denna vy ändras kartan till \'Vägkartsvy\', som är en speciell vy med mycket detaljer för resenärer och yrkesförare.
\n\nDenna vy ger, vid varje zoomnivå, maximalt antal detaljer som är tillgängliga i kartdatat (speciellt vägar, stigar och orienteringsmärken).\n\nDen visar också alla vägtyper på ett mycket tydligt sätt via färgkoder något som är användbart t.ex vid framförande av stora fordon. \n
\n\nOch den erbjuder också speciella alternativ såsom visning av cykelrutter eller rutter i Alperna.\n\nIngen speciell hämtning av någon karta krävs; denna vy skapas med våra standardkartor. \nDenna vy ger, vid varje zoomnivå, maximalt antal detaljer som är tillgängliga i kartdatat (speciellt vägar, stigar och orienteringsmärken).
\n\nDenna vy kan ändras genom att antingen inaktivera den här igen eller genom att ändra kartstilen under Konfigurera kartor. "</string> \n
\nDen visar också alla vägtyper på ett mycket tydligt sätt via färgkoder något som är användbart t.ex vid framförande av stora fordon.
\n
\nOch den erbjuder också speciella alternativ såsom visning av cykelrutter eller rutter i Alperna.
\n
\nIngen speciell hämtning av någon karta krävs; denna vy skapas med våra standardkartor.
\n
\nDenna vy kan ändras genom att antingen inaktivera den här igen eller genom att ändra kartstilen under Konfigurera kartor.</string>
<string name="location_on_map">Plats:\n Lat %1$s\n Lon %2$s</string> <string name="location_on_map">Plats:\n Lat %1$s\n Lon %2$s</string>
<string name="plugin_touringview_name">Vägkartsvy</string> <string name="plugin_touringview_name">Vägkartsvy</string>
<string name="days_behind">dagar efter</string> <string name="days_behind">dagar efter</string>
@ -1391,7 +1411,7 @@ Nyttjat utrymme är {1} MB.
<string name="shared_string_control_start">Starta</string> <string name="shared_string_control_start">Starta</string>
<string name="shared_string_control_stop">Stoppa</string> <string name="shared_string_control_stop">Stoppa</string>
<string name="shared_string_import">Importera</string> <string name="shared_string_import">Importera</string>
<string name="shared_string_export">Exportera</string> <string name="shared_string_export">Export</string>
<string name="shared_string_more">Mer…</string> <string name="shared_string_more">Mer…</string>
<string name="shared_string_more_actions">Fler åtgärder</string> <string name="shared_string_more_actions">Fler åtgärder</string>
<string name="shared_string_do_not_show_again">Visa inte nästa gång</string> <string name="shared_string_do_not_show_again">Visa inte nästa gång</string>
@ -1403,7 +1423,7 @@ Nyttjat utrymme är {1} MB.
<string name="shared_string_unexpected_error">Ett oväntat fel uppstod</string> <string name="shared_string_unexpected_error">Ett oväntat fel uppstod</string>
<string name="shared_string_action_template">Åtgärd {0}</string> <string name="shared_string_action_template">Åtgärd {0}</string>
<string name="shared_string_close">Stäng</string> <string name="shared_string_close">Stäng</string>
<string name="shared_string_exit">Avsluta</string> <string name="shared_string_exit">Utgång</string>
<string name="shared_string_show">Visa</string> <string name="shared_string_show">Visa</string>
<string name="shared_string_show_all">Visa alla</string> <string name="shared_string_show_all">Visa alla</string>
<string name="shared_string_show_on_map">Visa på kartan</string> <string name="shared_string_show_on_map">Visa på kartan</string>
@ -1423,7 +1443,7 @@ Nyttjat utrymme är {1} MB.
<string name="simulate_your_location">Simulera din plats</string> <string name="simulate_your_location">Simulera din plats</string>
<string name="drawer">Platt lista</string> <string name="drawer">Platt lista</string>
<string name="short_location_on_map">Lat %1$s <string name="short_location_on_map">Lat %1$s
Long %2$s</string> \nLong %2$s</string>
<string name="tips_and_tricks_descr">Frågor och svar, nyliga förändringar och annat.</string> <string name="tips_and_tricks_descr">Frågor och svar, nyliga förändringar och annat.</string>
<string name="routing_settings_2">Navigeringsinställningar</string> <string name="routing_settings_2">Navigeringsinställningar</string>
<string name="general_settings_2">Allmänna inställningar</string> <string name="general_settings_2">Allmänna inställningar</string>
@ -1495,7 +1515,7 @@ Long %2$s</string>
<string name="local_recordings_delete_all_confirm">Du håller på att ta bort %1$d anteckningar. Är du säker?</string> <string name="local_recordings_delete_all_confirm">Du håller på att ta bort %1$d anteckningar. Är du säker?</string>
<string name="download_wikipedia_maps">Wikipedia</string> <string name="download_wikipedia_maps">Wikipedia</string>
<string name="shared_string_import2osmand">Importera till OsmAnd</string> <string name="shared_string_import2osmand">Importera till OsmAnd</string>
<string name="gps_network_not_enabled">Platstjänsten är inte aktiverad. Vill du slå på den?</string> <string name="gps_network_not_enabled">Platstjänsten är av. Vill du slå på den\?</string>
<string name="archive_wikipedia_data">Du har gamla och inkompatibla data från Wikipedia. Vill du arkivera dem?</string> <string name="archive_wikipedia_data">Du har gamla och inkompatibla data från Wikipedia. Vill du arkivera dem?</string>
<string name="download_wikipedia_files">Hämta ytterligare data från Wikipedia (%1$s MB)?</string> <string name="download_wikipedia_files">Hämta ytterligare data från Wikipedia (%1$s MB)?</string>
<string name="lang_vo">Volapük</string> <string name="lang_vo">Volapük</string>
@ -1605,22 +1625,22 @@ Long %2$s</string>
<string name="favourites_context_menu_add">Lägg till favorit</string> <string name="favourites_context_menu_add">Lägg till favorit</string>
<string name="default_speed_system_descr">Ange enhet för hastighet.</string> <string name="default_speed_system_descr">Ange enhet för hastighet.</string>
<string name="default_speed_system">Enhet för hastighet</string> <string name="default_speed_system">Enhet för hastighet</string>
<string name="si_nm">Sjömil</string> <string name="si_nm">Distansminuter</string>
<string name="si_kmh">Kilometer i timmen</string> <string name="si_kmh">Kilometer per timme</string>
<string name="si_mph">Engelska mil i timmen</string> <string name="si_mph">Miles per timme</string>
<string name="si_m_s">Meter i sekunden</string> <string name="si_m_s">Meter per sekund</string>
<string name="si_min_km">Minuter per kilometer</string> <string name="si_min_km">Minuter per kilometer</string>
<string name="si_min_m">Minuter per engelsk mil</string> <string name="si_min_m">Minuter per mile</string>
<string name="si_nm_h">Sjömil i timmen (knop)</string> <string name="si_nm_h">Sjömil per timme (knop)</string>
<string name="shared_string_trip_recording">Inspelning av resa</string> <string name="shared_string_trip_recording">Inspelning av resa</string>
<string name="shared_string_navigation">Navigering</string> <string name="shared_string_navigation">Navigering</string>
<string name="osmand_running_in_background">Körs i bakgrunden</string> <string name="osmand_running_in_background">Körs i bakgrunden</string>
<string name="favorite_category_add_new">Lägg till ny</string> <string name="favorite_category_add_new">Lägg till ny</string>
<string name="favorite_category_select">Välj kategori</string> <string name="favorite_category_select">Välj kategori</string>
<string name="count_of_lines">Antal rader</string> <string name="count_of_lines">Antal rader</string>
<string name="nm">nmi</string> <string name="nm">di</string>
<string name="nm_h">nmi/h</string> <string name="nm_h">M</string>
<string name="min_mile">min/m</string> <string name="min_mile">min/mi</string>
<string name="min_km">min/km</string> <string name="min_km">min/km</string>
<string name="m_s">m/s</string> <string name="m_s">m/s</string>
<string name="srtm_plugin_disabled">Konturlinjer inaktiverade</string> <string name="srtm_plugin_disabled">Konturlinjer inaktiverade</string>
@ -1676,7 +1696,7 @@ Long %2$s</string>
<string name="world_map_download_descr">Baskarta över världen (täcker hela världen med låg zoomningsgrad) saknas eller är gammal. Hämta gärna denna karta för en global översikt.</string> <string name="world_map_download_descr">Baskarta över världen (täcker hela världen med låg zoomningsgrad) saknas eller är gammal. Hämta gärna denna karta för en global översikt.</string>
<string name="shared_string_upload">Skicka</string> <string name="shared_string_upload">Skicka</string>
<string name="map_legend">Teckenförklaring</string> <string name="map_legend">Teckenförklaring</string>
<string name="shared_string_update">Uppdatera</string> <string name="shared_string_update">Uppdatering</string>
<string name="feedback">Återkoppling</string> <string name="feedback">Återkoppling</string>
<string name="read_more">Läs mer</string> <string name="read_more">Läs mer</string>
<string name="whats_new">Nyheter</string> <string name="whats_new">Nyheter</string>
@ -1728,7 +1748,7 @@ Long %2$s</string>
<string name="action_modify">Åtgärd ändra</string> <string name="action_modify">Åtgärd ändra</string>
<string name="action_delete">Åtgärd ta bort</string> <string name="action_delete">Åtgärd ta bort</string>
<string name="shared_string_near">Nära</string> <string name="shared_string_near">Nära</string>
<string name="shared_string_hide">Dölj</string> <string name="shared_string_hide">Göm</string>
<string name="av_video_quality_low">Lägsta kvalitet</string> <string name="av_video_quality_low">Lägsta kvalitet</string>
<string name="av_video_quality_high">Högsta kvalitet</string> <string name="av_video_quality_high">Högsta kvalitet</string>
<string name="av_video_quality">Videokvalitet</string> <string name="av_video_quality">Videokvalitet</string>
@ -1746,7 +1766,7 @@ Long %2$s</string>
<string name="route_distance">Avstånd:</string> <string name="route_distance">Avstånd:</string>
<string name="route_duration">Tid:</string> <string name="route_duration">Tid:</string>
<string name="missing_write_external_storage_permission">Appen har inte tillåtelse att använda SD-kortet</string> <string name="missing_write_external_storage_permission">Appen har inte tillåtelse att använda SD-kortet</string>
<string name="no_location_permission">Appen har inte tillräckliga behörigheter för att komma åt platsdata.</string> <string name="no_location_permission">Appen saknar behörigheter för att komma åt platsdata.</string>
<string name="no_camera_permission">Appen har inte tillräckliga behörigheter för att komma åt kameran.</string> <string name="no_camera_permission">Appen har inte tillräckliga behörigheter för att komma åt kameran.</string>
<string name="no_microphone_permission">Appen har inte tillräckliga behörigheter för att komma åt mikrofonen.</string> <string name="no_microphone_permission">Appen har inte tillräckliga behörigheter för att komma åt mikrofonen.</string>
<string name="select_voice_provider">Välj röstvägledning</string> <string name="select_voice_provider">Välj röstvägledning</string>
@ -1807,9 +1827,10 @@ Long %2$s</string>
<string name="shared_string_toolbar">Verktygsfält</string> <string name="shared_string_toolbar">Verktygsfält</string>
<string name="shared_string_widgets">Widgetar</string> <string name="shared_string_widgets">Widgetar</string>
<string name="download_files_error_not_enough_space">Inte tillräckligt med utrymme! <string name="download_files_error_not_enough_space">Inte tillräckligt med utrymme!
Detta skulle kräva {3} MB temporärt och {1} MB permanent. \n{3} MB temporärt och {1} MB permanent.
Tillgängligt utrymme är blott {2} MB.</string> \n(Bara {2} MB tillgängligt.)</string>
<string name="download_files_question_space_with_temp">Hämta {0} fil(er)? Nyttjat utrymme är {3} MB temporärt och {1} MB permanent. (Tillgängligt utrymme är {2} MB.)</string> <string name="download_files_question_space_with_temp">Hämta {0} fil(er)\?
\n{3} MB används temporärt och {1} MB permanent. (Av{2} MB.)</string>
<string name="upload_osm_note">Ladda upp OSM-anteckning</string> <string name="upload_osm_note">Ladda upp OSM-anteckning</string>
<string name="upload_anonymously">Ladda upp anonymt</string> <string name="upload_anonymously">Ladda upp anonymt</string>
<string name="select_map_marker">Välj kartmarkör</string> <string name="select_map_marker">Välj kartmarkör</string>
@ -1879,8 +1900,8 @@ Tillgängligt utrymme är blott {2} MB.</string>
<string name="storage_permission_restart_is_required">Nu har appen tillåtelse att skriva till extern lagringsplats. En manuell omstart av appen krävs.</string> <string name="storage_permission_restart_is_required">Nu har appen tillåtelse att skriva till extern lagringsplats. En manuell omstart av appen krävs.</string>
<string name="osm_live_support_region">Stödregion</string> <string name="osm_live_support_region">Stödregion</string>
<string name="osm_live_header">Denna prenumeration aktiverar uppdateringar varje timme av kartor runt omkring i världen. <string name="osm_live_header">Denna prenumeration aktiverar uppdateringar varje timme av kartor runt omkring i världen.
En del av inkomsterna går tillbaka till OSM-gemenskapen och betalas ut för varje OSM-bidrag. \nEn del av inkomsterna går tillbaka till OSM-gemenskapen och betalas ut för varje OSM-bidrag.
Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt sätt att göra det på.</string> \nOm du tycker om OsmAnd och OSM och vill stödja och stödjas av dem så är detta ett utmärkt sätt att göra det på.</string>
<string name="access_no_destination">Destinationen är inte fastställd</string> <string name="access_no_destination">Destinationen är inte fastställd</string>
<string name="map_widget_magnetic_bearing">Magnetisk bäring</string> <string name="map_widget_magnetic_bearing">Magnetisk bäring</string>
<string name="rec_split_clip_length">Klipplängd</string> <string name="rec_split_clip_length">Klipplängd</string>
@ -1936,11 +1957,11 @@ Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt s
<string name="delete_filter">Ta bort filter</string> <string name="delete_filter">Ta bort filter</string>
<string name="new_filter">Nytt filter</string> <string name="new_filter">Nytt filter</string>
<string name="new_filter_desc">Ange ett namn på det nya filtret. Det kommer att läggas till på fliken Kategorier.</string> <string name="new_filter_desc">Ange ett namn på det nya filtret. Det kommer att läggas till på fliken Kategorier.</string>
<string name="translit_name_if_miss">"Transkribera om %1$s namn saknas"</string> <string name="translit_name_if_miss">Transkribera om %1$s namn saknas</string>
<string name="skip_map_downloading">Hoppa över nerladdning av kartor</string> <string name="skip_map_downloading">Hoppa över nerladdning av kartor</string>
<string name="search_another_country">Välj en annan region</string> <string name="search_another_country">Välj en annan region</string>
<string name="osmand_plus_banner_desc">Obegränsade nedladdningar av kartor, uppdateringar och Wikipedia-plugin.</string> <string name="osmand_plus_banner_desc">Obegränsade nedladdningar av kartor, uppdateringar och Wikipedia-plugin.</string>
<string name="si_mi_meters">Mil/metrar</string> <string name="si_mi_meters">Miles/meter</string>
<string name="first_usage_wizard_desc">Låt OsmAnd avgöra din plats och föreslå kartor att hämta för den regionen.</string> <string name="first_usage_wizard_desc">Låt OsmAnd avgöra din plats och föreslå kartor att hämta för den regionen.</string>
<string name="location_not_found">Platsen hittades inte</string> <string name="location_not_found">Platsen hittades inte</string>
<string name="no_inet_connection">Ingen Internetanslutning</string> <string name="no_inet_connection">Ingen Internetanslutning</string>
@ -1960,7 +1981,7 @@ Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt s
<string name="donation_to_osm">Donation till OpenStreetMap-gemenskapen</string> <string name="donation_to_osm">Donation till OpenStreetMap-gemenskapen</string>
<string name="get_it">Skaffa det</string> <string name="get_it">Skaffa det</string>
<string name="get_for">Skaffa för %1$s</string> <string name="get_for">Skaffa för %1$s</string>
<string name="skip_map_downloading_desc">"Du har inte några offline-kartor installerade. Du kan välja en karta från listan eller hämta kartor senare via \'Meny - %1$s\'."</string> <string name="skip_map_downloading_desc">Du har inte några offline-kartor installerade. Du kan välja en karta från listan eller hämta kartor senare via \'Meny - %1$s\'.</string>
<string name="search_map">Söker efter kartor …</string> <string name="search_map">Söker efter kartor …</string>
<string name="first_usage_greeting">Erhåll vägbeskrivningar och upptäck nya platser utan Internetuppkoppling</string> <string name="first_usage_greeting">Erhåll vägbeskrivningar och upptäck nya platser utan Internetuppkoppling</string>
<string name="search_my_location">Sök efter min plats</string> <string name="search_my_location">Sök efter min plats</string>
@ -2047,7 +2068,7 @@ Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt s
<string name="navigate_point_olc_info_invalid">Ogiltig OLC <string name="navigate_point_olc_info_invalid">Ogiltig OLC
\n</string> \n</string>
<string name="navigate_point_olc_info_short">Kort OLC <string name="navigate_point_olc_info_short">Kort OLC
Vänligen tillhandahåll fullständig kod</string> \nVänligen tillhandahåll fullständig kod</string>
<string name="file_can_not_be_moved">Filen kan inte flyttas.</string> <string name="file_can_not_be_moved">Filen kan inte flyttas.</string>
<string name="shared_string_move">Flytta</string> <string name="shared_string_move">Flytta</string>
<string name="shared_string_gpx_tracks">Spår</string> <string name="shared_string_gpx_tracks">Spår</string>
@ -2055,7 +2076,7 @@ Vänligen tillhandahåll fullständig kod</string>
<string name="route_altitude">Rutthöjd</string> <string name="route_altitude">Rutthöjd</string>
<string name="altitude_descent">Sänkning</string> <string name="altitude_descent">Sänkning</string>
<string name="altitude_ascent">Stigning</string> <string name="altitude_ascent">Stigning</string>
<string name="average_altitude">Genomsnittshöjd</string> <string name="average_altitude">Genomsnittlig höjd</string>
<string name="shared_string_time">Tid</string> <string name="shared_string_time">Tid</string>
<string name="total_distance">Total sträcka</string> <string name="total_distance">Total sträcka</string>
<string name="shared_string_time_span">Tidsspann</string> <string name="shared_string_time_span">Tidsspann</string>
@ -2064,7 +2085,7 @@ Vänligen tillhandahåll fullständig kod</string>
<string name="shared_string_end_time">Sluttid</string> <string name="shared_string_end_time">Sluttid</string>
<string name="shared_string_color">Färg</string> <string name="shared_string_color">Färg</string>
<string name="select_gpx_folder">Välj mapp för GPX-filer</string> <string name="select_gpx_folder">Välj mapp för GPX-filer</string>
<string name="average_speed">Medelhastighet</string> <string name="average_speed">Genomsnittlig hastighet</string>
<string name="shared_string_time_moving">Tid i rörelse</string> <string name="shared_string_time_moving">Tid i rörelse</string>
<string name="max_speed">Högsta hastighet</string> <string name="max_speed">Högsta hastighet</string>
<string name="lang_sr_latn">Serbiska (latin)</string> <string name="lang_sr_latn">Serbiska (latin)</string>
@ -2090,10 +2111,9 @@ Vänligen tillhandahåll fullständig kod</string>
<string name="shared_string_action_name">Åtgärdsnamn</string> <string name="shared_string_action_name">Åtgärdsnamn</string>
<string name="quick_action_map_overlay_title">Kartöverlägg</string> <string name="quick_action_map_overlay_title">Kartöverlägg</string>
<string name="quick_action_map_overlay_action">Lägg till överlägg</string> <string name="quick_action_map_overlay_action">Lägg till överlägg</string>
<string name="quick_action_map_overlay_switch">"Kartöverlägget har ändrats till \"%s\"."</string> <string name="quick_action_map_overlay_switch">Kartöverlägget har ändrats till \"%s\".</string>
<string name="quick_action_btn_tutorial_descr">Tryck länge och dra knappen för att ändra dess position på skärmen.</string> <string name="quick_action_btn_tutorial_descr">Tryck länge och dra knappen för att ändra dess position på skärmen.</string>
<string name="routing_attr_height_obstacles_name">Använd höjddata</string> <string name="routing_attr_height_obstacles_name">Använd höjddata</string>
<string name="rendering_attr_depthContours_description">Visa djupkonturer och punkter.</string> <string name="rendering_attr_depthContours_description">Visa djupkonturer och punkter.</string>
<string name="shared_string_slope">Sluttning</string> <string name="shared_string_slope">Sluttning</string>
<string name="altitude_range">Höjdområde</string> <string name="altitude_range">Höjdområde</string>
@ -2421,7 +2441,9 @@ Vänligen tillhandahåll fullständig kod</string>
<string name="max_min">Max/Min</string> <string name="max_min">Max/Min</string>
<string name="min_max">Min/Max</string> <string name="min_max">Min/Max</string>
<string name="route_is_too_long_v2">Denna väg kan vara för lång tid att beräkna. Lägg till mellanliggande destinationer om inget resultat finns inom 10 minuter.</string> <string name="route_is_too_long_v2">Denna väg kan vara för lång tid att beräkna. Lägg till mellanliggande destinationer om inget resultat finns inom 10 minuter.</string>
<string name="osmand_extended_description_part1">"OsmAnd (OSM Automated Navigation Directions) är en kartnavigationsapp med tillgång till gratis, världsomfattande OpenStreetMap (OSM)-data av hög kvalitet. Njut av röstnavigation eller visuell navigation, visning av POI (points of interest - nyttoplatser), att skapa och hantera GPX-spår, visa höjdkurvor och höjdinfo (via plugin), val mellan bil-, cykel-, fotgängar-lägen, OSM-redigering och mycket mer."</string> <string name="osmand_extended_description_part1">OsmAnd (OSM Automated Navigation Directions) är en kartnavigationsapp med tillgång till gratis, världsomfattande OpenStreetMap (OSM)-data av hög kvalitet.
\n
\nNjut av röstnavigation eller visuell navigation, visning av POI (points of interest - nyttoplatser), att skapa och hantera GPX-spår, visa höjdkurvor och höjdinfo (via plugin), val mellan bil-, cykel-, fotgängar-lägen, OSM-redigering och mycket mer.</string>
<string name="osmand_extended_description_part2">GPS-navigering <string name="osmand_extended_description_part2">GPS-navigering
\n• Välj mellan offline- (inga roaming-avgifter när du är utomlands) eller online-läge a(snabbare) \n• Välj mellan offline- (inga roaming-avgifter när du är utomlands) eller online-läge a(snabbare)
\n• Steg-för-steg röstguidning leder dig längs vägen (inspelade och genererade röster) \n• Steg-för-steg röstguidning leder dig längs vägen (inspelade och genererade röster)
@ -2443,8 +2465,14 @@ Vänligen tillhandahåll fullständig kod</string>
\n • Låter dig välja hur du vill visa namn på kartan: på svenska, lokala, eller fonetisk stavning \n • Låter dig välja hur du vill visa namn på kartan: på svenska, lokala, eller fonetisk stavning
\n • Visar specialiserade online-rutor, satellitvy (från Bing), olika överlägg som tour/navigering GPX-spår och ytterligare lager med anpassningsbar transparens \n • Visar specialiserade online-rutor, satellitvy (från Bing), olika överlägg som tour/navigering GPX-spår och ytterligare lager med anpassningsbar transparens
\n</string> \n</string>
<string name="osmand_extended_description_part4">Skidåkning OsmAnd skidkartor plugin gör att du kan se skidspår svårighetsgrad och en del kompletterande information, som plats för liftar och andra faciliteter.</string> <string name="osmand_extended_description_part4">Skidåkning
<string name="osmand_extended_description_part5">Cykling • Du kan hitta cykelstigar på kartan • GPS-navigering i cykelläge skapar din rutt med hjälp av cykelvägar • Du kan se din hastighet och höjd • Med GPX-inspelningsalternativet kan du spela in din resa och dela den • Via ytterligare plugin kan du aktivera visning av höjdkurvor och höjdrelief</string> \nOsmAnd skidkartor plugin gör att du kan se skidspår svårighetsgrad och en del kompletterande information, som plats för liftar och andra faciliteter.</string>
<string name="osmand_extended_description_part5">Cykling
\n• Hitta cykelvägar på kartan
\n• GPS-navigering i cykelläge bygger din rutt med cykelvägar
\n• Se din hastighet och höjd
\n• Med GPX-inspelningsalternativ kan du spela in din resa och dela den
\n• Via ett extra plugin kan du aktivera konturlinjer och backskuggning</string>
<string name="osmand_extended_description_part6">Promenader, vandring, stadsrundtur <string name="osmand_extended_description_part6">Promenader, vandring, stadsrundtur
\n • Kartan visar promenad- och vandringsleder \n • Kartan visar promenad- och vandringsleder
\n • Wikipedia på ditt föredragna språk kan berätta en hel del under en stadsrundtur \n • Wikipedia på ditt föredragna språk kan berätta en hel del under en stadsrundtur
@ -2459,23 +2487,58 @@ Vänligen tillhandahåll fullständig kod</string>
\n</string> \n</string>
<string name="clear_all_intermediates">Rensa alla mellanliggande punkter</string> <string name="clear_all_intermediates">Rensa alla mellanliggande punkter</string>
<string name="rendering_attr_whiteWaterSports_name">Strömsporter</string> <string name="rendering_attr_whiteWaterSports_name">Strömsporter</string>
<string name="osmand_extended_description_part8">OsmAnd är open-source och är utvecklas aktivt. Alla kan bidra till appen genom att rapportera buggar, förbättra översättningar eller programmera nya funktioner. Projektet är i ett dynamiskt tillstånd av kontinuerlig förbättring av alla dessa former genom utvecklare och interaktion med användare. Projektet är också beroende av ekonomiska bidrag för att finansiera kodning och testning av nya funktioner. Ungefärlig karttäckning och kvalitet: • Västeuropa: **** • Östeuropa: *** • Ryssland: *** • Nordamerika: *** • Sydamerika: ** • Asien: ** • Japan &amp; Korea: *** • Mellanöstern: ** • Afrika: ** • Antarktis: * De flesta länder runt om i världen finns tillgängliga för hämtning! Få en tillförlitlig navigator i ditt land - det kan vara Tyskland, Frankrike, Mexiko, Storbritannien, Spanien, Nederländerna, USA, Ryssland, Brasilien eller något annat.</string> <string name="osmand_extended_description_part8">OsmAnd är aktivt utvecklad programvara med öppen källkod. Alla kan bidra till appen genom att rapportera fel, förbättra översättningar eller koda nya funktioner. Dessutom bygger projektet på ekonomiska bidrag för att finansiera kodning och testning av nya funktioner.
<string name="osmand_plus_long_description_1000_chars">OsmAnd+ (OSM Automated Navigation Directions) \nUngefärlig karttäckning och kvalitet:
\n• Västeuropa: ****
\n• Östeuropa: ***
\n• Ryssland: ***
\n• Nordamerika: ***
\n• Sydamerika: **
\n• Asien: **
\n• Japan och Korea: ***
\n• Mellanöstern: **
\n• Afrika: **
\n• Antarktis: *
\nDe flesta länder runt om i världen är tillgängliga för nedladdning!
\nFå en pålitlig navigatör i ditt land - vare sig det är Frankrike, Tyskland, Mexiko, Storbritannien, Spanien, Nederländerna, USA, Ryssland, Brasilien eller något annat.</string>
<string name="osmand_plus_long_description_1000_chars">OsmAnd + (OSM Automated Navigation Directions)
\n \n
\nOsmAnd+ är ett open source-navigationsapp med tillgång till ett brett utbud av global OpenStreetMap(OSM)-data. Alla kartdata (vektor- eller rasterkartor) kan sparas på telefonens minneskort för användning offline. OsmAnd erbjuder även offline och online-ruttunktioner, inklusive turn-by-turn röstguidning. \nOsmAnd + är en programvara för programvara med öppen källkod för navigering med tillgång till ett stort antal globala OSM-data. Alla kartdata (vektor- eller brickor) kan lagras på telefonens minneskort för offline-användning. Offline- och online-dirigeringsfunktioner erbjuds också, inklusive röstvägledning för sväng.
\n \n
\nOsmAnd+ är den betalversionenen av appeb, genom att köpa det stödjer du projektet, finansierar utveckling av nya funktioner, och får de senaste uppdateringarna. \nOsmAnd + är den betalda appversionen, genom att köpa den stöder du projektet, finansierar utvecklingen av nya funktioner och får de senaste uppdateringarna.
\n \n
\nNågra av de centrala funktionerna: - Komplett offline-funktionalitet (spara vektor- eller rasterkartor i enhetens lagring) - Kompakta offline vektorkartor för hela världen finns tillgängliga - Obegränsad hämtning av land- eller regionkartor direkt från appen - Offline Wikipedia-artiklar (hämta Wikipedia-POI), utmärkt för sightseeing \nNågra av kärnfunktionerna:
\n- Komplett offline-funktionalitet (lagra nedladdad vektor eller kakelkartor i enhetens lagring)
\n- Kompakta offlinevektorkartor för hela världen
\n- Obegränsad nedladdning av land- eller regionkartor direkt från appen
\n- Offline Wikipedia-funktion (ladda ner Wikipedia POI), perfekt för sightseeing
\n- Överlagring av flera kartlager möjliga, som GPX eller navigationsspår, intressanta platser, favoriter, konturlinjer, kollektivtrafikstopp, ytterligare kartor med anpassningsbar transparens
\n \n
\n - Överlagring av flera kartskikt är möjligt, som GPX eller navigeringsspår, Punkter av Intresse, favoriter, höjdkurvor, hållplatser för kollektivtrafiken, fler kartor med anpassningsbar genomskinlighet- Offlinesökning efter adresser och intressepunkter (POI) - Offline routing för mediumdistansavstånd - Bil-, cykel- och fotgängarelägen med: - tillval automatiskt byte av dag/nattläge - \n- Offline sökning efter adresser och platser (POI)
\n \n- Offline-dirigering för medelstora avstånd
\n - Valfri hastighetsbunden kartzoom - valfri kartjustering enligt kompass eller riktning - som tillval körfältsguide, hastighetsgräns visas, inspelade- och TTS-röster</string> \n- Lägen för bil, cykel och fotgängare med tillval:
\n- Automatisk växling mellan dag och natt
\n- Hastighetsberoende kartzoomning
\n- Kartinriktning enligt kompass eller rörelseriktning
\n- Fältvägledning, hastighetsgränsvisning, inspelade och text-till-tal-röster
\n</string>
<string name="nothing_found_in_radius">Kunde inte hitta något inom:</string> <string name="nothing_found_in_radius">Kunde inte hitta något inom:</string>
<string name="select_waypoints_category_description">Lägg till alla spårens vägpunkter, eller välj separata kategorier.</string> <string name="select_waypoints_category_description">Lägg till alla spårens vägpunkter, eller välj separata kategorier.</string>
<string name="shared_string_total">Totalt</string> <string name="shared_string_total">Totalt</string>
<string name="osmand_plus_extended_description_part1">OsmAnd+ (OSM Automated Navigation Directions) är en kartnavigationsapp med tillgång till gratis världsomfattande och högkvalitativa OpenStreetMap (OSM)-data. Njut av röst- och visuell navigation, visning av POI (points of interest - intressepunkter), att skapa och hantera GPX-spår, se höjdkurvor och höjdinfo, välja mellan bil-cykel- och fotgängarlägen, OSM-redigering och mycket mer. OsmAnd+ är en betalversion av appen. Genom att köpa den, stödjer du projektet, finansierar utveckling av nya funktioner, och får de senaste uppdateringarna. Några av de viktigaste funktionerna:</string> <string name="osmand_plus_extended_description_part1">OsmAnd+ (OSM Automated Navigation Directions) är en kartnavigationsapp med tillgång till gratis världsomfattande och högkvalitativa OSM-data.
<string name="osmand_plus_extended_description_part2">Navigering • Fungerar på nätet (snabb) eller offline (inga roaming-avgifter när du är utomlands) • Sväng-för-sväng-röstguidning (inspelade och syntetiska röster) • Valfri körfältsguide, gatunamn visas, och beräknad ankomsttid • Stödjer mellanliggande punkter på din resplan • Automatisk omdirigering när du avviker från rutten • Sök platser efter adress eller typ (t ex: restaurang, hotell, bensinstation, museum), eller med geografiska koordinater</string> \nNjut av röst- och visuell navigation, visning av POI (points of interest - intressepunkter), att skapa och hantera GPX-spår, se höjdkurvor och höjdinfo, välja mellan bil-cykel- och fotgängarlägen, OSM-redigering och mycket mer.
\n
\nOsmAnd+ är en betalversion av appen. Genom att köpa den, stödjer du projektet, finansierar utveckling av nya funktioner, och får de senaste uppdateringarna.
\n
\nNågra av de viktigaste funktionerna:</string>
<string name="osmand_plus_extended_description_part2">Navigering
\n• Fungerar online (snabbt) eller offline (inga roamingavgifter när du är utomlands)
\n• Röstvägledning för sväng (inspelade och syntetiserade röster)
\n• Valfri körvägledning, visning av gatunamn och beräknad ankomsttid
\n• Stöder mellanliggande poäng på din resplan
\n• Automatisk omdirigering när du avviker från rutten
\n• Sök efter platser efter adress, efter typ (t.ex. restaurang, hotell, bensinstation, museum) eller efter geografiska koordinater
\n</string>
<string name="osmand_plus_extended_description_part3">Kartvisning <string name="osmand_plus_extended_description_part3">Kartvisning
\n • Visa din position och orientering \n • Visa din position och orientering
\n • Eventuellt justera bilden i förhållande till kompass eller din riktning \n • Eventuellt justera bilden i förhållande till kompass eller din riktning
@ -2491,8 +2554,7 @@ Vänligen tillhandahåll fullständig kod</string>
<string name="save_poi_too_many_uppercase">Namnet innehåller för många versaler. Vill du fortsätta?</string> <string name="save_poi_too_many_uppercase">Namnet innehåller för många versaler. Vill du fortsätta?</string>
<string name="quick_action_add_gpx_descr">Knackning på åtgärdsknappen kommer att lägga till en GPX-punkt vid skärmens mitt.</string> <string name="quick_action_add_gpx_descr">Knackning på åtgärdsknappen kommer att lägga till en GPX-punkt vid skärmens mitt.</string>
<string name="quick_action_take_audio_note_descr">Knackning på åtgärdsknappen kommer att lägga en ljudanteckning vid skärmens mitt.</string> <string name="quick_action_take_audio_note_descr">Knackning på åtgärdsknappen kommer att lägga en ljudanteckning vid skärmens mitt.</string>
<string name="quick_action_take_video_note_descr">Att trycka på denna åtgärdsknapp lägger <string name="quick_action_take_video_note_descr">Att trycka på denna åtgärdsknapp lägger till en videoanteckning mitt på skärmen.</string>
\ntill en videoanteckning mitt på skärmen.</string>
<string name="quick_action_take_photo_note_descr">Knackning på åtgärdsknappen kommer att lägga till en fotoanteckning vid skärmens mitt.</string> <string name="quick_action_take_photo_note_descr">Knackning på åtgärdsknappen kommer att lägga till en fotoanteckning vid skärmens mitt.</string>
<string name="quick_action_add_osm_bug_descr">Knackning på åtgärdsknappen kommer att lägga till en OSM-anteckning vid skärmens mitt.</string> <string name="quick_action_add_osm_bug_descr">Knackning på åtgärdsknappen kommer att lägga till en OSM-anteckning vid skärmens mitt.</string>
<string name="quick_action_add_poi_descr">Knackning på åtgärdsknappen kommer att lägga till en Intressepunkt vid skärmens mitt.</string> <string name="quick_action_add_poi_descr">Knackning på åtgärdsknappen kommer att lägga till en Intressepunkt vid skärmens mitt.</string>
@ -2601,7 +2663,13 @@ Vänligen tillhandahåll fullständig kod</string>
\n• Valfri hastighetsbaserad zoomning \n• Valfri hastighetsbaserad zoomning
\n• Dela din position så att dina vänner kan hitta dig \n• Dela din position så att dina vänner kan hitta dig
\n</string> \n</string>
<string name="osmand_plus_extended_description_part6">Funktioner för cykel och gående • Se vägar för gående och cyklande samt vandringsstigar, utmärkta för utomhusaktiviteter • Speciella ruttval och visningsläge för cykel och gående • Valfria kollektivtrafiksplatser (buss, spårvagn, tåg) inklusive linjenamn • Valfri reseinspelning till lokal GPX-fil eller onlinetjänst • Valfri visning av hastighet och höjd • Visa konturlinjer och höjdreliefer (via separat plugin)</string> <string name="osmand_plus_extended_description_part6">Funktioner för cykel och gående
\n• Se vägar för gående och cyklande samt vandringsstigar, utmärkta för utomhusaktiviteter
\n• Speciella ruttval och visningsläge för cykel och gående
\n• Valfria kollektivtrafiksplatser (buss, spårvagn, tåg) inklusive linjenamn
\n• Valfri reseinspelning till lokal GPX-fil eller onlinetjänst
\n• Valfri visning av hastighet och höjd
\n• Visa konturlinjer och höjdreliefer (via separat plugin)</string>
<string name="osmand_plus_extended_description_part7">Bidra direkt till OSM <string name="osmand_plus_extended_description_part7">Bidra direkt till OSM
\n• Rapportera databuggar \n• Rapportera databuggar
\n• Ladda upp GPX-spår till OSM direkt från appen \n• Ladda upp GPX-spår till OSM direkt från appen
@ -2882,7 +2950,7 @@ Vänligen tillhandahåll fullständig kod</string>
<string name="route_parameters_descr">Konfigurera ruttparametrar</string> <string name="route_parameters_descr">Konfigurera ruttparametrar</string>
<string name="route_parameters">Ruttparametrar</string> <string name="route_parameters">Ruttparametrar</string>
<string name="application_profile_changed">Appprofil ändrat till \"%s\"</string> <string name="application_profile_changed">Appprofil ändrat till \"%s\"</string>
<string name="logcat_buffer">Logcat-buffert</string> <string name="logcat_buffer">Logcat buffer</string>
<string name="plugins_settings">Tilläggsinställningar</string> <string name="plugins_settings">Tilläggsinställningar</string>
<string name="app_mode_utv">Sida vid sida</string> <string name="app_mode_utv">Sida vid sida</string>
<string name="files_copied">%1$d filer kopierades (%2$s).</string> <string name="files_copied">%1$d filer kopierades (%2$s).</string>
@ -3069,5 +3137,208 @@ Vänligen tillhandahåll fullständig kod</string>
<string name="routing_attr_avoid_footways_name">Undvik resor till</string> <string name="routing_attr_avoid_footways_name">Undvik resor till</string>
<string name="search_download_wikipedia_maps">Ladda ner Wikipedia kartor</string> <string name="search_download_wikipedia_maps">Ladda ner Wikipedia kartor</string>
<string name="plugin_wikipedia_description">Få information om sevärdheter från Wikipedia, en inbunden samling av offline artiklar om ställen och destinationer.</string> <string name="plugin_wikipedia_description">Få information om sevärdheter från Wikipedia, en inbunden samling av offline artiklar om ställen och destinationer.</string>
<string name="track_show_start_finish_icons"></string> <string name="track_show_start_finish_icons">Visa start och mål-ikoner</string>
<string name="logcat_buffer_descr">Kontrollera och dela detaljerade loggar för appen</string>
<string name="osm_edit_closed_note">Stängd OSM not</string>
<string name="set_working_days_to_continue">Ställ in arbetsdagar för att fortsätta</string>
<string name="route_between_points">Rutt mellan punkter</string>
<string name="plan_a_route">Planera en rutt</string>
<string name="add_to_a_track">Lägg till i ett spår</string>
<string name="gpx_split_interval_descr">Välj intervall med vilket markeringar med avstånd eller tid på spåret ska visas.</string>
<string name="gpx_split_interval_none_descr">Välj önskat delningsalternativ: efter tid eller efter avstånd.</string>
<string name="track_coloring_solid">Fast</string>
<string name="plan_route_import_track">Importera spår</string>
<string name="plan_route_open_existing_track">Öppna befintligt spår</string>
<string name="plan_route_create_new_route">Skapa ny rutt</string>
<string name="plan_route_select_track_file_for_open">Välj en spårfil att öppna.</string>
<string name="overwrite_track">Skriv över spår</string>
<string name="save_as_new_track">Spara som nytt spår</string>
<string name="reverse_route">Omvänd rutt</string>
<string name="route_between_points_whole_track_button_desc">Hela spåret beräknas om med den valda profilen.</string>
<string name="route_between_points_next_segment_button_desc">Endast nästa segment beräknas om med den valda profilen.</string>
<string name="route_between_points_desc">Välj hur du ska ansluta punkterna, med en rak linje, eller beräkna en rutt mellan dem enligt nedan.</string>
<string name="whole_track">Hela spåret</string>
<string name="route_between_points_warning_desc">Klicka sedan på ditt spår till närmaste tillåtna väg med en av dina navigationsprofiler för att använda detta alternativ.</string>
<string name="threshold_distance">Tröskelavstånd</string>
<string name="route_between_points_add_track_desc">Välj en spårfil som du vill lägga till det nya segmentet till.</string>
<string name="in_case_of_reverse_direction">Vid omvänd riktning</string>
<string name="shared_string_save_as_gpx">Spara som ny spårfil</string>
<string name="add_segment_to_the_track">Lägg till en spårfil</string>
<string name="shared_string_gpx_files">Spår</string>
<string name="layer_gpx_layer">Spår</string>
<string name="show_gpx">Spår</string>
<string name="save_track_to_gpx_globally">Logga spår till GPX-fil</string>
<string name="shared_string_gpx_route">Spårrutt</string>
<string name="empty_state_my_tracks">Lägg till spårfil</string>
<string name="context_menu_item_add_waypoint">Lägg till spår waypoint</string>
<string name="quick_action_add_gpx">Lägg till spår waypoint</string>
<string name="marker_save_as_track">Spara som spårfil</string>
<string name="follow_track_descr">Välj spårfil att följa</string>
<string name="import_track_descr">Välj spårfil att följa eller importera spåret från din enhet.</string>
<string name="navigate_to_track_descr">Navigera från min position till spåret</string>
<string name="pass_whole_track_descr">Punkt på spåret för att navigera</string>
<string name="attach_to_the_roads">Fäst på vägarna</string>
<string name="disable_recording_once_app_killed_descrp">Spårloggning pausar när appen dödas (via senaste appar). (OsmAnd-bakgrundsindikationen försvinner från Android-meddelandefältet.)</string>
<string name="save_global_track_interval_descr">Ange loggningsintervallet för den allmänna spårinspelningen (aktiverad via widgeten \'Trip recording\' på kartan).</string>
<string name="release_3_8">• Uppdaterad Planera en ruttfunktion: gör det möjligt att använda olika navigeringstyper per segment och inkludera spår
\n
\n • Ny utseendemeny för spår: välj färg, tjocklek, visningspilar, start- och målikoner
\n
\n • Förbättrad synlighet för cykelnoder.
\n
\n • Spår kan nu tappas, har snabbmeny med grundläggande information.
\n
\n • Förbättrade sökalgoritmer
\n
\n • Förbättrade alternativ för följespår i Navigation
\n
\n • Fixade problem med import / export av profilinställningar
\n
\n</string>
<string name="contour_lines_thanks">Tack för att du köpte \"Konturlinjer\"</string>
<string name="osm_live_payment_subscription_management_hw">Ditt AppGallery-konto debiteras vid köpbekräftelsen.
\n
\nAbonnemanget förlängs automatiskt såvida det inte sägs upp före förnyelsedatumet. Ditt konto debiteras för förnyelseperioden (månad / tre månader / år) endast på förnyelsedatumet.
\n
\nDu kan hantera och avbryta dina prenumerationer i dina AppGallery-inställningar.</string>
<string name="use_native_pt">Inbyggd kollektivtrafikutveckling</string>
<string name="use_native_pt_desc">Byt till Java (säker) ruttberäkning för kollektivtrafik</string>
<string name="osm_edits_view_descr">Visa alla dina ändringar som ännu inte har laddats upp eller OSM-buggar i %1$s. Redan uppladdade ändringar visas inte längre.</string>
<string name="open_street_map_login_mode">Du måste logga in för att ladda upp nya eller modifierade ändringar.
\n
\nDu kan logga in med den säkra OAuth-metoden eller använda ditt användarnamn och lösenord.</string>
<string name="gpx_upload_public_visibility_descr">\"Offentligt\" betyder att spårningen visas offentligt i dina GPS-spår, i offentliga GPS-spårningar och i den offentliga spårningslistan med tidsstämplar i råform. Data som visas via API hänvisar inte till din spårningssida. Tracepoint-tidsstämplar är inte tillgängliga via det offentliga GPS-API:et och spårpunkter är inte kronologiskt ordnade.</string>
<string name="add_online_routing_engine">Lägg till online-dirigeringsmotorn</string>
<string name="edit_online_routing_engine">Redigera online-dirigeringsmotorn</string>
<string name="shared_string_subtype">Subtyp</string>
<string name="shared_string_vehicle">Fordon</string>
<string name="shared_string_api_key">API-nyckel</string>
<string name="shared_string_server_url">Sever URL</string>
<string name="shared_string_enter_param">Ange param</string>
<string name="keep_it_empty_if_not">Behåll tom om inte</string>
<string name="online_routing_example_hint">URL med alla parametrar kommer att se ut så här:</string>
<string name="test_route_calculation">Testa ruttberäkning</string>
<string name="routing_engine_vehicle_type_driving">Körning</string>
<string name="routing_engine_vehicle_type_foot">Fot</string>
<string name="routing_engine_vehicle_type_bike">Cykel</string>
<string name="routing_engine_vehicle_type_car">Bil</string>
<string name="copy_address">Kopiera adress</string>
<string name="online_routing_engine">Online-routningsmotor</string>
<string name="online_routing_engines">Online-routningsmotorer</string>
<string name="shared_string_folders">Mappar</string>
<string name="select_folder">Välj mapp</string>
<string name="select_folder_descr">Välj mapp eller lägg till en ny</string>
<string name="shared_string_empty">Tom</string>
<string name="analyze_by_intervals">Analysera delad intervall</string>
<string name="upload_to_openstreetmap">Ladda upp till OpenStreetMap</string>
<string name="edit_track">Redigera spår</string>
<string name="rename_track">Byt namn på spår</string>
<string name="change_folder">Byt mapp</string>
<string name="shared_string_sec">sek</string>
<string name="announcement_time_passing">Passerar</string>
<string name="announcement_time_approach">Närma sig</string>
<string name="announcement_time_prepare_long">Långt förberedan</string>
<string name="announcement_time_prepare">Förbereda</string>
<string name="announcement_time_off_route">Av rutten</string>
<string name="announcement_time_arrive">Anländer till destinationen</string>
<string name="shared_string_turn">Sväng</string>
<string name="announcement_time_intervals">Tid- och avstånds-intervaller</string>
<string name="announcement_time_descr">Meddelandetid för olika röstmeddelanden beror på typ, aktuell navigationshastighet och standardnavigeringshastighet.</string>
<string name="announcement_time_title">Meddelandetid</string>
<string name="start_recording">Starta inspelning</string>
<string name="show_track_on_map">Visa spår på kartan</string>
<string name="routing_engine_vehicle_type_wheelchair">Rullstol</string>
<string name="routing_engine_vehicle_type_hiking">Vandring</string>
<string name="routing_engine_vehicle_type_walking">Gång</string>
<string name="routing_engine_vehicle_type_cycling_electric">Elektrisk cykling</string>
<string name="routing_engine_vehicle_type_cycling_mountain">Bergscykling</string>
<string name="routing_engine_vehicle_type_cycling_road">Vägcyckling</string>
<string name="routing_engine_vehicle_type_cycling_regular">Vanlig cyckling</string>
<string name="routing_engine_vehicle_type_hgv">Lastbil</string>
<string name="routing_engine_vehicle_type_small_truck">Liten lastbil</string>
<string name="routing_engine_vehicle_type_truck">Lastbil</string>
<string name="routing_engine_vehicle_type_scooter">Skoter</string>
<string name="routing_engine_vehicle_type_racingbike">Racercykel</string>
<string name="routing_engine_vehicle_type_mtb">MTB</string>
<string name="message_server_error">Serverfel: %1$s</string>
<string name="message_name_is_already_exists">Namnet finns redan</string>
<string name="delete_online_routing_engine">Ta bort den här online-dirigeringsmodulen\?</string>
<string name="context_menu_read_full">Läs allt</string>
<string name="context_menu_edit_descr">Redigera beskrivning</string>
<string name="delete_waypoints">Ta bort waypoints</string>
<string name="copy_to_map_markers">Kopiera till kartmarkeringar</string>
<string name="copy_to_map_favorites">Kopiera till favoriter</string>
<string name="upload_photo">Uppladdning</string>
<string name="upload_photo_completed">Uppladdning klar</string>
<string name="uploading_count">Laddar upp %1$d av %2$d</string>
<string name="select_segments">Välj segment</string>
<string name="select_segments_description">%1$s innehåller mer än ett segment, du måste välja önskad del för navigering.</string>
<string name="segments_count">Segment %1$d</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews är ett community-drivet projekt om offentliga platser som restauranger, hotell, museer, och waypoints. Det samlar all offentlig information om dem så som foton, recensioner, länkar till andra systemlänkar OpenStreetMap, Wikipedia.
\n
\nAll OpenPlaceReview-data är öppen och tillgänglig för alla: http://openplacereviews.org/data.
\n
\nDu kan läsa mer på: http://openplacereviews.org</string>
<string name="uploaded_count">Uppladdat %1$d av %2$d</string>
<string name="toast_select_edits_for_upload">Välj redigeringar för uppladdning</string>
<string name="hillshade_slope_contour_lines">Berg relief/ sluttning / konturlinjer</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="opr_use_dev_url">Använd test.openplacereviews.org</string>
<string name="login_open_place_reviews">Logga in på OpenPlaCereViews</string>
<string name="activity_type_water_name">Vatten</string>
<string name="activity_type_winter_name">Vinter</string>
<string name="activity_type_snowmobile_name">Snöskoter</string>
<string name="activity_type_riding_name">Ridning</string>
<string name="activity_type_racing_name">Racing</string>
<string name="activity_type_mountainbike_name">Mountainbike</string>
<string name="activity_type_cycling_name">Cyckling</string>
<string name="activity_type_hiking_name">Vandring</string>
<string name="activity_type_running_name">Löpning</string>
<string name="activity_type_walking_name">Gående</string>
<string name="activity_type_offroad_name">Offroad</string>
<string name="activity_type_motorbike_name">Motorcyckel</string>
<string name="activity_type_car_name">Bil</string>
<string name="temporary_conditional_routing_descr">Använd vägbegränsningar som är aktiva nu på kartan</string>
<string name="routing_attr_short_way_description">Optimerad kortare rutt (energibesparing)</string>
<string name="routing_attr_driving_style_description">Välj körsyfte för att få kortare, snabbare eller säkrare rutt</string>
<string name="snap_to_road_descr">Ikonen för aktuell plats snappas till den aktuella navigeringsvägen</string>
<string name="map_orientation_threshold_descr">Rotera inte kartvyn om hastigheten är mindre än en tröskelvärde</string>
<string name="restart">Omstart</string>
<string name="shared_strings_all_regions">Alla regioner</string>
<string name="delete_number_files_question">Ta bort %1$d filer\?</string>
<string name="track_recording_stop_without_saving">Stoppa utan att spara</string>
<string name="track_recording_save_and_stop">Spara och stoppa inspelningen</string>
<string name="track_recording_title">Spårinspelningen stoppades</string>
<string name="track_recording_description">Är du säker på att du vill stoppa inspelningen\?
\nAll osparad data kommer att gå förlorad.</string>
<string name="on_pause">Pausad</string>
<string name="app_restart_required">Omstart av program krävs för att tillämpa vissa inställningar.</string>
<string name="routing_attr_height_obstacles_description">Ruttning kan undvika branta sluttningar.</string>
<string name="quick_action_coordinates_widget_descr">En toggel för att visa eller dölja koordinatwidgeten på kartan.</string>
<string name="map_widget_distance_by_tap">Avståndsmätning genom att trycka</string>
<string name="latest_openstreetmap_update">Senaste tillgängliga OpenStreetMap-uppdateringen:</string>
<string name="updated">Uppdaterad: %s</string>
<string name="last_time_checked">Senast kontrollerad: %s</string>
<string name="update_frequency">Uppdateringsfrekvens</string>
<string name="live_update_frequency_week_variant">Kartuppdateringar kommer att kontrolleras varje vecka. Nästa gång %1$s i %2$s.</string>
<string name="live_update_frequency_day_variant">Kartuppdateringar kommer att kontrolleras varje dag. Nästa gång %1$s i %2$s.</string>
<string name="live_update_frequency_hour_variant">Kartuppdateringar kontrolleras varje timme. Nästa gång %1$s i %2$s.</string>
<string name="delete_updates">Ta bort uppdateringar</string>
<string name="live_update_delete_updates_msg">Är du säker på att du vill ta bort alla %s liveuppdateringar\?</string>
<string name="purchases">Inköp</string>
<string name="select_category_descr">Välj en kategori eller skapa en ny</string>
<string name="track_recording_will_be_continued">Inspelningen kommer fortsätta.</string>
<string name="copy_poi_name">Kopiera POI namn</string>
<string name="quick_action_show_hide_title">Visa/Göm</string>
<string name="shared_string_interval">Intervall</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">Dölj naturreservat, skyddade områden och nationalparkgränser</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">Naturgränser</string>
<string name="track_has_no_altitude">Spåret innehåller inte höjddata.</string>
<string name="track_has_no_speed">Spåret innehåller inte hastighetsdata.</string>
<string name="select_another_colorization">Välj en annan typ av färgning.</string>
<string name="save_heading_descr">Spara riktning till varje spårningspunkt under inspelning.</string>
<string name="app_mode_go_cart">Go-cart</string>
<string name="trip_recording_logging_interval_info">Loggningsintervall ställde in den tidsperiod under vilken OsmAnd kommer att be om aktuell positionspositionsdata.</string>
<string name="trip_recording_save_and_continue">Spara och fortsätt</string>
<string name="lost_data_warning">All osparad data kommer att försvinna.</string>
</resources> </resources>

View file

@ -4044,4 +4044,7 @@
<string name="select_another_colorization">Виберіть інший тип забарвлення.</string> <string name="select_another_colorization">Виберіть інший тип забарвлення.</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">Сховати природні заповідники, заповідні території та межі національних парків</string> <string name="rendering_attr_noNatureReserveBoundaries_description">Сховати природні заповідники, заповідні території та межі національних парків</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">Межі природи</string> <string name="rendering_attr_noNatureReserveBoundaries_name">Межі природи</string>
<string name="trip_recording_logging_interval_info">Інтервал журналювання встановлює проміжок часу, впродовж якого OsmAnd запитуватиме дані про поточне розташування.</string>
<string name="trip_recording_save_and_continue">Зберегти й продовжити</string>
<string name="lost_data_warning">Усі незбережені дані буде втрачено.</string>
</resources> </resources>

View file

@ -769,4 +769,6 @@
<string name="poi_charging_station">充电站</string> <string name="poi_charging_station">充电站</string>
<string name="poi_takeaway_no">无外卖</string> <string name="poi_takeaway_no">无外卖</string>
<string name="poi_takeaway_only">仅限外卖</string> <string name="poi_takeaway_only">仅限外卖</string>
<string name="poi_pharmacy_dispensing">配药</string>
<string name="poi_automated">自动化</string>
</resources> </resources>

View file

@ -149,8 +149,8 @@
<string name="offline_edition">离线编辑</string> <string name="offline_edition">离线编辑</string>
<string name="offline_edition_descr">始终使用离线编辑。</string> <string name="offline_edition_descr">始终使用离线编辑。</string>
<string name="local_openstreetmap_uploading">正在上传…</string> <string name="local_openstreetmap_uploading">正在上传…</string>
<string name="local_openstreetmap_upload">上传修改OSM</string> <string name="local_openstreetmap_upload">上传编辑到 OSM</string>
<string name="local_openstreetmap_delete">删除修改</string> <string name="local_openstreetmap_delete">删除编辑</string>
<string name="local_openstreetmap_uploadall">所有上传</string> <string name="local_openstreetmap_uploadall">所有上传</string>
<string name="free_version_title">免费版</string> <string name="free_version_title">免费版</string>
<string name="index_name_north_america">北美</string> <string name="index_name_north_america">北美</string>
@ -166,8 +166,8 @@
<string name="index_name_oceania">大洋洲</string> <string name="index_name_oceania">大洋洲</string>
<string name="index_name_other">全球和专题地图</string> <string name="index_name_other">全球和专题地图</string>
<string name="index_name_wiki">全球维基百科的POI</string> <string name="index_name_wiki">全球维基百科的POI</string>
<string name="index_name_voice">语音包(录制,功能有限)</string> <string name="index_name_voice">语音提示(录音,功能有限)</string>
<string name="index_name_tts_voice">语音TTS合成优先选用</string> <string name="index_name_tts_voice">语音提示TTS首选</string>
<string name="amenity_type_osmwiki">维基百科(离线)</string> <string name="amenity_type_osmwiki">维基百科(离线)</string>
<string name="amenity_type_user_defined">用户自定义</string> <string name="amenity_type_user_defined">用户自定义</string>
<string name="settings_preset">用户配置文件</string> <string name="settings_preset">用户配置文件</string>
@ -186,7 +186,7 @@
<string name="city_type_city">城市</string> <string name="city_type_city">城市</string>
<string name="button_upgrade_osmandplus">升级OsmAnd+</string> <string name="button_upgrade_osmandplus">升级OsmAnd+</string>
<string name="shared_string_rename">重命名</string> <string name="shared_string_rename">重命名</string>
<string name="local_index_upload_gpx_description">上传GPX文件OSM社区。它们将被用于改善地图。</string> <string name="local_index_upload_gpx_description">将 GPX 文件上传到 OSM 社区,改进地图。</string>
<string name="local_index_mi_upload_gpx">发送到OSM</string> <string name="local_index_mi_upload_gpx">发送到OSM</string>
<string name="favorite_home_category"></string> <string name="favorite_home_category"></string>
<string name="favorite_friends_category">朋友</string> <string name="favorite_friends_category">朋友</string>
@ -195,11 +195,11 @@
<string name="favourites_edit_dialog_category">类别</string> <string name="favourites_edit_dialog_category">类别</string>
<string name="shared_string_no_thanks">谢谢,不用了</string> <string name="shared_string_no_thanks">谢谢,不用了</string>
<string name="trace_rendering">渲染调试信息</string> <string name="trace_rendering">渲染调试信息</string>
<string name="gpx_option_reverse_route">向GPX方向</string> <string name="gpx_option_reverse_route">转轨迹方向</string>
<string name="internet_not_available">在没有连接到互联网的情况下,无法进行操作。</string> <string name="internet_not_available">在没有连接到互联网的情况下,无法进行操作。</string>
<string name="shared_string_next">下一页</string> <string name="shared_string_next">下一页</string>
<string name="shared_string_previous">上一页</string> <string name="shared_string_previous">上一页</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="si_mi_feet">英里/英尺</string> <string name="si_mi_feet">英里/英尺</string>
<string name="si_mi_yard">英里/码</string> <string name="si_mi_yard">英里/码</string>
@ -251,7 +251,7 @@
<string name="shared_string_import">导入</string> <string name="shared_string_import">导入</string>
<string name="send_report">发送报告</string> <string name="send_report">发送报告</string>
<string name="any_poi">任何</string> <string name="any_poi">任何</string>
<string name="thanks_yandex_traffic">由于Yandex的交通信息。</string> <string name="thanks_yandex_traffic">感谢 Yandex 提供交通信息。</string>
<string name="layer_yandex_traffic">Yandex的流量</string> <string name="layer_yandex_traffic">Yandex的流量</string>
<string name="layer_route">路线</string> <string name="layer_route">路线</string>
<string name="shared_string_favorites">收藏</string> <string name="shared_string_favorites">收藏</string>
@ -269,7 +269,7 @@
<string name="route_head"></string> <string name="route_head"></string>
<string name="first_time_continue">后来</string> <string name="first_time_continue">后来</string>
<string name="first_time_download">下载区域</string> <string name="first_time_download">下载区域</string>
<string name="search_poi_location">正在搜索信号</string> <string name="search_poi_location">等待信号…</string>
<string name="map_orientation_portrait">竖屏</string> <string name="map_orientation_portrait">竖屏</string>
<string name="map_orientation_landscape">横屏</string> <string name="map_orientation_landscape">横屏</string>
<string name="map_screen_orientation">屏幕方向</string> <string name="map_screen_orientation">屏幕方向</string>
@ -292,9 +292,9 @@
<string name="error_occurred_saving_gpx">无法保存 GPX 文件。</string> <string name="error_occurred_saving_gpx">无法保存 GPX 文件。</string>
<string name="arrived_at_destination">你已到达。</string> <string name="arrived_at_destination">你已到达。</string>
<string name="invalid_locations">无效的座标</string> <string name="invalid_locations">无效的座标</string>
<string name="go_back_to_osmand">到OsmAnd地图</string> <string name="go_back_to_osmand">回地图</string>
<string name="shared_string_close">关闭</string> <string name="shared_string_close">关闭</string>
<string name="saving_gpx_tracks">将GPX轨迹保存到SD卡</string> <string name="saving_gpx_tracks">保存 GPX 文件…</string>
<string name="finished_task">成品</string> <string name="finished_task">成品</string>
<string name="use_online_routing_descr">使用互联网计算路线。</string> <string name="use_online_routing_descr">使用互联网计算路线。</string>
<string name="use_online_routing">使用在线导航</string> <string name="use_online_routing">使用在线导航</string>
@ -351,18 +351,18 @@
<string name="about_version">版本:</string> <string name="about_version">版本:</string>
<string name="shared_string_about">关于</string> <string name="shared_string_about">关于</string>
<string name="about_settings_descr">版本信息,许可证,项目成员</string> <string name="about_settings_descr">版本信息,许可证,项目成员</string>
<string name="local_index_tile_data_expire">过期(分钟)%1$s</string> <string name="local_index_tile_data_expire">到期时间(分钟): %1$s</string>
<string name="local_index_tile_data_downloadable">可下载:%1$s</string> <string name="local_index_tile_data_downloadable">可下载:%1$s</string>
<string name="local_index_tile_data_maxzoom">最大显示级别:%1$s</string> <string name="local_index_tile_data_maxzoom">最大显示级别:%1$s</string>
<string name="local_index_tile_data_minzoom">最小显示级别:%1$s</string> <string name="local_index_tile_data_minzoom">最小显示级别:%1$s</string>
<string name="local_index_tile_data_name">地图瓦片数据:%1$s</string> <string name="local_index_tile_data_name">地图瓦片数据:%1$s</string>
<string name="edit_tilesource_successfully">地图瓦片数据源 %1$s 已成功保存</string> <string name="edit_tilesource_successfully">地图瓦片数据源 %1$s 已成功保存</string>
<string name="edit_tilesource_elliptic_tile">椭圆墨卡托</string> <string name="edit_tilesource_elliptic_tile">椭圆墨卡托投影</string>
<string name="edit_tilesource_maxzoom">最大显示级别</string> <string name="edit_tilesource_maxzoom">最大显示级别</string>
<string name="edit_tilesource_expiration_time">过期(分钟)</string> <string name="edit_tilesource_expiration_time">到期时间(分钟)</string>
<string name="edit_tilesource_minzoom">最小显示级别</string> <string name="edit_tilesource_minzoom">最小显示级别</string>
<string name="edit_tilesource_url_to_load">URL</string> <string name="edit_tilesource_url_to_load">URL</string>
<string name="edit_tilesource_choose_existing">选择已有来源</string> <string name="edit_tilesource_choose_existing">选择现有的…</string>
<string name="maps_define_edit">定义/编辑…</string> <string name="maps_define_edit">定义/编辑…</string>
<string name="map_widget_fps_info">FPS 调试信息</string> <string name="map_widget_fps_info">FPS 调试信息</string>
<string name="driving_region_descr">选择驾驶区域:美国、欧洲、英国、亚洲等。</string> <string name="driving_region_descr">选择驾驶区域:美国、欧洲、英国、亚洲等。</string>
@ -370,14 +370,14 @@
<string name="driving_region_japan">日本</string> <string name="driving_region_japan">日本</string>
<string name="driving_region_us">美国</string> <string name="driving_region_us">美国</string>
<string name="driving_region_canada">加拿大</string> <string name="driving_region_canada">加拿大</string>
<string name="driving_region_europe_asia">欧洲、亚洲、拉丁美洲及相似地区</string> <string name="driving_region_europe_asia">欧洲、亚洲、拉丁美洲和类似地区</string>
<string name="driving_region_uk">英国、印度、澳大利亚及其他</string> <string name="driving_region_uk">英国、印度和类似地区</string>
<string name="speak_title">播报…</string> <string name="speak_title">播报…</string>
<string name="speak_descr">设置街道名称、交通警告(强制停车、减速带)、测速仪警告、限速等公告。</string> <string name="speak_descr">设置街道名称、交通警告(强制停车、减速带)、测速仪警告、限速等公告。</string>
<string name="speak_speed_limit">播报限速</string> <string name="speak_speed_limit">播报限速</string>
<string name="speak_cameras">播报测速电子眼</string> <string name="speak_cameras">播报测速电子眼</string>
<string name="speak_traffic_warnings">播报交通信息</string> <string name="speak_traffic_warnings">播报交通信息</string>
<string name="osb_author_or_password_not_specified">请在设置中指定OSM用户和密码</string> <string name="osb_author_or_password_not_specified">请在设置中指定 OSM 用户和密码</string>
<string name="context_menu_item_directions_to">设为终点</string> <string name="context_menu_item_directions_to">设为终点</string>
<string name="context_menu_item_directions_from">设为起点</string> <string name="context_menu_item_directions_from">设为起点</string>
<string name="route_descr_map_location">地图: </string> <string name="route_descr_map_location">地图: </string>
@ -387,7 +387,7 @@
<string name="route_from">起点:</string> <string name="route_from">起点:</string>
<string name="destination_point">终点 %1$s</string> <string name="destination_point">终点 %1$s</string>
<string name="context_menu_item_destination_point">设为终点</string> <string name="context_menu_item_destination_point">设为终点</string>
<string name="please_select_address">先选择城市或街道</string> <string name="please_select_address">首先设置城市或街道</string>
<string name="search_street_in_neighborhood_cities">在相邻城市搜索街道</string> <string name="search_street_in_neighborhood_cities">在相邻城市搜索街道</string>
<string name="local_osm_changes_backup_successful">OSM 修改文件已成功生成 %1$s</string> <string name="local_osm_changes_backup_successful">OSM 修改文件已成功生成 %1$s</string>
<string name="local_osm_changes_backup_failed">无法备份 OSM 更改。</string> <string name="local_osm_changes_backup_failed">无法备份 OSM 更改。</string>
@ -402,7 +402,7 @@
<string name="distance_measurement_start_editing">开始编辑</string> <string name="distance_measurement_start_editing">开始编辑</string>
<string name="distance_measurement_finish_editing">完成编辑</string> <string name="distance_measurement_finish_editing">完成编辑</string>
<string name="distance_measurement_clear_route">清除所有点</string> <string name="distance_measurement_clear_route">清除所有点</string>
<string name="distance_measurement_load_gpx">打开已有 GPX</string> <string name="distance_measurement_load_gpx">打开现有的 GPX 文件</string>
<string name="wait_current_task_finished">请等待当前任务完成</string> <string name="wait_current_task_finished">请等待当前任务完成</string>
<string name="install_paid">完整版本</string> <string name="install_paid">完整版本</string>
<string name="cancel_navigation">停止导航</string> <string name="cancel_navigation">停止导航</string>
@ -438,7 +438,7 @@
<string name="av_use_external_camera_descr">使用系统应用拍照。</string> <string name="av_use_external_camera_descr">使用系统应用拍照。</string>
<string name="av_settings_descr">设置音频和视频设置。</string> <string name="av_settings_descr">设置音频和视频设置。</string>
<string name="av_settings">音频/视频设置 </string> <string name="av_settings">音频/视频设置 </string>
<string name="recording_error">录制时发生错误 </string> <string name="recording_error">录制失败</string>
<string name="recording_camera_not_available">摄像头不可用</string> <string name="recording_camera_not_available">摄像头不可用</string>
<string name="recording_is_recorded">音频/视频正在记录要停止请点击AV窗体。</string> <string name="recording_is_recorded">音频/视频正在记录要停止请点击AV窗体。</string>
<string name="recording_open_external_player">打开外部播放器</string> <string name="recording_open_external_player">打开外部播放器</string>
@ -510,7 +510,7 @@
<string name="map_online_data_descr">使用在线地图(在储存卡上下载并缓存瓦片)。</string> <string name="map_online_data_descr">使用在线地图(在储存卡上下载并缓存瓦片)。</string>
<string name="shared_string_online_maps">在线地图</string> <string name="shared_string_online_maps">在线地图</string>
<string name="online_map_settings_descr">配置在线或缓存瓦片地图来源。</string> <string name="online_map_settings_descr">配置在线或缓存瓦片地图来源。</string>
<string name="osmand_accessibility_description">显示特殊可用性功能的设置。</string> <string name="osmand_accessibility_description"></string>
<string name="vector_maps_may_display_faster_on_some_devices">矢量地图很可能显示更快速。但在某些设备上不能正常工作。</string> <string name="vector_maps_may_display_faster_on_some_devices">矢量地图很可能显示更快速。但在某些设备上不能正常工作。</string>
<string name="test_voice_prompts">测试语音提示</string> <string name="test_voice_prompts">测试语音提示</string>
<string name="switch_to_raster_map_to_see">这个位置没有离线矢量地图。您可以从设置(数据管理)中下载,或者切换到在线地图。</string> <string name="switch_to_raster_map_to_see">这个位置没有离线矢量地图。您可以从设置(数据管理)中下载,或者切换到在线地图。</string>
@ -530,7 +530,7 @@
<string name="local_openstreetmap_descr_title">异步 OSM 编辑:</string> <string name="local_openstreetmap_descr_title">异步 OSM 编辑:</string>
<string name="local_openstreetmap_settings">OSM兴趣点/注记已在设备上保存</string> <string name="local_openstreetmap_settings">OSM兴趣点/注记已在设备上保存</string>
<string name="show_current_gpx_title">显示当前轨迹</string> <string name="show_current_gpx_title">显示当前轨迹</string>
<string name="free_version_message">此 OsmAnd 免费版本最多支持下载 %1$s 套数据,并且不支持离线维基百科文章</string> <string name="free_version_message">你可以下载或更新 %1$s 地图</string>
<string name="poi_context_menu_showdescription">显示 POI 描述。</string> <string name="poi_context_menu_showdescription">显示 POI 描述。</string>
<string name="fav_export_confirmation">已存在上次导出的收藏夹文件。是否要替换它?</string> <string name="fav_export_confirmation">已存在上次导出的收藏夹文件。是否要替换它?</string>
<string name="routing_settings_descr">指定导航选项。</string> <string name="routing_settings_descr">指定导航选项。</string>
@ -552,30 +552,32 @@
<string name="delete_confirmation_msg">删除 %1$s</string> <string name="delete_confirmation_msg">删除 %1$s</string>
<string name="animate_route_off">停止模拟导航</string> <string name="animate_route_off">停止模拟导航</string>
<string name="animate_route">开始模拟导航</string> <string name="animate_route">开始模拟导航</string>
<string name="file_can_not_be_renamed">文件无法重命名。</string> <string name="file_can_not_be_renamed">无法重命名文件</string>
<string name="file_with_name_already_exists">同名文件存在。</string> <string name="file_with_name_already_exists">已经有一个同名文件存在。</string>
<string name="poi_query_by_name_matches_categories">找到了几个相关的 POI 类别。</string> <string name="poi_query_by_name_matches_categories">找到了几个相关的兴趣点类别。</string>
<string name="data_to_search_poi_not_available">用于搜索POI的本地数据不存在</string> <string name="data_to_search_poi_not_available">下载离线数据以搜索兴趣点</string>
<string name="poi_filter_by_name">按名称搜索</string> <string name="poi_filter_by_name">按名称搜索</string>
<string name="old_poi_file_should_be_deleted">兴趣点数据文件 \'%1$s\' 是多余的,可以删除。</string> <string name="old_poi_file_should_be_deleted">兴趣点数据文件 \'%1$s\' 是多余的,可以删除。</string>
<string name="update_poi_file_not_found">用于维护 POI 改动的本地文件不存在,且无法创建。</string> <string name="update_poi_file_not_found">用于维护 POI 改动的本地文件不存在,且无法创建。</string>
<string name="map_version_changed_info">服务器包含与您当前应用版本不兼容的地图文件。要下载并使用这些文件,请将应用程序升级至新版本</string> <string name="map_version_changed_info">下载新版本的应用程序,以便能够使用新的地图文件</string>
<string name="search_position_current_location_search">搜索位置…</string> <string name="search_position_current_location_search">搜索位置…</string>
<string name="search_position_current_location_found">我的位置(已找到)</string> <string name="search_position_current_location_found">我的位置(已找到)</string>
<string name="search_position_address">地址…</string> <string name="search_position_address">地址…</string>
<string name="search_position_favorites">收藏夹…</string> <string name="search_position_favorites">收藏夹…</string>
<string name="shared_string_undefined">未定义</string> <string name="shared_string_undefined">未定义</string>
<string name="search_position_map_view">上次地图显示位置</string> <string name="search_position_map_view">上次地图显示位置</string>
<string name="route_successfully_saved_at">路线已成功保存为 \'%1$s\'</string> <string name="route_successfully_saved_at">路线保存为“%1$s”</string>
<string name="filename_input">文件名: </string> <string name="filename_input">文件名: </string>
<string name="file_with_name_already_exist">同名文件已存在。</string> <string name="file_with_name_already_exist">同名文件已存在。</string>
<string name="shared_string_save">保存</string> <string name="shared_string_save">保存</string>
<string name="local_index_items_uploaded">%2$d 个项目中的 %1$d 个已成功上传。</string> <string name="local_index_items_uploaded">%2$d 个项目中的 %1$d 个已成功上传。</string>
<string name="show_more_map_detail">显示更多地图细节</string> <string name="show_more_map_detail">显示更多地图细节</string>
<string name="favourites_delete_multiple_succesful">收藏点已成功删除。</string> <string name="favourites_delete_multiple_succesful">收藏点已删除。</string>
<string name="favorite_delete_multiple">您将要删除 %1$d 个收藏点和 %2$d 个收藏组。是否确认?</string> <string name="favorite_delete_multiple">您将要删除 %1$d 个收藏点和 %2$d 个收藏组。是否确认?</string>
<string name="basemap_missing">基础世界地图(小比例尺下覆盖整个世界)丢失。请考虑下载 World_basemap_x.obf 以确保应用运行环境完整。</string> <string name="basemap_missing">基础世界地图(小比例尺下覆盖整个世界)丢失。请考虑下载 World_basemap_x.obf 以确保应用运行环境完整。</string>
<string name="local_index_gpx_info_show">\n\n长按进入选项</string> <string name="local_index_gpx_info_show">"
\n
\n长按选项"</string>
<string name="local_index_installed">本地版本</string> <string name="local_index_installed">本地版本</string>
<string name="local_index_descr_title">管理地图文件。</string> <string name="local_index_descr_title">管理地图文件。</string>
<string name="shared_string_download">下载</string> <string name="shared_string_download">下载</string>
@ -583,8 +585,8 @@
<string name="local_index_address_data">地址数据</string> <string name="local_index_address_data">地址数据</string>
<string name="local_index_transport_data">交通设施数据</string> <string name="local_index_transport_data">交通设施数据</string>
<string name="local_index_map_data">地图数据</string> <string name="local_index_map_data">地图数据</string>
<string name="local_indexes_cat_tts">语音数据(TTS)</string> <string name="local_indexes_cat_tts">语音提示TTS</string>
<string name="local_indexes_cat_voice">语音数据(录制)</string> <string name="local_indexes_cat_voice">语音提示(录音)</string>
<string name="local_indexes_cat_poi">兴趣点数据</string> <string name="local_indexes_cat_poi">兴趣点数据</string>
<string name="ttsvoice">TTS语音</string> <string name="ttsvoice">TTS语音</string>
<string name="search_offline_clear_search">新搜索</string> <string name="search_offline_clear_search">新搜索</string>
@ -592,18 +594,18 @@
<string name="map_text_size">地图字体大小</string> <string name="map_text_size">地图字体大小</string>
<string name="trace_rendering_descr">显示渲染性能。</string> <string name="trace_rendering_descr">显示渲染性能。</string>
<string name="installing_new_resources">解包新数据…</string> <string name="installing_new_resources">解包新数据…</string>
<string name="internet_connection_required_for_online_route">已选择在线导航服务,但网络连接不可用</string> <string name="internet_connection_required_for_online_route">在线导航不能离线工作</string>
<string name="tts_language_not_supported_title">不支持的语言</string> <string name="tts_language_not_supported_title">不支持的语言</string>
<string name="tts_missing_language_data_title">数据丢失</string> <string name="tts_missing_language_data_title">数据丢失</string>
<string name="gpx_option_destination_point">使用当前终点</string> <string name="gpx_option_destination_point">使用当前终点</string>
<string name="voice_stream_notification">提醒语音音频</string> <string name="voice_stream_notification">提醒语音音频</string>
<string name="voice_stream_music">媒体/音乐音频</string> <string name="voice_stream_music">媒体/导航音频</string>
<string name="warning_tile_layer_not_downloadable">应用程序无法下载地图图层 %1$s请尝试重新安装。</string> <string name="warning_tile_layer_not_downloadable">应用程序无法下载地图图层 %1$s请尝试重新安装。</string>
<string name="overlay_transparency_descr">调整叠加层透明度。</string> <string name="overlay_transparency_descr">调整叠加层透明度。</string>
<string name="overlay_transparency">叠加层透明度</string> <string name="overlay_transparency">叠加层透明度</string>
<string name="map_transparency_descr">调整基本地图透明度。</string> <string name="map_transparency_descr">调整基本地图透明度。</string>
<string name="map_transparency">基础地图透明度</string> <string name="map_transparency">基础地图透明度</string>
<string name="layer_underlay">背景层地图…</string> <string name="layer_underlay">背景层地图…</string>
<string name="map_underlay">背景层地图</string> <string name="map_underlay">背景层地图</string>
<string name="map_underlay_descr">选择背景层地图</string> <string name="map_underlay_descr">选择背景层地图</string>
<string name="layer_overlay">叠加层地图…</string> <string name="layer_overlay">叠加层地图…</string>
@ -635,7 +637,7 @@
<string name="application_dir">存储目录</string> <string name="application_dir">存储目录</string>
<string name="gps_status_app_not_found">GPS 状态应用未安装。是否转到应用市场中搜索?</string> <string name="gps_status_app_not_found">GPS 状态应用未安装。是否转到应用市场中搜索?</string>
<string name="voice_is_not_available_msg">语音指引不可用。请到“设置”→“常规设置”→“语音指引”中选择想要的语音数据包并下载。</string> <string name="voice_is_not_available_msg">语音指引不可用。请到“设置”→“常规设置”→“语音指引”中选择想要的语音数据包并下载。</string>
<string name="voice_is_not_available_title">未选择引导语音</string> <string name="voice_is_not_available_title">选择一个语音提示包</string>
<string name="daynight_descr">调整夜间和白天模式之间的切换。</string> <string name="daynight_descr">调整夜间和白天模式之间的切换。</string>
<string name="download_files_question">是否下载 {0} 个文件({1} MB)</string> <string name="download_files_question">是否下载 {0} 个文件({1} MB)</string>
<string name="items_were_selected">已选择 {0} 个项目</string> <string name="items_were_selected">已选择 {0} 个项目</string>
@ -646,11 +648,11 @@
<string name="shared_string_download_map">下载地图</string> <string name="shared_string_download_map">下载地图</string>
<string name="maps_could_not_be_downloaded">此地图无法下载</string> <string name="maps_could_not_be_downloaded">此地图无法下载</string>
<string name="rendering_exception">无法绘制所选区域。</string> <string name="rendering_exception">无法绘制所选区域。</string>
<string name="show_point_options">使用位置 </string> <string name="show_point_options">使用位置</string>
<string name="renderer_load_sucess">渲染器已成功加载</string> <string name="renderer_load_sucess">已加载渲染器</string>
<string name="renderer_load_exception">无法加载渲染器。</string> <string name="renderer_load_exception">无法加载渲染器。</string>
<string name="renderers">矢量渲染器</string> <string name="renderers">矢量渲染器</string>
<string name="renderers_descr">选择渲染外观</string> <string name="renderers_descr">选择渲染外观</string>
<string name="poi_context_menu_website">显示POI网址</string> <string name="poi_context_menu_website">显示POI网址</string>
<string name="poi_context_menu_call">显示POI电话</string> <string name="poi_context_menu_call">显示POI电话</string>
<string name="context_menu_item_search_transport">搜索交通设施</string> <string name="context_menu_item_search_transport">搜索交通设施</string>
@ -659,17 +661,18 @@
<string name="vector_data">离线矢量地图</string> <string name="vector_data">离线矢量地图</string>
<string name="poi_context_menu_modify">修改 POI</string> <string name="poi_context_menu_modify">修改 POI</string>
<string name="poi_context_menu_delete">删除 POI</string> <string name="poi_context_menu_delete">删除 POI</string>
<string name="rotate_map_none_opt">保持地图正北朝上</string> <string name="rotate_map_none_opt">不旋转(正北永远朝上)</string>
<string name="rotate_map_to_bearing_descr">地图对齐方式:</string> <string name="rotate_map_to_bearing_descr">地图对齐方式:</string>
<string name="rotate_map_to_bearing">地图朝向</string> <string name="rotate_map_to_bearing">地图朝向</string>
<string name="show_route">路线详情</string> <string name="show_route">路线详情</string>
<string name="fav_imported_sucessfully">收藏夹已成功导入</string> <string name="fav_imported_sucessfully">收藏导入</string>
<string name="av_photo_play_sound_descr">选择是否有拍照声。</string> <string name="av_photo_play_sound_descr">选择是否有拍照声。</string>
<string name="av_photo_play_sound">拍照时播放声音</string> <string name="av_photo_play_sound">播放相机快门声</string>
<string name="voice_data_not_supported">语音数据版本不支持</string> <string name="voice_data_not_supported">语音数据版本不支持</string>
<string name="voice_data_corrupted">指定的语音数据已损坏</string> <string name="voice_data_corrupted">指定的语音数据已损坏</string>
<string name="voice_data_unavailable">选择的语音数据不可用</string> <string name="voice_data_unavailable">所选语音提示包不可用</string>
<string name="sd_unmounted">SD卡无法访问。\n您将无法查看地图和进行搜索。</string> <string name="sd_unmounted">无法访问存储卡。
\n你将无法看到地图或查找内容。</string>
<string name="sd_mounted_ro">SD卡处于只读状态。\n您将只能查看已有地图无法从互联网下载。</string> <string name="sd_mounted_ro">SD卡处于只读状态。\n您将只能查看已有地图无法从互联网下载。</string>
<string name="unzipping_file">正在解压缩文件…</string> <string name="unzipping_file">正在解压缩文件…</string>
<string name="search_near_map">在上一次地图中心附近搜索</string> <string name="search_near_map">在上一次地图中心附近搜索</string>
@ -679,14 +682,14 @@
<string name="add_new_rule">添加新规则</string> <string name="add_new_rule">添加新规则</string>
<string name="show_transport_over_map_description">在地图上显示公共交通站点。</string> <string name="show_transport_over_map_description">在地图上显示公共交通站点。</string>
<string name="show_transport_over_map">显示公共交通站点</string> <string name="show_transport_over_map">显示公共交通站点</string>
<string name="hello">导航应用 OsmAnd</string> <string name="hello">OsmAnd 导航应用</string>
<string name="update_poi_success">POI 数据已成功更新 ({0} 已载入)</string> <string name="update_poi_success">POI 数据已成功更新 ({0} 已载入)</string>
<string name="update_poi_error_local">无法更新本地兴趣点列表。</string> <string name="update_poi_error_local">无法更新本地兴趣点列表。</string>
<string name="update_poi_error_loading">无法从服务器加载数据。</string> <string name="update_poi_error_loading">无法从服务器加载数据。</string>
<string name="update_poi_no_offline_poi_index">此区域没有可用的离线 POI 数据</string> <string name="update_poi_no_offline_poi_index">此区域没有可用的离线 POI 数据</string>
<string name="update_poi_is_not_available_for_zoom">小比例尺下更新 POI 功能不可用</string> <string name="update_poi_is_not_available_for_zoom">小比例尺下更新 POI 功能不可用</string>
<string name="context_menu_item_update_poi">更新 POI</string> <string name="context_menu_item_update_poi">更新 POI</string>
<string name="context_menu_item_update_map_confirm">是否要通过互联网更新本地数据?</string> <string name="context_menu_item_update_map_confirm">互联网更新本地数据?</string>
<string name="search_history_city">城市:{0}</string> <string name="search_history_city">城市:{0}</string>
<string name="search_history_street">街道:{0}{1}</string> <string name="search_history_street">街道:{0}{1}</string>
<string name="search_history_int_streets">交叉路口:{0} x {1} 在 {2}</string> <string name="search_history_int_streets">交叉路口:{0} x {1} 在 {2}</string>
@ -705,7 +708,7 @@
<string name="route_general_information">总距离 %1$s行驶时间 %2$d 时 %3$d 分。</string> <string name="route_general_information">总距离 %1$s行驶时间 %2$d 时 %3$d 分。</string>
<string name="router_service_descr">在线或离线导航服务。</string> <string name="router_service_descr">在线或离线导航服务。</string>
<string name="router_service">导航服务</string> <string name="router_service">导航服务</string>
<string name="sd_dir_not_accessible">SD卡上的数据存储目录无法访问!</string> <string name="sd_dir_not_accessible">存储卡上的存储文件夹无法访问!</string>
<string name="download_question">是否下载 {0} - {1}</string> <string name="download_question">是否下载 {0} - {1}</string>
<string name="download_question_exist">{0} 的离线数据已经存在({1})。是否要更新它({2})</string> <string name="download_question_exist">{0} 的离线数据已经存在({1})。是否要更新它({2})</string>
<string name="address">地址</string> <string name="address">地址</string>
@ -713,7 +716,7 @@
<string name="downloading_list_indexes">正在下载可用区域的列表…</string> <string name="downloading_list_indexes">正在下载可用区域的列表…</string>
<string name="list_index_files_was_not_loaded">区域列表未能从 osmand.net 获取。</string> <string name="list_index_files_was_not_loaded">区域列表未能从 osmand.net 获取。</string>
<string name="fav_points_edited">收藏点已被编辑</string> <string name="fav_points_edited">收藏点已被编辑</string>
<string name="mark_final_location_first">首先选择目的地</string> <string name="mark_final_location_first">先设置目的地</string>
<string name="opening_hours">营业时间</string> <string name="opening_hours">营业时间</string>
<string name="opening_changeset">正在打开修改集…</string> <string name="opening_changeset">正在打开修改集…</string>
<string name="closing_changeset">正在关闭修改集…</string> <string name="closing_changeset">正在关闭修改集…</string>
@ -739,23 +742,23 @@
<string name="update_tile">更新地图</string> <string name="update_tile">更新地图</string>
<string name="reload_tile">重新载入地图瓦片</string> <string name="reload_tile">重新载入地图瓦片</string>
<string name="mark_point">目标</string> <string name="mark_point">目标</string>
<string name="shared_string_add_to_favorites">加入收藏夹</string> <string name="shared_string_add_to_favorites">添加到“收藏”</string>
<string name="use_english_names_descr">在当地名称和英文名称之间选择。</string> <string name="use_english_names_descr">在当地名称和英文名称之间选择。</string>
<string name="use_english_names">在地图使用英文名称</string> <string name="use_english_names">在地图使用英文名称</string>
<string name="app_settings">应用程序设置</string> <string name="app_settings">应用设置</string>
<string name="search_address">搜索地址</string> <string name="search_address">搜索地址</string>
<string name="choose_building">选择建筑物</string> <string name="choose_building">选择建筑物</string>
<string name="choose_street">选择街道</string> <string name="choose_street">选择街道</string>
<string name="choose_city">选择城市</string> <string name="choose_city">选择城市</string>
<string name="ChooseCountry">选择国家</string> <string name="ChooseCountry">选择国家</string>
<string name="show_poi_over_map_description">显示上一次使用的兴趣点叠加层。</string> <string name="show_poi_over_map_description">显示上一次使用的兴趣点叠加层。</string>
<string name="show_poi_over_map">显示POI</string> <string name="show_poi_over_map">显示兴趣点叠加</string>
<string name="map_tile_source_descr">选择在线或缓存地图瓦片的来源。</string> <string name="map_tile_source_descr">选择在线或缓存地图瓦片的来源。</string>
<string name="map_tile_source">瓦片地图来源</string> <string name="map_tile_source">瓦片地图来源</string>
<string name="map_source">地图来源</string> <string name="map_source">地图来源</string>
<string name="show_location">显示位置</string> <string name="show_location">显示位置</string>
<string name="use_internet_to_download_tile">使用互联网下载丢失的地图瓦片</string> <string name="use_internet_to_download_tile">使用互联网下载丢失的地图瓦片</string>
<string name="app_description">导航应用程序</string> <string name="app_description">导航应用</string>
<string name="searchpoi_activity">选择POI</string> <string name="searchpoi_activity">选择POI</string>
<string name="search_POI_level_btn">搜索更多</string> <string name="search_POI_level_btn">搜索更多</string>
<string name="choose_available_region">从列表中选择区域</string> <string name="choose_available_region">从列表中选择区域</string>
@ -785,13 +788,13 @@
<string name="poi_remove_success">已删除</string> <string name="poi_remove_success">已删除</string>
<string name="poi_action_add">添加</string> <string name="poi_action_add">添加</string>
<string name="poi_action_change">修改</string> <string name="poi_action_change">修改</string>
<string name="poi_action_succeded_template">动作 {0} 已成功完成。</string> <string name="poi_action_succeded_template">动作 {0} 已完成。</string>
<string name="poi_error_unexpected_template">执行动作 {0} 时发生意外的错误</string> <string name="poi_error_unexpected_template">无法执行动作 {0}。</string>
<string name="poi_error_io_error_template">执行动作 {0} 时发生 I/O 错误。</string> <string name="poi_error_io_error_template">执行动作 {0} 时发生 I/O 错误。</string>
<string name="poi_error_info_not_loaded">节点的信息未能加载</string> <string name="poi_error_info_not_loaded">节点的信息未能加载</string>
<string name="poi_dialog_other_tags_message">所有其他标记都已保留</string> <string name="poi_dialog_other_tags_message">所有其他标记都已保留</string>
<string name="edit_filter_delete_dialog_title">是否删除选中的过滤器</string> <string name="edit_filter_delete_dialog_title">删除此筛选规则</string>
<string name="edit_filter_delete_message">过滤器 %1$s 已被删除</string> <string name="edit_filter_delete_message">筛选规则“%1$s”已被删除</string>
<string name="edit_filter_create_message">过滤器 %1$s 已创建</string> <string name="edit_filter_create_message">过滤器 %1$s 已创建</string>
<string name="av_camera_focus_auto">自动对焦</string> <string name="av_camera_focus_auto">自动对焦</string>
<string name="clear_intermediate_points">清除中途点</string> <string name="clear_intermediate_points">清除中途点</string>
@ -819,11 +822,11 @@
<string name="shared_string_topbar">顶栏</string> <string name="shared_string_topbar">顶栏</string>
<string name="full_report">完整报告</string> <string name="full_report">完整报告</string>
<string name="recalculate_route">重新计算路线</string> <string name="recalculate_route">重新计算路线</string>
<string name="open_street_map_login_and_pass">OpenStreetMap 登录名和密码</string> <string name="open_street_map_login_and_pass">OSM 用户名和密码</string>
<string name="donations">捐赠</string> <string name="donations">捐赠</string>
<string name="number_of_recipients">接收者数量</string> <string name="number_of_recipients">接收者数量</string>
<string name="osm_user_stat">编辑数 %1$s排名 %2$s总计编辑 %3$s</string> <string name="osm_user_stat">编辑数 %1$s排名 %2$s总计编辑 %3$s</string>
<string name="osm_editors_ranking">OSM 编辑排名</string> <string name="osm_editors_ranking">OSM 编辑排名</string>
<string name="osm_live_subscribe_btn">订阅</string> <string name="osm_live_subscribe_btn">订阅</string>
<string name="osm_live_subscription">OsmAnd 实时订阅</string> <string name="osm_live_subscription">OsmAnd 实时订阅</string>
<string name="osm_live_user_public_name">公开名称</string> <string name="osm_live_user_public_name">公开名称</string>
@ -849,16 +852,16 @@
<string name="shared_string_toolbar">工具栏</string> <string name="shared_string_toolbar">工具栏</string>
<string name="shared_string_widgets">小工具</string> <string name="shared_string_widgets">小工具</string>
<string name="shared_string_add_to_map_markers">添加地图标记</string> <string name="shared_string_add_to_map_markers">添加地图标记</string>
<string name="add_points_to_map_markers_q">您确定要添加所有地点到地图标记?</string> <string name="add_points_to_map_markers_q">将所有点添加为地图标记?</string>
<string name="select_map_markers">选择地图标记</string> <string name="select_map_markers">选择地图标记</string>
<string name="shared_string_reverse_order">反向顺序</string> <string name="shared_string_reverse_order">反向顺序</string>
<string name="show_map_markers_description">激活地图标记功能。</string> <string name="show_map_markers_description">激活地图标记功能。</string>
<string name="clear_active_markers_q">您要移除所有有效标记?</string> <string name="clear_active_markers_q">删除所有的活动标记?</string>
<string name="clear_markers_history_q">您要清除历史地图标记</string> <string name="clear_markers_history_q">清除地图标记历史记录</string>
<string name="active_markers">激活标记</string> <string name="active_markers">激活标记</string>
<string name="map_markers">地图标记</string> <string name="map_markers">地图标记</string>
<string name="map_marker">地图标记</string> <string name="map_marker">地图标记</string>
<string name="rendering_attr_showMtbRoutes_name">显示 MTB 路线</string> <string name="rendering_attr_showMtbRoutes_name">显示山地自行车道</string>
<string name="show_polygons">显示多边形</string> <string name="show_polygons">显示多边形</string>
<string name="shared_string_email_address">电子邮件地址</string> <string name="shared_string_email_address">电子邮件地址</string>
<string name="rendering_attr_hideUnderground_name">隐藏地下物体</string> <string name="rendering_attr_hideUnderground_name">隐藏地下物体</string>
@ -948,7 +951,7 @@
<string name="si_m_s">米/秒</string> <string name="si_m_s">米/秒</string>
<string name="si_min_km">分钟每千米</string> <string name="si_min_km">分钟每千米</string>
<string name="si_min_m">分钟/英里</string> <string name="si_min_m">分钟/英里</string>
<string name="si_nm_h">海里/小时 (节)</string> <string name="si_nm_h">海里每小时(节)</string>
<string name="nm_h"></string> <string name="nm_h"></string>
<string name="min_mile">分钟每米</string> <string name="min_mile">分钟每米</string>
<string name="min_km">分/千米</string> <string name="min_km">分/千米</string>
@ -1005,7 +1008,7 @@
<string name="lang_et">爱沙尼亚语</string> <string name="lang_et">爱沙尼亚语</string>
<string name="lang_ceb">宿务语</string> <string name="lang_ceb">宿务语</string>
<string name="disable_recording_once_app_killed">避免独立日志</string> <string name="disable_recording_once_app_killed">避免独立日志</string>
<string name="gps_network_not_enabled">位置服务未启用。您确定要开启</string> <string name="gps_network_not_enabled">位置服务已关闭。要开启吗</string>
<string name="download_wikipedia_files">下载额外的维基百科数据 (%1$s MB) 吗?</string> <string name="download_wikipedia_files">下载额外的维基百科数据 (%1$s MB) 吗?</string>
<string name="shared_string_import2osmand">导入到 OsmAnd</string> <string name="shared_string_import2osmand">导入到 OsmAnd</string>
<string name="read_full_article">阅读完整文章(在线)</string> <string name="read_full_article">阅读完整文章(在线)</string>
@ -1016,10 +1019,10 @@
<string name="rendering_value_disabled_name">已禁用</string> <string name="rendering_value_disabled_name">已禁用</string>
<string name="shared_string_logoff">退出</string> <string name="shared_string_logoff">退出</string>
<string name="rendering_attr_hideHouseNumbers_name">隐藏门牌号码</string> <string name="rendering_attr_hideHouseNumbers_name">隐藏门牌号码</string>
<string name="copying_osmand_file_failed">复制文件失败</string> <string name="copying_osmand_file_failed">移动文件失败</string>
<string name="storage_directory_external">外部存储</string> <string name="storage_directory_external">外部存储</string>
<string name="storage_directory_multiuser">多用户存储</string> <string name="storage_directory_multiuser">多用户存储</string>
<string name="storage_directory_internal_app">内部应用存储</string> <string name="storage_directory_internal_app">内部存储</string>
<string name="storage_directory_manual">手动指定</string> <string name="storage_directory_manual">手动指定</string>
<string name="storage_directory_default">内部存储</string> <string name="storage_directory_default">内部存储</string>
<string name="storage_directory">地图存储</string> <string name="storage_directory">地图存储</string>
@ -1076,11 +1079,11 @@
<string name="shared_string_more">更多…</string> <string name="shared_string_more">更多…</string>
<string name="upload_osm_note_description">匿名上传您的 OSM 注记,或者使用您的 OpenStreetMap.org 账号。</string> <string name="upload_osm_note_description">匿名上传您的 OSM 注记,或者使用您的 OpenStreetMap.org 账号。</string>
<string name="wiki_around">附近的维基百科文章</string> <string name="wiki_around">附近的维基百科文章</string>
<string name="search_map_hint">搜索城市或地区</string> <string name="search_map_hint">城市或地区</string>
<string name="upload_poi">上传兴趣点</string> <string name="upload_poi">上传兴趣点</string>
<string name="route_calculation">路线计算</string> <string name="route_calculation">路线计算</string>
<string name="gpx_no_tracks_title">您暂时没有轨迹</string> <string name="gpx_no_tracks_title">你还没有任何轨迹文件</string>
<string name="gpx_no_tracks_title_folder">您也可以将轨迹添加到文件夹下</string> <string name="gpx_no_tracks_title_folder">你也可以将轨迹文件添加到文件夹</string>
<string name="shared_string_continue">继续</string> <string name="shared_string_continue">继续</string>
<string name="shared_string_pause">暂停</string> <string name="shared_string_pause">暂停</string>
<string name="gpx_logging_no_data">无数据</string> <string name="gpx_logging_no_data">无数据</string>
@ -1088,7 +1091,7 @@
<string name="save_track_min_speed_descr">筛选器:不记录低于该速度的点。</string> <string name="save_track_min_speed_descr">筛选器:不记录低于该速度的点。</string>
<string name="shared_string_notifications">通知</string> <string name="shared_string_notifications">通知</string>
<string name="christmas_poi">圣诞兴趣点</string> <string name="christmas_poi">圣诞兴趣点</string>
<string name="christmas_desc_q">显示圣诞兴趣点?</string> <string name="christmas_desc_q">显示圣诞假期兴趣点?</string>
<string name="search_hint">输入城市、地址、兴趣点名称</string> <string name="search_hint">输入城市、地址、兴趣点名称</string>
<string name="create_custom_poi">创建自定义过滤器</string> <string name="create_custom_poi">创建自定义过滤器</string>
<string name="custom_search">自定义搜索</string> <string name="custom_search">自定义搜索</string>
@ -1184,7 +1187,7 @@
<string name="rendering_value_germanRoadAtlas_name">德国道路地图</string> <string name="rendering_value_germanRoadAtlas_name">德国道路地图</string>
<string name="rendering_value_highContrastRoads_name">高对比度道路</string> <string name="rendering_value_highContrastRoads_name">高对比度道路</string>
<string name="rendering_value_americanRoadAtlas_name">美国道路地图</string> <string name="rendering_value_americanRoadAtlas_name">美国道路地图</string>
<string name="layer_poi">兴趣点…</string> <string name="layer_poi">兴趣点叠加层…</string>
<string name="layer_map">地图来源…</string> <string name="layer_map">地图来源…</string>
<string name="quick_action_map_source">改变地图来源</string> <string name="quick_action_map_source">改变地图来源</string>
<string name="quick_action_map_source_action">添加地图来源</string> <string name="quick_action_map_source_action">添加地图来源</string>
@ -1212,7 +1215,7 @@
<string name="speed_limit_exceed">速度限制容忍程度</string> <string name="speed_limit_exceed">速度限制容忍程度</string>
<string name="rendering_category_others">其他地图属性</string> <string name="rendering_category_others">其他地图属性</string>
<string name="print_route">显示路线</string> <string name="print_route">显示路线</string>
<string name="search_osm_offline">搜索地理位置</string> <string name="search_osm_offline">按地理位置搜索</string>
<string name="srtm_color_scheme">颜色方案</string> <string name="srtm_color_scheme">颜色方案</string>
<string name="change_color">改变颜色</string> <string name="change_color">改变颜色</string>
<string name="edit_name">编辑名称</string> <string name="edit_name">编辑名称</string>
@ -1332,7 +1335,7 @@
<string name="quick_action_showhide_osmbugs_descr">轻点动作按钮会在地图上显示或隐藏 OSM 注记。</string> <string name="quick_action_showhide_osmbugs_descr">轻点动作按钮会在地图上显示或隐藏 OSM 注记。</string>
<string name="sorted_by_distance">按距离排序</string> <string name="sorted_by_distance">按距离排序</string>
<string name="search_favorites">在我的收藏中搜索</string> <string name="search_favorites">在我的收藏中搜索</string>
<string name="hillshade_menu_download_descr">要在地图上看到起伏的山坡,您需要下载这个地区的地形阴影层地图</string> <string name="hillshade_menu_download_descr">下载“山体阴影”叠加层地图以显示垂直阴影</string>
<string name="hillshade_purchase_header">安装“等高线”插件以显示渐变的垂直区域。</string> <string name="hillshade_purchase_header">安装“等高线”插件以显示渐变的垂直区域。</string>
<string name="hide_from_zoom_level">基于缩放级别开始隐藏</string> <string name="hide_from_zoom_level">基于缩放级别开始隐藏</string>
<string name="srtm_menu_download_descr">下载本地区使用的“等高线”地图。</string> <string name="srtm_menu_download_descr">下载本地区使用的“等高线”地图。</string>
@ -1341,7 +1344,7 @@
<string name="show_from_zoom_level">从缩放级别开始显示</string> <string name="show_from_zoom_level">从缩放级别开始显示</string>
<string name="favorite_group_name">组名称</string> <string name="favorite_group_name">组名称</string>
<string name="animate_my_location">动画处理我的位置</string> <string name="animate_my_location">动画处理我的位置</string>
<string name="animate_my_location_desc">在导航过程中打开\"我的位置\"的动画地图平移。</string> <string name="animate_my_location_desc">在导航过程中开启“我的位置”的动画地图平移。</string>
<string name="quick_action_add_destination_desc">轻点按钮将在屏幕中心位置添加一个目的地。以前设定的目的地成为最后的中转点。</string> <string name="quick_action_add_destination_desc">轻点按钮将在屏幕中心位置添加一个目的地。以前设定的目的地成为最后的中转点。</string>
<string name="quick_action_replace_destination_desc">使画面居中的新航线目的地的按钮,取代之前选择的目的地(如果有的话)。</string> <string name="quick_action_replace_destination_desc">使画面居中的新航线目的地的按钮,取代之前选择的目的地(如果有的话)。</string>
<string name="quick_action_add_first_intermediate_desc">使屏幕居中的按钮,是第一中间目的。</string> <string name="quick_action_add_first_intermediate_desc">使屏幕居中的按钮,是第一中间目的。</string>
@ -1351,8 +1354,8 @@
<string name="depth_contour_descr">海洋等深线和航海点。</string> <string name="depth_contour_descr">海洋等深线和航海点。</string>
<string name="sea_depth_thanks">感谢你购买“航海等深线”</string> <string name="sea_depth_thanks">感谢你购买“航海等深线”</string>
<string name="index_item_depth_contours_osmand_ext">航海等深线</string> <string name="index_item_depth_contours_osmand_ext">航海等深线</string>
<string name="index_item_depth_points_southern_hemisphere">南半球航海等深线</string> <string name="index_item_depth_points_southern_hemisphere">南半球航海深度点</string>
<string name="index_item_depth_points_northern_hemisphere">北半球航海等深线</string> <string name="index_item_depth_points_northern_hemisphere">北半球航海深度点</string>
<string name="download_depth_countours">航海等深线</string> <string name="download_depth_countours">航海等深线</string>
<string name="nautical_maps">航海地图</string> <string name="nautical_maps">航海地图</string>
<string name="analyze_on_map">在地图上分析</string> <string name="analyze_on_map">在地图上分析</string>
@ -1366,7 +1369,7 @@
<string name="shared_string_slope">坡度</string> <string name="shared_string_slope">坡度</string>
<string name="add_new_folder">添加新文件夹</string> <string name="add_new_folder">添加新文件夹</string>
<string name="route_points_category_name">转到这条路线上</string> <string name="route_points_category_name">转到这条路线上</string>
<string name="track_points_category_name">在这条路线的突出点</string> <string name="track_points_category_name">航点、兴趣点、命名的特征</string>
<string name="shared_string_gpx_track">轨迹</string> <string name="shared_string_gpx_track">轨迹</string>
<string name="shared_string_time_moving">移动的时间</string> <string name="shared_string_time_moving">移动的时间</string>
<string name="shared_string_time_span">时间跨度</string> <string name="shared_string_time_span">时间跨度</string>
@ -1412,7 +1415,7 @@
<string name="translit_name_if_miss">如果 %1$s 的名称缺失则音译</string> <string name="translit_name_if_miss">如果 %1$s 的名称缺失则音译</string>
<string name="translit_names">音译名称</string> <string name="translit_names">音译名称</string>
<string name="new_filter_desc">请输入新筛选器的名称,该名称将添加到你的\"类别\"选项卡中。</string> <string name="new_filter_desc">请输入新筛选器的名称,该名称将添加到你的\"类别\"选项卡中。</string>
<string name="osm_live_payment_desc">每个月会收取认购费用。您可以在 Google Play 随时取消您的订购</string> <string name="osm_live_payment_desc">订阅按选定的时间段收费。可随时在 Google Play 上取消</string>
<string name="donation_to_osm_desc">你的部分捐款将发送给 OSM 捐助者。订阅费用保持不变。</string> <string name="donation_to_osm_desc">你的部分捐款将发送给 OSM 捐助者。订阅费用保持不变。</string>
<string name="osm_live_subscription_desc">启用认购可每小时、每天、每周的更新以及世界各地所有的地图无限制的下载。</string> <string name="osm_live_subscription_desc">启用认购可每小时、每天、每周的更新以及世界各地所有的地图无限制的下载。</string>
<string name="get_it">获得</string> <string name="get_it">获得</string>
@ -1466,7 +1469,7 @@
<string name="access_direction_haptic_feedback">触觉方向</string> <string name="access_direction_haptic_feedback">触觉方向</string>
<string name="access_direction_haptic_feedback_descr">由振动指示目标点方向。</string> <string name="access_direction_haptic_feedback_descr">由振动指示目标点方向。</string>
<string name="use_osm_live_routing_description">启用导航时由 OsmAnd 实时服务提供的更新。</string> <string name="use_osm_live_routing_description">启用导航时由 OsmAnd 实时服务提供的更新。</string>
<string name="access_no_destination">设置目的地</string> <string name="access_no_destination">辅助功能插件:没有设置目的地</string>
<string name="map_widget_magnetic_bearing">磁方位</string> <string name="map_widget_magnetic_bearing">磁方位</string>
<string name="map_widget_bearing">相对方位</string> <string name="map_widget_bearing">相对方位</string>
<string name="access_disable_offroute_recalc">当您离开道路时不重新计算路线</string> <string name="access_disable_offroute_recalc">当您离开道路时不重新计算路线</string>
@ -2174,7 +2177,7 @@
<string name="local_index_mi_backup">停用</string> <string name="local_index_mi_backup">停用</string>
<string name="local_indexes_cat_backup">已停用</string> <string name="local_indexes_cat_backup">已停用</string>
<string name="tts_language_not_supported">安装的 Android TTS文本到语音引擎不支持所选语言将使用其预设的 TTS 语言。在市场上寻找其他 TTS 引擎?</string> <string name="tts_language_not_supported">安装的 Android TTS文本到语音引擎不支持所选语言将使用其预设的 TTS 语言。在市场上寻找其他 TTS 引擎?</string>
<string name="tts_missing_language_data">安装所选语言没有数据。你想要去市场安装吗</string> <string name="tts_missing_language_data">去应用市场下载选定的语言</string>
<string name="gpx_option_from_start_point">沿着整条轨迹</string> <string name="gpx_option_from_start_point">沿着整条轨迹</string>
<string name="switch_to_vector_map_to_see">指定以脱机矢量地图显示 <string name="switch_to_vector_map_to_see">指定以脱机矢量地图显示
\n \n
@ -2214,9 +2217,9 @@
<string name="no_fav_to_save">没有我的收藏标点要保存</string> <string name="no_fav_to_save">没有我的收藏标点要保存</string>
<string name="share_fav_subject">通过 OsmAnd 分享我的收藏夹</string> <string name="share_fav_subject">通过 OsmAnd 分享我的收藏夹</string>
<string name="none_region_found">在 SD 卡上找到的区域没有离线数据。从互联网下载区域数据。</string> <string name="none_region_found">在 SD 卡上找到的区域没有离线数据。从互联网下载区域数据。</string>
<string name="poi_namefinder_query_empty">输入搜索条件来查找 POI</string> <string name="poi_namefinder_query_empty">输入查找兴趣点</string>
<string name="menu_layers">地图图层</string> <string name="menu_layers">地图图层</string>
<string name="context_menu_item_search_poi">POI 搜索</string> <string name="context_menu_item_search_poi">搜索兴趣点</string>
<string name="use_trackball_descr">使用轨迹球设备来移动地图。</string> <string name="use_trackball_descr">使用轨迹球设备来移动地图。</string>
<string name="use_trackball">使用轨迹球</string> <string name="use_trackball">使用轨迹球</string>
<string name="background_service_wait_int_descr">设置每个背景位置固定所允许的最高等待时间。</string> <string name="background_service_wait_int_descr">设置每个背景位置固定所允许的最高等待时间。</string>
@ -2420,14 +2423,14 @@
<string name="shared_string_reload">重新载入</string> <string name="shared_string_reload">重新载入</string>
<string name="shared_string_reset">重置</string> <string name="shared_string_reset">重置</string>
<string name="store_tracks_in_monthly_directories">按月将记录的轨迹存放在文件夹中</string> <string name="store_tracks_in_monthly_directories">按月将记录的轨迹存放在文件夹中</string>
<string name="store_tracks_in_monthly_directories_descrp">按照月份将记录的轨迹存储在子文件夹中(例如 2017-01</string> <string name="store_tracks_in_monthly_directories_descrp">按照月份将记录的轨迹存储在子文件夹中(例如 2018-01</string>
<string name="mapillary_menu_descr_tile_cache">重新加载区片以查看最新的数据。</string> <string name="mapillary_menu_descr_tile_cache">重新加载区片以查看最新的数据。</string>
<string name="mapillary_menu_title_tile_cache">区片缓存</string> <string name="mapillary_menu_title_tile_cache">区片缓存</string>
<string name="average">平均</string> <string name="average">平均</string>
<string name="ascent_descent">升序/降序</string> <string name="ascent_descent">升序/降序</string>
<string name="max_min">最大/最小</string> <string name="max_min">最大/最小</string>
<string name="of">%2$d 中的 %1$d</string> <string name="of">%2$d 中的 %1$d</string>
<string name="moving_time">动时间</string> <string name="moving_time">动时间</string>
<string name="min_max">最小/最大</string> <string name="min_max">最小/最大</string>
<string name="quick_action_resume_pause_navigation">暂停/继续导航</string> <string name="quick_action_resume_pause_navigation">暂停/继续导航</string>
<string name="quick_action_resume_pause_navigation_descr">暂停或恢复导航的按钮。</string> <string name="quick_action_resume_pause_navigation_descr">暂停或恢复导航的按钮。</string>
@ -2478,8 +2481,8 @@
<string name="one_tap_active_descr">点击地图上的标记将其移动到活动标记的顶端, 而不打开上下文菜单。</string> <string name="one_tap_active_descr">点击地图上的标记将其移动到活动标记的顶端, 而不打开上下文菜单。</string>
<string name="one_tap_active">\'一个点击\'激活</string> <string name="one_tap_active">\'一个点击\'激活</string>
<string name="empty_state_av_notes">做注记!</string> <string name="empty_state_av_notes">做注记!</string>
<string name="empty_state_av_notes_desc">使用小部件或上下文菜单, 在地图上的每个点添加音频、视频或照片注释</string> <string name="empty_state_av_notes_desc">通过使用小部件或上下文菜单将音频、视频或照片注记添加到地图上的任何点</string>
<string name="notes_by_date">按日期说明</string> <string name="notes_by_date">按日期排序的视频或音频注记</string>
<string name="by_date">按日期</string> <string name="by_date">按日期</string>
<string name="by_type">按类型</string> <string name="by_type">按类型</string>
<string name="looking_for_tracks_with_waypoints">用航路点寻找轨迹</string> <string name="looking_for_tracks_with_waypoints">用航路点寻找轨迹</string>
@ -2501,7 +2504,7 @@
<string name="show_guide_line_descr">显示从你的位置到活动标记位置的方向线。</string> <string name="show_guide_line_descr">显示从你的位置到活动标记位置的方向线。</string>
<string name="show_arrows_descr">显示一个或两个箭头指示方向到活动标记。</string> <string name="show_arrows_descr">显示一个或两个箭头指示方向到活动标记。</string>
<string name="distance_indication_descr">选择如何显示到活动标记的距离。</string> <string name="distance_indication_descr">选择如何显示到活动标记的距离。</string>
<string name="active_markers_descr">选择想显示多少的方向指标</string> <string name="active_markers_descr">指定方向指示器的数量</string>
<string name="digits_quantity">小数位数</string> <string name="digits_quantity">小数位数</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>
@ -2514,7 +2517,7 @@
<string name="will_open_tomorrow_at">明日开始营业时间</string> <string name="will_open_tomorrow_at">明日开始营业时间</string>
<string name="rendering_attr_hidePOILabels_name">兴趣点POI标签</string> <string name="rendering_attr_hidePOILabels_name">兴趣点POI标签</string>
<string name="show_number_pad">显示数字盘</string> <string name="show_number_pad">显示数字盘</string>
<string name="switch_osm_notes_visibility_desc">在地图上显示/隐藏 OSM 注记。</string> <string name="switch_osm_notes_visibility_desc">在地图上显示隐藏 OSM 注记。</string>
<string name="gpx_file_desc">GPX - 适合导出到 JOSM 或其它 OSM 编辑器。</string> <string name="gpx_file_desc">GPX - 适合导出到 JOSM 或其它 OSM 编辑器。</string>
<string name="osc_file_desc">OSC - 适合导出到 OSM。</string> <string name="osc_file_desc">OSC - 适合导出到 OSM。</string>
<string name="shared_string_gpx_file">GPX 文件</string> <string name="shared_string_gpx_file">GPX 文件</string>
@ -2667,7 +2670,7 @@
<string name="quick_action_switch_night_mode">夜间模式</string> <string name="quick_action_switch_night_mode">夜间模式</string>
<string name="quick_action_day_night_switch_mode">切换日间/夜间模式</string> <string name="quick_action_day_night_switch_mode">切换日间/夜间模式</string>
<string name="download_wiki_region_placeholder">此地区</string> <string name="download_wiki_region_placeholder">此地区</string>
<string name="quick_action_edit_actions">编辑</string> <string name="quick_action_edit_actions">编辑动</string>
<string name="coord_input_save_as_track_descr">你增加了%1$s 个目标。输入文件名后点击\"保存\"。</string> <string name="coord_input_save_as_track_descr">你增加了%1$s 个目标。输入文件名后点击\"保存\"。</string>
<string name="ask_for_location_permission">请在允许OsmAnd获取定位信息后继续。</string> <string name="ask_for_location_permission">请在允许OsmAnd获取定位信息后继续。</string>
<string name="routeInfo_smoothness_name">平顺度</string> <string name="routeInfo_smoothness_name">平顺度</string>
@ -2724,7 +2727,7 @@
<string name="step_by_step">逐步</string> <string name="step_by_step">逐步</string>
<string name="routeInfo_road_types_name">道路类型</string> <string name="routeInfo_road_types_name">道路类型</string>
<string name="exit_at">退出于</string> <string name="exit_at">退出于</string>
<string name="quick_action_show_hide_gpx_tracks_descr">在地图中显示或隐藏已选中的GPX轨迹的按钮。</string> <string name="quick_action_show_hide_gpx_tracks_descr">在地图上显示或隐藏所选轨迹的按钮。</string>
<string name="add_destination_query">请先设置目的地</string> <string name="add_destination_query">请先设置目的地</string>
<string name="use_osm_live_public_transport_description">为OsmAnd Live启用公共交通的变更情况。</string> <string name="use_osm_live_public_transport_description">为OsmAnd Live启用公共交通的变更情况。</string>
<string name="add_start_and_end_points">添加出发地和目的地</string> <string name="add_start_and_end_points">添加出发地和目的地</string>
@ -2903,7 +2906,7 @@
<string name="search_poi_types">搜索兴趣点类型</string> <string name="search_poi_types">搜索兴趣点类型</string>
<string name="radius_ruler_item">半径尺</string> <string name="radius_ruler_item">半径尺</string>
<string name="subscription_osmandlive_item">订阅 - OsmAnd Live</string> <string name="subscription_osmandlive_item">订阅 - OsmAnd Live</string>
<string name="create_edit_poi">创建/编辑兴趣点</string> <string name="create_edit_poi">创建编辑兴趣点</string>
<string name="edit_online_source">编辑在线资源</string> <string name="edit_online_source">编辑在线资源</string>
<string name="mercator_projection">正轴等角圆柱投影</string> <string name="mercator_projection">正轴等角圆柱投影</string>
<string name="storage_format">储存格式</string> <string name="storage_format">储存格式</string>
@ -3538,4 +3541,92 @@
<string name="select_another_colorization">请选择另一种颜色。</string> <string name="select_another_colorization">请选择另一种颜色。</string>
<string name="delete_updates">删除更新</string> <string name="delete_updates">删除更新</string>
<string name="live_update_delete_updates_msg">您确认想要删除所有 %s 实时更新吗?</string> <string name="live_update_delete_updates_msg">您确认想要删除所有 %s 实时更新吗?</string>
<string name="keep_both_desc">导入的项目将添加前缀</string>
<string name="replace_all">全部替换</string>
<string name="recalc_angle_dialog_title">我的位置和路线之间的最小角度</string>
<string name="profile_type_custom_string">自定义配置文件</string>
<string name="shared_string_import_complete">导入完成</string>
<string name="items_added">已添加项目</string>
<string name="profile_backup_failed">无法备份配置文件。</string>
<string name="restore_all_profile_settings">恢复所有的配置文件设置?</string>
<string name="clear_recorded_data_warning">是否确定要清除录制的数据?</string>
<string name="shared_string_drawer">抽屉</string>
<string name="context_menu_actions">上下文菜单操作</string>
<string name="divider_descr">该点以下的元素用分隔线隔开。</string>
<string name="hidden_items_descr">这些项目从菜单中被隐藏,但所代表的选项或插件将继续工作。</string>
<string name="reset_items_descr">隐藏设置会将其重置为原始状态。</string>
<string name="main_actions_descr">只有四个按钮。</string>
<string name="main_actions">主要动作</string>
<string name="app_mode_ski_touring">滑雪旅游</string>
<string name="custom_osmand_plugin">自定义 OsmAnd 插件</string>
<string name="settings_item_read_error">无法从 \'%1$s\' 中读取。</string>
<string name="settings_item_write_error">无法写到 \'%1$s\'。</string>
<string name="settings_item_import_error">无法从 \'%1$s\' 导入。</string>
<string name="select_track_file">选择轨迹文件</string>
<string name="wiki_menu_download_descr">需要其他地图才能在地图上查看维基百科兴趣点。</string>
<string name="quick_action_switch_profile_descr">操作按钮在选定的配置文件之间切换。</string>
<string name="sett_parrot_ext_input">Parrot</string>
<string name="sett_wunderlinq_ext_input">WunderLINQ</string>
<string name="external_input_device">外部输入设备</string>
<string name="sort_by_category">按类别排序</string>
<string name="navigate_point_mgrs">MGRS</string>
<string name="lang_oc">奥克西坦语</string>
<string name="simulate_your_location_gpx_descr">使用录制的 GPX 轨迹模拟你的位置。</string>
<string name="osm_recipient_stat">编辑 %1$s总计 %2$s mBTC</string>
<string name="choose_navigation_type">选择导航配置文件</string>
<string name="keep_showing_on_map">继续在地图上显示</string>
<string name="show_direction">距离指示</string>
<string name="passed">最后使用:%1$s</string>
<string name="show_arrows_on_the_map">在地图上显示箭头</string>
<string name="show_guide_line">显示方向线</string>
<string name="move_to_history">移动到历史</string>
<string name="plan_route_no_markers_toast">你必须至少添加一个标记才能使用此功能。</string>
<string name="import_as_favorites">导入为收藏</string>
<string name="first_intermediate_dest_description">添加始发站</string>
<string name="waypoints_removed_from_map_markers">从地图标记中删除的航点</string>
<string name="use_two_digits_longitude">使用两位数的经度</string>
<string name="wikivoyage_search_hint">搜索国家、城市或省份</string>
<string name="delete_search_history">删除搜索历史记录</string>
<string name="online_webpage_warning">页面仅在线提供。在网页浏览器中打开?</string>
<string name="select_travel_book">选择一本旅游书籍</string>
<string name="shared_string_wifi_only">仅在 Wi-Fi 上</string>
<string name="shared_string_only_with_wifi">仅在 Wi-Fi 上</string>
<string name="purchase_dialog_subtitle">选择合适的项目</string>
<string name="purchase_dialog_travel_description">购买以下其中一项,即可获得离线旅游指南功能:</string>
<string name="unlock_all_features">解锁所有 OsmAnd 功能</string>
<string name="contour_lines_hillshade_maps">等高线和山体阴影地图</string>
<string name="daily_map_updates">每小时更新地图</string>
<string name="monthly_map_updates">每月更新地图</string>
<string name="welcome_to_open_beta">欢迎使用公开测试版</string>
<string name="start_editing_card_image_text">任何人都可以编辑的自由的全球旅游指南。</string>
<string name="travel_card_download_descr">下载 Wikivoyage 旅行指南,在没有连接到互联网的情况下查看世界各地的文章。</string>
<string name="mapnik_render_descr">旧的默认 \'Mapnik\' 风格。与 \'Mapnik\' 颜色相似。</string>
<string name="keep_passed_markers">在地图上保留已通过的标记</string>
<string name="choose_track_file_to_follow">选择要跟随的轨迹文件</string>
<string name="rendering_attr_highway_class_state_road_name">国道</string>
<string name="application_profiles_descr">选择要在应用程序中可见的配置文件。</string>
<string name="routing_profile_broutrer">BRouter离线</string>
<string name="base_profile_descr_boat">船、划船、帆船</string>
<string name="base_profile_descr_pedestrian">散步、徒步、跑步</string>
<string name="base_profile_descr_bicycle">山地自行车、轻便摩托车、马</string>
<string name="base_profile_descr_car">汽车、卡车、摩托车</string>
<string name="select_nav_profile_dialog_title">选择导航类型</string>
<string name="select_base_profile_dialog_message">基于你的自定义配置文件的默认应用程序配置文件之一,这定义了基本的设置,如部件的默认可见性和速度和距离的单位。这些是默认的应用程序配置文件,以及它们可以扩展到的自定义配置文件的例子:</string>
<string name="select_base_profile_dialog_title">选择用以开始的配置文件</string>
<string name="profile_alert_delete_msg">是否确定要删除“%s”配置文件</string>
<string name="profile_alert_need_save_msg">首先保存配置文件的更改</string>
<string name="profile_alert_cant_delete_base">你不能删除 OsmAnd 的基本配置文件</string>
<string name="profile_alert_duplicate_name_msg">已经有该名称的配置文件</string>
<string name="profile_alert_need_profile_name_msg">你必须先指定一个配置文件名称。</string>
<string name="profile_alert_need_profile_name_title">输入配置文件名称</string>
<string name="profile_alert_need_routing_type_msg">请为新应用配置文件选择导航类型</string>
<string name="profile_alert_need_routing_type_title">选择导航类型</string>
<string name="settings_derived_routing_mode_string">用户模式,派生自: %s</string>
<string name="show_compass_ruler">显示指南针标尺</string>
<string name="settings_privacy_and_security_desc">选择你分享的数据</string>
<string name="privacy_and_security_change_descr">如果同意我们的%1$s请点击“允许”</string>
<string name="visited_screens_collect_descr">帮助我们了解 OsmAnd 功能的受欢迎程度。</string>
<string name="downloaded_maps_collect_descr">帮助我们了解国家和地区地图的受欢迎程度。</string>
<string name="collected_data_descr">定义允许 OsmAnd 分享哪些数据。</string>
<string name="choose_data_to_share">选择要分享的数据类型:</string>
</resources> </resources>

View file

@ -4038,4 +4038,7 @@
<string name="select_another_colorization">請選擇另一種顏色。</string> <string name="select_another_colorization">請選擇另一種顏色。</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">隱藏自然保留區、保護區與國家公園界線</string> <string name="rendering_attr_noNatureReserveBoundaries_description">隱藏自然保留區、保護區與國家公園界線</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">自然界線</string> <string name="rendering_attr_noNatureReserveBoundaries_name">自然界線</string>
<string name="trip_recording_logging_interval_info">紀錄間隔設定的時段OsmAnd 將會要求目前位置的位置資料。</string>
<string name="trip_recording_save_and_continue">儲存並繼續</string>
<string name="lost_data_warning">所有未儲存的資料都將會遺失。</string>
</resources> </resources>

View file

@ -16,6 +16,11 @@
<string name="route_line_use_map_style_appearance">Route line would be use %1$s specified on selected map style: %2$s.</string> <string name="route_line_use_map_style_appearance">Route line would be use %1$s specified on selected map style: %2$s.</string>
<string name="shared_string_route_line">Route line</string> <string name="shared_string_route_line">Route line</string>
<string name="customize_route_line">Customize route line</string> <string name="customize_route_line">Customize route line</string>
<string name="trip_recording_show_start_dialog_setting">If disabled, recording will start right after tap on the widget or menu item, skipping the confirmation dialog.</string>
<string name="show_start_dialog">Show start dialog</string>
<string name="lost_data_warning">All unsaved data will be lost.</string>
<string name="trip_recording_save_and_continue">Save and continue</string>
<string name="trip_recording_logging_interval_info">Logging interval set time period in which OsmAnd will ask for the current location position data.</string>
<string name="select_another_colorization">Please select another type of colorization.</string> <string name="select_another_colorization">Please select another type of colorization.</string>
<string name="track_has_no_speed">The track does not contain speed data.</string> <string name="track_has_no_speed">The track does not contain speed data.</string>
<string name="track_has_no_altitude">The track does not contain altitude data.</string> <string name="track_has_no_altitude">The track does not contain altitude data.</string>

View file

@ -4,6 +4,14 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:title="@string/monitoring_settings"> android:title="@string/monitoring_settings">
<net.osmand.plus.settings.preferences.SwitchPreferenceEx
android:key="show_trip_recording_start_dialog"
android:layout="@layout/preference_with_descr_dialog_and_switch"
android:summaryOff="@string/shared_string_disabled"
android:summaryOn="@string/shared_string_enabled"
android:title="@string/show_start_dialog"
tools:icon="@drawable/ic_action_dialog" />
<PreferenceCategory <PreferenceCategory
android:key="navigation" android:key="navigation"
android:layout="@layout/preference_category_with_descr" android:layout="@layout/preference_category_with_descr"
@ -36,8 +44,8 @@
<net.osmand.plus.settings.preferences.ListPreferenceEx <net.osmand.plus.settings.preferences.ListPreferenceEx
android:key="save_global_track_interval" android:key="save_global_track_interval"
android:layout="@layout/preference_with_descr" android:layout="@layout/preference_with_descr"
android:title="@string/save_global_track_interval"
android:persistent="false" android:persistent="false"
android:title="@string/save_global_track_interval"
tools:icon="@drawable/ic_action_time_span" tools:icon="@drawable/ic_action_time_span"
tools:summary="3 seconds" /> tools:summary="3 seconds" />

View file

@ -93,7 +93,6 @@ import net.osmand.plus.importfiles.ImportHelper;
import net.osmand.plus.mapcontextmenu.AdditionalActionsBottomSheetDialogFragment; import net.osmand.plus.mapcontextmenu.AdditionalActionsBottomSheetDialogFragment;
import net.osmand.plus.mapcontextmenu.MapContextMenu; import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.mapcontextmenu.builders.cards.dialogs.ContextMenuCardDialogFragment; import net.osmand.plus.mapcontextmenu.builders.cards.dialogs.ContextMenuCardDialogFragment;
import net.osmand.plus.mapcontextmenu.editors.SelectFavoriteCategoryBottomSheet;
import net.osmand.plus.mapcontextmenu.other.DestinationReachedMenu; import net.osmand.plus.mapcontextmenu.other.DestinationReachedMenu;
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu; import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu;
import net.osmand.plus.mapmarkers.MapMarker; import net.osmand.plus.mapmarkers.MapMarker;
@ -105,7 +104,7 @@ import net.osmand.plus.measurementtool.LoginBottomSheetFragment;
import net.osmand.plus.measurementtool.MeasurementEditingContext; import net.osmand.plus.measurementtool.MeasurementEditingContext;
import net.osmand.plus.measurementtool.MeasurementToolFragment; import net.osmand.plus.measurementtool.MeasurementToolFragment;
import net.osmand.plus.measurementtool.SnapTrackWarningFragment; import net.osmand.plus.measurementtool.SnapTrackWarningFragment;
import net.osmand.plus.monitoring.TripRecordingBottomSheet; import net.osmand.plus.monitoring.TripRecordingStartingBottomSheet;
import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.render.RendererRegistry;
import net.osmand.plus.resources.ResourceManager; import net.osmand.plus.resources.ResourceManager;
import net.osmand.plus.routepreparationmenu.ChooseRouteFragment; import net.osmand.plus.routepreparationmenu.ChooseRouteFragment;
@ -2243,8 +2242,8 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
return getFragment(MeasurementToolFragment.TAG); return getFragment(MeasurementToolFragment.TAG);
} }
public TripRecordingBottomSheet getTripRecordingBottomSheet() { public TripRecordingStartingBottomSheet getTripRecordingBottomSheet() {
return getFragment(TripRecordingBottomSheet.TAG); return getFragment(TripRecordingStartingBottomSheet.TAG);
} }
public ChooseRouteFragment getChooseRouteFragment() { public ChooseRouteFragment getChooseRouteFragment() {

View file

@ -62,8 +62,8 @@ import net.osmand.plus.mapmarkers.MarkersPlanRouteContext;
import net.osmand.plus.measurementtool.MeasurementToolFragment; import net.osmand.plus.measurementtool.MeasurementToolFragment;
import net.osmand.plus.measurementtool.StartPlanRouteBottomSheet; import net.osmand.plus.measurementtool.StartPlanRouteBottomSheet;
import net.osmand.plus.monitoring.OsmandMonitoringPlugin; import net.osmand.plus.monitoring.OsmandMonitoringPlugin;
import net.osmand.plus.monitoring.TripRecordingActiveBottomSheet;
import net.osmand.plus.monitoring.TripRecordingBottomSheet; import net.osmand.plus.monitoring.TripRecordingBottomSheet;
import net.osmand.plus.monitoring.TripRecordingStartingBottomSheet;
import net.osmand.plus.osmedit.dialogs.DismissRouteBottomSheetFragment; import net.osmand.plus.osmedit.dialogs.DismissRouteBottomSheetFragment;
import net.osmand.plus.profiles.ProfileDataObject; import net.osmand.plus.profiles.ProfileDataObject;
import net.osmand.plus.profiles.ProfileDataUtils; import net.osmand.plus.profiles.ProfileDataUtils;
@ -854,9 +854,9 @@ public class MapActivityActions implements DialogProvider {
app.logEvent("trip_recording_open"); app.logEvent("trip_recording_open");
MapActivity.clearPrevActivityIntent(); MapActivity.clearPrevActivityIntent();
if (monitoringPlugin.hasDataToSave() || monitoringPlugin.wasTrackMonitored()) { if (monitoringPlugin.hasDataToSave() || monitoringPlugin.wasTrackMonitored()) {
TripRecordingActiveBottomSheet.showInstance(mapActivity.getSupportFragmentManager(), monitoringPlugin.getCurrentTrack());
} else {
TripRecordingBottomSheet.showInstance(mapActivity.getSupportFragmentManager()); TripRecordingBottomSheet.showInstance(mapActivity.getSupportFragmentManager());
} else {
TripRecordingStartingBottomSheet.showTripRecordingDialog(mapActivity.getSupportFragmentManager(), app);
} }
return true; return true;
} }

View file

@ -139,7 +139,7 @@ public class PluginInfoFragment extends BaseOsmAndFragment implements PluginStat
if (settingsScreenType != null) { if (settingsScreenType != null) {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putBoolean(PLUGIN_INFO, true); args.putBoolean(PLUGIN_INFO, true);
BaseSettingsFragment.showInstance(activity, settingsScreenType, null, args); BaseSettingsFragment.showInstance(activity, settingsScreenType, null, args, null);
} }
} }
} }

View file

@ -317,7 +317,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
} }
} }
private String formatDateTime(Context ctx, long dateTime) { public static String formatDateTime(Context ctx, long dateTime) {
DateFormat dateFormat = android.text.format.DateFormat.getMediumDateFormat(ctx); DateFormat dateFormat = android.text.format.DateFormat.getMediumDateFormat(ctx);
DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(ctx); DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(ctx);
return dateFormat.format(dateTime) + " " + timeFormat.format(dateTime); return dateFormat.format(dateTime) + " " + timeFormat.format(dateTime);

View file

@ -49,7 +49,7 @@ public class SimpleBottomSheetItem extends BaseBottomSheetItem {
} }
public void setTitle(String title) { public void setTitle(CharSequence title) {
this.title = title; this.title = title;
titleTv.setText(title); titleTv.setText(title);
} }

View file

@ -85,9 +85,9 @@ import static net.osmand.plus.liveupdates.LiveUpdatesHelper.preferenceUpdateFreq
import static net.osmand.plus.liveupdates.LiveUpdatesHelper.runLiveUpdate; import static net.osmand.plus.liveupdates.LiveUpdatesHelper.runLiveUpdate;
import static net.osmand.plus.liveupdates.LiveUpdatesHelper.setAlarmForPendingIntent; import static net.osmand.plus.liveupdates.LiveUpdatesHelper.setAlarmForPendingIntent;
import static net.osmand.plus.liveupdates.LiveUpdatesSettingsDialogFragmentNew.getTertiaryTextColorId; import static net.osmand.plus.liveupdates.LiveUpdatesSettingsDialogFragmentNew.getTertiaryTextColorId;
import static net.osmand.plus.monitoring.TripRecordingActiveBottomSheet.getActiveTextColorId; import static net.osmand.plus.monitoring.TripRecordingBottomSheet.getActiveTextColorId;
import static net.osmand.plus.monitoring.TripRecordingActiveBottomSheet.getOsmandIconColorId; import static net.osmand.plus.monitoring.TripRecordingBottomSheet.getOsmandIconColorId;
import static net.osmand.plus.monitoring.TripRecordingActiveBottomSheet.getSecondaryIconColorId; import static net.osmand.plus.monitoring.TripRecordingBottomSheet.getSecondaryIconColorId;
public class LiveUpdatesFragmentNew extends BaseOsmAndDialogFragment implements OnLiveUpdatesForLocalChange { public class LiveUpdatesFragmentNew extends BaseOsmAndDialogFragment implements OnLiveUpdatesForLocalChange {

View file

@ -20,15 +20,16 @@ import net.osmand.data.FavouritePoint.BackgroundType;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.data.WptLocationPoint; import net.osmand.data.WptLocationPoint;
import net.osmand.plus.GpxSelectionHelper; import net.osmand.plus.GpxSelectionHelper;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.UiUtilities; import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.SavingTrackHelper; import net.osmand.plus.activities.SavingTrackHelper;
import net.osmand.plus.base.PointImageDrawable; import net.osmand.plus.base.PointImageDrawable;
import net.osmand.plus.itinerary.ItineraryGroup;
import net.osmand.plus.mapcontextmenu.MapContextMenu; import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.mapcontextmenu.editors.WptPtEditor.OnDismissListener; import net.osmand.plus.mapcontextmenu.editors.WptPtEditor.OnDismissListener;
import net.osmand.plus.itinerary.ItineraryGroup;
import net.osmand.plus.track.SaveGpxAsyncTask; import net.osmand.plus.track.SaveGpxAsyncTask;
import net.osmand.plus.track.SaveGpxAsyncTask.SaveGpxListener; import net.osmand.plus.track.SaveGpxAsyncTask.SaveGpxListener;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
@ -213,6 +214,7 @@ public class WptPtEditorFragmentNew extends PointEditorFragmentNew {
String description = Algorithms.isEmpty(getDescriptionTextValue()) ? null : getDescriptionTextValue(); String description = Algorithms.isEmpty(getDescriptionTextValue()) ? null : getDescriptionTextValue();
if (editor.isNew()) { if (editor.isNew()) {
doAddWpt(name, category, description); doAddWpt(name, category, description);
wpt = getWpt();
} else { } else {
doUpdateWpt(name, category, description); doUpdateWpt(name, category, description);
} }
@ -222,7 +224,7 @@ public class WptPtEditorFragmentNew extends PointEditorFragmentNew {
} }
MapContextMenu menu = mapActivity.getContextMenu(); MapContextMenu menu = mapActivity.getContextMenu();
if (menu.getLatLon() != null && menu.isActive()) { if (menu.getLatLon() != null && menu.isActive() && wpt != null) {
LatLon latLon = new LatLon(wpt.getLatitude(), wpt.getLongitude()); LatLon latLon = new LatLon(wpt.getLatitude(), wpt.getLongitude());
if (menu.getLatLon().equals(latLon)) { if (menu.getLatLon().equals(latLon)) {
menu.update(latLon, new WptLocationPoint(wpt).getPointDescription(mapActivity), wpt); menu.update(latLon, new WptLocationPoint(wpt).getPointDescription(mapActivity), wpt);
@ -402,7 +404,9 @@ public class WptPtEditorFragmentNew extends PointEditorFragmentNew {
} }
@Override @Override
public String getAddressInitValue() { return ""; } public String getAddressInitValue() {
return "";
}
@Override @Override
public Drawable getNameIcon() { public Drawable getNameIcon() {
@ -480,6 +484,25 @@ public class WptPtEditorFragmentNew extends PointEditorFragmentNew {
return 0; return 0;
} }
@Override
protected boolean isCategoryVisible(String name) {
WptPtEditor editor = getWptPtEditor();
if (selectedGpxHelper == null || editor == null || editor.getGpxFile() == null) {
return true;
}
SelectedGpxFile selectedGpxFile;
if (editor.getGpxFile().showCurrentTrack) {
selectedGpxFile = app.getSavingTrackHelper().getCurrentTrack();
} else {
selectedGpxFile = selectedGpxHelper.getSelectedFileByPath(editor.getGpxFile().path);
}
if (selectedGpxFile != null) {
Set<String> hiddenGroups = selectedGpxFile.getHiddenGroups();
return !hiddenGroups.contains(name);
}
return true;
}
private void saveGpx(final OsmandApplication app, final GPXFile gpxFile, final boolean gpxSelected) { private void saveGpx(final OsmandApplication app, final GPXFile gpxFile, final boolean gpxSelected) {
new SaveGpxAsyncTask(new File(gpxFile.path), gpxFile, new SaveGpxListener() { new SaveGpxAsyncTask(new File(gpxFile.path), gpxFile, new SaveGpxListener() {
@Override @Override

View file

@ -8,6 +8,7 @@ import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.ScrollView;
import androidx.activity.OnBackPressedCallback; import androidx.activity.OnBackPressedCallback;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -175,6 +176,18 @@ public class GpxApproximationFragment extends ContextMenuScrollFragment
calculateGpxApproximation(true); calculateGpxApproximation(true);
final ScrollView profileView = (ScrollView) getBottomScrollView();
profileView.postDelayed(new Runnable() {
@Override
public void run() {
View view = profileView.findViewWithTag(snapToRoadAppMode.getStringKey());
if (view != null) {
int headerHeight = getResources().getDimensionPixelSize(R.dimen.measurement_tool_button_height);
profileView.scrollTo(0, view.getTop() + headerHeight);
}
}
}, 100);
return mainView; return mainView;
} }

View file

@ -136,6 +136,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
private ImageView mainIcon; private ImageView mainIcon;
private String fileName; private String fileName;
private OnBackPressedCallback onBackPressedCallback; private OnBackPressedCallback onBackPressedCallback;
private boolean showSnapWarning;
private InfoType currentInfoType; private InfoType currentInfoType;
@ -239,6 +240,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
if (mapActivity == null) { if (mapActivity == null) {
return null; return null;
} }
final MeasurementToolLayer measurementLayer = mapActivity.getMapLayers().getMeasurementToolLayer(); final MeasurementToolLayer measurementLayer = mapActivity.getMapLayers().getMeasurementToolLayer();
final OsmandApplication app = mapActivity.getMyApplication(); final OsmandApplication app = mapActivity.getMyApplication();
@ -363,7 +365,6 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
} }
}); });
View applyPointBeforeAfterButton = mainView.findViewById(R.id.apply_point_before_after_point_button); View applyPointBeforeAfterButton = mainView.findViewById(R.id.apply_point_before_after_point_button);
UiUtilities.setupDialogButton(nightMode, applyPointBeforeAfterButton, UiUtilities.setupDialogButton(nightMode, applyPointBeforeAfterButton,
UiUtilities.DialogButtonType.PRIMARY, R.string.shared_string_apply); UiUtilities.DialogButtonType.PRIMARY, R.string.shared_string_apply);
@ -568,11 +569,10 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
}); });
initMeasurementMode(gpxData, savedInstanceState == null); initMeasurementMode(gpxData, savedInstanceState == null);
if (savedInstanceState == null) { if (savedInstanceState == null) {
if (fileName != null) { if (fileName != null) {
addNewGpxData(getGpxFile(fileName)); addNewGpxData(getGpxFile(fileName));
} else if (editingCtx.isApproximationNeeded() && isFollowTrackMode()) { } else if (editingCtx.isApproximationNeeded() && isFollowTrackMode() && isShowSnapWarning()) {
enterApproximationMode(mapActivity); enterApproximationMode(mapActivity);
} }
} else { } else {
@ -717,6 +717,15 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
this.fileName = fileName; this.fileName = fileName;
} }
public boolean isShowSnapWarning() {
return this.showSnapWarning;
}
public void setShowSnapWarning(boolean showSnapWarning) {
this.showSnapWarning = showSnapWarning;
}
public MeasurementEditingContext getEditingCtx() { public MeasurementEditingContext getEditingCtx() {
return editingCtx; return editingCtx;
} }
@ -2009,10 +2018,11 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
} }
public static boolean showInstance(FragmentManager fragmentManager, MeasurementEditingContext editingCtx, public static boolean showInstance(FragmentManager fragmentManager, MeasurementEditingContext editingCtx,
boolean followTrackMode) { boolean followTrackMode, boolean showSnapWarning) {
MeasurementToolFragment fragment = new MeasurementToolFragment(); MeasurementToolFragment fragment = new MeasurementToolFragment();
fragment.setEditingCtx(editingCtx); fragment.setEditingCtx(editingCtx);
fragment.setMode(FOLLOW_TRACK_MODE, followTrackMode); fragment.setMode(FOLLOW_TRACK_MODE, followTrackMode);
fragment.setShowSnapWarning(showSnapWarning);
return showFragment(fragment, fragmentManager); return showFragment(fragment, fragmentManager);
} }
@ -2180,4 +2190,5 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
public interface OnUpdateInfoListener { public interface OnUpdateInfoListener {
void onUpdateInfo(); void onUpdateInfo();
} }
} }

View file

@ -9,25 +9,27 @@ import android.text.SpannableStringBuilder;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference; import androidx.preference.Preference;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmAndAppCustomization;
import net.osmand.plus.OsmandPlugin; import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.helpers.FontCache; import net.osmand.plus.helpers.FontCache;
import net.osmand.plus.myplaces.FavoritesActivity; import net.osmand.plus.myplaces.FavoritesActivity;
import net.osmand.plus.profiles.SelectCopyAppModeBottomSheet; import net.osmand.plus.profiles.SelectCopyAppModeBottomSheet;
import net.osmand.plus.profiles.SelectCopyAppModeBottomSheet.CopyAppModePrefsListener; import net.osmand.plus.profiles.SelectCopyAppModeBottomSheet.CopyAppModePrefsListener;
import net.osmand.plus.settings.fragments.BaseSettingsFragment; import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmAndAppCustomization;
import net.osmand.plus.settings.backend.OsmandPreference;
import net.osmand.plus.settings.bottomsheets.ResetProfilePrefsBottomSheet; import net.osmand.plus.settings.bottomsheets.ResetProfilePrefsBottomSheet;
import net.osmand.plus.settings.bottomsheets.ResetProfilePrefsBottomSheet.ResetAppModePrefsListener; import net.osmand.plus.settings.bottomsheets.ResetProfilePrefsBottomSheet.ResetAppModePrefsListener;
import net.osmand.plus.settings.bottomsheets.SingleSelectPreferenceBottomSheet; import net.osmand.plus.settings.bottomsheets.SingleSelectPreferenceBottomSheet;
import net.osmand.plus.settings.fragments.BaseSettingsFragment;
import net.osmand.plus.settings.preferences.ListPreferenceEx; import net.osmand.plus.settings.preferences.ListPreferenceEx;
import net.osmand.plus.settings.preferences.SwitchPreferenceEx; import net.osmand.plus.settings.preferences.SwitchPreferenceEx;
import net.osmand.plus.widgets.style.CustomTypefaceSpan; import net.osmand.plus.widgets.style.CustomTypefaceSpan;
@ -36,11 +38,11 @@ import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import static net.osmand.plus.activities.PluginInfoFragment.PLUGIN_INFO; import static net.osmand.plus.activities.PluginInfoFragment.PLUGIN_INFO;
import static net.osmand.plus.settings.backend.OsmandSettings.MONTHLY_DIRECTORY;
import static net.osmand.plus.settings.backend.OsmandSettings.REC_DIRECTORY;
import static net.osmand.plus.monitoring.OsmandMonitoringPlugin.MINUTES; import static net.osmand.plus.monitoring.OsmandMonitoringPlugin.MINUTES;
import static net.osmand.plus.monitoring.OsmandMonitoringPlugin.SECONDS; import static net.osmand.plus.monitoring.OsmandMonitoringPlugin.SECONDS;
import static net.osmand.plus.myplaces.FavoritesActivity.TAB_ID; import static net.osmand.plus.myplaces.FavoritesActivity.TAB_ID;
import static net.osmand.plus.settings.backend.OsmandSettings.MONTHLY_DIRECTORY;
import static net.osmand.plus.settings.backend.OsmandSettings.REC_DIRECTORY;
public class MonitoringSettingsFragment extends BaseSettingsFragment public class MonitoringSettingsFragment extends BaseSettingsFragment
implements CopyAppModePrefsListener, ResetAppModePrefsListener { implements CopyAppModePrefsListener, ResetAppModePrefsListener {
@ -81,6 +83,8 @@ public class MonitoringSettingsFragment extends BaseSettingsFragment
@Override @Override
protected void setupPreferences() { protected void setupPreferences() {
setupShowStartDialog();
setupSaveTrackToGpxPref(); setupSaveTrackToGpxPref();
setupSaveTrackIntervalPref(); setupSaveTrackIntervalPref();
@ -103,6 +107,12 @@ public class MonitoringSettingsFragment extends BaseSettingsFragment
setupResetToDefaultPref(); setupResetToDefaultPref();
} }
private void setupShowStartDialog() {
SwitchPreferenceEx showStartDialog = (SwitchPreferenceEx) findPreference(settings.SHOW_TRIP_REC_START_DIALOG.getId());
showStartDialog.setDescription(getString(R.string.trip_recording_show_start_dialog_setting));
showStartDialog.setIcon(getPersistentPrefIcon(R.drawable.ic_action_dialog));
}
private void setupSaveTrackToGpxPref() { private void setupSaveTrackToGpxPref() {
SwitchPreferenceEx saveTrackToGpx = (SwitchPreferenceEx) findPreference(settings.SAVE_TRACK_TO_GPX.getId()); SwitchPreferenceEx saveTrackToGpx = (SwitchPreferenceEx) findPreference(settings.SAVE_TRACK_TO_GPX.getId());
saveTrackToGpx.setDescription(getString(R.string.save_track_to_gpx_descrp)); saveTrackToGpx.setDescription(getString(R.string.save_track_to_gpx_descrp));
@ -110,7 +120,7 @@ public class MonitoringSettingsFragment extends BaseSettingsFragment
} }
private void setupSaveTrackIntervalPref() { private void setupSaveTrackIntervalPref() {
HashMap<Object, String> entry = getTimeValues(false); HashMap<Object, String> entry = getTimeValues();
ListPreferenceEx saveTrackInterval = (ListPreferenceEx) findPreference(settings.SAVE_TRACK_INTERVAL.getId()); ListPreferenceEx saveTrackInterval = (ListPreferenceEx) findPreference(settings.SAVE_TRACK_INTERVAL.getId());
saveTrackInterval.setEntries(entry.values().toArray(new String[0])); saveTrackInterval.setEntries(entry.values().toArray(new String[0]));
saveTrackInterval.setEntryValues(entry.keySet().toArray()); saveTrackInterval.setEntryValues(entry.keySet().toArray());
@ -119,25 +129,18 @@ public class MonitoringSettingsFragment extends BaseSettingsFragment
} }
private void setupSaveGlobalTrackIntervalPref() { private void setupSaveGlobalTrackIntervalPref() {
HashMap<Object, String> entry = getTimeValues(true); HashMap<Object, String> entry = getTimeValues();
ListPreferenceEx saveTrackInterval = (ListPreferenceEx) findPreference(settings.SAVE_GLOBAL_TRACK_INTERVAL.getId()); ListPreferenceEx saveTrackInterval = (ListPreferenceEx) findPreference(settings.SAVE_GLOBAL_TRACK_INTERVAL.getId());
saveTrackInterval.setEntries(entry.values().toArray(new String[0])); saveTrackInterval.setEntries(entry.values().toArray(new String[0]));
saveTrackInterval.setEntryValues(entry.keySet().toArray()); saveTrackInterval.setEntryValues(entry.keySet().toArray());
ApplicationMode selectedAppMode = getSelectedAppMode(); ApplicationMode selectedAppMode = getSelectedAppMode();
if (!settings.SAVE_GLOBAL_TRACK_REMEMBER.getModeValue(selectedAppMode)) { saveTrackInterval.setValue(settings.SAVE_GLOBAL_TRACK_INTERVAL.getModeValue(selectedAppMode));
saveTrackInterval.setValue(settings.SAVE_GLOBAL_TRACK_REMEMBER.getModeValue(selectedAppMode));
} else {
saveTrackInterval.setValue(settings.SAVE_GLOBAL_TRACK_INTERVAL.getModeValue(selectedAppMode));
}
saveTrackInterval.setIcon(getActiveIcon(R.drawable.ic_action_time_span)); saveTrackInterval.setIcon(getActiveIcon(R.drawable.ic_action_time_span));
saveTrackInterval.setDescription(R.string.save_global_track_interval_descr); saveTrackInterval.setDescription(R.string.save_global_track_interval_descr);
} }
private HashMap<Object, String> getTimeValues(boolean alwaysAskEntry) { private HashMap<Object, String> getTimeValues() {
HashMap<Object, String> entry = new LinkedHashMap<>(); HashMap<Object, String> entry = new LinkedHashMap<>();
if (alwaysAskEntry) {
entry.put(settings.SAVE_GLOBAL_TRACK_REMEMBER.getModeValue(getSelectedAppMode()), getString(R.string.confirm_every_run));
}
for (int second : SECONDS) { for (int second : SECONDS) {
entry.put(second * 1000, second + " " + getString(R.string.int_seconds)); entry.put(second * 1000, second + " " + getString(R.string.int_seconds));
} }
@ -292,6 +295,18 @@ public class MonitoringSettingsFragment extends BaseSettingsFragment
resetToDefault.setIcon(getActiveIcon(R.drawable.ic_action_reset_to_default_dark)); resetToDefault.setIcon(getActiveIcon(R.drawable.ic_action_reset_to_default_dark));
} }
@Override
public void onDestroy() {
FragmentActivity activity = getActivity();
if (activity != null && !activity.isChangingConfigurations()) {
Fragment target = getTargetFragment();
if (target instanceof TripRecordingStartingBottomSheet) {
((TripRecordingStartingBottomSheet) target).show();
}
}
super.onDestroy();
}
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
String prefId = preference.getKey(); String prefId = preference.getKey();

View file

@ -25,6 +25,7 @@ import com.google.android.material.slider.Slider;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.Location; import net.osmand.Location;
import net.osmand.PlatformUtil;
import net.osmand.ValueHolder; import net.osmand.ValueHolder;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.NavigationService; import net.osmand.plus.NavigationService;
@ -41,19 +42,25 @@ import net.osmand.plus.dashboard.tools.DashFragmentData;
import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType; import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType;
import net.osmand.plus.track.TrackMenuFragment;
import net.osmand.plus.views.OsmandMapLayer.DrawSettings; import net.osmand.plus.views.OsmandMapLayer.DrawSettings;
import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.layers.MapInfoLayer; import net.osmand.plus.views.layers.MapInfoLayer;
import net.osmand.plus.views.mapwidgets.widgets.TextInfoWidget; import net.osmand.plus.views.mapwidgets.widgets.TextInfoWidget;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
import java.io.File;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.Collections;
import java.util.List; import java.util.List;
import static net.osmand.plus.UiUtilities.CompoundButtonType.PROFILE_DEPENDENT; import static net.osmand.plus.UiUtilities.CompoundButtonType.PROFILE_DEPENDENT;
public class OsmandMonitoringPlugin extends OsmandPlugin { public class OsmandMonitoringPlugin extends OsmandPlugin {
private static final Log LOG = PlatformUtil.getLog(OsmandMonitoringPlugin.class);
public static final String ID = "osmand.monitoring"; public static final String ID = "osmand.monitoring";
public final static String OSMAND_SAVE_SERVICE_ACTION = "OSMAND_SAVE_SERVICE_ACTION"; public final static String OSMAND_SAVE_SERVICE_ACTION = "OSMAND_SAVE_SERVICE_ACTION";
public static final int REQUEST_LOCATION_PERMISSION_FOR_GPX_RECORDING = 208; public static final int REQUEST_LOCATION_PERMISSION_FOR_GPX_RECORDING = 208;
@ -79,6 +86,7 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
pluginPreferences.add(settings.DISABLE_RECORDING_ONCE_APP_KILLED); pluginPreferences.add(settings.DISABLE_RECORDING_ONCE_APP_KILLED);
pluginPreferences.add(settings.SAVE_HEADING_TO_GPX); pluginPreferences.add(settings.SAVE_HEADING_TO_GPX);
pluginPreferences.add(settings.SHOW_TRIP_REC_NOTIFICATION); pluginPreferences.add(settings.SHOW_TRIP_REC_NOTIFICATION);
pluginPreferences.add(settings.SHOW_TRIP_REC_START_DIALOG);
pluginPreferences.add(settings.TRACK_STORAGE_DIRECTORY); pluginPreferences.add(settings.TRACK_STORAGE_DIRECTORY);
pluginPreferences.add(settings.LIVE_MONITORING); pluginPreferences.add(settings.LIVE_MONITORING);
pluginPreferences.add(settings.LIVE_MONITORING_URL); pluginPreferences.add(settings.LIVE_MONITORING_URL);
@ -329,9 +337,9 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
public void controlDialog(final Activity activity, final boolean showTrackSelection) { public void controlDialog(final Activity activity, final boolean showTrackSelection) {
FragmentManager fragmentManager = ((FragmentActivity) activity).getSupportFragmentManager(); FragmentManager fragmentManager = ((FragmentActivity) activity).getSupportFragmentManager();
if (hasDataToSave() || wasTrackMonitored()) { if (hasDataToSave() || wasTrackMonitored()) {
TripRecordingActiveBottomSheet.showInstance(fragmentManager, getCurrentTrack());
} else {
TripRecordingBottomSheet.showInstance(fragmentManager); TripRecordingBottomSheet.showInstance(fragmentManager);
} else {
TripRecordingStartingBottomSheet.showTripRecordingDialog(fragmentManager, app);
} }
/*final boolean wasTrackMonitored = settings.SAVE_GLOBAL_TRACK_TO_GPX.get(); /*final boolean wasTrackMonitored = settings.SAVE_GLOBAL_TRACK_TO_GPX.get();
@ -436,16 +444,22 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
} }
public void saveCurrentTrack() { public void saveCurrentTrack() {
saveCurrentTrack(null, null); saveCurrentTrack(null, null, true, false);
} }
public void saveCurrentTrack(@Nullable final Runnable onComplete) { public void saveCurrentTrack(@Nullable final Runnable onComplete) {
saveCurrentTrack(onComplete, null); saveCurrentTrack(onComplete, null, true, false);
} }
public void saveCurrentTrack(@Nullable final Runnable onComplete, @Nullable Activity activity) { public void saveCurrentTrack(@Nullable final Runnable onComplete, @Nullable Activity activity) {
stopRecording(); saveCurrentTrack(onComplete, activity, true, false);
}
public void saveCurrentTrack(@Nullable final Runnable onComplete, @Nullable Activity activity,
final boolean stopRecording, final boolean openTrack) {
if (stopRecording) {
stopRecording();
}
final WeakReference<Activity> activityRef = activity != null ? new WeakReference<>(activity) : null; final WeakReference<Activity> activityRef = activity != null ? new WeakReference<>(activity) : null;
app.getTaskManager().runInBackground(new OsmAndTaskRunnable<Void, Void, SaveGpxResult>() { app.getTaskManager().runInBackground(new OsmAndTaskRunnable<Void, Void, SaveGpxResult>() {
@ -464,7 +478,7 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
helper.close(); helper.close();
return result; return result;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); LOG.error(e.getMessage(), e);
} }
return null; return null;
} }
@ -474,10 +488,31 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
isSaving = false; isSaving = false;
app.getNotificationHelper().refreshNotifications(); app.getNotificationHelper().refreshNotifications();
updateControl(); updateControl();
if (activityRef != null && !Algorithms.isEmpty(result.getFilenames())) {
final Activity a = activityRef.get(); File file = null;
if (a instanceof FragmentActivity && !a.isFinishing()) { File dir = app.getAppCustomization().getTracksDir();
SaveGPXBottomSheetFragment.showInstance(((FragmentActivity) a).getSupportFragmentManager(), result.getFilenames()); File[] children = dir.listFiles();
if (children != null && !Algorithms.isEmpty(result.getFilenames())) {
SavingTrackHelper helper = app.getSavingTrackHelper();
for (File child : children) {
if (child.getName().startsWith(result.getFilenames().get(0))
&& child.lastModified() == helper.getLastTimeFileSaved()) {
file = child;
}
}
}
if (file != null && file.exists()) {
if (!openTrack) {
if (activityRef != null) {
final Activity a = activityRef.get();
if (a instanceof FragmentActivity && !a.isFinishing()) {
List<String> singleName = Collections.singletonList(Algorithms.getFileNameWithoutExtension(file));
SaveGPXBottomSheet.showInstance(((FragmentActivity) a)
.getSupportFragmentManager(), singleName);
}
}
} else {
TrackMenuFragment.openTrack(mapActivity, file, null);
} }
} }
@ -523,7 +558,7 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
runnable.run(); runnable.run();
} else if (map instanceof FragmentActivity) { } else if (map instanceof FragmentActivity) {
FragmentActivity activity = (FragmentActivity) map; FragmentActivity activity = (FragmentActivity) map;
TripRecordingBottomSheet.showInstance(activity.getSupportFragmentManager()); TripRecordingStartingBottomSheet.showTripRecordingDialog(activity.getSupportFragmentManager(), app);
} }
} }

View file

@ -42,10 +42,10 @@ import java.util.List;
import static net.osmand.FileUtils.ILLEGAL_FILE_NAME_CHARACTERS; import static net.osmand.FileUtils.ILLEGAL_FILE_NAME_CHARACTERS;
public class SaveGPXBottomSheetFragment extends MenuBottomSheetDialogFragment { public class SaveGPXBottomSheet extends MenuBottomSheetDialogFragment {
public static final String TAG = "SaveGPXBottomSheetFragment"; public static final String TAG = "SaveGPXBottomSheetFragment";
public static final String SAVED_TRACKS_KEY = "saved_track_filename"; public static final String SAVED_TRACKS_KEY = "saved_track_filename";
private static final Log LOG = PlatformUtil.getLog(SaveGPXBottomSheetFragment.class); private static final Log LOG = PlatformUtil.getLog(SaveGPXBottomSheet.class);
private boolean openTrack = false; private boolean openTrack = false;
private File file; private File file;
@ -227,7 +227,7 @@ public class SaveGPXBottomSheetFragment extends MenuBottomSheetDialogFragment {
if (fragmentManager.isStateSaved()) { if (fragmentManager.isStateSaved()) {
return; return;
} }
SaveGPXBottomSheetFragment f = new SaveGPXBottomSheetFragment(); SaveGPXBottomSheet f = new SaveGPXBottomSheet();
Bundle b = new Bundle(); Bundle b = new Bundle();
b.putStringArrayList(SAVED_TRACKS_KEY, new ArrayList<>(filenames)); b.putStringArrayList(SAVED_TRACKS_KEY, new ArrayList<>(filenames));
f.setArguments(b); f.setArguments(b);

View file

@ -1,660 +0,0 @@
package net.osmand.plus.monitoring;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.TypedValue;
import android.text.format.DateUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.appcompat.widget.SwitchCompat;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.snackbar.Snackbar;
import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.IndexConstants;
import net.osmand.PlatformUtil;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.SavingTrackHelper;
import net.osmand.plus.activities.SavingTrackHelper.SaveGpxResult;
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.helpers.FontCache;
import net.osmand.plus.myplaces.SaveCurrentTrackTask;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.track.GpxBlockStatisticsBuilder;
import net.osmand.plus.track.SaveGpxAsyncTask.SaveGpxListener;
import net.osmand.plus.track.TrackAppearanceFragment;
import net.osmand.plus.widgets.TextViewEx;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static net.osmand.AndroidUtils.getSecondaryTextColorId;
import static net.osmand.plus.UiUtilities.CompoundButtonType.PROFILE_DEPENDENT;
public class TripRecordingActiveBottomSheet extends MenuBottomSheetDialogFragment {
public static final String TAG = TripRecordingActiveBottomSheet.class.getSimpleName();
private static final Log log = PlatformUtil.getLog(TripRecordingActiveBottomSheet.class);
private static final String UPDATE_CURRENT_GPX_FILE = "update_current_gpx_file";
public static final String UPDATE_TRACK_ICON = "update_track_icon";
private static final int GENERAL_UPDATE_GPS_INTERVAL = 1000;
private static final int GENERAL_UPDATE_SAVE_INTERVAL = 1000;
private OsmandApplication app;
private OsmandSettings settings;
private SavingTrackHelper helper;
private SelectedGpxFile selectedGpxFile;
private View statusContainer;
private LinearLayout buttonAppearance;
private View buttonSave;
private GpxBlockStatisticsBuilder blockStatisticsBuilder;
private final Handler handler = new Handler();
private Runnable updatingGPS;
private Runnable updatingTimeTrackSaved;
private GPXFile getGPXFile() {
return selectedGpxFile.getGpxFile();
}
public void setSelectedGpxFile(SelectedGpxFile selectedGpxFile) {
this.selectedGpxFile = selectedGpxFile;
}
public boolean hasDataToSave() {
return app.getSavingTrackHelper().hasDataToSave();
}
public boolean searchingGPS() {
return app.getLocationProvider().getLastKnownLocation() == null;
}
public boolean wasTrackMonitored() {
return settings.SAVE_GLOBAL_TRACK_TO_GPX.get();
}
public static void showInstance(@NonNull FragmentManager fragmentManager, SelectedGpxFile selectedGpxFile) {
if (!fragmentManager.isStateSaved()) {
TripRecordingActiveBottomSheet fragment = new TripRecordingActiveBottomSheet();
fragment.setSelectedGpxFile(selectedGpxFile);
fragment.show(fragmentManager, TAG);
}
}
@Override
public void createMenuItems(Bundle savedInstanceState) {
app = requiredMyApplication();
settings = app.getSettings();
helper = app.getSavingTrackHelper();
LayoutInflater inflater = UiUtilities.getInflater(getContext(), nightMode);
final FragmentManager fragmentManager = getFragmentManager();
View itemView = inflater.inflate(R.layout.trip_recording_active_fragment, null, false);
items.add(new BaseBottomSheetItem.Builder()
.setCustomView(itemView)
.create());
View buttonClear = itemView.findViewById(R.id.button_clear);
final View buttonOnline = itemView.findViewById(R.id.button_online);
final View buttonSegment = itemView.findViewById(R.id.button_segment);
buttonSave = itemView.findViewById(R.id.button_save);
final View buttonPause = itemView.findViewById(R.id.button_pause);
View buttonStop = itemView.findViewById(R.id.button_stop);
createItem(buttonClear, ItemType.CLEAR_DATA, hasDataToSave());
createItem(buttonOnline, ItemType.STOP_ONLINE, hasDataToSave());
createItem(buttonSegment, ItemType.START_SEGMENT, wasTrackMonitored());
createItem(buttonPause, wasTrackMonitored() ? ItemType.PAUSE : ItemType.RESUME, true);
createItem(buttonStop, ItemType.STOP, true);
AndroidUiHelper.updateVisibility(buttonOnline, app.getLiveMonitoringHelper().isLiveMonitoringEnabled());
statusContainer = itemView.findViewById(R.id.status_container);
updateStatus();
RecyclerView statBlocks = itemView.findViewById(R.id.block_statistics);
if (savedInstanceState != null) {
if (savedInstanceState.containsKey(UPDATE_CURRENT_GPX_FILE)
&& savedInstanceState.getBoolean(UPDATE_CURRENT_GPX_FILE)) {
selectedGpxFile = app.getSavingTrackHelper().getCurrentTrack();
}
}
blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile);
blockStatisticsBuilder.setBlocksView(statBlocks);
blockStatisticsBuilder.setBlocksClickable(false);
blockStatisticsBuilder.initStatBlocks(null, ContextCompat.getColor(app, getActiveTextColorId(nightMode)), nightMode);
LinearLayout showTrackContainer = itemView.findViewById(R.id.show_track_on_map);
showTrackContainer.setMinimumHeight(app.getResources().getDimensionPixelSize(R.dimen.bottom_sheet_list_item_height));
final LinearLayout buttonShow = showTrackContainer.findViewById(R.id.basic_item_body);
TextView showTrackTitle = buttonShow.findViewById(R.id.title);
Integer showTitle = ItemType.SHOW_TRACK.getTitleId();
if (showTitle != null) {
showTrackTitle.setText(showTitle);
}
AndroidUtils.setPadding(buttonShow, AndroidUtils.dpToPx(app, 12f), 0, buttonShow.getPaddingRight(), 0);
showTrackTitle.setTextColor(ContextCompat.getColor(app, getActiveIconColorId(nightMode)));
showTrackTitle.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.default_desc_text_size));
Typeface typeface = FontCache.getFont(app, app.getResources().getString(R.string.font_roboto_medium));
showTrackTitle.setTypeface(typeface);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
float letterSpacing = AndroidUtils.getFloatValueFromRes(app, R.dimen.text_button_letter_spacing);
showTrackTitle.setLetterSpacing(letterSpacing);
}
final SwitchCompat showTrackOnMapButton = buttonShow.findViewById(R.id.switch_button);
showTrackOnMapButton.setChecked(app.getSelectedGpxHelper().getSelectedCurrentRecordingTrack() != null);
UiUtilities.setupCompoundButton(showTrackOnMapButton, nightMode, PROFILE_DEPENDENT);
buttonAppearance = showTrackContainer.findViewById(R.id.additional_button);
View divider = buttonAppearance.getChildAt(0);
AndroidUiHelper.setVisibility(View.GONE, divider);
int marginS = app.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_small);
UiUtilities.setMargins(buttonAppearance, marginS, 0, 0, 0);
updateTrackIcon(buttonAppearance);
buttonAppearance.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (showTrackOnMapButton.isChecked()) {
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
hide();
SelectedGpxFile selectedGpxFile = app.getSavingTrackHelper().getCurrentTrack();
TrackAppearanceFragment.showInstance(mapActivity, selectedGpxFile, TripRecordingActiveBottomSheet.this);
}
}
}
});
createItem(buttonAppearance, ItemType.APPEARANCE, showTrackOnMapButton.isChecked());
setShowOnMapBackground(buttonShow, app, showTrackOnMapButton.isChecked(), nightMode);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
buttonShow.setBackgroundTintList(null);
}
buttonShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean checked = !showTrackOnMapButton.isChecked();
showTrackOnMapButton.setChecked(checked);
app.getSelectedGpxHelper().selectGpxFile(app.getSavingTrackHelper().getCurrentGpx(), checked, false);
createItem(buttonAppearance, ItemType.APPEARANCE, checked);
setShowOnMapBackground(buttonShow, app, checked, nightMode);
}
});
buttonClear.findViewById(R.id.button_container).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (fragmentManager != null && hasDataToSave()) {
ClearRecordedDataBottomSheetFragment.showInstance(fragmentManager, TripRecordingActiveBottomSheet.this);
}
}
});
buttonOnline.findViewById(R.id.button_container).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
settings.LIVE_MONITORING.set(false);
AndroidUiHelper.updateVisibility(buttonOnline, false);
}
});
buttonSegment.findViewById(R.id.button_container).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (wasTrackMonitored()) {
blockStatisticsBuilder.stopUpdatingStatBlocks();
helper.startNewSegment();
blockStatisticsBuilder.runUpdatingStatBlocksIfNeeded();
}
}
});
buttonSave.findViewById(R.id.button_container).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (hasDataToSave()) {
final GPXFile gpxFile = getGPXFile();
new SaveCurrentTrackTask(app, gpxFile, createSaveListener(new Runnable() {
@Override
public void run() {
blockStatisticsBuilder.stopUpdatingStatBlocks();
blockStatisticsBuilder.runUpdatingStatBlocksIfNeeded();
stopUpdatingTimeTrackSaved();
runUpdatingTimeTrackSaved();
}
})).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
});
buttonPause.findViewById(R.id.button_container).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean wasTrackMonitored = !wasTrackMonitored();
if (!wasTrackMonitored) {
blockStatisticsBuilder.stopUpdatingStatBlocks();
} else {
blockStatisticsBuilder.runUpdatingStatBlocksIfNeeded();
}
settings.SAVE_GLOBAL_TRACK_TO_GPX.set(wasTrackMonitored);
updateStatus();
createItem(buttonPause, wasTrackMonitored ? ItemType.PAUSE : ItemType.RESUME, true);
createItem(buttonSegment, ItemType.START_SEGMENT, wasTrackMonitored);
}
});
buttonStop.findViewById(R.id.button_container).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (fragmentManager != null) {
StopTrackRecordingBottomFragment.showInstance(getMapActivity(), fragmentManager, TripRecordingActiveBottomSheet.this);
}
}
});
}
private void updateStatus() {
TextView statusTitle = statusContainer.findViewById(R.id.text_status);
AppCompatImageView statusIcon = statusContainer.findViewById(R.id.icon_status);
ItemType status = searchingGPS() ? ItemType.SEARCHING_GPS : !wasTrackMonitored() ? ItemType.ON_PAUSE : ItemType.RECORDING;
Integer titleId = status.getTitleId();
if (titleId != null) {
statusTitle.setText(titleId);
}
int colorText = status.equals(ItemType.SEARCHING_GPS) ? getSecondaryTextColorId(nightMode) : getOsmandIconColorId(nightMode);
statusTitle.setTextColor(ContextCompat.getColor(app, colorText));
Integer iconId = status.getIconId();
if (iconId != null) {
int colorDrawable = ContextCompat.getColor(app,
status.equals(ItemType.SEARCHING_GPS) ? getSecondaryIconColorId(nightMode) : getOsmandIconColorId(nightMode));
Drawable statusDrawable = UiUtilities.tintDrawable(AppCompatResources.getDrawable(app, iconId), colorDrawable);
statusIcon.setImageDrawable(statusDrawable);
}
}
private void updateTrackIcon(View buttonAppearance) {
String width = settings.CURRENT_TRACK_WIDTH.get();
boolean showArrows = settings.CURRENT_TRACK_SHOW_ARROWS.get();
int color = settings.CURRENT_TRACK_COLOR.get();
Drawable appearanceDrawable = TrackAppearanceFragment.getTrackIcon(app, width, showArrows, color);
AppCompatImageView appearanceIcon = buttonAppearance.findViewById(R.id.icon_after_divider);
int marginTrackIconH = app.getResources().getDimensionPixelSize(R.dimen.content_padding_small);
UiUtilities.setMargins(appearanceIcon, marginTrackIconH, 0, marginTrackIconH, 0);
appearanceIcon.setImageDrawable(appearanceDrawable);
}
private void createItem(View view, ItemType type, boolean enabled) {
createItem(app, nightMode, view, type, enabled, null);
}
private void createItem(View view, ItemType type, boolean enabled, @Nullable String description) {
createItem(app, nightMode, view, type, enabled, description);
}
public static View createItem(Context context, boolean nightMode, LayoutInflater inflater, ItemType type) {
View button = inflater.inflate(R.layout.bottom_sheet_button_with_icon, null);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
int horizontal = context.getResources().getDimensionPixelSize(R.dimen.content_padding);
params.setMargins(horizontal, 0, horizontal, 0);
button.setLayoutParams(params);
LinearLayout container = button.findViewById(R.id.button_container);
container.setClickable(false);
container.setFocusable(false);
createItem(context, nightMode, button, type, true, null);
return button;
}
public static void createItem(Context context, boolean nightMode, View view, ItemType type, boolean enabled, @Nullable String description) {
view.setTag(type);
LinearLayout button = view.findViewById(R.id.button_container);
AppCompatImageView icon = view.findViewById(R.id.icon);
if (icon != null) {
setTintedIcon(context, icon, enabled, nightMode, type);
}
TextView title = view.findViewById(R.id.button_text);
Integer titleId = type.getTitleId();
if (title != null && titleId != null) {
title.setText(titleId);
setTextColor(context, title, enabled, nightMode, type);
}
TextViewEx desc = view.findViewById(R.id.desc);
if (desc != null) {
boolean isShowDesc = !Algorithms.isBlank(description);
int marginDesc = isShowDesc ? 0 : context.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_medium);
AndroidUiHelper.updateVisibility(desc, isShowDesc);
if (title != null) {
UiUtilities.setMargins(title, 0, marginDesc, 0, marginDesc);
}
desc.setText(description);
setTextColor(context, desc, false, nightMode, type);
}
setItemBackground(context, nightMode, button != null ? button : (LinearLayout) view, enabled);
}
private String getTimeTrackSaved() {
long timeTrackSaved = helper.getLastTimeFileSaved();
if (timeTrackSaved != 0) {
long now = System.currentTimeMillis();
CharSequence time = DateUtils.getRelativeTimeSpanString(timeTrackSaved, now, DateUtils.MINUTE_IN_MILLIS);
return String.valueOf(time);
} else {
return null;
}
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(UPDATE_CURRENT_GPX_FILE, true);
}
@Override
public void onResume() {
super.onResume();
blockStatisticsBuilder.runUpdatingStatBlocksIfNeeded();
runUpdatingGPS();
runUpdatingTimeTrackSaved();
}
@Override
public void onPause() {
super.onPause();
blockStatisticsBuilder.stopUpdatingStatBlocks();
stopUpdatingGPS();
stopUpdatingTimeTrackSaved();
}
public void stopUpdatingGPS() {
handler.removeCallbacks(updatingGPS);
}
public void runUpdatingGPS() {
updatingGPS = new Runnable() {
@Override
public void run() {
int interval = app.getSettings().SAVE_GLOBAL_TRACK_INTERVAL.get();
updateStatus();
handler.postDelayed(this, Math.max(GENERAL_UPDATE_GPS_INTERVAL, interval));
}
};
handler.post(updatingGPS);
}
public void stopUpdatingTimeTrackSaved() {
handler.removeCallbacks(updatingTimeTrackSaved);
}
public void runUpdatingTimeTrackSaved() {
updatingTimeTrackSaved = new Runnable() {
@Override
public void run() {
String time = getTimeTrackSaved();
createItem(buttonSave, ItemType.SAVE, hasDataToSave(), !Algorithms.isEmpty(time) ? time : null);
handler.postDelayed(this, GENERAL_UPDATE_SAVE_INTERVAL);
}
};
handler.post(updatingTimeTrackSaved);
}
private SaveGpxListener createSaveListener(@Nullable final Runnable callback) {
return new SaveGpxListener() {
@Override
public void gpxSavingStarted() {
}
@Override
public void gpxSavingFinished(Exception errorMessage) {
final MapActivity mapActivity = getMapActivity();
final Context context = getContext();
final SaveGpxResult result = helper.saveDataToGpx(app.getAppCustomization().getTracksDir());
ArrayList<String> filenames = new ArrayList<>(result.getFilenames());
String fileName = "";
if (filenames.size() > 0) {
fileName = filenames.get(filenames.size() - 1) + IndexConstants.GPX_FILE_EXT;
}
String message = fileName + " " + app.getResources().getString(R.string.shared_string_is_saved) + ". "
+ app.getResources().getString(R.string.track_recording_will_be_continued);
if (mapActivity != null && context != null) {
final WeakReference<MapActivity> mapActivityRef = new WeakReference<>(mapActivity);
final FragmentManager fragmentManager = mapActivityRef.get().getSupportFragmentManager();
Snackbar snackbar = Snackbar.make(getView(),
message,
Snackbar.LENGTH_LONG)
.setAction(R.string.shared_string_rename, new View.OnClickListener() {
@Override
public void onClick(View view) {
fragmentManager.beginTransaction().remove(TripRecordingActiveBottomSheet.this).commitAllowingStateLoss();
SaveGPXBottomSheetFragment.showInstance(fragmentManager, result.getFilenames());
}
});
View view = snackbar.getView();
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) view.getLayoutParams();
params.gravity = Gravity.TOP;
AndroidUtils.setMargins(params, 0, AndroidUtils.getStatusBarHeight(context), 0, 0);
view.setLayoutParams(params);
UiUtilities.setupSnackbar(snackbar, nightMode);
snackbar.show();
if (callback != null) {
callback.run();
}
}
}
};
}
@Nullable
public MapActivity getMapActivity() {
Activity activity = getActivity();
if (activity instanceof MapActivity) {
return (MapActivity) activity;
}
return null;
}
public void show() {
Dialog dialog = getDialog();
if (dialog != null) {
dialog.show();
}
}
public void show(String... keys) {
show();
for (String key : keys) {
if (key.equals(UPDATE_TRACK_ICON)) {
updateTrackIcon(buttonAppearance);
}
}
}
public void hide() {
Dialog dialog = getDialog();
if (dialog != null) {
dialog.hide();
}
}
public enum ItemType {
SHOW_TRACK(R.string.shared_string_show_on_map, null),
APPEARANCE(null, null),
SEARCHING_GPS(R.string.searching_gps, R.drawable.ic_action_gps_info),
RECORDING(R.string.recording_default_name, R.drawable.ic_action_track_recordable),
ON_PAUSE(R.string.on_pause, R.drawable.ic_pause),
CLEAR_DATA(R.string.clear_recorded_data, R.drawable.ic_action_delete_dark),
START_SEGMENT(R.string.gpx_start_new_segment, R.drawable.ic_action_new_segment),
SAVE(R.string.shared_string_save, R.drawable.ic_action_save_to_file),
PAUSE(R.string.shared_string_pause, R.drawable.ic_pause),
RESUME(R.string.shared_string_resume, R.drawable.ic_play_dark),
STOP(R.string.shared_string_control_stop, R.drawable.ic_action_rec_stop),
STOP_AND_DISCARD(R.string.track_recording_stop_without_saving, R.drawable.ic_action_rec_stop),
STOP_AND_SAVE(R.string.track_recording_save_and_stop, R.drawable.ic_action_save_to_file),
STOP_ONLINE(R.string.live_monitoring_stop, R.drawable.ic_world_globe_dark),
CANCEL(R.string.shared_string_cancel, R.drawable.ic_action_close);
@StringRes
private final Integer titleId;
@DrawableRes
private final Integer iconId;
private static final List<ItemType> negative = Arrays.asList(CLEAR_DATA, STOP_AND_DISCARD);
ItemType(@Nullable @StringRes Integer titleId, @Nullable @DrawableRes Integer iconId) {
this.titleId = titleId;
this.iconId = iconId;
}
@Nullable
public Integer getTitleId() {
return titleId;
}
@Nullable
public Integer getIconId() {
return iconId;
}
public boolean isNegative() {
return negative.contains(this);
}
}
public static void setItemBackground(Context context, boolean nightMode, LinearLayout view, boolean enabled) {
Drawable background = AppCompatResources.getDrawable(context, R.drawable.btn_background_inactive_light);
if (background != null && enabled) {
ColorStateList iconColorStateList = AndroidUtils.createPressedColorStateList(
context, getInactiveButtonColorId(nightMode), getActiveButtonColorId(nightMode)
);
DrawableCompat.setTintList(background, iconColorStateList);
} else {
UiUtilities.tintDrawable(background, ContextCompat.getColor(context, getInactiveButtonColorId(nightMode)));
}
view.setBackgroundDrawable(background);
}
public static void setShowOnMapBackground(LinearLayout view, Context context, boolean checked, boolean nightMode) {
Drawable background = AppCompatResources.getDrawable(context,
nightMode ? checked ? R.drawable.btn_background_inactive_dark : R.drawable.btn_background_stroked_inactive_dark
: checked ? R.drawable.btn_background_inactive_light : R.drawable.btn_background_stroked_inactive_light);
view.setBackgroundDrawable(background);
}
public static void setTextColor(Context context, TextView tv, boolean enabled, boolean nightMode, ItemType type) {
if (tv != null) {
int activeColorId = type.isNegative() ? R.color.color_osm_edit_delete : getActiveTextColorId(nightMode);
int normalColorId = enabled ? activeColorId : getSecondaryTextColorId(nightMode);
ColorStateList textColorStateList = AndroidUtils.createPressedColorStateList(context, normalColorId, getPressedColorId(nightMode));
tv.setTextColor(textColorStateList);
}
}
public static void setTintedIcon(Context context, AppCompatImageView iv, boolean enabled, boolean nightMode, ItemType type) {
Integer iconId = type.getIconId();
if (iv != null && iconId != null) {
Drawable icon = AppCompatResources.getDrawable(context, iconId);
int activeColorId = type.isNegative() ? R.color.color_osm_edit_delete : getActiveIconColorId(nightMode);
int normalColorId = enabled ? activeColorId : getSecondaryIconColorId(nightMode);
ColorStateList iconColorStateList = AndroidUtils.createPressedColorStateList(context, normalColorId, getPressedColorId(nightMode));
if (icon != null) {
DrawableCompat.setTintList(icon, iconColorStateList);
}
iv.setImageDrawable(icon);
if (type.iconId == R.drawable.ic_action_rec_stop) {
int stopSize = iv.getResources().getDimensionPixelSize(R.dimen.bottom_sheet_icon_margin_large);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(stopSize, stopSize);
iv.setLayoutParams(params);
}
}
}
@ColorRes
public static int getActiveTextColorId(boolean nightMode) {
return nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light;
}
@ColorRes
public static int getActiveIconColorId(boolean nightMode) {
return nightMode ? R.color.icon_color_active_dark : R.color.icon_color_active_light;
}
@ColorRes
public static int getSecondaryIconColorId(boolean nightMode) {
return nightMode ? R.color.icon_color_secondary_dark : R.color.icon_color_secondary_light;
}
@ColorRes
public static int getActiveButtonColorId(boolean nightMode) {
return nightMode ? R.color.active_buttons_and_links_bg_pressed_dark : R.color.active_buttons_and_links_bg_pressed_light;
}
@ColorRes
public static int getInactiveButtonColorId(boolean nightMode) {
return nightMode ? R.color.inactive_buttons_and_links_bg_dark : R.color.inactive_buttons_and_links_bg_light;
}
@ColorRes
public static int getOsmandIconColorId(boolean nightMode) {
return nightMode ? R.color.icon_color_osmand_dark : R.color.icon_color_osmand_light;
}
@ColorRes
public static int getPressedColorId(boolean nightMode) {
return nightMode ? R.color.active_buttons_and_links_text_dark : R.color.active_buttons_and_links_text_light;
}
@Override
protected int getDismissButtonHeight() {
return getResources().getDimensionPixelSize(R.dimen.bottom_sheet_cancel_button_height);
}
@Override
protected int getDismissButtonTextId() {
return R.string.shared_string_close;
}
@Override
protected boolean useVerticalButtons() {
return true;
}
}

View file

@ -3,197 +3,238 @@ package net.osmand.plus.monitoring;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.graphics.Typeface; import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.text.SpannableString; import android.os.Handler;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.widget.SwitchCompat; import androidx.annotation.StringRes;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.cardview.widget.CardView;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.slider.RangeSlider;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.TrkSegment;
import net.osmand.PlatformUtil;
import net.osmand.data.LatLon;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.NavigationService;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.UiUtilities; import net.osmand.plus.UiUtilities;
import net.osmand.plus.UiUtilities.DialogButtonType;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.SavingTrackHelper; import net.osmand.plus.activities.SavingTrackHelper;
import net.osmand.plus.base.MenuBottomSheetDialogFragment; import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.helpers.FontCache; import net.osmand.plus.helpers.GpxUiHelper;
import net.osmand.plus.mapcontextmenu.other.TrackChartPoints;
import net.osmand.plus.myplaces.GPXItemPagerAdapter;
import net.osmand.plus.myplaces.SegmentActionsListener;
import net.osmand.plus.myplaces.SegmentGPXAdapter;
import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.track.GpxBlockStatisticsBuilder;
import net.osmand.plus.track.TrackAppearanceFragment; import net.osmand.plus.track.TrackAppearanceFragment;
import net.osmand.plus.track.TrackDisplayHelper;
import net.osmand.plus.views.controls.PagerSlidingTabStrip;
import net.osmand.plus.views.controls.WrapContentHeightViewPager;
import net.osmand.plus.widgets.TextViewEx;
import net.osmand.util.Algorithms;
import static net.osmand.plus.UiUtilities.CompoundButtonType.PROFILE_DEPENDENT; import org.apache.commons.logging.Log;
import static net.osmand.plus.monitoring.OsmandMonitoringPlugin.MINUTES;
import static net.osmand.plus.monitoring.OsmandMonitoringPlugin.SECONDS;
public class TripRecordingBottomSheet extends MenuBottomSheetDialogFragment { import java.io.File;
import java.util.Arrays;
import java.util.List;
import static net.osmand.AndroidUtils.getSecondaryTextColorId;
import static net.osmand.AndroidUtils.setPadding;
import static net.osmand.plus.UiUtilities.CompoundButtonType.GLOBAL;
import static net.osmand.plus.track.GpxBlockStatisticsBuilder.INIT_BLOCKS_ALTITUDE;
import static net.osmand.plus.track.GpxBlockStatisticsBuilder.INIT_BLOCKS_GENERAL;
import static net.osmand.plus.track.GpxBlockStatisticsBuilder.INIT_BLOCKS_SPEED;
public class TripRecordingBottomSheet extends MenuBottomSheetDialogFragment implements SegmentActionsListener {
public static final String TAG = TripRecordingBottomSheet.class.getSimpleName(); public static final String TAG = TripRecordingBottomSheet.class.getSimpleName();
private static final Log LOG = PlatformUtil.getLog(TripRecordingBottomSheet.class);
public static final String UPDATE_TRACK_ICON = "update_track_icon";
private static final int GPS_UPDATE_INTERVAL = 1000;
private static final String[] INIT_BLOCKS_KEYS =
new String[]{INIT_BLOCKS_GENERAL, INIT_BLOCKS_ALTITUDE, INIT_BLOCKS_SPEED};
private OsmandApplication app; private OsmandApplication app;
private OsmandSettings settings; private OsmandSettings settings;
private SavingTrackHelper helper;
private OsmandMonitoringPlugin plugin;
private ImageView upDownBtn; private View statusContainer;
private SwitchCompat confirmEveryRun; private AppCompatImageView trackAppearanceIcon;
private TextView intervalValueView; private LinearLayout segmentsContainer;
private LinearLayout container;
private View divider; private TrackDisplayHelper displayHelper;
private boolean infoExpanded; private TrackChartPoints trackChartPoints;
private GPXItemPagerAdapter graphsAdapter;
private GpxBlockStatisticsBuilder blockStatisticsBuilder;
private SelectedGpxFile selectedGpxFile;
private final Handler handler = new Handler();
private Runnable updatingGPS;
private GPXFile getGPXFile() {
return selectedGpxFile.getGpxFile();
}
private boolean hasDataToSave() {
return helper.hasDataToSave();
}
private boolean searchingGPS() {
return app.getLocationProvider().getLastKnownLocation() == null;
}
private boolean wasTrackMonitored() {
return settings.SAVE_GLOBAL_TRACK_TO_GPX.get();
}
public static void showInstance(@NonNull FragmentManager fragmentManager) {
if (!fragmentManager.isStateSaved()) {
TripRecordingBottomSheet fragment = new TripRecordingBottomSheet();
fragment.show(fragmentManager, TAG);
}
}
@Override @Override
public void createMenuItems(Bundle savedInstanceState) { public void createMenuItems(Bundle savedInstanceState) {
app = requiredMyApplication(); app = requiredMyApplication();
settings = app.getSettings(); settings = app.getSettings();
Context context = requireContext(); helper = app.getSavingTrackHelper();
plugin = OsmandPlugin.getPlugin(OsmandMonitoringPlugin.class);
selectedGpxFile = helper.getCurrentTrack();
LayoutInflater inflater = UiUtilities.getInflater(getContext(), nightMode);
final FragmentManager fragmentManager = getFragmentManager();
LayoutInflater inflater = UiUtilities.getInflater(context, nightMode);
View itemView = inflater.inflate(R.layout.trip_recording_fragment, null, false); View itemView = inflater.inflate(R.layout.trip_recording_fragment, null, false);
items.add(new BottomSheetItemWithDescription.Builder() items.add(new BaseBottomSheetItem.Builder()
.setCustomView(itemView) .setCustomView(itemView)
.create()); .create());
final int paddingSmall = getResources().getDimensionPixelSize(R.dimen.content_padding_small); statusContainer = itemView.findViewById(R.id.status_container);
updateStatus();
LinearLayout showTrackOnMapView = itemView.findViewById(R.id.show_track_on_map); LinearLayout showTrackContainer = itemView.findViewById(R.id.show_track_on_map);
TextView showTrackOnMapTitle = showTrackOnMapView.findViewById(R.id.title); trackAppearanceIcon = showTrackContainer.findViewById(R.id.additional_button_icon);
showTrackOnMapTitle.setText(R.string.show_track_on_map); createShowTrackItem(showTrackContainer, trackAppearanceIcon, ItemType.SHOW_TRACK.getTitleId(),
TripRecordingBottomSheet.this, nightMode, new Runnable() {
@Override
public void run() {
hide();
}
});
ImageView trackAppearanceIcon = showTrackOnMapView.findViewById(R.id.icon_after_divider); segmentsContainer = itemView.findViewById(R.id.segments_container);
createSegmentsTabs(segmentsContainer);
int color = settings.CURRENT_TRACK_COLOR.get(); RecyclerView statBlocks = itemView.findViewById(R.id.block_statistics);
String width = settings.CURRENT_TRACK_WIDTH.get(); blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile, nightMode);
boolean showArrows = settings.CURRENT_TRACK_SHOW_ARROWS.get(); blockStatisticsBuilder.setBlocksView(statBlocks);
Drawable drawable = TrackAppearanceFragment.getTrackIcon(app, width, showArrows, color); blockStatisticsBuilder.setBlocksClickable(false);
blockStatisticsBuilder.setInitBlocksKey(INIT_BLOCKS_GENERAL);
blockStatisticsBuilder.initStatBlocks(null,
ContextCompat.getColor(app, getActiveTextColorId(nightMode)));
trackAppearanceIcon.setImageDrawable(drawable); CardView cardLeft = itemView.findViewById(R.id.button_left);
trackAppearanceIcon.setOnClickListener(new View.OnClickListener() { createItem(cardLeft, ItemType.CANCEL);
cardLeft.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
final CardView cardCenterLeft = itemView.findViewById(R.id.button_center_left);
createItem(cardCenterLeft, wasTrackMonitored() ? ItemType.PAUSE : ItemType.RESUME);
cardCenterLeft.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean wasTrackMonitored = !wasTrackMonitored();
if (!wasTrackMonitored) {
blockStatisticsBuilder.stopUpdatingStatBlocks();
} else {
blockStatisticsBuilder.runUpdatingStatBlocksIfNeeded();
}
settings.SAVE_GLOBAL_TRACK_TO_GPX.set(wasTrackMonitored);
updateStatus();
createItem(cardCenterLeft, wasTrackMonitored ? ItemType.PAUSE : ItemType.RESUME);
}
});
CardView cardCenterRight = itemView.findViewById(R.id.button_center_right);
createItem(cardCenterRight, ItemType.FINISH);
cardCenterRight.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
MapActivity mapActivity = getMapActivity(); MapActivity mapActivity = getMapActivity();
if (mapActivity != null) { if (mapActivity != null && plugin != null && hasDataToSave()) {
hide(); plugin.saveCurrentTrack(null, mapActivity);
SelectedGpxFile selectedGpxFile = app.getSavingTrackHelper().getCurrentTrack(); app.getNotificationHelper().refreshNotifications();
TrackAppearanceFragment.showInstance(mapActivity, selectedGpxFile, TripRecordingBottomSheet.this); dismiss();
} }
} }
}); });
divider = itemView.findViewById(R.id.second_divider); CardView cardRight = itemView.findViewById(R.id.button_right);
LinearLayout expandHideIntervalContainer = itemView.findViewById(R.id.interval_view_container); createItem(cardRight, ItemType.OPTIONS);
upDownBtn = itemView.findViewById(R.id.up_down_button); cardRight.setOnClickListener(new View.OnClickListener() {
expandHideIntervalContainer.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
toggleInfoView(); if (fragmentManager != null) {
} TripRecordingOptionsBottomSheet.showInstance(fragmentManager, TripRecordingBottomSheet.this);
});
final int secondsLength = SECONDS.length;
final int minutesLength = MINUTES.length;
intervalValueView = itemView.findViewById(R.id.interval_value);
updateIntervalLegend();
container = itemView.findViewById(R.id.always_ask_and_range_slider_container);
RangeSlider intervalSlider = itemView.findViewById(R.id.interval_slider);
intervalSlider.setValueTo(secondsLength + minutesLength - 1);
int currentModeColor = app.getSettings().getApplicationMode().getProfileColor(nightMode);
UiUtilities.setupSlider(intervalSlider, nightMode, currentModeColor, true);
container.setVisibility(View.GONE);
intervalSlider.addOnChangeListener(new RangeSlider.OnChangeListener() {
@Override
public void onValueChange(@NonNull RangeSlider slider, float value, boolean fromUser) {
int progress = (int) value;
if (progress == 0) {
settings.SAVE_GLOBAL_TRACK_INTERVAL.set(0);
} else if (progress < secondsLength) {
settings.SAVE_GLOBAL_TRACK_INTERVAL.set(SECONDS[progress] * 1000);
} else {
settings.SAVE_GLOBAL_TRACK_INTERVAL.set(MINUTES[progress - secondsLength] * 60 * 1000);
}
updateIntervalLegend();
}
});
for (int i = 0; i < secondsLength + minutesLength; i++) {
if (i < secondsLength) {
if (settings.SAVE_GLOBAL_TRACK_INTERVAL.get() <= SECONDS[i] * 1000) {
intervalSlider.setValues((float) i);
break;
}
} else {
if (settings.SAVE_GLOBAL_TRACK_INTERVAL.get() <= MINUTES[i - secondsLength] * 1000 * 60) {
intervalSlider.setValues((float) i);
break;
} }
} }
}
boolean checked = !settings.SAVE_GLOBAL_TRACK_REMEMBER.get();
confirmEveryRun = itemView.findViewById(R.id.confirm_every_run);
confirmEveryRun.setChecked(checked);
setBackgroundAndPadding(checked, paddingSmall);
confirmEveryRun.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
setBackgroundAndPadding(isChecked, paddingSmall);
settings.SAVE_GLOBAL_TRACK_REMEMBER.set(!isChecked);
}
}); });
final SwitchCompat showTrackOnMapButton = showTrackOnMapView.findViewById(R.id.switch_button);
showTrackOnMapButton.setChecked(app.getSelectedGpxHelper().getSelectedCurrentRecordingTrack() != null);
View basicItem = itemView.findViewById(R.id.basic_item_body);
basicItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean checked = !showTrackOnMapButton.isChecked();
showTrackOnMapButton.setChecked(checked);
app.getSelectedGpxHelper().selectGpxFile(app.getSavingTrackHelper().getCurrentGpx(), checked, false);
}
});
UiUtilities.setupCompoundButton(showTrackOnMapButton, nightMode, PROFILE_DEPENDENT);
updateUpDownBtn();
} }
private void updateIntervalLegend() { @Override
String text = getString(R.string.save_track_interval_globally); public void onResume() {
String textValue; super.onResume();
int interval = settings.SAVE_GLOBAL_TRACK_INTERVAL.get(); blockStatisticsBuilder.runUpdatingStatBlocksIfNeeded();
if (interval == 0) { runUpdatingGPS();
textValue = getString(R.string.int_continuosly); MapActivity mapActivity = getMapActivity();
} else { if (mapActivity != null) {
int seconds = interval / 1000; mapActivity.getMapLayers().getGpxLayer().setTrackChartPoints(trackChartPoints);
if (seconds <= SECONDS[SECONDS.length - 1]) { }
textValue = seconds + " " + getString(R.string.int_seconds); }
} else {
textValue = (seconds / 60) + " " + getString(R.string.int_min); @Override
} public void onPause() {
super.onPause();
blockStatisticsBuilder.stopUpdatingStatBlocks();
stopUpdatingGPS();
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
mapActivity.getMapLayers().getGpxLayer().setTrackChartPoints(null);
} }
String textAll = getString(R.string.ltr_or_rtl_combine_via_colon, text, textValue);
Typeface typeface = FontCache.getRobotoMedium(app);
SpannableString spannableString = UiUtilities.createCustomFontSpannable(typeface, textAll, textValue);
intervalValueView.setText(spannableString);
} }
public void show() { public void show() {
@ -203,6 +244,15 @@ public class TripRecordingBottomSheet extends MenuBottomSheetDialogFragment {
} }
} }
public void show(String... keys) {
show();
for (String key : keys) {
if (key.equals(UPDATE_TRACK_ICON)) {
updateTrackIcon(app, trackAppearanceIcon);
}
}
}
public void hide() { public void hide() {
Dialog dialog = getDialog(); Dialog dialog = getDialog();
if (dialog != null) { if (dialog != null) {
@ -210,82 +260,398 @@ public class TripRecordingBottomSheet extends MenuBottomSheetDialogFragment {
} }
} }
private void setBackgroundAndPadding(boolean isChecked, int paddingSmall) { public void stopUpdatingGPS() {
if (nightMode) { handler.removeCallbacks(updatingGPS);
confirmEveryRun.setBackgroundResource( }
isChecked ? R.drawable.layout_bg_dark_solid : R.drawable.layout_bg_dark);
} else { public void runUpdatingGPS() {
confirmEveryRun.setBackgroundResource( updatingGPS = new Runnable() {
isChecked ? R.drawable.layout_bg_solid : R.drawable.layout_bg); @Override
public void run() {
int interval = app.getSettings().SAVE_GLOBAL_TRACK_INTERVAL.get();
updateStatus();
handler.postDelayed(this, Math.max(GPS_UPDATE_INTERVAL, interval));
}
};
handler.post(updatingGPS);
}
private void recreateStatBlocks(String initBlocksKey) {
blockStatisticsBuilder.stopUpdatingStatBlocks();
blockStatisticsBuilder.setInitBlocksKey(initBlocksKey);
blockStatisticsBuilder.runUpdatingStatBlocksIfNeeded();
}
private void setupDisplayHelper() {
displayHelper = new TrackDisplayHelper(app);
if (!selectedGpxFile.isShowCurrentTrack()) {
File file = new File(getGPXFile().path);
displayHelper.setFile(file);
displayHelper.setGpxDataItem(app.getGpxDbHelper().getItem(file));
} }
confirmEveryRun.setPadding(paddingSmall, 0, paddingSmall, 0); displayHelper.setGpx(getGPXFile());
} }
private void updateUpDownBtn() { private void createSegmentsTabs(ViewGroup viewGroup) {
int iconId = infoExpanded ? R.drawable.ic_action_arrow_down : R.drawable.ic_action_arrow_up; viewGroup.removeAllViews();
upDownBtn.setImageDrawable(getContentIcon(iconId)); setupDisplayHelper();
View segmentView = SegmentGPXAdapter.createGpxTabsView(displayHelper, viewGroup, this, nightMode);
AndroidUiHelper.setVisibility(View.GONE, segmentView.findViewById(R.id.list_item_divider));
WrapContentHeightViewPager pager = segmentView.findViewById(R.id.pager);
PagerSlidingTabStrip tabLayout = segmentView.findViewById(R.id.sliding_tabs);
tabLayout.setOnTabReselectedListener(new PagerSlidingTabStrip.OnTabReselectedListener() {
@Override
public void onTabSelected(int position) {
recreateStatBlocks(INIT_BLOCKS_KEYS[position]);
}
@Override
public void onTabReselected(int position) {
recreateStatBlocks(INIT_BLOCKS_KEYS[position]);
}
});
graphsAdapter = new GPXItemPagerAdapter(app, GpxUiHelper.makeGpxDisplayItem(app,
displayHelper.getGpx()), displayHelper, nightMode, this, true);
pager.setAdapter(graphsAdapter);
tabLayout.setViewPager(pager);
viewGroup.addView(segmentView);
} }
private void toggleInfoView() { private void updateStatus() {
infoExpanded = !infoExpanded; TextView statusTitle = statusContainer.findViewById(R.id.text_status);
ViewGroup.MarginLayoutParams marginParams = (ViewGroup.MarginLayoutParams) divider.getLayoutParams(); AppCompatImageView statusIcon = statusContainer.findViewById(R.id.icon_status);
final int dp8 = AndroidUtils.dpToPx(app, 8f); ItemType status = searchingGPS() ? ItemType.SEARCHING_GPS : !wasTrackMonitored() ? ItemType.ON_PAUSE : ItemType.RECORDING;
final int dp16 = AndroidUtils.dpToPx(app, 16f); Integer titleId = status.getTitleId();
if (infoExpanded) { if (titleId != null) {
AndroidUtils.setMargins(marginParams, 0, dp16, 0, dp8); statusTitle.setText(titleId);
} else { }
AndroidUtils.setMargins(marginParams, 0, 0, 0, dp8); int colorText = status.equals(ItemType.SEARCHING_GPS) ? getSecondaryTextColorId(nightMode) : getOsmandIconColorId(nightMode);
statusTitle.setTextColor(ContextCompat.getColor(app, colorText));
Integer iconId = status.getIconId();
if (iconId != null) {
int colorDrawable = ContextCompat.getColor(app,
status.equals(ItemType.SEARCHING_GPS) ? getSecondaryIconColorId(nightMode) : getOsmandIconColorId(nightMode));
Drawable statusDrawable = UiUtilities.tintDrawable(AppCompatResources.getDrawable(app, iconId), colorDrawable);
statusIcon.setImageDrawable(statusDrawable);
}
}
public static void updateTrackIcon(OsmandApplication app, AppCompatImageView appearanceIcon) {
if (appearanceIcon != null) {
OsmandSettings settings = app.getSettings();
String width = settings.CURRENT_TRACK_WIDTH.get();
boolean showArrows = settings.CURRENT_TRACK_SHOW_ARROWS.get();
int color = settings.CURRENT_TRACK_COLOR.get();
Drawable appearanceDrawable = TrackAppearanceFragment.getTrackIcon(app, width, showArrows, color);
int marginTrackIconH = app.getResources().getDimensionPixelSize(R.dimen.content_padding_small);
UiUtilities.setMargins(appearanceIcon, marginTrackIconH, 0, marginTrackIconH, 0);
appearanceIcon.setImageDrawable(appearanceDrawable);
}
}
public static void createShowTrackItem(LinearLayout showTrackContainer, AppCompatImageView trackAppearanceIcon,
Integer showTrackId, final Fragment target,
final boolean nightMode, final Runnable hideOnClickButtonAppearance) {
FragmentActivity activity = target.getActivity();
if (!(activity instanceof MapActivity)) {
return;
}
final MapActivity mapActivity = (MapActivity) activity;
final OsmandApplication app = mapActivity.getMyApplication();
final CardView buttonShowTrack = showTrackContainer.findViewById(R.id.compound_container);
final CardView buttonAppearance = showTrackContainer.findViewById(R.id.additional_button_container);
TextView showTrackTextView = buttonShowTrack.findViewById(R.id.title);
if (showTrackId != null) {
showTrackTextView.setText(showTrackId);
}
final CompoundButton showTrackCompound = buttonShowTrack.findViewById(R.id.compound_button);
showTrackCompound.setChecked(app.getSelectedGpxHelper().getSelectedCurrentRecordingTrack() != null);
UiUtilities.setupCompoundButton(showTrackCompound, nightMode, GLOBAL);
setShowTrackItemBackground(buttonShowTrack, showTrackCompound.isChecked(), nightMode);
buttonShowTrack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean checked = !showTrackCompound.isChecked();
showTrackCompound.setChecked(checked);
app.getSelectedGpxHelper().selectGpxFile(app.getSavingTrackHelper().getCurrentGpx(), checked, false);
setShowTrackItemBackground(buttonShowTrack, checked, nightMode);
createItem(app, nightMode, buttonAppearance, ItemType.APPEARANCE, checked, null);
}
});
updateTrackIcon(app, trackAppearanceIcon);
createItem(app, nightMode, buttonAppearance, ItemType.APPEARANCE, showTrackCompound.isChecked(), null);
buttonAppearance.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (showTrackCompound.isChecked()) {
hideOnClickButtonAppearance.run();
SelectedGpxFile selectedGpxFile = app.getSavingTrackHelper().getCurrentTrack();
TrackAppearanceFragment.showInstance(mapActivity, selectedGpxFile, target);
}
}
});
}
public static void setShowTrackItemBackground(View view, boolean checked, boolean nightMode) {
Drawable background = AppCompatResources.getDrawable(view.getContext(),
checked ? getActiveTransparentBackgroundId(nightMode) : getInactiveStrokedBackgroundId(nightMode));
view.setBackgroundDrawable(background);
}
private void createItem(View view, ItemType type) {
createItem(app, nightMode, view, type, true, null);
}
public static View createItem(Context context, boolean nightMode, LayoutInflater inflater, ItemType type) {
return createItem(context, nightMode, inflater, type, true, null);
}
public static View createItem(Context context, boolean nightMode, LayoutInflater inflater, ItemType type, boolean enabled, String description) {
View button = inflater.inflate(R.layout.bottom_sheet_button_with_icon, null);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
int horizontal = context.getResources().getDimensionPixelSize(R.dimen.content_padding);
params.setMargins(horizontal, 0, horizontal, 0);
button.setLayoutParams(params);
createItem(context, nightMode, button, type, enabled, description);
return button;
}
public static void createItem(Context context, boolean nightMode, View view, ItemType type, boolean enabled, @Nullable String description) {
view.setTag(type);
AppCompatImageView icon = view.findViewById(R.id.icon);
if (icon != null) {
setTintedIcon(context, icon, enabled, nightMode, type);
}
TextView title = view.findViewById(R.id.button_text);
Integer titleId = type.getTitleId();
if (title != null && titleId != null) {
title.setText(titleId);
setTextColor(context, title, enabled, nightMode, type);
}
TextViewEx desc = view.findViewById(R.id.desc);
if (desc != null) {
boolean isShowDesc = !Algorithms.isBlank(description);
int marginDesc = isShowDesc ? 0 : context.getResources().getDimensionPixelSize(R.dimen.context_menu_padding_margin_medium);
AndroidUiHelper.updateVisibility(desc, isShowDesc);
if (title != null) {
UiUtilities.setMargins(title, 0, marginDesc, 0, marginDesc);
}
desc.setText(description);
setTextColor(context, desc, false, nightMode, type);
}
setItemBackground(context, nightMode, view, enabled);
}
public static void setItemBackground(Context context, boolean nightMode, View view, boolean enabled) {
if (view instanceof CardView) {
int colorId = enabled ? getActiveTransparentColorId(nightMode) : getInactiveButtonColorId(nightMode);
((CardView) view).setCardBackgroundColor(AndroidUtils.createPressedColorStateList(
context, colorId, getActiveTextColorId(nightMode)
));
return;
}
Drawable background = AppCompatResources.getDrawable(context, getInactiveButtonBackgroundId(nightMode));
if (background != null && enabled) {
DrawableCompat.setTintList(background, AndroidUtils.createPressedColorStateList(
context, getInactiveButtonColorId(nightMode), getActiveTextColorId(nightMode)
));
} else {
UiUtilities.tintDrawable(background, ContextCompat.getColor(context, getInactiveButtonColorId(nightMode)));
}
view.setBackgroundDrawable(background);
}
public enum ItemType {
SHOW_TRACK(R.string.shared_string_show_on_map, null),
APPEARANCE(null, null),
SEARCHING_GPS(R.string.searching_gps, R.drawable.ic_action_gps_info),
RECORDING(R.string.recording_default_name, R.drawable.ic_action_track_recordable),
ON_PAUSE(R.string.on_pause, R.drawable.ic_pause),
CLEAR_DATA(R.string.clear_recorded_data, R.drawable.ic_action_delete_dark),
START_NEW_SEGMENT(R.string.gpx_start_new_segment, R.drawable.ic_action_new_segment),
SAVE(R.string.trip_recording_save_and_continue, R.drawable.ic_action_save_to_file),
PAUSE(R.string.shared_string_pause, R.drawable.ic_pause),
RESUME(R.string.shared_string_resume, R.drawable.ic_play_dark),
STOP(R.string.shared_string_control_stop, R.drawable.ic_action_rec_stop),
STOP_AND_DISCARD(R.string.track_recording_stop_without_saving, R.drawable.ic_action_rec_stop),
STOP_AND_SAVE(R.string.track_recording_save_and_stop, R.drawable.ic_action_save_to_file),
STOP_ONLINE(R.string.live_monitoring_stop, R.drawable.ic_world_globe_dark),
CANCEL(R.string.shared_string_cancel, R.drawable.ic_action_close),
START_RECORDING(R.string.shared_string_control_start, R.drawable.ic_action_direction_movement),
SETTINGS(R.string.shared_string_settings, R.drawable.ic_action_settings),
FINISH(R.string.shared_string_finish, R.drawable.ic_action_point_destination),
OPTIONS(R.string.shared_string_options, R.drawable.ic_overflow_menu_with_background);
@StringRes
private final Integer titleId;
@DrawableRes
private final Integer iconId;
private static final List<ItemType> negative = Arrays.asList(CLEAR_DATA, STOP_AND_DISCARD);
ItemType(@Nullable @StringRes Integer titleId, @Nullable @DrawableRes Integer iconId) {
this.titleId = titleId;
this.iconId = iconId;
}
@Nullable
public Integer getTitleId() {
return titleId;
}
@Nullable
public Integer getIconId() {
return iconId;
}
public boolean isNegative() {
return negative.contains(this);
}
}
protected static void setTextColor(Context context, TextView tv, boolean enabled, boolean nightMode, ItemType type) {
if (tv != null) {
int activeColorId = type.isNegative() ? R.color.color_osm_edit_delete : getActiveTextColorId(nightMode);
int normalColorId = enabled ? activeColorId : getSecondaryTextColorId(nightMode);
ColorStateList textColorStateList = AndroidUtils.createPressedColorStateList(context, normalColorId, getPressedColorId(nightMode));
tv.setTextColor(textColorStateList);
}
}
protected static void setTintedIcon(Context context, AppCompatImageView iv, boolean enabled, boolean nightMode, ItemType type) {
Integer iconId = type.getIconId();
if (iv != null && iconId != null) {
Drawable icon = AppCompatResources.getDrawable(context, iconId);
int activeColorId = type.isNegative() ? R.color.color_osm_edit_delete : getActiveIconColorId(nightMode);
int normalColorId = enabled ? activeColorId : getSecondaryIconColorId(nightMode);
ColorStateList iconColorStateList = AndroidUtils.createPressedColorStateList(context, normalColorId, getPressedColorId(nightMode));
if (icon != null) {
DrawableCompat.setTintList(icon, iconColorStateList);
}
iv.setImageDrawable(icon);
if (type.iconId == R.drawable.ic_action_rec_stop) {
int stopSize = iv.getResources().getDimensionPixelSize(R.dimen.bottom_sheet_icon_margin_large);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(stopSize, stopSize);
iv.setLayoutParams(params);
View container = (View) iv.getParent();
setPadding(container, container.getPaddingLeft(), container.getTop(),
context.getResources().getDimensionPixelSize(R.dimen.content_padding_half), container.getBottom());
}
} }
AndroidUiHelper.updateVisibility(container, infoExpanded);
updateUpDownBtn();
} }
@Override @Override
protected boolean useVerticalButtons() { public void onPointSelected(TrkSegment segment, double lat, double lon) {
return true; if (trackChartPoints == null) {
} trackChartPoints = new TrackChartPoints();
trackChartPoints.setGpx(displayHelper.getGpx());
@Override }
protected int getRightButtonHeight() {
return getResources().getDimensionPixelSize(R.dimen.bottom_sheet_cancel_button_height);
}
@Override
protected int getDismissButtonHeight() {
return getResources().getDimensionPixelSize(R.dimen.bottom_sheet_cancel_button_height);
}
@Override
protected int getRightBottomButtonTextId() {
return R.string.start_recording;
}
@Override
protected int getDismissButtonTextId() {
return R.string.shared_string_cancel;
}
@Override
protected DialogButtonType getRightBottomButtonType() {
return DialogButtonType.PRIMARY;
}
@Override
public int getSecondDividerHeight() {
return getResources().getDimensionPixelSize(R.dimen.bottom_sheet_icon_margin);
}
@Override
protected void onRightBottomButtonClick() {
SavingTrackHelper helper = app.getSavingTrackHelper();
helper.startNewSegment();
settings.SAVE_GLOBAL_TRACK_TO_GPX.set(true);
app.startNavigationService(NavigationService.USED_BY_GPX);
MapActivity mapActivity = getMapActivity(); MapActivity mapActivity = getMapActivity();
if (mapActivity != null) { if (mapActivity != null) {
TripRecordingActiveBottomSheet.showInstance(mapActivity.getSupportFragmentManager(), helper.getCurrentTrack()); int segmentColor = segment != null ? segment.getColor(0) : 0;
trackChartPoints.setSegmentColor(segmentColor);
trackChartPoints.setHighlightedPoint(new LatLon(lat, lon));
mapActivity.getMapLayers().getGpxLayer().setTrackChartPoints(trackChartPoints);
mapActivity.refreshMap();
} }
dismiss(); }
@Override
public void updateContent() {
}
@Override
public void onChartTouch() {
}
@Override
public void scrollBy(int px) {
}
@Override
public void openSplitInterval(GpxDisplayItem gpxItem, TrkSegment trkSegment) {
}
@Override
public void showOptionsPopupMenu(View view, TrkSegment segment, boolean confirmDeletion, GpxDisplayItem gpxItem) {
}
@Override
public void openAnalyzeOnMap(GpxDisplayItem gpxItem) {
}
public interface DismissTargetFragment {
void dismissTarget();
}
@ColorRes
public static int getActiveTextColorId(boolean nightMode) {
return nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light;
}
@ColorRes
public static int getActiveIconColorId(boolean nightMode) {
return nightMode ? R.color.icon_color_active_dark : R.color.icon_color_active_light;
}
@ColorRes
public static int getSecondaryIconColorId(boolean nightMode) {
return nightMode ? R.color.icon_color_secondary_dark : R.color.icon_color_secondary_light;
}
@ColorRes
public static int getActiveButtonColorId(boolean nightMode) {
return nightMode ? R.color.active_buttons_and_links_bg_pressed_dark : R.color.active_buttons_and_links_bg_pressed_light;
}
@ColorRes
public static int getInactiveButtonColorId(boolean nightMode) {
return nightMode ? R.color.inactive_buttons_and_links_bg_dark : R.color.inactive_buttons_and_links_bg_light;
}
@ColorRes
public static int getOsmandIconColorId(boolean nightMode) {
return nightMode ? R.color.icon_color_osmand_dark : R.color.icon_color_osmand_light;
}
@ColorRes
public static int getActiveTransparentColorId(boolean nightMode) {
return nightMode ? R.color.switch_button_active_dark : R.color.switch_button_active_light;
}
@ColorRes
public static int getPressedColorId(boolean nightMode) {
return nightMode ? R.color.active_buttons_and_links_text_dark : R.color.active_buttons_and_links_text_light;
}
@DrawableRes
public static int getActiveTransparentBackgroundId(boolean nightMode) {
return nightMode ? R.drawable.btn_background_active_transparent_dark : R.drawable.btn_background_active_transparent_light;
}
@DrawableRes
public static int getInactiveStrokedBackgroundId(boolean nightMode) {
return nightMode ? R.drawable.btn_background_stroked_inactive_dark : R.drawable.btn_background_stroked_inactive_light;
}
@DrawableRes
public static int getInactiveButtonBackgroundId(boolean nightMode) {
return nightMode ? R.drawable.btn_background_inactive_dark : R.drawable.btn_background_inactive_light;
}
@Override
protected boolean hideButtonsContainer() {
return true;
} }
@Nullable @Nullable
@ -296,11 +662,4 @@ public class TripRecordingBottomSheet extends MenuBottomSheetDialogFragment {
} }
return null; return null;
} }
public static void showInstance(@NonNull FragmentManager fragmentManager) {
if (!fragmentManager.isStateSaved()) {
TripRecordingBottomSheet fragment = new TripRecordingBottomSheet();
fragment.show(fragmentManager, TAG);
}
}
} }

View file

@ -11,21 +11,23 @@ import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
import net.osmand.plus.monitoring.TripRecordingActiveBottomSheet.ItemType; import net.osmand.plus.monitoring.TripRecordingBottomSheet.ItemType;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
public class ClearRecordedDataBottomSheetFragment extends MenuBottomSheetDialogFragment { import static net.osmand.AndroidUtils.getPrimaryTextColorId;
public static final String TAG = ClearRecordedDataBottomSheetFragment.class.getSimpleName(); public class TripRecordingClearDataBottomSheet extends MenuBottomSheetDialogFragment implements TripRecordingBottomSheet.DismissTargetFragment {
public static final String TAG = TripRecordingClearDataBottomSheet.class.getSimpleName();
private OsmandApplication app; private OsmandApplication app;
public static void showInstance(@NonNull FragmentManager fragmentManager, @NonNull Fragment target) { public static void showInstance(@NonNull FragmentManager fragmentManager, @NonNull Fragment target) {
if (!fragmentManager.isStateSaved()) { if (!fragmentManager.isStateSaved()) {
ClearRecordedDataBottomSheetFragment fragment = new ClearRecordedDataBottomSheetFragment(); TripRecordingClearDataBottomSheet fragment = new TripRecordingClearDataBottomSheet();
fragment.setTargetFragment(target, 0); fragment.setTargetFragment(target, 0);
fragment.show(fragmentManager, TAG); fragment.show(fragmentManager, TAG);
} }
@ -37,14 +39,14 @@ public class ClearRecordedDataBottomSheetFragment extends MenuBottomSheetDialogF
LayoutInflater inflater = UiUtilities.getInflater(app, nightMode); LayoutInflater inflater = UiUtilities.getInflater(app, nightMode);
int verticalBig = getResources().getDimensionPixelSize(R.dimen.dialog_content_margin); int verticalBig = getResources().getDimensionPixelSize(R.dimen.dialog_content_margin);
int verticalNormal = getResources().getDimensionPixelSize(R.dimen.content_padding); int verticalNormal = getResources().getDimensionPixelSize(R.dimen.content_padding);
String description = getString(R.string.clear_recorded_data_warning)
.concat("\n").concat(getString(R.string.lost_data_warning));
final View buttonClear = createItem(inflater, ItemType.CLEAR_DATA); final View buttonClear = createItem(inflater, ItemType.CLEAR_DATA);
final View buttonCancel = createItem(inflater, ItemType.CANCEL); final View buttonCancel = createItem(inflater, ItemType.CANCEL);
items.add(new BottomSheetItemWithDescription.Builder() items.add(new BottomSheetItemWithDescription.Builder()
.setDescription(app.getString(R.string.clear_recorded_data_warning)) .setDescription(description)
.setDescriptionColorId(!nightMode ? R.color.text_color_primary_light : R.color.text_color_primary_dark) .setDescriptionColorId(getPrimaryTextColorId(nightMode))
.setDescriptionMaxLines(2)
.setTitle(app.getString(R.string.clear_recorded_data)) .setTitle(app.getString(R.string.clear_recorded_data))
.setLayoutId(R.layout.bottom_sheet_item_title_with_description) .setLayoutId(R.layout.bottom_sheet_item_title_with_description)
.create()); .create());
@ -58,6 +60,7 @@ public class ClearRecordedDataBottomSheetFragment extends MenuBottomSheetDialogF
public void onClick(View v) { public void onClick(View v) {
app.getSavingTrackHelper().clearRecordedData(true); app.getSavingTrackHelper().clearRecordedData(true);
dismiss(); dismiss();
dismissTarget();
} }
}) })
.create()); .create());
@ -78,15 +81,15 @@ public class ClearRecordedDataBottomSheetFragment extends MenuBottomSheetDialogF
} }
private View createItem(LayoutInflater inflater, ItemType type) { private View createItem(LayoutInflater inflater, ItemType type) {
return TripRecordingActiveBottomSheet.createItem(app, nightMode, inflater, type); return TripRecordingBottomSheet.createItem(app, nightMode, inflater, type);
} }
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
Fragment target = getTargetFragment(); Fragment target = getTargetFragment();
if (target instanceof TripRecordingActiveBottomSheet) { if (target instanceof TripRecordingOptionsBottomSheet) {
((TripRecordingActiveBottomSheet) target).hide(); ((TripRecordingOptionsBottomSheet) target).hide();
} }
} }
@ -94,8 +97,8 @@ public class ClearRecordedDataBottomSheetFragment extends MenuBottomSheetDialogF
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
Fragment target = getTargetFragment(); Fragment target = getTargetFragment();
if (target instanceof TripRecordingActiveBottomSheet) { if (target instanceof TripRecordingOptionsBottomSheet) {
((TripRecordingActiveBottomSheet) target).show(); ((TripRecordingOptionsBottomSheet) target).show();
} }
} }
@ -103,4 +106,12 @@ public class ClearRecordedDataBottomSheetFragment extends MenuBottomSheetDialogF
protected boolean hideButtonsContainer() { protected boolean hideButtonsContainer() {
return true; return true;
} }
@Override
public void dismissTarget() {
Fragment target = getTargetFragment();
if (target instanceof TripRecordingOptionsBottomSheet) {
((TripRecordingOptionsBottomSheet) target).dismiss();
}
}
} }

View file

@ -8,36 +8,28 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin; import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.UiUtilities; import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.MenuBottomSheetDialogFragment; import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
import net.osmand.plus.monitoring.TripRecordingActiveBottomSheet.ItemType; import net.osmand.plus.monitoring.TripRecordingBottomSheet.ItemType;
import net.osmand.plus.settings.backend.OsmandSettings;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
public class StopTrackRecordingBottomFragment extends MenuBottomSheetDialogFragment { import static net.osmand.AndroidUtils.getPrimaryTextColorId;
import static net.osmand.plus.monitoring.TripRecordingOptionsBottomSheet.ACTION_STOP_AND_DISMISS;
public static final String TAG = StopTrackRecordingBottomFragment.class.getSimpleName(); public class TripRecordingDiscardBottomSheet extends MenuBottomSheetDialogFragment implements TripRecordingBottomSheet.DismissTargetFragment {
public static final String TAG = TripRecordingDiscardBottomSheet.class.getSimpleName();
private OsmandApplication app; private OsmandApplication app;
private MapActivity mapActivity;
private OsmandSettings settings;
private OsmandMonitoringPlugin plugin;
private ItemType tag = ItemType.CANCEL;
public void setMapActivity(MapActivity mapActivity) { public static void showInstance(@NonNull FragmentManager fragmentManager, @NonNull Fragment target) {
this.mapActivity = mapActivity;
}
public static void showInstance(MapActivity mapActivity, @NonNull FragmentManager fragmentManager, @NonNull Fragment target) {
if (!fragmentManager.isStateSaved()) { if (!fragmentManager.isStateSaved()) {
StopTrackRecordingBottomFragment fragment = new StopTrackRecordingBottomFragment(); TripRecordingDiscardBottomSheet fragment = new TripRecordingDiscardBottomSheet();
fragment.setMapActivity(mapActivity);
fragment.setTargetFragment(target, 0); fragment.setTargetFragment(target, 0);
fragment.show(fragmentManager, TAG); fragment.show(fragmentManager, TAG);
} }
@ -46,67 +38,52 @@ public class StopTrackRecordingBottomFragment extends MenuBottomSheetDialogFragm
@Override @Override
public void createMenuItems(Bundle savedInstanceState) { public void createMenuItems(Bundle savedInstanceState) {
app = requiredMyApplication(); app = requiredMyApplication();
settings = app.getSettings(); final OsmandMonitoringPlugin plugin = OsmandPlugin.getPlugin(OsmandMonitoringPlugin.class);
plugin = OsmandPlugin.getPlugin(OsmandMonitoringPlugin.class);
LayoutInflater inflater = UiUtilities.getInflater(app, nightMode); LayoutInflater inflater = UiUtilities.getInflater(app, nightMode);
int verticalBig = getResources().getDimensionPixelSize(R.dimen.dialog_content_margin); int verticalBig = getResources().getDimensionPixelSize(R.dimen.dialog_content_margin);
int verticalNormal = getResources().getDimensionPixelSize(R.dimen.content_padding); int verticalNormal = getResources().getDimensionPixelSize(R.dimen.content_padding);
final View buttonDiscard = createItem(inflater, ItemType.STOP_AND_DISCARD);
// final View buttonDiscard = createItem(inflater, ItemType.STOP_AND_DISCARD);
final View buttonSave = createItem(inflater, ItemType.STOP_AND_SAVE);
final View buttonCancel = createItem(inflater, ItemType.CANCEL); final View buttonCancel = createItem(inflater, ItemType.CANCEL);
items.add(new BottomSheetItemWithDescription.Builder() items.add(new BottomSheetItemWithDescription.Builder()
.setDescription(app.getString(R.string.track_recording_description)) .setDescription(getString(R.string.track_recording_description))
.setDescriptionColorId(!nightMode ? R.color.text_color_primary_light : R.color.text_color_primary_dark) .setDescriptionColorId(getPrimaryTextColorId(nightMode))
.setDescriptionMaxLines(4)
.setTitle(app.getString(R.string.track_recording_title)) .setTitle(app.getString(R.string.track_recording_title))
.setLayoutId(R.layout.bottom_sheet_item_title_with_description) .setLayoutId(R.layout.bottom_sheet_item_title_with_description)
.create()); .create());
items.add(new DividerSpaceItem(app, verticalBig)); items.add(new DividerSpaceItem(app, verticalBig));
/*items.add(new BaseBottomSheetItem.Builder() items.add(new BaseBottomSheetItem.Builder()
.setCustomView(buttonDiscard) .setCustomView(buttonDiscard)
.setOnClickListener(new View.OnClickListener() { .setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
tag = (ItemType) buttonDiscard.getTag(); if (plugin != null && app.getSettings().SAVE_GLOBAL_TRACK_TO_GPX.get()) {
if (plugin != null && settings.SAVE_GLOBAL_TRACK_TO_GPX.get()) {
plugin.stopRecording(); plugin.stopRecording();
app.getNotificationHelper().refreshNotifications(); app.getNotificationHelper().refreshNotifications();
} }
app.getSavingTrackHelper().clearRecordedData(true); app.getSavingTrackHelper().clearRecordedData(true);
dismiss(); dismiss();
}
})
.create());
items.add(new DividerSpaceItem(app, verticalBig));*/ Fragment target = getTargetFragment();
if (target != null) {
items.add(new BaseBottomSheetItem.Builder() Bundle args = new Bundle();
.setCustomView(buttonSave) args.putBoolean(ACTION_STOP_AND_DISMISS, true);
.setOnClickListener(new View.OnClickListener() { target.setArguments(args);
@Override
public void onClick(View v) {
tag = (ItemType) buttonSave.getTag();
if (plugin != null && app.getSavingTrackHelper().hasDataToSave()) {
plugin.saveCurrentTrack(null, mapActivity);
app.getNotificationHelper().refreshNotifications();
dismiss();
} }
dismissTarget();
} }
}) })
.create()); .create());
items.add(new DividerSpaceItem(app, verticalNormal)); items.add(new DividerSpaceItem(app, verticalBig));
items.add(new BaseBottomSheetItem.Builder() items.add(new BaseBottomSheetItem.Builder()
.setCustomView(buttonCancel) .setCustomView(buttonCancel)
.setOnClickListener(new View.OnClickListener() { .setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
tag = (ItemType) buttonCancel.getTag();
dismiss(); dismiss();
} }
}) })
@ -116,15 +93,15 @@ public class StopTrackRecordingBottomFragment extends MenuBottomSheetDialogFragm
} }
private View createItem(LayoutInflater inflater, ItemType type) { private View createItem(LayoutInflater inflater, ItemType type) {
return TripRecordingActiveBottomSheet.createItem(app, nightMode, inflater, type); return TripRecordingBottomSheet.createItem(app, nightMode, inflater, type);
} }
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
Fragment target = getTargetFragment(); Fragment target = getTargetFragment();
if (target instanceof TripRecordingActiveBottomSheet) { if (target instanceof TripRecordingOptionsBottomSheet) {
((TripRecordingActiveBottomSheet) target).hide(); ((TripRecordingOptionsBottomSheet) target).hide();
} }
} }
@ -132,13 +109,16 @@ public class StopTrackRecordingBottomFragment extends MenuBottomSheetDialogFragm
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
Fragment target = getTargetFragment(); Fragment target = getTargetFragment();
if (target instanceof TripRecordingActiveBottomSheet) { if (target instanceof TripRecordingOptionsBottomSheet) {
TripRecordingActiveBottomSheet tripRec = (TripRecordingActiveBottomSheet) target; ((TripRecordingOptionsBottomSheet) target).show();
if (tag == ItemType.CANCEL) { }
tripRec.show(); }
} else {
tripRec.dismiss(); @Override
} public void dismissTarget() {
Fragment target = getTargetFragment();
if (target instanceof TripRecordingOptionsBottomSheet) {
((TripRecordingOptionsBottomSheet) target).dismiss();
} }
} }

View file

@ -0,0 +1,321 @@
package net.osmand.plus.monitoring;
import android.app.Activity;
import android.app.Dialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.SavingTrackHelper;
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.monitoring.TripRecordingBottomSheet.ItemType;
import net.osmand.plus.myplaces.SaveCurrentTrackTask;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.track.SaveGpxAsyncTask.SaveGpxListener;
import net.osmand.util.Algorithms;
import static net.osmand.AndroidUtils.getPrimaryTextColorId;
public class TripRecordingOptionsBottomSheet extends MenuBottomSheetDialogFragment implements TripRecordingBottomSheet.DismissTargetFragment {
public static final String TAG = TripRecordingOptionsBottomSheet.class.getSimpleName();
public static final String ACTION_STOP_AND_DISMISS = "action_stop_and_discard";
private static final int SAVE_UPDATE_INTERVAL = 1000;
private OsmandApplication app;
private OsmandSettings settings;
private SavingTrackHelper helper;
private View buttonClear;
private View buttonSave;
private SelectedGpxFile selectedGpxFile;
private final Handler handler = new Handler();
private Runnable updatingTimeTrackSaved;
private int indexButtonOnline = -1;
private int indexButtonOnlineDivider = -1;
private GPXFile getGPXFile() {
return selectedGpxFile.getGpxFile();
}
public void setSelectedGpxFile(SelectedGpxFile selectedGpxFile) {
this.selectedGpxFile = selectedGpxFile;
}
public boolean hasDataToSave() {
return app.getSavingTrackHelper().hasDataToSave();
}
public boolean wasTrackMonitored() {
return settings.SAVE_GLOBAL_TRACK_TO_GPX.get();
}
public static void showInstance(@NonNull FragmentManager fragmentManager, @NonNull Fragment target) {
if (!fragmentManager.isStateSaved()) {
TripRecordingOptionsBottomSheet fragment = new TripRecordingOptionsBottomSheet();
fragment.setTargetFragment(target, 0);
fragment.show(fragmentManager, TAG);
}
}
@Override
public void createMenuItems(Bundle savedInstanceState) {
app = requiredMyApplication();
settings = app.getSettings();
helper = app.getSavingTrackHelper();
selectedGpxFile = helper.getCurrentTrack();
LayoutInflater inflater = UiUtilities.getInflater(app, nightMode);
final FragmentManager fragmentManager = getFragmentManager();
int dp16 = getResources().getDimensionPixelSize(R.dimen.content_padding);
int dp36 = getResources().getDimensionPixelSize(R.dimen.context_menu_controller_height);
buttonClear = createItem(inflater, ItemType.CLEAR_DATA, hasDataToSave());
final View buttonDiscard = createItem(inflater, ItemType.STOP_AND_DISCARD);
final View buttonOnline = createItem(inflater, ItemType.STOP_ONLINE, hasDataToSave());
buttonSave = createItem(inflater, ItemType.SAVE, hasDataToSave());
final View buttonSegment = createItem(inflater, ItemType.START_NEW_SEGMENT, wasTrackMonitored());
items.add(new SimpleBottomSheetItem.Builder()
.setTitle(getString(R.string.shared_string_options))
.setTitleColorId(getPrimaryTextColorId(nightMode))
.setLayoutId(R.layout.bottom_sheet_item_title)
.create());
items.add(new DividerSpaceItem(app, getResources().getDimensionPixelSize(R.dimen.content_padding_small)));
items.add(new BaseBottomSheetItem.Builder()
.setCustomView(buttonClear)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (fragmentManager != null && hasDataToSave()) {
TripRecordingClearDataBottomSheet.showInstance(fragmentManager, TripRecordingOptionsBottomSheet.this);
}
}
})
.create());
items.add(new DividerSpaceItem(app, dp16));
items.add(new BaseBottomSheetItem.Builder()
.setCustomView(buttonDiscard)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (fragmentManager != null) {
TripRecordingDiscardBottomSheet.showInstance(fragmentManager, TripRecordingOptionsBottomSheet.this);
}
}
})
.create());
items.add(new DividerSpaceItem(app, dp36));
if (app.getLiveMonitoringHelper().isLiveMonitoringEnabled()) {
items.add(new BaseBottomSheetItem.Builder()
.setCustomView(buttonOnline)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
settings.LIVE_MONITORING.set(false);
if (indexButtonOnline != -1) {
AndroidUiHelper.updateVisibility(items.get(indexButtonOnline).getView(), false);
}
if (indexButtonOnlineDivider != -1) {
AndroidUiHelper.updateVisibility(items.get(indexButtonOnlineDivider).getView(), false);
}
}
})
.create());
indexButtonOnline = items.size() - 1;
items.add(new DividerSpaceItem(app, dp36));
indexButtonOnlineDivider = items.size() - 1;
}
items.add(new BaseBottomSheetItem.Builder()
.setCustomView(buttonSave)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (hasDataToSave()) {
final GPXFile gpxFile = getGPXFile();
new SaveCurrentTrackTask(app, gpxFile, createSaveListener()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
})
.create());
items.add(new DividerSpaceItem(app, dp16));
items.add(new BaseBottomSheetItem.Builder()
.setCustomView(buttonSegment)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (wasTrackMonitored()) {
helper.startNewSegment();
}
}
})
.create());
items.add(new DividerSpaceItem(app, getResources().getDimensionPixelSize(R.dimen.content_padding_small)));
}
@Override
public void onResume() {
super.onResume();
runUpdatingTimeTrackSaved();
Fragment target = getTargetFragment();
if (target instanceof TripRecordingBottomSheet) {
((TripRecordingBottomSheet) target).hide();
}
}
@Override
public void onPause() {
super.onPause();
stopUpdatingTimeTrackSaved();
dismissTarget();
}
public void show() {
Dialog dialog = getDialog();
if (dialog != null) {
dialog.show();
}
}
public void hide() {
Dialog dialog = getDialog();
if (dialog != null) {
dialog.hide();
}
}
public void stopUpdatingTimeTrackSaved() {
handler.removeCallbacks(updatingTimeTrackSaved);
}
public void runUpdatingTimeTrackSaved() {
updatingTimeTrackSaved = new Runnable() {
@Override
public void run() {
String time = getTimeTrackSaved();
TripRecordingBottomSheet.createItem(app, nightMode, buttonSave, ItemType.SAVE, hasDataToSave(), !Algorithms.isEmpty(time) ? time : null);
TripRecordingBottomSheet.createItem(app, nightMode, buttonClear, ItemType.CLEAR_DATA, hasDataToSave(), null);
handler.postDelayed(this, SAVE_UPDATE_INTERVAL);
}
};
handler.post(updatingTimeTrackSaved);
}
private String getTimeTrackSaved() {
long timeTrackSaved = helper.getLastTimeFileSaved();
if (timeTrackSaved != 0) {
long now = System.currentTimeMillis();
CharSequence time = DateUtils.getRelativeTimeSpanString(timeTrackSaved, now, DateUtils.MINUTE_IN_MILLIS);
return String.valueOf(time);
} else {
return null;
}
}
private View createItem(LayoutInflater inflater, ItemType type, boolean enabled) {
return TripRecordingBottomSheet.createItem(app, nightMode, inflater, type, enabled, null);
}
private View createItem(LayoutInflater inflater, ItemType type) {
return TripRecordingBottomSheet.createItem(app, nightMode, inflater, type);
}
private SaveGpxListener createSaveListener() {
return new SaveGpxListener() {
@Override
public void gpxSavingStarted() {
}
@Override
public void gpxSavingFinished(Exception errorMessage) {
MapActivity mapActivity = getMapActivity();
OsmandMonitoringPlugin plugin = OsmandPlugin.getPlugin(OsmandMonitoringPlugin.class);
if (mapActivity != null && plugin != null) {
stopUpdatingTimeTrackSaved();
plugin.saveCurrentTrack(null, mapActivity, false, true);
Bundle args = new Bundle();
args.putBoolean(ACTION_STOP_AND_DISMISS, true);
setArguments(args);
dismiss();
dismissTarget();
}
}
};
}
private boolean isDiscard() {
Bundle args = getArguments();
if (args != null) {
return args.getBoolean(ACTION_STOP_AND_DISMISS);
}
return false;
}
@Override
public void dismissTarget() {
Fragment target = getTargetFragment();
if (target instanceof TripRecordingBottomSheet) {
if (isDiscard()) {
((TripRecordingBottomSheet) target).dismiss();
} else {
((TripRecordingBottomSheet) target).show();
}
}
}
@Nullable
public MapActivity getMapActivity() {
Activity activity = getActivity();
if (activity instanceof MapActivity) {
return (MapActivity) activity;
}
return null;
}
@Override
protected int getDismissButtonHeight() {
return getResources().getDimensionPixelSize(R.dimen.bottom_sheet_cancel_button_height);
}
@Override
protected int getDismissButtonTextId() {
return R.string.shared_string_back;
}
@Override
protected boolean useVerticalButtons() {
return true;
}
}

View file

@ -0,0 +1,266 @@
package net.osmand.plus.monitoring;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.SpannableString;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.cardview.widget.CardView;
import androidx.fragment.app.FragmentManager;
import com.google.android.material.slider.RangeSlider;
import net.osmand.plus.NavigationService;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.helpers.FontCache;
import net.osmand.plus.monitoring.TripRecordingBottomSheet.ItemType;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.fragments.BaseSettingsFragment;
import net.osmand.plus.settings.fragments.BaseSettingsFragment.SettingsScreenType;
import static net.osmand.plus.monitoring.OsmandMonitoringPlugin.MINUTES;
import static net.osmand.plus.monitoring.OsmandMonitoringPlugin.SECONDS;
import static net.osmand.plus.monitoring.TripRecordingBottomSheet.createItem;
import static net.osmand.plus.monitoring.TripRecordingBottomSheet.createShowTrackItem;
import static net.osmand.plus.monitoring.TripRecordingBottomSheet.updateTrackIcon;
public class TripRecordingStartingBottomSheet extends MenuBottomSheetDialogFragment {
public static final String TAG = TripRecordingStartingBottomSheet.class.getSimpleName();
public static final String UPDATE_LOGGING_INTERVAL = "update_logging_interval";
private OsmandApplication app;
private OsmandSettings settings;
private AppCompatImageView upDownBtn;
private AppCompatImageView trackAppearanceIcon;
private TextView intervalValueView;
private LinearLayout intervalContainer;
private RangeSlider intervalSlider;
private boolean infoExpanded;
public static void showInstance(@NonNull FragmentManager fragmentManager) {
if (!fragmentManager.isStateSaved()) {
TripRecordingStartingBottomSheet fragment = new TripRecordingStartingBottomSheet();
fragment.show(fragmentManager, TAG);
}
}
public static void showTripRecordingDialog(@NonNull FragmentManager fragmentManager, OsmandApplication app) {
if (!fragmentManager.isStateSaved()) {
OsmandSettings settings = app.getSettings();
boolean showStartDialog = settings.SHOW_TRIP_REC_START_DIALOG.get();
if (showStartDialog) {
showInstance(fragmentManager);
} else {
startRecording(app);
TripRecordingBottomSheet.showInstance(fragmentManager);
}
}
}
@Override
public void createMenuItems(Bundle savedInstanceState) {
app = requiredMyApplication();
settings = app.getSettings();
Context context = requireContext();
LayoutInflater inflater = UiUtilities.getInflater(context, nightMode);
View itemView = inflater.inflate(R.layout.trip_recording_starting_fragment, null, false);
items.add(new BaseBottomSheetItem.Builder()
.setCustomView(itemView)
.create());
LinearLayout expandHideIntervalContainer = itemView.findViewById(R.id.interval_view_container);
upDownBtn = itemView.findViewById(R.id.up_down_button);
expandHideIntervalContainer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateIntervalContainer();
}
});
intervalValueView = itemView.findViewById(R.id.interval_value);
intervalContainer = itemView.findViewById(R.id.always_ask_and_range_slider_container);
intervalSlider = itemView.findViewById(R.id.interval_slider);
updateIntervalValue();
LinearLayout showTrackContainer = itemView.findViewById(R.id.show_track_on_map);
trackAppearanceIcon = showTrackContainer.findViewById(R.id.additional_button_icon);
createShowTrackItem(showTrackContainer, trackAppearanceIcon, R.string.shared_string_show_on_map,
TripRecordingStartingBottomSheet.this, nightMode, new Runnable() {
@Override
public void run() {
hide();
}
});
updateUpDownBtn();
CardView cardLeft = itemView.findViewById(R.id.button_left);
createItem(app, nightMode, cardLeft, ItemType.CANCEL, true, null);
cardLeft.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
CardView cardCenter = itemView.findViewById(R.id.button_center);
createItem(app, nightMode, cardCenter, ItemType.START_RECORDING, true, null);
cardCenter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startRecording();
}
});
CardView cardRight = itemView.findViewById(R.id.button_right);
createItem(app, nightMode, cardRight, ItemType.SETTINGS, true, null);
cardRight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
hide();
BaseSettingsFragment.showInstance(mapActivity, SettingsScreenType.MONITORING_SETTINGS,
null, new Bundle(), TripRecordingStartingBottomSheet.this);
}
}
});
}
private void updateIntervalLegend() {
String text = getString(R.string.save_track_interval_globally);
String textValue;
int interval = settings.SAVE_GLOBAL_TRACK_INTERVAL.get();
if (interval == 0) {
textValue = getString(R.string.int_continuosly);
} else {
int seconds = interval / 1000;
if (seconds <= SECONDS[SECONDS.length - 1]) {
textValue = seconds + " " + getString(R.string.int_seconds);
} else {
textValue = (seconds / 60) + " " + getString(R.string.int_min);
}
}
String textAll = getString(R.string.ltr_or_rtl_combine_via_colon, text, textValue);
Typeface typeface = FontCache.getRobotoMedium(app);
SpannableString spannableString = UiUtilities.createCustomFontSpannable(typeface, textAll, textValue);
intervalValueView.setText(spannableString);
}
private void updateIntervalValue() {
if (intervalSlider != null && intervalContainer != null) {
updateIntervalLegend();
final int secondsLength = SECONDS.length;
final int minutesLength = MINUTES.length;
intervalSlider.setValueTo(secondsLength + minutesLength - 1);
int currentModeColor = app.getSettings().getApplicationMode().getProfileColor(nightMode);
UiUtilities.setupSlider(intervalSlider, nightMode, currentModeColor, true);
intervalContainer.setVisibility(View.GONE);
intervalSlider.addOnChangeListener(new RangeSlider.OnChangeListener() {
@Override
public void onValueChange(@NonNull RangeSlider slider, float value, boolean fromUser) {
int progress = (int) value;
if (progress == 0) {
settings.SAVE_GLOBAL_TRACK_INTERVAL.set(0);
} else if (progress < secondsLength) {
settings.SAVE_GLOBAL_TRACK_INTERVAL.set(SECONDS[progress] * 1000);
} else {
settings.SAVE_GLOBAL_TRACK_INTERVAL.set(MINUTES[progress - secondsLength] * 60 * 1000);
}
updateIntervalLegend();
}
});
for (int i = 0; i < secondsLength + minutesLength; i++) {
if (i < secondsLength) {
if (settings.SAVE_GLOBAL_TRACK_INTERVAL.get() <= SECONDS[i] * 1000) {
intervalSlider.setValues((float) i);
break;
}
} else {
if (settings.SAVE_GLOBAL_TRACK_INTERVAL.get() <= MINUTES[i - secondsLength] * 1000 * 60) {
intervalSlider.setValues((float) i);
break;
}
}
}
}
}
private void updateIntervalContainer() {
infoExpanded = !infoExpanded;
AndroidUiHelper.updateVisibility(intervalContainer, infoExpanded);
updateUpDownBtn();
}
private void updateUpDownBtn() {
int iconId = infoExpanded ? R.drawable.ic_action_arrow_down : R.drawable.ic_action_arrow_up;
upDownBtn.setImageDrawable(getContentIcon(iconId));
}
private static void startRecording(OsmandApplication app) {
app.getSavingTrackHelper().startNewSegment();
app.getSettings().SAVE_GLOBAL_TRACK_TO_GPX.set(true);
app.startNavigationService(NavigationService.USED_BY_GPX);
}
private void startRecording() {
startRecording(app);
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
TripRecordingBottomSheet.showInstance(mapActivity.getSupportFragmentManager());
}
dismiss();
}
public void show() {
Dialog dialog = getDialog();
if (dialog != null) {
dialog.show();
updateTrackIcon(app, trackAppearanceIcon);
updateIntervalValue();
AndroidUiHelper.updateVisibility(intervalContainer, infoExpanded);
}
}
public void hide() {
Dialog dialog = getDialog();
if (dialog != null) {
dialog.hide();
}
}
@Nullable
public MapActivity getMapActivity() {
Activity activity = getActivity();
if (activity instanceof MapActivity) {
return (MapActivity) activity;
}
return null;
}
@Override
protected boolean hideButtonsContainer() {
return true;
}
}

View file

@ -61,6 +61,8 @@ import java.util.Map;
import static net.osmand.plus.helpers.GpxUiHelper.LineGraphType.ALTITUDE; import static net.osmand.plus.helpers.GpxUiHelper.LineGraphType.ALTITUDE;
import static net.osmand.plus.helpers.GpxUiHelper.LineGraphType.SLOPE; import static net.osmand.plus.helpers.GpxUiHelper.LineGraphType.SLOPE;
import static net.osmand.plus.helpers.GpxUiHelper.LineGraphType.SPEED; import static net.osmand.plus.helpers.GpxUiHelper.LineGraphType.SPEED;
import static net.osmand.plus.myplaces.GPXTabItemType.GPX_TAB_ITEM_ALTITUDE;
import static net.osmand.plus.myplaces.GPXTabItemType.GPX_TAB_ITEM_SPEED;
public class GPXItemPagerAdapter extends PagerAdapter implements CustomTabProvider, ViewAtPositionInterface { public class GPXItemPagerAdapter extends PagerAdapter implements CustomTabProvider, ViewAtPositionInterface {
@ -79,18 +81,21 @@ public class GPXItemPagerAdapter extends PagerAdapter implements CustomTabProvid
private boolean chartClicked; private boolean chartClicked;
private boolean nightMode; private boolean nightMode;
private boolean onlyGraphs;
public GPXItemPagerAdapter(@NonNull OsmandApplication app, public GPXItemPagerAdapter(@NonNull OsmandApplication app,
@NonNull GpxDisplayItem gpxItem, @NonNull GpxDisplayItem gpxItem,
@NonNull TrackDisplayHelper displayHelper, @NonNull TrackDisplayHelper displayHelper,
boolean nightMode, @NonNull SegmentActionsListener actionsListener) { boolean nightMode,
@NonNull SegmentActionsListener actionsListener,
boolean onlyGraphs) {
super(); super();
this.app = app; this.app = app;
this.gpxItem = gpxItem; this.gpxItem = gpxItem;
this.nightMode = nightMode; this.nightMode = nightMode;
this.displayHelper = displayHelper; this.displayHelper = displayHelper;
this.actionsListener = actionsListener; this.actionsListener = actionsListener;
this.onlyGraphs = onlyGraphs;
iconsCache = app.getUIUtilities(); iconsCache = app.getUIUtilities();
fetchTabTypes(); fetchTabTypes();
} }
@ -100,10 +105,10 @@ public class GPXItemPagerAdapter extends PagerAdapter implements CustomTabProvid
tabTypeList.add(GPXTabItemType.GPX_TAB_ITEM_GENERAL); tabTypeList.add(GPXTabItemType.GPX_TAB_ITEM_GENERAL);
if (gpxItem != null && gpxItem.analysis != null) { if (gpxItem != null && gpxItem.analysis != null) {
if (gpxItem.analysis.hasElevationData) { if (gpxItem.analysis.hasElevationData) {
tabTypeList.add(GPXTabItemType.GPX_TAB_ITEM_ALTITUDE); tabTypeList.add(GPX_TAB_ITEM_ALTITUDE);
} }
if (gpxItem.analysis.isSpeedSpecified()) { if (gpxItem.analysis.isSpeedSpecified()) {
tabTypeList.add(GPXTabItemType.GPX_TAB_ITEM_SPEED); tabTypeList.add(GPX_TAB_ITEM_SPEED);
} }
} }
tabTypes = tabTypeList.toArray(new GPXTabItemType[0]); tabTypes = tabTypeList.toArray(new GPXTabItemType[0]);
@ -217,72 +222,87 @@ public class GPXItemPagerAdapter extends PagerAdapter implements CustomTabProvid
private View getViewForTab(@NonNull ViewGroup container, @NonNull GPXTabItemType tabType) { private View getViewForTab(@NonNull ViewGroup container, @NonNull GPXTabItemType tabType) {
LayoutInflater inflater = LayoutInflater.from(container.getContext()); LayoutInflater inflater = LayoutInflater.from(container.getContext());
switch (tabType) { int layoutResId;
case GPX_TAB_ITEM_ALTITUDE: if (tabType == GPX_TAB_ITEM_ALTITUDE) {
return inflater.inflate(R.layout.gpx_item_altitude, container, false); layoutResId = R.layout.gpx_item_altitude;
case GPX_TAB_ITEM_SPEED: } else if (tabType == GPX_TAB_ITEM_SPEED) {
return inflater.inflate(R.layout.gpx_item_speed, container, false); layoutResId = R.layout.gpx_item_speed;
case GPX_TAB_ITEM_GENERAL: } else {
default: layoutResId = R.layout.gpx_item_general;
return inflater.inflate(R.layout.gpx_item_general, container, false);
} }
View view = inflater.inflate(layoutResId, container, false);
if (onlyGraphs) {
AndroidUiHelper.setVisibility(View.GONE,
view.findViewById(R.id.gpx_join_gaps_container),
view.findViewById(R.id.top_line_blocks),
view.findViewById(R.id.list_divider),
view.findViewById(R.id.bottom_line_blocks),
view.findViewById(R.id.details_divider),
view.findViewById(R.id.details_view)
);
}
return view;
} }
private void setupSpeedTab(View view, LineChart chart, GPXTrackAnalysis analysis, GPXFile gpxFile, int position) { private void setupSpeedTab(View view, LineChart chart, GPXTrackAnalysis analysis, GPXFile gpxFile, int position) {
if (analysis != null && analysis.isSpeedSpecified()) { if (analysis != null && analysis.isSpeedSpecified()) {
if (analysis.hasSpeedData) { if (analysis.hasSpeedData) {
GpxUiHelper.setupGPXChart(app, chart, 4); GpxUiHelper.setupGPXChart(app, chart, 4);
chart.setData(new LineData(getDataSets(chart, GPXTabItemType.GPX_TAB_ITEM_SPEED, SPEED, null))); chart.setData(new LineData(getDataSets(chart, GPX_TAB_ITEM_SPEED, SPEED, null)));
updateChart(chart); updateChart(chart);
chart.setVisibility(View.VISIBLE); chart.setVisibility(View.VISIBLE);
} else { } else {
chart.setVisibility(View.GONE); chart.setVisibility(View.GONE);
} }
((ImageView) view.findViewById(R.id.average_icon)) if (!onlyGraphs) {
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_speed)); ((ImageView) view.findViewById(R.id.average_icon))
((ImageView) view.findViewById(R.id.max_icon)) .setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_speed));
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_max_speed)); ((ImageView) view.findViewById(R.id.max_icon))
((ImageView) view.findViewById(R.id.time_moving_icon)) .setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_max_speed));
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_time_span)); ((ImageView) view.findViewById(R.id.time_moving_icon))
((ImageView) view.findViewById(R.id.distance_icon)) .setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_time_span));
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_polygom_dark)); ((ImageView) view.findViewById(R.id.distance_icon))
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_polygom_dark));
String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app); String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app);
String max = OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app); String max = OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app);
((TextView) view.findViewById(R.id.average_text)).setText(avg); ((TextView) view.findViewById(R.id.average_text)).setText(avg);
((TextView) view.findViewById(R.id.max_text)).setText(max); ((TextView) view.findViewById(R.id.max_text)).setText(max);
view.findViewById(R.id.gpx_join_gaps_container).setOnClickListener(new View.OnClickListener() { view.findViewById(R.id.gpx_join_gaps_container).setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (displayHelper.setJoinSegments(!displayHelper.isJoinSegments())) { if (displayHelper.setJoinSegments(!displayHelper.isJoinSegments())) {
actionsListener.updateContent(); actionsListener.updateContent();
for (int i = 0; i < getCount(); i++) { for (int i = 0; i < getCount(); i++) {
View view = getViewAtPosition(i); View view = getViewAtPosition(i);
updateJoinGapsInfo(view, i); updateJoinGapsInfo(view, i);
}
} }
} }
} });
}); }
} else { } else {
chart.setVisibility(View.GONE); chart.setVisibility(View.GONE);
view.findViewById(R.id.average_max).setVisibility(View.GONE); view.findViewById(R.id.top_line_blocks).setVisibility(View.GONE);
view.findViewById(R.id.list_divider).setVisibility(View.GONE); view.findViewById(R.id.list_divider).setVisibility(View.GONE);
view.findViewById(R.id.time_distance).setVisibility(View.GONE); view.findViewById(R.id.bottom_line_blocks).setVisibility(View.GONE);
} }
updateJoinGapsInfo(view, position); if (!onlyGraphs) {
view.findViewById(R.id.analyze_on_map).setOnClickListener(new View.OnClickListener() { updateJoinGapsInfo(view, position);
@Override view.findViewById(R.id.analyze_on_map).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) { @Override
openAnalyzeOnMap(GPXTabItemType.GPX_TAB_ITEM_SPEED); public void onClick(View v) {
openAnalyzeOnMap(GPX_TAB_ITEM_SPEED);
}
});
TextView overflowMenu = view.findViewById(R.id.overflow_menu);
if (!gpxItem.group.getTrack().generalTrack) {
setupOptionsPopupMenu(overflowMenu, false);
} else {
overflowMenu.setVisibility(View.GONE);
} }
});
TextView overflowMenu = view.findViewById(R.id.overflow_menu);
if (!gpxItem.group.getTrack().generalTrack) {
setupOptionsPopupMenu(overflowMenu, false);
} else {
overflowMenu.setVisibility(View.GONE);
} }
} }
@ -300,62 +320,66 @@ public class GPXItemPagerAdapter extends PagerAdapter implements CustomTabProvid
if (analysis != null) { if (analysis != null) {
if (analysis.hasElevationData) { if (analysis.hasElevationData) {
GpxUiHelper.setupGPXChart(app, chart, 4); GpxUiHelper.setupGPXChart(app, chart, 4);
chart.setData(new LineData(getDataSets(chart, GPXTabItemType.GPX_TAB_ITEM_ALTITUDE, ALTITUDE, SLOPE))); chart.setData(new LineData(getDataSets(chart, GPX_TAB_ITEM_ALTITUDE, ALTITUDE, SLOPE)));
updateChart(chart); updateChart(chart);
chart.setVisibility(View.VISIBLE); chart.setVisibility(View.VISIBLE);
} else { } else {
chart.setVisibility(View.GONE); chart.setVisibility(View.GONE);
} }
((ImageView) view.findViewById(R.id.average_icon)) if (!onlyGraphs) {
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_altitude_average)); ((ImageView) view.findViewById(R.id.average_icon))
((ImageView) view.findViewById(R.id.range_icon)) .setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_altitude_average));
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_altitude_average)); ((ImageView) view.findViewById(R.id.range_icon))
((ImageView) view.findViewById(R.id.ascent_icon)) .setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_altitude_average));
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_altitude_ascent)); ((ImageView) view.findViewById(R.id.ascent_icon))
((ImageView) view.findViewById(R.id.descent_icon)) .setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_altitude_ascent));
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_altitude_descent)); ((ImageView) view.findViewById(R.id.descent_icon))
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_altitude_descent));
String min = OsmAndFormatter.getFormattedAlt(analysis.minElevation, app); String min = OsmAndFormatter.getFormattedAlt(analysis.minElevation, app);
String max = OsmAndFormatter.getFormattedAlt(analysis.maxElevation, app); String max = OsmAndFormatter.getFormattedAlt(analysis.maxElevation, app);
String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app); String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app);
String desc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app); String desc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app);
((TextView) view.findViewById(R.id.average_text)) ((TextView) view.findViewById(R.id.average_text))
.setText(OsmAndFormatter.getFormattedAlt(analysis.avgElevation, app)); .setText(OsmAndFormatter.getFormattedAlt(analysis.avgElevation, app));
((TextView) view.findViewById(R.id.range_text)).setText(String.format("%s - %s", min, max)); ((TextView) view.findViewById(R.id.range_text)).setText(String.format("%s - %s", min, max));
((TextView) view.findViewById(R.id.ascent_text)).setText(asc); ((TextView) view.findViewById(R.id.ascent_text)).setText(asc);
((TextView) view.findViewById(R.id.descent_text)).setText(desc); ((TextView) view.findViewById(R.id.descent_text)).setText(desc);
view.findViewById(R.id.gpx_join_gaps_container).setOnClickListener(new View.OnClickListener() { view.findViewById(R.id.gpx_join_gaps_container).setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (displayHelper.setJoinSegments(!displayHelper.isJoinSegments())) { if (displayHelper.setJoinSegments(!displayHelper.isJoinSegments())) {
actionsListener.updateContent(); actionsListener.updateContent();
for (int i = 0; i < getCount(); i++) { for (int i = 0; i < getCount(); i++) {
View view = getViewAtPosition(i); View view = getViewAtPosition(i);
updateJoinGapsInfo(view, i); updateJoinGapsInfo(view, i);
}
} }
} }
} });
}); }
} else { } else {
chart.setVisibility(View.GONE); chart.setVisibility(View.GONE);
view.findViewById(R.id.average_range).setVisibility(View.GONE); view.findViewById(R.id.top_line_blocks).setVisibility(View.GONE);
view.findViewById(R.id.list_divider).setVisibility(View.GONE); view.findViewById(R.id.list_divider).setVisibility(View.GONE);
view.findViewById(R.id.ascent_descent).setVisibility(View.GONE); view.findViewById(R.id.bottom_line_blocks).setVisibility(View.GONE);
} }
updateJoinGapsInfo(view, position); if (!onlyGraphs) {
view.findViewById(R.id.analyze_on_map).setOnClickListener(new View.OnClickListener() { updateJoinGapsInfo(view, position);
@Override view.findViewById(R.id.analyze_on_map).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) { @Override
openAnalyzeOnMap(GPXTabItemType.GPX_TAB_ITEM_ALTITUDE); public void onClick(View v) {
openAnalyzeOnMap(GPX_TAB_ITEM_ALTITUDE);
}
});
TextView overflowMenu = view.findViewById(R.id.overflow_menu);
if (!gpxItem.group.getTrack().generalTrack) {
setupOptionsPopupMenu(overflowMenu, false);
} else {
overflowMenu.setVisibility(View.GONE);
} }
});
TextView overflowMenu = view.findViewById(R.id.overflow_menu);
if (!gpxItem.group.getTrack().generalTrack) {
setupOptionsPopupMenu(overflowMenu, false);
} else {
overflowMenu.setVisibility(View.GONE);
} }
} }
@ -369,60 +393,63 @@ public class GPXItemPagerAdapter extends PagerAdapter implements CustomTabProvid
} else { } else {
chart.setVisibility(View.GONE); chart.setVisibility(View.GONE);
} }
if (!onlyGraphs) {
((ImageView) view.findViewById(R.id.distance_icon))
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_polygom_dark));
((ImageView) view.findViewById(R.id.duration_icon))
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_time_span));
((ImageView) view.findViewById(R.id.start_time_icon))
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_time_start));
((ImageView) view.findViewById(R.id.end_time_icon))
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_time_end));
((ImageView) view.findViewById(R.id.distance_icon)) view.findViewById(R.id.gpx_join_gaps_container).setOnClickListener(new View.OnClickListener() {
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_polygom_dark)); @Override
((ImageView) view.findViewById(R.id.duration_icon)) public void onClick(View v) {
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_time_span)); if (displayHelper.setJoinSegments(!displayHelper.isJoinSegments())) {
((ImageView) view.findViewById(R.id.start_time_icon)) actionsListener.updateContent();
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_time_start)); for (int i = 0; i < getCount(); i++) {
((ImageView) view.findViewById(R.id.end_time_icon)) View view = getViewAtPosition(i);
.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_time_end)); updateJoinGapsInfo(view, i);
}
view.findViewById(R.id.gpx_join_gaps_container).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (displayHelper.setJoinSegments(!displayHelper.isJoinSegments())) {
actionsListener.updateContent();
for (int i = 0; i < getCount(); i++) {
View view = getViewAtPosition(i);
updateJoinGapsInfo(view, i);
} }
} }
} });
}); if (analysis.timeSpan > 0) {
if (analysis.timeSpan > 0) { DateFormat tf = SimpleDateFormat.getTimeInstance(DateFormat.SHORT);
DateFormat tf = SimpleDateFormat.getTimeInstance(DateFormat.SHORT); DateFormat df = SimpleDateFormat.getDateInstance(DateFormat.MEDIUM);
DateFormat df = SimpleDateFormat.getDateInstance(DateFormat.MEDIUM);
Date start = new Date(analysis.startTime); Date start = new Date(analysis.startTime);
((TextView) view.findViewById(R.id.start_time_text)).setText(tf.format(start)); ((TextView) view.findViewById(R.id.start_time_text)).setText(tf.format(start));
((TextView) view.findViewById(R.id.start_date_text)).setText(df.format(start)); ((TextView) view.findViewById(R.id.start_date_text)).setText(df.format(start));
Date end = new Date(analysis.endTime); Date end = new Date(analysis.endTime);
((TextView) view.findViewById(R.id.end_time_text)).setText(tf.format(end)); ((TextView) view.findViewById(R.id.end_time_text)).setText(tf.format(end));
((TextView) view.findViewById(R.id.end_date_text)).setText(df.format(end)); ((TextView) view.findViewById(R.id.end_date_text)).setText(df.format(end));
} else { } else {
view.findViewById(R.id.list_divider).setVisibility(View.GONE); view.findViewById(R.id.list_divider).setVisibility(View.GONE);
view.findViewById(R.id.start_end_time).setVisibility(View.GONE); view.findViewById(R.id.bottom_line_blocks).setVisibility(View.GONE);
}
} }
} else { } else {
chart.setVisibility(View.GONE); chart.setVisibility(View.GONE);
view.findViewById(R.id.distance_time_span).setVisibility(View.GONE); view.findViewById(R.id.top_line_blocks).setVisibility(View.GONE);
view.findViewById(R.id.list_divider).setVisibility(View.GONE); view.findViewById(R.id.list_divider).setVisibility(View.GONE);
view.findViewById(R.id.start_end_time).setVisibility(View.GONE); view.findViewById(R.id.bottom_line_blocks).setVisibility(View.GONE);
} }
updateJoinGapsInfo(view, position); updateJoinGapsInfo(view, position);
view.findViewById(R.id.analyze_on_map).setOnClickListener(new View.OnClickListener() { if (!onlyGraphs) {
@Override view.findViewById(R.id.analyze_on_map).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) { @Override
openAnalyzeOnMap(GPXTabItemType.GPX_TAB_ITEM_GENERAL); public void onClick(View v) {
openAnalyzeOnMap(GPXTabItemType.GPX_TAB_ITEM_GENERAL);
}
});
TextView overflowMenu = view.findViewById(R.id.overflow_menu);
if (!gpxItem.group.getTrack().generalTrack) {
setupOptionsPopupMenu(overflowMenu, true);
} else {
overflowMenu.setVisibility(View.GONE);
} }
});
TextView overflowMenu = view.findViewById(R.id.overflow_menu);
if (!gpxItem.group.getTrack().generalTrack) {
setupOptionsPopupMenu(overflowMenu, true);
} else {
overflowMenu.setVisibility(View.GONE);
} }
} }
@ -598,7 +625,7 @@ public class GPXItemPagerAdapter extends PagerAdapter implements CustomTabProvid
@Override @Override
public void tabStylesUpdated(View tabsContainer, int currentPosition) { public void tabStylesUpdated(View tabsContainer, int currentPosition) {
ViewGroup.MarginLayoutParams params = (MarginLayoutParams) tabsContainer.getLayoutParams(); ViewGroup.MarginLayoutParams params = (MarginLayoutParams) tabsContainer.getLayoutParams();
params.height = app.getResources().getDimensionPixelSize(R.dimen.dialog_button_height); params.height = app.getResources().getDimensionPixelSize(!onlyGraphs ? R.dimen.dialog_button_height : R.dimen.context_menu_buttons_bottom_height);
tabsContainer.setLayoutParams(params); tabsContainer.setLayoutParams(params);
UiUtilities.updateCustomRadioButtons(app, tabsContainer, nightMode, getCustomRadioButtonType(currentPosition)); UiUtilities.updateCustomRadioButtons(app, tabsContainer, nightMode, getCustomRadioButtonType(currentPosition));
} }
@ -645,7 +672,7 @@ public class GPXItemPagerAdapter extends PagerAdapter implements CustomTabProvid
((TextView) view.findViewById(R.id.distance_text)).setText(OsmAndFormatter.getFormattedDistance(totalDistance, app)); ((TextView) view.findViewById(R.id.distance_text)).setText(OsmAndFormatter.getFormattedDistance(totalDistance, app));
((TextView) view.findViewById(R.id.duration_text)).setText(Algorithms.formatDuration((int) (timeSpan / 1000), app.accessibilityEnabled())); ((TextView) view.findViewById(R.id.duration_text)).setText(Algorithms.formatDuration((int) (timeSpan / 1000), app.accessibilityEnabled()));
} else if (tabType.equals(GPXTabItemType.GPX_TAB_ITEM_SPEED)) { } else if (tabType.equals(GPX_TAB_ITEM_SPEED)) {
long timeMoving = !joinSegments && gpxItem.isGeneralTrack() ? analysis.timeMovingWithoutGaps : analysis.timeMoving; long timeMoving = !joinSegments && gpxItem.isGeneralTrack() ? analysis.timeMovingWithoutGaps : analysis.timeMoving;
float totalDistanceMoving = !joinSegments && gpxItem.isGeneralTrack() ? analysis.totalDistanceMovingWithoutGaps : analysis.totalDistanceMoving; float totalDistanceMoving = !joinSegments && gpxItem.isGeneralTrack() ? analysis.totalDistanceMovingWithoutGaps : analysis.totalDistanceMoving;

View file

@ -55,7 +55,7 @@ public class SegmentGPXAdapter extends ArrayAdapter<GpxDisplayItem> {
WrapContentHeightViewPager pager = row.findViewById(R.id.pager); WrapContentHeightViewPager pager = row.findViewById(R.id.pager);
PagerSlidingTabStrip tabLayout = row.findViewById(R.id.sliding_tabs); PagerSlidingTabStrip tabLayout = row.findViewById(R.id.sliding_tabs);
pager.setAdapter(new GPXItemPagerAdapter(app, item, displayHelper, nightMode, listener)); pager.setAdapter(new GPXItemPagerAdapter(app, item, displayHelper, nightMode, listener, false));
if (create) { if (create) {
tabLayout.setViewPager(pager); tabLayout.setViewPager(pager);
} else { } else {

View file

@ -57,8 +57,8 @@ import net.osmand.plus.routepreparationmenu.cards.ReverseTrackCard;
import net.osmand.plus.routepreparationmenu.cards.SelectTrackCard; import net.osmand.plus.routepreparationmenu.cards.SelectTrackCard;
import net.osmand.plus.routepreparationmenu.cards.TrackEditCard; import net.osmand.plus.routepreparationmenu.cards.TrackEditCard;
import net.osmand.plus.routepreparationmenu.cards.TracksToFollowCard; import net.osmand.plus.routepreparationmenu.cards.TracksToFollowCard;
import net.osmand.plus.routing.IRouteInformationListener;
import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder; import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder;
import net.osmand.plus.routing.IRouteInformationListener;
import net.osmand.plus.routing.RouteService; import net.osmand.plus.routing.RouteService;
import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.ApplicationMode;
@ -446,8 +446,11 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
if (mapActivity != null) { if (mapActivity != null) {
if (card instanceof ImportTrackCard) { if (card instanceof ImportTrackCard) {
importTrack(); importTrack();
} else if (card instanceof TrackEditCard || card instanceof AttachTrackToRoadsCard) { } else if (card instanceof AttachTrackToRoadsCard) {
openPlanRoute(); openPlanRoute(true);
close();
} else if (card instanceof TrackEditCard) {
openPlanRoute(false);
close(); close();
} else if (card instanceof SelectTrackCard) { } else if (card instanceof SelectTrackCard) {
updateSelectionMode(true); updateSelectionMode(true);
@ -574,7 +577,7 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
} }
} }
public void openPlanRoute() { public void openPlanRoute(boolean showSnapWarning) {
MapActivity mapActivity = getMapActivity(); MapActivity mapActivity = getMapActivity();
if (mapActivity != null && gpxFile != null) { if (mapActivity != null && gpxFile != null) {
editingTrack = true; editingTrack = true;
@ -583,7 +586,7 @@ public class FollowTrackFragment extends ContextMenuScrollFragment implements Ca
editingContext.setGpxData(gpxData); editingContext.setGpxData(gpxData);
editingContext.setAppMode(app.getRoutingHelper().getAppMode()); editingContext.setAppMode(app.getRoutingHelper().getAppMode());
editingContext.setSelectedSegment(app.getSettings().GPX_ROUTE_SEGMENT.get()); editingContext.setSelectedSegment(app.getSettings().GPX_ROUTE_SEGMENT.get());
MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(), editingContext, true); MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(), editingContext, true, showSnapWarning);
} }
} }

View file

@ -12,9 +12,7 @@ import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.ColorInt; import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
import androidx.appcompat.widget.SwitchCompat; import androidx.appcompat.widget.SwitchCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
@ -107,7 +105,7 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
private final Class<? extends LocalRoutingParameter>[] excludeParameters; private final Class<? extends LocalRoutingParameter>[] excludeParameters;
@SafeVarargs @SafeVarargs
DialogMode(Class<? extends LocalRoutingParameter> ... excludeParameters) { DialogMode(Class<? extends LocalRoutingParameter>... excludeParameters) {
this.excludeParameters = excludeParameters; this.excludeParameters = excludeParameters;
} }
@ -556,7 +554,7 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(DIALOG_MODE_KEY, dialogMode.name()); args.putString(DIALOG_MODE_KEY, dialogMode.name());
BaseSettingsFragment.showInstance(mapActivity, BaseSettingsFragment.showInstance(mapActivity,
SettingsScreenType.NAVIGATION, applicationMode, args); SettingsScreenType.NAVIGATION, applicationMode, args, null);
} }
}) })
.create(); .create();
@ -695,9 +693,9 @@ public class RouteOptionsBottomSheet extends MenuBottomSheetDialogFragment {
} }
public static void showInstance(MapActivity mapActivity, public static void showInstance(MapActivity mapActivity,
Fragment targetFragment, Fragment targetFragment,
DialogMode dialogMode, DialogMode dialogMode,
String appModeKey) { String appModeKey) {
try { try {
FragmentManager fm = mapActivity.getSupportFragmentManager(); FragmentManager fm = mapActivity.getSupportFragmentManager();
if (!fm.isStateSaved()) { if (!fm.isStateSaved()) {

View file

@ -30,7 +30,7 @@ public class EnumStringPreference<E extends Enum<E>> extends CommonPreference<E>
@Override @Override
protected String toString(E o) { protected String toString(E o) {
return o.name(); return o == null ? null : o.name();
} }
@Override @Override

View file

@ -1277,6 +1277,7 @@ public class OsmandSettings {
public final CommonPreference<Integer> SAVE_GLOBAL_TRACK_INTERVAL = new IntPreference(this, "save_global_track_interval", 5000).makeProfile().cache(); public final CommonPreference<Integer> SAVE_GLOBAL_TRACK_INTERVAL = new IntPreference(this, "save_global_track_interval", 5000).makeProfile().cache();
public final CommonPreference<Boolean> SAVE_GLOBAL_TRACK_REMEMBER = new BooleanPreference(this, "save_global_track_remember", false).makeProfile().cache(); public final CommonPreference<Boolean> SAVE_GLOBAL_TRACK_REMEMBER = new BooleanPreference(this, "save_global_track_remember", false).makeProfile().cache();
public final CommonPreference<Boolean> SHOW_SAVED_TRACK_REMEMBER = new BooleanPreference(this, "show_saved_track_remember", true).makeGlobal().makeShared(); public final CommonPreference<Boolean> SHOW_SAVED_TRACK_REMEMBER = new BooleanPreference(this, "show_saved_track_remember", true).makeGlobal().makeShared();
public final CommonPreference<Boolean> SHOW_TRIP_REC_START_DIALOG = new BooleanPreference(this, "show_trip_recording_start_dialog", true).makeGlobal().makeShared();
// this value string is synchronized with settings_pref.xml preference name // this value string is synchronized with settings_pref.xml preference name
public final CommonPreference<Boolean> SAVE_TRACK_TO_GPX = new BooleanPreference(this, "save_track_to_gpx", false).makeProfile().cache(); public final CommonPreference<Boolean> SAVE_TRACK_TO_GPX = new BooleanPreference(this, "save_track_to_gpx", false).makeProfile().cache();

View file

@ -900,11 +900,11 @@ public class SettingsHelper {
List<ITileSource> tileSourceTemplates = new ArrayList<>(); List<ITileSource> tileSourceTemplates = new ArrayList<>();
List<File> routingFilesList = new ArrayList<>(); List<File> routingFilesList = new ArrayList<>();
List<File> renderFilesList = new ArrayList<>(); List<File> renderFilesList = new ArrayList<>();
List<File> multimediaFilesList = new ArrayList<>();
List<File> ttsVoiceFilesList = new ArrayList<>(); List<File> ttsVoiceFilesList = new ArrayList<>();
List<File> voiceFilesList = new ArrayList<>(); List<File> voiceFilesList = new ArrayList<>();
List<FileSettingsItem> mapFilesList = new ArrayList<>(); List<FileSettingsItem> mapFilesList = new ArrayList<>();
List<FileSettingsItem> tracksFilesList = new ArrayList<>(); List<FileSettingsItem> tracksFilesList = new ArrayList<>();
List<FileSettingsItem> multimediaFilesList = new ArrayList<>();
List<AvoidRoadInfo> avoidRoads = new ArrayList<>(); List<AvoidRoadInfo> avoidRoads = new ArrayList<>();
List<GlobalSettingsItem> globalSettingsItems = new ArrayList<>(); List<GlobalSettingsItem> globalSettingsItems = new ArrayList<>();
List<OsmNotesPoint> notesPointList = new ArrayList<>(); List<OsmNotesPoint> notesPointList = new ArrayList<>();
@ -927,7 +927,7 @@ public class SettingsHelper {
} else if (fileItem.getSubtype() == FileSubtype.ROUTING_CONFIG) { } else if (fileItem.getSubtype() == FileSubtype.ROUTING_CONFIG) {
routingFilesList.add(fileItem.getFile()); routingFilesList.add(fileItem.getFile());
} else if (fileItem.getSubtype() == FileSubtype.MULTIMEDIA_NOTES) { } else if (fileItem.getSubtype() == FileSubtype.MULTIMEDIA_NOTES) {
multimediaFilesList.add(fileItem.getFile()); multimediaFilesList.add(fileItem);
} else if (fileItem.getSubtype() == FileSubtype.GPX) { } else if (fileItem.getSubtype() == FileSubtype.GPX) {
tracksFilesList.add(fileItem); tracksFilesList.add(fileItem);
} else if (fileItem.getSubtype().isMap()) { } else if (fileItem.getSubtype().isMap()) {

View file

@ -6,7 +6,6 @@ import android.graphics.drawable.LayerDrawable;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.CompoundButton;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -34,9 +33,8 @@ import net.osmand.plus.settings.preferences.SwitchPreferenceEx;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import static net.osmand.plus.UiUtilities.CompoundButtonType.TOOLBAR;
import static net.osmand.plus.liveupdates.LiveUpdatesSettingsDialogFragmentNew.getActivePrimaryColorId; import static net.osmand.plus.liveupdates.LiveUpdatesSettingsDialogFragmentNew.getActivePrimaryColorId;
import static net.osmand.plus.monitoring.TripRecordingActiveBottomSheet.getSecondaryIconColorId; import static net.osmand.plus.monitoring.TripRecordingBottomSheet.getSecondaryIconColorId;
public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet { public class BooleanPreferenceBottomSheet extends BasePreferenceBottomSheet {

View file

@ -893,17 +893,18 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat impl
} }
public static boolean showInstance(FragmentActivity activity, SettingsScreenType screenType, @Nullable ApplicationMode appMode) { public static boolean showInstance(FragmentActivity activity, SettingsScreenType screenType, @Nullable ApplicationMode appMode) {
return showInstance(activity, screenType, appMode, new Bundle()); return showInstance(activity, screenType, appMode, new Bundle(), null);
} }
public static boolean showInstance(FragmentActivity activity, SettingsScreenType screenType, public static boolean showInstance(FragmentActivity activity, SettingsScreenType screenType,
@Nullable ApplicationMode appMode, @NonNull Bundle args) { @Nullable ApplicationMode appMode, @NonNull Bundle args, @Nullable Fragment target) {
try { try {
Fragment fragment = Fragment.instantiate(activity, screenType.fragmentName); Fragment fragment = Fragment.instantiate(activity, screenType.fragmentName);
if (appMode != null) { if (appMode != null) {
args.putString(APP_MODE_KEY, appMode.getStringKey()); args.putString(APP_MODE_KEY, appMode.getStringKey());
} }
fragment.setArguments(args); fragment.setArguments(args);
fragment.setTargetFragment(target, 0);
activity.getSupportFragmentManager().beginTransaction() activity.getSupportFragmentManager().beginTransaction()
.replace(R.id.fragmentContainer, fragment, screenType.fragmentName) .replace(R.id.fragmentContainer, fragment, screenType.fragmentName)
.addToBackStack(DRAWER_SETTINGS_ID + ".new") .addToBackStack(DRAWER_SETTINGS_ID + ".new")

View file

@ -6,8 +6,10 @@ import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ExpandableListView; import android.widget.ExpandableListView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ListView;
import androidx.activity.OnBackPressedCallback; import androidx.activity.OnBackPressedCallback;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -18,6 +20,8 @@ import androidx.core.view.ViewCompat;
import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import com.github.ksoichiro.android.observablescrollview.ScrollUtils;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
@ -129,6 +133,7 @@ public abstract class BaseSettingsListFragment extends BaseOsmAndFragment implem
adapter = new ExportSettingsAdapter(app, exportMode, this, nightMode); adapter = new ExportSettingsAdapter(app, exportMode, this, nightMode);
adapter.updateSettingsItems(dataList, selectedItemsMap); adapter.updateSettingsItems(dataList, selectedItemsMap);
expandableList.setAdapter(adapter); expandableList.setAdapter(adapter);
setupListView(expandableList);
updateAvailableSpace(); updateAvailableSpace();
return root; return root;
@ -195,6 +200,22 @@ public abstract class BaseSettingsListFragment extends BaseOsmAndFragment implem
}); });
} }
private void setupListView(@NonNull final ListView listView) {
if (listView.getFooterViewsCount() == 0) {
int padding = getResources().getDimensionPixelSize(R.dimen.toolbar_height_expanded);
View emptyView = new View(listView.getContext());
emptyView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, padding));
listView.addFooterView(emptyView);
ScrollUtils.addOnGlobalLayoutListener(listView, new Runnable() {
@Override
public void run() {
listView.requestLayout();
}
});
}
}
protected void updateAvailableSpace() { protected void updateAvailableSpace() {
long calculatedSize = ExportSettingsAdapter.calculateItemsSize(adapter.getData()); long calculatedSize = ExportSettingsAdapter.calculateItemsSize(adapter.getData());
if (calculatedSize != 0) { if (calculatedSize != 0) {

View file

@ -6,6 +6,10 @@ import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.IndexConstants; import net.osmand.IndexConstants;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
@ -15,6 +19,7 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.UiUtilities; import net.osmand.plus.UiUtilities;
import net.osmand.plus.audionotes.AudioVideoNotesPlugin; import net.osmand.plus.audionotes.AudioVideoNotesPlugin;
import net.osmand.plus.audionotes.AudioVideoNotesPlugin.Recording;
import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo; import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo;
import net.osmand.plus.helpers.FileNameTranslationHelper; import net.osmand.plus.helpers.FileNameTranslationHelper;
import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.GpxUiHelper;
@ -36,10 +41,6 @@ import org.apache.commons.logging.Log;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import static net.osmand.plus.settings.backend.backup.FileSettingsItem.FileSubtype; import static net.osmand.plus.settings.backend.backup.FileSettingsItem.FileSubtype;
public class DuplicatesSettingsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public class DuplicatesSettingsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
@ -154,6 +155,7 @@ public class DuplicatesSettingsAdapter extends RecyclerView.Adapter<RecyclerView
if (iconId == -1) { if (iconId == -1) {
iconId = R.drawable.ic_action_photo_dark; iconId = R.drawable.ic_action_photo_dark;
} }
itemHolder.title.setText(new Recording(file).getName(app, true));
itemHolder.icon.setImageDrawable(uiUtilities.getIcon(iconId, activeColorRes)); itemHolder.icon.setImageDrawable(uiUtilities.getIcon(iconId, activeColorRes));
} else if (fileSubtype.isMap() } else if (fileSubtype.isMap()
|| fileSubtype == FileSubtype.TTS_VOICE || fileSubtype == FileSubtype.TTS_VOICE

View file

@ -6,6 +6,13 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.core.widget.CompoundButtonCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities.GPXTrackAnalysis; import net.osmand.GPXUtilities.GPXTrackAnalysis;
import net.osmand.IndexConstants; import net.osmand.IndexConstants;
@ -21,6 +28,7 @@ import net.osmand.plus.R;
import net.osmand.plus.SQLiteTileSource; import net.osmand.plus.SQLiteTileSource;
import net.osmand.plus.UiUtilities; import net.osmand.plus.UiUtilities;
import net.osmand.plus.audionotes.AudioVideoNotesPlugin; import net.osmand.plus.audionotes.AudioVideoNotesPlugin;
import net.osmand.plus.audionotes.AudioVideoNotesPlugin.Recording;
import net.osmand.plus.base.MenuBottomSheetDialogFragment; import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton;
@ -61,13 +69,9 @@ import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import androidx.annotation.NonNull; import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.IMG_EXTENSION;
import androidx.annotation.Nullable; import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.MPEG4_EXTENSION;
import androidx.core.content.ContextCompat; import static net.osmand.plus.audionotes.AudioVideoNotesPlugin.THREEGP_EXTENSION;
import androidx.core.widget.CompoundButtonCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import static net.osmand.view.ThreeStateCheckbox.State.CHECKED; import static net.osmand.view.ThreeStateCheckbox.State.CHECKED;
import static net.osmand.view.ThreeStateCheckbox.State.MISC; import static net.osmand.view.ThreeStateCheckbox.State.MISC;
import static net.osmand.view.ThreeStateCheckbox.State.UNCHECKED; import static net.osmand.view.ThreeStateCheckbox.State.UNCHECKED;
@ -142,15 +146,21 @@ public class ExportItemsBottomSheet extends MenuBottomSheetDialogFragment {
selectedItems.remove(item[0].getTag()); selectedItems.remove(item[0].getTag());
} }
updateTitleView(); updateTitleView();
setupBottomSheetItem(item[0], item[0].getTag());
} }
}) })
.setTag(object); .setTag(object);
setupBottomSheetItem(builder, object);
item[0] = builder.create(); item[0] = builder.create();
items.add(item[0]); items.add(item[0]);
} }
} }
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
updateItems();
}
@Override @Override
public void onSaveInstanceState(Bundle outState) { public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
@ -177,7 +187,7 @@ public class ExportItemsBottomSheet extends MenuBottomSheetDialogFragment {
selectedItems.clear(); selectedItems.clear();
} }
updateTitleView(); updateTitleView();
updateItems(checked); updateItems();
} }
}); });
setupDescription(view); setupDescription(view);
@ -221,10 +231,12 @@ public class ExportItemsBottomSheet extends MenuBottomSheetDialogFragment {
return itemsSize; return itemsSize;
} }
private void updateItems(boolean checked) { private void updateItems() {
for (BaseBottomSheetItem item : items) { for (BaseBottomSheetItem item : items) {
if (item instanceof BottomSheetItemWithCompoundButton) { if (item instanceof BottomSheetItemWithCompoundButton && item.getTag() != null) {
((BottomSheetItemWithCompoundButton) item).setChecked(checked); BottomSheetItemWithCompoundButton bottomSheetItem = (BottomSheetItemWithCompoundButton) item;
setupBottomSheetItem(bottomSheetItem, item.getTag());
bottomSheetItem.setChecked(selectedItems.contains(item.getTag()));
} }
} }
} }
@ -274,7 +286,7 @@ public class ExportItemsBottomSheet extends MenuBottomSheetDialogFragment {
return null; return null;
} }
private void setupBottomSheetItem(Builder builder, Object object) { private void setupBottomSheetItem(BottomSheetItemWithCompoundButton item, Object object) {
if (object instanceof ApplicationModeBean) { if (object instanceof ApplicationModeBean) {
ApplicationModeBean modeBean = (ApplicationModeBean) object; ApplicationModeBean modeBean = (ApplicationModeBean) object;
String profileName = modeBean.userProfileName; String profileName = modeBean.userProfileName;
@ -286,7 +298,7 @@ public class ExportItemsBottomSheet extends MenuBottomSheetDialogFragment {
profileName = StringUtils.capitalize(modeBean.stringKey); profileName = StringUtils.capitalize(modeBean.stringKey);
} }
} }
builder.setTitle(profileName); item.setTitle(profileName);
String routingProfile = ""; String routingProfile = "";
String routingProfileValue = modeBean.routingProfile; String routingProfileValue = modeBean.routingProfile;
@ -300,122 +312,153 @@ public class ExportItemsBottomSheet extends MenuBottomSheetDialogFragment {
} }
} }
if (!Algorithms.isEmpty(routingProfile)) { if (!Algorithms.isEmpty(routingProfile)) {
builder.setDescription(getString(R.string.ltr_or_rtl_combine_via_colon, getString(R.string.nav_type_hint), routingProfile)); item.setDescription(getString(R.string.ltr_or_rtl_combine_via_colon, getString(R.string.nav_type_hint), routingProfile));
} else { } else {
builder.setDescription(getString(R.string.profile_type_osmand_string)); item.setDescription(getString(R.string.profile_type_osmand_string));
} }
int profileIconRes = AndroidUtils.getDrawableId(app, modeBean.iconName); int profileIconRes = AndroidUtils.getDrawableId(app, modeBean.iconName);
ProfileIconColors iconColor = modeBean.iconColor; ProfileIconColors iconColor = modeBean.iconColor;
Integer customIconColor = modeBean.customIconColor; Integer customIconColor = modeBean.customIconColor;
int actualIconColor = customIconColor != null ? int actualIconColor;
customIconColor : ContextCompat.getColor(app, iconColor.getColor(nightMode)); if (selectedItems.contains(object)) {
builder.setIcon(uiUtilities.getPaintedIcon(profileIconRes, actualIconColor)); actualIconColor = customIconColor != null ? customIconColor : ContextCompat.getColor(app, iconColor.getColor(nightMode));
} else {
actualIconColor = ContextCompat.getColor(app, secondaryColorRes);
}
item.setIcon(uiUtilities.getPaintedIcon(profileIconRes, actualIconColor));
} else if (object instanceof QuickAction) { } else if (object instanceof QuickAction) {
QuickAction quickAction = (QuickAction) object; QuickAction quickAction = (QuickAction) object;
builder.setTitle(quickAction.getName(app)); item.setTitle(quickAction.getName(app));
builder.setIcon(uiUtilities.getIcon(quickAction.getIconRes(), activeColorRes)); item.setIcon(uiUtilities.getIcon(quickAction.getIconRes(), getItemIconColor(object)));
} else if (object instanceof PoiUIFilter) { } else if (object instanceof PoiUIFilter) {
PoiUIFilter poiUIFilter = (PoiUIFilter) object; PoiUIFilter poiUIFilter = (PoiUIFilter) object;
builder.setTitle(poiUIFilter.getName()); item.setTitle(poiUIFilter.getName());
int iconRes = RenderingIcons.getBigIconResourceId(poiUIFilter.getIconId()); int iconRes = RenderingIcons.getBigIconResourceId(poiUIFilter.getIconId());
builder.setIcon(uiUtilities.getIcon(iconRes != 0 ? iconRes : R.drawable.ic_action_user, activeColorRes)); item.setIcon(uiUtilities.getIcon(iconRes != 0 ? iconRes : R.drawable.ic_action_user, activeColorRes));
} else if (object instanceof TileSourceTemplate || object instanceof SQLiteTileSource) { } else if (object instanceof TileSourceTemplate || object instanceof SQLiteTileSource) {
ITileSource tileSource = (ITileSource) object; ITileSource tileSource = (ITileSource) object;
builder.setTitle(tileSource.getName()); item.setTitle(tileSource.getName());
builder.setIcon(uiUtilities.getIcon(R.drawable.ic_map, activeColorRes)); item.setIcon(uiUtilities.getIcon(R.drawable.ic_map, getItemIconColor(object)));
} else if (object instanceof File) { } else if (object instanceof File) {
setupBottomSheetItemForFile(builder, (File) object); setupBottomSheetItemForFile(item, (File) object);
} else if (object instanceof GpxSettingsItem) { } else if (object instanceof GpxSettingsItem) {
GpxSettingsItem item = (GpxSettingsItem) object; GpxSettingsItem settingsItem = (GpxSettingsItem) object;
setupBottomSheetItemForGpx(builder, item.getFile(), item.getAppearanceInfo()); setupBottomSheetItemForGpx(item, settingsItem.getFile(), settingsItem.getAppearanceInfo());
} else if (object instanceof FileSettingsItem) { } else if (object instanceof FileSettingsItem) {
FileSettingsItem item = (FileSettingsItem) object; FileSettingsItem settingsItem = (FileSettingsItem) object;
setupBottomSheetItemForFile(builder, item.getFile()); setupBottomSheetItemForFile(item, settingsItem.getFile());
} else if (object instanceof AvoidRoadInfo) { } else if (object instanceof AvoidRoadInfo) {
AvoidRoadInfo avoidRoadInfo = (AvoidRoadInfo) object; AvoidRoadInfo avoidRoadInfo = (AvoidRoadInfo) object;
builder.setTitle(avoidRoadInfo.name); item.setTitle(avoidRoadInfo.name);
builder.setIcon(uiUtilities.getIcon(R.drawable.ic_action_alert, activeColorRes)); item.setIcon(uiUtilities.getIcon(R.drawable.ic_action_alert, getItemIconColor(object)));
} else if (object instanceof OsmNotesPoint) { } else if (object instanceof OsmNotesPoint) {
OsmNotesPoint osmNotesPoint = (OsmNotesPoint) object; OsmNotesPoint osmNotesPoint = (OsmNotesPoint) object;
builder.setTitle(osmNotesPoint.getText()); item.setTitle(osmNotesPoint.getText());
builder.setIcon(uiUtilities.getIcon(R.drawable.ic_action_osm_note_add, activeColorRes)); item.setIcon(uiUtilities.getIcon(R.drawable.ic_action_osm_note_add, getItemIconColor(object)));
} else if (object instanceof OpenstreetmapPoint) { } else if (object instanceof OpenstreetmapPoint) {
OpenstreetmapPoint openstreetmapPoint = (OpenstreetmapPoint) object; OpenstreetmapPoint openstreetmapPoint = (OpenstreetmapPoint) object;
builder.setTitle(OsmEditingPlugin.getTitle(openstreetmapPoint, app)); item.setTitle(OsmEditingPlugin.getTitle(openstreetmapPoint, app));
builder.setIcon(uiUtilities.getIcon(R.drawable.ic_action_info_dark, activeColorRes)); item.setIcon(uiUtilities.getIcon(R.drawable.ic_action_info_dark, getItemIconColor(object)));
} else if (object instanceof FavoriteGroup) { } else if (object instanceof FavoriteGroup) {
FavoriteGroup group = (FavoriteGroup) object; FavoriteGroup group = (FavoriteGroup) object;
builder.setTitle(group.getDisplayName(app)); item.setTitle(group.getDisplayName(app));
int color = group.getColor() == 0 ? ContextCompat.getColor(app, R.color.color_favorite) : group.getColor(); int color;
builder.setIcon(uiUtilities.getPaintedIcon(R.drawable.ic_action_folder, color)); if (selectedItems.contains(object)) {
color = group.getColor() == 0 ? ContextCompat.getColor(app, R.color.color_favorite) : group.getColor();
} else {
color = ContextCompat.getColor(app, secondaryColorRes);
}
item.setIcon(uiUtilities.getPaintedIcon(R.drawable.ic_action_folder, color));
int points = group.getPoints().size(); int points = group.getPoints().size();
String itemsDescr = getString(R.string.shared_string_gpx_points); String itemsDescr = getString(R.string.shared_string_gpx_points);
builder.setDescription(getString(R.string.ltr_or_rtl_combine_via_colon, itemsDescr, points)); item.setDescription(getString(R.string.ltr_or_rtl_combine_via_colon, itemsDescr, points));
} else if (object instanceof GlobalSettingsItem) { } else if (object instanceof GlobalSettingsItem) {
GlobalSettingsItem globalSettingsItem = (GlobalSettingsItem) object; GlobalSettingsItem globalSettingsItem = (GlobalSettingsItem) object;
builder.setTitle(globalSettingsItem.getPublicName(app)); item.setTitle(globalSettingsItem.getPublicName(app));
builder.setIcon(uiUtilities.getIcon(R.drawable.ic_action_settings, activeColorRes)); item.setIcon(uiUtilities.getIcon(R.drawable.ic_action_settings, getItemIconColor(object)));
} else if (object instanceof ItineraryGroup) { } else if (object instanceof ItineraryGroup) {
ItineraryGroup markersGroup = (ItineraryGroup) object; ItineraryGroup markersGroup = (ItineraryGroup) object;
if (ExportSettingsType.ACTIVE_MARKERS.name().equals(markersGroup.getId())) { if (ExportSettingsType.ACTIVE_MARKERS.name().equals(markersGroup.getId())) {
builder.setTitle(getString(R.string.map_markers)); item.setTitle(getString(R.string.map_markers));
builder.setIcon(uiUtilities.getIcon(R.drawable.ic_action_flag, activeColorRes)); item.setIcon(uiUtilities.getIcon(R.drawable.ic_action_flag, getItemIconColor(object)));
} else if (ExportSettingsType.HISTORY_MARKERS.name().equals(markersGroup.getId())) { } else if (ExportSettingsType.HISTORY_MARKERS.name().equals(markersGroup.getId())) {
builder.setTitle(getString(R.string.markers_history)); item.setTitle(getString(R.string.markers_history));
builder.setIcon(uiUtilities.getIcon(R.drawable.ic_action_history, activeColorRes)); item.setIcon(uiUtilities.getIcon(R.drawable.ic_action_history, getItemIconColor(object)));
} }
int selectedMarkers = markersGroup.getMarkers().size(); int selectedMarkers = markersGroup.getMarkers().size();
String itemsDescr = getString(R.string.shared_string_items); String itemsDescr = getString(R.string.shared_string_items);
builder.setDescription(getString(R.string.ltr_or_rtl_combine_via_colon, itemsDescr, selectedMarkers)); item.setDescription(getString(R.string.ltr_or_rtl_combine_via_colon, itemsDescr, selectedMarkers));
} else if (object instanceof HistoryEntry) { } else if (object instanceof HistoryEntry) {
HistoryEntry historyEntry = (HistoryEntry) object; HistoryEntry historyEntry = (HistoryEntry) object;
builder.setTitle(historyEntry.getName().getName()); item.setTitle(historyEntry.getName().getName());
builder.setIcon(uiUtilities.getIcon(R.drawable.ic_action_history, activeColorRes)); item.setIcon(uiUtilities.getIcon(R.drawable.ic_action_history, getItemIconColor(object)));
} else if (object instanceof OnlineRoutingEngine) { } else if (object instanceof OnlineRoutingEngine) {
OnlineRoutingEngine onlineRoutingEngine = (OnlineRoutingEngine) object; OnlineRoutingEngine onlineRoutingEngine = (OnlineRoutingEngine) object;
builder.setTitle(onlineRoutingEngine.getName(app)); item.setTitle(onlineRoutingEngine.getName(app));
builder.setIcon(uiUtilities.getIcon(R.drawable.ic_world_globe_dark, activeColorRes)); item.setIcon(uiUtilities.getIcon(R.drawable.ic_world_globe_dark, getItemIconColor(object)));
} }
} }
private void setupBottomSheetItemForFile(Builder builder, File file) { private void setupBottomSheetItemForFile(BottomSheetItemWithCompoundButton item, File file) {
FileSubtype fileSubtype = FileSubtype.getSubtypeByPath(app, file.getPath()); FileSubtype fileSubtype = FileSubtype.getSubtypeByPath(app, file.getPath());
builder.setTitle(file.getName()); item.setTitle(file.getName());
if (file.getAbsolutePath().contains(IndexConstants.RENDERERS_DIR)) { if (file.getAbsolutePath().contains(IndexConstants.RENDERERS_DIR)) {
builder.setIcon(uiUtilities.getIcon(R.drawable.ic_action_map_style, activeColorRes)); item.setIcon(uiUtilities.getIcon(R.drawable.ic_action_map_style, getItemIconColor(item.getTag())));
} else if (file.getAbsolutePath().contains(IndexConstants.ROUTING_PROFILES_DIR)) { } else if (file.getAbsolutePath().contains(IndexConstants.ROUTING_PROFILES_DIR)) {
builder.setIcon(uiUtilities.getIcon(R.drawable.ic_action_route_distance, activeColorRes)); item.setIcon(uiUtilities.getIcon(R.drawable.ic_action_route_distance, getItemIconColor(item.getTag())));
} else if (file.getAbsolutePath().contains(IndexConstants.GPX_INDEX_DIR)) { } else if (file.getAbsolutePath().contains(IndexConstants.GPX_INDEX_DIR)) {
setupBottomSheetItemForGpx(builder, file, null); setupBottomSheetItemForGpx(item, file, null);
} else if (file.getAbsolutePath().contains(IndexConstants.AV_INDEX_DIR)) { } else if (file.getAbsolutePath().contains(IndexConstants.AV_INDEX_DIR)) {
int iconId = AudioVideoNotesPlugin.getIconIdForRecordingFile(file); int iconId = AudioVideoNotesPlugin.getIconIdForRecordingFile(file);
if (iconId == -1) { if (iconId == -1) {
iconId = R.drawable.ic_action_photo_dark; iconId = R.drawable.ic_action_photo_dark;
} }
builder.setIcon(uiUtilities.getIcon(iconId, activeColorRes)); if (item.getTag() instanceof FileSettingsItem) {
builder.setDescription(AndroidUtils.formatSize(app, file.length())); FileSettingsItem settingsItem = (FileSettingsItem) item.getTag();
item.setTitle(getNameForMultimediaFile(settingsItem.getFile(), settingsItem.getLastModified()));
} else {
item.setTitle(new Recording(file).getName(app, true));
}
item.setIcon(uiUtilities.getIcon(iconId, getItemIconColor(item.getTag())));
item.setDescription(AndroidUtils.formatSize(app, file.length()));
} else if (fileSubtype.isMap() } else if (fileSubtype.isMap()
|| fileSubtype == FileSettingsItem.FileSubtype.TTS_VOICE || fileSubtype == FileSettingsItem.FileSubtype.TTS_VOICE
|| fileSubtype == FileSettingsItem.FileSubtype.VOICE) { || fileSubtype == FileSettingsItem.FileSubtype.VOICE) {
builder.setTitle(FileNameTranslationHelper.getFileNameWithRegion(app, file.getName())); item.setTitle(FileNameTranslationHelper.getFileNameWithRegion(app, file.getName()));
builder.setIcon(uiUtilities.getIcon(fileSubtype.getIconId(), activeColorRes)); item.setIcon(uiUtilities.getIcon(fileSubtype.getIconId(), getItemIconColor(item.getTag())));
if (fileSubtype.isMap()) { if (fileSubtype.isMap()) {
String mapDescription = getMapDescription(file); String mapDescription = getMapDescription(file);
String formattedSize = AndroidUtils.formatSize(app, file.length()); String formattedSize = AndroidUtils.formatSize(app, file.length());
if (mapDescription != null) { if (mapDescription != null) {
builder.setDescription(getString(R.string.ltr_or_rtl_combine_via_bold_point, mapDescription, formattedSize)); item.setDescription(getString(R.string.ltr_or_rtl_combine_via_bold_point, mapDescription, formattedSize));
} else { } else {
builder.setDescription(formattedSize); item.setDescription(formattedSize);
} }
} }
} }
} }
private void setupBottomSheetItemForGpx(Builder builder, File file, @Nullable GpxAppearanceInfo appearanceInfo) { private void setupBottomSheetItemForGpx(BottomSheetItemWithCompoundButton item, File file, @Nullable GpxAppearanceInfo appearanceInfo) {
builder.setTitle(GpxUiHelper.getGpxTitle(file.getName())); item.setTitle(GpxUiHelper.getGpxTitle(file.getName()));
builder.setDescription(getTrackDescr(file, file.lastModified(), file.length(), appearanceInfo)); item.setDescription(getTrackDescr(file, file.lastModified(), file.length(), appearanceInfo));
builder.setIcon(uiUtilities.getIcon(R.drawable.ic_action_route_distance, activeColorRes)); item.setIcon(uiUtilities.getIcon(R.drawable.ic_action_route_distance, getItemIconColor(item.getTag())));
}
private String getNameForMultimediaFile(@NonNull File file, long lastModified) {
String fileName = file.getName();
if (fileName.endsWith(IMG_EXTENSION)) {
return getString(R.string.shared_string_photo) + " " + Recording.formatDateTime(app, lastModified);
} else if (fileName.endsWith(MPEG4_EXTENSION)) {
return getString(R.string.shared_string_video) + " " + Recording.formatDateTime(app, lastModified);
} else if (fileName.endsWith(THREEGP_EXTENSION)) {
return getString(R.string.shared_string_audio) + " " + Recording.formatDateTime(app, lastModified);
}
return "";
}
private int getItemIconColor(Object object) {
return selectedItems.contains(object) ? activeColorRes : secondaryColorRes;
} }
private final GpxDataItemCallback gpxDataItemCallback = new GpxDataItemCallback() { private final GpxDataItemCallback gpxDataItemCallback = new GpxDataItemCallback() {

View file

@ -58,7 +58,6 @@ public class ExportSettingsAdapter extends OsmandBaseExpandableListAdapter {
private final int secondaryColorRes; private final int secondaryColorRes;
private final int groupViewHeight; private final int groupViewHeight;
private final int childViewHeight; private final int childViewHeight;
private final int listBottomPadding;
ExportSettingsAdapter(OsmandApplication app, boolean exportMode, OnItemSelectedListener listener, boolean nightMode) { ExportSettingsAdapter(OsmandApplication app, boolean exportMode, OnItemSelectedListener listener, boolean nightMode) {
this.app = app; this.app = app;
@ -71,7 +70,6 @@ public class ExportSettingsAdapter extends OsmandBaseExpandableListAdapter {
secondaryColorRes = nightMode ? R.color.icon_color_secondary_dark : R.color.icon_color_secondary_light; secondaryColorRes = nightMode ? R.color.icon_color_secondary_dark : R.color.icon_color_secondary_light;
groupViewHeight = app.getResources().getDimensionPixelSize(R.dimen.setting_list_item_group_height); groupViewHeight = app.getResources().getDimensionPixelSize(R.dimen.setting_list_item_group_height);
childViewHeight = app.getResources().getDimensionPixelSize(R.dimen.setting_list_item_large_height); childViewHeight = app.getResources().getDimensionPixelSize(R.dimen.setting_list_item_large_height);
listBottomPadding = app.getResources().getDimensionPixelSize(R.dimen.fab_recycler_view_padding_bottom);
} }
@Override @Override
@ -118,9 +116,6 @@ public class ExportSettingsAdapter extends OsmandBaseExpandableListAdapter {
} }
}); });
boolean addPadding = !isExpanded && groupPosition == getGroupCount() - 1;
group.setPadding(0, 0, 0, addPadding ? listBottomPadding : 0);
adjustIndicator(app, groupPosition, isExpanded, group, nightMode); adjustIndicator(app, groupPosition, isExpanded, group, nightMode);
AndroidUiHelper.updateVisibility(group.findViewById(R.id.divider), isExpanded); AndroidUiHelper.updateVisibility(group.findViewById(R.id.divider), isExpanded);
AndroidUiHelper.updateVisibility(group.findViewById(R.id.card_top_divider), true); AndroidUiHelper.updateVisibility(group.findViewById(R.id.card_top_divider), true);
@ -188,8 +183,6 @@ public class ExportSettingsAdapter extends OsmandBaseExpandableListAdapter {
notifyDataSetChanged(); notifyDataSetChanged();
} }
}); });
boolean addPadding = isLastChild && groupPosition == getGroupCount() - 1;
child.setPadding(0, 0, 0, addPadding ? listBottomPadding : 0);
AndroidUiHelper.updateVisibility(child.findViewById(R.id.card_bottom_divider), isLastChild); AndroidUiHelper.updateVisibility(child.findViewById(R.id.card_bottom_divider), isLastChild);
return child; return child;

View file

@ -8,6 +8,16 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.GPXTrackAnalysis; import net.osmand.GPXUtilities.GPXTrackAnalysis;
@ -26,39 +36,44 @@ import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.List; import java.util.List;
import androidx.annotation.ColorInt; import static net.osmand.plus.liveupdates.LiveUpdatesFragmentNew.getDefaultIconColorId;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
public class GpxBlockStatisticsBuilder { public class GpxBlockStatisticsBuilder {
private static final Log log = PlatformUtil.getLog(GpxBlockStatisticsBuilder.class); private static final Log LOG = PlatformUtil.getLog(GpxBlockStatisticsBuilder.class);
private static final int GENERAL_UPDATE_INTERVAL = 1000; private static final int BLOCKS_UPDATE_INTERVAL = 1000;
public static final String INIT_BLOCKS_BASE = "init_blocks_base";
public static final String INIT_BLOCKS_GENERAL = "init_blocks_general";
public static final String INIT_BLOCKS_ALTITUDE = "init_blocks_altitude";
public static final String INIT_BLOCKS_SPEED = "init_blocks_speed";
private final OsmandApplication app; private final OsmandApplication app;
private final boolean nightMode;
private RecyclerView blocksView; private RecyclerView blocksView;
private final SelectedGpxFile selectedGpxFile; private final SelectedGpxFile selectedGpxFile;
private GPXTrackAnalysis analysis;
private BlockStatisticsAdapter adapter; private BlockStatisticsAdapter adapter;
private final List<StatBlock> items = new ArrayList<>(); private final List<StatBlock> items = new ArrayList<>();
private boolean blocksClickable = true; private boolean blocksClickable = true;
private String initBlocksKey = INIT_BLOCKS_BASE;
private final Handler handler = new Handler(); private final Handler handler = new Handler();
private Runnable updatingItems; private Runnable updatingItems;
private boolean updateRunning = false; private boolean updateRunning = false;
public GpxBlockStatisticsBuilder(OsmandApplication app, SelectedGpxFile selectedGpxFile) { public GpxBlockStatisticsBuilder(OsmandApplication app, SelectedGpxFile selectedGpxFile, boolean nightMode) {
this.app = app; this.app = app;
this.selectedGpxFile = selectedGpxFile; this.selectedGpxFile = selectedGpxFile;
this.nightMode = nightMode;
} }
public boolean isUpdateRunning() { public boolean isUpdateRunning() {
@ -73,6 +88,10 @@ public class GpxBlockStatisticsBuilder {
this.blocksView = blocksView; this.blocksView = blocksView;
} }
public void setInitBlocksKey(String initBlocksKey) {
this.initBlocksKey = initBlocksKey;
}
@Nullable @Nullable
public GpxDisplayItem getDisplayItem(GPXFile gpxFile) { public GpxDisplayItem getDisplayItem(GPXFile gpxFile) {
return gpxFile.tracks.size() > 0 ? GpxUiHelper.makeGpxDisplayItem(app, gpxFile) : null; return gpxFile.tracks.size() > 0 ? GpxUiHelper.makeGpxDisplayItem(app, gpxFile) : null;
@ -82,9 +101,9 @@ public class GpxBlockStatisticsBuilder {
return selectedGpxFile.getGpxFile(); return selectedGpxFile.getGpxFile();
} }
public void initStatBlocks(@Nullable SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) { public void initStatBlocks(@Nullable SegmentActionsListener actionsListener, @ColorInt int activeColor) {
initItems(); initItems();
adapter = new BlockStatisticsAdapter(getDisplayItem(getGPXFile()), actionsListener, activeColor, nightMode); adapter = new BlockStatisticsAdapter(getDisplayItem(getGPXFile()), actionsListener, activeColor);
adapter.setItems(items); adapter.setItems(items);
blocksView.setLayoutManager(new LinearLayoutManager(app, LinearLayoutManager.HORIZONTAL, false)); blocksView.setLayoutManager(new LinearLayoutManager(app, LinearLayoutManager.HORIZONTAL, false));
blocksView.setAdapter(adapter); blocksView.setAdapter(adapter);
@ -107,7 +126,7 @@ public class GpxBlockStatisticsBuilder {
} }
AndroidUiHelper.updateVisibility(blocksView, !Algorithms.isEmpty(items)); AndroidUiHelper.updateVisibility(blocksView, !Algorithms.isEmpty(items));
int interval = app.getSettings().SAVE_GLOBAL_TRACK_INTERVAL.get(); int interval = app.getSettings().SAVE_GLOBAL_TRACK_INTERVAL.get();
updateRunning = handler.postDelayed(this, Math.max(GENERAL_UPDATE_INTERVAL, interval)); updateRunning = handler.postDelayed(this, Math.max(BLOCKS_UPDATE_INTERVAL, interval));
} }
}; };
updateRunning = handler.post(updatingItems); updateRunning = handler.post(updatingItems);
@ -119,7 +138,7 @@ public class GpxBlockStatisticsBuilder {
if (app == null || gpxFile == null) { if (app == null || gpxFile == null) {
return; return;
} }
GPXTrackAnalysis analysis = null; analysis = null;
boolean withoutGaps = true; boolean withoutGaps = true;
if (gpxFile.equals(app.getSavingTrackHelper().getCurrentGpx())) { if (gpxFile.equals(app.getSavingTrackHelper().getCurrentGpx())) {
GPXFile currentGpx = app.getSavingTrackHelper().getCurrentTrack().getGpxFile(); GPXFile currentGpx = app.getSavingTrackHelper().getCurrentTrack().getGpxFile();
@ -133,34 +152,140 @@ public class GpxBlockStatisticsBuilder {
withoutGaps = !selectedGpxFile.isJoinSegments() && gpxDisplayItem.isGeneralTrack(); withoutGaps = !selectedGpxFile.isJoinSegments() && gpxDisplayItem.isGeneralTrack();
} }
} }
items.clear();
if (analysis != null) { if (analysis != null) {
float totalDistance = withoutGaps ? analysis.totalDistanceWithoutGaps : analysis.totalDistance; switch (initBlocksKey) {
float timeSpan = withoutGaps ? analysis.timeSpanWithoutGaps : analysis.timeSpan; case INIT_BLOCKS_GENERAL: {
String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app); float totalDistance = withoutGaps ? analysis.totalDistanceWithoutGaps : analysis.totalDistance;
String desc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app); float timeSpan = withoutGaps ? analysis.timeSpanWithoutGaps : analysis.timeSpan;
String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app); Date start = new Date(analysis.startTime);
String max = OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app); Date end = new Date(analysis.endTime);
prepareDataDistance(totalDistance);
items.clear(); prepareDataTimeSpan(timeSpan);
prepareData(analysis, app.getString(R.string.distance), OsmAndFormatter.getFormattedDistance(totalDistance, app), prepareDataStartTime(start);
R.drawable.ic_action_track_16, R.color.icon_color_default_light, GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED, ItemType.ITEM_DISTANCE); prepareDataEndTime(end);
prepareData(analysis, app.getString(R.string.altitude_ascent), asc, break;
R.drawable.ic_action_arrow_up_16, R.color.gpx_chart_red, GPXDataSetType.SLOPE, null, ItemType.ITEM_ALTITUDE); }
prepareData(analysis, app.getString(R.string.altitude_descent), desc, case INIT_BLOCKS_ALTITUDE: {
R.drawable.ic_action_arrow_down_16, R.color.gpx_pale_green, GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE, ItemType.ITEM_ALTITUDE); String min = OsmAndFormatter.getFormattedAlt(analysis.minElevation, app);
prepareData(analysis, app.getString(R.string.average_speed), avg, String max = OsmAndFormatter.getFormattedAlt(analysis.maxElevation, app);
R.drawable.ic_action_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED); String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app);
prepareData(analysis, app.getString(R.string.max_speed), max, String desc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app);
R.drawable.ic_action_max_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED); prepareDataAverageAltitude();
prepareData(analysis, app.getString(R.string.shared_string_time_span), prepareDataAltitudeRange(min, max);
Algorithms.formatDuration((int) (timeSpan / 1000), app.accessibilityEnabled()), prepareDataAscent(asc);
R.drawable.ic_action_time_span_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_TIME); prepareDataDescent(desc);
break;
}
case INIT_BLOCKS_SPEED: {
String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app);
String max = OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app);
long timeMoving = withoutGaps ? analysis.timeMovingWithoutGaps : analysis.timeMoving;
float totalDistanceMoving = withoutGaps ? analysis.totalDistanceMovingWithoutGaps : analysis.totalDistanceMoving;
prepareDataAverageSpeed(avg);
prepareDataMaximumSpeed(max);
prepareDataTimeMoving(timeMoving);
prepareDataDistanceCorrected(totalDistanceMoving);
break;
}
default:
case INIT_BLOCKS_BASE: {
float totalDistance = withoutGaps ? analysis.totalDistanceWithoutGaps : analysis.totalDistance;
String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app);
String desc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app);
String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app);
String max = OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app);
float timeSpan = withoutGaps ? analysis.timeSpanWithoutGaps : analysis.timeSpan;
prepareDataDistance(totalDistance);
prepareDataAscent(asc);
prepareDataDescent(desc);
prepareDataAverageSpeed(avg);
prepareDataMaximumSpeed(max);
prepareDataTimeSpan(timeSpan);
break;
}
}
} }
} }
public void prepareData(GPXTrackAnalysis analysis, String title, String value, public void prepareDataDistance(float totalDistance) {
@DrawableRes int imageResId, @ColorRes int imageColorId, prepareData(app.getString(R.string.distance), OsmAndFormatter.getFormattedDistance(totalDistance, app),
R.drawable.ic_action_track_16, GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED, ItemType.ITEM_DISTANCE);
}
public void prepareDataAverageAltitude() {
prepareData(app.getString(R.string.average_altitude), OsmAndFormatter.getFormattedAlt(analysis.avgElevation, app),
R.drawable.ic_action_altitude_average_16, GPXDataSetType.ALTITUDE, null, ItemType.ITEM_ALTITUDE);
}
public void prepareDataAltitudeRange(String min, String max) {
String pattern = app.getString(R.string.ltr_or_rtl_combine_via_dash);
prepareData(app.getString(R.string.altitude_range), String.format(pattern, min, max),
R.drawable.ic_action_altitude_range_16, GPXDataSetType.ALTITUDE, null, ItemType.ITEM_ALTITUDE);
}
public void prepareDataAscent(String asc) {
prepareData(app.getString(R.string.altitude_ascent), asc,
R.drawable.ic_action_arrow_up_16, R.color.gpx_chart_red,
GPXDataSetType.SLOPE, null, ItemType.ITEM_ALTITUDE);
}
public void prepareDataDescent(String desc) {
prepareData(app.getString(R.string.altitude_descent), desc,
R.drawable.ic_action_arrow_down_16, R.color.gpx_pale_green,
GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE, ItemType.ITEM_ALTITUDE);
}
public void prepareDataAverageSpeed(String avg) {
prepareData(app.getString(R.string.average_speed), avg,
R.drawable.ic_action_speed_16, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED);
}
public void prepareDataMaximumSpeed(String max) {
prepareData(app.getString(R.string.max_speed), max,
R.drawable.ic_action_max_speed_16, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED);
}
public void prepareDataTimeMoving(long timeMoving) {
prepareData(app.getString(R.string.shared_string_time_moving),
Algorithms.formatDuration((int) (timeMoving / 1000), app.accessibilityEnabled()),
R.drawable.ic_action_time_span_16, GPXDataSetType.SPEED, null, ItemType.ITEM_TIME_MOVING);
}
public void prepareDataDistanceCorrected(float totalDistanceMoving) {
prepareData(app.getString(R.string.distance_moving),
OsmAndFormatter.getFormattedDistance(totalDistanceMoving, app),
R.drawable.ic_action_polygom_dark, GPXDataSetType.SPEED, null, ItemType.ITEM_DISTANCE_MOVING);
}
public void prepareDataTimeSpan(float timeSpan) {
prepareData(app.getString(R.string.shared_string_time_span),
Algorithms.formatDuration((int) (timeSpan / 1000), app.accessibilityEnabled()),
R.drawable.ic_action_time_span_16, GPXDataSetType.SPEED, null, ItemType.ITEM_TIME_SPAN);
}
public void prepareDataStartTime(Date start) {
DateFormat dtf = SimpleDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
prepareData(app.getString(R.string.shared_string_start_time), dtf.format(start),
R.drawable.ic_action_time_start_16, GPXDataSetType.SPEED, null, ItemType.ITEM_TIME);
}
public void prepareDataEndTime(Date end) {
DateFormat dtf = SimpleDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
prepareData(app.getString(R.string.shared_string_end_time), dtf.format(end),
R.drawable.ic_action_time_end_16, GPXDataSetType.SPEED, null, ItemType.ITEM_TIME);
}
public void prepareData(String title, String value, @DrawableRes int imageResId,
GPXDataSetType firstType, GPXDataSetType secondType, ItemType itemType) { GPXDataSetType firstType, GPXDataSetType secondType, ItemType itemType) {
prepareData(title, value, imageResId, getDefaultIconColorId(nightMode), firstType, secondType, itemType);
}
public void prepareData(String title, String value, @DrawableRes int imageResId, @ColorRes int imageColorId,
GPXDataSetType firstType, GPXDataSetType secondType, ItemType itemType) {
if (analysis == null) {
return;
}
StatBlock statBlock = new StatBlock(title, value, imageResId, imageColorId, firstType, secondType, itemType); StatBlock statBlock = new StatBlock(title, value, imageResId, imageColorId, firstType, secondType, itemType);
switch (statBlock.itemType) { switch (statBlock.itemType) {
case ITEM_DISTANCE: { case ITEM_DISTANCE: {
@ -169,6 +294,12 @@ public class GpxBlockStatisticsBuilder {
} }
break; break;
} }
case ITEM_DISTANCE_MOVING: {
if (analysis.totalDistanceMoving != 0f) {
items.add(statBlock);
}
break;
}
case ITEM_ALTITUDE: { case ITEM_ALTITUDE: {
if (analysis.hasElevationData) { if (analysis.hasElevationData) {
items.add(statBlock); items.add(statBlock);
@ -182,11 +313,23 @@ public class GpxBlockStatisticsBuilder {
break; break;
} }
case ITEM_TIME: { case ITEM_TIME: {
if (analysis.timeSpan > 0) {
items.add(statBlock);
}
break;
}
case ITEM_TIME_SPAN: {
if (analysis.hasSpeedData) { if (analysis.hasSpeedData) {
items.add(statBlock); items.add(statBlock);
} }
break; break;
} }
case ITEM_TIME_MOVING: {
if (analysis.isTimeMoving()) {
items.add(statBlock);
}
break;
}
} }
} }
@ -213,9 +356,12 @@ public class GpxBlockStatisticsBuilder {
public enum ItemType { public enum ItemType {
ITEM_DISTANCE, ITEM_DISTANCE,
ITEM_DISTANCE_MOVING,
ITEM_ALTITUDE, ITEM_ALTITUDE,
ITEM_SPEED, ITEM_SPEED,
ITEM_TIME; ITEM_TIME,
ITEM_TIME_SPAN,
ITEM_TIME_MOVING;
} }
private class BlockStatisticsAdapter extends RecyclerView.Adapter<BlockStatisticsViewHolder> { private class BlockStatisticsAdapter extends RecyclerView.Adapter<BlockStatisticsViewHolder> {
@ -225,17 +371,15 @@ public class GpxBlockStatisticsBuilder {
private final SegmentActionsListener actionsListener; private final SegmentActionsListener actionsListener;
@ColorInt @ColorInt
private final int activeColor; private final int activeColor;
private final boolean nightMode;
private final int minWidthPx; private final int minWidthPx;
private final int maxWidthPx; private final int maxWidthPx;
private final int textSize; private final int textSize;
public BlockStatisticsAdapter(GpxDisplayItem displayItem, SegmentActionsListener actionsListener, public BlockStatisticsAdapter(GpxDisplayItem displayItem, SegmentActionsListener actionsListener,
@ColorInt int activeColor, boolean nightMode) { @ColorInt int activeColor) {
this.displayItem = displayItem; this.displayItem = displayItem;
this.actionsListener = actionsListener; this.actionsListener = actionsListener;
this.activeColor = activeColor; this.activeColor = activeColor;
this.nightMode = nightMode;
minWidthPx = AndroidUtils.dpToPx(app, 60f); minWidthPx = AndroidUtils.dpToPx(app, 60f);
maxWidthPx = AndroidUtils.dpToPx(app, 120f); maxWidthPx = AndroidUtils.dpToPx(app, 120f);
textSize = app.getResources().getDimensionPixelSize(R.dimen.default_desc_text_size); textSize = app.getResources().getDimensionPixelSize(R.dimen.default_desc_text_size);
@ -260,7 +404,7 @@ public class GpxBlockStatisticsBuilder {
holder.valueText.setText(item.value); holder.valueText.setText(item.value);
holder.valueText.setTextColor(activeColor); holder.valueText.setTextColor(activeColor);
holder.titleText.setText(item.title); holder.titleText.setText(item.title);
holder.titleText.setTextColor(app.getResources().getColor(R.color.text_color_secondary_light)); holder.titleText.setTextColor(ContextCompat.getColor(app, R.color.text_color_secondary_light));
float letterSpacing = 0.00f; float letterSpacing = 0.00f;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
letterSpacing = Math.max(holder.valueText.getLetterSpacing(), holder.titleText.getLetterSpacing()); letterSpacing = Math.max(holder.valueText.getLetterSpacing(), holder.titleText.getLetterSpacing());

View file

@ -51,7 +51,7 @@ public class OverviewCard extends BaseCard {
super(mapActivity); super(mapActivity);
this.actionsListener = actionsListener; this.actionsListener = actionsListener;
this.selectedGpxFile = selectedGpxFile; this.selectedGpxFile = selectedGpxFile;
blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile); blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile, nightMode);
} }
@Override @Override
@ -80,7 +80,7 @@ public class OverviewCard extends BaseCard {
initEditButton(iconColorDef, iconColorPres); initEditButton(iconColorDef, iconColorPres);
initDirectionsButton(iconColorDef, iconColorPres); initDirectionsButton(iconColorDef, iconColorPres);
} }
blockStatisticsBuilder.initStatBlocks(actionsListener, getActiveColor(), nightMode); blockStatisticsBuilder.initStatBlocks(actionsListener, getActiveColor());
} }
private GPXFile getGPXFile() { private GPXFile getGPXFile() {

View file

@ -47,7 +47,7 @@ public class SegmentsCard extends BaseCard {
WrapContentHeightViewPager pager = segmentView.findViewById(R.id.pager); WrapContentHeightViewPager pager = segmentView.findViewById(R.id.pager);
PagerSlidingTabStrip tabLayout = segmentView.findViewById(R.id.sliding_tabs); PagerSlidingTabStrip tabLayout = segmentView.findViewById(R.id.sliding_tabs);
pager.setAdapter(new GPXItemPagerAdapter(app, displayItem, displayHelper, nightMode, listener)); pager.setAdapter(new GPXItemPagerAdapter(app, displayItem, displayHelper, nightMode, listener, false));
tabLayout.setViewPager(pager); tabLayout.setViewPager(pager);
container.addView(segmentView); container.addView(segmentView);

View file

@ -36,8 +36,8 @@ import net.osmand.plus.dialogs.GpxAppearanceAdapter;
import net.osmand.plus.dialogs.GpxAppearanceAdapter.AppearanceListItem; import net.osmand.plus.dialogs.GpxAppearanceAdapter.AppearanceListItem;
import net.osmand.plus.dialogs.GpxAppearanceAdapter.GpxAppearanceAdapterType; import net.osmand.plus.dialogs.GpxAppearanceAdapter.GpxAppearanceAdapterType;
import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.monitoring.TripRecordingActiveBottomSheet;
import net.osmand.plus.monitoring.TripRecordingBottomSheet; import net.osmand.plus.monitoring.TripRecordingBottomSheet;
import net.osmand.plus.monitoring.TripRecordingStartingBottomSheet;
import net.osmand.plus.routepreparationmenu.cards.BaseCard; import net.osmand.plus.routepreparationmenu.cards.BaseCard;
import net.osmand.plus.routepreparationmenu.cards.BaseCard.CardListener; import net.osmand.plus.routepreparationmenu.cards.BaseCard.CardListener;
import net.osmand.plus.settings.backend.CommonPreference; import net.osmand.plus.settings.backend.CommonPreference;
@ -64,7 +64,7 @@ import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_COLOR_ATTR;
import static net.osmand.plus.dialogs.GpxAppearanceAdapter.TRACK_WIDTH_BOLD; import static net.osmand.plus.dialogs.GpxAppearanceAdapter.TRACK_WIDTH_BOLD;
import static net.osmand.plus.dialogs.GpxAppearanceAdapter.TRACK_WIDTH_MEDIUM; import static net.osmand.plus.dialogs.GpxAppearanceAdapter.TRACK_WIDTH_MEDIUM;
import static net.osmand.plus.dialogs.GpxAppearanceAdapter.getAppearanceItems; import static net.osmand.plus.dialogs.GpxAppearanceAdapter.getAppearanceItems;
import static net.osmand.plus.monitoring.TripRecordingActiveBottomSheet.UPDATE_TRACK_ICON; import static net.osmand.plus.monitoring.TripRecordingBottomSheet.UPDATE_TRACK_ICON;
public class TrackAppearanceFragment extends ContextMenuScrollFragment implements CardListener, ColorPickerListener { public class TrackAppearanceFragment extends ContextMenuScrollFragment implements CardListener, ColorPickerListener {
@ -398,10 +398,10 @@ public class TrackAppearanceFragment extends ContextMenuScrollFragment implement
@Override @Override
public void onContextMenuDismiss(@NonNull ContextMenuFragment fragment) { public void onContextMenuDismiss(@NonNull ContextMenuFragment fragment) {
Fragment target = getTargetFragment(); Fragment target = getTargetFragment();
if (target instanceof TripRecordingBottomSheet) { if (target instanceof TripRecordingStartingBottomSheet) {
((TripRecordingBottomSheet) target).show(); ((TripRecordingStartingBottomSheet) target).show();
} else if (target instanceof TripRecordingActiveBottomSheet) { } else if (target instanceof TripRecordingBottomSheet) {
((TripRecordingActiveBottomSheet) target).show(UPDATE_TRACK_ICON); ((TripRecordingBottomSheet) target).show(UPDATE_TRACK_ICON);
} }
} }

View file

@ -114,6 +114,12 @@ public class TrackPointsCard extends BaseCard implements OnChildClickListener, O
this.selectedGroup = selectedGroup; this.selectedGroup = selectedGroup;
} }
public void updateGroups() {
selectedItems.clear();
selectedGroups.clear();
adapter.synchronizeGroups(getDisplayGroups());
}
public List<GpxDisplayGroup> getGroups() { public List<GpxDisplayGroup> getGroups() {
return adapter.groups; return adapter.groups;
} }
@ -184,7 +190,13 @@ public class TrackPointsCard extends BaseCard implements OnChildClickListener, O
} }
private List<GpxDisplayGroup> getDisplayGroups() { private List<GpxDisplayGroup> getDisplayGroups() {
return selectedGroup != null ? Collections.singletonList(selectedGroup) : getOriginalGroups(); if (selectedGroup != null) {
List<GpxDisplayGroup> res = new ArrayList<>();
res.add(selectedGroup);
return res;
} else {
return getOriginalGroups();
}
} }
@Override @Override
@ -257,9 +269,7 @@ public class TrackPointsCard extends BaseCard implements OnChildClickListener, O
@Override @Override
public void onPointsDeleted() { public void onPointsDeleted() {
selectedItems.clear(); updateGroups();
selectedGroups.clear();
adapter.synchronizeGroups(getDisplayGroups());
} }
public void filter(String text) { public void filter(String text) {

View file

@ -147,6 +147,7 @@ public class AddGpxPointBottomSheetHelper implements OnDismissListener {
private void onClose() { private void onClose() {
TrackMenuFragment fragment = mapActivity.getTrackMenuFragment(); TrackMenuFragment fragment = mapActivity.getTrackMenuFragment();
if (fragment != null) { if (fragment != null) {
fragment.updateContent();
fragment.show(); fragment.show();
} else { } else {
TrackMenuFragment.openTrack(mapActivity, new File(newGpxPoint.getGpx().path), null); TrackMenuFragment.openTrack(mapActivity, new File(newGpxPoint.getGpx().path), null);

View file

@ -66,12 +66,17 @@ public class PagerSlidingTabStrip extends HorizontalScrollView {
public interface CustomTabProvider { public interface CustomTabProvider {
public View getCustomTabView(@NonNull ViewGroup parent, int position); public View getCustomTabView(@NonNull ViewGroup parent, int position);
public void select(View tab); public void select(View tab);
public void deselect(View tab); public void deselect(View tab);
public void tabStylesUpdated(View tabsContainer, int currentPosition); public void tabStylesUpdated(View tabsContainer, int currentPosition);
} }
public interface OnTabReselectedListener { public interface OnTabReselectedListener {
public void onTabSelected(int position);
public void onTabReselected(int position); public void onTabReselected(int position);
} }
@ -221,7 +226,7 @@ public class PagerSlidingTabStrip extends HorizontalScrollView {
tabTypefaceSelectedStyle = a.getInt(R.styleable.PagerSlidingTabStrip_pstsTextSelectedStyle, Typeface.NORMAL); tabTypefaceSelectedStyle = a.getInt(R.styleable.PagerSlidingTabStrip_pstsTextSelectedStyle, Typeface.NORMAL);
tabTextAlpha = a.getFloat(R.styleable.PagerSlidingTabStrip_pstsTextAlpha, HALF_TRANSP); tabTextAlpha = a.getFloat(R.styleable.PagerSlidingTabStrip_pstsTextAlpha, HALF_TRANSP);
tabTextSelectedAlpha = a.getFloat(R.styleable.PagerSlidingTabStrip_pstsTextSelectedAlpha, OPAQUE); tabTextSelectedAlpha = a.getFloat(R.styleable.PagerSlidingTabStrip_pstsTextSelectedAlpha, OPAQUE);
tabTypeface = FontCache.getRobotoMedium(context); tabTypeface = FontCache.getRobotoMedium(context);
a.recycle(); a.recycle();
setMarginBottomTabContainer(); setMarginBottomTabContainer();
@ -326,6 +331,9 @@ public class PagerSlidingTabStrip extends HorizontalScrollView {
View tab = tabsContainer.getChildAt(pager.getCurrentItem()); View tab = tabsContainer.getChildAt(pager.getCurrentItem());
notSelected(tab); notSelected(tab);
pager.setCurrentItem(position); pager.setCurrentItem(position);
if (tabReselectedListener != null) {
tabReselectedListener.onTabSelected(position);
}
} else if (tabReselectedListener != null) { } else if (tabReselectedListener != null) {
tabReselectedListener.onTabReselected(position); tabReselectedListener.onTabReselected(position);
} }

View file

@ -927,7 +927,11 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
} }
} }
@Nullable
public static Pair<WptPt, WptPt> findPointsNearSegment(RotatedTileBox tb, List<WptPt> points, int r, int mx, int my) { public static Pair<WptPt, WptPt> findPointsNearSegment(RotatedTileBox tb, List<WptPt> points, int r, int mx, int my) {
if (Algorithms.isEmpty(points)) {
return null;
}
WptPt prevPoint = points.get(0); WptPt prevPoint = points.get(0);
int ppx = (int) tb.getPixXFromLatLon(prevPoint.lat, prevPoint.lon); int ppx = (int) tb.getPixXFromLatLon(prevPoint.lat, prevPoint.lon);
int ppy = (int) tb.getPixYFromLatLon(prevPoint.lat, prevPoint.lon); int ppy = (int) tb.getPixYFromLatLon(prevPoint.lat, prevPoint.lon);

View file

@ -2,13 +2,14 @@ package net.osmand.plus.views.layers.geometry;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import androidx.annotation.NonNull; import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities.WptPt; import net.osmand.GPXUtilities.WptPt;
import net.osmand.data.RotatedTileBox; import net.osmand.data.RotatedTileBox;
import java.util.List; import java.util.List;
import androidx.annotation.NonNull;
public class GpxGeometryWay extends GeometryWay<GpxGeometryWayContext, GeometryWayDrawer<GpxGeometryWayContext>> { public class GpxGeometryWay extends GeometryWay<GpxGeometryWayContext, GeometryWayDrawer<GpxGeometryWayContext>> {
private List<WptPt> points; private List<WptPt> points;
@ -76,16 +77,25 @@ public class GpxGeometryWay extends GeometryWay<GpxGeometryWayContext, GeometryW
public static class GeometryArrowsStyle extends GeometryWayStyle<GpxGeometryWayContext> { public static class GeometryArrowsStyle extends GeometryWayStyle<GpxGeometryWayContext> {
private static final double DIRECTION_ARROW_DISTANCE_MULTIPLIER = 10.0; private static final float TRACK_WIDTH_THRESHOLD_DP = 8f;
private static final float ARROW_DISTANCE_MULTIPLIER = 1.5f;
private static final float SPECIAL_ARROW_DISTANCE_MULTIPLIER = 10f;
private final float TRACK_WIDTH_THRESHOLD_PIX;
private Bitmap arrowBitmap; private Bitmap arrowBitmap;
public static final int OUTER_CIRCLE_COLOR = 0x33000000;
protected int pointColor; protected int pointColor;
protected int trackColor; protected int trackColor;
protected float trackWidth; protected float trackWidth;
private float outerCircleRadius;
private float innerCircleRadius;
GeometryArrowsStyle(GpxGeometryWayContext context, int arrowColor, int trackColor, float trackWidth) { GeometryArrowsStyle(GpxGeometryWayContext context, int arrowColor, int trackColor, float trackWidth) {
this(context, null, arrowColor, trackColor, trackWidth); this(context, null, arrowColor, trackColor, trackWidth);
outerCircleRadius = AndroidUtils.dpToPx(context.getCtx(), 8);
innerCircleRadius = AndroidUtils.dpToPx(context.getCtx(), 7);
} }
GeometryArrowsStyle(GpxGeometryWayContext context, Bitmap arrowBitmap, int arrowColor, int trackColor, float trackWidth) { GeometryArrowsStyle(GpxGeometryWayContext context, Bitmap arrowBitmap, int arrowColor, int trackColor, float trackWidth) {
@ -94,6 +104,7 @@ public class GpxGeometryWay extends GeometryWay<GpxGeometryWayContext, GeometryW
this.pointColor = arrowColor; this.pointColor = arrowColor;
this.trackColor = trackColor; this.trackColor = trackColor;
this.trackWidth = trackWidth; this.trackWidth = trackWidth;
TRACK_WIDTH_THRESHOLD_PIX = AndroidUtils.dpToPx(context.getCtx(), TRACK_WIDTH_THRESHOLD_DP);
} }
@Override @Override
@ -114,6 +125,9 @@ public class GpxGeometryWay extends GeometryWay<GpxGeometryWayContext, GeometryW
@Override @Override
public Bitmap getPointBitmap() { public Bitmap getPointBitmap() {
if (useSpecialArrow()) {
return getContext().getSpecialArrowBitmap();
}
return arrowBitmap != null ? arrowBitmap : getContext().getArrowBitmap(); return arrowBitmap != null ? arrowBitmap : getContext().getArrowBitmap();
} }
@ -130,9 +144,23 @@ public class GpxGeometryWay extends GeometryWay<GpxGeometryWayContext, GeometryW
return trackWidth; return trackWidth;
} }
public float getOuterCircleRadius() {
return outerCircleRadius;
}
public float getInnerCircleRadius() {
return innerCircleRadius;
}
public boolean useSpecialArrow() {
return trackWidth <= TRACK_WIDTH_THRESHOLD_PIX;
}
@Override @Override
public double getPointStepPx(double zoomCoef) { public double getPointStepPx(double zoomCoef) {
return getPointBitmap().getHeight() + trackWidth * 1.5f; return useSpecialArrow() ?
getPointBitmap().getHeight() * SPECIAL_ARROW_DISTANCE_MULTIPLIER :
getPointBitmap().getHeight() + trackWidth * ARROW_DISTANCE_MULTIPLIER;
} }
} }
} }

View file

@ -1,20 +1,46 @@
package net.osmand.plus.views.layers.geometry; package net.osmand.plus.views.layers.geometry;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Paint; import android.graphics.Paint;
import net.osmand.AndroidUtils;
import net.osmand.plus.R; import net.osmand.plus.R;
import androidx.core.content.ContextCompat;
public class GpxGeometryWayContext extends GeometryWayContext { public class GpxGeometryWayContext extends GeometryWayContext {
private Paint circlePaint;
private final Bitmap specialArrowBitmap;
public GpxGeometryWayContext(Context ctx, float density) { public GpxGeometryWayContext(Context ctx, float density) {
super(ctx, density); super(ctx, density);
Paint paint = getPaintIcon(); Paint paint = getPaintIcon();
paint.setStrokeCap(Paint.Cap.ROUND); paint.setStrokeCap(Paint.Cap.ROUND);
setupCirclePaint();
specialArrowBitmap = AndroidUtils.drawableToBitmap(ContextCompat.getDrawable(ctx, R.drawable.mm_special_arrow_up));
} }
@Override @Override
protected int getArrowBitmapResId() { protected int getArrowBitmapResId() {
return R.drawable.ic_action_direction_arrow; return R.drawable.ic_action_direction_arrow;
} }
public Bitmap getSpecialArrowBitmap() {
return specialArrowBitmap;
}
public Paint getCirclePaint() {
return circlePaint;
}
private void setupCirclePaint() {
circlePaint = new Paint();
circlePaint.setDither(true);
circlePaint.setAntiAlias(true);
circlePaint.setStyle(Paint.Style.FILL);
circlePaint.setColor(0x33000000);
}
} }

View file

@ -1,5 +1,6 @@
package net.osmand.plus.views.layers.geometry; package net.osmand.plus.views.layers.geometry;
import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Matrix; import android.graphics.Matrix;
@ -7,6 +8,7 @@ import android.graphics.Paint;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter; import android.graphics.PorterDuffColorFilter;
import net.osmand.AndroidUtils;
import net.osmand.plus.views.layers.geometry.GpxGeometryWay.GeometryArrowsStyle; import net.osmand.plus.views.layers.geometry.GpxGeometryWay.GeometryArrowsStyle;
public class GpxGeometryWayDrawer extends GeometryWayDrawer<GpxGeometryWayContext> { public class GpxGeometryWayDrawer extends GeometryWayDrawer<GpxGeometryWayContext> {
@ -29,24 +31,39 @@ public class GpxGeometryWayDrawer extends GeometryWayDrawer<GpxGeometryWayContex
@Override @Override
void draw(Canvas canvas, GeometryWayContext context) { void draw(Canvas canvas, GeometryWayContext context) {
if (style instanceof GeometryArrowsStyle) { if (style instanceof GeometryArrowsStyle) {
Context ctx = style.getCtx();
GeometryArrowsStyle arrowsWayStyle = (GeometryArrowsStyle) style; GeometryArrowsStyle arrowsWayStyle = (GeometryArrowsStyle) style;
Bitmap bitmap = style.getPointBitmap(); Bitmap bitmap = style.getPointBitmap();
boolean useSpecialArrow = arrowsWayStyle.useSpecialArrow();
float newWidth = arrowsWayStyle.getTrackWidth() / 2f; float newWidth = useSpecialArrow ? AndroidUtils.dpToPx(ctx, 12) : arrowsWayStyle.getTrackWidth() / 2f;
float paintH2 = bitmap.getHeight() / 2f; float paintH2 = bitmap.getHeight() / 2f;
float paintW2 = newWidth / 2f; float paintW2 = newWidth / 2f;
Matrix matrix = getMatrix(); Matrix matrix = getMatrix();
matrix.reset(); matrix.reset();
matrix.postScale(newWidth / bitmap.getWidth(), 1); float sy = useSpecialArrow ? newWidth / bitmap.getHeight() : 1;
matrix.postScale(newWidth / bitmap.getWidth(), sy);
matrix.postRotate((float) angle, paintW2, paintH2); matrix.postRotate((float) angle, paintW2, paintH2);
matrix.postTranslate(x - paintW2, y - paintH2); matrix.postTranslate(x - paintW2, y - paintH2);
if (useSpecialArrow) {
drawCircle(canvas, arrowsWayStyle);
}
Paint paint = context.getPaintIconCustom(); Paint paint = context.getPaintIconCustom();
Integer pointColor = style.getPointColor(); Integer pointColor = style.getPointColor();
paint.setColorFilter(new PorterDuffColorFilter(pointColor, PorterDuff.Mode.SRC_IN)); paint.setColorFilter(new PorterDuffColorFilter(pointColor, PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, matrix, paint); canvas.drawBitmap(bitmap, matrix, paint);
} }
} }
private void drawCircle(Canvas canvas, GeometryArrowsStyle style) {
Paint paint = style.getContext().getCirclePaint();
paint.setColor(GeometryArrowsStyle.OUTER_CIRCLE_COLOR);
canvas.drawCircle(x, y, style.getOuterCircleRadius(), paint);
paint.setColor(style.getTrackColor());
canvas.drawCircle(x, y, style.getInnerCircleRadius(), paint);
}
} }
} }

View file

@ -159,7 +159,7 @@ public class ExploreRvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
if (isCardExists(getNeededMapsCardPosition(), TravelNeededMapsCard.TYPE)) { if (isCardExists(getNeededMapsCardPosition(), TravelNeededMapsCard.TYPE)) {
updateNeededMapsCard(false); updateNeededMapsCard(false);
} else if (addItem(getNeededMapsCardPosition(), card)) { } else if (addItem(getNeededMapsCardPosition(), card)) {
notifyDataSetChanged(); notifyItemInserted(getNeededMapsCardPosition());
} }
} }

Some files were not shown because too many files have changed in this diff Show more