Merge branch 'master' into route_altitude_slope

# Conflicts:
#	OsmAnd/src/net/osmand/plus/routing/cards/RouteLineColorCard.java
This commit is contained in:
Vitaliy 2021-04-22 19:34:46 +03:00
commit 500cb007b8
202 changed files with 14926 additions and 4028 deletions

View file

@ -16,13 +16,11 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.zip.GZIPInputStream;
@ -183,7 +181,9 @@ public abstract class MapObject implements Comparable<MapObject> {
public String getName(String lang, boolean transliterate) {
if (lang != null && lang.length() > 0) {
if (lang.equals("en")) {
return getEnName(transliterate);
// for some objects like wikipedia, english name is stored 'name' tag
String enName = getEnName(transliterate);
return !Algorithms.isEmpty(enName) ? enName : getName();
} else {
// get name
if (names != null) {

View file

@ -5,8 +5,11 @@ import net.osmand.data.QuadRect;
import net.osmand.util.Algorithms;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class WorldRegion implements Serializable {
@ -212,4 +215,22 @@ public class WorldRegion implements Serializable {
}
return false;
}
public static List<WorldRegion> removeDuplicates(List<WorldRegion> regions) {
List<WorldRegion> copy = new ArrayList<>(regions);
Set<WorldRegion> duplicates = new HashSet<>();
for (int i = 0; i < copy.size() - 1; i++) {
WorldRegion r1 = copy.get(i);
for (int j = i + 1; j < copy.size(); j++) {
WorldRegion r2 = copy.get(j);
if (r1.containsRegion(r2)) {
duplicates.add(r2);
} else if (r2.containsRegion(r1)) {
duplicates.add(r1);
}
}
}
copy.removeAll(duplicates);
return copy;
}
}

View file

@ -1317,7 +1317,13 @@ public class SearchCoreFactory {
|| !phrase.isSearchTypeAllowed(ObjectType.HOUSE)) {
continue;
}
if(interpolation) {
res.localeName = lw;
res.location = b.getLocation(b.interpolation(lw));
} else {
res.localeName = b.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate());
res.location = b.getLocation();
}
res.otherNames = b.getAllNames(true);
res.object = b;
res.file = file;
@ -1328,12 +1334,6 @@ public class SearchCoreFactory {
res.relatedObject = s;
res.localeRelatedObjectName = s.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate());
res.objectType = ObjectType.HOUSE;
if(interpolation) {
res.location = b.getLocation(b.interpolation(lw));
res.localeName = lw;
} else {
res.location = b.getLocation();
}
res.preferredZoom = 17;
resultMatcher.publish(res);

View file

@ -55,7 +55,9 @@ public class SearchResult {
public double getSumPhraseMatchWeight() {
// if result is a complete match in the search we prioritize it higher
boolean match = requiredSearchPhrase.countWords(localeName) <= getSelfWordCount();
int localWordsMatched = alternateName != null ?
requiredSearchPhrase.countWords(alternateName) : requiredSearchPhrase.countWords(localeName) ;
boolean match = localWordsMatched <= getSelfWordCount();
double res = ObjectType.getTypeWeight(match ? objectType : null);
if (parentSearchResult != null) {
res = res + parentSearchResult.getSumPhraseMatchWeight() / MAX_TYPE_WEIGHT;

View file

@ -191,10 +191,10 @@ public class SearchUICoreTest {
if (!Algorithms.stringsEqual(expected, present)) {
System.out.println(String.format("Phrase: %s", phrase));
System.out.println(String.format("Mismatch for '%s' != '%s'. Result: ", expected, present));
}
for (SearchResult r : searchResults) {
System.out.println(String.format("\t\"%s\",", formatResult(false, r, phrase)));
}
}
Assert.assertEquals(expected, present);
}
}

View file

@ -0,0 +1,274 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="shared_string_select">Označi</string>
<string name="shared_string_enable">Omogući</string>
<string name="altitude">Nadmorska visina</string>
<string name="shared_string_search">Traži</string>
<string name="shared_string_ok">U redu</string>
<string name="shared_string_update">Ažuriraj</string>
<string name="average_altitude">Prosečna visina</string>
<string name="average_speed">Prosečna brzina</string>
<string name="shared_string_map">Karta</string>
<string name="shared_string_add">Dodaj</string>
<string name="shared_string_hide">Sakrij</string>
<string name="shared_string_status">Stanje</string>
<string name="shared_string_disable">Onemogući</string>
<string name="shared_string_save">Sačuvaj</string>
<string name="shared_string_name">Ime</string>
<string name="shared_string_sort">Sortiraj</string>
<string name="shared_string_exit">Izlaz</string>
<string name="shared_string_close">Zatvori</string>
<string name="shared_string_all">Sve</string>
<string name="shared_string_off">Isključeno</string>
<string name="shared_string_install">Instaliraj</string>
<string name="shared_string_share">Deli</string>
<string name="shared_string_back">Nazad</string>
<string name="shared_string_continue">Nastavi</string>
<string name="shared_string_cancel">Otkaži</string>
<string name="shared_string_settings">Postavke</string>
<string name="osmand_service">Pozadinski režim</string>
<string name="yard">yd</string>
<string name="foot">ft</string>
<string name="mile">mi</string>
<string name="km">km</string>
<string name="m">m</string>
<string name="nm">nmi</string>
<string name="min_mile">min/m</string>
<string name="min_km">min/km</string>
<string name="m_s">m/s</string>
<string name="km_h">km/h</string>
<string name="mile_per_hour">mph</string>
<string name="si_kmh">Kilometara na sat</string>
<string name="si_mph">Milja na sat</string>
<string name="si_m_s">Metara u sekundi</string>
<string name="si_min_km">Minuta po kilometru</string>
<string name="si_min_m">Minuta po milji</string>
<string name="si_mi_feet">Milje/stope</string>
<string name="si_mi_yard">Milje/jardi</string>
<string name="si_km_m">Kilometri/metri</string>
<string name="si_nm">Nautičke milje</string>
<string name="si_mi_meters">Milje/metri</string>
<string name="shared_string_apply">Primeni</string>
<string name="shared_string_enabled">Uključen</string>
<string name="units_and_formats">Merne jedinice &amp; formatiranja</string>
<string name="unit_of_length_descr">Promeni jedinice za dužinu.</string>
<string name="unit_of_length">Jedinice dužine</string>
<string name="shared_string_appearance">Izgled</string>
<string name="timeline">Vremenska linija</string>
<string name="live_now">Uživo sada</string>
<string name="my_location">Moja lokacija</string>
<string name="welcome_descr"><b>OsmAnd Pratioc</b> omogućava vam da delite svoju lokaciju i vidite lokaciju drugih u OsmAndu.<br/><br/>Aplikacija koristi Telegram API, pa vam je potreban Telegram nalog.</string>
<string name="shared_string_second_short">sek</string>
<string name="shared_string_minute_short">min</string>
<string name="shared_string_hour_short">č</string>
<string name="si_nm_h">Nautičkih milja na sat (čvorovi)</string>
<string name="nm_h">nmi/č</string>
<string name="shared_string_welcome">Dobrodošli</string>
<string name="shared_string_authorization_descr">Unesite vaš telefonski broj Telegrama u međunarodnom formatu</string>
<string name="shared_string_authorization">Autorizacija</string>
<string name="active_chats">Aktivna ćaskanja</string>
<string name="show_users_on_map">Prikažite korisnike na mapi</string>
<string name="install_osmand">Instalirajte OsmAnd</string>
<string name="install_osmand_dialog_message">Prvo morate instalirati besplatnu ili plaćenu verziju OsmAnda</string>
<string name="osmand_logo">Logo OsmAnda</string>
<string name="process_service">Usluga OsmAnd Pratioca</string>
<string name="sharing_location">Deljenje lokacije</string>
<string name="share_location">Deli lokaciju</string>
<string name="shared_string_distance">Rastojanje</string>
<string name="osmand_service_descr">OsmAnd Pratioc radi u pozadini sa isključenim ekranom.</string>
<string name="location_service_no_gps_available">Izaberite jednog od dobavljača lokacije da bi deliti vašu lokaciju.</string>
<string name="gps_not_available">Uključite „Lokaciju“ u sistemskim podešavanjima</string>
<string name="no_location_permission">Aplikaciji nedostaje dozvola za pristup podacima o lokaciji.</string>
<string name="not_logged_in">Niste prijavljeni</string>
<string name="gps_network_not_enabled">Uključiti „Lokaciju“\?</string>
<string name="closing">Zatvaranje</string>
<string name="logging_out">Odjavljivanje</string>
<string name="initialization">Pokretanje</string>
<string name="shared_string_logout">Odjaviti se</string>
<string name="shared_string_login">Prijavite se</string>
<string name="password_descr">Telegram lozinka</string>
<string name="enter_password">Unesite lozinku</string>
<string name="authentication_code_descr">Telegram vam je poslao kod za OsmAnd radi prijave na vaš nalog.</string>
<string name="authentication_code">Validacioni kod</string>
<string name="enter_code">Unesite kod</string>
<string name="shared_string_password">Lozinka</string>
<string name="phone_number_descr">Broj telefona u međunarodnom formatu</string>
<string name="phone_number_title">Broj telefona</string>
<string name="app_name">OsmAnd Onlajn GPS Pratioc</string>
<string name="show_on_map">Prikaži na mapi</string>
<string name="start_location_sharing">Deli lokaciju</string>
<string name="my_location_search_hint">Pretražite: Grupu ili kontakt</string>
<string name="location_sharing_description">Izaberite kontakte i grupe sa kojima želite da delite lokaciju.</string>
<string name="set_time">Podesite vreme</string>
<string name="set_time_description">Podesite vreme za koji će izabrani kontakti i grupe videti vašu lokaciju u realnom vremenu.</string>
<string name="visible_time_for_all">Vidljivo vreme za sve</string>
<string name="hours_format">%1$ č</string>
<string name="minutes_format">%1$ m</string>
<string name="hours_and_minutes_format">%1$ č %2$ m</string>
<string name="set_visible_time_for_all">Podesite vidljivo vreme za sve</string>
<string name="enter_authentication_code">Unesite kod za validaciju</string>
<string name="enter_phone_number">Unesite broj telefona</string>
<string name="do_not_have_telegram">Nemam Telegram nalog</string>
<string name="already_registered_in_telegram">Potreban vam je registrovani Telegram nalog i broj telefona</string>
<string name="get_telegram_after_creating_account">Tada možete da koristite ovu aplikaciju.</string>
<string name="get_telegram_description_continue">Instalirajte Telegram i otvorite nalog.</string>
<string name="get_telegram_account_first">Za deljenje lokacije potreban vam je Telegram nalog.</string>
<string name="get_telegram_title">Registracija u Telegramu</string>
<string name="shared_string_bot">Bot</string>
<string name="shared_string_live">Uživo</string>
<string name="open_osmand">Otvori OsmAnd</string>
<string name="turn_off_location_sharing">Isključite deljenje lokacije</string>
<string name="stop_sharing_all">Deljenje je uključeno (isključite)</string>
<string name="expire_at">Ističe</string>
<string name="sharing_time">Vreme deljenja</string>
<string name="gps_and_location">Pozicija</string>
<string name="send_my_location">Pošalji moju lokaciju</string>
<string name="send_my_location_desc">Podesite minimalni interval za deljenje lokacije.</string>
<string name="stale_location">Nepomičan</string>
<string name="stale_location_desc">Poslednji put kada se kontakt pomerio.</string>
<string name="location_history">Istorija lokacije</string>
<string name="location_history_desc">Sakrijte kontakte koji se nisu pomerili u datom vremenu.</string>
<string name="osmand_connect">Osmand veza</string>
<string name="osmand_connect_desc">Odaberite verziju OsmAnda koju OsmAnd pratioc koristi za prikazivanje pozicija.</string>
<string name="in_time">u %1$</string>
<string name="shared_string_account">Nalog</string>
<string name="connected_account">Povezani nalog</string>
<string name="logout_help_desc">Kako isključiti OsmAnd pratioca iz Telegrama</string>
<string name="disconnect_from_telegram">Kako isključiti OsmAnd pratioca iz Telegrama</string>
<string name="disconnect_from_telegram_desc">Da biste opozvali pristup deljenju lokacije. Otvorite Telegram, idite na Podešavanja → Privatnost i bezbednost → Sesije i prekinete sesiju OsmAnd pratioca.</string>
<string name="logout_no_internet_msg">Povežite se na Internet kako biste se pravilno odjavili iz Telegrama.</string>
<string name="shared_string_group">Grupa</string>
<string name="last_response">Poslednji odgovor</string>
<string name="time_ago">pre</string>
<string name="turn_off_all">Isključi sve</string>
<string name="disable_all_sharing">Onemogući svako deljenje</string>
<string name="disable_all_sharing_desc">Isključuje deljenje lokacije prema svim izabranim čatovima (%1$).</string>
<string name="choose_osmand">Izaberite verziju OsmAnda koju želite da koristite</string>
<string name="choose_osmand_desc">Izaberite verziju OsmAnda gde će se kontakti prikazati na mapi.</string>
<string name="shared_string_sort_by">Sortiraj po</string>
<string name="by_group">Po grupi</string>
<string name="by_name">Po imenu</string>
<string name="by_distance">Po udaljenosti</string>
<string name="logout_from_osmand_telegram">Odjaviti se sa OsmAnd pratioca\?</string>
<string name="logout_from_osmand_telegram_descr">Jeste li sigurni da se želite odjaviti sa OsmAnd pratioca tako da ne možete da delite lokaciju ili vidite lokaciju drugih\?</string>
<string name="live_now_description">Kontakti i grupe dele lokaciju vama.</string>
<string name="share_location_as">Deljenje lokacije kao</string>
<string name="add_device">Dodajte uređaj</string>
<string name="no_internet_connection">Nema internet konekcije</string>
<string name="no_gps_connection">Nema GPS veze</string>
<string name="location_sharing_status">Deljenje: %1$</string>
<string name="sharing_status">Deljenje statusa</string>
<string name="last_available_location">Poslednja dostupna lokacija</string>
<string name="re_send_location">Ponovo pošalji lokaciju</string>
<string name="not_found_yet">Još nije pronađeno</string>
<string name="not_sent_yet">Još nije poslato</string>
<string name="shared_string_later">Kasnije</string>
<string name="go_to_settings">Idi na Podešavanja</string>
<string name="sharing_in_background">Deljenje u pozadini</string>
<string name="battery_optimization_description">Isključite optimizaciju baterije za OsmAnd pratilac tako da se ne isključi iznenada kad je u pozadini.</string>
<string name="background_work">Rad u pozadini</string>
<string name="background_work_description">Promenite podešavanja za optimizaciju baterije da biste stabilizovali deljenje lokacije.</string>
<string name="connecting_to_the_internet">Povezivanje sa Internetom</string>
<string name="searching_for_gps">Pozicioniranje…</string>
<string name="initializing">Pokretanje</string>
<string name="sending_location_messages">Lokacija se šalje</string>
<string name="waiting_for_response_from_telegram">Čeka se odgovor iz Telegrama</string>
<string name="not_possible_to_send_to_telegram_chats">Nije moguće poslati u Telegram četove:</string>
<string name="successfully_sent_and_updated">Uspešno poslato i ažurirano</string>
<string name="last_updated_location">Poslednja ažurirana lokacija:</string>
<string name="share_location_as_description">Ako želite da povežete više uređaja sa jednim nalogom telegrama, trebate koristiti drugi uređaj da bi delili vašu lokaciju.</string>
<string name="share_location_as_description_second_line">Možete da kreirate i vidite ID uređaja u telegram klijentu koristeći %1$ čat bot. %2$</string>
<string name="device_name">Ime uređaja</string>
<string name="device_name_cannot_be_empty">Ime uređaja ne može biti prazno</string>
<string name="device_name_is_too_long">Ime uređaja predugo</string>
<string name="enter_device_name_description">Imenujte vaš novi uređaj sa maksimalno 200 simbola.</string>
<string name="error_adding_new_device">Nije moguće dodati novi uređaj</string>
<string name="device_added_successfully">%1$ dodato.</string>
<string name="enter_another_device_name">Izaberite ime koje niste već koristili</string>
<string name="last_update_from_telegram">Poslednje ažuriranje od Telegrama</string>
<string name="map_and_text">Mapa i tekst</string>
<string name="shared_string_text">Tekst</string>
<string name="send_location_as_descr">Odaberite kako će izgledati poruke sa vašom lokacijom.</string>
<string name="send_location_as">Pošalji lokaciju kao</string>
<string name="start_date">Početni datum</string>
<string name="end_date">Krajnji datum</string>
<string name="open_in_osmand">Prikaži u OsmAndu</string>
<string name="time_on_the_move">Vreme kretanja</string>
<string name="monitoring_is_disabled">Praćenje je onemogućeno</string>
<string name="monitoring_is_enabled">Praćenje je omogućeno</string>
<string name="shared_string_sent">Poslato</string>
<string name="gps_points">GPS tačke</string>
<string name="shared_string_collected">Prikupljeno</string>
<string name="shared_string_date">Datum</string>
<string name="points_size">%1$ tačaka</string>
<string name="gps_points_in_buffer">poslato (%1$ u baferu)</string>
<string name="please_update_osmand">Ažurirajte OsmAnd da biste videli podatke na mapi</string>
<string name="show_gps_points_descr">Prikaži količinu prikupljenih i poslatih GPS tačaka.</string>
<string name="show_gps_points">Pokaži GPS tačke</string>
<string name="received_gps_points">Primljene GPKS tačke: %1$</string>
<string name="how_it_works">Kako radi</string>
<string name="osmand_privacy_policy">OsmAnd politika privatnosti</string>
<string name="telegram_privacy_policy">Politika privatnosti Telegrama</string>
<string name="shared_string_accept">Prihvati</string>
<string name="privacy_policy_agree">Klikom na „Nastavi“ prihvatate uslove politike privatnosti Telegrama i OsmAnda.</string>
<string name="privacy_policy_telegram_client">OsmAnd pratilac je jedan od klijenata koji koriste otvorenu platformu Telegram. Vaši kontakti mogu da koriste bilo koji drugi Telegram klijent.</string>
<string name="privacy_policy_use_telegram">Telegram (aplikacija za razmenu poruka) koristi se za povezivanje i komunikaciju sa ljudima.</string>
<string name="shared_string_telegram">Telegram</string>
<string name="app_name_short">OsmAnd pratilac</string>
<string name="timeline_description">Omogućite praćenje da biste sačuvali sve lokacije u istoriji.</string>
<string name="location_recording_enabled">Snimanje lokacije omogućeno</string>
<string name="disable_monitoring">Onemogućite praćenje</string>
<string name="timeline_available_for_free_now">Vremenska linija je funkcija koja je sada dostupna besplatno.</string>
<string name="type_contact_or_group_name">Unesite ime kontakta ili grupe</string>
<string name="search_contacts_descr">Pretraga po svim vašim grupama i kontaktima.</string>
<string name="search_contacts">Pretraga kontakta</string>
<string name="bearing">Usmerenje</string>
<string name="precision">Preciznost</string>
<string name="direction">Smer</string>
<string name="privacy">Privatnost</string>
<string name="proxy">Proksi</string>
<string name="proxy_settings">Podešavanja proksija</string>
<string name="proxy_disconnected">Prekinut</string>
<string name="proxy_connected">Povezan</string>
<string name="proxy_type">Tip proksija</string>
<string name="shared_string_connection">Veza</string>
<string name="proxy_server">Server</string>
<string name="proxy_port">Port</string>
<string name="proxy_credentials">Akreditivi</string>
<string name="proxy_username">Korisničko ime</string>
<string name="proxy_password">Lozinka</string>
<string name="proxy_key">Ključ</string>
<string name="gpx_settings">GPX podešavanja</string>
<string name="min_logging_speed_descr">Filter: nema zapisivanja ispod odabrane brzine</string>
<string name="min_logging_speed">Minimalna brzina zapisivanja</string>
<string name="min_logging_accuracy_descr">Filter: Nema zapisa dok se ne dostigne ova tačnost</string>
<string name="min_logging_accuracy">Minimalna tačnost evidentiranja</string>
<string name="min_logging_distance_descr">Filter: minimalna udaljenost za evidentiranje nove tačke</string>
<string name="min_logging_distance">Minimalna udaljenost evidentiranja</string>
<string name="timeline_no_data">Nema podataka</string>
<string name="timeline_no_data_descr">Nemamo prikupljene podatke za izabrani dan</string>
<string name="start_end_date">Početni — Krajnji datum</string>
<string name="set_time_timeline_descr">Izaberite vreme za prikaz</string>
<string name="shared_string_start">Početak</string>
<string name="shared_string_end">Kraj</string>
<string name="saved_messages">Sačuvane poruke</string>
<string name="unit_of_speed_system">Jedinica brzine</string>
<string name="unit_of_speed_system_descr">Definišite jedinicu brzine.</string>
<string name="time_zone">Vremenska zona</string>
<string name="time_zone_descr">Izaberite vremensku zonu koja će se prikazati u porukama lokacije.</string>
<string name="buffer_time">Vreme isteka bafera</string>
<string name="buffer_time_descr">Maksimalno vreme za skladištenje tačaka u bafer</string>
<string name="status_widget_title">Status Tragača OsmAnda</string>
<string name="shared_string_suggested">Predloženo</string>
<string name="back_to_osmand">Povratak na OsmAnd</string>
<string name="duration_ago">Pre %1$</string>
<string name="last_response_duration">Poslednji odgovor: pre %1$</string>
<string name="last_update_from_telegram_duration">Poslednje ažuriranje iz Telegrama: pre %1$</string>
<string name="last_response_date">Poslednji odgovor: %1$</string>
<string name="last_update_from_telegram_date">Poslednje ažuriranje iz Telegrama: %1$</string>
<string name="shared_string_error_short">Greška</string>
<string name="shared_string_export">Izvezi</string>
<string name="logcat_buffer">Logcat bafer</string>
<string name="logcat_buffer_descr">Proverite i podelite detaljne zapise aplikacije</string>
<string name="send_report">Pošalji izveštaj</string>
</resources>

View file

@ -119,4 +119,28 @@
<string name="connecting_to_the_internet">Konektante al Interreto</string>
<string name="initializing">Komencante</string>
<string name="sending_location_messages">Sendante lokon</string>
<string name="password_descr">Pasvorto de Telegram</string>
<string name="enter_password">Tajpu pasvorton</string>
<string name="show_on_map">Montri sur mapo</string>
<string name="hours_format">%1$d h</string>
<string name="minutes_format">%1$d min</string>
<string name="hours_and_minutes_format">%1$d h %2$d min</string>
<string name="shared_string_sent">Sendita</string>
<string name="not_logged_in">Vi ne estas salutinta</string>
<string name="closing">Fermante</string>
<string name="logging_out">Adiaŭante</string>
<string name="initialization">Lanĉante</string>
<string name="shared_string_logout">Adiaŭi</string>
<string name="shared_string_login">Saluti</string>
<string name="osmand_service">Fona reĝimo</string>
<string name="shared_string_off">Malaktiva</string>
<string name="shared_string_all">Ĉiuj</string>
<string name="shared_string_close">Fermi</string>
<string name="shared_string_exit">Eliri</string>
<string name="shared_string_save">Konservi</string>
<string name="shared_string_disable">Malaktivigi</string>
<string name="shared_string_apply">Apliki</string>
<string name="unit_of_length_descr">Ŝanĝi unuojn por reprezenti distancoj.</string>
<string name="logcat_buffer">Bufro logcat</string>
<string name="logcat_buffer_descr">Legi kaj kunhavigi detalajn protokolojn de la aplikaĵo</string>
</resources>

View file

@ -109,7 +109,7 @@
<string name="get_telegram_description_continue">Kérjük, telepítse a Telegramot és hozzon létre egy fiókot.</string>
<string name="get_telegram_after_creating_account">Utána használhatja ezt az alkalmazást.</string>
<string name="shared_string_all">Minden</string>
<string name="shared_string_off">Kikapcsolás</string>
<string name="shared_string_off">Kikapcsolva</string>
<string name="hours_and_minutes_format">%1$d óra %2$d perc</string>
<string name="minutes_format">%1$d perc</string>
<string name="shared_string_install">Telepítés</string>

View file

@ -22,7 +22,7 @@
<string name="proxy_port">ポート</string>
<string name="proxy_server">サーバー</string>
<string name="shared_string_connection">接続</string>
<string name="shared_string_enable">有効</string>
<string name="shared_string_enable">有効</string>
<string name="proxy_type">プロキシタイプ</string>
<string name="proxy_connected">接続しました</string>
<string name="proxy_disconnected">切断しました</string>

View file

@ -0,0 +1,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:bottomLeftRadius="@dimen/list_item_button_padding"
android:topLeftRadius="@dimen/list_item_button_padding" />
<solid android:color="@color/list_background_color_dark" />
</shape>

View file

@ -0,0 +1,11 @@
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/active_buttons_and_links_trans_light">
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
<corners
android:bottomLeftRadius="@dimen/list_item_button_padding"
android:topLeftRadius="@dimen/list_item_button_padding" />
<solid android:color="@color/active_color_primary_light" />
</shape>
</item>
</ripple>

View file

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/background">
<shape android:shape="rectangle">
<solid android:color="#4d007eb3" />
<corners android:radius="30dp" />
</shape>
</item>
<item android:id="@+id/progress">
<shape android:shape="rectangle">
<solid android:color="@color/color_white" />
<corners android:radius="30dp" />
</shape>
</item>
</layer-list>

View file

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<item android:id="@+id/thump">
<shape android:shape="oval">
<size
android:width="12dp"
android:height="12dp" />
<solid android:color="@color/profile_icon_color_blue_light" />
</shape>
</item>
</layer-list>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="2dp"
android:height="2dp" />
<solid android:color="#17181A" />
</shape>

View file

@ -16,7 +16,16 @@
android:focusable="true"
android:orientation="vertical"
android:clickable="true"
tools:background="@drawable/bg_bottom_menu_dark">
tools:ignore="UselessParent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@drawable/bg_contextmenu_shadow_top_light" />
<ProgressBar
android:id="@+id/snap_to_road_progress_bar"
@ -24,12 +33,17 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="0dp"
android:visibility="gone"
android:background="?attr/list_background_color"
android:visibility="invisible"
tools:visibility="visible" />
</FrameLayout>
<LinearLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:background="?attr/list_background_color">
<RelativeLayout
android:id="@+id/up_down_row"
@ -53,6 +67,19 @@
android:background="@null"
tools:src="@drawable/ic_action_ruler"/>
<include
layout="@layout/custom_icon_radio_buttons"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/content_padding_half"
android:layout_marginLeft="@dimen/bottom_sheet_content_margin"
android:layout_marginRight="@dimen/content_padding_half"
android:layout_marginStart="@dimen/bottom_sheet_content_margin"
android:background="@null" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/up_down_button"
android:layout_width="wrap_content"
@ -65,6 +92,7 @@
android:layout_marginRight="@dimen/bottom_sheet_content_margin"
android:layout_marginStart="@dimen/bottom_sheet_content_margin"
android:background="@null"
android:visibility="gone"
tools:src="@drawable/ic_action_arrow_down"/>
<TextView

View file

@ -659,6 +659,7 @@
<!-- CENTER -->
<FrameLayout
android:id="@+id/top_controls_container"
android:layout_width="fill_parent"
android:layout_height="wrap_content">

View file

@ -62,18 +62,12 @@
osmand:typeface="@string/font_roboto_medium"
tools:text="Normal" />
<SeekBar
android:id="@+id/seek_bar_arrival"
style="@style/Widget.AppCompat.SeekBar.Discrete"
<com.google.android.material.slider.Slider
android:id="@+id/arrival_slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/pages_item_margin"
android:maxHeight="2dp"
android:paddingTop="11dp"
android:paddingBottom="11dp"
osmand:tickMark="@drawable/seekbar_tickmark_announcement_time"
tools:max="3"
tools:progress="1" />
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding" />
<View
android:id="@+id/divider"

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_radio_buttons"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/btn_bg_border_inactive"
android:baselineAligned="false"
android:minHeight="@dimen/dialog_button_height"
android:orientation="horizontal">
<include
layout="@layout/custom_radio_btn_icon_item"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<include
layout="@layout/custom_radio_btn_icon_item"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:background="?attr/selectableItemBackground"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="@dimen/content_padding_small_half"
android:paddingBottom="@dimen/content_padding_small_half"
android:paddingLeft="@dimen/content_padding_small"
android:paddingRight="@dimen/content_padding_small">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
android:layout_gravity="center"
tools:src="@drawable/ic_action_info_dark"/>
</FrameLayout>

View file

@ -2,6 +2,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical">
<View
@ -58,7 +59,7 @@
android:layout_gravity="center_vertical|start"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size_large"
android:text="Item title"/>
tools:text="Item title"/>
</LinearLayout>

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -69,7 +70,7 @@
android:textColor="@color/color_myloc_distance"
android:layout_gravity="center_vertical"
android:layout_marginTop="2dp"
android:text="Cinema"
tools:text="Cinema"
android:layout_marginRight="16dp"
android:layout_marginEnd="16dp" />

View file

@ -13,10 +13,19 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@drawable/bg_bottom_menu_dark"
android:orientation="vertical"
android:clickable="true"
android:focusable="true">
android:focusable="true"
tools:ignore="UselessParent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@drawable/bg_contextmenu_shadow_top_light" />
<ProgressBar
android:id="@+id/snap_to_road_progress_bar"
@ -24,9 +33,19 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="0dp"
android:visibility="gone"
android:background="?attr/list_background_color"
android:visibility="invisible"
tools:visibility="visible" />
</FrameLayout>
<LinearLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/list_background_color"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/up_down_row"
android:layout_width="match_parent"
@ -305,4 +324,6 @@
</LinearLayout>
</LinearLayout>
</FrameLayout>

View file

@ -4,6 +4,9 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/list_background_color"
android:clickable="true"
android:focusable="true"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView

View file

@ -2,6 +2,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:paddingLeft="?dialogPreferredPadding"
android:paddingRight="?dialogPreferredPadding"
@ -32,7 +33,7 @@
android:id="@+id/user_name_field"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="NoName"/>
tools:text="NoName"/>
<TextView

View file

@ -4,6 +4,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
@ -51,7 +52,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:background="@null"
android:text="Filling station"
tools:text="Filling station"
android:textColor="@color/color_white"
android:textSize="@dimen/default_desc_text_size"/>

View file

@ -31,7 +31,7 @@
tools:text="Some title" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/description"
android:id="@+id/title_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/title"
@ -60,6 +60,54 @@
</RelativeLayout>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/primary_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dialog_content_margin"
android:letterSpacing="@dimen/description_letter_spacing"
android:orientation="vertical"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
android:visibility="gone"
app:typeface="@string/font_roboto_regular"
tools:text="@string/srtm_download_single_help_message"
tools:visibility="visible" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/secondary_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/content_padding_small"
android:letterSpacing="@dimen/description_letter_spacing"
android:orientation="vertical"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
android:visibility="gone"
app:typeface="@string/font_roboto_regular"
tools:text="@string/srtm_download_list_help_message"
tools:visibility="visible" />
<include
layout="@layout/custom_radio_buttons"
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:layout_marginBottom="@dimen/content_padding_half"
android:visibility="gone"
tools:visibility="visible" />
<LinearLayout
android:id="@+id/select_all_button"
android:layout_width="match_parent"
@ -67,12 +115,12 @@
android:background="?attr/selectableItemBackground"
android:gravity="center_vertical"
android:minHeight="@dimen/bottom_sheet_list_item_height"
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:paddingStart="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding">
android:paddingBottom="@dimen/content_padding_small">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/check_box_title"

View file

@ -94,7 +94,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@null"
android:text="Split interval:"
tools:text="Split interval:"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium" />

View file

@ -2,6 +2,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:background="?attr/spinnerListBackground"
android:orientation="vertical">
@ -212,7 +213,7 @@
android:paddingLeft="2dp"
android:paddingEnd="0dp"
android:paddingRight="0dp"
android:text="Ukraine"
tools:text="Ukraine"
app:drawableEndCompat="@drawable/ic_action_arrow_drop_down"
app:drawableRightCompat="@drawable/ic_action_arrow_drop_down" />

View file

@ -64,7 +64,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/content_padding_small"
android:layout_gravity="center_vertical"
android:paddingStart="@dimen/content_padding_small"
android:paddingLeft="@dimen/content_padding_small"
android:paddingTop="@dimen/content_padding_small_half"

View file

@ -1,8 +1,6 @@
<?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: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:background="?attr/bg_color"
@ -13,78 +11,13 @@
android:layout_height="@dimen/list_content_padding"
android:background="?attr/activity_background_color" />
<include
layout="@layout/divider" />
<include layout="@layout/divider" />
<FrameLayout
android:id="@+id/subscriptions_list_container"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:id="@+id/support_region_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="?android:attr/selectableItemBackground"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="@dimen/setting_list_item_group_height"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/map_widget_height"
android:layout_marginRight="@dimen/map_widget_height"
app:srcCompat="@drawable/ic_world_globe_dark"
app:tint="?attr/default_icon_color" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginTop="@dimen/content_padding_small"
android:layout_marginBottom="@dimen/content_padding_small"
android:layout_gravity="center_vertical"
android:orientation="vertical">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/support_region_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_regular"
tools:text="@string/osm_live_support_region"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/support_region"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:text="@string/osm_live_support_region"
android:textColor="?android:attr/textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular"
tools:text="@string/clear_updates_proposition_message"/>
</LinearLayout>
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
app:srcCompat="@drawable/ic_action_settings"
app:tint="?attr/default_icon_color" />
</LinearLayout>
<include layout="@layout/simple_divider_item" />
<LinearLayout
android:id="@+id/report_container"
android:layout_width="match_parent"
@ -206,8 +139,7 @@
android:layout_height="wrap_content"
android:background="?attr/activity_background_color">
<include
layout="@layout/card_bottom_divider" />
<include layout="@layout/card_bottom_divider" />
</FrameLayout>

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:osmand="http://schemas.android.com/apk/res-auto"
<LinearLayout xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:gravity="center_vertical"
android:minHeight="48dp"
android:orientation="horizontal"
@ -36,7 +36,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="Avoid selected roads"
tools:text="Avoid selected roads"
android:textSize="@dimen/default_list_text_size"/>
<TextView
@ -44,7 +44,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="Select roads you want to avoid during navigation"
tools:text="Select roads you want to avoid during navigation"
android:textSize="@dimen/default_desc_text_size"/>
</LinearLayout>

View file

@ -42,6 +42,7 @@
</com.google.android.material.appbar.AppBarLayout>
<ScrollView
android:id="@+id/main_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -117,10 +118,17 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/content_padding"
android:text="Actions"
tools:text="Actions"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size" />
<include
android:id="@+id/btn_refresh"
layout="@layout/bottom_sheet_dialog_button"
android:layout_width="match_parent"
android:layout_height="@dimen/dialog_button_height"
android:layout_marginTop="@dimen/content_padding_half" />
<include
android:id="@+id/btn_backup"
layout="@layout/bottom_sheet_dialog_button"

View file

@ -32,7 +32,6 @@
android:id="@+id/troubleshooting_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/map_widget_height"
android:layout_marginRight="@dimen/map_widget_height"
android:paddingBottom="@dimen/dialog_content_bottom_margin"

View file

@ -2,6 +2,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:tools="http://schemas.android.com/tools"
android:background="@drawable/popup_bg"
android:gravity="center"
android:orientation="horizontal">
@ -37,6 +38,6 @@
android:layout_height="wrap_content"
android:layout_weight="0"
android:background="?attr/selectableItemBackground"
android:text="UNDO"
tools:text="UNDO"
android:textColor="@color/popup_text_color"/>
</LinearLayout>

View file

@ -4123,7 +4123,11 @@
<string name="shared_string_route_line">خط المسار</string>
<string name="route_line_use_map_style_appearance">سيستخدم خط الطريق %1$s المحدد في نمط الخريطة المحدد: %2$s.</string>
<string name="specify_color_for_map_mode">حدد لونًا لوضع الخريطة: %1$s.</string>
<string name="release_4_0_beta">• تم نقل تحديثات OsmAnd Live إلى \"التنزيلات&gt; التحديثات\"
<string name="release_4_0_beta">• خيار مضاف لتنزيل خطوط الكنتور بالقدم
\n
\n• مخطط الطريق الأفقي: علامات تبويب tabs مضافة للتبديل بين النقاط أو الرسوم البيانية
\n
\n• تم نقل تحديثات OsmAnd Live إلى \"التنزيلات&gt; التحديثات\"
\n
\n • يمكن تلوين المسارات الآن حسب الارتفاع، السرعة أو المنحدر.
\n
@ -4154,4 +4158,8 @@
<string name="announce_when_exceeded">الإعلان عند التجاوز</string>
<string name="user_points">نقاط المستخدم</string>
<string name="output">الإخراج</string>
<string name="srtm_unit_format">تنسيق وحدة خطوط الكنتور</string>
<string name="srtm_download_list_help_message">OsmAnd يوفر بيانات الخطوط الكنتورية بالأمتار والقدم. ستحتاج إلى إعادة تنزيل الملف لتغيير التنسيق.</string>
<string name="srtm_download_single_help_message">الرجاء تحديد التنسيق المطلوب. ستحتاج إلى إعادة تنزيل الملف لتغيير التنسيق.</string>
<string name="shared_string_feet">قدم</string>
</resources>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -3837,4 +3837,8 @@
<string name="track_has_no_altitude">Sporet indeholder ikke højdedata.</string>
<string name="track_has_no_speed">Sporet indeholder ikke hastighedsdata.</string>
<string name="select_another_colorization">Vælg en anden type farvelægning.</string>
<string name="exit_number">Udgangsnummer</string>
<string name="announce_when_exceeded">Meddelelse ved overskridelse</string>
<string name="user_points">Bruger points</string>
<string name="output">Resultat</string>
</resources>

View file

@ -3926,4 +3926,6 @@
<string name="poi_karate">Karate</string>
<string name="poi_office_diplomatic">Diplomatische Vertretung</string>
<string name="poi_bay_filter">Art der Bucht</string>
<string name="poi_plateau">Plateau</string>
<string name="poi_club_social">Freizeitclub</string>
</resources>

View file

@ -3856,7 +3856,7 @@
\nSie können sich mit der sicheren OAuth-Methode anmelden oder Ihren Benutzernamen und Ihr Passwort verwenden.</string>
<string name="use_login_password">Benutzername und Passwort verwenden</string>
<string name="login_account">Konto</string>
<string name="user_login">Benutzername</string>
<string name="user_login">Anmelden</string>
<string name="markers_history">Historie der Marker</string>
<string name="send_files_to_openstreetmap">GPX-Datei an OpenStreetMap senden</string>
<string name="enter_text_separated">Geben Sie durch Komma getrennte Tags ein.</string>
@ -4057,7 +4057,11 @@
<string name="customize_route_line">Routenlinie anpassen</string>
<string name="shared_string_route_line">Routenlinie</string>
<string name="specify_color_for_map_mode">Legen Sie die Farbe für den Kartenmodus fest: %1$s.</string>
<string name="release_4_0_beta">• OsmAnd Live-Updates nach \"Downloads &gt; Updates\" verschoben
<string name="release_4_0_beta">• Option zum Herunterladen von Höhenlinien in Fuß zugefügt
\n
\n• Routenplanung im Querformat: Registerkarten zum Umschalten zwischen Punkten oder Diagrammen hinzugefügt
\n
\n• OsmAnd Live-Updates nach \"Downloads &gt; Updates\" verschoben
\n
\n• Tracks können nun nach Höhe, Geschwindigkeit oder Steigung eingefärbt werden.
\n
@ -4089,4 +4093,8 @@
<string name="announce_when_exceeded">Meldung bei Überschreitung</string>
<string name="user_points">Anwenderpunkte</string>
<string name="output">Leistung</string>
<string name="shared_string_feet">Fuß</string>
<string name="srtm_unit_format">Einheit der Höhenlinien</string>
<string name="srtm_download_list_help_message">OsmAnd liefert Höhenlinien-Daten in Metern und Fuß. Sie müssen die Datei erneut herunterladen, um das Format zu ändern.</string>
<string name="srtm_download_single_help_message">Bitte wählen Sie das gewünschte Format. Sie müssen die Datei erneut herunterladen, um das Format zu ändern.</string>
</resources>

View file

@ -3926,4 +3926,6 @@
<string name="poi_hoops">Korboj</string>
<string name="poi_bay_filter">Tipo de golfo</string>
<string name="poi_office_diplomatic">Diplomatia oficejo</string>
<string name="poi_plateau">Altebenaĵo</string>
<string name="poi_club_social">Socia klubejo</string>
</resources>

View file

@ -4054,7 +4054,11 @@
<string name="customize_route_line">Alĝustigi linion de kurso</string>
<string name="shared_string_route_line">Linio de kurso</string>
<string name="route_line_use_map_style_appearance">Por la linio de kurso estos uzata %1$s difinita por la mapstilo: %2$s.</string>
<string name="release_4_0_beta">• ĝisdatigoj OsmAnd Live movitaj al “elŝutoj” → “ĝisdatigoj”
<string name="release_4_0_beta">• eblo elŝuti nivelkurbojn en futoj
\n
\n• horizontala vido por “plani kurson”: aldonitaj langetoj por baskuli inter punktoj kaj diagramoj
\n
\n• ĝisdatigoj OsmAnd Live movitaj al “elŝutoj” → “ĝisdatigoj”
\n
\n• eblo kolorigi spurojn laŭ altitudo, rapido aŭ dekliveco
\n
@ -4085,4 +4089,8 @@
<string name="exit_number">Numero de elirejo</string>
<string name="user_points">Poentoj de uzanto</string>
<string name="output">Eligo</string>
<string name="shared_string_feet">futoj</string>
<string name="srtm_unit_format">Unuo por nivelkurboj</string>
<string name="srtm_download_list_help_message">OsmAnd liveras nivelkurbojn en metroj kaj en futoj. Ve devos reelŝuti la dosieron por ŝanĝi la formon.</string>
<string name="srtm_download_single_help_message">Elektu la deziratan formon. Vi devos reelŝuti la dosieron por ŝanĝi la formon.</string>
</resources>

View file

@ -3926,4 +3926,6 @@
<string name="poi_hoops">Aros</string>
<string name="poi_office_diplomatic">Oficina diplomática</string>
<string name="poi_bay_filter">Tipo de bahía</string>
<string name="poi_plateau">Meseta (altiplano)</string>
<string name="poi_club_social">Club social</string>
</resources>

View file

@ -3126,7 +3126,7 @@
<string name="cancel_subscription">Cancelar suscripción</string>
<string name="price_and_discount">%1$s • Ahorra %2$s</string>
<string name="configure_profile_info">Ajustes para el perfil:</string>
<string name="utm_format_descr">OsmAnd utiliza el formato UTM Estándar, similar pero no idéntico al formato UTM NATO.</string>
<string name="utm_format_descr">OsmAnd usa el formato UTM Estándar, similar pero no idéntico al formato UTM de la OTAN.</string>
<string name="shared_string_example">Ejemplo</string>
<string name="navigate_point_format_utm">UTM Estándar</string>
<string name="navigate_point_format_olc">Código de Ubicación Abierto</string>

View file

@ -3125,7 +3125,7 @@
<string name="cancel_subscription">Cancelar suscripción</string>
<string name="price_and_discount">%1$s • Ahorra %2$s</string>
<string name="configure_profile_info">Ajustes para el perfil:</string>
<string name="utm_format_descr">OsmAnd utiliza el formato UTM Estándar, similar pero no idéntico al formato UTM NATO.</string>
<string name="utm_format_descr">OsmAnd usa el formato UTM Estándar, similar pero no idéntico al formato UTM de la OTAN.</string>
<string name="shared_string_example">Ejemplo</string>
<string name="navigate_point_format_utm">UTM Estándar</string>
<string name="navigate_point_format_olc">Código de Ubicación Abierto</string>

View file

@ -1460,4 +1460,5 @@
<string name="poi_shoes_women">بانوان</string>
<string name="poi_clothes_women">بانوان</string>
<string name="poi_clothes_workwear">لباس کار</string>
<string name="poi_greenhouse_horticulture">باغداری گلخانه‌ای</string>
</resources>

View file

@ -3915,4 +3915,17 @@
<string name="poi_pilates">Pilates</string>
<string name="poi_jiu_jitsu">Ju-jitsu</string>
<string name="poi_karate">Karaté</string>
<string name="poi_zurkhaneh_sport">Gymnase Zurkhaneh</string>
<string name="poi_cliff_diving">Plongeon du haut d\'une falaise</string>
<string name="poi_hoops">Anneaux</string>
<string name="poi_club_social">Club social</string>
<string name="poi_plateau">Plateau</string>
<string name="poi_speedway">Voie express</string>
<string name="poi_gladed_yes">Satisfait : oui</string>
<string name="poi_camp_pitch">Emplacement de camping</string>
<string name="poi_mobile_library">Arrêt pour la bibliothèque mobile</string>
<string name="poi_office_diplomatic">Bureau diplomatique</string>
<string name="poi_horseshoes">Fers à cheval</string>
<string name="poi_cycle_polo">Polo-vélo</string>
<string name="poi_bay_filter">Type de baie</string>
</resources>

View file

@ -301,8 +301,8 @@
<string name="error_reading_gpx">Impossible de lire les données GPX.</string>
<string name="vector_data">Cartes vectorielles OSM</string>
<string name="transport_context_menu">Recherche de transport pour cet arrêt</string>
<string name="poi_context_menu_modify">Modifier point d\'intérêt</string>
<string name="poi_context_menu_delete">Supprimer point d\'intérêt</string>
<string name="poi_context_menu_modify">Modifier le point d\'intérêt</string>
<string name="poi_context_menu_delete">Supprimer le point d\'intérêt</string>
<string name="rotate_map_compass_opt">D\'après la boussole</string>
<string name="rotate_map_bearing_opt">Dans la direction du déplacement</string>
<string name="rotate_map_none_opt">Aucune rotation (nord toujours en haut)</string>
@ -3275,7 +3275,7 @@
<string name="add_new_profile_q">Ajouter le profil \'%1$s\' \?</string>
<string name="save_heading">Inclure la direction</string>
<string name="save_heading_descr">Inclure la direction de chaque point lors de l\'enregistrement d\'une trace.</string>
<string name="rendering_attr_showCycleNodeNetworkRoutes_name">Afficher le réseau de nœuds de pistes cyclables</string>
<string name="rendering_attr_showCycleNodeNetworkRoutes_name">Afficher les itinéraires cyclables du réseau de nœuds</string>
<string name="rendering_value_walkingRoutesOSMCNodes_name">Nœuds de transport</string>
<string name="personal_category_name">Personnel</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
@ -4040,9 +4040,13 @@
<string name="lost_data_warning">Toutes les données non enregistrées seront perdues.</string>
<string name="show_start_dialog">Afficher la boîte de dialogue de démarrage</string>
<string name="trip_recording_show_start_dialog_setting">Si désactivé, l\'enregistrement débutera dès appui sur le gadget ou dans le menu (sans demande de confirmation).</string>
<string name="release_4_0_beta">- Les mises à jour d\'OsmAnd Live ont été déplacées vers \"Téléchargements &gt; Mises à jour\"
<string name="release_4_0_beta">- Ajout d\'une option pour télécharger les Courbes de niveau en pieds
\n
\n - Les traces peuvent maintenant être colorées par altitude, vitesse ou pente.
\n- Planification d\'itinéraires en paysage : ajout donglets pour basculer entre Points et Graphs
\n
\n- Les mises à jour d\'OsmAnd Live ont été déplacées vers \"Téléchargements &gt; Mises à jour\"
\n
\n - Les traces peuvent maintenant être colorées par altitude, vitesse ou pente
\n
\n - Ajout d\'une option pour modifier l\'apparence de la ligne d\'itinéraire en navigation
\n
@ -4075,4 +4079,8 @@
<string name="exit_number">Numéro de sortie</string>
<string name="announce_when_exceeded">Annoncer en cas de dépassement</string>
<string name="output">Sortie</string>
<string name="srtm_download_list_help_message">OsmAnd fournit des données sur les courbes de niveau en mètres et en pieds. Vous devrez à nouveau télécharger le fichier pour modifier le format.</string>
<string name="srtm_download_single_help_message">Veuillez sélectionner le format souhaité. Vous devrez à nouveau télécharger le fichier pour modifier le format.</string>
<string name="srtm_unit_format">Format d\'unité pour les courbes de niveau</string>
<string name="shared_string_feet">pieds</string>
</resources>

View file

@ -3924,4 +3924,5 @@
<string name="poi_hoops">Kosárlabdapalánkok</string>
<string name="poi_office_diplomatic">Diplomáciai iroda</string>
<string name="poi_bay_filter">Öböl típusa</string>
<string name="poi_plateau">Fennsík</string>
</resources>

View file

@ -13,8 +13,8 @@
<string name="shared_string_help">Súgó</string>
<string name="accessibility_mode">Akadálymentes mód</string>
<string name="accessibility_mode_descr">Bekapcsolja a fogyatékkal élőknek szóló funkciókat.</string>
<string name="shared_string_on">Be</string>
<string name="shared_string_off">Kikapcsolás</string>
<string name="shared_string_on">Bekapcsolva</string>
<string name="shared_string_off">Kikapcsolva</string>
<string name="accessibility_default">Android rendszerbeállítások szerint</string>
<string name="backToMenu">Vissza a menübe</string>
<string name="zoomOut">Kicsinyít</string>
@ -1318,7 +1318,7 @@
<string name="shared_string_more">Bővebben…</string>
<string name="route_descr_destination">Célpont</string>
<string name="local_index_description">Egy meglévő elem adatainak megtekintéséhez koppintson rá, inaktiváláshoz vagy törléshez nyomja meg hosszan. Jelenlegi adatok az eszközön (%1$s szabad):</string>
<string name="speed_limit_exceed">Sebességkorlátozás-tolerancia</string>
<string name="speed_limit_exceed">Sebességkorlátozás túllépésének tűréshatára</string>
<string name="speed_limit_exceed_message">Válassza ki a sebességkorlátozás tűréshatárát, amely fölött hangos figyelmeztetést fog kapni.</string>
<string name="fav_point_emoticons_message">A Kedvenc hely át lett nevezve erre: %1$s, hogy a hangulatjeleket tartalmazó szöveget fájlba lehessen menteni.</string>
<string name="print_route">Útvonal nyomtatása</string>
@ -1470,7 +1470,7 @@
<string name="shared_string_release">Megjelent</string>
<string name="days_behind">napos</string>
<string name="welmode_download_maps">Térképek letöltése</string>
<string name="confirm_usage_speed_cameras">Néhány országban (Németország, Franciaország, Olaszország és még néhány) tilos a traffipax figyelmeztetés használata! Az OsmAnd nem vállal felelősséget a szabályok megsértéséért. Koppints az Igen gombra, ha jogosult vagy a funkció használatára.</string>
<string name="confirm_usage_speed_cameras">Néhány országban (Németország, Franciaország, Olaszország stb.) tilos traffipax-riasztást használni! Az OsmAnd nem vállal felelősséget a szabályok megsértéséért. Koppintson az Igen gombra, ha jogosult a funkció használatára.</string>
<string name="welcome_select_region">A jelzőtáblák és szabályok helyes értelmezéséhez jelölje ki a vezetési régiót:</string>
<string name="welcome_text">Az OsmAnd lehetővé teszi a térképek és a navigáció offline használatát az egész világon.</string>
<string name="current_route">Jelenlegi útvonal</string>
@ -3583,7 +3583,7 @@
<string name="uninstall_speed_cameras">Traffipaxok eltávolítása</string>
<string name="shared_string_legal">Jogi</string>
<string name="speed_camera_pois">Traffipax POI-k</string>
<string name="speed_cameras_legal_descr">Bizonyos országokban és régiókban a traffipaxra figyelmeztető alkalmazások törvényileg tiltottak.
<string name="speed_cameras_legal_descr">Bizonyos országokban és régiókban jogszabály tiltja a traffipaxra figyelmeztető alkalmazások használatát.
\n
\nDöntsön az ön országának törvényei alapján.
\n
@ -3592,7 +3592,7 @@
\nVálassza az %2$s lehetőséget, hogy az összes traffipax-szal kapcsolatos adat: riasztások, értesítések, POI-k törlésre kerüljenek az OsmAnd teljes újratelepítéséig.</string>
<string name="keep_active">Maradjanak</string>
<string name="shared_string_uninstall">Eltávolít</string>
<string name="speed_cameras_alert">Bizonyos országokban a traffipax riasztások törvényileg tiltottak.</string>
<string name="speed_cameras_alert">Bizonyos országokban a törvény tiltja a traffipaxriasztást.</string>
<string name="shared_string_bearing">Tájolás</string>
<string name="item_deleted">%1$s törölve</string>
<string name="speed_cameras_restart_descr">A traffipaxadatok végleges törléséhez indítsa újra az alkalmazást.</string>
@ -4044,7 +4044,11 @@
<string name="lost_data_warning">Minden nem mentett adat törlődni fog.</string>
<string name="show_start_dialog">Kezdő párbeszéd megjelenítése</string>
<string name="trip_recording_show_start_dialog_setting">Ha le van tiltva, akkor a felvétel közvetlenül a widget vagy a menüelem megérintése után elindul, kihagyva a megerősítő párbeszédpanelt.</string>
<string name="release_4_0_beta">• Az OsmAnd Live frissítések átköltöztek a „Letöltések&gt; Frissítések” helyre
<string name="release_4_0_beta">• Új lehetőség: szinvonalak letöltése (méter mellett) lábban
\n
\n• Útvonaltervezési környezet: hozzáadott fülek a pontok és grafikonok közötti váltáshoz
\n
\n• Az OsmAnd Live frissítések átköltöztek a „Letöltések&gt; Frissítések” helyre
\n
\n• A nyomvonalak színezhetők magasság, sebesség vagy lejtés szerint.
\n
@ -4078,4 +4082,8 @@
<string name="announce_when_exceeded">Értesítés túllépéskor</string>
<string name="user_points">Felhasználói pontok</string>
<string name="output">Teljesítmény</string>
<string name="srtm_download_single_help_message">Kérjük, válassza ki a kívánt mértékegységet. A mértékegység módosításához újra le kell töltenie a fájlt.</string>
<string name="srtm_download_list_help_message">Az OsmAnd méterben és lábban adja meg a szintvonalak magasságát. A mértékegység módosításához újra le kell töltenie a fájlt.</string>
<string name="shared_string_feet">láb</string>
<string name="srtm_unit_format">Szintvonalak mértékegysége</string>
</resources>

View file

@ -3926,4 +3926,6 @@
<string name="poi_karate">Karate</string>
<string name="poi_office_diplomatic">Sendiskrifstofa</string>
<string name="poi_bay_filter">Gerð flóa</string>
<string name="poi_plateau">Háslétta</string>
<string name="poi_club_social">Félagsstarf</string>
</resources>

View file

@ -4052,7 +4052,11 @@
<string name="rendering_attr_noNatureReserveBoundaries_name">Mörk náttúru</string>
<string name="trip_recording_logging_interval_info">Millibil skráninga stillir tímabilið milli þess sem OsmAnd biður um staðsetningargögn.</string>
<string name="trip_recording_show_start_dialog_setting">Ef þetta er óvirkt, mun upptaka hefjast strax eftir að ýtt er á hnappinn eða valmyndarfærsluna og staðfestingarglugga er þá sleppt.</string>
<string name="release_4_0_beta">• Uppfærslur OsmAnd Live færðar í \"Sótt gögn &gt; Uppfærslur\"
<string name="release_4_0_beta">• Bætt við möguleika á að sækja hæðarlínur í fetum
\n
\n• Landslag í leiðaskipulagi: bætt við flipum til að skipta á milli punkta eða grafs
\n
\n• Uppfærslur OsmAnd Live færðar í \"Sótt gögn &gt; Uppfærslur\"
\n
\n • Ferla er nú hægt að lita eftir hæð, hraða eða halla.
\n
@ -4091,4 +4095,8 @@
<string name="announce_when_exceeded">Tilkynna þegar farið er yfir</string>
<string name="user_points">Punktar notanda</string>
<string name="map_quick_action_pattern">%1$s → …</string>
<string name="shared_string_feet">fet</string>
<string name="srtm_unit_format">Snið eininga hæðarlína</string>
<string name="srtm_download_list_help_message">OsmAnd býður upp á hæðalínugögn í metrum og fetum. Þú þarft að sækja skrána aftur til að breyta sniðinu.</string>
<string name="srtm_download_single_help_message">Veldu rétt snið eininga. Þú þarft að sækja skrána aftur til að breyta sniðinu.</string>
</resources>

View file

@ -4056,7 +4056,11 @@
<string name="customize_route_line">להתאים קו מסלול אישית</string>
<string name="shared_string_route_line">קו מסלול</string>
<string name="specify_color_for_map_mode">לציין צבע למצב מפה: %1$s.</string>
<string name="release_4_0_beta">• העדכונים החיים של OsmAnd הועברו אל „הורדות &gt; עדכונים”
<string name="release_4_0_beta">• נוספה אפשרות להוריד קווי מתאר ברגל
\n
\n• תכנון מסלול אופקית: נוספו לשוניות למעבר בין נקודות לתרשימים
\n
\n• העדכונים החיים של OsmAnd הועברו אל „הורדות &gt; עדכונים”
\n
\n• אפשר לצבוע מסלולים לפי גובה, מהירות או שיפוע.
\n
@ -4087,4 +4091,8 @@
<string name="announce_when_exceeded">להכריז בחריגה</string>
<string name="user_points">נקודות משתמש</string>
<string name="output">פלט</string>
<string name="shared_string_feet">רגל</string>
<string name="srtm_unit_format">תצורת יחידת קווי מתאר</string>
<string name="srtm_download_list_help_message">OsmAnd מספק נתוני קווי מתאר במטרים וברגל. יהיה עליך להוריד את הקובץ מחדש כדי לשנות את התצורה.</string>
<string name="srtm_download_single_help_message">נא לבחור את התצורה הרצויה. יהיה עליך להוריד את הקובץ מחדש כדי לשנות את התצורה.</string>
</resources>

View file

@ -1173,7 +1173,7 @@ POIの更新は利用できません</string>
<string name="save_as_favorites_points">お気に入りのグループとして保存</string>
<string name="select_destination_and_intermediate_points">目的地の設定</string>
<string name="layer_amenity_label">施設の名称</string>
<string name="loading_smth">ロード中 %1$s </string>
<string name="loading_smth">%1$sをロード中…</string>
<string name="map_widget_plain_time">現在時刻</string>
<string name="shared_string_waypoint">経由地点</string>
<string name="selected_gpx_info_show">"
@ -1446,7 +1446,7 @@ POIの更新は利用できません</string>
<string name="routing_settings_2">ナビゲーション設定</string>
<string name="general_settings_2">全般設定</string>
<string name="shared_string_ellipsis"></string>
<string name="shared_string_enable">有効</string>
<string name="shared_string_enable">有効</string>
<string name="shared_string_disable">無効化</string>
<string name="shared_string_selected">選択済み</string>
<string name="shared_string_deselect">選択解除</string>
@ -2818,9 +2818,9 @@ POIの更新は利用できません</string>
<string name="osm_live_subscriptions">サブスクリプション</string>
<string name="powered_by_osmand">By OsmAnd</string>
<string name="osm_live_plan_pricing">プランと料金</string>
<string name="osm_live_payment_monthly_title"></string>
<string name="osm_live_payment_monthly_title"></string>
<string name="osm_live_payment_3_months_title">3ヶ月毎</string>
<string name="osm_live_payment_annual_title"></string>
<string name="osm_live_payment_annual_title"></string>
<string name="osm_live_payment_month_cost_descr">%1$s / 月</string>
<string name="osm_live_payment_month_cost_descr_ex">%1$.2f %2$s / 月</string>
<string name="osm_live_payment_discount_descr">%1$s割引</string>
@ -3172,7 +3172,7 @@ POIの更新は利用できません</string>
<string name="app_mode_utv">横並び(サイドバイサイド)形式</string>
<string name="rendering_attr_piste_difficulty_aerialway_name">索道(リフトやロープウェイなど)</string>
<string name="rendering_attr_piste_difficulty_connection_name">リフト間接続</string>
<string name="shared_string_calculate">計算</string>
<string name="shared_string_calculate">計算する</string>
<string name="shared_string_osmand_usage">OsmAndの合計使用容量</string>
<string name="shared_sting_tiles">タイル</string>
<string name="shared_string_maps">マップ</string>
@ -3703,9 +3703,9 @@ POIの更新は利用できません</string>
\n
\n国の法律に基づいて、使用を望むかどうかを決定する必要があります。
\n
\n%1$sを選択すると、スピードカメラに関するアラートと警告機能を使用できます。
\n%1$sを選択すると、スピードカメラに関するアラートと警告機能を使用できます。
\n
\n%2$sを選択すると、スピードカメラに関するすべてのデータ(警告、通知、POI)が、OsmAndの再インストールを行うまで削除されます。</string>
\n%2$sを選択すると、スピードカメラに関するすべてのデータ(警告、通知、POI)が、OsmAndの再インストールを行うまで削除されます。</string>
<string name="keep_active">機能を維持</string>
<string name="shared_string_uninstall">アンインストール</string>
<string name="speed_cameras_alert">一部の国では、スピードカメラの事前警告は法律で禁止されています。</string>
@ -4078,4 +4078,26 @@ POIの更新は利用できません</string>
<string name="app_mode_wheelchair_forward">基本前進のみの車椅子</string>
<string name="track_coloring_solid">通常色</string>
<string name="in_case_of_reverse_direction">逆方向の場合</string>
<string name="no_purchases">購入済みの品目はありません</string>
<string name="new_device_account">新しい端末 / 新規アカウント</string>
<string name="contact_support_description">ご不明な点がございましたら、%1$sまでお問い合わせください。</string>
<string name="empty_purchases_description">購入した品目がここに表示されない場合は、\"%1$s\"をタップするか、サポートチームにお問い合わせください。</string>
<string name="contact_support">サポート問い合わせ先</string>
<string name="troubleshooting">トラブルシューティング</string>
<string name="troubleshooting_description">購入に関して問題が発生した場合は、このリンクを参照してください。</string>
<string name="osmand_live">OsmAnd Live</string>
<string name="next_billing_date">次回請求日: %1$s</string>
<string name="osmand_live_cancelled">キャンセル済み</string>
<string name="in_grace_period">猶予期間中</string>
<string name="on_hold">保留中</string>
<string name="expired">期限切れ</string>
<string name="update_all_maps_added">%1$sに追加された全マップを更新しますか</string>
<string name="user_points">ユーザーポイント</string>
<string name="exit_number">出口番号</string>
<string name="announce_when_exceeded">超過した場合の通知</string>
<string name="output">出力</string>
<string name="annual_subscription">年毎のサブスクリプション</string>
<string name="monthly_subscription">月毎のサブスクリプション</string>
<string name="three_months_subscription">3ヶ月毎のサブスクリプション</string>
<string name="renew_subscription">サブスクリプションの更新</string>
</resources>

View file

@ -1802,7 +1802,7 @@ failu(s)?
<string name="first_usage_item">Sākt lietot</string>
<string name="first_usage_item_description">Kā lejupielādēt kartes un pamatiestatījumu lietošana</string>
<string name="navigation_item_description">Navigācija</string>
<string name="planning_trip_item">Ceļa plānošana</string>
<string name="planning_trip_item">Ceļojuma plānošana</string>
<string name="faq_item">BUJ</string>
<string name="faq_item_description">Biežāk uzdotie jautājumi</string>
<string name="map_viewing_item">Kartes skatīšana</string>
@ -2162,7 +2162,6 @@ Apraksta laukumu: %1$s x %2$s</string>
<string name="shared_string_time">Laiks</string>
<string name="total_distance">Maršruta garums</string>
<string name="routing_attr_height_obstacles_name">Lietot elevācijas datus</string>
<string name="relief_smoothness_factor_descr">Ieteicamais reljefs: līdzens vai kalnains.</string>
<string name="shared_string_slope">Slīpums</string>
<string name="lang_ber">Berberu</string>
@ -2415,7 +2414,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
<string name="show_map">Rādīt karti</string>
<string name="route_is_calculated">Maršruts aprēķināts</string>
<string name="round_trip">Turp un atpakaļ</string>
<string name="plan_route_no_markers_toast">Jums vajag pievienot vismaz vienu marķieri, lai lietotu šo funkciju.</string>
<string name="plan_route_no_markers_toast">Lai lietotu šo funkciju, vajag pievienot vismaz vienu marķieri.</string>
<string name="osn_modify_dialog_error">Piezīmei nevarēja veikt izmaiņas</string>
<string name="osn_modify_dialog_title">Labot piezīmi</string>
<string name="context_menu_item_modify_note">!abot OSM piezīmi</string>
@ -2429,7 +2428,7 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
<string name="routing_attr_avoid_ice_roads_fords_name">No ledus ceļiem un brasla</string>
<string name="routing_attr_avoid_ice_roads_fords_description">Izvairīties no ledus ceļiem un brasliem.</string>
<string name="use_location">Lietot pozīciju</string>
<string name="add_location_as_first_point_descr">Pievienot jūsu atrašanās vietu kā sākuma punktu maršrutam.</string>
<string name="add_location_as_first_point_descr">Pievienot patreizējo atrašanās vietu kā sākuma punktu ideālā maršruta izveidei.</string>
<string name="my_location">Mana pozīcija</string>
<string name="shared_string_finish">Finišs</string>
<string name="plan_route">Plānot maršrutu</string>
@ -3333,4 +3332,19 @@ No Afganistānas līdz Zimbabvei, no Austrālijas līdz ASV, Argentīna, Brazīl
<string name="select_items_for_import">Izvēlieties lietas, ko importēt.</string>
<string name="use_dev_url_descr">Lietot dev.openstreetmap.org nevis openstreetmap.org OSM piezīmju/ POI / GPX augšuielādei un testēšanai.</string>
<string name="use_dev_url">Lietot dev.openstreetmap.org</string>
<string name="plan_a_route">Plānot maršrutu</string>
<string name="plan_route_last_edited">Pēdējo reizi labots</string>
<string name="plan_route_import_track">Importēt treku</string>
<string name="plan_route_open_existing_track">Atvērt saglabāto treku</string>
<string name="plan_route_create_new_route">Veidot jaunu maršrutu</string>
<string name="plan_route_select_track_file_for_open">Izvēlieties treka failu atvēršanai.</string>
<string name="plan_route_exit_dialog_descr">Vai tiešām gribat atmest visas izmaiņas ieplānotajā maršrutā\?</string>
<string name="plan_route_trim_before">Griezt pirms</string>
<string name="plan_route_trim_after">Griezt pēc</string>
<string name="plan_route_change_route_type_before">Mainīt maršruta veidu pirms</string>
<string name="plan_route_change_route_type_after">Mainīt maršruta veidu pēc</string>
<string name="plan_route_join_segments">Pievienot segmentus</string>
<string name="plan_route_split_before">Sadalīt pirms</string>
<string name="plan_route_split_after">Sadalīt pēc</string>
<string name="plan_route_add_new_segment">Pievienot jaunu segmentu</string>
</resources>

View file

@ -4056,13 +4056,13 @@
<string name="customize_route_line">Zmień trasę nawigacji</string>
<string name="shared_string_route_line">Trasa nawigacji</string>
<string name="expired">Wygasł</string>
<string name="release_4_0_beta">OsmAnd Live aktualizacje przeniesiono do \"Pobrane &gt; Aktualizacje\"
<string name="release_4_0_beta">Aktualizacje OsmAnd Live przeniesiono do \"Pobrane &gt; Aktualizacje\"
\n
\n •Ślady mogą być pokolorowane względem wysokości, prędkości, wzniesień.
\n
\n • Dodano opcję zmiany wyglądu trasy nawigacji
\n
\n • zaktualizowano okno \"Nagrywanie Trasy\"
\n • Zaktualizowano okno \"Nagrywanie Trasy\"
\n
\n</string>
<string name="map_quick_action_pattern">%1$s → …</string>

View file

@ -3918,4 +3918,13 @@
<string name="poi_jiu_jitsu">Jiu-jitsu</string>
<string name="poi_karate">Karatê</string>
<string name="poi_hoops">Aros</string>
<string name="poi_club_social">Clube social</string>
<string name="poi_plateau">Planalto</string>
<string name="poi_office_diplomatic">Escritório diplomático</string>
<string name="poi_kickboxing">Kickboxe</string>
<string name="poi_cycle_polo">Polo de bicicleta</string>
<string name="poi_curling">Curling</string>
<string name="poi_cliff_diving">Mergulho de falésia</string>
<string name="poi_zurkhaneh_sport">Zurkhaneh</string>
<string name="poi_bay_filter">Tipo de baía</string>
</resources>

View file

@ -3758,7 +3758,7 @@
<string name="shared_string_file_name">Nome do arquivo</string>
<string name="number_of_gpx_files_selected_pattern">%s arquivos de trilha selecionados</string>
<string name="disable_recording_once_app_killed_descrp">O registro de trilhas fará uma pausa quando o aplicativo for encerrado (por meio de aplicativos recentes). (A indicação de segundo plano do OsmAnd desaparece da barra de notificação do Android.)</string>
<string name="save_global_track_interval_descr">Especifique o intervalo de registro para a gravação geral da trilha (ligado por meio do widget de \'gravação de viagem\' no mapa).</string>
<string name="save_global_track_interval_descr">Especifique o intervalo de registro para o registro geral da trilha (ativado por meio do widget de \'gravação de viagem\' no mapa).</string>
<string name="gpx_monitoring_stop">Pausar gravação de viagem</string>
<string name="gpx_monitoring_start">Retomar a gravação da viagem</string>
<string name="system_default_theme">Padrão do sistema</string>
@ -4049,7 +4049,7 @@
<string name="shared_string_route_line">Linha de rota</string>
<string name="route_line_use_map_style_appearance">A linha de rota seria usada %1$s especificado no estilo de mapa selecionado: %2$s.</string>
<string name="specify_color_for_map_mode">Especifique a cor para o modo de mapa: %1$s.</string>
<string name="release_4_0_beta">"• As atualizações do OsmAnd Live foram movidas para \"Downloads &gt; Atualizações\"
<string name="release_4_0_beta">• As atualizações do OsmAnd Live foram movidas para \"Downloads &gt; Atualizações\"
\n
\n• As trilhas agora podem ser coloridas por altitude, velocidade ou inclinação.
\n
@ -4057,7 +4057,7 @@
\n
\n• Caixa de diálogo \"Gravação de viagem\" atualizada
\n
\n"</string>
\n</string>
<string name="no_purchases">Você não tem nenhuma compra</string>
<string name="new_device_account">Novo dispositivo / nova conta</string>
<string name="contact_support_description">Se você tiver alguma dúvida, entre em contato conosco em %1$s.</string>

View file

@ -49,7 +49,7 @@
<string name="poi_cheese">Queijaria</string>
<string name="poi_chocolate">Loja de chocolates</string>
<string name="poi_coffee">Loja de cafés</string>
<string name="poi_convenience">Loja de conveniência</string>
<string name="poi_convenience">Loja de conveniência/minimercado</string>
<string name="poi_mall">Centro comercial</string>
<string name="poi_beverages">Loja de bebidas</string>
<string name="poi_butcher">Talho</string>
@ -58,7 +58,7 @@
<string name="poi_greengrocer">Loja de frutas e verduras</string>
<string name="poi_seafood">Peixaria</string>
<string name="poi_confectionery">Confeitaria</string>
<string name="poi_ice_cream">Geladaria</string>
<string name="poi_ice_cream">Gelataria</string>
<string name="poi_supermarket">Supermercado</string>
<string name="poi_tea">Loja de chás</string>
<string name="poi_pasta">Loja de massas</string>
@ -80,7 +80,7 @@
<string name="poi_carpet">Loja de tapetes</string>
<string name="poi_charity">Loja de caridade</string>
<string name="poi_chemist">Loja de produtos de higiene pessoal</string>
<string name="poi_clothes">Pronto a vestir</string>
<string name="poi_clothes">Pronto-a-vestir</string>
<string name="poi_clothes_children">Vestuário infantil</string>
<string name="poi_shoes">Sapataria</string>
<string name="poi_candles">Loja de velas</string>
@ -247,8 +247,8 @@
<string name="poi_clothes_type">Tipo</string>
<string name="poi_shoes_type">Tipo</string>
<string name="poi_fire_hydrant_type">Tipo</string>
<string name="poi_fire_hydrant_position">Posição</string>
<string name="poi_water_source">Fonte de água</string>
<string name="poi_fire_hydrant_position">Localização</string>
<string name="poi_water_source">Origem da água</string>
<string name="poi_payment_toll_type">Forma de pagamento</string>
<string name="poi_traffic_signals_sound">Som</string>
<string name="poi_highway_crossing_type">Tipo</string>
@ -284,9 +284,9 @@
<string name="poi_fee">Pago</string>
<string name="poi_smoking">Fumar</string>
<string name="poi_delivery">Entrega ao domicílio</string>
<string name="poi_drive_in">Serviço ao volante</string>
<string name="poi_drive_through">Serviço ao volante</string>
<string name="poi_takeaway">Serviço de take-away</string>
<string name="poi_drive_in">Serviço no carro parado</string>
<string name="poi_drive_through">Serviço a conduzir</string>
<string name="poi_takeaway">Comida para levar</string>
<string name="poi_cocktails">Cocktails</string>
<string name="poi_microbrewery">Microcervejaria</string>
<string name="poi_beauty_salon_service">Serviço</string>
@ -296,7 +296,7 @@
<string name="poi_fireplace">Lareira</string>
<string name="poi_beach_surface_type">Superfície</string>
<string name="poi_nudism">Nudismo</string>
<string name="poi_diet">Dieta</string>
<string name="poi_diet">Pratos</string>
<string name="poi_massage_type">Tipo de massagem</string>
<string name="poi_tents">Tendas</string>
<string name="poi_washing_machine">Máquina de lavar roupa</string>
@ -411,10 +411,10 @@
<string name="poi_water_tower">Reservatório elevado</string>
<string name="poi_lock_gate">Comporta de eclusa</string>
<string name="poi_waterway_turning_point">Ponto de viragem fluvial</string>
<string name="poi_weir">Represa;Açude</string>
<string name="poi_weir">Represa/açude;Represa;Açude</string>
<string name="poi_dam">Barragem</string>
<string name="poi_watermill">Moinho de água</string>
<string name="poi_breakwater">Quebra-mar;Molhe</string>
<string name="poi_breakwater">Quebra-mar/molhe;Quebra-mar;Molhe</string>
<string name="poi_groyne">Espigão marítimo</string>
<string name="poi_power_substation">Subestação</string>
<string name="poi_power_transformer">Transformador</string>
@ -565,18 +565,18 @@
<string name="poi_capital">Sim</string>
<string name="poi_town">Sede de concelho</string>
<string name="poi_village">Sede de freguesia</string>
<string name="poi_hamlet">Aldeia;Lugar</string>
<string name="poi_hamlet">Aldeia/lugar;Aldeia;Lugar</string>
<string name="poi_isolated_dwelling">Moradia isolada</string>
<string name="poi_suburb">Subúrbio</string>
<string name="poi_quarter">Zona de cidade</string>
<string name="poi_neighbourhood">Bairro</string>
<string name="poi_locality">Localidade</string>
<string name="poi_place_allotments">Horta comunitária</string>
<string name="poi_place_farm">Quinta;Fazenda</string>
<string name="poi_place_farm">Quinta/fazenda;Quinta;Fazenda</string>
<string name="poi_pharmacy">Farmácia</string>
<string name="poi_hospital">Hospital</string>
<string name="poi_doctors">Consultório médico</string>
<string name="poi_clinic">Clínica;Centro de saúde;Unidade de Saúde;Posto Médico</string>
<string name="poi_clinic">Clínica/centro de saúde/USF/posto médico</string>
<string name="poi_first_aid">Primeiros socorros</string>
<string name="poi_dentist">Dentista</string>
<string name="poi_nursing_home">Clínica geriátrica</string>
@ -694,7 +694,7 @@
<string name="poi_boundary_stone">Marco de fronteira</string>
<string name="poi_historic_cannon">Canhão histórico</string>
<string name="poi_castle">Castelo</string>
<string name="poi_city_gate">Portão da cidade</string>
<string name="poi_city_gate">Portão/arco de cidade</string>
<string name="poi_fort">Forte</string>
<string name="poi_fountain">Chafariz</string>
<string name="poi_historic_ruins">Ruínas históricas</string>
@ -721,7 +721,7 @@
<string name="poi_attraction_water_slide">Tobogã aquático</string>
<string name="poi_lodging">Alojamento</string>
<string name="poi_hotel">Hotel</string>
<string name="poi_guest_house">Pensão;Albergaria;Hospedaria;Estalagem;Residencial</string>
<string name="poi_guest_house">Pensão/albergaria/residenial;Estalagem;Residencial;Albergaria;Hospedaria;Casa de hóspedes</string>
<string name="poi_hostel">Hostel</string>
<string name="poi_motel">Hotel estrada</string>
<string name="poi_alpine_hut">Abrigo de montanha</string>
@ -732,24 +732,24 @@
<string name="poi_lean_to">Galpão</string>
<string name="poi_hunting_lodge">Cabana de caça</string>
<string name="poi_place_of_worship">Local de culto</string>
<string name="poi_religion_christian">Cristianismo</string>
<string name="poi_religion_jewish">Judaísmo</string>
<string name="poi_religion_muslim">Islamismo</string>
<string name="poi_religion_sikh">Sikhismo</string>
<string name="poi_religion_buddhist">Budismo</string>
<string name="poi_religion_hindu">Hinduísmo</string>
<string name="poi_religion_shinto">Xintoísmo</string>
<string name="poi_religion_taoist">Taoísmo</string>
<string name="poi_religion_christian">Cristã</string>
<string name="poi_religion_jewish">Judaica</string>
<string name="poi_religion_muslim">Islâmica</string>
<string name="poi_religion_sikh">Siquista</string>
<string name="poi_religion_buddhist">Budista</string>
<string name="poi_religion_hindu">Hinduísta</string>
<string name="poi_religion_shinto">Xintoísma</string>
<string name="poi_religion_taoist">Taoísma</string>
<string name="poi_religion_voodoo">Vodu</string>
<string name="poi_religion_unitarian_universalist">Unitário-Universalismo</string>
<string name="poi_religion_unitarian_universalist">Unitário-universalista</string>
<string name="poi_religion_multifaith">Multirreligiosa</string>
<string name="poi_religion_jain">Jainismo</string>
<string name="poi_religion_spiritualist">Espiritualismo</string>
<string name="poi_religion_bahai">Bahaísmo</string>
<string name="poi_religion_scientologist">Cientologismo</string>
<string name="poi_religion_pagan">Paganismo</string>
<string name="poi_religion_jain">Jainista</string>
<string name="poi_religion_spiritualist">Espiritualista</string>
<string name="poi_religion_bahai">Bahaísta</string>
<string name="poi_religion_scientologist">Cientologista</string>
<string name="poi_religion_pagan">Paganista</string>
<string name="poi_religion_tenrikyo">Tenrikyo</string>
<string name="poi_religion_zoroastrian">Zoroastrismo</string>
<string name="poi_religion_zoroastrian">Zoroastrista</string>
<string name="poi_denomination_catholic">Católica</string>
<string name="poi_denomination_baptist">Batista</string>
<string name="poi_denomination_roman_catholic">Católica romana</string>
@ -828,7 +828,7 @@
<string name="poi_travel_agent">Agência de viagens</string>
<string name="poi_viewpoint">Miradouro</string>
<string name="poi_camp_site">Local de acampamento</string>
<string name="poi_caravan_site">Local de caravanas</string>
<string name="poi_caravan_site">Parque de caravanas</string>
<string name="poi_picnic_table">Mesa de piquenique</string>
<string name="poi_spring">Nascente</string>
<string name="poi_hot_spring">Fonte termal</string>
@ -890,7 +890,7 @@
<string name="poi_theatre_genre_circus">Circo</string>
<string name="poi_gallery">Galeria de arte</string>
<string name="poi_dance_floor">Pista de dança</string>
<string name="poi_nightclub">Discoteca;Danceteria</string>
<string name="poi_nightclub">Discoteca/danceteria;Discoteca;Danceteria</string>
<string name="poi_stripclub">Clube de striptease</string>
<string name="poi_ski_resort">Resort de esqui</string>
<string name="poi_beach_resort">Resort de praia</string>
@ -912,9 +912,9 @@
<string name="poi_restaurant">Restaurante</string>
<string name="poi_fast_food">Comida rápida</string>
<string name="poi_bar">Bar</string>
<string name="poi_pub">Taberna</string>
<string name="poi_pub">Taberna/pub/tasca;Taberna;Tasco;Tasca;Pub;Boteco;Buteco;Botequim</string>
<string name="poi_food_court">Praça de alimentação</string>
<string name="poi_drinking_water">Fonte de água potável</string>
<string name="poi_drinking_water">Bebedouro (água potável)</string>
<string name="poi_barbecue">Churrasqueira</string>
<string name="poi_craft_agricultural_engines">Máquinas agrícolas</string>
<string name="poi_craft_basket_maker">Cesteiro</string>
@ -967,7 +967,7 @@
<string name="poi_craft_computer">Montagem de computadores</string>
<string name="poi_beauty">Salão de beleza</string>
<string name="poi_beauty_salon_nails">Manicura</string>
<string name="poi_hairdresser">Cabeleireiro</string>
<string name="poi_hairdresser">Cabeleireiro/a</string>
<string name="poi_massage">Salão de massagens</string>
<string name="poi_tattoo">Estúdio de tatuagem</string>
<string name="poi_dry_cleaning">Limpeza de roupa a seco</string>
@ -977,8 +977,8 @@
<string name="poi_car_pooling">Ponto de boleia solidária de carro</string>
<string name="poi_boat_sharing">Ponto de barcos partilhados</string>
<string name="poi_dock">Doca</string>
<string name="poi_cutline">Linha de corte florestal;Atalhada;Linha corta-fogo</string>
<string name="poi_toilets">Casa de banho;Banheiros</string>
<string name="poi_cutline">Linha de corte florestal/atalhada;Atalhada;Linha corta-fogo;Linha de corte florestal</string>
<string name="poi_toilets">Casa de banho;Banheiros;WC</string>
<string name="poi_shower">Chuveiros públicos</string>
<string name="poi_sauna">Sauna</string>
<string name="poi_brothel">Bordel</string>
@ -1002,9 +1002,9 @@
<string name="poi_ridge">Cumeeira</string>
<string name="poi_glacier">Glaciar</string>
<string name="poi_sinkhole">Sumidouro</string>
<string name="poi_waterfall">Queda de água;Cascata;Salto;Catarata</string>
<string name="poi_waterfall">Queda de água/cascata/catarata/salto;Cascata;Salto;Catarata;Queda de água</string>
<string name="poi_river">Rio</string>
<string name="poi_stream">Ribeiro;Ribeira;Córrego</string>
<string name="poi_stream">Ribeiro(a)</string>
<string name="poi_rapids">Rápidos</string>
<string name="poi_cape">Cabo</string>
<string name="poi_beach">Praia</string>
@ -1122,7 +1122,7 @@
<string name="poi_wiki_lang_zh">Wiki em chinês</string>
<string name="poi_wiki_lang_af">Wiki em africâner</string>
<string name="poi_wiki_lang_als">Wiki em alsaciano</string>
<string name="poi_wiki_lang_az">Wiki em azeri</string>
<string name="poi_wiki_lang_az">Wiki em azerbaijanês</string>
<string name="poi_wiki_lang_bn">Wiki em bengali</string>
<string name="poi_wiki_lang_bpy">Wiki em bishnupriya</string>
<string name="poi_wiki_lang_br">Wiki em bretão</string>
@ -1246,8 +1246,8 @@
<string name="poi_fee_no">Não</string>
<string name="poi_drinking_water_yes">Sim</string>
<string name="poi_drinking_water_no">Não</string>
<string name="poi_supervised_yes">Vigiado</string>
<string name="poi_supervised_no">Não vigiado</string>
<string name="poi_supervised_yes">Vigiado: sim</string>
<string name="poi_supervised_no">Vigiado: não</string>
<string name="poi_seasonal_yes">Sim</string>
<string name="poi_seasonal_no">Não</string>
<string name="poi_seasonal_dry_season">Estação seca</string>
@ -1257,7 +1257,7 @@
<string name="poi_seasonal_autumn">Outono</string>
<string name="poi_seasonal_winter">Inverno</string>
<string name="poi_crossing_traffic_signals">Com semáforos</string>
<string name="poi_crossing_uncontrolled">Não controlado (sem semáforo e barreira)</string>
<string name="poi_crossing_uncontrolled">Não controlado (sem semáforo nem barreira)</string>
<string name="poi_crossing_unmarked">Não sinalizado (sem marcas nem semáforo)</string>
<string name="poi_start_date">Data de início/inauguração</string>
<string name="poi_wheelchair_accessibility">Acesso de cadeiras de rodas</string>
@ -1384,12 +1384,12 @@
<string name="poi_water_characteristic_mineral">Mineral</string>
<string name="poi_water_characteristic_mud">Lama</string>
<string name="poi_water_characteristic_sulfuric">Sulfurosa</string>
<string name="poi_water_point">Ponto de água</string>
<string name="poi_water_point">Ponto de água em grande quantidade (para caravanas ou garrafões)</string>
<string name="poi_information_guidepost">Poste com direções</string>
<string name="poi_information_board">Painel</string>
<string name="poi_information_map">Mapa</string>
<string name="poi_information_office">Posto de turismo</string>
<string name="poi_information_trail_blaze">Sinalização de rota</string>
<string name="poi_information_trail_blaze">Baliza de caminho</string>
<string name="poi_information_terminal">Terminal eletrónico de informação</string>
<string name="poi_information_route_marker">Sinalização de rota</string>
<string name="poi_information_hikingmap">Mapa de caminhadas</string>
@ -1433,7 +1433,7 @@
<string name="poi_horse_riding">Centro equestre</string>
<string name="poi_leisure_common">Área de lazer comum</string>
<string name="poi_garden">Jardim</string>
<string name="poi_heath">Charneca;Mato de vegetação rasteira</string>
<string name="poi_heath">Charneca/mato de vegetação rasteira;Charneca;Mato de vegetação rasteira</string>
<string name="poi_grass">Relvado</string>
<string name="poi_grassland">Pradaria</string>
<string name="poi_scrub">Matagal</string>
@ -1555,7 +1555,7 @@
<string name="poi_payment_cheque_no">Não aceita cheque</string>
<string name="poi_payment_pikepass_yes">PIKEPASS</string>
<string name="poi_payment_pikepass_no">Não aceita PIKEPASS</string>
<string name="poi_payment_pikepass_designated">PIKEPASS (designado)</string>
<string name="poi_payment_pikepass_designated">PIKEPASS (assinalado)</string>
<string name="poi_payment_visa_debit_yes">Cartão Visa Débito</string>
<string name="poi_payment_visa_debit_no">Não aceita cartão Visa Débito</string>
<string name="poi_payment_cryptocurrencies_no">Não aceita criptomoedas</string>
@ -1650,36 +1650,36 @@
<string name="poi_payment_yandexmoney_no">Não aceita Yandex.Money</string>
<string name="poi_description_payment">Detalhes de pagamento</string>
<string name="poi_events_venue">Salão de eventos</string>
<string name="poi_diet_vegetarian_filter_yes">Vegetariana</string>
<string name="poi_diet_vegetarian_few">Vegetariana (alguns)</string>
<string name="poi_diet_vegetarian_only">Apenas vegetariana</string>
<string name="poi_diet_vegetarian_yes">Vegetariana</string>
<string name="poi_diet_vegetarian_no">Dieta vegetariana: não</string>
<string name="poi_diet_vegan_filter_yes">Vegana</string>
<string name="poi_diet_vegan_only">Apenas vegana</string>
<string name="poi_diet_vegan_yes">Vegana</string>
<string name="poi_diet_vegan_no">Dieta vegana: não</string>
<string name="poi_diet_gluten_free_filter_yes">Livre de glúten</string>
<string name="poi_diet_gluten_free_only">Apenas livre de glúten</string>
<string name="poi_diet_gluten_free_yes">Livre de glúten</string>
<string name="poi_diet_gluten_free_no">Dieta livre de glúten: não</string>
<string name="poi_diet_kosher_filter_yes">Kosher</string>
<string name="poi_diet_kosher_only">Apenas kosher</string>
<string name="poi_diet_kosher_yes">Kosher</string>
<string name="poi_diet_kosher_no">Dieta kosher: não</string>
<string name="poi_diet_halal_filter_yes">Halal</string>
<string name="poi_diet_halal_only">Apenas halal</string>
<string name="poi_diet_halal_yes">Halal</string>
<string name="poi_diet_halal_no">Dieta halal: não</string>
<string name="poi_diet_lactose_free_filter_yes">Livre de lactose</string>
<string name="poi_diet_lactose_free_only">Apenas livre de lactose</string>
<string name="poi_diet_lactose_free_yes">Livre de lactose</string>
<string name="poi_diet_lactose_free_no">Dieta livre de lactose: não</string>
<string name="poi_diet_pescetarian_yes">Piscitariana</string>
<string name="poi_diet_vegetarian_filter_yes">Pratos vegetarianos: sim</string>
<string name="poi_diet_vegetarian_few">Pratos vegetarianos: alguns</string>
<string name="poi_diet_vegetarian_only">Pratos vegetarianos: só vegetarianos</string>
<string name="poi_diet_vegetarian_yes">Pratos vegetarianos: sim</string>
<string name="poi_diet_vegetarian_no">Pratos vegetarianos: não</string>
<string name="poi_diet_vegan_filter_yes">Pratos veganos: sim</string>
<string name="poi_diet_vegan_only">Pratos veganos: só veganos</string>
<string name="poi_diet_vegan_yes">Pratos veganos: sim</string>
<string name="poi_diet_vegan_no">Pratos veganos: não</string>
<string name="poi_diet_gluten_free_filter_yes">Pratos livres de glúten: sim</string>
<string name="poi_diet_gluten_free_only">Pratos livres de glúten: unicamente</string>
<string name="poi_diet_gluten_free_yes">Pratos livres de glúten: sim</string>
<string name="poi_diet_gluten_free_no">Pratos livres de glúten: não</string>
<string name="poi_diet_kosher_filter_yes">Pratos kosher (judaica): sim</string>
<string name="poi_diet_kosher_only">Pratos kosher (judaica): unicamente</string>
<string name="poi_diet_kosher_yes">Pratos kosher (judaica): sim</string>
<string name="poi_diet_kosher_no">Pratos kosher (judaica): não</string>
<string name="poi_diet_halal_filter_yes">Pratos halal (árabe): sim</string>
<string name="poi_diet_halal_only">Pratos halal (árabe): apenas</string>
<string name="poi_diet_halal_yes">Pratos halal (árabe): sim</string>
<string name="poi_diet_halal_no">Pratos halal (árabe): não</string>
<string name="poi_diet_lactose_free_filter_yes">Pratos sem lactose: sim</string>
<string name="poi_diet_lactose_free_only">Pratos sem lactose: unicamente</string>
<string name="poi_diet_lactose_free_yes">Pratos sem lactose: sim</string>
<string name="poi_diet_lactose_free_no">Pratos sem lactose: não</string>
<string name="poi_diet_pescetarian_yes">Pratos piscitariana (peixes e vegetais): sim</string>
<string name="poi_drive_in_yes">Sim</string>
<string name="poi_drive_in_no">Serviço ao volante: não</string>
<string name="poi_drive_in_no">Serviço a conduzir: não</string>
<string name="poi_drive_through_yes">Sim</string>
<string name="poi_drive_through_no">Serviço ao volante: não</string>
<string name="poi_drive_through_no">Serviço a conduzir: não</string>
<string name="poi_brewery_additional">Nome da cervejaria</string>
<string name="poi_microbrewery_yes">Sim</string>
<string name="poi_microbrewery_no">Sem microcervejaria</string>
@ -1704,7 +1704,7 @@
<string name="poi_second_hand_no">Produtos usados: não</string>
<string name="poi_second_hand_only">Produtos usados: unicamente</string>
<string name="poi_service_parts">Peças</string>
<string name="poi_service_dealer">Representante</string>
<string name="poi_service_dealer">Representante de marca</string>
<string name="poi_service_repair">Reparação</string>
<string name="poi_service_repair_no">Sem reparação</string>
<string name="poi_service_electrical">Reparação de veículos elétricos</string>
@ -1771,7 +1771,7 @@
<string name="poi_vending_toys">Brinquedos</string>
<string name="poi_vending_ice_cream">Gelados</string>
<string name="poi_vending_sim_cards">Cartões de telemóvel (SIM)</string>
<string name="poi_branch">Filial;Sucursal</string>
<string name="poi_branch">Filial/sucursal;Filial;Sucursal</string>
<string name="poi_memorial_war">Memorial de guerra</string>
<string name="poi_memorial_plaque">Placa comemorativa</string>
<string name="poi_memorial_statue">Estátua</string>
@ -2022,7 +2022,7 @@
<string name="poi_training_yoga">Formação: ioga</string>
<string name="poi_training_martial_art">Formação: arte marcial</string>
<string name="poi_training_aviation">Formação: aviação</string>
<string name="poi_training_hairdressing">Formação: cabeleireiro</string>
<string name="poi_training_hairdressing">Formação: cabeleireiro/a</string>
<string name="poi_monument_yes">Estrutura monumental</string>
<string name="poi_industrial_oil">Tipo: indústria petrolífera</string>
<string name="poi_industrial_wellsite">Tipo: poço</string>
@ -2242,7 +2242,7 @@
<string name="poi_step_condition_even">Condição dos degraus: regular</string>
<string name="poi_step_condition_uneven">Condição dos degraus: irregular</string>
<string name="poi_step_condition_rough">Condição dos degraus: acidentada</string>
<string name="poi_cairn">Moledro;Moledo;Melédro;Mariola</string>
<string name="poi_cairn">Moledro/mariola;Moledo;Melédro;Mariola;Moledro</string>
<string name="poi_defibrillator">Desfibrilhador</string>
<string name="poi_defibrillator_yes">Desfibrilhador: sim</string>
<string name="poi_tomb_war_grave">Tipo: túmulo de guerra</string>
@ -2360,12 +2360,12 @@
<string name="poi_fortification_type_sconce">Tipo de fortificação: arandela</string>
<string name="poi_fortification_type_ring_ditch">Tipo de fortificação: vala circular</string>
<string name="poi_pa">Pa (assentamento fortificado maori)</string>
<string name="poi_historic_farm">Quinta histórica;Fazenda histórica</string>
<string name="poi_historic_farm">Quinta/fazenda histórica;Quinta histórica;Fazenda histórica</string>
<string name="poi_historic_railway_station">Estação ferroviária histórica</string>
<string name="poi_historic_threshing_floor">Eira histórica</string>
<string name="poi_historic_gallows">Forca histórica</string>
<string name="poi_historic_railway">Ferrovia histórica</string>
<string name="poi_square">Praça;Praceta</string>
<string name="poi_square">Praça/praceta/largo</string>
<string name="poi_artist_name">Artista</string>
<string name="poi_sculptor">Escultor</string>
<string name="poi_building_type_church">Tipo de edifício: igreja</string>
@ -2439,7 +2439,7 @@
<string name="poi_health_specialty_maxillofacial_surgery_yes">Cirurgia maxilofacial</string>
<string name="poi_health_specialty_diagnostic_radiology_yes">Radiologia diagnóstica</string>
<string name="poi_health_specialty_gastroenterology_yes">Gastroenterologia</string>
<string name="poi_health_specialty_dentistry_yes">Odontologia</string>
<string name="poi_health_specialty_dentistry_yes">Medicina dentária (odontologia)</string>
<string name="poi_health_specialty_nephrology_yes">Nefrologia (doenças renais)</string>
<string name="poi_health_specialty_neurosurgery_yes">Neurocirurgia</string>
<string name="poi_health_specialty_neuropsychiatry_yes">Neuropsiquiatria</string>
@ -2460,7 +2460,7 @@
<string name="poi_health_specialty_addiction_medicine_yes">Toxicologia clínica</string>
<string name="poi_health_specialty_optometry_yes">Optometria</string>
<string name="poi_health_specialty_clinical_pathology_yes">Patologia clínica</string>
<string name="poi_health_specialty_speech_therapy_yes">Fonoaudiologia</string>
<string name="poi_health_specialty_speech_therapy_yes">Fonoaudiologia (terapia da fala)</string>
<string name="poi_health_specialty_manual_therapy_yes">Terapia manual</string>
<string name="poi_health_specialty_sports_medicine_yes">Medicina do desporto</string>
<string name="poi_health_specialty_podology_yes">Podologia</string>
@ -2476,7 +2476,7 @@
<string name="poi_health_specialty_behavior_yes">Comportamental</string>
<string name="poi_health_specialty_palliative_medicine_yes">Medicina paliativa</string>
<string name="poi_building_type_pyramid">Tipo de edifício: pirâmide</string>
<string name="poi_fitness_centre">Ginásio;Academia desportiva</string>
<string name="poi_fitness_centre">Ginásio/academia desportiva;Ginásio;Academia desportiva</string>
<string name="poi_fitness">Exercício físico</string>
<string name="poi_billiards">Bilhar</string>
<string name="poi_microwave_oven_yes">Forno microondas: sim</string>
@ -2764,7 +2764,7 @@
<string name="poi_depth">Profundidade</string>
<string name="poi_salt_yes">Sal</string>
<string name="poi_salt_no">Sal: não</string>
<string name="poi_wheelchair_designated">Designado</string>
<string name="poi_wheelchair_designated">Assinalado</string>
<string name="poi_spoil_heap">Rejeito de mineração</string>
<string name="poi_summer_camp">Acampamento de verão</string>
<string name="poi_recreation_center">Centro de recreativo</string>
@ -2908,28 +2908,28 @@
<string name="poi_cuisine_burger">Hambúrguer</string>
<string name="poi_cuisine_coffee">Café</string>
<string name="poi_cuisine_sandwich">Sanduíches</string>
<string name="poi_cuisine_kebab">Kebab</string>
<string name="poi_cuisine_doner">Döner kebab (shawarma)</string>
<string name="poi_cuisine_kebab">Kebab (Médio Oriente)</string>
<string name="poi_cuisine_doner">Döner kebab (turco)</string>
<string name="poi_cuisine_chicken">Frango</string>
<string name="poi_cuisine_ice_cream">Gelados</string>
<string name="poi_cuisine_sushi">Sushi</string>
<string name="poi_cuisine_fish_and_chips">Peixe e batatas fritas</string>
<string name="poi_cuisine_seafood">Frutos do mar</string>
<string name="poi_cuisine_seafood">Marisco</string>
<string name="poi_cuisine_barbecue">Churrascos</string>
<string name="poi_cuisine_noodle">Noodles</string>
<string name="poi_cuisine_noodle">Noodles (asiático)</string>
<string name="poi_cuisine_donut">Donuts</string>
<string name="poi_cuisine_ramen">Ramen</string>
<string name="poi_cuisine_ramen">Ramen (japonês)</string>
<string name="poi_cuisine_crepe">Crepes</string>
<string name="poi_cuisine_breakfast">Café da manhã</string>
<string name="poi_cuisine_beef_bowl">Gyudon</string>
<string name="poi_cuisine_beef_bowl">Gyudon (japonês)</string>
<string name="poi_cuisine_steak">Bifes</string>
<string name="poi_cuisine_tapas">Tapas</string>
<string name="poi_cuisine_gastropub">Gastropub</string>
<string name="poi_cuisine_heuriger">Heuriger</string>
<string name="poi_cuisine_gastropub">Gastropub (inglês)</string>
<string name="poi_cuisine_heuriger">Heuriger (austríaco e alemão)</string>
<string name="poi_cuisine_curry">Caril</string>
<string name="poi_cuisine_buschenschank">Buschenschank</string>
<string name="poi_cuisine_buschenschank">Buschenschank (austríaco e alemão)</string>
<string name="poi_cuisine_grill">Grelhados</string>
<string name="poi_cuisine_bagel">Bagel</string>
<string name="poi_cuisine_bagel">Bagel (polaco)</string>
<string name="poi_cuisine_diner">Café-restaurante</string>
<string name="poi_cuisine_sausage">Linguiças</string>
<string name="poi_cuisine_cake">Bolos</string>
@ -2949,26 +2949,26 @@
<string name="poi_cuisine_frozen_yogurt">Iogurtes gelados</string>
<string name="poi_cuisine_fried_food">Comida frita</string>
<string name="poi_cuisine_savory_pancakes">Panquecas salgadas</string>
<string name="poi_cuisine_bistro">Bistrô</string>
<string name="poi_cuisine_bistro">Bistrô (francês)</string>
<string name="poi_cuisine_bakery">Padaria</string>
<string name="poi_cuisine_couscous">Cuscuz</string>
<string name="poi_cuisine_fried_chicken">Frango frito</string>
<string name="poi_cuisine_dessert">Sobremesas</string>
<string name="poi_cuisine_canteen">Cantina</string>
<string name="poi_cuisine_tacos">Tacos</string>
<string name="poi_cuisine_piadina">Piadina</string>
<string name="poi_cuisine_falafel">Falafel</string>
<string name="poi_cuisine_tacos">Tacos (mexicano)</string>
<string name="poi_cuisine_piadina">Piadina (italiano)</string>
<string name="poi_cuisine_falafel">Falafel (Médio Oriente)</string>
<string name="poi_cuisine_smoothie">Batidos de frutas</string>
<string name="poi_cuisine_souvlaki">Souvlaki</string>
<string name="poi_cuisine_souvlaki">Souvlaki (grego)</string>
<string name="poi_cuisine_snack">Salgados</string>
<string name="poi_cuisine_yogurt">Iogurtes</string>
<string name="poi_cuisine_gyros">Gyros</string>
<string name="poi_cuisine_gyros">Gyros (grego)</string>
<string name="poi_cuisine_empanada">Empanadas</string>
<string name="poi_cuisine_crepes">Crepes</string>
<string name="poi_cuisine_yakiniku">Yakiniku</string>
<string name="poi_cuisine_yakiniku">Yakiniku (japonês)</string>
<string name="poi_cuisine_suki">Suki tailandês</string>
<string name="poi_cuisine_udon">Udon (japonês)</string>
<string name="poi_cuisine_brasserie">Brasserie</string>
<string name="poi_cuisine_brasserie">Brasserie (francês)</string>
<string name="poi_cuisine_bubble_tea">Chá de bolhas</string>
<string name="poi_cuisine_yakitori">Yakitori (japonês)</string>
<string name="poi_cuisine_sagardotegia">Sagardotegia (basco)</string>
@ -2978,11 +2978,11 @@
<string name="poi_cuisine_chocolate">Chocolates</string>
<string name="poi_cuisine_wine">Vinhos</string>
<string name="poi_cuisine_potato">Batatas</string>
<string name="poi_cuisine_brunch">Brunch</string>
<string name="poi_cuisine_brunch">Brunch (inglês e norte-americano)</string>
<string name="poi_cuisine_sub">Sandes</string>
<string name="poi_cuisine_pita">Pita</string>
<string name="poi_cuisine_fondue">Fondue</string>
<string name="poi_cuisine_baguette">Baguetes</string>
<string name="poi_cuisine_pita">Pita (judaico)</string>
<string name="poi_cuisine_fondue">Fondue (suíço)</string>
<string name="poi_cuisine_baguette">Baguetes (francês)</string>
<string name="poi_cuisine_pastel">Pastéis</string>
<string name="poi_cuisine_burrito">Burritos</string>
<string name="poi_cuisine_teriyaki">Teriyaki (japonês)</string>
@ -3040,7 +3040,7 @@
<string name="poi_cuisine_latin_american">Latino-americana</string>
<string name="poi_cuisine_nepalese">Nepalesa</string>
<string name="poi_cuisine_mongolian">Mongol</string>
<string name="poi_cuisine_middle_eastern">Oriente Médio</string>
<string name="poi_cuisine_middle_eastern">Médio Oriente</string>
<string name="poi_cuisine_ukrainian">Ucraniana</string>
<string name="poi_cuisine_afghan">Afegã</string>
<string name="poi_cuisine_belgian">Belga</string>
@ -3082,7 +3082,7 @@
<string name="poi_nutrition_supplements">Suplementos alimentares</string>
<string name="poi_photo_studio">Estúdio de fotografia</string>
<string name="poi_cliff">Penhasco</string>
<string name="poi_animal_keeping">Cativeiro de animais;Refúgio de animais</string>
<string name="poi_animal_keeping">Refúgio de animais;Cativeiro de animais</string>
<string name="poi_animal_keeping_horse">Cativeiro de animais: cavalos</string>
<string name="poi_animal_keeping_sheep">Cativeiro de animais: ovelhas</string>
<string name="poi_animal_keeping_type_paddock">Tipo: cercado</string>
@ -3118,7 +3118,7 @@
<string name="poi_stands">Estandes</string>
<string name="poi_motorcycle_sales_yes">Vendas</string>
<string name="poi_motorcycle_sales_no">Vendas: não</string>
<string name="poi_motorcycle_sales_yes_used">Vendas: sim; usados</string>
<string name="poi_motorcycle_sales_yes_used">Vendas: sim, usados</string>
<string name="poi_motorcycle_sales_used">Vendas: usados</string>
<string name="poi_motorcycle_rental_yes">Aluguer</string>
<string name="poi_motorcycle_rental_no">Aluguer: não</string>
@ -3181,7 +3181,7 @@
<string name="poi_boat_motorboat_rental_no">Lanchas: não</string>
<string name="poi_boat_houseboat_rental_yes">Casas-barco: sim</string>
<string name="poi_boat_houseboat_rental_no">Casas-barco: não</string>
<string name="poi_boat_pedalboat_rental_yes">Gaivota: sim</string>
<string name="poi_boat_pedalboat_rental_yes">Gaivotas a pedais: sim</string>
<string name="poi_boat_pedalboat_rental_no">Gaivota: não</string>
<string name="poi_boat_jetski_rental_yes">Motas de água: sim</string>
<string name="poi_boat_jetski_rental_no">Motas de água: não</string>
@ -3203,7 +3203,7 @@
<string name="poi_government_transportation">Instituição governamental de transportes</string>
<string name="poi_government_legislative">Instituição legislativa governamental</string>
<string name="poi_vhf">Canal VHF</string>
<string name="poi_gorge">Desfiladeiro;Canhão</string>
<string name="poi_gorge">Desfiladeiro/canhão;Desfiladeiro;Canhão</string>
<string name="poi_couloir">Ravina</string>
<string name="poi_mountain_area">Área montanhosa</string>
<string name="poi_surface_clay">Argila</string>
@ -3249,69 +3249,69 @@
<string name="poi_water_place_access_community">Comunidade</string>
<string name="poi_water_place_access_family">Família</string>
<string name="poi_water_place_access_multifamilies">Várias famílias</string>
<string name="poi_socket_cee_blue">Tomada: CEE azul</string>
<string name="poi_socket_cee_blue_current">Tomada: CEE azul: corrente</string>
<string name="poi_socket_cee_blue_output">Tomada: CEE azul: saída</string>
<string name="poi_socket_cee_red_16a">Tomada: CEE vermelha 16A</string>
<string name="poi_socket_cee_red_16a_current">Tomada: CEE vermelha 16A: corrente</string>
<string name="poi_socket_cee_red_16a_output">Tomada: CEE vermelha 16A: saída</string>
<string name="poi_socket_cee_red_32a">Tomada: CEE vermelha 32A</string>
<string name="poi_socket_cee_red_32a_current">Tomada: CEE vermelha 32A: corrente</string>
<string name="poi_socket_cee_red_32a_output">Tomada: CEE vermelha 32A: saída</string>
<string name="poi_socket_cee_red_64a">Tomada: CEE vermelha 64A</string>
<string name="poi_socket_cee_red_64a_current">Tomada: CEE vermelha 64A: corrente</string>
<string name="poi_socket_cee_red_64a_output">Tomada: CEE vermelha 64A: saída</string>
<string name="poi_socket_cee_red_125a">Tomada: CEE vermelha 125A</string>
<string name="poi_socket_cee_red_125a_current">Tomada: CEE vermelha 125A: corrente</string>
<string name="poi_socket_cee_red_125a_output">Tomada: CEE vermelha 125A: saída</string>
<string name="poi_socket_type1">Tomada: Tipo 1</string>
<string name="poi_socket_type1_current">Tomada: Tipo 1: corrente</string>
<string name="poi_socket_type1_output">Tomada: Tipo 1: saída</string>
<string name="poi_socket_type1_combo">Tomada: Tipo 1 combo</string>
<string name="poi_socket_type1_combo_current">Tomada: Tipo 1 combo: corrente</string>
<string name="poi_socket_type1_combo_output">Tomada: Tipo 1 combo: saída</string>
<string name="poi_socket_type2">Tomada: Tipo 2</string>
<string name="poi_socket_type2_current">Tomada: Tipo 2: corrente</string>
<string name="poi_socket_type2_output">Tomada: Tipo 2: saída</string>
<string name="poi_socket_type2_combo">Tomada: Tipo 2 combo</string>
<string name="poi_socket_type2_combo_current">Tomada: Tipo 2 combo: corrente</string>
<string name="poi_socket_type2_combo_output">Tomada: Tipo 2 combo: saída</string>
<string name="poi_socket_type3">Tomada: Tipo 3</string>
<string name="poi_socket_type3_current">Tomada: Tipo 3: corrente</string>
<string name="poi_socket_type3_output">Tomada: Tipo 3: saída</string>
<string name="poi_socket_chademo">Tomada: CHAdeMO</string>
<string name="poi_socket_chademo_current">Tomada: CHAdeMO: corrente</string>
<string name="poi_socket_chademo_output">Tomada: CHAdeMO: saída</string>
<string name="poi_socket_tesla_standard">Tomada: Padrão Tesla</string>
<string name="poi_socket_tesla_standard_current">Tomada: Padrão Tesla: corrente</string>
<string name="poi_socket_tesla_standard_output">Tomada: Padrão Tesla: saída</string>
<string name="poi_socket_tesla_supercharger">Tomada: Tesla Supercharger</string>
<string name="poi_socket_tesla_supercharger_current">Tomada: Tesla Supercharger: corrente</string>
<string name="poi_socket_tesla_supercharger_output">Tomada: Tesla Supercharger: saída</string>
<string name="poi_socket_tesla_roadster">Tomada: Tesla Roadster</string>
<string name="poi_socket_tesla_roadster_current">Tomada: Tesla Roadster: corrente</string>
<string name="poi_socket_tesla_roadster_output">Tomada: Tesla Roadster: saída</string>
<string name="poi_socket_nema_5_15">Tomada: NEMA 5-15R</string>
<string name="poi_socket_nema_5_15_current">Tomada: NEMA 5-15R: corrente</string>
<string name="poi_socket_nema_5_15_output">Tomada: NEMA 5-15R: saída</string>
<string name="poi_socket_nema_5_20">Tomada: NEMA 5-20</string>
<string name="poi_socket_nema_5_20_current">Tomada: NEMA 5-20: corrente</string>
<string name="poi_socket_nema_5_20_output">Tomada: NEMA 5-20: saída</string>
<string name="poi_socket_nema_14_30">Tomada: NEMA 14-30</string>
<string name="poi_socket_nema_14_30_current">Tomada: NEMA 14-30: corrente</string>
<string name="poi_socket_nema_14_30_output">Tomada: NEMA 14-30: saída</string>
<string name="poi_socket_nema_14_50">Tomada: NEMA 14-50</string>
<string name="poi_socket_nema_14_50_current">Tomada: NEMA 14-50: corrente</string>
<string name="poi_socket_nema_14_50_output">Tomada: NEMA 14-50: saída</string>
<string name="poi_socket_schuko">Tomada: Schuko</string>
<string name="poi_socket_schuko_current">Tomada: Schuko: corrente</string>
<string name="poi_socket_schuko_output">Tomada: Schuko: saída</string>
<string name="poi_socket_bs1363">Tomada: BS 1363</string>
<string name="poi_socket_bs1363_current">Tomada: BS 1363: corrente</string>
<string name="poi_socket_bs1363_output">Tomada: BS 1363: saída</string>
<string name="poi_socket_as3112">Tomada: AS/NZS 3112</string>
<string name="poi_socket_as3112_current">Tomada: AS/NZS 3112: corrente</string>
<string name="poi_socket_as3112_output">Tomada: AS/NZS 3112: saída</string>
<string name="poi_socket_cee_blue">Tomadas: CEE azul</string>
<string name="poi_socket_cee_blue_current">Tomadas: CEE azul: amperes</string>
<string name="poi_socket_cee_blue_output">Tomadas: CEE azul: watts</string>
<string name="poi_socket_cee_red_16a">Tomadas: CEE vermelha 16A</string>
<string name="poi_socket_cee_red_16a_current">Tomadas: CEE vermelha 16A: amperes</string>
<string name="poi_socket_cee_red_16a_output">Tomadas: CEE vermelha 16A: watts</string>
<string name="poi_socket_cee_red_32a">Tomadas: CEE vermelha 32A</string>
<string name="poi_socket_cee_red_32a_current">Tomadas: CEE vermelha 32A: amperes</string>
<string name="poi_socket_cee_red_32a_output">Tomadas: CEE vermelha 32A: watts</string>
<string name="poi_socket_cee_red_64a">Tomadas: CEE vermelha 64A</string>
<string name="poi_socket_cee_red_64a_current">Tomadas: CEE vermelha 64A: amperes</string>
<string name="poi_socket_cee_red_64a_output">Tomadas: CEE vermelha 64A: watts</string>
<string name="poi_socket_cee_red_125a">Tomadas: CEE vermelha 125A</string>
<string name="poi_socket_cee_red_125a_current">Tomadas: CEE vermelha 125A: amperes</string>
<string name="poi_socket_cee_red_125a_output">Tomadas: CEE vermelha 125A: watts</string>
<string name="poi_socket_type1">Tomadas: Tipo 1</string>
<string name="poi_socket_type1_current">Tomadas: Tipo 1: amperes</string>
<string name="poi_socket_type1_output">Tomadas: Tipo 1: watts</string>
<string name="poi_socket_type1_combo">Tomadas: Tipo 1 combo</string>
<string name="poi_socket_type1_combo_current">Tomadas: Tipo 1 combo: amperes</string>
<string name="poi_socket_type1_combo_output">Tomadas: Tipo 1 combo: watts</string>
<string name="poi_socket_type2">Tomadas: Tipo 2</string>
<string name="poi_socket_type2_current">Tomadas: Tipo 2: amperes</string>
<string name="poi_socket_type2_output">Tomadas: Tipo 2: watts</string>
<string name="poi_socket_type2_combo">Tomadas: Tipo 2 combo</string>
<string name="poi_socket_type2_combo_current">Tomadas: Tipo 2 combo: amperes</string>
<string name="poi_socket_type2_combo_output">Tomadas: Tipo 2 combo: watts</string>
<string name="poi_socket_type3">Tomadas: Tipo 3</string>
<string name="poi_socket_type3_current">Tomadas: Tipo 3: amperes</string>
<string name="poi_socket_type3_output">Tomadas: Tipo 3: watts</string>
<string name="poi_socket_chademo">Tomadas: CHAdeMO</string>
<string name="poi_socket_chademo_current">Tomadas: CHAdeMO: amperes</string>
<string name="poi_socket_chademo_output">Tomadas: CHAdeMO: watts</string>
<string name="poi_socket_tesla_standard">Tomadas: Padrão Tesla</string>
<string name="poi_socket_tesla_standard_current">Tomadas: Padrão Tesla: amperes</string>
<string name="poi_socket_tesla_standard_output">Tomadas: Padrão Tesla: watts</string>
<string name="poi_socket_tesla_supercharger">Tomadas: Tesla Supercharger</string>
<string name="poi_socket_tesla_supercharger_current">Tomadas: Tesla Supercharger: amperes</string>
<string name="poi_socket_tesla_supercharger_output">Tomadas: Tesla Supercharger: watts</string>
<string name="poi_socket_tesla_roadster">Tomadas: Tesla Roadster</string>
<string name="poi_socket_tesla_roadster_current">Tomadas: Tesla Roadster: amperes</string>
<string name="poi_socket_tesla_roadster_output">Tomadas: Tesla Roadster: watts</string>
<string name="poi_socket_nema_5_15">Tomadas: NEMA 5-15R</string>
<string name="poi_socket_nema_5_15_current">Tomadas: NEMA 5-15R: amperes</string>
<string name="poi_socket_nema_5_15_output">Tomadas: NEMA 5-15R: watts</string>
<string name="poi_socket_nema_5_20">Tomadas: NEMA 5-20</string>
<string name="poi_socket_nema_5_20_current">Tomadas: NEMA 5-20: amperes</string>
<string name="poi_socket_nema_5_20_output">Tomadas: NEMA 5-20: watts</string>
<string name="poi_socket_nema_14_30">Tomadas: NEMA 14-30</string>
<string name="poi_socket_nema_14_30_current">Tomads: NEMA 14-30: amperes</string>
<string name="poi_socket_nema_14_30_output">Tomadas: NEMA 14-30: watts</string>
<string name="poi_socket_nema_14_50">Tomadas: NEMA 14-50</string>
<string name="poi_socket_nema_14_50_current">Tomadas: NEMA 14-50: amperes</string>
<string name="poi_socket_nema_14_50_output">Tomadas: NEMA 14-50: watts</string>
<string name="poi_socket_schuko">Tomadas: Schuko</string>
<string name="poi_socket_schuko_current">Tomadas: Schuko: amperes</string>
<string name="poi_socket_schuko_output">Tomadas: Schuko: watts</string>
<string name="poi_socket_bs1363">Tomadas: BS 1363</string>
<string name="poi_socket_bs1363_current">Tomadas: BS 1363: amperes</string>
<string name="poi_socket_bs1363_output">Tomadas: BS 1363: watts</string>
<string name="poi_socket_as3112">Tomadas: AS/NZS 3112</string>
<string name="poi_socket_as3112_current">Tomadas: AS/NZS 3112: amperes</string>
<string name="poi_socket_as3112_output">Tomadas: AS/NZS 3112: watts</string>
<string name="poi_car_yes">Carro: sim</string>
<string name="poi_car_no">Carro: não</string>
<string name="poi_bicycle_yes">Bicicleta: sim</string>
@ -3539,7 +3539,7 @@
<string name="poi_park_ride_train">Comboio</string>
<string name="poi_park_ride_bus">Autocarro</string>
<string name="poi_park_ride_metro">Metropolitano</string>
<string name="poi_park_ride_hov">Via para veículos com alta ocupação</string>
<string name="poi_park_ride_hov">Veículos com alta ocupação</string>
<string name="poi_park_ride_tram">Elétrico</string>
<string name="poi_park_ride_ferry">Balsa/ferry</string>
<string name="poi_rtsa_scale_nc">sem categoria</string>
@ -3572,7 +3572,7 @@
<string name="poi_changing_table_yes">Mesa muda-fraldas: sim</string>
<string name="poi_changing_table_no">Mesa muda-fraldas: não</string>
<string name="poi_changing_table_limited">Mesa muda-fraldas: limitada</string>
<string name="poi_changing_table_location_room">Mesa muda-fraldas; sala</string>
<string name="poi_changing_table_location_room">Mesa muda-fraldas: sala</string>
<string name="poi_changing_table_location_male_toilet">Local da mesa muda-fraldas: WC masculino</string>
<string name="poi_changing_table_location_female_toilet">Local da mesa muda-fraldas: WC feminino</string>
<string name="poi_changing_table_location_unisex_toilet">Local da mesa muda-fraldas: WC unissexo</string>
@ -3650,11 +3650,11 @@
<string name="poi_motorhome_no">Acesso a autocaravanas: não</string>
<string name="poi_trailer_no">Acesso a reboques: não</string>
<string name="poi_psv_yes">Acesso a transportes públicos: sim</string>
<string name="poi_psv_designated">Acesso a transportes públicos: designado</string>
<string name="poi_psv_designated">Acesso a transportes públicos: assinalado</string>
<string name="poi_psv_no">Acesso a transportes públicos: não</string>
<string name="poi_bus_no">Acesso a autocarros: não</string>
<string name="poi_tourist_bus_yes">Acesso a autocarros turísticos: sim</string>
<string name="poi_tourist_bus_designated">Acesso a autocarros turísticos: designado</string>
<string name="poi_tourist_bus_designated">Acesso a autocarros turísticos: assinalado</string>
<string name="poi_tourist_bus_no">Acesso a autocarros turísticos: não</string>
<string name="poi_coach_yes">Acesso a autocarros de longa distância: sim</string>
<string name="poi_coach_no">Acesso a autocarros de longa distância: não</string>
@ -3665,37 +3665,37 @@
<string name="poi_agricultural_yes">Acesso a veículos agrícolas: sim</string>
<string name="poi_agricultural_no">Acesso a veículos agrícolas: não</string>
<string name="poi_taxi_yes">Acesso a táxis: sim</string>
<string name="poi_taxi_designated">Acesso a táxis: designado</string>
<string name="poi_taxi_designated">Acesso a táxis: assinalado</string>
<string name="poi_taxi_no">Acesso a táxis: não</string>
<string name="poi_disabled_no">Acesso a deficientes: não</string>
<string name="poi_snowmobile_yes">Sim</string>
<string name="poi_snowmobile_designated">Designado</string>
<string name="poi_snowmobile_designated">Assinalado</string>
<string name="poi_snowmobile_permissive">Tolerado</string>
<string name="poi_bus_yes">Sim</string>
<string name="poi_bus_designated">Designado</string>
<string name="poi_bus_designated">Assinalado</string>
<string name="poi_caravan_yes">Sim</string>
<string name="poi_caravan_designated">Designado</string>
<string name="poi_caravan_designated">Assinalado</string>
<string name="poi_motorhome_yes">Sim</string>
<string name="poi_motorhome_designated">Designado</string>
<string name="poi_motorhome_designated">Assinalado</string>
<string name="poi_trailer_yes">Sim</string>
<string name="poi_trailer_designated">Designado</string>
<string name="poi_trailer_designated">Assinalado</string>
<string name="poi_motorcycle_yes">Sim</string>
<string name="poi_motorcycle_permissive">Tolerado</string>
<string name="poi_motorcycle_destination">Destino</string>
<string name="poi_motorcycle_designated">Designado</string>
<string name="poi_motorcycle_designated">Assinalado</string>
<string name="poi_moped_yes">Sim</string>
<string name="poi_moped_designated">Designado</string>
<string name="poi_moped_designated">Assinalado</string>
<string name="poi_mofa_yes">Sim</string>
<string name="poi_mofa_designated">Designado</string>
<string name="poi_mofa_designated">Assinalado</string>
<string name="poi_hgv_yes">Sim</string>
<string name="poi_hgv_destination">Destino</string>
<string name="poi_hgv_permissive">Tolerado</string>
<string name="poi_hgv_designated">Designado</string>
<string name="poi_hgv_designated">Assinalado</string>
<string name="poi_hgv_delivery">Entregas</string>
<string name="poi_goods_yes">Sim</string>
<string name="poi_goods_designated">Designado</string>
<string name="poi_goods_designated">Assinalado</string>
<string name="poi_disabled_yes">Sim</string>
<string name="poi_disabled_designated">Designado</string>
<string name="poi_disabled_designated">Assinalado</string>
<string name="poi_cellar_entrance">Entrada da adega</string>
<string name="poi_health_food">Alimentação saudável</string>
<string name="poi_craft_builder">Construtor</string>
@ -3779,7 +3779,7 @@
<string name="poi_tactile_paving_incorrect">Incorreto</string>
<string name="poi_tactile_paving_primitive">Primitivo</string>
<string name="poi_tactile_paving_contrasted">Contrastado</string>
<string name="poi_traffic_signals_sound_locate">Apenas quando é permitido caminhar</string>
<string name="poi_traffic_signals_sound_locate">Apenas quando é permitido atravessar</string>
<string name="poi_internet_access_fee_customers">Acesso à Internet: só clientes</string>
<string name="poi_video_no">Não</string>
<string name="poi_video_yes">Sim</string>
@ -3810,11 +3810,11 @@
<string name="poi_traffic_signals_vibration">Vibração</string>
<string name="poi_city_block">Quarteirão</string>
<string name="poi_borough">Município</string>
<string name="poi_give_box">Caixa livre;Caixa de donativos;Give-box</string>
<string name="poi_give_box">Caixa livre/de donativos;Give-box;Caixa livre;Caixa de donativos</string>
<string name="poi_traffic_signals_arrow_no">Seta: não</string>
<string name="poi_elevator">Elevador</string>
<string name="poi_departures_board_timetable">Calendário</string>
<string name="poi_departures_board_realtime">Tempo real</string>
<string name="poi_departures_board_timetable">Horário</string>
<string name="poi_departures_board_realtime">Atualizado em tempo real</string>
<string name="poi_departures_board_delay">Atraso</string>
<string name="poi_departures_board_yes">Sim</string>
<string name="poi_departures_board_no">Quadro de partidas: não</string>
@ -3917,13 +3917,15 @@
<string name="poi_mobile_library">Posição de paragem da biblioteca itinerante</string>
<string name="poi_piste_status_closed">Estado da pista: fechada</string>
<string name="poi_piste_status_open">Estado da pista: aberta</string>
<string name="poi_patrolled_no">Vigiado: não</string>
<string name="poi_patrolled_yes">Vigiado: sim</string>
<string name="poi_patrolled_no">Supervisionado: não</string>
<string name="poi_patrolled_yes">Supervisionado: sim</string>
<string name="poi_piste_name">Nome da pista</string>
<string name="poi_piste_ski_jump">Salto com esqui</string>
<string name="poi_wildlife_crossing">Passagem de vida selvagem</string>
<string name="poi_lavoir">Lavadoiro público</string>
<string name="poi_lavoir">Lavadouro público</string>
<string name="poi_water_source_well">Poço</string>
<string name="poi_office_diplomatic">Gabinete diplomático</string>
<string name="poi_bay_filter">Tipo de baía</string>
<string name="poi_plateau">Planalto</string>
<string name="poi_club_social">Clube social</string>
</resources>

File diff suppressed because it is too large Load diff

View file

@ -141,8 +141,8 @@
<string name="routing_attr_height_obstacles_name">Использовать данные о высотах</string>
<string name="quick_action_duplicates">Действие переименовано в %1$s, чтобы избежать дублирования.</string>
<string name="quick_action_duplicate">Обнаружен дубликат имени</string>
<string name="quick_action_showhide_favorites_descr">Переключатель, чтобы показать или скрыть избранные точки на карте.</string>
<string name="quick_action_showhide_poi_descr">Переключатель, чтобы показать или скрыть POI на карте.</string>
<string name="quick_action_showhide_favorites_descr">Переключатель для отображения или скрытия избранных точек на карте.</string>
<string name="quick_action_showhide_poi_descr">Переключатель для отображения или скрытия POI на карте.</string>
<string name="quick_action_add_category">Категория</string>
<string name="quick_action_add_create_items">Действия</string>
<string name="quick_action_fav_name_descr">Если оставить это поле пустым, то оно будет автоматически заполнено адресом или названием места.</string>
@ -3660,7 +3660,7 @@
<string name="vessel_height_warning">Вы можете указать высоту судна, чтобы избегать низких мостов. Имейте в виду, что если мост раздвижной, будет использована его высота в открытом состоянии.</string>
<string name="vessel_height_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="shared_string_legal">Законодательство</string>
<string name="speed_cameras_legal_descr">В некоторых странах и регионах использование предупреждений о камерах контроля скорости запрещено законом.
\n
@ -4073,7 +4073,7 @@
<string name="update_all_maps_added">Обновить все карты, добавленные в %1$s\?</string>
<string name="customize_route_line">Настройка линии маршрута</string>
<string name="shared_string_route_line">Линия маршрута</string>
<string name="route_line_use_map_style_appearance">Линия маршрута будет использовать %1$s, указанный в выбранном стиле карты: %2$s.</string>
<string name="route_line_use_map_style_appearance">Линия маршрута будет использовать %1$s из выбранного стиля карты: %2$s.</string>
<string name="specify_color_for_map_mode">Укажите цвет для режима карты: %1$s.</string>
<string name="no_purchases">У вас нет покупок</string>
<string name="new_device_account">Новое устройство / новый аккаунт</string>

View file

@ -3894,4 +3894,38 @@
<string name="poi_local_ref">Riferimentu locale</string>
<string name="poi_geodesist">Geodesista</string>
<string name="poi_conference_centre">Tzentru pro cunferèntzias</string>
<string name="poi_wakeboarding">Wakeboard</string>
<string name="poi_ultimate">Ultimate</string>
<string name="poi_speedway">Pista pro mototziclismu</string>
<string name="poi_horseshoes">Tiru de ferros de caddu</string>
<string name="poi_cycle_polo">Polo in bitzicleta</string>
<string name="poi_curling">Curling</string>
<string name="poi_crossfit">Crossfit</string>
<string name="poi_cockfighting">Lutas de puddos</string>
<string name="poi_cliff_diving">Imbèrghidas dae sos iscameddos</string>
<string name="poi_bobsleigh">Bob</string>
<string name="poi_biathlon">Biathlon</string>
<string name="poi_water_ski">Iscì de abba</string>
<string name="poi_water_polo">Polo de abba</string>
<string name="poi_zurkhaneh_sport">Zurkhaneh</string>
<string name="poi_wrestling">Luta</string>
<string name="poi_weightlifting">Artziada de pesos</string>
<string name="poi_office_diplomatic">Ufìtziu diplomàticu</string>
<string name="poi_kickboxing">Kickboxing</string>
<string name="poi_fencing">Ischerma</string>
<string name="poi_bullfighting">Corrida</string>
<string name="poi_aikido">Aikido</string>
<string name="poi_taekwondo">Taekwondo</string>
<string name="poi_table_soccer">Biliardinu</string>
<string name="poi_sumo">Sumo</string>
<string name="poi_snooker">Snooker</string>
<string name="poi_shot_put">Tiru de su pesu</string>
<string name="poi_pilates">Pilates</string>
<string name="poi_jiu_jitsu">Jiu-jitsu</string>
<string name="poi_karate">Karatè</string>
<string name="poi_hoops">Canisteddos</string>
<string name="poi_camp_pitch">Pratzola de acampamentu</string>
<string name="poi_bay_filter">Casta de baia</string>
<string name="poi_club_social">Tzìrculu sotziale</string>
<string name="poi_plateau">Artipranu</string>
</resources>

View file

@ -1769,7 +1769,7 @@
<string name="shared_string_commit">Imbia</string>
<string name="osm_edit_modified_poi">PDI OSM modificadu</string>
<string name="osm_edit_deleted_poi">PDI OSM iscantzelladu</string>
<string name="copied_to_clipboard">Copiadu in sos apuntos</string>
<string name="copied_to_clipboard">Copiadu in punta de billete</string>
<string name="osm_save_offline">Sarva in sa memòria (impreu chene lìnia)</string>
<string name="rendering_attr_currentTrackColor_description">Colore GPX</string>
<string name="rendering_attr_currentTrackWidth_description">Largària GPX</string>
@ -4046,4 +4046,41 @@
<string name="lost_data_warning">Totu sos datos non sarvados s\'ant a pèrdere.</string>
<string name="show_start_dialog">Ammustra su diàlogu de incumintzu</string>
<string name="specify_color_for_map_mode">Dislinda unu colore pro sa modalidade pro sa mapa: %1$s.</string>
<string name="release_4_0_beta">• Agiornamentos de OsmAnd Live (OSmAnd in direta) tramudados cara a \"Iscarrigamentos &gt; Agiornamentos\"
\n
\n • Sas rastas como si podent colorizare pro artària, lestresa, o pendèntzia.
\n
\n • Annanghidura de s\'optzione pro mudare s\'aparèntzia de sa lìnia de navigatzione de s\'àndala
\n
\n • Agiornamentu de sa ventanedda de diàlogu \"Registratzione de su biàgiu\"
\n
\n</string>
<string name="in_grace_period">In perìodu de gràtzia</string>
<string name="osmand_live">OsmAnd in direta</string>
<string name="app_mode_gap">Divàriu</string>
<string name="trip_recording_logging_interval_info">S\'intervallu de registratzione impostat sa frecuèntzia cun sa cale OsmAnd at a pedire sos datos de sa positzione atuale.</string>
<string name="trip_recording_show_start_dialog_setting">Si est disabilitadu sa registratzione at a incumintzare a pustis de su tocu in subra de su widget o de s\'elementu de su menù, brinchende sa ventanedda de diàlogu de cunfirma.</string>
<string name="customize_route_line">Personaliza sa lìnia de s\'àndala</string>
<string name="shared_string_route_line">Lìnia de s\'àndala</string>
<string name="route_line_use_map_style_appearance">Pro sa lìnia de s\'àndala s\'at a impreare su %1$s dislindadu in s\'istile de sa mapa ischertadu: %2$s.</string>
<string name="no_purchases">Non tenes còmpora peruna</string>
<string name="new_device_account">Dispositivu nou / contu nou</string>
<string name="contact_support_description">Si tenes preguntas cuntata·nos a su %1$s.</string>
<string name="empty_purchases_description">Si sa còmpora tua non benit ammustrada inoghe toca in “%1$s” o cuntata su grupu de suportu nostru.</string>
<string name="contact_support">Cuntata su suportu</string>
<string name="troubleshooting">Risolutzione de problemas</string>
<string name="troubleshooting_description">Si tenes problemas cun sa còmpora sighi custu ligàmene, pro praghere.</string>
<string name="annual_subscription">Abbonamentu annuale</string>
<string name="monthly_subscription">Abbonamentu mensile</string>
<string name="three_months_subscription">Abbonamentu trimestrale</string>
<string name="next_billing_date">Data de addèbitu imbeniente: %1$s</string>
<string name="osmand_live_cancelled">Annulladu</string>
<string name="renew_subscription">Rinnova s\'abbonamentu</string>
<string name="on_hold">In isetu</string>
<string name="expired">Iscadidu</string>
<string name="update_all_maps_added">Agiornare totu sas mapas annànghidas a %1$s\?</string>
<string name="exit_number">Nùmeru de essida</string>
<string name="announce_when_exceeded">Avisa in casu de barigamentu</string>
<string name="user_points">Puntos de s\'impreadore</string>
<string name="output">Essida</string>
</resources>

View file

@ -1494,7 +1494,7 @@
<string name="local_osm_changes_upload_all_confirm">Naozaj chcete odoslať %1$d zmien do OSM\?</string>
<string name="confirmation_to_clear_history">Vymazať históriu?</string>
<string name="osmand_parking_overdue">prekročený čas</string>
<string name="confirm_usage_speed_cameras">Vo viacerých krajinách (ako Nemecko, Francúzsko, Taliansko) je použitie varovaní pred rýchlostnými radarmi/kamerami zakázané zákonom (nelegálne). OsmAnd nepreberá žiadnu zodpovednosť ak porušíte zákon. Stlačte \"Áno\" len ak ste na to oprávnený použiť túto funkciu.</string>
<string name="confirm_usage_speed_cameras">Vo viacerých krajinách (ako Nemecko, Francúzsko, Taliansko) je použitie varovaní pred rýchlostnými radarmi/kamerami zakázané zákonom. OsmAnd nepreberá žiadnu zodpovednosť ak porušíte zákon. Stlačte \"Áno\" len ak ste oprávnený použiť túto funkciu.</string>
<string name="welmode_download_maps">Stiahnuť mapy</string>
<string name="welcome_select_region">Vyberte svoj región, aby bolo možné správne nastaviť dopravné predpisy:</string>
<string name="welcome_text">OsmAnd poskytuje celosvetové offline mapy a offline navigáciu.</string>
@ -2729,7 +2729,7 @@
<string name="wikipedia_offline">Wikipédia offline</string>
<string name="contour_lines_hillshade_maps">Vrstevnice &amp; tieňované svahy</string>
<string name="unlock_all_features">Odomknite všetky funkcie OsmAnd</string>
<string name="download_wikipedia_description">Stiahnite články Wikipédie pre %1$s pre ich čítanie offline.</string>
<string name="download_wikipedia_description">Stiahnite články Wikipédie pre %1$s na ich čítanie offline.</string>
<string name="download_wikipedia_label">Stiahnuť údaje Wikipédie</string>
<string name="open_in_browser_wiki">Otvoriť článok online</string>
<string name="open_in_browser_wiki_description">Zobraziť článok vo webovom prehliadači.</string>
@ -4006,7 +4006,7 @@
<string name="routing_attr_driving_style_description">Zvoľte účel jazdy pre získanie kratšej, rýchlejšej alebo bezpečnejšej trasy</string>
<string name="map_orientation_threshold_descr">Neotáčať mapu, ak je rýchlosť nižšia ako hranica</string>
<string name="restart">Reštartovať</string>
<string name="shared_strings_all_regions">Všetky regióny</string>
<string name="shared_strings_all_regions">Všetky oblasti</string>
<string name="delete_number_files_question">Zmazať %1$d súborov\?</string>
<string name="track_recording_stop_without_saving">Zastaviť bez uloženia</string>
<string name="track_recording_save_and_stop">Uložiť a zastaviť záznam</string>

View file

@ -3867,4 +3867,45 @@
<string name="poi_water_source_river">Река</string>
<string name="poi_vaccination_covid19">Цепљење: Ковид 19</string>
<string name="poi_health_specialty_vaccination_yes">Цепљење</string>
<string name="poi_club_social">Друштвени клуб</string>
<string name="poi_plateau">Плато</string>
<string name="poi_office_diplomatic">Дипломатско представништво</string>
<string name="poi_kickboxing">Кик-бокс</string>
<string name="poi_fencing">Мачевање</string>
<string name="poi_curling">Курлинг</string>
<string name="poi_crossfit">Кросфит</string>
<string name="poi_cockfighting">Туча петлова</string>
<string name="poi_bullfighting">Борба са биковима</string>
<string name="poi_bobsleigh">Боб</string>
<string name="poi_biathlon">Биатлон</string>
<string name="poi_aikido">Аикидо</string>
<string name="poi_water_ski">Водено скијање</string>
<string name="poi_water_polo">Ватерполо</string>
<string name="poi_wrestling">Рвање</string>
<string name="poi_weightlifting">Дизање тегова</string>
<string name="poi_wakeboarding">Вејкбординг</string>
<string name="poi_ultimate">Ултимат</string>
<string name="poi_taekwondo">Таеквондо</string>
<string name="poi_table_soccer">Футсал</string>
<string name="poi_sumo">Сумо</string>
<string name="poi_snooker">Снукер</string>
<string name="poi_piste_status_open">Стање стазе: отворена</string>
<string name="poi_patrolled_no">Обилажена: не</string>
<string name="poi_patrolled_yes">Обилажена: да</string>
<string name="poi_piste_name">Име стазе</string>
<string name="poi_piste_ski_jump">Ски скок</string>
<string name="poi_wildlife_crossing_bat_tunnel">Тунел за слепе мишеве</string>
<string name="poi_wildlife_crossing_bat_bridge">Мост за слепе мишеве</string>
<string name="poi_wildlife_crossing">Прелаз за дивљач</string>
<string name="poi_swimming_area">Део за пливање</string>
<string name="poi_lavoir">Појило</string>
<string name="poi_waste_transfer_station">Станица за пренос отпада</string>
<string name="poi_weightbridge">Колска вага</string>
<string name="poi_ranger_station">Шумарска станица</string>
<string name="poi_water_source_tube_well">Цевни бунар</string>
<string name="poi_water_source_well">Бунар</string>
<string name="poi_water_source_powered_pump">Електрична пумпа</string>
<string name="poi_water_source_water_tank">Танк са водом</string>
<string name="poi_water_source_tap">Чесма</string>
<string name="poi_bay_filter">Тип залива</string>
</resources>

View file

@ -662,7 +662,7 @@
<string name="share_osm_edits_subject">ОСМ измене дељене преко OsmAnd-а</string>
<string name="osm_edit_created_poi">OSM тачка од интереса је направљена</string>
<string name="nm">nmi</string>
<string name="nm_h">kn</string>
<string name="nm_h">чв</string>
<string name="min_mile">min/m</string>
<string name="min_km">min/km</string>
<string name="m_s">m/s</string>
@ -922,7 +922,7 @@
<string name="rendering_attr_roadColors_name">Образац боја путева</string>
<string name="enable_plugin_monitoring_services">Омогућите додатак за „снимање путовања“ ради коришћења услуга бележења (GPX бележење, праћење положаја на мрежи)</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="no_route">Нема пута</string>
<string name="arrived_at_intermediate_point">Стигли сте на пролазно одредиште</string>
@ -1005,7 +1005,7 @@
<string name="new_filter_desc">Молимо, унесите име новог филтера који ће бити придодат језичку „Категорије“.</string>
<string name="osm_live_payment_desc">Чланарина се наплаћује по одабраном периоду. Можете је отказати на Гугл плеју кад год пожелите.</string>
<string name="donation_to_osm">Прилог ОСМ заједници</string>
<string name="donation_to_osm_desc">Део Вашег прилога ће бити послат корисницима ОСМ-а. Чланарина остаје иста.</string>
<string name="donation_to_osm_desc">Део Ваше чланарине ће бити послат корисницима ОСМ-а. Чланарина остаје иста.</string>
<string name="osm_live_subscription_desc">Чланарина омогућава часовне, дневне и седмичне надоградње, и неограничена преузимања свих карата.</string>
<string name="get_it">Добавите је</string>
<string name="get_for">Добавите за %1$s</string>
@ -1062,9 +1062,9 @@
<string name="access_direction_audio_feedback_descr">Указуј на правац циљне тачке звуком.</string>
<string name="access_direction_haptic_feedback">Упутства трешењем</string>
<string name="access_direction_haptic_feedback_descr">Указуј на правац циљне тачке трешњом.</string>
<string name="use_osm_live_routing_description">Омогући навођење живих измена ОСМ-а.</string>
<string name="use_osm_live_routing_description">Омогући навођење измена ОСМ-а уживо.</string>
<string name="use_osm_live_routing">Навођење уживо ОСМ-а</string>
<string name="access_no_destination">Одредиште није подешено</string>
<string name="access_no_destination">Додатак за приступачност: Одредиште није подешено</string>
<string name="access_category_choice">Изаберите категорију</string>
<string name="storage_directory_readonly_desc">Пребачено на интерну меморију пошто је означено складиште за податке заштићено од писања. Изаберите фасциклу за складиште у коју може да се пише.</string>
<string name="save_track_interval_descr">Наведите интервал логовања снимања путање приликом навођења</string>
@ -1221,7 +1221,7 @@
<string name="rendering_attr_horseRoutes_name">Коњске стазе</string>
<string name="share_geo">положај:</string>
<string name="lang_br">Бретонски</string>
<string name="hillshade_menu_download_descr">Преузмите слој са сенчењем да бисте видели рељеф на карти.</string>
<string name="hillshade_menu_download_descr">Преузмите карту слоја са сенчењем да бисте видели рељеф на карти.</string>
<string name="hillshade_purchase_header">Инсталирајте додатак \"Изохипсе\" да прикажете нагиб вертикалних области.</string>
<string name="shared_string_plugin">Додатак</string>
<string name="display_zoom_level">Приказ нивоа увеличања: %1$s</string>
@ -1234,11 +1234,11 @@
<string name="shared_string_add_photos">Додај слике</string>
<string name="no_photos_descr">Нема слика овде.</string>
<string name="mapillary_action_descr">Поделите Ваш поглед са улице преко Мапилара.</string>
<string name="mapillary_widget">Справица Мапилара</string>
<string name="mapillary_widget_descr">Омогућава брзи допринос Мапилару.</string>
<string name="open_mapillary">Отвори Мапилар</string>
<string name="mapillary_widget">Mapillary справица</string>
<string name="mapillary_widget_descr">Омогућава брзи допринос Mapillary-ју.</string>
<string name="open_mapillary">Отвори Mapillary</string>
<string name="mapillary_descr">Мрежне слике улица за све. Откријте места, сарађујте, освојите свет.</string>
<string name="mapillary">Мапилари</string>
<string name="mapillary">Mapillary</string>
<string name="plugin_mapillary_descr">Мрежне слике улица за све. Откријте места, сарађујте, освојите свет.</string>
<string name="private_access_routing_req">Ваше одредиште се налази на приватном поседу. Дозволити коришћење приватних путева на овом путовању\?</string>
<string name="restart_search">Препокрени претрагу</string>
@ -1512,8 +1512,8 @@
<string name="import_gpx_failed_descr">Не могу да увезем фајл. Проверите да ли OsmAnd има дозволе за читање фајла.</string>
<string name="distance_moving">Растојање је исправљено</string>
<string name="mapillary_image">Слика са Мапилара</string>
<string name="improve_coverage_mapillary">Побољшајте покривеност слика користећи Мапилар</string>
<string name="improve_coverage_install_mapillary_desc">Инсталирајте програм Мапилар (Mapillary) да додате слике на ову локацију на карти.</string>
<string name="improve_coverage_mapillary">Побољшајте покривеност слика користећи Mapillary</string>
<string name="improve_coverage_install_mapillary_desc">Инсталирајте програм Mapillary да додате слике на ову локацију на карти.</string>
<string name="subscribe_email_desc">Претплатите се на нашу дописну листу за попуст и добијте још 3 преузимања карти!</string>
<string name="depth_contour_descr">Изобате мора (изохипсе дубине) и карте поморских ознака.</string>
<string name="sea_depth_thanks">Хвала Вам на куповини „Поморских изобата“</string>
@ -1861,7 +1861,7 @@
<string name="quick_action_btn_tutorial_title">Помери дугме</string>
<string name="quick_action_btn_tutorial_descr">Дуго држање и превлачење дугмета га помера по екрану.</string>
<string name="shared_string_action_name">Име радње</string>
<string name="mappilary_no_internet_desc">Слике са Мапилара је могуће видети само ако сте повезани на интернет.</string>
<string name="mappilary_no_internet_desc">Слике са Mapillary-ја је могуће видети само ако сте повезани на интернет.</string>
<string name="retry">Покушај поново</string>
<string name="empty_state_favourites">Додај омиљене</string>
<string name="empty_state_favourites_desc">Увезите Омиљене тачке или их додајте означавајући их као ознаке на карти.</string>
@ -2134,7 +2134,7 @@
<string name="plugin_install_needs_network">Морате имати интернет да бисте инсталирали овај додатак.</string>
<string name="get_plugin">Преузми</string>
<string name="use_fast_recalculation">Пмаетно прерачунавање пута</string>
<string name="use_fast_recalculation_desc">Прерачунава само почетни део руте. Може се користити за дуга путовања.</string>
<string name="use_fast_recalculation_desc">Прерачунава само почетни део руте, корисно за дуга путовања.</string>
<string name="do_you_like_osmand">Да ли Вам се OsmAnd свиђа?</string>
<string name="we_really_care_about_your_opinion">Важно нам је да чујемо Ваше мишљење.</string>
<string name="rate_this_app">Оцените ову апликацију</string>
@ -2543,7 +2543,7 @@
<string name="update_poi_error_local">Не могу да ажурирам локални списак тачака од интереса.</string>
<string name="quick_action_add_gpx_descr">Дугме за додавање GPX пролазне тачке на средину екрана.</string>
<string name="show_images">Прикажи слике</string>
<string name="purchase_cancelled_dialog_title">Укинули сте чланарину за OsmAnd Live</string>
<string name="purchase_cancelled_dialog_title">Отказали сте чланарину за OsmAnd уживо</string>
<string name="purchase_cancelled_dialog_descr">Обновите чланарину да наставите да користите све ове функционалности:</string>
<string name="gpxup_identifiable">Може да се користи за идентификацију</string>
<string name="gpxup_trackable">Може да се користи за праћење</string>
@ -2581,7 +2581,7 @@
<string name="default_render_descr">Стил опште намене. Густи градови су приказани јасно. Приказује изохипсе, путање, квалитет подлоге, забране приступа, блокаде путева, исцртавање путева по SAC алпској скали, објекти за спортове на брзацима.</string>
<string name="open_wikipedia_link_online">Отвори Википедија везу са интернетом</string>
<string name="open_wikipedia_link_online_description">Веза ће бити отворена у веб читачу.</string>
<string name="read_wikipedia_offline_description">Да бисте читали чланке са Википедије и Wikivoyage-а, претплатите се на OsmAnd Live.</string>
<string name="read_wikipedia_offline_description">Да бисте читали чланке са Википедије и Wikivoyage-а, купите чланарину на OsmAnd уживо.</string>
<string name="how_to_open_link">Како да отворим везу?</string>
<string name="read_wikipedia_offline">Читај Википедију ван мреже</string>
<string name="download_all">Преузми све</string>
@ -2703,7 +2703,7 @@
\n - Окретањем мапе према компасу или правцу кретања
\n - Навођењем у праву траку, приказ ограничења брзине, снимљени и синтетизовани гласови за навођење
\n</string>
<string name="get_osmand_live">Набавите OsmAnd Live да откључате ове могућности: дневна ажурирања карти са неограниченим бројем скидања, сви и плаћени и бесплатни додаци, Википедија, Wikivoyage и још много тога.</string>
<string name="get_osmand_live">Набавите OsmAnd уживо да откључате ове могућности: дневна ажурирања карти са неограниченим бројем скидања, сви и плаћени и бесплатни додаци, Википедија, Wikivoyage и још много тога.</string>
<string name="osmand_extended_description_part3">Карта
\n • Приказ тачака од интереса око Вас
\n • Подешавање карте према правцу кретања (или компасу)
@ -2777,14 +2777,14 @@
<string name="osm_live_payment_month_cost_descr">%1$s / месечно</string>
<string name="osm_live_payment_month_cost_descr_ex">%1$.2f %2$s / месечно</string>
<string name="osm_live_payment_discount_descr">Уштедите %1$s</string>
<string name="osm_live_payment_current_subscription">Тренутна претплата</string>
<string name="osm_live_payment_current_subscription">Тренутна чланарина</string>
<string name="osm_live_payment_renews_monthly">Месечно обнављање</string>
<string name="osm_live_payment_renews_quarterly">Квартално обнављање</string>
<string name="osm_live_payment_renews_annually">Годишње обнављање</string>
<string name="default_price_currency_format">%1$.2f %2$s</string>
<string name="osm_live_payment_header">Период плаћања:</string>
<string name="osm_live_payment_contribute_descr">Донације помажу финансирање OSM картографа.</string>
<string name="osm_live_subscriptions">Претплате</string>
<string name="osm_live_subscriptions">Чланарине</string>
<string name="mapillary_menu_title_pano">Прикажи само слике од 360°</string>
<string name="shared_string_launch">Покрени</string>
<string name="lang_gn_py">Гварани</string>
@ -2894,8 +2894,8 @@
<string name="tracks_on_map">Приказане путање</string>
<string name="sit_on_the_stop">Укрцавање на стајању</string>
<string name="quick_action_show_hide_gpx_tracks_descr">Дугме које приказује или сакрива одабране путање са карте.</string>
<string name="use_osm_live_public_transport_description">Омогући јавни превоз на OsmAnd Live изменама.</string>
<string name="use_osm_live_public_transport">OsmAnd Live јавни превоз</string>
<string name="use_osm_live_public_transport_description">Омогући јавни превоз на OsmAnd уживо изменама.</string>
<string name="use_osm_live_public_transport">OsmAnd уживо јавни превоз</string>
<string name="rendering_attr_surface_sett_name">Калдрма</string>
<string name="rendering_attr_surface_paving_stones_name">Поплочано камење</string>
<string name="rendering_attr_highway_class_motorway_name">Ауто-пут</string>
@ -3119,7 +3119,7 @@
<string name="get_discount_first_part">%1$s првих %2$s</string>
<string name="get_discount_first_few_part">%1$s првих %2$s</string>
<string name="get_discount_second_part">онда %1$s</string>
<string name="cancel_subscription">Поништи претплату</string>
<string name="cancel_subscription">Поништи чланарину</string>
<string name="price_and_discount">%1$s • Уштеди %2$s</string>
<string name="configure_profile_info">Поставке за профил:</string>
<string name="utm_format_descr">OsmAnd користи UTM Standard format који је сличан, али није истоветан као UTM NATO format.</string>
@ -3330,7 +3330,7 @@
<string name="login_and_pass">Корисничко име и лозинка</string>
<string name="plugin_global_prefs_info">Ова подешавања додатака су глобална и примењују се на све профиле</string>
<string name="osm_editing">OSM уређивање</string>
<string name="osm_edits_view_descr">Све своје још увек не отпремљене измене или ОСМ белешке можете погледати у %1$s. Отпремљене тачке се не приказују у ОсмАнду.</string>
<string name="osm_edits_view_descr">Погледајте све Ваше још увек неотпремљене измене или ОСМ белешке у %1$s. Отпремљене тачке се не више приказују.</string>
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Иконица која се приказује за време навођења или померања.</string>
<string name="select_map_icon_descr">Иконица која се приказује у мировању.</string>
@ -3484,7 +3484,7 @@
<string name="measure_distance_item">Измери удаљеност</string>
<string name="travel_item">Путовање (Wikivoyage и Википедија)</string>
<string name="favorites_item">Омиљени</string>
<string name="subscription_osmandlive_item">Претплата - OsmAnd уживо</string>
<string name="subscription_osmandlive_item">Чланарина - OsmAnd уживо</string>
<string name="osmand_purchases_item">OsmAnd куповине</string>
<string name="legend_item_description">Упутство за легенду карте.</string>
<string name="navigation_profiles_item">Профили навођења</string>
@ -3650,9 +3650,9 @@
<string name="context_menu_actions">Акције Контекст менија</string>
<string name="osm_live_payment_subscription_management">Наплатом ће бити оптерећен ваш Гугл Плеј налог при потврди куповине.
\n
\n Претплата се аутоматски обнавља уколико није отказана пре датума обнове. Ваш налог биће задужен периодом обнове (месец / три месеца / годину дана) само на дан обнове.
\nЧланарина се аутоматски обнавља уколико није отказана пре датума обнове. Ваш налог биће задужен периодом обнове (месец / три месеца / годину дана) само на дан обнове.
\n
\n Претплатама можете управљати и отказати их тако што ћете отићи на ваша Гугл Плеј подешавања.</string>
\nЧланаринама можете управљати и отказати их тако што ћете отићи на ваша Гугл Плеј подешавања.</string>
<string name="release_3_7">• Нове офлајн мапе нагиба
\n
\n • Пуно прилагођавање Фаворита и ГПКС тачака прилагођавање боја, икона, облика
@ -3683,9 +3683,9 @@
<string name="lenght_limit_description">Унесите дужину возила, нека ограничења пута могу бити примењена за дужа возила.</string>
<string name="quick_action_remove_next_destination">Обриши најближу одредишну тачку</string>
<string name="please_provide_point_name_error">Молимо одредите име тачке</string>
<string name="quick_action_remove_next_destination_descr">Тренутна одредишна тачка биће уклоњена. Ако је она одредишна, стопираће се навигација.</string>
<string name="quick_action_remove_next_destination_descr">Уклања тренутну одредишну тачку. Ако је она и завршна тачка, навођење ће се зауставити.</string>
<string name="search_download_wikipedia_maps">Преузмите мапе Википедије</string>
<string name="plugin_wikipedia_description">Информације о тачкама од интереса потражите на Википедији. То је ваш џепни ванмрежни водич - само укључите додатак Википедија и уживајте у чланцима о објектима око вас.</string>
<string name="plugin_wikipedia_description">Информације о тачкама од интереса потражите на Википедији, џепном ванмрежном водичу који има чланке о местима и одредиштима.</string>
<string name="app_mode_enduro_motorcycle">Ендуро скутер</string>
<string name="app_mode_motor_scooter">Скутер</string>
<string name="app_mode_wheelchair">Инвалидска колица</string>
@ -3723,7 +3723,7 @@
<string name="navigation_profile">Навигацијски профил</string>
<string name="route_between_points_add_track_desc">Изаберите датотеку записа којој ће се додати нови сегмент.</string>
<string name="street_level_imagery">Слике на нивоу улице</string>
<string name="plan_route_exit_dialog_descr">Да ли сте сигурни да желите да одбаците све промене на планираној рути затварањем\?</string>
<string name="plan_route_exit_dialog_descr">Да ли сте сигурни да желите да одбаците све промене на планираној рути\?</string>
<string name="in_case_of_reverse_direction">У случају обрнутог правца</string>
<string name="shared_string_save_as_gpx">Сачувај као нову датотеку стазе</string>
<string name="add_segment_to_the_track">Додај у датотеку стазе</string>
@ -3761,9 +3761,9 @@
<string name="gpx_monitoring_stop">Паузирај снимање пута</string>
<string name="one_point_error">Додајте бар две тачке.</string>
<string name="osm_edit_logout_success">Одјављен</string>
<string name="gpx_upload_private_visibility_descr">„Приватно“ значи да се траг не појављује ни на једној јавној листи, али су тачке праћења у њему у нехронолошком редоследу доступне путем јавног ГПС АПИ-ја без временских ознака.</string>
<string name="gpx_upload_identifiable_visibility_descr">„Могуће је идентификовати“ значи да ће се траг јавно приказати у вашим ГПС траговима и у јавним списковима ГПС трагова, тј. други корисници ће моћи да преузму необрађени траг и повежу га са вашим корисничким именом. Јавни подаци о временским тачкама трага из ГПС АПИ-ја који се сервирају путем АПИ-ја за тачке праћења имаће референцу на вашу оригиналну страницу праћења.</string>
<string name="gpx_upload_trackable_visibility_descr">„Следљиво“ значи да се траг не приказује нигде на јавним листама, али обрађене тачке праћења са временским ознакама у њима (које не могу бити директно повезане са вама) иду кроз преузимања са јавног ГПС АПИ-ја.</string>
<string name="gpx_upload_private_visibility_descr">„Приватно“ значи да се траг не појављује ни на једној јавној листи, али су тачке праћења у њему у нехронолошком редоследу доступне путем јавног GPS API-ја без временских ознака.</string>
<string name="gpx_upload_identifiable_visibility_descr">„Могуће је идентификовати“ значи да ће се траг јавно приказати у Вашим GPS траговима и у јавним списковима GPS трагова, тј. други корисници ће моћи да преузму необрађени траг и повежу га са Вашим корисничким именом. Јавни подаци о временским тачкама трага из GPS API-ја који се сервирају путем API-ја за тачке праћења имаће референцу на вашу оригиналну страницу праћења.</string>
<string name="gpx_upload_trackable_visibility_descr">„Следљиво“ значи да се траг не приказује нигде на јавним листама, али обрађене тачке праћења са временским ознакама у њима (које не могу бити директно повезане са вама) иду кроз преузимања са јавног GPS API-ја.</string>
<string name="osm_edit_close_note">Затвори ОСМ белешку</string>
<string name="osm_edit_comment_note">Коментар ОСМ напомене</string>
<string name="osm_login_descr">Можете се пријавити користећи безбедан ОАут метод или користити своје корисничко име и лозинку.</string>
@ -3776,12 +3776,12 @@
<string name="shared_string_search_history">Претрага</string>
<string name="app_mode_kayak">Кајак</string>
<string name="app_mode_motorboat">Моторни чамац</string>
<string name="add_to_mapillary">Додај у Мапилари</string>
<string name="add_to_opr">Додај у ОпенПлејсРевјуз</string>
<string name="add_photos_descr">ОсмАнд приказује фотографије из неколико извора:
\nОпенПлејсРевјуз - ПОИ фотографије;
\nМапилари - слике на нивоу улице;
\nВеб / Викимедиа - ПОИ фотографије наведене у подацима ОпенСтритМап.</string>
<string name="add_to_mapillary">Додај у Mapillary</string>
<string name="add_to_opr">Додај у OpenPlaceReviews</string>
<string name="add_photos_descr">OsmAnd приказује фотографије из неколико извора:
\nOpenPlaceReviews - фотографије тачака од интереса;
\nMapillary - слике на нивоу улице;
\nВеб / Викимедија - фотографије тачака од интереса наведене у OpenStreetMap подацима.</string>
<string name="shared_string_resources">Ресурси</string>
<string name="approximate_file_size">Приближна величина датотеке</string>
<string name="select_data_to_export">Изаберите податке за извоз у датотеку.</string>
@ -3795,7 +3795,7 @@
<string name="mgrs_format_descr">ОсмАнд користи МГРС, који је сличан УТМ НАТО формату.</string>
<string name="simplified_track">Поједностављена стаза</string>
<string name="simplified_track_description">Само линија руте ће бити сачувана, а путне тачке ће бити избрисане.</string>
<string name="disable_recording_once_app_killed_descrp">Паузираће евидентирање стазе када се апликација убије (преко скорашњих програма). (Индикатор рада OsmAnd-а у позадини тада нестаје из обавештајне траке.)</string>
<string name="disable_recording_once_app_killed_descrp">Евидентирање стазе ће бити паузирано када се апликација убије (преко скорашњих програма). (Индикатор рада OsmAnd-а у позадини тада нестаје из обавештајне траке.)</string>
<string name="save_global_track_interval_descr">Наведите интервал евидентирања за опште снимање стаза (укључено помоћу виџета „Снимање путовања“ на мапи).</string>
<string name="gpx_monitoring_start">Наставите снимање путовања</string>
<string name="system_default_theme">Системско подразумевана</string>
@ -3827,17 +3827,17 @@
<string name="sort_name_descending">Име: З - А</string>
<string name="sort_name_ascending">Име: А - З</string>
<string name="contour_lines_thanks">Хвала вам што сте купили „Контурне линије“</string>
<string name="osm_live_payment_desc_hw">Претплата се наплаћује по изабраном периоду. Откажите га у АппГалери у било ком тренутку.</string>
<string name="osm_live_payment_subscription_management_hw">Уплата ће бити наплаћена са вашег рачуна АппГалери при потврди куповине.
<string name="osm_live_payment_desc_hw">Чланарина се наплаћује по изабраном периоду. Откажите је у AppGallery у било ком тренутку.</string>
<string name="osm_live_payment_subscription_management_hw">Уплата ће бити наплаћена са вашег рачуна AppGallery при потврди куповине.
\n
\nПретплата се аутоматски обнавља уколико није отказана пре датума обнове. Ваш рачун ће бити задужен за период обнове (месец / три месеца / година) само на датум обнове.
\nЧланарина се аутоматски обнавља уколико није отказана пре датума обнове. Ваш рачун ће бити задужен за период обнове (месец / три месеца / година) само на датум обнове.
\n
\nПретплатама можете управљати и отказати их тако што ћете отићи у подешавања апликације АппГалери.</string>
\nЧланаринама можете управљати и отказати их тако што ћете отићи у подешавања апликације AppGallery.</string>
<string name="routing_attr_avoid_footways_description">Избегавајте пешачке стазе</string>
<string name="routing_attr_avoid_footways_name">Избегавајте пешачке стазе</string>
<string name="development">Развој</string>
<string name="use_live_public_transport">ОсмАнд лајв подаци</string>
<string name="use_live_routing">ОсмАнд лајв подаци</string>
<string name="use_live_public_transport">OsmAnd уживо подаци</string>
<string name="use_live_routing">OsmAnd уживо подаци</string>
<string name="complex_routing_descr">Двофазно усмеравање за аутомобилску навигацију.</string>
<string name="use_native_pt">Развој матичног јавног превоза</string>
<string name="use_native_pt_desc">Пребаците се на Јава (безбедан) прорачун рутирања јавног превоза</string>
@ -3847,9 +3847,9 @@
<string name="file_already_imported">Датотека је већ увезена у ОсмАнд</string>
<string name="use_two_phase_routing">Користите двофазни алгоритам усмеравања А*</string>
<string name="shared_string_graph">Графикон</string>
<string name="message_need_calculate_route_before_show_graph">%1$s подаци доступни само на путевима, морате израчунати руту користећи „Рута између тачака“ да бисте је добили.</string>
<string name="message_graph_will_be_available_after_recalculation">Сачекајте поновно израчунавање руте.
\nГрафикон ће бити доступан након поновног израчунавања.</string>
<string name="message_need_calculate_route_before_show_graph">%1$s подаци доступни само на путевима, израчунајте руту користећи „Рута између тачака“ да бисте видели графике.</string>
<string name="message_graph_will_be_available_after_recalculation">Молимо сачекајте.
\nГрафикон ће бити доступан након поновног израчунавања путање.</string>
<string name="shared_string_local_maps">Локалне мапе</string>
<string name="ltr_or_rtl_combine_via_dash">%1$s — %2$s</string>
<string name="app_mode_gap">Размак</string>
@ -3871,15 +3871,15 @@
<string name="use_login_password">Користите корисничко име и лозинку</string>
<string name="login_account">Налог</string>
<string name="user_login">Пријавите се</string>
<string name="manage_subscription">Управљајте претплатом</string>
<string name="subscription_payment_issue_title">Постоји проблем са вашом претплатом. Кликните на дугме да бисте отворили подешавања претплате за Гугле Плеј и да бисте поправили начин плаћања.</string>
<string name="subscription_expired_title">Претплата на ОсмАнд лајв је истекла</string>
<string name="subscription_paused_title">Претплата на ОсмАнд лајв је паузирана</string>
<string name="subscription_on_hold_title">Претплата на ОсмАнд лајв је на чекању</string>
<string name="manage_subscription">Управљајте чланарином</string>
<string name="subscription_payment_issue_title">Постоји проблем са Вашом чланарином. Кликните на дугме да бисте отворили подешавања претплате за Гугле Плеј и да бисте поправили начин плаћања.</string>
<string name="subscription_expired_title">Чланарина за OsmAnd уживо је истекла</string>
<string name="subscription_paused_title">Чланарина на OsmAnd уживо је паузирана</string>
<string name="subscription_on_hold_title">Чланарина на OsmAnd уживо је на чекању</string>
<string name="markers_history">Историја маркера</string>
<string name="send_files_to_openstreetmap">Пошаљите ГПКС датотеку на ОпенСтритМап</string>
<string name="enter_text_separated">Унесите ознаке одвојене зарезом.</string>
<string name="gpx_upload_public_visibility_descr">„Јавно“ значи да је траг јавно приказан у вашим ГПС траговима и на јавним ГПС траговима, као и на јавном списку трагова са временским ознакама у сировом облику. Подаци који се приказују путем АПИ-ја не упућују на вашу страницу трагова. Временске ознаке праћења нису доступне путем јавног ГПС АПИ-ја и тачке праћења нису хронолошки поређане.</string>
<string name="gpx_upload_public_visibility_descr">„Јавно“ значи да је траг јавно приказан у вашим GPS траговима и на јавним GPS траговима, као и на јавном списку трагова са временским ознакама у сировом облику. Подаци који се приказују путем API-ја не упућују на вашу страницу трагова. Временске ознаке праћења нису доступне путем јавног GPS API-ја и тачке праћења нису хронолошки поређане.</string>
<string name="cannot_upload_image">Није могуће отпремити слику, покушајте поново касније</string>
<string name="select_picture">Изаберите слику</string>
<string name="select_groups_for_import">Изаберите групе које ће бити увезене.</string>
@ -3895,11 +3895,11 @@
<string name="plan_route_add_new_segment">Додајте нови сегмент</string>
<string name="release_3_9">• Додата је опција за извоз и увоз свих података, укључујући подешавања, ресурсе, моја места
\n
\n • Планирање руте: графикони за сегменте са рутом, додата је могућност креирања и уређивања вишеструких сегмената стаза
\n • Планирање руте: графикони за сегменте са рутом, и додата је могућност креирања и уређивања вишеструких сегмената стаза
\n
\n • Додан је метод аутентификације ОАут за ОпенСтритМап, побољшан кориснички интерфејс ОСМ дијалога
\n
\n • Прилагођене боје за омиљене и путне тачаке стаза
\n • Подршка за прилагођене боје за омиљене и пролазне тачке путања
\n
\n</string>
<string name="activity_type_water_name">Вода</string>
@ -3959,7 +3959,7 @@
<string name="routing_engine_vehicle_type_cycling_electric">Екетрични бициклизам</string>
<string name="routing_engine_vehicle_type_cycling_mountain">Планински бициклизам</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_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>
@ -3988,4 +3988,98 @@
<string name="rename_track">Преименуј путању</string>
<string name="trip_recording_save_and_continue">Сачувај и настави</string>
<string name="lost_data_warning">Сви несачувани подаци ће бити изгубљени.</string>
<string name="routing_attr_prefer_hiking_routes_description">Преферира планинске пешачке путеве</string>
<string name="routing_attr_prefer_hiking_routes_name">Преферирај планинске пешачке путеве</string>
<string name="routing_attr_allow_intermittent_description">Дозвољава водене токове који некад пресуше</string>
<string name="routing_attr_allow_streams_description">Дозвољава потоке и одвоје</string>
<string name="routing_attr_allow_streams_name">Дозволи потоке и одводе</string>
<string name="routing_attr_allow_intermittent_name">Дозволи несталне водене токове</string>
<string name="shared_string_api_key">Кључ API-ја</string>
<string name="shared_string_server_url">Адреса сервера</string>
<string name="shared_string_enter_param">Унесите параметар</string>
<string name="keep_it_empty_if_not">Задржи је празном ако није</string>
<string name="online_routing_example_hint">Адреса са свим параметрима ће изгледати овако:</string>
<string name="test_route_calculation">Тестирај израчунавање пута</string>
<string name="shared_string_folders">Фасцикле</string>
<string name="select_folder">Одаберите фасциклу</string>
<string name="select_folder_descr">Одаберите фасциклу или додајте нову</string>
<string name="analyze_by_intervals">Анализирај интервале поделе</string>
<string name="upload_to_openstreetmap">Отпреми на OpenStreetMap</string>
<string name="change_folder">Измени фасциклу</string>
<string name="shared_string_sec">сек</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="shared_string_turn">Скретање</string>
<string name="announcement_time_intervals">Интервали времена и удаљености</string>
<string name="announcement_time_descr">Времена објава различитих гласовних навођења зависе од типа објаве, као и тренутне и подразумеване брзине навођења.</string>
<string name="online_routing_engines">Мрежни усмеривачи</string>
<string name="routing_engine_vehicle_type_foot">Пешке</string>
<string name="routing_engine_vehicle_type_driving">Вожња аутомобила</string>
<string name="edit_online_routing_engine">Измени мрежни усмеривач</string>
<string name="add_online_routing_engine">Додај мрежни усмеривач</string>
<string name="online_routing_engine">Мрежни усмеривач</string>
<string name="delete_online_routing_engine">Обриши овај мрежни усмеривач\?</string>
<string name="delete_waypoints">Обриши пролазну тачку</string>
<string name="copy_to_map_markers">Копирај у ознаке карте</string>
<string name="hillshade_slope_contour_lines">Рељеф / Нагиб / Контурне линије</string>
<string name="open_place_reviews">OpenPlaceReviews</string>
<string name="login_open_place_reviews">Пријавите се за OpenPlaceReviews</string>
<string name="activity_type_offroad_name">Вожња ван пута</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="trip_recording_logging_interval_info">Временски интервал бележења на који ће OsmAnd да пита за податке о тренутној позицији.</string>
<string name="show_start_dialog">Прикажи почетни дијалог</string>
<string name="trip_recording_show_start_dialog_setting">Ако се искључи, снимање ће почети одмах после кликтања на справицу или на ставку менија, прескакајући дијалог потврде.</string>
<string name="customize_route_line">Прилагоди линију руте</string>
<string name="route_line_use_map_style_appearance">Линија руте ће користити %1$s одабран на означеном стилу карте: %2$s.</string>
<string name="shared_string_route_line">Линија руте</string>
<string name="specify_color_for_map_mode">Одаберите боју за режим карте: %1$s.</string>
<string name="no_purchases">Немате ниједну куповину</string>
<string name="new_device_account">Нови уређај / нови налог</string>
<string name="contact_support_description">Ако имате икаквих питања, контактирајте нас на %1$s.</string>
<string name="empty_purchases_description">Ако се Ваша куповина не појави овде, кликните на „%1$s” или контактирајте нашу подршку.</string>
<string name="contact_support">Контактирајте подршку</string>
<string name="troubleshooting">Решавање проблема</string>
<string name="troubleshooting_description">Пратите ову везу ако имате икаквих проблема са куповином.</string>
<string name="osmand_live">OsmAnd уживо</string>
<string name="renew_subscription">Обнови чланарину</string>
<string name="annual_subscription">Годишња чланарина</string>
<string name="monthly_subscription">Месечна чланарина</string>
<string name="three_months_subscription">Тромесечна чланарина</string>
<string name="next_billing_date">Следећи датум наплате: %1$s</string>
<string name="osmand_live_cancelled">Отказано</string>
<string name="in_grace_period">У грејс периоду</string>
<string name="on_hold">На чекању</string>
<string name="expired">Истекло</string>
<string name="update_all_maps_added">Ажурирај све карте додате на %1$s\?</string>
<string name="exit_number">Број излаза</string>
<string name="announce_when_exceeded">Објави када се премаши</string>
<string name="user_points">Кориснички поени</string>
<string name="output">Излаз</string>
<string name="open_place_reviews_plugin_description">OpenPlaceReviews је пројакат покретан од стране заједнице о јавним местима, као што су ресторани, хотели, пролазне тачке. Пројекат сакупља јавне информације о њима, као што су слике, рецензије, везе ка другим местима као OpenStreetMap или Википедија.
\n
\nСви подаци на OpenPlaceReview су отворени и доступни свима: http://openplacereviews.org/data.
\n
\nМожете прочитати више на: http://openplacereviews.org</string>
<string name="release_4_0_beta">• Ажурирања OsmAnd уживо су премештена у „Преузимања &gt; Ажурирања”
\n
\n • Путање се сада могу обојити по висини, брзини или нагибу.
\n
\n • Додата опција да се измени изглед линије која се приказује приликом навођења
\n
\n • Ажуриран дијалог за „Снимање пута”
\n
\n</string>
<string name="copy_address">Копирај адресу</string>
<string name="voice_prompts_timetable">Времена гласовних навођења</string>
<string name="profile_type_osmand_string">OsmAnd профил</string>
<string name="profile_type_user_string">Кориснички профил</string>
<string name="reverse_all_points">Обрни све тачке</string>
<string name="profile_by_default_description">Одаберите профил које ће се користити по покретању апликације.</string>
<string name="shared_string_last_used">Последње коришћено</string>
</resources>

View file

@ -3926,4 +3926,6 @@
<string name="poi_hoops">Ringar</string>
<string name="poi_office_diplomatic">Diplomatiskt kontor</string>
<string name="poi_bay_filter">Typ av vik</string>
<string name="poi_plateau">Platå</string>
<string name="poi_club_social">Social klubb</string>
</resources>

View file

@ -470,7 +470,7 @@
<string name="indexing_map">Indexerar kartan …</string>
<string name="indexing_poi">Indexerar Intressepunkter …</string>
<string name="indexing_transport">Indexerar transport …</string>
<string name="shared_string_io_error">Ett I/O-fel har inträffat</string>
<string name="shared_string_io_error">I/O-fel</string>
<string name="km">km</string>
<string name="km_h">km/h</string>
<string name="m">m</string>
@ -736,7 +736,7 @@
<string name="favourites_remove_dialog_success">Favoritpunkten {0} togs bort utan problem.</string>
<string name="osb_comment_dialog_message">Meddelande</string>
<string name="osb_comment_dialog_author">Författarnamn</string>
<string name="osb_comment_dialog_success">Kommentaren lades till utan problem</string>
<string name="osb_comment_dialog_success">Kommentaren tillagd</string>
<string name="osb_comment_dialog_error">Det gick inte att lägga till kommentar.</string>
<string name="poi_edit_title">Redigera POI</string>
<string name="poi_create_title">Skapa POI</string>
@ -759,7 +759,7 @@
<string name="osmand_srtm_short_description_80_chars">OsmAnd-modul för höjdkurvor offline</string>
<string name="map_widget_distancemeasurement">Avståndsmätning</string>
<string name="map_widget_audionotes">Ljudanteckningar</string>
<string name="audionotes_plugin_description">Denna modul för ljud- och videoanteckningar erbjuder möjlighet att skapa ljud-/foto-/videoanteckningar under en resa, antingen med hjälp av en knapp på kartskärmen eller direkt i kontextmenyn för en position på kartan.</string>
<string name="audionotes_plugin_description">Gör ljud-/foto-/videoanteckningar under en resa, med antingen en kartknapp eller platsens snabbmeny.</string>
<string name="audionotes_plugin_name">Ljud-/Videoanteckningar</string>
<string name="index_srtm_parts">delar</string>
<string name="index_srtm_ele">Höjdkurvor</string>
@ -1259,7 +1259,10 @@
<string name="fav_point_emoticons_message">Vi ändrade namnet på din favoritpunkt till %1$s för att underlätta din smiley i filnamnet.</string>
<string name="speed_limit_exceed_message">Välj hur mycket hastighetsgränsen måste överskridas för att du ska få ett röstmeddelande.</string>
<string name="speed_limit_exceed">Tolerans för hastighetsgräns</string>
<string name="anonymous_user_hint">En anonym användare kan inte:\n- skapa grupper;\n- synkronisera grupper och enheter med servern;\n- hantera grupper och enheter på ett personligt ställe på webbplatsen.</string>
<string name="anonymous_user_hint">Anonyma användare kan inte:
\n- Skapa grupper;
\n- Synkronisera grupper och enheter med servern;
\n- Hantera grupper och enheter i en personlig instrumentpanel på webbplatsen.</string>
<string name="anonymous_user">Anonym användare</string>
<string name="logged_as">Inloggad som %1$s</string>
<string name="configure_map">Konfigurera kartan</string>
@ -1357,11 +1360,11 @@
<string name="notes">Anteckningar</string>
<string name="online_map">Online-karta</string>
<string name="share_note">Dela anteckning</string>
<string name="plugin_nautical_descr">Om du aktiverar denna vy ändras kartstilen till Nautisk och visar alla sjömärken och sjökortssymboler.
<string name="plugin_nautical_descr">Detta plugin berikar OsmAnds kart- och navigationsapp för att också producera nautiska kartor för båtliv, segling och andra typer av vattensporter.
\n
\nEn kartfil som innehåller alla nautiska symboler globalt finns tillgänglig som en enda nedladdning med namnet \'World seamarks\'.
\nEtt speciellt karttillägg för OsmAnd kommer att tillhandahålla alla nautiska navigationsmärken och kartsymboler, både för inland och för närliggande navigering. Beskrivningen av varje navigeringsmärke innehåller de detaljer som behövs för att identifiera dem och deras betydelse (kategori, form, färg, sekvens, referens etc.).
\n
\nDenna vy kan ändras genom att antingen inaktivera den här igen eller genom att ändra kartstilen under Konfigurera kartor.</string>
\nFör att återgå till en av OsmAnds konventionella kartstilar, helt enkelt avaktivera detta plugin igen, eller ändra \'Kartstil\' under \'Konfigurera karta\' efter önskemål.</string>
<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
\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>
@ -1415,12 +1418,12 @@
<string name="shared_string_more">Mer…</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_remember_my_choice">Kom ihåg mitt val</string>
<string name="shared_string_remember_my_choice">Kom ihåg valet</string>
<string name="shared_string_refresh">Uppdatera</string>
<string name="shared_string_download">Hämta</string>
<string name="shared_string_downloading">Laddar ner…</string>
<string name="shared_string_download_successful">Hämtningen lyckades</string>
<string name="shared_string_unexpected_error">Ett oväntat fel uppstod</string>
<string name="shared_string_download_successful">Nedladdat</string>
<string name="shared_string_unexpected_error">Oväntat fel</string>
<string name="shared_string_action_template">Åtgärd {0}</string>
<string name="shared_string_close">Stäng</string>
<string name="shared_string_exit">Utgång</string>
@ -1430,10 +1433,10 @@
<string name="shared_string_map">Karta</string>
<string name="shared_string_favorite">Favorit</string>
<string name="shared_string_favorites">Favoriter</string>
<string name="shared_string_add_to_favorites">Lägg till i Favoriter</string>
<string name="shared_string_add_to_favorites">Lägg till i \'Favoriter\'</string>
<string name="shared_string_my_location">Min position</string>
<string name="shared_string_my_places">Mina platser</string>
<string name="shared_string_my_favorites">Mina favoriter</string>
<string name="shared_string_my_favorites">Favoriter</string>
<string name="shared_string_tracks">Mina spår</string>
<string name="shared_string_currently_recording_track">Spelar för tillfället in spår</string>
<string name="shared_string_audio">Ljud</string>
@ -1459,21 +1462,21 @@
<string name="your_edits">Dina redigeringar</string>
<string name="osmand_parking_overdue">över tiden</string>
<string name="delay_to_start_navigation_descr">Ange väntetid att stanna kvar på ruttplaneringsskärmen.</string>
<string name="delay_to_start_navigation">Börja sväng-efter-sväng-navigering efter …</string>
<string name="delay_to_start_navigation">Starta sväng-för-sväng-vägledning efter …</string>
<string name="shared_string_go">Kör</string>
<string name="local_osm_changes_upload_all_confirm">Du håller på att skicka %1$d ändring(ar) till OSM. Är du säker?</string>
<string name="confirmation_to_clear_history">Vill du tömma historiken?</string>
<string name="local_osm_changes_upload_all_confirm">Är du säker på att du vill ladda upp %1$d ändringar till OSM\?</string>
<string name="confirmation_to_clear_history">Rensa historik\?</string>
<string name="current_route">Aktuell rutt</string>
<string name="osm_changes_added_to_local_edits">OSM-ändringar lades till i lokala ändringar</string>
<string name="mark_to_delete">Markera för att ta bort</string>
<string name="confirm_usage_speed_cameras">I många länder (Tyskland, Frankrike, Italien och andra) är det inte tillåtet att använda varningar för hastighetskameror. OsmAnd tar inget ansvar om du bryter mot lagen. Tryck på Ja endast om du får använda denna funktion.</string>
<string name="confirm_usage_speed_cameras">I många länder (Tyskland, Frankrike, Italien och andra) är användning av hastighetskameravarningar olaglig. OsmAnd tar inget ansvar om du bryter mot lagen. Klicka bara på \'Ja\' om du är berättigad att använda den här funktionen.</string>
<string name="welmode_download_maps">Hämta kartor</string>
<string name="welcome_select_region">För att avspegla dina trafiksignaler och -förordningar på ett korrekt sätt, välj den region du kör i:</string>
<string name="welcome_text">OsmAnd erbjuder global frånkopplad kartsurfning och frånkopplad navigering.</string>
<string name="welcome_header">Välkommen</string>
<string name="agps_info">A-GPS-info</string>
<string name="shared_string_message">Meddelande</string>
<string name="agps_data_last_downloaded">A-GPS-data senast nedladdade: %1$s</string>
<string name="agps_data_last_downloaded">A-GPS-data har laddats ner: %1$s</string>
<string name="shared_string_do_not_use">Använd inte</string>
<string name="shared_string_address">Adress</string>
<string name="shared_string_show_description">Visa beskrivning.</string>
@ -1488,9 +1491,9 @@
<string name="index_name_netherlands">Europa - Nederländerna</string>
<string name="rendering_value_highContrastRoads_name">Högkontrastvägar</string>
<string name="rendering_value__name">Standard</string>
<string name="application_dir_change_warning3">Kopiera OsmAnds datafiler till den nya destinationen?</string>
<string name="application_dir_change_warning3">Flytta OsmAnds datafiler till den nya destinationen\?</string>
<string name="specified_directiory_not_writeable">Kunde inte skapa kartor i den angivna mappen</string>
<string name="copying_osmand_file_failed">Kopieringen misslyckades</string>
<string name="copying_osmand_file_failed">Det gick inte att flytta filer</string>
<string name="storage_directory_external">Extern lagring</string>
<string name="storage_directory_multiuser">Lagring för flera användare</string>
<string name="storage_directory_internal_app">Internt appminne</string>
@ -1512,16 +1515,16 @@
<string name="shared_string_wikipedia">Wikipedia</string>
<string name="local_indexes_cat_wiki">Wikipedia</string>
<string name="shared_string_show_details">Visa detaljer</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">Är du säker på att du vill ta bort %1$d anteckningar\?</string>
<string name="download_wikipedia_maps">Wikipedia</string>
<string name="shared_string_import2osmand">Importera till OsmAnd</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="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_th">Thai</string>
<string name="lang_te">Telugu</string>
<string name="lang_nn">Norska (nynorska)</string>
<string name="lang_nn">Norska (Nynorska)</string>
<string name="lang_new">Newar/Nepal Bhasa</string>
<string name="lang_ms">Malajiska</string>
<string name="lang_ht">Haitiska</string>
@ -1565,7 +1568,7 @@
<string name="rendering_value_translucent_blue_name">Genomskinlig blå</string>
<string name="rendering_value_purple_name">Purpur</string>
<string name="rendering_value_translucent_purple_name">Genomskinlig purpur</string>
<string name="restart_is_required">Starta om appen manuellt för att ändringarna ska börja gälla.</string>
<string name="restart_is_required">En omstart krävs för att tillämpa ändringen.</string>
<string name="rendering_attr_currentTrackColor_name">GPX-färg</string>
<string name="rendering_value_yellow_name">Gul</string>
<string name="rendering_value_default13_name">Standard (13)</string>
@ -1589,8 +1592,8 @@
<string name="shared_string_undo">ÅNGRA</string>
<string name="shared_string_skip">Hoppa över</string>
<string name="app_name_osmand">OsmAnd</string>
<string name="routing_attr_avoid_shuttle_train_name">Undvik pendeltåg</string>
<string name="routing_attr_avoid_shuttle_train_description">Undvik att använda pendeltåg</string>
<string name="routing_attr_avoid_shuttle_train_name">Inget pendeltåg</string>
<string name="routing_attr_avoid_shuttle_train_description">Undviker att använda pendeltåg</string>
<string name="plugin_settings">Insticksprogram</string>
<string name="traffic_warning_hazard">Varning</string>
<string name="tab_title_basic">Grundläggande</string>
@ -1600,7 +1603,7 @@
<string name="opening_at">Öppnar</string>
<string name="closing_at">Stänger</string>
<string name="av_locations">Platser</string>
<string name="av_locations_descr">GPX-fil med anteckningar om platser.</string>
<string name="av_locations_descr">GPX-fil med platser.</string>
<string name="poi_dialog_poi_type">Typ av POI</string>
<string name="add_opening_hours">Lägg till öppettider</string>
<string name="contact_info">Kontaktinformation</string>
@ -1620,7 +1623,7 @@
<string name="simulate_your_location_stop_descr">Sluta simulera din plats.</string>
<string name="simulate_your_location_descr">Simulera din plats med en beräknad rutt eller med ett inspelat GPX-spår.</string>
<string name="downloads_left_template">%1$s nedladdningar kvar</string>
<string name="favourites_edit_dialog_title">Information om favoriter</string>
<string name="favourites_edit_dialog_title">Favoritinformation</string>
<string name="roads">Vägar</string>
<string name="favourites_context_menu_add">Lägg till favorit</string>
<string name="default_speed_system_descr">Ange enhet för hastighet.</string>
@ -1634,7 +1637,7 @@
<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_navigation">Navigering</string>
<string name="osmand_running_in_background">Körs i bakgrunden</string>
<string name="osmand_running_in_background">Kör i bakgrunden</string>
<string name="favorite_category_add_new">Lägg till ny</string>
<string name="favorite_category_select">Välj kategori</string>
<string name="count_of_lines">Antal rader</string>
@ -1653,7 +1656,7 @@
<string name="activate_srtm_plugin">Aktivera modulen SRTM</string>
<string name="later">Senare</string>
<string name="get_full_version">Fullversionen</string>
<string name="favorite_category_dublicate_message">Det angivna kategorinamnet finns redan. Ange ett annat namn.</string>
<string name="favorite_category_dublicate_message">Använd ett kategorinamn som inte redan finns.</string>
<string name="favorite_category_name">Kategorinamn</string>
<string name="favorite_category_add_new_title">Lägg till en ny kategori</string>
<string name="file_size_in_mb">%.1f MB</string>
@ -1668,9 +1671,9 @@
<string name="share_menu_location">Dela platsen</string>
<string name="shared_string_send">Sänd</string>
<string name="hillshade_layer_disabled">Skuggad relief-lager inaktiverat</string>
<string name="show_on_start_description">\'Av\' startar kartskärmen direkt.</string>
<string name="show_on_start_description">\'Av\' startar kartan direkt.</string>
<string name="map_downloaded">Karta hämtad</string>
<string name="map_downloaded_descr">Kartan över %1$s har hämtats, och du kan nu börja använda den.</string>
<string name="map_downloaded_descr">%1$s -kartan är redo att användas.</string>
<string name="go_to_map">Visa kartan</string>
<string name="shared_string_qr_code">QR-kod</string>
<string name="enter_country_name">Ange land</string>
@ -1693,7 +1696,7 @@
<string name="versions_item">Versioner</string>
<string name="contact_us">Kontakta oss</string>
<string name="osm_edit_created_poi">Skapat en OSM POI</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">Världskarta (täcker hela världen vid låg zoomnivå) saknas eller är föråldrad. Överväg att ladda ner den för en global översikt.</string>
<string name="shared_string_upload">Skicka</string>
<string name="map_legend">Teckenförklaring</string>
<string name="shared_string_update">Uppdatering</string>
@ -1721,9 +1724,9 @@
<string name="osn_comment_dialog_title">Lägg till kommentar</string>
<string name="osn_reopen_dialog_title">Öppna anteckning igen</string>
<string name="osn_close_dialog_title">Stäng anteckning</string>
<string name="osn_add_dialog_success">En anteckning har skapats utan problem</string>
<string name="osn_add_dialog_success">Anteckningen har skapats</string>
<string name="osn_add_dialog_error">Det gick inte att skapa anteckningen.</string>
<string name="osn_close_dialog_success">Anteckningen stängdes utan problem</string>
<string name="osn_close_dialog_success">Anteckningen stängd</string>
<string name="osn_close_dialog_error">Det gick inte att stänga anteckningen.</string>
<string name="context_menu_item_delete_waypoint">Ta bort GPX-waypoint?</string>
<string name="context_menu_item_edit_waypoint">Redigera GPX-waypoint</string>
@ -1767,8 +1770,8 @@
<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="no_location_permission">Ge platsåtkomst.</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_camera_permission">Ge kameraåtkomst.</string>
<string name="no_microphone_permission">Ge mikrofonåtkomst.</string>
<string name="select_voice_provider">Välj röstvägledning</string>
<string name="select_voice_provider_descr">Välj eller hämta röstvägledning för ditt språk.</string>
<string name="impassable_road_desc">Välj de vägar du vill undvika under navigering.</string>
@ -1790,7 +1793,7 @@
<string name="starting_point">Startpunkt</string>
<string name="item_removed">Post borttagen</string>
<string name="n_items_removed">poster raderade</string>
<string name="shared_string_undo_all">ÅNGRA ALLA</string>
<string name="shared_string_undo_all">Ångra allt</string>
<string name="rendering_attr_hideIcons_name">POI-ikoner</string>
<string name="switch_start_finish">Skifta startpunkt och destination</string>
<string name="number_of_contributors">Antal bidragsgivare</string>
@ -1798,10 +1801,10 @@
<string name="reports_for">Rapport för</string>
<string name="shared_string_select">Välj</string>
<string name="shared_string_remove">Ta bort</string>
<string name="clear_updates_proposition_message">Du kan ta bort hämtade uppdateringar och få tillbaka originalkartan</string>
<string name="clear_updates_proposition_message">Ta bort hämtade uppdateringar och få tillbaka originalkartan</string>
<string name="add_time_span">Lägg till tidsspann</string>
<string name="road_blocked">Blockerad väg</string>
<string name="data_is_not_available">Inga data tillgängliga</string>
<string name="data_is_not_available">Ingen data tillgänglig</string>
<string name="rendering_attr_hideUnderground_name">Underjordiska objekt</string>
<string name="shared_string_read_more">Läs mer</string>
<string name="rec_split_storage_size">Lagringsutrymme</string>
@ -1810,18 +1813,18 @@
<string name="shared_string_save_changes">Spara ändringar</string>
<string name="find_parking">Hitta en parkeringsplats</string>
<string name="show_polygons">Visa polygoner</string>
<string name="rendering_attr_showMtbRoutes_name">Visa MTB-rutter</string>
<string name="rendering_attr_showMtbRoutes_name">Visa mountainbike spår</string>
<string name="select_map_markers">Välj kartmarkörer</string>
<string name="shared_string_reverse_order">Omvänd ordning</string>
<string name="show_map_markers_description">Aktivera kartmarkörerna.</string>
<string name="clear_active_markers_q">Vill du ta bort alla aktiva markörer?</string>
<string name="clear_markers_history_q">Vill du radera kartmarkörshistoriken?</string>
<string name="clear_active_markers_q">Ta bort alla aktiva markörer\?</string>
<string name="clear_markers_history_q">Radera kartmarkörshistoriken\?</string>
<string name="active_markers">Aktiva markörer</string>
<string name="map_markers">Kartmarkörer</string>
<string name="map_marker">Kartmarkör</string>
<string name="add_points_to_map_markers_q">Vill du lägga till alla punkter i Kartmarkörer?</string>
<string name="add_points_to_map_markers_q">Lägg till alla punkter som kartmarkörer\?</string>
<string name="shared_string_add_to_map_markers">Lägg till i Kartmarkörer</string>
<string name="consider_turning_polygons_off">Rekommendationen är att slå av rendering av polygoner.</string>
<string name="consider_turning_polygons_off">Det är rekommenderat att slå av rendering av polygoner.</string>
<string name="map_marker_1st">Första kartmarkör</string>
<string name="map_marker_2nd">Andra kartmarkör</string>
<string name="shared_string_toolbar">Verktygsfält</string>
@ -1839,34 +1842,34 @@
<string name="donations">Donationer</string>
<string name="number_of_recipients">Antal mottagare</string>
<string name="osm_user_stat">Redigeringar %1$s, rang %2$s, redigeringar totalt %3$s</string>
<string name="osm_editors_ranking">Ranglista OSM-redigerare</string>
<string name="osm_editors_ranking">OSM Editor rankning</string>
<string name="osm_live_subscription">OsmAnd Live-prenumeration</string>
<string name="osm_live_subscribe_btn">Prenumerera</string>
<string name="osm_live_email_desc">Krävs för att ge er information om bidrag.</string>
<string name="osm_live_user_public_name">Publikt namn</string>
<string name="osm_live_email_desc">Behövs för att uppdatera dig om dina bidrag.</string>
<string name="osm_live_user_public_name">Offentligt namn</string>
<string name="osm_live_hide_user_name">Visa inte mitt namn i rapporter</string>
<string name="osm_live_month_cost">Månadskostnad</string>
<string name="osm_live_month_cost">Kostnad per månad</string>
<string name="osm_live_month_cost_desc">Månadsbetalning</string>
<string name="osm_live_active">Aktiv</string>
<string name="osm_live_not_active">Inaktiv</string>
<string name="osm_live_enter_email">Ange en giltig e-postadress</string>
<string name="osm_live_enter_user_name">Ange publikt namn</string>
<string name="osm_live_enter_user_name">Ange ett offentligt namn</string>
<string name="osm_live_thanks">Tack för att du stödjer OsmAnd!
\nFör att aktivera alla nya funktioner behöver du starta om OsmAnd.</string>
<string name="osm_live_region_desc">Delar av din donation kommer att skickas till OSM-användare som skickar in kartändringar i det området.</string>
<string name="osm_live_subscription_settings">Prenumerationsinställningar</string>
<string name="osm_live_ask_for_purchase">Köp en OsmAnd Live-prenumeration först</string>
<string name="osm_live_ask_for_purchase">Köp först ett abonnemang på OsmAnd Live</string>
<string name="show_transparency_seekbar">Visa transparent sökfält</string>
<string name="recalculate_route">Beräkna om rutten</string>
<string name="shared_string_topbar">Toppfält</string>
<string name="storage_directory_shared">Delat minne</string>
<string name="avoid_road">Undvik väg</string>
<string name="storage_directory_readonly_desc">Den för tillfället valda datalagringsmappen är skrivskyddad. Lagringsmappen har tillfälligt ändrats till internminnet. Välj en giltig datalagringsmapp.</string>
<string name="shared_string_move_up">Flytta upp</string>
<string name="shared_string_move_down">Flytta ned</string>
<string name="storage_directory_readonly_desc">Växlade till internminnet eftersom den valda datalagringsmappen är skrivskyddad. Välj en skrivbar lagringskatalog.</string>
<string name="shared_string_move_up">Flytta </string>
<string name="shared_string_move_down">Flytta </string>
<string name="finish_navigation">Avsluta navigeringen</string>
<string name="full_report">Fullständig rapport</string>
<string name="open_street_map_login_and_pass">OpenStreetMap inloggning och lösenord</string>
<string name="open_street_map_login_and_pass">OSM-användarnamn och lösenord</string>
<string name="no_map_markers_found">Lägg till kartmarkörer via kartan</string>
<string name="no_waypoints_found">Hittar inga waypoints</string>
<string name="map_widget_bearing">Relativ bäring</string>
@ -1897,12 +1900,12 @@
<string name="rendering_value_medium_name">Mellan</string>
<string name="rendering_value_bold_name">Tjock</string>
<string name="report">Rapporter</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">Appen får nu skriva till extern lagring, men måste startas igen för att göra det.</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.
\nEn del av inkomsterna går tillbaka till OSM-gemenskapen och betalas ut för varje OSM-bidrag.
\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">Tillgänglighetsplugin: Ingen destination inställd</string>
<string name="map_widget_magnetic_bearing">Magnetisk bäring</string>
<string name="rec_split_clip_length">Klipplängd</string>
<string name="file_name_containes_illegal_char">Filnamnet innehåller ogiltiga tecken</string>
@ -1968,7 +1971,7 @@
<string name="no_inet_connection_desc_map">Krävs för att hämta kartor.</string>
<string name="search_location">Söker efter plats…</string>
<string name="storage_free_space">Oanvänt utrymme</string>
<string name="storage_place_description">OsmAnds lagringsplats för data (för kartor, GPX-filer med mera): %1$s.</string>
<string name="storage_place_description">OsmAnds lagringsplats för data (för kartor, spårfiler med mera): %1$s.</string>
<string name="give_permission">Bevilja tillstånd</string>
<string name="allow_access_location">Tillåt platsåtkomst</string>
<string name="update_all_maps_now">Uppdatera alla kartor nu\?</string>
@ -1978,7 +1981,7 @@
<string name="replace_favorite_confirmation">Är du säker på att du vill ersätta favoriten %1$s?</string>
<string name="clear_tile_data">Rensa alla rutor</string>
<string name="search_hint">Ange stad, adress och POI-namn</string>
<string name="donation_to_osm">Donation till OpenStreetMap-gemenskapen</string>
<string name="donation_to_osm">Donation till OSM-communityn</string>
<string name="get_it">Skaffa det</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>
@ -1993,7 +1996,7 @@
<string name="save_track_precision">Minsta loggningsprecision</string>
<string name="save_track_precision_descr">Filter: Ingen loggning om inte denna noggrannhet uppnås.</string>
<string name="christmas_poi">Jul-POI</string>
<string name="christmas_desc_q">Visa Jul-POI?</string>
<string name="christmas_desc_q">Visa POI:er för julhelgen\?</string>
<string name="rendering_value_light_brown_name">Ljusbrun</string>
<string name="rendering_value_dark_brown_name">Mörkbrun</string>
<string name="rendering_attr_contourColorScheme_name">Färgschema för konturer</string>
@ -2004,26 +2007,26 @@
<string name="shared_string_recorded">Inspelat</string>
<string name="shared_string_record">Spela in</string>
<string name="gpx_logging_no_data">Inga data</string>
<string name="trip_rec_notification_settings_desc">Visa en systemavisering som gör att du kan starta trippinspelning.</string>
<string name="routing_attr_allow_motorway_name">Tillåt motorvägar</string>
<string name="routing_attr_allow_motorway_description">Tillåt motorvägar.</string>
<string name="trip_rec_notification_settings_desc">Visa ett systemmeddelande som gör det möjligt att starta trippinspelning.</string>
<string name="routing_attr_allow_motorway_name">Använd motorvägar</string>
<string name="routing_attr_allow_motorway_description">Tillåter motorvägar.</string>
<string name="wiki_around">Närliggande Wikipedia-artiklar</string>
<string name="search_map_hint">Sök stad eller region</string>
<string name="search_map_hint">Stad eller region</string>
<string name="route_roundabout_short">Tag den %1$d avfarten och kör</string>
<string name="upload_poi">Ladda upp POI</string>
<string name="route_calculation">Ruttberäkning</string>
<string name="gpx_no_tracks_title">Du har inga GPX-filer ännu</string>
<string name="gpx_no_tracks_title_folder">Du kan också lägga till GPX-filer i mappen</string>
<string name="gpx_no_tracks_title">Du har inga spårfiler än</string>
<string name="gpx_no_tracks_title_folder">Du kan också lägga till spårfiler i mappen</string>
<string name="gpx_add_track">Lägg till mer…</string>
<string name="shared_string_appearance">Utseende</string>
<string name="trip_rec_notification_settings">Aktivera snabbstart av inspelning</string>
<string name="christmas_desc">Med tanke på den kommande julen och nyåret så kan du välja att visa POI som har med julen att göra: julgranar, julmarknader med mera.</string>
<string name="trip_rec_notification_settings">Aktivera snabbinspelning</string>
<string name="christmas_desc">Förutse jul- och nyårsferier kan du välja att visa tillhörande intressepunkter som julgranar och marknader etc.</string>
<string name="rendering_attr_contourWidth_name">Bredd på konturlinjen</string>
<string name="rendering_attr_hideWaterPolygons_description">Vatten</string>
<string name="osm_live_payment_desc">Prenumerationsavgiften faktureras varje månad. Avbryt den när som helst i Google Play.</string>
<string name="donation_to_osm_desc">En del av din donation skickas till OSM-användare som skickar in ändringar till OpenStreetMap. Kostnaden för abonnemanget förblir densamma.</string>
<string name="osm_live_payment_desc">Prenumerationen debiteras per vald period. Avbryt det på Google Play när som helst.</string>
<string name="donation_to_osm_desc">En del av din donation skickas till OSM-bidragsgivare. Prenumerationskostnaden förblir densamma.</string>
<string name="osm_live_subscription_desc">En prenumeration aktiverar uppdateringar varje timme, dag eller vecka och obegränsade nedladdningar av alla kartor globalt.</string>
<string name="osm_live_banner_desc">Erhåll obegränsade karthämtningar och kartuppdateringar oftare än en gång i månaden: varje vecka, dagligen eller varje timme.</string>
<string name="osm_live_banner_desc">Få obegränsad nedladdning av kartor, lägg till uppdateringar varje vecka, dagligen eller till och med varje timme.</string>
<string name="rendering_value_low_name">Låg</string>
<string name="rendering_attr_contourWidth_description">Bredd på konturlinjen</string>
<string name="rendering_value_high_name">Hög</string>
@ -2069,7 +2072,7 @@
\n</string>
<string name="navigate_point_olc_info_short">Kort OLC
\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">Det gick inte att flytta filen.</string>
<string name="shared_string_move">Flytta</string>
<string name="shared_string_gpx_tracks">Spår</string>
<string name="routing_attr_driving_style_name">Körstil</string>
@ -2104,7 +2107,7 @@
<string name="quick_action_add_marker_descr">Tryck på åtgärdsknappen sätter en kartmarkör i centrum av skärmen.</string>
<string name="add_new_folder">Lägg till ny mapp</string>
<string name="points_delete_multiple_succesful">Punkt(er) togs bort.</string>
<string name="points_delete_multiple">Du håller på att ta bort %1$d punkt(er). Är du säker?</string>
<string name="points_delete_multiple">Är du säker på att du vill ta bort %1$d punkt(er)\?</string>
<string name="route_points_category_name">Kurvor att passera längs rutten</string>
<string name="track_points_category_name">Vägpunkter, sevärdheter, namngivna funktioner</string>
<string name="shared_string_gpx_track">Spår</string>
@ -2135,11 +2138,11 @@
<string name="select_street">Välj gator</string>
<string name="shared_string_in_name">i %1$s</string>
<string name="type_address">Ange adress</string>
<string name="type_city_town">Ange stad</string>
<string name="type_city_town">Skriv stad/samhälle/ort</string>
<string name="type_postcode">Ange postnummer</string>
<string name="nearest_cities">Närmaste städer</string>
<string name="select_city">Välj stad</string>
<string name="select_postcode">Välj postnummer</string>
<string name="select_postcode">Postnummer sökning</string>
<string name="quick_action_auto_zoom">Autozoomning på/av</string>
<string name="quick_action_showhide_osmbugs_descr">Knapp för att visa eller dölja OSM-anteckningar på kartan.</string>
<string name="restart_search">Starta om sökningen</string>
@ -2153,7 +2156,7 @@
<string name="favorite_group_name">Gruppnamn</string>
<string name="change_color">Ändra färg</string>
<string name="edit_name">Redigera namn</string>
<string name="quick_action_add_destination">Lägg till destination</string>
<string name="quick_action_add_destination">Ange destination</string>
<string name="quick_action_replace_destination">Ersätt destination</string>
<string name="no_overlay">Inget överlägg</string>
<string name="no_underlay">Inget underlägg</string>
@ -2212,7 +2215,7 @@
<string name="mapillary_menu_title_dates">Datum</string>
<string name="mapillary_menu_edit_text_hint">Ange användarnamn</string>
<string name="mapillary_menu_title_username">Användarnamn</string>
<string name="animate_my_location">Animera min plats</string>
<string name="animate_my_location">Animera din egen position</string>
<string name="analyze_on_map">Analysera på kartan</string>
<string name="restore_purchases">Återställ köp</string>
<string name="shared_string_paused">Pausad</string>
@ -2396,15 +2399,15 @@
<string name="routing_attr_allow_private_name">Tillåt privat åtkomst</string>
<string name="routing_attr_allow_private_description">Tillåta åtkomst till privata områden.</string>
<string name="display_zoom_level">Visa zoom-nivå: %1$s</string>
<string name="animate_my_location_desc">Aktivera kartpanoreringsanimation av \'Min Position\' under navigering.</string>
<string name="animate_my_location_desc">Aktivera animerad kartpanning av \"Min position\" under navigering.</string>
<string name="shared_string_overview">Översikt</string>
<string name="quick_action_auto_zoom_desc">Ett tryck på den här åtgärdsknappen kommer att slå på/av automatisk zoomkarta enligt din hastighet.</string>
<string name="quick_action_auto_zoom_on">Aktivera autozoom karta</string>
<string name="quick_action_auto_zoom_off">Inaktivera autozoom karta</string>
<string name="quick_action_auto_zoom_desc">Knapp för att slå på eller av hastighetsstyrd automatisk zoom.</string>
<string name="quick_action_auto_zoom_on">Aktivera autozoom</string>
<string name="quick_action_auto_zoom_off">Inaktivera autozoom</string>
<string name="quick_action_add_first_intermediate">Lägg till första mellanliggande</string>
<string name="quick_action_add_destination_desc">Genom att trycka på den här åtgärdsknappen blir skärmens mittpunkt resmålet, alla tidigare valda mål blir den senaste mellanliggande destinationen.</string>
<string name="quick_action_replace_destination_desc">Genom att trycka på den här åtgärdsknappen kan skärmen centrera den nya ruttdestinationen och ersätta den tidigare valda destinationen (om någon).</string>
<string name="quick_action_add_first_intermediate_desc">Genom att trycka på denna åtgärdsknapp kommer skärmens mittpunkt att bli den första mellanliggande destinationen.</string>
<string name="quick_action_add_destination_desc">En knapp för att göra skärmen centrerad till ruttdestinationen, en tidigare vald destination skulle bli den sista mellandestinationen.</string>
<string name="quick_action_replace_destination_desc">En knapp för att göra skärmen centrerad till den nya ruttdestinationen och ersätta den tidigare valda destinationen (om någon).</string>
<string name="quick_action_add_first_intermediate_desc">En knapp för att göra skärmens centrum till den första mellanliggande destinationen.</string>
<string name="subscribe_email_desc">Anmäl dig till vår e-postlista om apprabatter och få 3 extra kartnedladdningar!</string>
<string name="depth_contour_descr">Havsdjupskonturer och sjömärken.</string>
<string name="sea_depth_thanks">Tack för att du köpt \"Nautiska djupkonturer\"</string>
@ -3358,4 +3361,50 @@
<string name="renew_subscription">Förnya prenumerationen</string>
<string name="in_grace_period">I nådeperioden</string>
<string name="on_hold">Pausad</string>
<string name="shared_string_night_map">Nattkarta</string>
<string name="add_online_source">Lägg till onlinekälla</string>
<string name="clear_tiles_warning">Om du använder dessa ändringar raderas cachade data för denna kakelkälla</string>
<string name="vessel_height_warning_link">Ställ in fartygets höjd</string>
<string name="vessel_height_warning">Du kan ställa in fartygets höjd för att undvika låga broar. Tänk på att om bron är rörlig kommer vi att använda dess höjd i öppet tillstånd.</string>
<string name="vessel_height_limit_description">Ställ in fartygets höjd för att undvika låga broar. Tänk på att om bron är rörlig kommer vi att använda dess höjd i öppet tillstånd.</string>
<string name="vessel_width_limit_description">Ställ in fartygets bredd för att undvika smala broar</string>
<string name="quick_action_showhide_mapillary_descr">En växling för att visa eller dölja Mapillary-lagret på kartan.</string>
<string name="routing_attr_length_description">Ange tillåten fordonslängd på rutter.</string>
<string name="routing_attr_length_name">Längdsgräns</string>
<string name="shared_string_bearing">Bäring</string>
<string name="item_deleted">%1$s har tagits bort</string>
<string name="speed_cameras_restart_descr">Starta om appen för att radera all hastighetskameradata.</string>
<string name="shared_string_uninstall_and_restart">Avinstallera och starta om</string>
<string name="speed_cameras_removed_descr">Den här enheten har inte hastighetskameror.</string>
<string name="app_mode_inline_skates">Rullskridskor</string>
<string name="quick_action_remove_next_destination">Ta bort närmaste destination</string>
<string name="use_volume_buttons_as_zoom_descr">Kontrollera zoomningsnivån för kartan med volymknapparna på enheten.</string>
<string name="use_volume_buttons_as_zoom">Volymknappar som zoom</string>
<string name="please_provide_point_name_error">Ange ett namn för punkten</string>
<string name="quick_action_remove_next_destination_descr">Raderar nästa destination på din rutt. Om det är den slutliga destinationen kommer navigationen att stoppas.</string>
<string name="add_hidden_group_info">Den tillagda punkten kommer inte att synas på kartan, eftersom den valda gruppen är dold kan du hitta den i \"%s\".</string>
<string name="app_mode_enduro_motorcycle">Enduro motorcykel</string>
<string name="app_mode_motor_scooter">Skoter</string>
<string name="app_mode_wheelchair">Rullstol</string>
<string name="app_mode_wheelchair_forward">Rullstol framåt</string>
<string name="show_start_dialog">Visa startdialogrutan</string>
<string name="trip_recording_show_start_dialog_setting">Om den är inaktiverad startar inspelningen direkt efter att du har tryckt på widgeten eller menyalternativet och hoppat över bekräftelsedialogrutan.</string>
<string name="customize_route_line">Anpassa ruttlinjen</string>
<string name="shared_string_route_line">Ruttlinje</string>
<string name="route_line_use_map_style_appearance">Ruttlinje skulle användas %1$s som anges i vald kartstil: %2$s.</string>
<string name="expired">Upphörd</string>
<string name="release_4_0_beta">• OsmAnd Live-uppdateringar flyttade till \"Nedladdningar&gt; Uppdateringar\"
\n
\n• Spår kan nu färga efter höjd, hastighet eller lutning.
\n
\n• Lagt till alternativ för att ändra utseendet på navigeringslinjen
\n
\n• Uppdaterad \"Trip recording\" -dialog
\n
\n</string>
<string name="update_all_maps_added">Uppdatera alla kartor som lagts till i %1$s\?</string>
<string name="exit_number">Utgångsnummer</string>
<string name="announce_when_exceeded">Meddela när den överskrids</string>
<string name="user_points">Användarpunkter</string>
<string name="output">Utgång</string>
</resources>

View file

@ -4072,7 +4072,11 @@
<string name="in_grace_period">Ek süre içinde</string>
<string name="on_hold">Beklemede</string>
<string name="expired">Süresi doldu</string>
<string name="release_4_0_beta">• OsmAnd Live güncellemeleri \"İndirmeler&gt; Güncellemeler\" bölümüne taşındı
<string name="release_4_0_beta">• Eş yükselti eğrilerini fit cinsinden indirme seçeneği eklendi
\n
\n • Güzergah Planla görünümü: noktalar veya grafikler arasında geçiş yapmak için sekmeler eklendi
\n
\n • OsmAnd Live güncellemeleri \"İndirmeler &gt; Güncellemeler\" bölümüne taşındı
\n
\n • Yollar artık rakım, hız veya eğime göre renklendirilebilir
\n
@ -4087,4 +4091,8 @@
<string name="user_points">Kullanıcı puanları</string>
<string name="output">Çıkış</string>
<string name="map_quick_action_pattern">%1$s → …</string>
<string name="shared_string_feet">fit</string>
<string name="srtm_unit_format">Eş yükselti eğrileri birimi biçimi</string>
<string name="srtm_download_list_help_message">OsmAnd, metre ve fit cinsinden eş yükselti eğrileri verileri sağlar. Biçimi değiştirmek için dosyayı yeniden indirmeniz gerekecek.</string>
<string name="srtm_download_single_help_message">Lütfen gerekli biçimi seçin. Biçimi değiştirmek için dosyayı yeniden indirmeniz gerekecek.</string>
</resources>

View file

@ -3926,4 +3926,6 @@
<string name="poi_karate">Карате</string>
<string name="poi_office_diplomatic">Дипломатичне відомство</string>
<string name="poi_bay_filter">Тип затоки</string>
<string name="poi_plateau">Плато</string>
<string name="poi_club_social">Суспільний клуб</string>
</resources>

View file

@ -4053,7 +4053,11 @@
<string name="shared_string_route_line">Лінія маршруту</string>
<string name="route_line_use_map_style_appearance">Лінія маршруту застосовуватиме %1$s, вказаний у вибраному стилі мапи: %2$s.</string>
<string name="specify_color_for_map_mode">Вкажіть колір для режиму мапи: %1$s.</string>
<string name="release_4_0_beta">• Оновлення OsmAnd Live переміщено до «Завантаження &gt;Оновлення»
<string name="release_4_0_beta">• Додана можливість завантаження контурних ліній у футах
\n
\n• Ландшафтне планування маршруту: додані вкладки для перемикання між точками або графіками
\n
\n• Оновлення OsmAnd Live переміщено до «Завантаження &gt;Оновлення»
\n
\n• Тепер треки можуть бути забарвлені за висотою, швидкістю або нахилом.
\n
@ -4084,4 +4088,8 @@
<string name="announce_when_exceeded">Повідомляти про перевищення</string>
<string name="user_points">Користувацькі точки</string>
<string name="output">Вивід</string>
<string name="srtm_download_list_help_message">OsmAnd надає дані горизонталей в метрах і футах. Щоб змінити формат, потрібно повторно завантажити файл.</string>
<string name="srtm_unit_format">Формат одиниць вимірювання горизонталей</string>
<string name="shared_string_feet">фути</string>
<string name="srtm_download_single_help_message">Виберіть потрібний формат. Щоб змінити формат, потрібно повторно завантажувати файл.</string>
</resources>

View file

@ -3926,4 +3926,6 @@
<string name="poi_hoops">籃圈</string>
<string name="poi_office_diplomatic">外交部</string>
<string name="poi_bay_filter">海灣類型</string>
<string name="poi_plateau">高原</string>
<string name="poi_club_social">社交俱樂部</string>
</resources>

View file

@ -4047,7 +4047,11 @@
<string name="shared_string_route_line">路線</string>
<string name="route_line_use_map_style_appearance">路線將會使用 %1$s 在選定的地圖樣式上指定的:%2$s。</string>
<string name="specify_color_for_map_mode">指定地圖模式的顏色:%1$s。</string>
<string name="release_4_0_beta">• OsmAnd Live 更新移動至「下載 &gt; 更新」
<string name="release_4_0_beta">• 新增以英呎為單位下載等高線
\n
\n • 規劃路線樣式:新增切換點與圖形的分頁
\n
\n • OsmAnd Live 更新移動至「下載 &gt; 更新」
\n
\n • 軌跡現在可以使用海拔、速度或坡度來填色
\n
@ -4079,4 +4083,8 @@
<string name="user_points">使用者點</string>
<string name="output">輸出</string>
<string name="map_quick_action_pattern">%1$s → …</string>
<string name="shared_string_feet">英呎</string>
<string name="srtm_unit_format">等高線單位格式</string>
<string name="srtm_download_list_help_message">OsmAnd 提供以公尺與英呎為單位的等高線資料。您將必須重新下載檔案以變更格式。</string>
<string name="srtm_download_single_help_message">請選取需要格式。您將必須重新下載檔案以變更格式。</string>
</resources>

View file

@ -4381,4 +4381,8 @@
<string name="poi_office_diplomatic">Diplomatic office</string>
<string name="poi_plateau">Plateau</string>
<string name="poi_club_social">Social club</string>
</resources>

View file

@ -19,8 +19,14 @@
<string name="user_points">User points</string>
<string name="announce_when_exceeded">Announce when exceeded</string>
<string name="exit_number">Exit number</string>
<string name="srtm_download_single_help_message">Please select the needed format. You will need to re-download the file to change the format.</string>
<string name="srtm_download_list_help_message">OsmAnd provides contour lines data in meters and feet. You will need to re-download the file to change the format.</string>
<string name="srtm_unit_format">Contour lines unit format</string>
<string name="shared_string_feet">feet</string>
<string name="update_all_maps_added">Update all maps added to %1$s?</string>
<string name="release_4_0_beta">
• Added option to download Contour lines in feet\n\n
• Plan Route landscape: added tabs to switch between points or graphs\n\n
• OsmAnd Live updates moved to \"Downloads > Updates\"\n\n
• Tracks now could be colorizing by altitude, speed, or slope.\n\n
• Added option to change the appearance of the navigation route line\n\n

View file

@ -18,11 +18,12 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.inapp.InAppPurchases.InAppPurchase;
import net.osmand.plus.inapp.InAppPurchases.InAppPurchase.PurchaseState;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscription;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscription.SubscriptionState;
import net.osmand.plus.inapp.InAppPurchases.PurchaseInfo;
import net.osmand.plus.inapp.InAppPurchasesImpl.InAppPurchaseLiveUpdatesOldSubscription;
import net.osmand.plus.inapp.util.BillingManager;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.srtmplugin.SRTMPlugin;
import net.osmand.util.Algorithms;
@ -174,7 +175,8 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
});
}
for (Purchase purchase : purchases) {
if (!purchase.isAcknowledged()) {
InAppSubscription subscription = getLiveUpdates().getSubscriptionBySku(purchase.getSku());
if (!purchase.isAcknowledged() || (subscription != null && !subscription.isPurchased())) {
onPurchaseFinished(purchase);
}
}
@ -310,8 +312,8 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
}
}
}
for (Entry<String, SubscriptionState> entry : subscriptionStateMap.entrySet()) {
SubscriptionState state = entry.getValue();
for (Entry<String, SubscriptionStateHolder> entry : subscriptionStateMap.entrySet()) {
SubscriptionState state = entry.getValue().state;
if (state == SubscriptionState.PAUSED || state == SubscriptionState.ON_HOLD) {
String sku = entry.getKey();
if (!result.contains(sku)) {
@ -492,15 +494,17 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
}
private PurchaseInfo getPurchaseInfo(Purchase purchase) {
return new PurchaseInfo(purchase.getSku(), purchase.getOrderId(), purchase.getPurchaseToken());
return new PurchaseInfo(purchase.getSku(), purchase.getOrderId(), purchase.getPurchaseToken(),
purchase.getPurchaseTime(), purchase.getPurchaseState(), purchase.isAcknowledged(), purchase.isAutoRenewing());
}
private void fetchInAppPurchase(@NonNull InAppPurchase inAppPurchase, @NonNull SkuDetails skuDetails, @Nullable Purchase purchase) {
if (purchase != null) {
inAppPurchase.setPurchaseState(InAppPurchase.PurchaseState.PURCHASED);
inAppPurchase.setPurchaseTime(purchase.getPurchaseTime());
inAppPurchase.setPurchaseState(PurchaseState.PURCHASED);
inAppPurchase.setPurchaseInfo(ctx, getPurchaseInfo(purchase));
} else {
inAppPurchase.setPurchaseState(InAppPurchase.PurchaseState.NOT_PURCHASED);
inAppPurchase.setPurchaseState(PurchaseState.NOT_PURCHASED);
inAppPurchase.restorePurchaseInfo(ctx);
}
inAppPurchase.setPrice(skuDetails.getPrice());
inAppPurchase.setPriceCurrencyCode(skuDetails.getPriceCurrencyCode());
@ -519,18 +523,17 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
}
if (inAppPurchase instanceof InAppSubscription) {
InAppSubscription s = (InAppSubscription) inAppPurchase;
SubscriptionState state = subscriptionStateMap.get(inAppPurchase.getSku());
s.setState(state == null ? SubscriptionState.UNDEFINED : state);
CommonPreference<String> statePref = ctx.getSettings().registerStringPreference(
s.getSku() + "_state", SubscriptionState.UNDEFINED.getStateStr()).makeGlobal();
s.setPrevState(SubscriptionState.getByStateStr(statePref.get()));
statePref.set(s.getState().getStateStr());
s.restoreState(ctx);
s.restoreExpireTime(ctx);
SubscriptionStateHolder stateHolder = subscriptionStateMap.get(s.getSku());
if (stateHolder != null) {
s.setState(ctx, stateHolder.state);
s.setExpireTime(ctx, stateHolder.expireTime);
}
if (s.getState().isGone() && s.hasStateChanged()) {
ctx.getSettings().LIVE_UPDATES_EXPIRED_FIRST_DLG_SHOWN_TIME.set(0L);
ctx.getSettings().LIVE_UPDATES_EXPIRED_SECOND_DLG_SHOWN_TIME.set(0L);
}
String introductoryPrice = skuDetails.getIntroductoryPrice();
String introductoryPricePeriod = skuDetails.getIntroductoryPricePeriod();
int introductoryPriceCycles = skuDetails.getIntroductoryPriceCycles();

View file

@ -29,6 +29,7 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.inapp.InAppPurchases.InAppPurchase;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscription;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscriptionIntroductoryInfo;
import net.osmand.plus.inapp.InAppPurchases.PurchaseInfo;
import net.osmand.plus.inapp.InAppPurchasesImpl.InAppPurchaseLiveUpdatesOldSubscription;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.util.Algorithms;
@ -48,7 +49,7 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
private List<ProductInfo> productInfos;
private OwnedPurchasesResult ownedSubscriptions;
private List<OwnedPurchasesResult> ownedInApps = new ArrayList<>();
private final List<OwnedPurchasesResult> ownedInApps = new ArrayList<>();
public InAppPurchaseHelperImpl(OsmandApplication ctx) {
super(ctx);
@ -233,15 +234,18 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
}
private PurchaseInfo getPurchaseInfo(InAppPurchaseData purchase) {
return new PurchaseInfo(purchase.getProductId(), purchase.getSubscriptionId(), purchase.getPurchaseToken());
return new PurchaseInfo(purchase.getProductId(), purchase.getSubscriptionId(), purchase.getPurchaseToken(),
purchase.getPurchaseTime(), purchase.getPurchaseState(), true, purchase.isAutoRenewing());
}
private void fetchInAppPurchase(@NonNull InAppPurchase inAppPurchase, @NonNull ProductInfo productInfo, @Nullable InAppPurchaseData purchaseData) {
if (purchaseData != null) {
inAppPurchase.setPurchaseState(InAppPurchase.PurchaseState.PURCHASED);
inAppPurchase.setPurchaseTime(purchaseData.getPurchaseTime());
inAppPurchase.setPurchaseInfo(ctx, getPurchaseInfo(purchaseData));
} else {
inAppPurchase.setPurchaseState(InAppPurchase.PurchaseState.NOT_PURCHASED);
inAppPurchase.restorePurchaseInfo(ctx);
}
inAppPurchase.setPrice(productInfo.getPrice());
inAppPurchase.setPriceCurrencyCode(productInfo.getCurrency());

View file

@ -3,10 +3,10 @@ package net.osmand;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import net.osmand.osm.io.NetworkUtils;
import net.osmand.plus.OsmandApplication;
@ -38,6 +38,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class AndroidNetworkUtils {
@ -56,6 +57,15 @@ public class AndroidNetworkUtils {
void onFilesUploadDone(@NonNull Map<File, String> errors);
}
public interface OnFilesDownloadCallback {
@Nullable
Map<String, String> getAdditionalParams(@NonNull File file);
void onFileDownloadProgress(@NonNull File file, int percent);
@WorkerThread
void onFileDownloadedAsync(@NonNull File file);
void onFilesDownloadDone(@NonNull Map<File, String> errors);
}
public static class RequestResponse {
private Request request;
private String response;
@ -74,35 +84,46 @@ public class AndroidNetworkUtils {
}
}
public interface OnRequestsResultListener {
void onResult(@NonNull List<RequestResponse> results);
public interface OnSendRequestsListener {
void onRequestSent(@NonNull RequestResponse response);
void onRequestsSent(@NonNull List<RequestResponse> results);
}
public static void sendRequestsAsync(final OsmandApplication ctx,
final List<Request> requests,
final OnRequestsResultListener listener) {
public static void sendRequestsAsync(@Nullable final OsmandApplication ctx,
@NonNull final List<Request> requests,
@Nullable final OnSendRequestsListener listener) {
new AsyncTask<Void, Void, List<RequestResponse>>() {
new AsyncTask<Void, RequestResponse, List<RequestResponse>>() {
@Override
protected List<RequestResponse> doInBackground(Void... params) {
List<RequestResponse> responses = new ArrayList<>();
for (Request request : requests) {
RequestResponse requestResponse;
try {
String response = sendRequest(ctx, request.getUrl(), request.getParameters(),
request.getUserOperation(), request.isToastAllowed(), request.isPost());
responses.add(new RequestResponse(request, response));
requestResponse = new RequestResponse(request, response);
} catch (Exception e) {
responses.add(new RequestResponse(request, null));
requestResponse = new RequestResponse(request, null);
}
responses.add(requestResponse);
publishProgress(requestResponse);
}
return responses;
}
@Override
protected void onProgressUpdate(RequestResponse... values) {
if (listener != null) {
listener.onRequestSent(values[0]);
}
}
@Override
protected void onPostExecute(@NonNull List<RequestResponse> results) {
if (listener != null) {
listener.onResult(results);
listener.onRequestsSent(results);
}
}
@ -146,7 +167,7 @@ public class AndroidNetworkUtils {
@Override
protected String doInBackground(Void... params) {
return downloadFile(url, fileToSave);
return downloadFile(url, fileToSave, false, null);
}
@Override
@ -158,8 +179,80 @@ public class AndroidNetworkUtils {
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null);
}
public static String sendRequest(OsmandApplication ctx, String url, Map<String, String> parameters,
String userOperation, boolean toastAllowed, boolean post) {
public static void downloadFilesAsync(final @NonNull String url,
final @NonNull List<File> files,
final @NonNull Map<String, String> parameters,
final @Nullable OnFilesDownloadCallback callback) {
new AsyncTask<Void, Object, Map<File, String>>() {
@Override
@NonNull
protected Map<File, String> doInBackground(Void... v) {
Map<File, String> errors = new HashMap<>();
for (final File file : files) {
final int[] progressValue = {0};
publishProgress(file, 0);
IProgress progress = null;
if (callback != null) {
progress = new NetworkProgress() {
@Override
public void progress(int deltaWork) {
progressValue[0] += deltaWork;
publishProgress(file, progressValue[0]);
}
};
}
try {
Map<String, String> params = new HashMap<>(parameters);
if (callback != null) {
Map<String, String> additionalParams = callback.getAdditionalParams(file);
if (additionalParams != null) {
params.putAll(additionalParams);
}
}
boolean firstPrm = !url.contains("?");
StringBuilder sb = new StringBuilder(url);
for (Entry<String, String> entry : params.entrySet()) {
sb.append(firstPrm ? "?" : "&").append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "UTF-8"));
firstPrm = false;
}
String res = downloadFile(sb.toString(), file, true, progress);
if (res != null) {
errors.put(file, res);
} else {
if (callback != null) {
callback.onFileDownloadedAsync(file);
}
}
} catch (Exception e) {
errors.put(file, e.getMessage());
}
publishProgress(file, Integer.MAX_VALUE);
}
return errors;
}
@Override
protected void onProgressUpdate(Object... objects) {
if (callback != null) {
callback.onFileDownloadProgress((File) objects[0], (Integer) objects[1]);
}
}
@Override
protected void onPostExecute(@NonNull Map<File, String> errors) {
if (callback != null) {
callback.onFilesDownloadDone(errors);
}
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null);
}
public static String sendRequest(@Nullable OsmandApplication ctx, @NonNull String url,
@Nullable Map<String, String> parameters,
@Nullable String userOperation, boolean toastAllowed, boolean post) {
HttpURLConnection connection = null;
try {
@ -177,7 +270,7 @@ public class AndroidNetworkUtils {
String paramsSeparator = url.indexOf('?') == -1 ? "?" : "&";
connection = NetworkUtils.getHttpURLConnection(params == null || post ? url : url + paramsSeparator + params);
connection.setRequestProperty("Accept-Charset", "UTF-8");
connection.setRequestProperty("User-Agent", Version.getFullVersion(ctx));
connection.setRequestProperty("User-Agent", ctx != null ? Version.getFullVersion(ctx) : "OsmAnd");
connection.setConnectTimeout(15000);
if (params != null && post) {
connection.setDoInput(true);
@ -200,9 +293,10 @@ public class AndroidNetworkUtils {
}
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
if (toastAllowed) {
String msg = userOperation
+ " " + ctx.getString(R.string.failed_op) + ": " + connection.getResponseMessage();
if (toastAllowed && ctx != null) {
String msg = (!Algorithms.isEmpty(userOperation) ? userOperation + " " : "")
+ ctx.getString(R.string.failed_op) + ": "
+ connection.getResponseMessage();
showToast(ctx, msg);
}
} else {
@ -233,17 +327,17 @@ public class AndroidNetworkUtils {
} catch (NullPointerException e) {
// that's tricky case why NPE is thrown to fix that problem httpClient could be used
if (toastAllowed) {
if (toastAllowed && ctx != null) {
String msg = ctx.getString(R.string.auth_failed);
showToast(ctx, msg);
}
} catch (MalformedURLException e) {
if (toastAllowed) {
if (toastAllowed && ctx != null) {
showToast(ctx, MessageFormat.format(ctx.getResources().getString(R.string.shared_string_action_template)
+ ": " + ctx.getResources().getString(R.string.shared_string_unexpected_error), userOperation));
}
} catch (IOException e) {
if (toastAllowed) {
if (toastAllowed && ctx != null) {
showToast(ctx, MessageFormat.format(ctx.getResources().getString(R.string.shared_string_action_template)
+ ": " + ctx.getResources().getString(R.string.shared_string_io_error), userOperation));
}
@ -277,18 +371,23 @@ public class AndroidNetworkUtils {
return res;
}
public static String downloadFile(@NonNull String url, @NonNull File fileToSave) {
public static String downloadFile(@NonNull String url, @NonNull File fileToSave, boolean gzip, @Nullable IProgress progress) {
String error = null;
try {
URLConnection connection = NetworkUtils.getHttpURLConnection(url);
connection.setConnectTimeout(CONNECTION_TIMEOUT);
connection.setReadTimeout(CONNECTION_TIMEOUT);
BufferedInputStream inputStream = new BufferedInputStream(connection.getInputStream(), 8 * 1024);
if (gzip) {
connection.setRequestProperty("Accept-Encoding", "deflate, gzip");
}
InputStream inputStream = gzip
? new GZIPInputStream(connection.getInputStream())
: new BufferedInputStream(connection.getInputStream(), 8 * 1024);
fileToSave.getParentFile().mkdirs();
OutputStream stream = null;
try {
stream = new FileOutputStream(fileToSave);
Algorithms.streamCopy(inputStream, stream);
Algorithms.streamCopy(inputStream, stream, progress, 1024);
stream.flush();
} finally {
Algorithms.closeStream(inputStream);
@ -307,12 +406,17 @@ public class AndroidNetworkUtils {
private static final String BOUNDARY = "CowMooCowMooCowCowCow";
public static String uploadFile(@NonNull String urlText, @NonNull File file, boolean gzip,
@NonNull Map<String, String> additionalParams, @Nullable Map<String, String> headers) throws IOException {
return uploadFile(urlText, new FileInputStream(file), file.getName(), gzip, additionalParams, headers);
@NonNull Map<String, String> additionalParams,
@Nullable Map<String, String> headers,
@Nullable IProgress progress) throws IOException {
return uploadFile(urlText, new FileInputStream(file), file.getName(), gzip, additionalParams, headers, progress);
}
public static String uploadFile(@NonNull String urlText, @NonNull InputStream inputStream, @NonNull String fileName, boolean gzip,
Map<String, String> additionalParams, @Nullable Map<String, String> headers) {
public static String uploadFile(@NonNull String urlText, @NonNull InputStream inputStream,
@NonNull String fileName, boolean gzip,
@NonNull Map<String, String> additionalParams,
@Nullable Map<String, String> headers,
@Nullable IProgress progress) {
URL url;
try {
boolean firstPrm = !urlText.contains("?");
@ -350,11 +454,11 @@ public class AndroidNetworkUtils {
ous.flush();
if (gzip) {
GZIPOutputStream gous = new GZIPOutputStream(ous, 1024);
Algorithms.streamCopy(bis, gous);
Algorithms.streamCopy(bis, gous, progress, 1024);
gous.flush();
gous.finish();
} else {
Algorithms.streamCopy(bis, ous);
Algorithms.streamCopy(bis, ous, progress, 1024);
}
ous.write(("\r\n--" + BOUNDARY + "--\r\n").getBytes());
@ -406,8 +510,19 @@ public class AndroidNetworkUtils {
@NonNull
protected Map<File, String> doInBackground(Void... v) {
Map<File, String> errors = new HashMap<>();
for (File file : files) {
for (final File file : files) {
final int[] progressValue = {0};
publishProgress(file, 0);
IProgress progress = null;
if (callback != null) {
progress = new NetworkProgress() {
@Override
public void progress(int deltaWork) {
progressValue[0] += deltaWork;
publishProgress(file, progressValue[0]);
}
};
}
try {
Map<String, String> params = new HashMap<>(parameters);
if (callback != null) {
@ -416,14 +531,14 @@ public class AndroidNetworkUtils {
params.putAll(additionalParams);
}
}
String res = uploadFile(url, file, gzip, params, headers);
String res = uploadFile(url, file, gzip, params, headers, progress);
if (res != null) {
errors.put(file, res);
}
} catch (Exception e) {
errors.put(file, e.getMessage());
}
publishProgress(file, 100);
publishProgress(file, Integer.MAX_VALUE);
}
return errors;
}
@ -484,4 +599,39 @@ public class AndroidNetworkUtils {
return post;
}
}
private abstract static class NetworkProgress implements IProgress {
@Override
public void startTask(String taskName, int work) {
}
@Override
public void startWork(int work) {
}
@Override
public abstract void progress(int deltaWork);
@Override
public void remaining(int remainingWork) {
}
@Override
public void finishTask() {
}
@Override
public boolean isIndeterminate() {
return false;
}
@Override
public boolean isInterrupted() {
return false;
}
@Override
public void setGeneralProgress(String genProgress) {
}
}
}

View file

@ -22,6 +22,8 @@ import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.StateListDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.StatFs;
@ -264,6 +266,11 @@ public class AndroidUtils {
return "";
}
public static String getFreeSpace(Context ctx, File dir) {
long size = AndroidUtils.getAvailableSpace(dir);
return AndroidUtils.formatSize(ctx, size);
}
public static View findParentViewById(View view, int id) {
ViewParent viewParent = view.getParent();
@ -856,11 +863,39 @@ public class AndroidUtils {
return result;
}
public static long getAvailableSpace(@NonNull OsmandApplication app) {
return getAvailableSpace(app.getAppPath(null));
}
public static long getTotalSpace(@NonNull OsmandApplication app) {
return getTotalSpace(app.getAppPath(null));
}
public static long getAvailableSpace(@Nullable File dir) {
if (dir != null && dir.canRead()) {
try {
StatFs fs = new StatFs(dir.getAbsolutePath());
return fs.getAvailableBlocksLong() * fs.getBlockSize();
if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR2) {
return fs.getAvailableBlocksLong() * fs.getBlockSizeLong();
} else {
return fs.getAvailableBlocks() * fs.getBlockSize();
}
} catch (IllegalArgumentException e) {
LOG.error(e);
}
}
return -1;
}
public static long getTotalSpace(@Nullable File dir) {
if (dir != null && dir.canRead()) {
try {
StatFs fs = new StatFs(dir.getAbsolutePath());
if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR2) {
return fs.getBlockCountLong() * fs.getBlockSizeLong();
} else {
return fs.getBlockCount() * fs.getBlockSize();
}
} catch (IllegalArgumentException e) {
LOG.error(e);
}
@ -887,13 +922,6 @@ public class AndroidUtils {
return -1;
}
public static float getUsedSpaceGb(File dir) {
if (dir.canRead()) {
return getTotalSpaceGb(dir) - getFreeSpaceGb(dir);
}
return -1;
}
public static CharSequence getStyledString(CharSequence baseString, CharSequence stringToInsertAndStyle,
CharacterStyle baseStyle, CharacterStyle replaceStyle) {
int indexOfPlaceholder = baseString.toString().indexOf(STRING_PLACEHOLDER);

View file

@ -184,7 +184,8 @@ public class AnalyticsHelper extends SQLiteOpenHelper {
String jsonStr = json.toString();
InputStream inputStream = new ByteArrayInputStream(jsonStr.getBytes());
String res = AndroidNetworkUtils.uploadFile(ANALYTICS_UPLOAD_URL, inputStream, ANALYTICS_FILE_NAME, true, additionalData, null);
String res = AndroidNetworkUtils.uploadFile(ANALYTICS_UPLOAD_URL, inputStream,
ANALYTICS_FILE_NAME, true, additionalData, null, null);
if (res != null) {
return;
}

View file

@ -31,6 +31,7 @@ import net.osmand.osm.MapPoiTypes;
import net.osmand.plus.activities.LocalIndexHelper;
import net.osmand.plus.activities.LocalIndexInfo;
import net.osmand.plus.activities.SavingTrackHelper;
import net.osmand.plus.backup.BackupHelper;
import net.osmand.plus.base.MapViewTrackingUtilities;
import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.download.ui.AbstractLoadLocalIndexTask;
@ -39,7 +40,6 @@ import net.osmand.plus.helpers.DayNightHelper;
import net.osmand.plus.helpers.LockHelper;
import net.osmand.plus.helpers.WaypointHelper;
import net.osmand.plus.inapp.InAppPurchaseHelperImpl;
import net.osmand.plus.itinerary.ItineraryHelper;
import net.osmand.plus.liveupdates.LiveUpdatesHelper;
import net.osmand.plus.mapmarkers.MapMarkersDbHelper;
import net.osmand.plus.mapmarkers.MapMarkersHelper;
@ -472,7 +472,7 @@ public class AppInitializer implements IProgress {
app.osmOAuthHelper = startupInit(new OsmOAuthHelper(app), OsmOAuthHelper.class);
app.oprAuthHelper = startupInit(new OprAuthHelper(app), OprAuthHelper.class);
app.onlineRoutingHelper = startupInit(new OnlineRoutingHelper(app), OnlineRoutingHelper.class);
app.itineraryHelper = startupInit(new ItineraryHelper(app), ItineraryHelper.class);
app.backupHelper = startupInit(new BackupHelper(app), BackupHelper.class);
initOpeningHoursParser();
}
@ -685,7 +685,7 @@ public class AppInitializer implements IProgress {
// restore backuped favorites to normal file
restoreBackupForFavoritesFiles();
notifyEvent(InitEvents.RESTORE_BACKUPS);
app.itineraryHelper.syncAllGroupsAsync();
app.mapMarkersHelper.syncAllGroupsAsync();
app.searchUICore.initSearchUICore();
checkLiveUpdatesAlerts();

View file

@ -445,6 +445,9 @@ public class ContextMenuAdapter {
ImageView imageView = (ImageView) convertView.findViewById(R.id.secondary_icon);
imageView.setImageDrawable(drawable);
imageView.setVisibility(View.VISIBLE);
if (secondaryDrawable == R.drawable.ic_action_additional_option) {
UiUtilities.rotateImageByLayoutDirection(imageView);
}
} else {
ImageView imageView = (ImageView) convertView.findViewById(R.id.secondary_icon);
if (imageView != null) {

View file

@ -17,7 +17,7 @@ import net.osmand.data.FavouritePoint;
import net.osmand.data.LatLon;
import net.osmand.plus.GeocodingLookupService.AddressLookupRequest;
import net.osmand.plus.mapmarkers.MapMarkersHelper;
import net.osmand.plus.itinerary.ItineraryGroup;
import net.osmand.plus.mapmarkers.MapMarkersGroup;
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
import net.osmand.plus.api.SQLiteAPI.SQLiteCursor;
import net.osmand.util.Algorithms;
@ -146,6 +146,14 @@ public class FavouritesDbHelper {
}
}
public long getLastUploadedTime() {
return context.getSettings().FAVORITES_LAST_UPLOADED_TIME.get();
}
public void setLastUploadedTime(long time) {
context.getSettings().FAVORITES_LAST_UPLOADED_TIME.set(time);
}
@Nullable
public Drawable getColoredIconForGroup(String groupName) {
String groupIdName = FavoriteGroup.convertDisplayNameToGroupIdName(context, groupName);
@ -272,15 +280,16 @@ public class FavouritesDbHelper {
}
private void runSyncWithMarkers(FavoriteGroup favGroup) {
ItineraryGroup group = context.getItineraryHelper().getMarkersGroup(favGroup);
MapMarkersHelper helper = context.getMapMarkersHelper();
MapMarkersGroup group = helper.getMarkersGroup(favGroup);
if (group != null) {
context.getItineraryHelper().runSynchronization(group);
helper.runSynchronization(group);
}
}
private boolean removeFromMarkers(FavoriteGroup favGroup) {
MapMarkersHelper helper = context.getMapMarkersHelper();
ItineraryGroup group = context.getItineraryHelper().getMarkersGroup(favGroup);
MapMarkersGroup group = helper.getMarkersGroup(favGroup);
if (group != null) {
helper.removeMarkersGroup(group);
return true;
@ -289,7 +298,8 @@ public class FavouritesDbHelper {
}
private void addToMarkers(FavoriteGroup favGroup) {
context.getItineraryHelper().addOrEnableGroup(favGroup);
MapMarkersHelper helper = context.getMapMarkersHelper();
helper.addOrEnableGroup(favGroup);
}
private File getInternalFile() {

View file

@ -18,7 +18,7 @@ import androidx.annotation.Nullable;
public class GPXDatabase {
private static final int DB_VERSION = 11;
private static final int DB_VERSION = 12;
private static final String DB_NAME = "gpx_database";
private static final String GPX_TABLE_NAME = "gpxTable";
@ -48,6 +48,7 @@ public class GPXDatabase {
private static final String GPX_COL_COLOR = "color";
private static final String GPX_COL_FILE_LAST_MODIFIED_TIME = "fileLastModifiedTime";
private static final String GPX_COL_FILE_LAST_UPLOADED_TIME = "fileLastUploadedTime";
private static final String GPX_COL_SPLIT_TYPE = "splitType";
private static final String GPX_COL_SPLIT_INTERVAL = "splitInterval";
@ -98,6 +99,7 @@ public class GPXDatabase {
GPX_COL_WPT_POINTS + " int, " +
GPX_COL_COLOR + " TEXT, " +
GPX_COL_FILE_LAST_MODIFIED_TIME + " long, " +
GPX_COL_FILE_LAST_UPLOADED_TIME + " long, " +
GPX_COL_SPLIT_TYPE + " int, " +
GPX_COL_SPLIT_INTERVAL + " double, " +
GPX_COL_API_IMPORTED + " int, " + // 1 = true, 0 = false
@ -133,6 +135,7 @@ public class GPXDatabase {
GPX_COL_WPT_POINTS + ", " +
GPX_COL_COLOR + ", " +
GPX_COL_FILE_LAST_MODIFIED_TIME + ", " +
GPX_COL_FILE_LAST_UPLOADED_TIME + ", " +
GPX_COL_SPLIT_TYPE + ", " +
GPX_COL_SPLIT_INTERVAL + ", " +
GPX_COL_API_IMPORTED + ", " +
@ -184,6 +187,7 @@ public class GPXDatabase {
private int splitType;
private double splitInterval;
private long fileLastModifiedTime;
private long fileLastUploadedTime;
private boolean apiImported;
private boolean showAsMarkers;
private boolean joinSegments;
@ -200,6 +204,11 @@ public class GPXDatabase {
this.color = color;
}
public GpxDataItem(File file, long fileLastUploadedTime) {
this.file = file;
this.fileLastUploadedTime = fileLastUploadedTime;
}
public GpxDataItem(File file, @NonNull GPXFile gpxFile) {
this.file = file;
readGpxParams(gpxFile);
@ -263,6 +272,10 @@ public class GPXDatabase {
return fileLastModifiedTime;
}
public long getFileLastUploadedTime() {
return fileLastUploadedTime;
}
public int getSplitType() {
return splitType;
}
@ -441,10 +454,13 @@ public class GPXDatabase {
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " + GPX_COL_SHOW_START_FINISH + " = ? " +
"WHERE " + GPX_COL_SHOW_START_FINISH + " IS NULL", new Object[]{1});
}
if (oldVersion < 12) {
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_FILE_LAST_UPLOADED_TIME + " long");
}
db.execSQL("CREATE INDEX IF NOT EXISTS " + GPX_INDEX_NAME_DIR + " ON " + GPX_TABLE_NAME + " (" + GPX_COL_NAME + ", " + GPX_COL_DIR + ");");
}
private boolean updateLastModifiedTime(GpxDataItem item) {
private boolean updateLastModifiedTime(@NonNull GpxDataItem item) {
SQLiteConnection db = openConnection(false);
if (db != null) {
try {
@ -464,6 +480,25 @@ public class GPXDatabase {
return false;
}
public boolean updateLastUploadedTime(@NonNull GpxDataItem item, long fileLastUploadedTime) {
SQLiteConnection db = openConnection(false);
if (db != null) {
try {
String fileName = getFileName(item.file);
String fileDir = getFileDir(item.file);
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " +
GPX_COL_FILE_LAST_UPLOADED_TIME + " = ? " +
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
new Object[] { fileLastUploadedTime, fileName, fileDir });
item.fileLastUploadedTime = fileLastUploadedTime;
} finally {
db.close();
}
return true;
}
return false;
}
public boolean rename(@Nullable GpxDataItem item, File currentFile, File newFile) {
SQLiteConnection db = openConnection(false);
if (db != null){
@ -721,11 +756,11 @@ public class GPXDatabase {
String gradientScaleType = item.gradientScaleType != null ? item.gradientScaleType.getTypeName() : null;
if (a != null) {
db.execSQL(
"INSERT INTO " + GPX_TABLE_NAME + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
"INSERT INTO " + GPX_TABLE_NAME + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
new Object[] {fileName, fileDir, a.totalDistance, a.totalTracks, a.startTime, a.endTime,
a.timeSpan, a.timeMoving, a.totalDistanceMoving, a.diffElevationUp, a.diffElevationDown,
a.avgElevation, a.minElevation, a.maxElevation, a.maxSpeed, a.avgSpeed, a.points, a.wptPoints,
color, item.file.lastModified(), item.splitType, item.splitInterval, item.apiImported ? 1 : 0,
color, item.file.lastModified(), item.fileLastUploadedTime, item.splitType, item.splitInterval, item.apiImported ? 1 : 0,
Algorithms.encodeStringSet(item.analysis.wptCategoryNames), item.showAsMarkers ? 1 : 0,
item.joinSegments ? 1 : 0, item.showArrows ? 1 : 0, item.showStartFinish ? 1 : 0, item.width,
item.gradientSpeedPalette, item.gradientAltitudePalette, item.gradientSlopePalette, gradientScaleType});
@ -735,6 +770,7 @@ public class GPXDatabase {
GPX_COL_DIR + ", " +
GPX_COL_COLOR + ", " +
GPX_COL_FILE_LAST_MODIFIED_TIME + ", " +
GPX_COL_FILE_LAST_UPLOADED_TIME + ", " +
GPX_COL_SPLIT_TYPE + ", " +
GPX_COL_SPLIT_INTERVAL + ", " +
GPX_COL_API_IMPORTED + ", " +
@ -747,8 +783,8 @@ public class GPXDatabase {
GPX_COL_GRADIENT_ALTITUDE_COLOR + ", " +
GPX_COL_GRADIENT_SLOPE_COLOR + ", " +
GPX_COL_GRADIENT_SCALE_TYPE +
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
new Object[] {fileName, fileDir, color, 0, item.splitType, item.splitInterval,
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
new Object[] {fileName, fileDir, color, 0, item.fileLastUploadedTime, item.splitType, item.splitInterval,
item.apiImported ? 1 : 0, item.showAsMarkers ? 1 : 0, item.joinSegments ? 1 : 0,
item.showArrows ? 1 : 0, item.showStartFinish ? 1 : 0, item.width,
Algorithms.gradientPaletteToString(item.gradientSpeedPalette),
@ -828,19 +864,20 @@ public class GPXDatabase {
int wptPoints = (int)query.getInt(17);
String color = query.getString(18);
long fileLastModifiedTime = query.getLong(19);
int splitType = (int)query.getInt(20);
double splitInterval = query.getDouble(21);
boolean apiImported = query.getInt(22) == 1;
String wptCategoryNames = query.getString(23);
boolean showAsMarkers = query.getInt(24) == 1;
boolean joinSegments = query.getInt(25) == 1;
boolean showArrows = query.getInt(26) == 1;
boolean showStartFinish = query.getInt(27) == 1;
String width = query.getString(28);
String gradientSpeedPalette = query.getString(29);
String gradientAltitudePalette = query.getString(30);
String gradientSlopePalette = query.getString(31);
String gradientScaleType = query.getString(32);
long fileLastUploadedTime = query.getLong(20);
int splitType = (int)query.getInt(21);
double splitInterval = query.getDouble(22);
boolean apiImported = query.getInt(23) == 1;
String wptCategoryNames = query.getString(24);
boolean showAsMarkers = query.getInt(25) == 1;
boolean joinSegments = query.getInt(26) == 1;
boolean showArrows = query.getInt(27) == 1;
boolean showStartFinish = query.getInt(28) == 1;
String width = query.getString(29);
String gradientSpeedPalette = query.getString(30);
String gradientAltitudePalette = query.getString(31);
String gradientSlopePalette = query.getString(32);
String gradientScaleType = query.getString(33);
GPXTrackAnalysis a = new GPXTrackAnalysis();
a.totalDistance = totalDistance;
@ -873,6 +910,7 @@ public class GPXDatabase {
GpxDataItem item = new GpxDataItem(new File(dir, fileName), a);
item.color = parseColor(color);
item.fileLastModifiedTime = fileLastModifiedTime;
item.fileLastUploadedTime = fileLastUploadedTime;
item.splitType = splitType;
item.splitInterval = splitInterval;
item.apiImported = apiImported;

View file

@ -78,6 +78,12 @@ public class GpxDbHelper {
return res;
}
public boolean updateLastUploadedTime(GpxDataItem item, long fileLastUploadedTime) {
boolean res = db.updateLastUploadedTime(item, fileLastUploadedTime);
putToCache(item);
return res;
}
public boolean updateGradientScalePalette(@NonNull GpxDataItem item, @NonNull GradientScaleType gradientScaleType, int[] palette) {
boolean res = db.updateGradientScaleColor(item, gradientScaleType, palette);
putToCache(item);

View file

@ -30,7 +30,8 @@ import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
import net.osmand.plus.helpers.GpxUiHelper.GPXInfo;
import net.osmand.plus.helpers.SearchHistoryHelper;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.itinerary.ItineraryGroup;
import net.osmand.plus.mapmarkers.MapMarkersGroup;
import net.osmand.plus.mapmarkers.MapMarkersHelper;
import net.osmand.plus.routing.GPXRouteParams.GPXRouteParamsBuilder;
import net.osmand.plus.track.GpxSplitType;
import net.osmand.util.Algorithms;
@ -291,10 +292,12 @@ public class GpxSelectionHelper {
return group;
}
private String getGroupName(GPXFile g) {
public String getGroupName(GPXFile g) {
String name = g.path;
if (g.showCurrentTrack) {
name = getString(R.string.shared_string_currently_recording_track);
} else if (Algorithms.isEmpty(name)) {
name = getString(R.string.current_route);
} else {
int i = name.lastIndexOf('/');
if (i >= 0) {
@ -795,7 +798,7 @@ public class GpxSelectionHelper {
boolean addToHistory) {
GpxDataItem dataItem = app.getGpxDbHelper().getItem(new File(gpx.path));
if (canAddToMarkers && show && dataItem != null && dataItem.isShowAsMarkers()) {
app.getItineraryHelper().addOrEnableGroup(gpx);
app.getMapMarkersHelper().addOrEnableGroup(gpx);
}
return selectGpxFile(gpx, dataItem, show, notShowNavigationDialog, syncGroup, selectedByUser, addToHistory);
}
@ -822,9 +825,10 @@ public class GpxSelectionHelper {
}
private void syncGpxWithMarkers(GPXFile gpxFile) {
ItineraryGroup group = app.getItineraryHelper().getMarkersGroup(gpxFile);
MapMarkersHelper mapMarkersHelper = app.getMapMarkersHelper();
MapMarkersGroup group = mapMarkersHelper.getMarkersGroup(gpxFile);
if (group != null) {
app.getItineraryHelper().runSynchronization(group);
mapMarkersHelper.runSynchronization(group);
}
}

View file

@ -52,6 +52,7 @@ import net.osmand.plus.activities.SavingTrackHelper;
import net.osmand.plus.activities.actions.OsmAndDialogs;
import net.osmand.plus.api.SQLiteAPI;
import net.osmand.plus.api.SQLiteAPIImpl;
import net.osmand.plus.backup.BackupHelper;
import net.osmand.plus.base.MapViewTrackingUtilities;
import net.osmand.plus.download.DownloadIndexesThread;
import net.osmand.plus.download.DownloadService;
@ -66,7 +67,6 @@ import net.osmand.plus.helpers.WaypointHelper;
import net.osmand.plus.helpers.enums.DrivingRegion;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.inapp.InAppPurchaseHelper;
import net.osmand.plus.itinerary.ItineraryHelper;
import net.osmand.plus.mapmarkers.MapMarkersDbHelper;
import net.osmand.plus.mapmarkers.MapMarkersHelper;
import net.osmand.plus.measurementtool.MeasurementEditingContext;
@ -168,7 +168,7 @@ public class OsmandApplication extends MultiDexApplication {
OprAuthHelper oprAuthHelper;
MeasurementEditingContext measurementEditingContext;
OnlineRoutingHelper onlineRoutingHelper;
ItineraryHelper itineraryHelper;
BackupHelper backupHelper;
private Map<String, Builder> customRoutingConfigs = new ConcurrentHashMap<>();
private File externalStorageDirectory;
@ -470,8 +470,8 @@ public class OsmandApplication extends MultiDexApplication {
return onlineRoutingHelper;
}
public ItineraryHelper getItineraryHelper() {
return itineraryHelper;
public BackupHelper getBackupHelper() {
return backupHelper;
}
public TransportRoutingHelper getTransportRoutingHelper() {

View file

@ -5,6 +5,7 @@ import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.res.Resources;
import android.os.Handler;
import android.os.Message;
import android.widget.ProgressBar;
@ -204,7 +205,8 @@ public class ProgressImplementation implements IProgress {
work = -1;
progress = 0;
if (taskName != null) {
message = context.getResources().getString(R.string.finished_task) +" : "+ taskName; //$NON-NLS-1$
Resources resources = context.getResources();
message = resources.getString(R.string.ltr_or_rtl_combine_via_colon, resources.getString(R.string.finished_task), taskName);
mViewUpdateHandler.sendEmptyMessage(HANDLER_START_TASK);
}
}

View file

@ -442,15 +442,14 @@ public class UiUtilities {
} catch (Throwable e) { }
}
public static void rotateImageByLayoutDirection(ImageView image, int layoutDirection) {
public static void rotateImageByLayoutDirection(ImageView image) {
if (image == null) {
return;
}
int rotation = layoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL ? 180 : 0;
int rotation = AndroidUtils.getLayoutDirection(image.getContext()) == ViewCompat.LAYOUT_DIRECTION_RTL ? 180 : 0;
image.setRotationY(rotation);
}
public static void updateCustomRadioButtons(Context app, View buttonsView, boolean nightMode,
CustomRadioButtonType buttonType) {
int activeColor = ContextCompat.getColor(app, nightMode

View file

@ -28,7 +28,7 @@ import net.osmand.AndroidUtils;
import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.FavouritesDbHelper.FavoriteGroup;
import net.osmand.plus.mapmarkers.MapMarkersHelper;
import net.osmand.plus.itinerary.ItineraryGroup;
import net.osmand.plus.mapmarkers.MapMarkersGroup;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
@ -179,7 +179,7 @@ public class EditFavoriteGroupDialogFragment extends MenuBottomSheetDialogFragme
final MapMarkersHelper markersHelper = app.getMapMarkersHelper();
final FavoriteGroup favGroup = this.group;
final ItineraryGroup markersGr = app.getItineraryHelper().getMarkersGroup(this.group);
final MapMarkersGroup markersGr = markersHelper.getMarkersGroup(this.group);
final boolean synced = markersGr != null;
BaseBottomSheetItem markersGroupItem = new SimpleBottomSheetItem.Builder()
@ -192,7 +192,7 @@ public class EditFavoriteGroupDialogFragment extends MenuBottomSheetDialogFragme
if (synced) {
markersHelper.removeMarkersGroup(markersGr);
} else {
app.getItineraryHelper().addOrEnableGroup(favGroup);
markersHelper.addOrEnableGroup(favGroup);
}
dismiss();
MapActivity.launchMapActivityMoveToTop(getActivity());

View file

@ -526,7 +526,7 @@ public class FavoritesTreeFragment extends OsmandExpandableListFragment implemen
for (Map.Entry<String, Set<FavouritePoint>> entry : favoritesSelected.entrySet()) {
FavoriteGroup group = helper.getGroup(entry.getKey());
if (group != null && entry.getValue().size() == group.getPoints().size()) {
getMyApplication().getItineraryHelper().addOrEnableGroup(group);
markersHelper.addOrEnableGroup(group);
} else {
for (FavouritePoint fp : entry.getValue()) {
points.add(new LatLon(fp.getLatitude(), fp.getLongitude()));

View file

@ -13,6 +13,7 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.SQLiteTileSource;
import net.osmand.plus.Version;
import net.osmand.plus.download.SrtmDownloadItem;
import net.osmand.plus.download.ui.AbstractLoadLocalIndexTask;
import net.osmand.plus.voice.JSMediaCommandPlayerImpl;
import net.osmand.plus.voice.JSTTSCommandPlayerImpl;
@ -143,8 +144,6 @@ public class LocalIndexHelper {
return null;
}
public List<LocalIndexInfo> getLocalIndexInfos(String downloadName) {
List<LocalIndexInfo> list = new ArrayList<>();
LocalIndexInfo info = getLocalIndexInfo(LocalIndexType.MAP_DATA, downloadName, false, false);
@ -333,14 +332,15 @@ public class LocalIndexHelper {
if (mapPath.canRead()) {
for (File mapFile : listFilesSorted(mapPath)) {
if (mapFile.isFile() && mapFile.getName().endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)) {
String fileName = mapFile.getName();
LocalIndexType lt = LocalIndexType.MAP_DATA;
if (mapFile.getName().endsWith(IndexConstants.BINARY_SRTM_MAP_INDEX_EXT)) {
if (SrtmDownloadItem.isSrtmFile(fileName)) {
lt = LocalIndexType.SRTM_DATA;
} else if (mapFile.getName().endsWith(IndexConstants.BINARY_WIKI_MAP_INDEX_EXT)) {
} else if (fileName.endsWith(IndexConstants.BINARY_WIKI_MAP_INDEX_EXT)) {
lt = LocalIndexType.WIKI_DATA;
}
LocalIndexInfo info = new LocalIndexInfo(lt, mapFile, backup, app);
if (loadedMaps.containsKey(mapFile.getName()) && !backup) {
if (loadedMaps.containsKey(fileName) && !backup) {
info.setLoaded(true);
}
updateDescription(info);
@ -430,5 +430,4 @@ public class LocalIndexHelper {
return fileName;
}
}
}

View file

@ -94,6 +94,12 @@ public class MapActivityKeyListener implements KeyEvent.Callback {
mapActivity.getMapViewTrackingUtilities().backToLocationImpl();
} else if (keyCode == KeyEvent.KEYCODE_D) {
mapActivity.getMapViewTrackingUtilities().switchRotateMapMode();
} else if (keyCode == KeyEvent.KEYCODE_MINUS) {
mapActivity.changeZoom(-1);
return true;
} else if (keyCode == KeyEvent.KEYCODE_PLUS || keyCode == KeyEvent.KEYCODE_EQUALS) {
mapActivity.changeZoom(1);
return true;
} else if (mapScrollHelper.isAvailableKeyCode(keyCode)) {
return mapScrollHelper.onKeyUp(keyCode, event);
} else if (settings.EXTERNAL_INPUT_DEVICE.get() == PARROT_EXTERNAL_DEVICE) {
@ -121,13 +127,7 @@ public class MapActivityKeyListener implements KeyEvent.Callback {
return true;
}
} else if (settings.EXTERNAL_INPUT_DEVICE.get() == GENERIC_EXTERNAL_DEVICE) {
if (keyCode == KeyEvent.KEYCODE_MINUS) {
mapActivity.changeZoom(-1);
return true;
} else if (keyCode == KeyEvent.KEYCODE_PLUS || keyCode == KeyEvent.KEYCODE_EQUALS) {
mapActivity.changeZoom(1);
return true;
}
// currently doesn't process specific commands
} else if (OsmandPlugin.onMapActivityKeyUp(mapActivity, keyCode)) {
return true;
}

View file

@ -109,7 +109,7 @@ public class PluginInfoFragment extends BaseOsmAndFragment implements PluginStat
}
}
});
UiUtilities.rotateImageByLayoutDirection(closeButton, AndroidUtils.getLayoutDirection(app));
UiUtilities.rotateImageByLayoutDirection(closeButton);
Drawable pluginImage = plugin.getAssetResourceImage();
if (pluginImage != null) {

View file

@ -101,7 +101,7 @@ public class PluginsFragment extends BaseOsmAndFragment implements PluginStateLi
}
}
});
UiUtilities.rotateImageByLayoutDirection(closeButton, AndroidUtils.getLayoutDirection(app));
UiUtilities.rotateImageByLayoutDirection(closeButton);
adapter = new PluginsListAdapter(requireContext());

View file

@ -22,7 +22,6 @@ import android.media.MediaRecorder;
import android.media.SoundPool;
import android.net.Uri;
import android.os.Build;
import android.os.StatFs;
import android.provider.MediaStore;
import android.view.Display;
import android.view.KeyEvent;
@ -1607,13 +1606,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
double bitrate = (((p.videoBitRate + p.audioBitRate) / 8f) * 60f) / (1 << 30); // gigabytes per minute
double clipSpace = bitrate * AV_RS_CLIP_LENGTH.get();
double storageSize = AV_RS_STORAGE_SIZE.get();
double availableSpace = storageSize;
File dir = app.getAppPath("").getParentFile();
if (dir.canRead()) {
StatFs fs = new StatFs(dir.getAbsolutePath());
availableSpace = (double) (fs.getAvailableBlocks()) * fs.getBlockSize() / (1 << 30) - clipSpace;
}
double availableSpace = (double) AndroidUtils.getAvailableSpace(app) / (1 << 30) - clipSpace;
if (usedSpace + clipSpace > storageSize || clipSpace > availableSpace) {
Arrays.sort(files, new Comparator<File>() {

View file

@ -11,7 +11,6 @@ import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Bundle;
import android.os.StatFs;
import android.text.SpannableString;
import android.view.LayoutInflater;
import android.view.View;
@ -42,7 +41,6 @@ import net.osmand.plus.widgets.style.CustomTypefaceSpan;
import org.apache.commons.logging.Log;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
@ -381,16 +379,7 @@ public class MultimediaNotesFragment extends BaseSettingsFragment implements Cop
private void setupStorageSizePref(AudioVideoNotesPlugin plugin) {
ListPreferenceEx storageSize = (ListPreferenceEx) findPreference(plugin.AV_RS_STORAGE_SIZE.getId());
File dir = app.getAppPath("").getParentFile();
long size = 0;
if (dir.canRead()) {
try {
StatFs fs = new StatFs(dir.getAbsolutePath());
size = ((long) fs.getBlockSize() * (long) fs.getBlockCount()) / (1 << 30);
} catch (IllegalArgumentException e) {
log.error(e);
}
}
long size = AndroidUtils.getTotalSpace(app) / (1 << 30);
if (size > 0) {
int value = 1;
ArrayList<Integer> gbList = new ArrayList<>();

View file

@ -0,0 +1,580 @@
package net.osmand.plus.backup;
import android.annotation.SuppressLint;
import android.os.AsyncTask;
import android.provider.Settings;
import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import net.osmand.AndroidNetworkUtils;
import net.osmand.AndroidNetworkUtils.OnFilesDownloadCallback;
import net.osmand.AndroidNetworkUtils.OnFilesUploadCallback;
import net.osmand.AndroidNetworkUtils.OnRequestResultListener;
import net.osmand.AndroidNetworkUtils.OnSendRequestsListener;
import net.osmand.AndroidNetworkUtils.Request;
import net.osmand.AndroidNetworkUtils.RequestResponse;
import net.osmand.AndroidUtils;
import net.osmand.IndexConstants;
import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.GPXDatabase.GpxDataItem;
import net.osmand.plus.GpxDbHelper;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.inapp.InAppPurchaseHelper;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscription;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.util.Algorithms;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BackupHelper {
private final OsmandApplication app;
private final OsmandSettings settings;
private final FavouritesDbHelper favouritesHelper;
private final GpxDbHelper gpxHelper;
private static final String SERVER_URL = "https://osmand.net";
private static final String USER_REGISTER_URL = SERVER_URL + "/userdata/user-register";
private static final String DEVICE_REGISTER_URL = SERVER_URL + "/userdata/device-register";
private static final String UPLOAD_FILE_URL = SERVER_URL + "/userdata/upload-file";
private static final String LIST_FILES_URL = SERVER_URL + "/userdata/list-files";
private static final String DOWNLOAD_FILE_URL = SERVER_URL + "/userdata/download-file";
private static final String DELETE_FILE_URL = SERVER_URL + "/userdata/delete-file";
public final static int STATUS_SUCCESS = 0;
public final static int STATUS_PARSE_JSON_ERROR = 1;
public final static int STATUS_EMPTY_RESPONSE_ERROR = 2;
public final static int STATUS_SERVER_ERROR = 3;
public interface OnResultListener {
void onResult(int status, @Nullable String message, @Nullable JSONObject json);
}
public interface OnRegisterUserListener {
void onRegisterUser(int status, @Nullable String message);
}
public interface OnRegisterDeviceListener {
void onRegisterDevice(int status, @Nullable String message);
}
public interface OnDownloadFileListListener {
void onDownloadFileList(int status, @Nullable String message, @NonNull List<UserFile> userFiles);
}
public interface OnCollectLocalFilesListener {
void onFileCollected(@NonNull GpxFileInfo fileInfo);
void onFilesCollected(@NonNull List<GpxFileInfo> fileInfos);
}
public interface OnGenerateBackupInfoListener {
void onBackupInfoGenerated(@Nullable BackupInfo backupInfo, @Nullable String error);
}
public interface OnUploadFilesListener {
void onFileUploadProgress(@NonNull File file, int progress);
void onFilesUploadDone(@NonNull Map<File, String> errors);
}
public interface OnDeleteFilesListener {
void onFileDeleteProgress(@NonNull UserFile file);
void onFilesDeleteDone(@NonNull Map<UserFile, String> errors);
}
public interface OnDownloadFileListener {
void onFileDownloadProgress(@NonNull UserFile userFile, int progress);
@WorkerThread
void onFileDownloadedAsync(@NonNull File file);
void onFilesDownloadDone(@NonNull Map<File, String> errors);
}
public static class BackupInfo {
public List<UserFile> filesToDownload = new ArrayList<>();
public List<GpxFileInfo> filesToUpload = new ArrayList<>();
public List<UserFile> filesToDelete = new ArrayList<>();
public List<Pair<GpxFileInfo, UserFile>> filesToMerge = new ArrayList<>();
}
public BackupHelper(@NonNull OsmandApplication app) {
this.app = app;
this.settings = app.getSettings();
this.favouritesHelper = app.getFavorites();
this.gpxHelper = app.getGpxDbHelper();
}
@SuppressLint("HardwareIds")
private String getAndroidId() {
try {
return Settings.Secure.getString(app.getContentResolver(), Settings.Secure.ANDROID_ID);
} catch (Exception e) {
return null;
}
}
public static boolean isTokenValid(@NonNull String token) {
return token.matches("[0-9]+");
}
@Nullable
public String getOrderId() {
InAppPurchaseHelper purchaseHelper = app.getInAppPurchaseHelper();
InAppSubscription purchasedSubscription = purchaseHelper.getAnyPurchasedSubscription();
return purchasedSubscription != null ? purchasedSubscription.getOrderId() : null;
}
public String getDeviceId() {
return settings.BACKUP_DEVICE_ID.get();
}
public String getAccessToken() {
return settings.BACKUP_ACCESS_TOKEN.get();
}
public String getEmail() {
return settings.BACKUP_USER_EMAIL.get();
}
public boolean isRegistered() {
return !Algorithms.isEmpty(getDeviceId()) && !Algorithms.isEmpty(getAccessToken());
}
private void checkRegistered() throws UserNotRegisteredException {
if (Algorithms.isEmpty(getDeviceId()) || Algorithms.isEmpty(getAccessToken())) {
throw new UserNotRegisteredException();
}
}
public void registerUser(@NonNull String email, @Nullable final OnRegisterUserListener listener) {
Map<String, String> params = new HashMap<>();
params.put("email", email);
String orderId = getOrderId();
if (!Algorithms.isEmpty(orderId)) {
params.put("orderid", orderId);
}
params.put("deviceid", app.getUserAndroidId());
AndroidNetworkUtils.sendRequestAsync(app, USER_REGISTER_URL, params, "Register user", true, true, new OnRequestResultListener() {
@Override
public void onResult(String resultJson) {
int status;
String message;
if (!Algorithms.isEmpty(resultJson)) {
try {
JSONObject result = new JSONObject(resultJson);
String statusStr = result.getString("status");
if (statusStr.equals("ok")) {
message = "You have been registered successfully. Please check for email with activation code.";
status = STATUS_SUCCESS;
} else {
message = "User registration error: " + statusStr;
status = STATUS_SERVER_ERROR;
}
} catch (JSONException e) {
message = "User registration error: json parsing";
status = STATUS_PARSE_JSON_ERROR;
}
} else {
message = "User registration error: empty response";
status = STATUS_EMPTY_RESPONSE_ERROR;
}
if (listener != null) {
listener.onRegisterUser(status, message);
}
}
});
}
public void registerDevice(String token, @Nullable final OnRegisterDeviceListener listener) {
Map<String, String> params = new HashMap<>();
params.put("email", getEmail());
String orderId = getOrderId();
if (orderId != null) {
params.put("orderid", orderId);
}
String androidId = getAndroidId();
if (!Algorithms.isEmpty(androidId)) {
params.put("deviceid", androidId);
}
params.put("token", token);
AndroidNetworkUtils.sendRequestAsync(app, DEVICE_REGISTER_URL, params, "Register device", true, true, new OnRequestResultListener() {
@Override
public void onResult(String resultJson) {
int status;
String message;
if (!Algorithms.isEmpty(resultJson)) {
try {
JSONObject result = new JSONObject(resultJson);
settings.BACKUP_DEVICE_ID.set(result.getString("id"));
settings.BACKUP_USER_ID.set(result.getString("userid"));
settings.BACKUP_NATIVE_DEVICE_ID.set(result.getString("deviceid"));
settings.BACKUP_ACCESS_TOKEN.set(result.getString("accesstoken"));
settings.BACKUP_ACCESS_TOKEN_UPDATE_TIME.set(result.getString("udpatetime"));
status = STATUS_SUCCESS;
message = "Device have been registered successfully";
} catch (JSONException e) {
message = "Device registration error: json parsing";
status = STATUS_PARSE_JSON_ERROR;
}
} else {
message = "Device registration error: empty response";
status = STATUS_EMPTY_RESPONSE_ERROR;
}
if (listener != null) {
listener.onRegisterDevice(status, message);
}
}
});
}
public void uploadFiles(@NonNull List<GpxFileInfo> gpxFiles, @Nullable final OnUploadFilesListener listener) throws UserNotRegisteredException {
checkRegistered();
Map<String, String> params = new HashMap<>();
params.put("deviceid", getDeviceId());
params.put("accessToken", getAccessToken());
Map<String, String> headers = new HashMap<>();
headers.put("Accept-Encoding", "deflate, gzip");
final Map<File, GpxFileInfo> gpxInfos = new HashMap<>();
for (GpxFileInfo gpxFile : gpxFiles) {
gpxInfos.put(gpxFile.file, gpxFile);
}
final File favoritesFile = favouritesHelper.getExternalFile();
AndroidNetworkUtils.uploadFilesAsync(UPLOAD_FILE_URL, new ArrayList<>(gpxInfos.keySet()), true, params, headers, new OnFilesUploadCallback() {
@Nullable
@Override
public Map<String, String> getAdditionalParams(@NonNull File file) {
Map<String, String> additionaParams = new HashMap<>();
GpxFileInfo gpxFileInfo = gpxInfos.get(file);
if (gpxFileInfo != null) {
additionaParams.put("name", gpxFileInfo.getFileName(true));
additionaParams.put("type", Algorithms.getFileExtension(file));
gpxFileInfo.uploadTime = System.currentTimeMillis();
if (file.equals(favoritesFile)) {
favouritesHelper.setLastUploadedTime(gpxFileInfo.uploadTime);
} else {
GpxDataItem gpxItem = gpxHelper.getItem(file);
if (gpxItem != null) {
gpxHelper.updateLastUploadedTime(gpxItem, gpxFileInfo.uploadTime);
}
}
additionaParams.put("clienttime", String.valueOf(gpxFileInfo.uploadTime));
}
return additionaParams;
}
@Override
public void onFileUploadProgress(@NonNull File file, int progress) {
if (listener != null) {
listener.onFileUploadProgress(file, progress);
}
}
@Override
public void onFilesUploadDone(@NonNull Map<File, String> errors) {
if (errors.isEmpty()) {
settings.BACKUP_LAST_UPLOADED_TIME.set(System.currentTimeMillis() + 1);
}
if (listener != null) {
listener.onFilesUploadDone(errors);
}
}
});
}
public void deleteFiles(@NonNull List<UserFile> userFiles, @Nullable final OnDeleteFilesListener listener) throws UserNotRegisteredException {
checkRegistered();
Map<String, String> commonParameters = new HashMap<>();
commonParameters.put("deviceid", getDeviceId());
commonParameters.put("accessToken", getAccessToken());
final List<Request> requests = new ArrayList<>();
final Map<Request, UserFile> filesMap = new HashMap<>();
for (UserFile userFile : userFiles) {
Map<String, String> parameters = new HashMap<>(commonParameters);
parameters.put("name", userFile.getName());
parameters.put("type", userFile.getType());
Request r = new Request(DELETE_FILE_URL, parameters, null, false, true);
requests.add(r);
filesMap.put(r, userFile);
}
AndroidNetworkUtils.sendRequestsAsync(null, requests, new OnSendRequestsListener() {
@Override
public void onRequestSent(@NonNull RequestResponse response) {
if (listener != null) {
UserFile userFile = filesMap.get(response.getRequest());
if (userFile != null) {
listener.onFileDeleteProgress(userFile);
}
}
}
@Override
public void onRequestsSent(@NonNull List<RequestResponse> results) {
if (listener != null) {
Map<UserFile, String> errors = new HashMap<>();
for (RequestResponse response : results) {
UserFile userFile = filesMap.get(response.getRequest());
if (userFile != null) {
String responseStr = response.getResponse();
boolean success;
try {
JSONObject json = new JSONObject(responseStr);
String status = json.getString("status");
success = status.equalsIgnoreCase("ok");
} catch (JSONException e) {
success = false;
}
if (!success) {
errors.put(userFile, responseStr);
}
}
}
listener.onFilesDeleteDone(errors);
}
}
});
}
public void downloadFileList(@Nullable final OnDownloadFileListListener listener) throws UserNotRegisteredException {
checkRegistered();
Map<String, String> params = new HashMap<>();
params.put("deviceid", getDeviceId());
params.put("accessToken", getAccessToken());
AndroidNetworkUtils.sendRequestAsync(app, LIST_FILES_URL, params, "Download file list", true, false, new OnRequestResultListener() {
@Override
public void onResult(String resultJson) {
int status;
String message;
List<UserFile> userFiles = new ArrayList<>();
if (!Algorithms.isEmpty(resultJson)) {
try {
JSONObject result = new JSONObject(resultJson);
String totalZipSize = result.getString("totalZipSize");
String totalFiles = result.getString("totalFiles");
String totalFileVersions = result.getString("totalFileVersions");
JSONArray files = result.getJSONArray("uniqueFiles");
for (int i = 0; i < files.length(); i++) {
userFiles.add(new UserFile(files.getJSONObject(i)));
}
status = STATUS_SUCCESS;
message = "Total files: " + totalFiles + "\n" +
"Total zip size: " + AndroidUtils.formatSize(app, Long.parseLong(totalZipSize)) + "\n" +
"Total file versions: " + totalFileVersions;
} catch (JSONException | ParseException e) {
status = STATUS_PARSE_JSON_ERROR;
message = "Download file list error: json parsing";
}
} else {
status = STATUS_EMPTY_RESPONSE_ERROR;
message = "Download file list error: empty response";
}
if (listener != null) {
listener.onDownloadFileList(status, message, userFiles);
}
}
});
}
public void downloadFiles(@NonNull final Map<File, UserFile> filesMap, @Nullable final OnDownloadFileListener listener) throws UserNotRegisteredException {
checkRegistered();
Map<String, String> params = new HashMap<>();
params.put("deviceid", getDeviceId());
params.put("accessToken", getAccessToken());
AndroidNetworkUtils.downloadFilesAsync(DOWNLOAD_FILE_URL,
new ArrayList<>(filesMap.keySet()), params, new OnFilesDownloadCallback() {
@Nullable
@Override
public Map<String, String> getAdditionalParams(@NonNull File file) {
UserFile userFile = filesMap.get(file);
Map<String, String> additionaParams = new HashMap<>();
additionaParams.put("name", userFile.getName());
additionaParams.put("type", userFile.getType());
return additionaParams;
}
@Override
public void onFileDownloadProgress(@NonNull File file, int percent) {
if (listener != null) {
listener.onFileDownloadProgress(filesMap.get(file), percent);
}
}
@Override
public void onFileDownloadedAsync(@NonNull File file) {
if (listener != null) {
listener.onFileDownloadedAsync(file);
}
}
@Override
public void onFilesDownloadDone(@NonNull Map<File, String> errors) {
if (listener != null) {
listener.onFilesDownloadDone(errors);
}
}
});
}
@SuppressLint("StaticFieldLeak")
public void collectLocalFiles(@Nullable final OnCollectLocalFilesListener listener) {
AsyncTask<Void, GpxFileInfo, List<GpxFileInfo>> task = new AsyncTask<Void, GpxFileInfo, List<GpxFileInfo>>() {
private final OnCollectLocalFilesListener internalListener = new OnCollectLocalFilesListener() {
@Override
public void onFileCollected(@NonNull GpxFileInfo fileInfo) {
publishProgress(fileInfo);
}
@Override
public void onFilesCollected(@NonNull List<GpxFileInfo> fileInfos) {
}
};
private void loadGPXData(@NonNull File mapPath, @NonNull List<GpxFileInfo> result,
@Nullable OnCollectLocalFilesListener listener) {
if (mapPath.canRead()) {
loadGPXFolder(mapPath, result, "", listener);
}
}
private void loadGPXFolder(@NonNull File mapPath, @NonNull List<GpxFileInfo> result,
@NonNull String gpxSubfolder, @Nullable OnCollectLocalFilesListener listener) {
File[] listFiles = mapPath.listFiles();
if (listFiles != null) {
for (File gpxFile : listFiles) {
if (gpxFile.isDirectory()) {
String sub = gpxSubfolder.length() == 0 ? gpxFile.getName() : gpxSubfolder + "/"
+ gpxFile.getName();
loadGPXFolder(gpxFile, result, sub, listener);
} else if (gpxFile.isFile() && gpxFile.getName().toLowerCase().endsWith(IndexConstants.GPX_FILE_EXT)) {
GpxFileInfo info = new GpxFileInfo();
info.subfolder = gpxSubfolder;
info.file = gpxFile;
GpxDataItem gpxItem = gpxHelper.getItem(gpxFile);
if (gpxItem != null) {
info.uploadTime = gpxItem.getFileLastUploadedTime();
}
result.add(info);
if (listener != null) {
listener.onFileCollected(info);
}
}
}
}
}
@Override
protected List<GpxFileInfo> doInBackground(Void... voids) {
List<GpxFileInfo> result = new ArrayList<>();
GpxFileInfo favInfo = new GpxFileInfo();
favInfo.subfolder = "";
favInfo.file = favouritesHelper.getExternalFile();
favInfo.uploadTime = favouritesHelper.getLastUploadedTime();
result.add(favInfo);
if (listener != null) {
listener.onFileCollected(favInfo);
}
loadGPXData(app.getAppPath(IndexConstants.GPX_INDEX_DIR), result, internalListener);
return result;
}
@Override
protected void onProgressUpdate(GpxFileInfo... fileInfos) {
if (listener != null) {
listener.onFileCollected(fileInfos[0]);
}
}
@Override
protected void onPostExecute(List<GpxFileInfo> fileInfos) {
if (listener != null) {
listener.onFilesCollected(fileInfos);
}
}
};
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
@SuppressLint("StaticFieldLeak")
public void generateBackupInfo(@NonNull final List<GpxFileInfo> localFiles, @NonNull final List<UserFile> remoteFiles,
@Nullable final OnGenerateBackupInfoListener listener) {
final long backupLastUploadedTime = settings.BACKUP_LAST_UPLOADED_TIME.get();
AsyncTask<Void, Void, BackupInfo> task = new AsyncTask<Void, Void, BackupInfo>() {
@Override
protected BackupInfo doInBackground(Void... voids) {
BackupInfo info = new BackupInfo();
for (UserFile remoteFile : remoteFiles) {
boolean hasLocalFile = false;
for (GpxFileInfo localFile : localFiles) {
if (remoteFile.getName().equals(localFile.getFileName(true))) {
hasLocalFile = true;
long remoteUploadTime = remoteFile.getClienttimems();
long localUploadTime = localFile.uploadTime;
long localModifiedTime = localFile.file.lastModified();
if (remoteUploadTime == localUploadTime) {
if (localUploadTime < localModifiedTime) {
info.filesToUpload.add(localFile);
}
} else {
info.filesToMerge.add(new Pair<>(localFile, remoteFile));
}
break;
}
}
if (!hasLocalFile) {
if (backupLastUploadedTime > 0 && backupLastUploadedTime >= remoteFile.getClienttimems()) {
info.filesToDelete.add(remoteFile);
} else {
info.filesToDownload.add(remoteFile);
}
}
}
for (GpxFileInfo localFile : localFiles) {
boolean hasRemoteFile = false;
for (UserFile remoteFile : remoteFiles) {
if (localFile.getFileName(true).equals(remoteFile.getName())) {
hasRemoteFile = true;
break;
}
}
if (!hasRemoteFile) {
info.filesToUpload.add(localFile);
}
}
return info;
}
@Override
protected void onPostExecute(BackupInfo backupInfo) {
if (listener != null) {
listener.onBackupInfoGenerated(backupInfo, null);
}
}
};
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}

View file

@ -0,0 +1,335 @@
package net.osmand.plus.backup;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.plus.GPXDatabase.GpxDataItem;
import net.osmand.plus.GpxDbHelper;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.ProgressImplementation;
import net.osmand.plus.backup.BackupHelper.BackupInfo;
import net.osmand.plus.backup.BackupHelper.OnDeleteFilesListener;
import net.osmand.plus.backup.BackupHelper.OnDownloadFileListener;
import net.osmand.plus.backup.BackupHelper.OnUploadFilesListener;
import net.osmand.plus.importfiles.FavoritesImportTask;
import net.osmand.util.Algorithms;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import static net.osmand.IndexConstants.GPX_INDEX_DIR;
import static net.osmand.IndexConstants.TEMP_DIR;
public class BackupTask {
private final OsmandApplication app;
private final BackupHelper backupHelper;
private final OnBackupListener listener;
private final WeakReference<Context> contextRef;
private ProgressImplementation progress;
private final BackupInfo backupInfo;
private Map<File, String> uploadErrors;
private Map<File, String> downloadErrors;
private Map<UserFile, String> deleteErrors;
private String error;
private final TaskType[] backupTasks = {TaskType.UPLOAD_FILES, TaskType.DELETE_FILES};
private final TaskType[] restoreTasks = {TaskType.DOWNLOAD_FILES};
private Stack<TaskType> runningTasks = new Stack<>();
private enum TaskType {
UPLOAD_FILES,
DOWNLOAD_FILES,
DELETE_FILES
}
public interface OnBackupListener {
void onBackupDone(@Nullable Map<File, String> uploadErrors,
@Nullable Map<File, String> downloadErrors,
@Nullable Map<UserFile, String> deleteErrors, @Nullable String error);
}
public BackupTask(@NonNull BackupInfo backupInfo, @NonNull Context context, @Nullable OnBackupListener listener) {
this.contextRef = new WeakReference<>(context);
this.app = (OsmandApplication) context.getApplicationContext();
this.backupHelper = app.getBackupHelper();
this.backupInfo = backupInfo;
this.listener = listener;
}
public BackupInfo getBackupInfo() {
return backupInfo;
}
public Map<File, String> getUploadErrors() {
return uploadErrors;
}
public Map<File, String> getDownloadErrors() {
return downloadErrors;
}
public Map<UserFile, String> getDeleteErrors() {
return deleteErrors;
}
public String getError() {
return error;
}
public boolean runBackup() {
if (!runningTasks.empty()) {
return false;
}
initBackupTasks();
return runTasks();
}
public boolean runRestore() {
if (!runningTasks.empty()) {
return false;
}
initRestoreTasks();
return runTasks();
}
private void initBackupTasks() {
initData();
Stack<TaskType> tasks = new Stack<>();
for (int i = backupTasks.length - 1; i >= 0; i--) {
tasks.push(backupTasks[i]);
}
this.runningTasks = tasks;
onTasksInit();
}
private void initRestoreTasks() {
initData();
Stack<TaskType> tasks = new Stack<>();
for (int i = restoreTasks.length - 1; i >= 0; i--) {
tasks.push(restoreTasks[i]);
}
this.runningTasks = tasks;
onTasksInit();
}
private void initData() {
uploadErrors = null;
downloadErrors = null;
deleteErrors = null;
error = null;
}
private boolean runTasks() {
if (runningTasks.empty()) {
return false;
} else {
TaskType taskType = runningTasks.pop();
runTask(taskType);
return true;
}
}
private void runTask(@NonNull TaskType taskType) {
switch (taskType) {
case UPLOAD_FILES:
doUploadFiles();
break;
case DOWNLOAD_FILES:
doDownloadFiles();
break;
case DELETE_FILES:
doDeleteFiles();
break;
}
}
private void onTaskFinished(@NonNull TaskType taskType) {
if (!runTasks()) {
onTasksDone();
}
}
private void doUploadFiles() {
if (Algorithms.isEmpty(backupInfo.filesToUpload)) {
onTaskFinished(TaskType.UPLOAD_FILES);
return;
}
onTaskProgressUpdate("Upload files...");
try {
backupHelper.uploadFiles(backupInfo.filesToUpload, new OnUploadFilesListener() {
@Override
public void onFileUploadProgress(@NonNull File file, int progress) {
if (progress == 0) {
onTaskProgressUpdate(file.getName(), (int) (file.length() / 1024));
} else {
onTaskProgressUpdate(progress);
}
}
@Override
public void onFilesUploadDone(@NonNull Map<File, String> errors) {
uploadErrors = errors;
onTaskFinished(TaskType.UPLOAD_FILES);
}
});
} catch (UserNotRegisteredException e) {
onError("User is not registered");
}
}
private void doDownloadFiles() {
if (Algorithms.isEmpty(backupInfo.filesToDownload)) {
onTaskFinished(TaskType.DOWNLOAD_FILES);
return;
}
onTaskProgressUpdate("Download files...");
File favoritesFile = app.getFavorites().getExternalFile();
String favoritesFileName = favoritesFile.getName();
File tempFavoritesFile = null;
final Map<File, UserFile> filesMap = new HashMap<>();
for (UserFile userFile : backupInfo.filesToDownload) {
File file;
String fileName = userFile.getName();
if (favoritesFileName.equals(fileName)) {
file = new File(app.getAppPath(TEMP_DIR), fileName);
tempFavoritesFile = file;
} else {
file = new File(app.getAppPath(GPX_INDEX_DIR), fileName);
}
filesMap.put(file, userFile);
}
final File finalTempFavoritesFile = tempFavoritesFile;
try {
backupHelper.downloadFiles(filesMap, new OnDownloadFileListener() {
@Override
public void onFileDownloadProgress(@NonNull UserFile userFile, int progress) {
if (progress == 0) {
onTaskProgressUpdate(new File(userFile.getName()).getName(), userFile.getFilesize() / 1024);
} else {
onTaskProgressUpdate(progress);
}
}
@Override
public void onFileDownloadedAsync(@NonNull File file) {
UserFile userFile = filesMap.get(file);
long userFileTime = userFile.getClienttimems();
if (file.equals(finalTempFavoritesFile)) {
GPXFile gpxFile = GPXUtilities.loadGPXFile(finalTempFavoritesFile);
FavoritesImportTask.mergeFavorites(app, gpxFile, "", false);
finalTempFavoritesFile.delete();
app.getFavorites().getExternalFile().setLastModified(userFileTime);
} else {
file.setLastModified(userFileTime);
GpxDataItem item = new GpxDataItem(file, userFileTime);
app.getGpxDbHelper().add(item);
}
}
@Override
public void onFilesDownloadDone(@NonNull Map<File, String> errors) {
downloadErrors = errors;
onTaskFinished(TaskType.DOWNLOAD_FILES);
}
});
} catch (UserNotRegisteredException e) {
onError("User is not registered");
}
}
private void doDeleteFiles() {
if (Algorithms.isEmpty(backupInfo.filesToDelete)) {
onTaskFinished(TaskType.DELETE_FILES);
return;
}
onTaskProgressUpdate("Delete files...");
try {
backupHelper.deleteFiles(backupInfo.filesToDelete, new OnDeleteFilesListener() {
@Override
public void onFileDeleteProgress(@NonNull UserFile userFile) {
onTaskProgressUpdate(userFile.getName());
}
@Override
public void onFilesDeleteDone(@NonNull Map<UserFile, String> errors) {
deleteErrors = errors;
onTaskFinished(TaskType.DELETE_FILES);
}
});
} catch (UserNotRegisteredException e) {
onError("User is not registered");
}
}
private void onTasksInit() {
Context ctx = contextRef.get();
if (ctx instanceof Activity && AndroidUtils.isActivityNotDestroyed((Activity) ctx) && progress != null) {
progress = ProgressImplementation.createProgressDialog(ctx,
"Backup data", "Initializing...", ProgressDialog.STYLE_HORIZONTAL);
}
}
private void onTaskProgressUpdate(Object... objects) {
Context ctx = contextRef.get();
if (ctx instanceof Activity && AndroidUtils.isActivityNotDestroyed((Activity) ctx) && progress != null) {
if (objects != null) {
if (objects.length == 1) {
if (objects[0] instanceof String) {
progress.startTask((String) objects[0], -1);
} else if (objects[0] instanceof Integer) {
int progressValue = (Integer) objects[0];
if (progressValue < Integer.MAX_VALUE) {
progress.progress(progressValue);
} else {
progress.finishTask();
}
}
} else if (objects.length == 2) {
progress.startTask((String) objects[0], (Integer) objects[1]);
}
}
}
}
private void onError(@NonNull String message) {
this.error = message;
runningTasks.clear();
onTasksDone();
}
private void onTasksDone() {
if (listener != null) {
listener.onBackupDone(uploadErrors, downloadErrors, deleteErrors, error);
}
Context ctx = contextRef.get();
if (ctx instanceof Activity && AndroidUtils.isActivityNotDestroyed((Activity) ctx) && progress != null) {
progress.finishTask();
app.runInUIThread(new Runnable() {
@Override
public void run() {
try {
if (progress.getDialog().isShowing()) {
progress.getDialog().dismiss();
}
} catch (Exception e) {
//ignored
}
}
}, 300);
}
}
}

View file

@ -0,0 +1,65 @@
package net.osmand.plus.backup;
import net.osmand.util.Algorithms;
import java.io.File;
public class GpxFileInfo {
public File file;
public String subfolder;
public long uploadTime = 0;
private String name = null;
private int sz = -1;
private String fileName = null;
public String getName() {
if (name == null) {
name = formatName(file.getName());
}
return name;
}
private String formatName(String name) {
int ext = name.lastIndexOf('.');
if (ext != -1) {
name = name.substring(0, ext);
}
return name.replace('_', ' ');
}
// Usage: AndroidUtils.formatSize(v.getContext(), getSize() * 1024l);
public int getSize() {
if (sz == -1) {
if (file == null) {
return -1;
}
sz = (int) ((file.length() + 512) >> 10);
}
return sz;
}
public long getFileDate() {
if (file == null) {
return 0;
}
return file.lastModified();
}
public String getFileName(boolean includeSubfolder) {
String result;
if (fileName != null) {
result = fileName;
} else {
if (file == null) {
result = "";
} else {
result = fileName = file.getName();
}
}
if (includeSubfolder && !Algorithms.isEmpty(subfolder)) {
result = subfolder + "/" + result;
}
return result;
}
}

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