Merge pull request #10489 from osmandapp/master

update test branch
This commit is contained in:
Hardy 2020-12-29 18:49:49 +01:00 committed by GitHub
commit 52338e4098
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
54 changed files with 571 additions and 434 deletions

View file

@ -63,9 +63,9 @@ public class GeneralRouter implements VehicleRouter {
// cached values // cached values
private boolean restrictionsAware = true; private boolean restrictionsAware = true;
private float leftTurn; private float sharpTurn;
private float roundaboutTurn; private float roundaboutTurn;
private float rightTurn; private float slightTurn;
// speed in m/s // speed in m/s
private float minSpeed = 0.28f; private float minSpeed = 0.28f;
// speed in m/s // speed in m/s
@ -220,19 +220,19 @@ public class GeneralRouter implements VehicleRouter {
public void addAttribute(String k, String v) { public void addAttribute(String k, String v) {
attributes.put(k, v); attributes.put(k, v);
if(k.equals("restrictionsAware")) { if (k.equals("restrictionsAware")) {
restrictionsAware = parseSilentBoolean(v, restrictionsAware); restrictionsAware = parseSilentBoolean(v, restrictionsAware);
} else if(k.equals("leftTurn")) { } else if (k.equals("sharpTurn") || k.equals("leftTurn")) {
leftTurn = parseSilentFloat(v, leftTurn); sharpTurn = parseSilentFloat(v, sharpTurn);
} else if(k.equals("rightTurn")) { } else if (k.equals("slightTurn") || k.equals("rightTurn")) {
rightTurn = parseSilentFloat(v, rightTurn); slightTurn = parseSilentFloat(v, slightTurn);
} else if(k.equals("roundaboutTurn")) { } else if (k.equals("roundaboutTurn")) {
roundaboutTurn = parseSilentFloat(v, roundaboutTurn); roundaboutTurn = parseSilentFloat(v, roundaboutTurn);
} else if(k.equals("minDefaultSpeed") || k.equals("defaultSpeed")) { } else if (k.equals("minDefaultSpeed") || k.equals("defaultSpeed")) {
defaultSpeed = parseSilentFloat(v, defaultSpeed * 3.6f) / 3.6f; defaultSpeed = parseSilentFloat(v, defaultSpeed * 3.6f) / 3.6f;
} else if( k.equals("minSpeed")) { } else if (k.equals("minSpeed")) {
minSpeed = parseSilentFloat(v, minSpeed * 3.6f) / 3.6f; minSpeed = parseSilentFloat(v, minSpeed * 3.6f) / 3.6f;
} else if(k.equals("maxDefaultSpeed") || k.equals("maxSpeed")) { } else if (k.equals("maxDefaultSpeed") || k.equals("maxSpeed")) {
maxSpeed = parseSilentFloat(v, maxSpeed * 3.6f) / 3.6f; maxSpeed = parseSilentFloat(v, maxSpeed * 3.6f) / 3.6f;
} }
} }
@ -605,11 +605,11 @@ public class GeneralRouter implements VehicleRouter {
} }
public double getLeftTurn() { public double getLeftTurn() {
return leftTurn; return sharpTurn;
} }
public double getRightTurn() { public double getRightTurn() {
return rightTurn; return slightTurn;
} }
public double getRoundaboutTurn() { public double getRoundaboutTurn() {
@ -620,9 +620,13 @@ public class GeneralRouter implements VehicleRouter {
public double calculateTurnTime(RouteSegment segment, int segmentEnd, RouteSegment prev, int prevSegmentEnd) { public double calculateTurnTime(RouteSegment segment, int segmentEnd, RouteSegment prev, int prevSegmentEnd) {
float ts = getPenaltyTransition(segment.getRoad()); float ts = getPenaltyTransition(segment.getRoad());
float prevTs = getPenaltyTransition(prev.getRoad()); float prevTs = getPenaltyTransition(prev.getRoad());
if(prevTs != ts) {
return Math.abs(ts - prevTs) / 2; float totalPenalty = 0;
if (prevTs != ts) {
totalPenalty += Math.abs(ts - prevTs) / 2;
} }
// int[] pt = prev.getRoad().getPointTypes(prevSegmentEnd); // int[] pt = prev.getRoad().getPointTypes(prevSegmentEnd);
// if(pt != null) { // if(pt != null) {
// RouteRegion reg = prev.getRoad().region; // RouteRegion reg = prev.getRoad().region;
@ -635,26 +639,25 @@ public class GeneralRouter implements VehicleRouter {
// } // }
// } // }
if(segment.getRoad().roundabout() && !prev.getRoad().roundabout()) { if(segment.getRoad().roundabout() && !prev.getRoad().roundabout()) {
double rt = getRoundaboutTurn(); double rt = getRoundaboutTurn();
if(rt > 0) { if(rt > 0) {
return rt; totalPenalty += rt;
} }
} } else if (getLeftTurn() > 0 || getRightTurn() > 0) {
if (getLeftTurn() > 0 || getRightTurn() > 0) { double a1 = segment.getRoad().directionRoute(segment.getSegmentStart(),
double a1 = segment.getRoad().directionRoute(segment.getSegmentStart(), segment.getSegmentStart() < segmentEnd); segment.getSegmentStart() < segmentEnd);
double a2 = prev.getRoad().directionRoute(prevSegmentEnd, prevSegmentEnd < prev.getSegmentStart()); double a2 = prev.getRoad().directionRoute(prevSegmentEnd, prevSegmentEnd < prev.getSegmentStart());
double diff = Math.abs(MapUtils.alignAngleDifference(a1 - a2 - Math.PI)); double diff = Math.abs(MapUtils.alignAngleDifference(a1 - a2 - Math.PI));
// more like UT // more like UT
if (diff > 2 * Math.PI / 3) { if (diff > 2 * Math.PI / 3) {
return getLeftTurn(); totalPenalty += getLeftTurn();
} else if (diff > Math.PI / 3) { } else if (diff > Math.PI / 3) {
return getRightTurn(); totalPenalty += getRightTurn();
} }
return 0;
} }
return 0;
return totalPenalty;
} }

View file

@ -65,7 +65,6 @@
<meta-data android:name="com.sec.minimode.icon.landscape.normal" android:resource="@mipmap/icon" android:value="" /> <meta-data android:name="com.sec.minimode.icon.landscape.normal" android:resource="@mipmap/icon" android:value="" />
<activity android:name="net.osmand.plus.activities.HelpActivity" /> <activity android:name="net.osmand.plus.activities.HelpActivity" />
<activity android:name="net.osmand.plus.activities.ExitActivity" /> <activity android:name="net.osmand.plus.activities.ExitActivity" />
<activity android:name="net.osmand.plus.openplacereviews.OPRWebviewActivity" android:theme="@style/Theme.AppCompat.NoActionBar" />
<provider <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
@ -475,6 +474,15 @@
<data android:scheme="osmand-oauth" /> <data android:scheme="osmand-oauth" />
</intent-filter> </intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="opr-oauth" />
</intent-filter>
</activity> </activity>
<receiver android:name="net.osmand.plus.audionotes.MediaRemoteControlReceiver"> <receiver android:name="net.osmand.plus.audionotes.MediaRemoteControlReceiver">

View file

@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="?attr/bg_color"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:background="?attr/bg_color"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_height">
<TextView
android:id="@+id/toolbar_text"
android:textSize="@dimen/dialog_header_text_size"
android:textColor="?android:textColorPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
<WebView
android:id="@+id/printDialogWebview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>

View file

@ -2510,7 +2510,7 @@
<string name="poi_site_type_petroglyph">بتروجليف</string> <string name="poi_site_type_petroglyph">بتروجليف</string>
<string name="poi_site_type_necropolis">مقبرة كبيرة قديمة</string> <string name="poi_site_type_necropolis">مقبرة كبيرة قديمة</string>
<string name="poi_site_type_hut_circle">دائرة الكوخ</string> <string name="poi_site_type_hut_circle">دائرة الكوخ</string>
<string name="poi_site_type_settlement">مستعمرة</string> <string name="poi_site_type_settlement">مستوطنة/هجرة</string>
<string name="poi_site_type_fortification">حصن</string> <string name="poi_site_type_fortification">حصن</string>
<string name="poi_site_type_tumulus">تومولوس</string> <string name="poi_site_type_tumulus">تومولوس</string>
<string name="poi_site_type_megalith">المغليث حجر ضخم</string> <string name="poi_site_type_megalith">المغليث حجر ضخم</string>
@ -3672,4 +3672,8 @@
<string name="poi_lifeguard_base">منصة الانقاذ</string> <string name="poi_lifeguard_base">منصة الانقاذ</string>
<string name="poi_siren">صفارت إنذار</string> <string name="poi_siren">صفارت إنذار</string>
<string name="poi_community_gender_mixed">نوع المجتمع: مختلط</string> <string name="poi_community_gender_mixed">نوع المجتمع: مختلط</string>
<string name="poi_lavoir">مكان لغسل الملابس يدويا</string>
<string name="poi_waste_transfer_station">محطة نقل نفايات</string>
<string name="poi_weightbridge">ميزان المركبات</string>
<string name="poi_ranger_station">مكتب الحارس</string>
</resources> </resources>

View file

@ -4006,4 +4006,12 @@
<string name="profile_type_osmand_string">ملف تعريف أوسماند</string> <string name="profile_type_osmand_string">ملف تعريف أوسماند</string>
<string name="profile_type_user_string">ملف تعريف المستخدم</string> <string name="profile_type_user_string">ملف تعريف المستخدم</string>
<string name="reverse_all_points">عكس جميع النقاط</string> <string name="reverse_all_points">عكس جميع النقاط</string>
<string name="profile_by_default_description">حدد ملف التعريف، الذي سيتم استخدامه في بدء التطبيق.</string>
<string name="shared_string_last_used">آخر استخدام</string>
<string name="routing_attr_prefer_hiking_routes_description">تفضيل طرق التنزه</string>
<string name="routing_attr_prefer_hiking_routes_name">تفضيل طرق التنزه</string>
<string name="routing_attr_allow_streams_description">السماح بالتيارات والمصارف</string>
<string name="routing_attr_allow_streams_name">السماح بالتيارات والمصارف</string>
<string name="routing_attr_allow_intermittent_description">السماح بالممرات المائية المتقطعة</string>
<string name="routing_attr_allow_intermittent_name">السماح بالممرات المائية المتقطعة</string>
</resources> </resources>

View file

@ -272,7 +272,7 @@
<string name="overlay_transparency">Průhlednost překryvu</string> <string name="overlay_transparency">Průhlednost překryvu</string>
<string name="map_transparency_descr">Upravit průhlednost základní mapy.</string> <string name="map_transparency_descr">Upravit průhlednost základní mapy.</string>
<string name="map_transparency">Průhlednost základní mapy</string> <string name="map_transparency">Průhlednost základní mapy</string>
<string name="modify_transparency">Upravit průhlednost</string> <string name="modify_transparency">Nastavte průhlednost (0 - průhledný, 255 - neprůhledný)</string>
<string name="layer_underlay">Podkladová mapa…</string> <string name="layer_underlay">Podkladová mapa…</string>
<string name="map_underlay">Podkresová mapa</string> <string name="map_underlay">Podkresová mapa</string>
<string name="map_underlay_descr">Vyberte podkladovou mapu.</string> <string name="map_underlay_descr">Vyberte podkladovou mapu.</string>
@ -350,7 +350,7 @@
<string name="download_type_to_filter">vyhledat</string> <string name="download_type_to_filter">vyhledat</string>
<string name="use_high_res_maps">Vysoké rozlišení</string> <string name="use_high_res_maps">Vysoké rozlišení</string>
<string name="use_high_res_maps_descr">Použít mapu s vysokým rozlišením pro jemné displeje.</string> <string name="use_high_res_maps_descr">Použít mapu s vysokým rozlišením pro jemné displeje.</string>
<string name="unknown_location">Pozice ještě není známa</string> <string name="unknown_location">Pozice ještě není známa.</string>
<string name="context_menu_item_search_transport">Hledat veřejnou dopravu</string> <string name="context_menu_item_search_transport">Hledat veřejnou dopravu</string>
<string name="transport_searching_transport">Hledání dopravy (žádný cíl):</string> <string name="transport_searching_transport">Hledání dopravy (žádný cíl):</string>
<string name="transport_searching_route">Hledání dopravy (cíl vzdálen {0}):</string> <string name="transport_searching_route">Hledání dopravy (cíl vzdálen {0}):</string>
@ -642,14 +642,14 @@
<string name="offline_navigation_not_available">Off-line navigace OsmAnd je dočasně nedostupná.</string> <string name="offline_navigation_not_available">Off-line navigace OsmAnd je dočasně nedostupná.</string>
<string name="left_side_navigation">Levostranný provoz</string> <string name="left_side_navigation">Levostranný provoz</string>
<string name="left_side_navigation_descr">Pro země, kde se jezdí po levé straně cesty.</string> <string name="left_side_navigation_descr">Pro země, kde se jezdí po levé straně cesty.</string>
<string name="unknown_from_location">Startovní bod navigace není ještě zvolen</string> <string name="unknown_from_location">Výchozí bod navigace ještě nebyl zjištěn.</string>
<string name="confirm_interrupt_download">Přerušit stahování souboru\?</string> <string name="confirm_interrupt_download">Zrušit stahování\?</string>
<string name="basemap_was_selected_to_download">Základní mapa byla vybrána ke stažení. Je potřeba pro správnou funkci aplikace.</string> <string name="basemap_was_selected_to_download">Základní mapa byla vybrána ke stažení. Je potřeba pro správnou funkci aplikace.</string>
<string name="map_online_plugin_is_not_installed">Pro výběr různých zdrojů map povolte modul \'Online mapy\'</string> <string name="map_online_plugin_is_not_installed">Pro výběr různých zdrojů map povolte modul \'Online mapy\'</string>
<string name="map_online_data">On-line mapy a dlaždice</string> <string name="map_online_data">On-line mapy a dlaždice</string>
<string name="map_online_data_descr">Používat on-line mapy (ukládat dlaždice do mezipaměti na paměťové kartě).</string> <string name="map_online_data_descr">Používat on-line mapy (ukládat dlaždice do mezipaměti na paměťové kartě).</string>
<string name="shared_string_online_maps">On-line mapy</string> <string name="shared_string_online_maps">On-line mapy</string>
<string name="online_map_settings_descr">Nastavení rastrových překryvných nebo podkresových map.</string> <string name="online_map_settings_descr">Zvolit online nebo uložené dlaždicové mapové zdroje.</string>
<string name="osmand_rastermaps_plugin_description">Získejte přístup k mnoha druhům on-line map (tzv. dlaždicové nebo rastrové mapy), od předdefinovaných OpenStreetMap dlaždic (jako Mapnik) až po satelitní snímky a speciální vrstvy jako mapy počasí, klimatické mapy, geologické mapy, stínované svahy, atd. <string name="osmand_rastermaps_plugin_description">Získejte přístup k mnoha druhům on-line map (tzv. dlaždicové nebo rastrové mapy), od předdefinovaných OpenStreetMap dlaždic (jako Mapnik) až po satelitní snímky a speciální vrstvy jako mapy počasí, klimatické mapy, geologické mapy, stínované svahy, atd.
\n \n
\n Všechny tyto mapy mohou být použity jako hlavní (základní) mapa na obrazovce OsmAnd nebo jako překryvná popř. podkladová mapa k jiné základní mapě (např. standardní OsmAnd off-line mapě). Pro zlepšení viditelnosti podkladových map je možné vypnout některé objekty z vektorových map OsmAnd, přes menu \'Nastavení mapy\'. \n Všechny tyto mapy mohou být použity jako hlavní (základní) mapa na obrazovce OsmAnd nebo jako překryvná popř. podkladová mapa k jiné základní mapě (např. standardní OsmAnd off-line mapě). Pro zlepšení viditelnosti podkladových map je možné vypnout některé objekty z vektorových map OsmAnd, přes menu \'Nastavení mapy\'.
@ -663,7 +663,7 @@
<string name="prefs_plugins">Moduly</string> <string name="prefs_plugins">Moduly</string>
<string name="osm_editing_plugin_description">Po zadání svých přihlašovacích údajů můžete přispívat do OSM - například vytvářením nebo úpravami bodů zájmu, otevíráním nebo komentováním OSM poznámek a přidáváním zaznamenanými GPX soubory. OSM je celosvětový komunitní projekt mapování.</string> <string name="osm_editing_plugin_description">Po zadání svých přihlašovacích údajů můžete přispívat do OSM - například vytvářením nebo úpravami bodů zájmu, otevíráním nebo komentováním OSM poznámek a přidáváním zaznamenanými GPX soubory. OSM je celosvětový komunitní projekt mapování.</string>
<string name="vector_maps_may_display_faster_on_some_devices">Akcelerace vykreslování pomocí \'Android native\' knihovny. Vektorové mapy se zpravidla vykreslují rychleji, pokud je tato možnost zaškrtnuta. Avšak na některých zařízeních tato funkce nemusí fungovat.</string> <string name="vector_maps_may_display_faster_on_some_devices">Akcelerace vykreslování pomocí \'Android native\' knihovny. Vektorové mapy se zpravidla vykreslují rychleji, pokud je tato možnost zaškrtnuta. Avšak na některých zařízeních tato funkce nemusí fungovat.</string>
<string name="play_commands_of_currently_selected_voice">Přehrát hlasové pokyny zvoleným hlasem</string> <string name="play_commands_of_currently_selected_voice">Zvolte hlas a otestujte ho přehráním oznámení:</string>
<string name="debugging_and_development">Vývoj a ladění OsmAnd</string> <string name="debugging_and_development">Vývoj a ladění OsmAnd</string>
<string name="native_rendering">Akcelerace vykreslování</string> <string name="native_rendering">Akcelerace vykreslování</string>
<string name="test_voice_prompts">Test hlasových pokynů</string> <string name="test_voice_prompts">Test hlasových pokynů</string>
@ -1919,7 +1919,7 @@ Délka %2$s</string>
<string name="rendering_attr_showMtbRoutes_name">Zobrazit trasy pro horská kola</string> <string name="rendering_attr_showMtbRoutes_name">Zobrazit trasy pro horská kola</string>
<string name="storage_permission_restart_is_required">Aplikace nyní smí zapisovat na externí úložiště, ale je potřeba její restart.</string> <string name="storage_permission_restart_is_required">Aplikace nyní smí zapisovat na externí úložiště, ale je potřeba její restart.</string>
<string name="file_name_containes_illegal_char">Název souboru obsahuje nepovolené znaky</string> <string name="file_name_containes_illegal_char">Název souboru obsahuje nepovolené znaky</string>
<string name="access_no_destination">Cíl není nastaven</string> <string name="access_no_destination">Modul usnadnění: Cíl není nastaven</string>
<string name="map_widget_magnetic_bearing">Magnetické směrování</string> <string name="map_widget_magnetic_bearing">Magnetické směrování</string>
<string name="map_widget_bearing">Relativní směrování</string> <string name="map_widget_bearing">Relativní směrování</string>
<string name="access_disable_offroute_recalc">Nepřepočítávat trasu, pokud se od ní odchýlíte</string> <string name="access_disable_offroute_recalc">Nepřepočítávat trasu, pokud se od ní odchýlíte</string>
@ -2701,7 +2701,7 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="shared_string_explore">Prozkoumat</string> <string name="shared_string_explore">Prozkoumat</string>
<string name="shared_string_contents">Obsah</string> <string name="shared_string_contents">Obsah</string>
<string name="index_item_world_wikivoyage">Celosvětové články Wikivoyage</string> <string name="index_item_world_wikivoyage">Celosvětové články Wikivoyage</string>
<string name="contour_lines_hillshade_maps">Vrstevnice &amp; stínování terénu</string> <string name="contour_lines_hillshade_maps">Vrstevnice &amp; stínování svahů</string>
<string name="shared_string_restart">Restartovat aplikaci</string> <string name="shared_string_restart">Restartovat aplikaci</string>
<string name="show_images">Zobrazit obrázky</string> <string name="show_images">Zobrazit obrázky</string>
<string name="purchase_cancelled_dialog_descr">Obnovte předplatné, abyste nadále mohli využívat všechny funkce:</string> <string name="purchase_cancelled_dialog_descr">Obnovte předplatné, abyste nadále mohli využívat všechny funkce:</string>
@ -3299,7 +3299,7 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="hillshade_description">Stínované svahy používají tmavé odstíny pro vyjádření svahů, vrcholů a nížin.</string> <string name="hillshade_description">Stínované svahy používají tmavé odstíny pro vyjádření svahů, vrcholů a nížin.</string>
<string name="slope_description">Svahy využívají barvy k vizualizaci strmosti terénu.</string> <string name="slope_description">Svahy využívají barvy k vizualizaci strmosti terénu.</string>
<string name="terrain_slider_description">Nastavte minimální a maximální úroveň přiblížení, při které bude vrstva zobrazená.</string> <string name="terrain_slider_description">Nastavte minimální a maximální úroveň přiblížení, při které bude vrstva zobrazená.</string>
<string name="hillshade_download_description">Pro zobrazení stínování kopců jsou potřeba další mapy.</string> <string name="hillshade_download_description">Pro zobrazení stínování svahů jsou potřeba další mapy.</string>
<string name="slope_download_description">Pro zobrazení svahů jsou potřeba další mapy.</string> <string name="slope_download_description">Pro zobrazení svahů jsou potřeba další mapy.</string>
<string name="slope_read_more">O svazích si můžete přečíst více na %1$s.</string> <string name="slope_read_more">O svazích si můžete přečíst více na %1$s.</string>
<string name="shared_string_transparency">Průhlednost</string> <string name="shared_string_transparency">Průhlednost</string>
@ -3499,9 +3499,9 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="plan_route_select_track_file_for_open">Vyberte stopu k otevření.</string> <string name="plan_route_select_track_file_for_open">Vyberte stopu k otevření.</string>
<string name="shared_string_done">Hotovo</string> <string name="shared_string_done">Hotovo</string>
<string name="please_provide_point_name_error">Zadejte prosím název bodu</string> <string name="please_provide_point_name_error">Zadejte prosím název bodu</string>
<string name="quick_action_remove_next_destination_descr">Současný cílový bod na trase bude smazán. Jestliže to je poslední cíl, navigace se zastaví.</string> <string name="quick_action_remove_next_destination_descr">Vymaže následující cíl na trase. Jestliže to je poslední cíl, navigace se zastaví.</string>
<string name="search_download_wikipedia_maps">Stáhnout Wikipedia mapy</string> <string name="search_download_wikipedia_maps">Stáhnout Wikipedia mapy</string>
<string name="plugin_wikipedia_description">Získejte informace o zájmových bodech z Wikipedie. Je to váš offline kapesní průvodce - zapněte modul Wikipedia a užívejte si články o objektech okolo vás.</string> <string name="plugin_wikipedia_description">Získejte informace o zájmových bodech z Wikipedie, offline kapesního průvodce obsahujícího články o místech a destinacích.</string>
<string name="add_hidden_group_info">Přidaný bod nebude na mapě vidět, protože vybraná skupina je skrytá. Můžete jej najít v \"%s\".</string> <string name="add_hidden_group_info">Přidaný bod nebude na mapě vidět, protože vybraná skupina je skrytá. Můžete jej najít v \"%s\".</string>
<string name="app_mode_enduro_motorcycle">Enduro motorka</string> <string name="app_mode_enduro_motorcycle">Enduro motorka</string>
<string name="app_mode_motor_scooter">Motorový skútr</string> <string name="app_mode_motor_scooter">Motorový skútr</string>
@ -3549,7 +3549,7 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="navigation_profile">Navigační profil</string> <string name="navigation_profile">Navigační profil</string>
<string name="route_between_points_add_track_desc">Vyberte soubor stopy, do níž se nový úsek přidá.</string> <string name="route_between_points_add_track_desc">Vyberte soubor stopy, do níž se nový úsek přidá.</string>
<string name="street_level_imagery">Snímky z úrovně ulice</string> <string name="street_level_imagery">Snímky z úrovně ulice</string>
<string name="plan_route_exit_dialog_descr">Opravdu chcete zavřít plánovanou trasu a zahodit tak všechny změny\?</string> <string name="plan_route_exit_dialog_descr">Opravdu chcete zahodit všechny změny v plánované trase\?</string>
<string name="in_case_of_reverse_direction">V případě opačného směru</string> <string name="in_case_of_reverse_direction">V případě opačného směru</string>
<string name="shared_string_save_as_gpx">Uložit jako nový soubor stopy</string> <string name="shared_string_save_as_gpx">Uložit jako nový soubor stopy</string>
<string name="add_segment_to_the_track">Přidat do souboru stopy</string> <string name="add_segment_to_the_track">Přidat do souboru stopy</string>
@ -3564,7 +3564,7 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="shared_string_file_name">Název souboru</string> <string name="shared_string_file_name">Název souboru</string>
<string name="number_of_gpx_files_selected_pattern">%s vybraných souborů stop</string> <string name="number_of_gpx_files_selected_pattern">%s vybraných souborů stop</string>
<string name="monitoring_control_start">REC</string> <string name="monitoring_control_start">REC</string>
<string name="disable_recording_once_app_killed_descrp">Pozastaví záznam trasy, pokud je aplikace ukončena (přes nedávné aplikace). (Ikona režimu na pozadí zmizí z notifikační oblasti Androidu.)</string> <string name="disable_recording_once_app_killed_descrp">Záznam trasy bude pozastaven, když je aplikace ukončena (přes nedávné aplikace). (Ikona režimu na pozadí zmizí z notifikační oblasti Androidu.)</string>
<string name="gpx_monitoring_stop">Pozastavit záznam trasy</string> <string name="gpx_monitoring_stop">Pozastavit záznam trasy</string>
<string name="gpx_monitoring_start">Pokračovat v záznamu trasy</string> <string name="gpx_monitoring_start">Pokračovat v záznamu trasy</string>
<string name="system_default_theme">Výchozí</string> <string name="system_default_theme">Výchozí</string>
@ -3744,7 +3744,7 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="turn_screen_on_wake_time_descr">Zvolte časový limit vypnutí obrazovky po probuzení (\"%1$s\" znamená bez časového limitu.)</string> <string name="turn_screen_on_wake_time_descr">Zvolte časový limit vypnutí obrazovky po probuzení (\"%1$s\" znamená bez časového limitu.)</string>
<string name="message_you_need_add_two_points_to_show_graphs">Přidejte aspoň dva body</string> <string name="message_you_need_add_two_points_to_show_graphs">Přidejte aspoň dva body</string>
<string name="manage_subscription">Spravovat předplatné</string> <string name="manage_subscription">Spravovat předplatné</string>
<string name="subscription_payment_issue_title">S vaším předplatným je problém. Klepněte na tlačítko pro přechod do nastavení předplatného v Google Play a opravte způsob platby.</string> <string name="subscription_payment_issue_title">Pro opravu vašeho předplatného klepněte na tlačítko pro nastavení způsobu platby v Google Play.</string>
<string name="subscription_expired_title">Předplatné OsmAnd Live skončilo</string> <string name="subscription_expired_title">Předplatné OsmAnd Live skončilo</string>
<string name="subscription_paused_title">Předplatné OsmAnd Live je pozastaveno</string> <string name="subscription_paused_title">Předplatné OsmAnd Live je pozastaveno</string>
<string name="subscription_on_hold_title">Předplatné OsmAnd Live je zablokované</string> <string name="subscription_on_hold_title">Předplatné OsmAnd Live je zablokované</string>
@ -3914,7 +3914,7 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="login_open_street_map">Přihlásit se do OpenStreetMap</string> <string name="login_open_street_map">Přihlásit se do OpenStreetMap</string>
<string name="login_open_street_map_org">Přihlásit se do OpenStreetMap.org</string> <string name="login_open_street_map_org">Přihlásit se do OpenStreetMap.org</string>
<string name="sign_in_with_open_street_map">Zaregistrovat se do OpenStreetMap</string> <string name="sign_in_with_open_street_map">Zaregistrovat se do OpenStreetMap</string>
<string name="osm_edits_view_descr">Můžete zobrazit své dosud neodeslané změny či chyby v OSM v %1$s. Odeslané body se již v OsmAnd nezobrazují.</string> <string name="osm_edits_view_descr">Zobrazte své dosud neodeslané změny či chyby v OSM v %1$s. Odeslané změny se již v OsmAnd nezobrazují.</string>
<string name="open_street_map_login_mode">Abyste mohli odesílat nová nebo změněná data, musíte se přihlásit. <string name="open_street_map_login_mode">Abyste mohli odesílat nová nebo změněná data, musíte se přihlásit.
\n \n
\nPřihlásit se můžete pomocí bezpečné metody OAuth nebo jménem a heslem.</string> \nPřihlásit se můžete pomocí bezpečné metody OAuth nebo jménem a heslem.</string>
@ -4003,4 +4003,15 @@ Zobrazená oblast: %1$s x %2$s</string>
\n• Podpora pro vlastní barvy u oblíbených bodů a mezicílů trasy \n• Podpora pro vlastní barvy u oblíbených bodů a mezicílů trasy
\n \n
\n</string> \n</string>
<string name="profile_type_osmand_string">Profil OsmAnd</string>
<string name="profile_type_user_string">Uživatelský profil</string>
<string name="reverse_all_points">Otočit všechny body</string>
<string name="profile_by_default_description">Vyberte profil, který bude použitý při startu aplikace.</string>
<string name="shared_string_last_used">Naposledy použito</string>
<string name="routing_attr_prefer_hiking_routes_description">Upřednostňovat turistické trasy</string>
<string name="routing_attr_prefer_hiking_routes_name">Upřednostňovat turistické trasy</string>
<string name="routing_attr_allow_streams_description">Povolit říčky a stoky</string>
<string name="routing_attr_allow_streams_name">Povolit říčky a stoky</string>
<string name="routing_attr_allow_intermittent_description">Povolit občasné vodní cesty</string>
<string name="routing_attr_allow_intermittent_name">Povolit občasné vodní cesty</string>
</resources> </resources>

View file

@ -3832,7 +3832,7 @@
<string name="poi_traffic_signals_vibration_no">kein Vibrieren</string> <string name="poi_traffic_signals_vibration_no">kein Vibrieren</string>
<string name="poi_traffic_signals_arrow">Pfeil</string> <string name="poi_traffic_signals_arrow">Pfeil</string>
<string name="poi_traffic_signals_vibration">Vibrieren</string> <string name="poi_traffic_signals_vibration">Vibrieren</string>
<string name="poi_give_box">Give box</string> <string name="poi_give_box">Tauschbox</string>
<string name="poi_city_block">Stadtteil</string> <string name="poi_city_block">Stadtteil</string>
<string name="poi_borough">Bezirk</string> <string name="poi_borough">Bezirk</string>
<string name="poi_elevator">Aufzug</string> <string name="poi_elevator">Aufzug</string>
@ -3848,7 +3848,7 @@
<string name="poi_recycling_small_electrical_appliances">Kleine Elektrogeräte</string> <string name="poi_recycling_small_electrical_appliances">Kleine Elektrogeräte</string>
<string name="poi_nuts">Nussladen</string> <string name="poi_nuts">Nussladen</string>
<string name="poi_fuel_lng">Flüssigerdgas</string> <string name="poi_fuel_lng">Flüssigerdgas</string>
<string name="poi_parking_layby">Rastplatz</string> <string name="poi_parking_layby">Parkbucht</string>
<string name="poi_parking_sheds">Überdachter Parkplatz</string> <string name="poi_parking_sheds">Überdachter Parkplatz</string>
<string name="poi_parking_rooftop">Dachparkplätze</string> <string name="poi_parking_rooftop">Dachparkplätze</string>
<string name="poi_gpx_point">GPX-Wegpunkt</string> <string name="poi_gpx_point">GPX-Wegpunkt</string>

View file

@ -2418,7 +2418,7 @@
<string name="mapillary_widget_descr">Ermöglicht schnelle Beiträge zu Mapillary.</string> <string name="mapillary_widget_descr">Ermöglicht schnelle Beiträge zu Mapillary.</string>
<string name="mapillary_descr">Fotos von der Straße aus dem Netz für jeden. Orte entdecken, mitwirken und die Welt in Bildern festhalten.</string> <string name="mapillary_descr">Fotos von der Straße aus dem Netz für jeden. Orte entdecken, mitwirken und die Welt in Bildern festhalten.</string>
<string name="mapillary">Mapillary</string> <string name="mapillary">Mapillary</string>
<string name="mapillary_action_descr">Mit Mapillary Bilder dieses Orts beitragen.</string> <string name="mapillary_action_descr">Mit Mapillary Bilder von diesem Ort beisteuern.</string>
<string name="shared_string_install">Installieren</string> <string name="shared_string_install">Installieren</string>
<string name="online_photos">Online-Fotos</string> <string name="online_photos">Online-Fotos</string>
<string name="no_photos_descr">Keine Fotos hier.</string> <string name="no_photos_descr">Keine Fotos hier.</string>
@ -3181,7 +3181,7 @@
<string name="shared_string_file_is_saved">%s ist gespeichert</string> <string name="shared_string_file_is_saved">%s ist gespeichert</string>
<string name="shared_string_open_track">Track öffnen</string> <string name="shared_string_open_track">Track öffnen</string>
<string name="shared_string_track_is_saved">Track %s ist gespeichert</string> <string name="shared_string_track_is_saved">Track %s ist gespeichert</string>
<string name="sett_no_ext_input">Keine</string> <string name="sett_no_ext_input">Keines</string>
<string name="sett_wunderlinq_ext_input">WunderLINQ</string> <string name="sett_wunderlinq_ext_input">WunderLINQ</string>
<string name="sett_parrot_ext_input">Parrot</string> <string name="sett_parrot_ext_input">Parrot</string>
<string name="external_input_device_descr">Ein externes Steuergerät, wie beispielsweise eine Tastatur oder ein WunderLINQ, wählen.</string> <string name="external_input_device_descr">Ein externes Steuergerät, wie beispielsweise eine Tastatur oder ein WunderLINQ, wählen.</string>
@ -3839,7 +3839,7 @@
<string name="next_segment">Nächstes Segment</string> <string name="next_segment">Nächstes Segment</string>
<string name="navigation_profile">Navigationsprofil</string> <string name="navigation_profile">Navigationsprofil</string>
<string name="route_between_points_add_track_desc">Wählen Sie eine Trackdatei, für die ein neues Segment hinzugefügt werden soll.</string> <string name="route_between_points_add_track_desc">Wählen Sie eine Trackdatei, für die ein neues Segment hinzugefügt werden soll.</string>
<string name="follow_track_descr">Track auswählen, der verfolgt werden soll</string> <string name="follow_track_descr">Track auswählen, dem gefolgt werden soll</string>
<string name="delete_address">Adresse löschen</string> <string name="delete_address">Adresse löschen</string>
<string name="add_address">Adresse hinzufügen</string> <string name="add_address">Adresse hinzufügen</string>
<string name="access_hint_enter_address">Adresse eingeben</string> <string name="access_hint_enter_address">Adresse eingeben</string>
@ -4025,4 +4025,10 @@
<string name="reverse_all_points">Alle Punkte umkehren</string> <string name="reverse_all_points">Alle Punkte umkehren</string>
<string name="profile_by_default_description">Wählen Sie das Profil, das beim Start der Anwendung verwendet werden soll.</string> <string name="profile_by_default_description">Wählen Sie das Profil, das beim Start der Anwendung verwendet werden soll.</string>
<string name="shared_string_last_used">Zuletzt verwendet</string> <string name="shared_string_last_used">Zuletzt verwendet</string>
<string name="routing_attr_prefer_hiking_routes_description">Wanderwege bevorzugen</string>
<string name="routing_attr_prefer_hiking_routes_name">Wanderwege bevorzugen</string>
<string name="routing_attr_allow_streams_description">Bäche und Entwässerungsgräben erlauben</string>
<string name="routing_attr_allow_streams_name">Bäche und Entwässerungsgräben erlauben</string>
<string name="routing_attr_allow_intermittent_description">Gewässer erlauben, die nicht ständig Wasser führen</string>
<string name="routing_attr_allow_intermittent_name">Gewässer erlauben, die nicht ständig Wasser führen</string>
</resources> </resources>

View file

@ -517,7 +517,7 @@
<string name="rendering_value_americanRoadAtlas_name">Usona voja maparo</string> <string name="rendering_value_americanRoadAtlas_name">Usona voja maparo</string>
<string name="routing_attr_no_new_routing_name">Sen v1.9 kursaj reguloj</string> <string name="routing_attr_no_new_routing_name">Sen v1.9 kursaj reguloj</string>
<string name="routing_attr_no_new_routing_description">Ne uzi regulojn por difini kurson enkondukitajn en v1.9.</string> <string name="routing_attr_no_new_routing_description">Ne uzi regulojn por difini kurson enkondukitajn en v1.9.</string>
<string name="dash_download_msg_none">Ĉu elŝuti eksterretajn mapojn?</string> <string name="dash_download_msg_none">Ĉu elŝuti malkonektajn mapojn\?</string>
<string name="dash_download_msg">Vi elŝutis %1$s mapojn</string> <string name="dash_download_msg">Vi elŝutis %1$s mapojn</string>
<string name="dash_download_new_one">Elŝuti novan mapon</string> <string name="dash_download_new_one">Elŝuti novan mapon</string>
<string name="dash_download_manage">Administri</string> <string name="dash_download_manage">Administri</string>
@ -1606,7 +1606,7 @@
<string name="voice">Registrita voĉo</string> <string name="voice">Registrita voĉo</string>
<string name="voices">Voĉaj anoncoj</string> <string name="voices">Voĉaj anoncoj</string>
<string name="no_vector_map_loaded">Ne ŝargis vektorajn mapojn</string> <string name="no_vector_map_loaded">Ne ŝargis vektorajn mapojn</string>
<string name="vector_data">Eksterretaj vektoraj mapoj</string> <string name="vector_data">Malkonektaj vektoraj mapoj</string>
<string name="transport_context_menu">Serĉi transporton ĉe haltejo</string> <string name="transport_context_menu">Serĉi transporton ĉe haltejo</string>
<string name="poi_context_menu_modify">Modifi interesejon</string> <string name="poi_context_menu_modify">Modifi interesejon</string>
<string name="poi_context_menu_delete">Forigi interesejon</string> <string name="poi_context_menu_delete">Forigi interesejon</string>
@ -1867,7 +1867,8 @@
<string name="shared_string_card_was_hidden">Langeto kaŝita</string> <string name="shared_string_card_was_hidden">Langeto kaŝita</string>
<string name="shared_string_undo">Malfari</string> <string name="shared_string_undo">Malfari</string>
<string name="shared_string_skip">Transsalti</string> <string name="shared_string_skip">Transsalti</string>
<string name="offline_maps_and_navigation">Mapoj eksterretaj\nkaj navigado</string> <string name="offline_maps_and_navigation">Malkonektaj mapoj
\nkaj navigado</string>
<string name="commit_poi">Enmeti interesejon</string> <string name="commit_poi">Enmeti interesejon</string>
<string name="tab_title_basic">Bazaj</string> <string name="tab_title_basic">Bazaj</string>
<string name="tab_title_advanced">Altnivelaj</string> <string name="tab_title_advanced">Altnivelaj</string>
@ -4006,16 +4007,24 @@
<string name="plan_route_split_before">Dividi antaŭ</string> <string name="plan_route_split_before">Dividi antaŭ</string>
<string name="plan_route_split_after">Dividi post</string> <string name="plan_route_split_after">Dividi post</string>
<string name="plan_route_add_new_segment">Aldoni novan segmenton</string> <string name="plan_route_add_new_segment">Aldoni novan segmenton</string>
<string name="release_3_9">aldonita agordo por el-/en-porti ĉiujn datumojn, inkluzivante agordojn, mapdatumojn kaj miajn lokojn <string name="release_3_9">eblo el-/en-porti ĉiujn datumojn, inkluzivante agordojn, mapdatumojn kaj miajn lokojn
\n \n
\n • plani kurson: diagramoj por segmentoj kun la kurso, aldonita eblo por krei kaj redakti plurajn segmentojn de kurso \n • plani kurson: diagramoj por segmentoj kun la kurso, aldonita eblo por krei kaj redakti plurajn segmentojn de kurso
\n \n
\n • aldonita aŭtentiga metodo OAuth por OpenStreetMap, plibonigita fasado de OSMrilataj dialogujoj \n • aldonita aŭtentiga metodo OAuth por OpenStreetMap, plibonigita fasado de OSMrilataj dialogujoj
\n \n
\n • propraj koloroj por ŝatataj ejoj kaj navigadpunktoj de spuro \n • propraj koloroj por ŝatataj ejoj kaj navigadpunktoj de spuro
\n \n
\n</string> \n</string>
<string name="profile_type_osmand_string">OsmAndprofilo</string> <string name="profile_type_osmand_string">OsmAndprofilo</string>
<string name="profile_type_user_string">Profilo de uzanto</string> <string name="profile_type_user_string">Profilo de uzanto</string>
<string name="reverse_all_points">Inversigi ĉiujn punktojn</string> <string name="reverse_all_points">Inversigi ĉiujn punktojn</string>
<string name="profile_by_default_description">Elekti profolin, kiu estos uzita je starto de la aplikaĵo.</string>
<string name="shared_string_last_used">Antaŭe uzita</string>
<string name="routing_attr_prefer_hiking_routes_description">Preferi piediradajn kursojn</string>
<string name="routing_attr_prefer_hiking_routes_name">Preferi piediradajn kursojn</string>
<string name="routing_attr_allow_streams_description">Permesi navigi per riveretoj kaj fosaĵoj defluigaj</string>
<string name="routing_attr_allow_streams_name">Permesi riveretojn kaj fosaĵojn</string>
<string name="routing_attr_allow_intermittent_description">Permesi navigi per periode sekiĝantaj akvovojoj</string>
<string name="routing_attr_allow_intermittent_name">Permesi sezonajn akvovojojn</string>
</resources> </resources>

View file

@ -3935,7 +3935,7 @@
<string name="file_already_imported">El archivo ya fue importado en OsmAnd</string> <string name="file_already_imported">El archivo ya fue importado en OsmAnd</string>
<string name="use_two_phase_routing">Usar el algoritmo de navegación A* bifásica</string> <string name="use_two_phase_routing">Usar el algoritmo de navegación A* bifásica</string>
<string name="shared_string_graph">Gráfico</string> <string name="shared_string_graph">Gráfico</string>
<string name="message_need_calculate_route_before_show_graph">Hay %1$s datos disponibles sólo en los caminos, calcular una ruta usando «Ruta entre puntos» para ver los gráficos.</string> <string name="message_need_calculate_route_before_show_graph">Los datos de «%1$s» sólo están disponibles con los caminos, calcula una ruta usando «Ruta entre puntos» para ver los gráficos.</string>
<string name="message_graph_will_be_available_after_recalculation">Ten paciencia. <string name="message_graph_will_be_available_after_recalculation">Ten paciencia.
\nEl gráfico estará disponible al recalcular la ruta.</string> \nEl gráfico estará disponible al recalcular la ruta.</string>
<string name="ltr_or_rtl_combine_via_dash">%1$s — %2$s</string> <string name="ltr_or_rtl_combine_via_dash">%1$s — %2$s</string>
@ -4024,4 +4024,12 @@
<string name="profile_type_osmand_string">Perfil de OsmAnd</string> <string name="profile_type_osmand_string">Perfil de OsmAnd</string>
<string name="profile_type_user_string">Perfil de usuario</string> <string name="profile_type_user_string">Perfil de usuario</string>
<string name="reverse_all_points">Invertir todos los puntos</string> <string name="reverse_all_points">Invertir todos los puntos</string>
<string name="profile_by_default_description">Elige el perfil que será usado al iniciar la aplicación.</string>
<string name="shared_string_last_used">Usado por última vez</string>
<string name="routing_attr_prefer_hiking_routes_description">Prefiere rutas de senderismo</string>
<string name="routing_attr_prefer_hiking_routes_name">Preferir rutas de senderismo</string>
<string name="routing_attr_allow_streams_description">Permite arroyos y desagües</string>
<string name="routing_attr_allow_streams_name">Permitir arroyos y desagües</string>
<string name="routing_attr_allow_intermittent_description">Permite cursos de agua intermitentes</string>
<string name="routing_attr_allow_intermittent_name">Permitir cursos de agua intermitentes</string>
</resources> </resources>

View file

@ -3893,4 +3893,16 @@
<string name="poi_mobile_money_agent">Agente de dinero móvil</string> <string name="poi_mobile_money_agent">Agente de dinero móvil</string>
<string name="poi_vaccination_covid19">Vacunación: COVID19</string> <string name="poi_vaccination_covid19">Vacunación: COVID19</string>
<string name="poi_health_specialty_vaccination_yes">Vacunación</string> <string name="poi_health_specialty_vaccination_yes">Vacunación</string>
<string name="poi_lavoir">Lavadero público de ropa</string>
<string name="poi_waste_transfer_station">Estación de transferencia de residuos</string>
<string name="poi_weightbridge">Báscula puente</string>
<string name="poi_ranger_station">Estación de guardabosque</string>
<string name="poi_water_source_lake">Lago</string>
<string name="poi_water_source_river">Río</string>
<string name="poi_water_source_well">Pozo</string>
<string name="poi_water_source_powered_pump">Bomba accionada</string>
<string name="poi_water_source_water_tank">Tanque de agua</string>
<string name="poi_water_source_tap">Grifo</string>
<string name="poi_water_source_water_works">Planta potabilizadora</string>
<string name="poi_water_source_tube_well">Pozo entubado</string>
</resources> </resources>

View file

@ -1952,7 +1952,7 @@
<string name="access_autoannounce_period_descr">Lapso de tiempo mínimo entre avisos.</string> <string name="access_autoannounce_period_descr">Lapso de tiempo mínimo entre avisos.</string>
<string name="map_widget_bearing">Rumbo relativo</string> <string name="map_widget_bearing">Rumbo relativo</string>
<string name="map_widget_magnetic_bearing">Rumbo magnético</string> <string name="map_widget_magnetic_bearing">Rumbo magnético</string>
<string name="access_no_destination">Destino indefinido</string> <string name="access_no_destination">Complemento de accesibilidad: Destino indefinido</string>
<string name="use_osm_live_routing_description">Activa la navegación para cambios en vivo de OsmAnd.</string> <string name="use_osm_live_routing_description">Activa la navegación para cambios en vivo de OsmAnd.</string>
<string name="use_osm_live_routing">Navegación con OsmAnd Live</string> <string name="use_osm_live_routing">Navegación con OsmAnd Live</string>
<string name="follow_us">Síguenos</string> <string name="follow_us">Síguenos</string>
@ -2396,7 +2396,7 @@
<string name="srtm_menu_download_descr">Descarga el mapa de «Curvas de nivel» para usarlas en esta región.</string> <string name="srtm_menu_download_descr">Descarga el mapa de «Curvas de nivel» para usarlas en esta región.</string>
<string name="shared_string_plugin">Complemento</string> <string name="shared_string_plugin">Complemento</string>
<string name="srtm_purchase_header">Compra e instala el complemento «Curvas de nivel» para mostrar áreas verticales graduadas.</string> <string name="srtm_purchase_header">Compra e instala el complemento «Curvas de nivel» para mostrar áreas verticales graduadas.</string>
<string name="hillshade_menu_download_descr">Descarga el mapa «Superposición de sombreado» para mostrar el sombreado vertical.</string> <string name="hillshade_menu_download_descr">Descarga la capa superpuesta del mapa «Sombreado» para mostrar el sombreado vertical.</string>
<string name="hillshade_purchase_header">Instala el complemento «Curvas de nivel» para mostrar las áreas verticales graduadas.</string> <string name="hillshade_purchase_header">Instala el complemento «Curvas de nivel» para mostrar las áreas verticales graduadas.</string>
<string name="hide_from_zoom_level">Ocultar desde el nivel de zoom</string> <string name="hide_from_zoom_level">Ocultar desde el nivel de zoom</string>
<string name="quick_action_showhide_osmbugs_title">Mostrar u ocultar notas de OSM</string> <string name="quick_action_showhide_osmbugs_title">Mostrar u ocultar notas de OSM</string>
@ -3432,7 +3432,7 @@
<string name="login_and_pass">Nombre de usuario y contraseña</string> <string name="login_and_pass">Nombre de usuario y contraseña</string>
<string name="plugin_global_prefs_info">Los ajustes de este complemento son globales y se aplican a todos los perfiles</string> <string name="plugin_global_prefs_info">Los ajustes de este complemento son globales y se aplican a todos los perfiles</string>
<string name="osm_editing">Edición de OSM</string> <string name="osm_editing">Edición de OSM</string>
<string name="osm_edits_view_descr">Puedes ver todas tus ediciones aún no subidas o errores de OSM en «%1$s». Los puntos subidos no se muestran en OsmAnd.</string> <string name="osm_edits_view_descr">Vea todas las ediciones aún no subidas o errores de OSM en «%1$s». Los cambios ya cargados no se mostrarán más.</string>
<string name="app_mode_osm">OSM</string> <string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">El icono se muestra mientras se navega o se mueve.</string> <string name="select_nav_icon_descr">El icono se muestra mientras se navega o se mueve.</string>
<string name="select_map_icon_descr">El icono se muestra en reposo.</string> <string name="select_map_icon_descr">El icono se muestra en reposo.</string>
@ -3794,9 +3794,9 @@
<string name="use_volume_buttons_as_zoom_descr">Controla el nivel de zoom del mapa usando los botones de volumen del dispositivo.</string> <string name="use_volume_buttons_as_zoom_descr">Controla el nivel de zoom del mapa usando los botones de volumen del dispositivo.</string>
<string name="use_volume_buttons_as_zoom">Botones de volumen como zoom</string> <string name="use_volume_buttons_as_zoom">Botones de volumen como zoom</string>
<string name="search_download_wikipedia_maps">Descargar datos de Wikipedia</string> <string name="search_download_wikipedia_maps">Descargar datos de Wikipedia</string>
<string name="quick_action_remove_next_destination_descr">El punto de destino actual de la ruta será borrado. Si será el destino, la navegación se detendrá.</string> <string name="quick_action_remove_next_destination_descr">Quita el siguiente destino de la ruta. Si es el destino final, la navegación se detendrá.</string>
<string name="quick_action_remove_next_destination">Borrar el punto de destino más cercano</string> <string name="quick_action_remove_next_destination">Borrar el punto de destino más cercano</string>
<string name="plugin_wikipedia_description">Obtén información sobre los puntos de interés de Wikipedia. Es tu guía de bolsillo sin conexión - sólo activa el complemento de Wikipedia y disfruta los artículos sobre los objetos de alrededor.</string> <string name="plugin_wikipedia_description">Obtén información sobre los puntos de interés de Wikipedia, una guía de bolsillo sin conexión que incluye artículos sobre objetos y destinos.</string>
<string name="please_provide_point_name_error">Proporciona un nombre para el punto</string> <string name="please_provide_point_name_error">Proporciona un nombre para el punto</string>
<string name="lenght_limit_description">Proporciona la longitud del vehículo, se pueden aplicar algunas restricciones de rutas para vehículos largos.</string> <string name="lenght_limit_description">Proporciona la longitud del vehículo, se pueden aplicar algunas restricciones de rutas para vehículos largos.</string>
<string name="app_mode_motor_scooter">Motoneta (motor)</string> <string name="app_mode_motor_scooter">Motoneta (motor)</string>
@ -3851,7 +3851,7 @@
<string name="plan_route_open_existing_track">Abrir traza existente</string> <string name="plan_route_open_existing_track">Abrir traza existente</string>
<string name="plan_route_last_edited">Última edición</string> <string name="plan_route_last_edited">Última edición</string>
<string name="plan_route_import_track">Importar traza</string> <string name="plan_route_import_track">Importar traza</string>
<string name="plan_route_exit_dialog_descr">¿Cerrar el plan de ruta sin guardar\?, se descartarán todos los cambios.</string> <string name="plan_route_exit_dialog_descr">¿Descartar todos los cambios en la ruta planificada\?</string>
<string name="plan_route_create_new_route">Crear nueva ruta</string> <string name="plan_route_create_new_route">Crear nueva ruta</string>
<string name="plan_route_change_route_type_before">Cambiar el tipo de ruta anterior</string> <string name="plan_route_change_route_type_before">Cambiar el tipo de ruta anterior</string>
<string name="plan_route_change_route_type_after">Cambiar el tipo de ruta posterior</string> <string name="plan_route_change_route_type_after">Cambiar el tipo de ruta posterior</string>
@ -3908,12 +3908,12 @@
<string name="sort_last_modified">Último modificado</string> <string name="sort_last_modified">Último modificado</string>
<string name="start_finish_icons">Iconos de inicio y fin</string> <string name="start_finish_icons">Iconos de inicio y fin</string>
<string name="contour_lines_thanks">Gracias por comprar las «Curvas de nivel»</string> <string name="contour_lines_thanks">Gracias por comprar las «Curvas de nivel»</string>
<string name="osm_live_payment_desc_hw">La suscripción se cobra por el período elegido. Puedes cancelarlo en cualquier momento en AppGallery.</string> <string name="osm_live_payment_desc_hw">La suscripción se cobra por el período elegido. Puedes cancelarlo en AppGallery en cualquier momento.</string>
<string name="osm_live_payment_subscription_management_hw">El pago será cargado a la cuenta de AppGallery al confirmar la compra. <string name="osm_live_payment_subscription_management_hw">El pago será cargado a la cuenta de AppGallery al confirmar la compra.
\n \n
\nLa suscripción se renueva automáticamente a menos que se cancele antes de la fecha de renovación. La cuenta será cargada por el período de renovación (mes/trimestre/año) sólo en la fecha de renovación. \nLa suscripción se renueva automáticamente a menos que se cancele antes de la fecha de renovación. La cuenta será cargada por el período de renovación (mes/trimestre/año) sólo en la fecha de renovación.
\n \n
\nPuedes administrar y cancelar las suscripciones accediendo a los ajustes de AppGallery.</string> \nPuedes administrar y cancelar las suscripciones en los ajustes de AppGallery.</string>
<string name="routing_attr_avoid_footways_description">Evita pasar por aceras o veredas</string> <string name="routing_attr_avoid_footways_description">Evita pasar por aceras o veredas</string>
<string name="routing_attr_avoid_footways_name">Evitar aceras</string> <string name="routing_attr_avoid_footways_name">Evitar aceras</string>
<string name="what_is_new">Novedades</string> <string name="what_is_new">Novedades</string>
@ -3935,8 +3935,8 @@
<string name="navigate_point_mgrs">MGRS</string> <string name="navigate_point_mgrs">MGRS</string>
<string name="navigate_point_format_mgrs">MGRS</string> <string name="navigate_point_format_mgrs">MGRS</string>
<string name="mgrs_format_descr">OsmAnd usa MGRS, similar al formato UTM de la OTAN.</string> <string name="mgrs_format_descr">OsmAnd usa MGRS, similar al formato UTM de la OTAN.</string>
<string name="message_need_calculate_route_before_show_graph">Hay %1$s datos disponibles sólo en los caminos, calcular una ruta usando «Ruta entre puntos» para ver los gráficos.</string> <string name="message_need_calculate_route_before_show_graph">Los datos de «%1$s» sólo están disponibles con los caminos, calcula una ruta usando «Ruta entre puntos» para ver los gráficos.</string>
<string name="message_graph_will_be_available_after_recalculation">Ten paciencia <string name="message_graph_will_be_available_after_recalculation">Ten paciencia.
\nEl gráfico estará disponible al recalcular la ruta.</string> \nEl gráfico estará disponible al recalcular la ruta.</string>
<string name="ltr_or_rtl_combine_via_dash">%1$s — %2$s</string> <string name="ltr_or_rtl_combine_via_dash">%1$s — %2$s</string>
<string name="icon_group_travel">Viaje</string> <string name="icon_group_travel">Viaje</string>
@ -4018,4 +4018,15 @@
<string name="lang_de_casual">Alemán (casual)</string> <string name="lang_de_casual">Alemán (casual)</string>
<string name="elevation_data">Puedes usar los datos de elevación para tener en cuenta el ascenso y descenso del viaje</string> <string name="elevation_data">Puedes usar los datos de elevación para tener en cuenta el ascenso y descenso del viaje</string>
<string name="app_mode_light_aircraft">Avión ligero</string> <string name="app_mode_light_aircraft">Avión ligero</string>
<string name="shared_string_last_used">Usado por última vez</string>
<string name="routing_attr_prefer_hiking_routes_name">Preferir rutas de senderismo</string>
<string name="routing_attr_prefer_hiking_routes_description">Prefiere rutas de senderismo</string>
<string name="routing_attr_allow_streams_name">Permitir arroyos y desagües</string>
<string name="routing_attr_allow_streams_description">Permite arroyos y desagües</string>
<string name="routing_attr_allow_intermittent_name">Permitir cursos de agua intermitentes</string>
<string name="routing_attr_allow_intermittent_description">Permite cursos de agua intermitentes</string>
<string name="reverse_all_points">Invertir todos los puntos</string>
<string name="profile_type_user_string">Perfil de usuario</string>
<string name="profile_type_osmand_string">Perfil de OsmAnd</string>
<string name="profile_by_default_description">Elige el perfil que será usado al iniciar la aplicación.</string>
</resources> </resources>

View file

@ -3856,31 +3856,31 @@
\n \n
\nKui see on lubatud, kasutab OsmAnd süsteemi ajalõpu sätet.</string> \nKui see on lubatud, kasutab OsmAnd süsteemi ajalõpu sätet.</string>
<string name="use_system_screen_timeout">Kasutage süsteemi ekraani ajalõppu</string> <string name="use_system_screen_timeout">Kasutage süsteemi ekraani ajalõppu</string>
<string name="release_3_6">"• Profiilid: nüüd saate muuta järjestust, määrata kaardi ikooni, muuta kõiki põhiprofiilide sätteid ja taastada need vaikeseadetesse <string name="release_3_6">• Profiilid: nüüd saate muuta järjestust, määrata kaardi ikooni, muuta kõiki põhiprofiilide sätteid ja taastada need vaikeseadetesse
\n \n
\n • Navigatsioonis on lisatud väljumisnumber \n • Navigatsioonis on lisatud väljumisnumber
\n \n
\n • Ümber töötatud pistikprogrammi seaded \n • Ümber töötatud pistikprogrammi seaded
\n \n
\n • Kõigile profiilidele kiireks juurdepääsuks kuvatakse ümbertöödeldud seadete ekraan \n • Kõigile profiilidele kiireks juurdepääsuks kuvatakse ümbertöödeldud seadete ekraan
\n \n
\n • Lisatud võimalus seadete kopeerimiseks teiselt profiililt \n • Lisatud võimalus seadete kopeerimiseks teisest profiilist
\n \n
\n • Lisatud võime muuta järjestust või peita HP kategooriaid otsingus \n • Lisatud võime muuta järjestust või peita HP kategooriaid otsingus
\n \n
\n • POI ikoonid kaardil õigesti joondatud \n • POI ikoonid on kaardil õigesti joondatud
\n \n
\n • Kaardi seadistamiseks on lisatud päikeseloojangu / päikesetõusu andmed \n • Kaardi seadistamiseks on lisatud päikeseloojangu / päikesetõusu andmed
\n \n
\n • Lisatud kaardil kodu / töökoha ikoonid \n • Kaardile on lisatud kodu / töökoha ikoonid
\n \n
\n • Lisatud seadetes mitmerealise kirjelduse tugi \n • Seadetesse on lisatud mitmerealise kirjelduse tugi
\n \n
\n • Lisas Jaapani kaardile õige transliteratsiooni \n • Jaapani kaardile on lisatud õige transliteratsioon
\n \n
\n • Lisatud Antarktika kaart \n • Lisatud on Antarktika kaart
\n \n
\n"</string> \n</string>
<string name="route_recalculation_dist_descr">Teekond arvutatakse ümber, kui vahemaa teekonnani on suurem kui määratud parameeter</string> <string name="route_recalculation_dist_descr">Teekond arvutatakse ümber, kui vahemaa teekonnani on suurem kui määratud parameeter</string>
<string name="plugin_disabled_descr">See pistikprogramm on eraldi rakendus, peate selle eraldi eemaldama, kui te ei kavatse seda enam kasutada. <string name="plugin_disabled_descr">See pistikprogramm on eraldi rakendus, peate selle eraldi eemaldama, kui te ei kavatse seda enam kasutada.
\n \n
@ -3892,25 +3892,25 @@
<string name="ui_customization_short_descr">Sahtli osad, kontekstimenüü</string> <string name="ui_customization_short_descr">Sahtli osad, kontekstimenüü</string>
<string name="shared_string_drawer">Sahtel</string> <string name="shared_string_drawer">Sahtel</string>
<string name="search_poi_types_descr">Ühendage erinevate kategooriate HP-de tüübid. Kõigi valimiseks puudutage lülitit, kategooria valimiseks puudutage vasakut serva.</string> <string name="search_poi_types_descr">Ühendage erinevate kategooriate HP-de tüübid. Kõigi valimiseks puudutage lülitit, kategooria valimiseks puudutage vasakut serva.</string>
<string name="release_3_7">"• Uued võrguühenduseta nõlvakaardid <string name="release_3_7">• Uued võrguühenduseta nõlvakaardid
\n \n
\n • Lemmikute ja GPX-teekonnapunktide täielik kohandamine - kohandatud värvid, ikoonid, kujundid \n • Lemmikute ja GPX-teekonnapunktide täielik kohandamine - kohandatud värvid, ikoonid, kujundid
\n \n
\n • Kohandatud üksuste järjekorda jaotistes \"Kontekstimenüü\", \"Kaardi seadistamine\" ja \"Sahtel\" \n • Kohandatud üksuste järjekorda jaotistes \"Kontekstimenüü\", \"Kaardi seadistamine\" ja \"Sahtel\"
\n \n
\n • Vikipeedia eraldi kihina jaotises Kaardi seadistamine valige ainult vajalikud keeled \n • Vikipeedia eraldi kihina jaotises Kaardi seadistamine valige ainult vajalikud keeled
\n \n
\n • Loodud oma HP-de filter / kaardid täieliku paindlikkusega \n • Loodud oma HP-de filter / kaardid täieliku paindlikkusega
\n \n
\n • Lisatud valikud kohandatud profiilide sätete taastamiseks \n • Lisatud valikud kohandatud profiilide sätete taastamiseks
\n \n
\n • Täielikud GPX-marsruudid navigeerimisest toetavad liiklusradasid ja täitke pööramisjuhised \n • Täielikud GPX-marsruudid navigeerimisest toetavad liiklusradasid ja täitke pööramisjuhised
\n \n
\n • Parandatud tahvelarvutite kasutajaliidese suurused \n • Parandatud tahvelarvutite kasutajaliidese suurused
\n \n
\n • Parandatud vead RTL-iga \n • Parandatud vead RTL-iga
\n \n
\n"</string> \n</string>
<string name="system_screen_timeout_descr">Lülitab ekraani välja vastavalt süsteemi ekraani aegumisele.</string> <string name="system_screen_timeout_descr">Lülitab ekraani välja vastavalt süsteemi ekraani aegumisele.</string>
<string name="system_screen_timeout">Kasuta süsteemi ekraani ajalõppu</string> <string name="system_screen_timeout">Kasuta süsteemi ekraani ajalõppu</string>
<string name="turn_screen_on_descr">Valige ekraani äratussuvandid (veenduge, et seadme lukustamisel oleks esiplaanil OsmAnd):</string> <string name="turn_screen_on_descr">Valige ekraani äratussuvandid (veenduge, et seadme lukustamisel oleks esiplaanil OsmAnd):</string>
@ -3948,4 +3948,6 @@
\n \n
\n</string> \n</string>
<string name="reverse_all_points">Pööra kõik punktid ümber</string> <string name="reverse_all_points">Pööra kõik punktid ümber</string>
<string name="profile_by_default_description">Vali rakenduse käivitamisel kasutatav profiil.</string>
<string name="shared_string_last_used">Viimati kasutatud</string>
</resources> </resources>

View file

@ -1128,7 +1128,7 @@
<string name="poi_aerialway_bicycle_summer">Autorisés en été seulement</string> <string name="poi_aerialway_bicycle_summer">Autorisés en été seulement</string>
<string name="poi_aerialway_access_entry">Entrée uniquement</string> <string name="poi_aerialway_access_entry">Entrée uniquement</string>
<string name="poi_aerialway_access_exit">Sortie uniquement</string> <string name="poi_aerialway_access_exit">Sortie uniquement</string>
<string name="poi_aerialway_access_both">Entrée et Sortie</string> <string name="poi_aerialway_access_both">Entrée et sortie</string>
<string name="poi_aerialway_summer_access_entry">Accès d\'été : entrée uniquement</string> <string name="poi_aerialway_summer_access_entry">Accès d\'été : entrée uniquement</string>
<string name="poi_aerialway_summer_access_exit">Accès d\'été : sortie uniquement</string> <string name="poi_aerialway_summer_access_exit">Accès d\'été : sortie uniquement</string>
<string name="poi_aerialway_summer_access_both">Accès d\'été : entrée et sortie</string> <string name="poi_aerialway_summer_access_both">Accès d\'été : entrée et sortie</string>
@ -3559,7 +3559,7 @@
<string name="poi_motorcycle_type_dualsport">Trail (moto)</string> <string name="poi_motorcycle_type_dualsport">Trail (moto)</string>
<string name="poi_government_transportation">Institution pour les transports</string> <string name="poi_government_transportation">Institution pour les transports</string>
<string name="poi_water_supply_water_trucking">Point d\'eau pour poids lourds</string> <string name="poi_water_supply_water_trucking">Point d\'eau pour poids lourds</string>
<string name="poi_water_place_access_multifamilies">Multi-famille</string> <string name="poi_water_place_access_multifamilies">Multi-familles</string>
<string name="poi_flooring">Magasin de parquet</string> <string name="poi_flooring">Magasin de parquet</string>
<string name="poi_outpost">Point de livraison</string> <string name="poi_outpost">Point de livraison</string>
<string name="poi_water_utility">Service des eaux</string> <string name="poi_water_utility">Service des eaux</string>
@ -3625,7 +3625,7 @@
<string name="poi_vehicle_military">Accès véhicules : militaires</string> <string name="poi_vehicle_military">Accès véhicules : militaires</string>
<string name="poi_vehicle_delivery">Accès véhicules : livraisons</string> <string name="poi_vehicle_delivery">Accès véhicules : livraisons</string>
<string name="poi_vehicle_forestry">Accès véhicules : foresterie</string> <string name="poi_vehicle_forestry">Accès véhicules : foresterie</string>
<string name="poi_motor_vehicle_no">Accès véhicules à moteur : non</string> <string name="poi_motor_vehicle_no">Accès véhicule motorisé : non</string>
<string name="poi_snowmobile_no">Accès motoneige : non</string> <string name="poi_snowmobile_no">Accès motoneige : non</string>
<string name="poi_bus_yes">Oui</string> <string name="poi_bus_yes">Oui</string>
<string name="poi_hgv_delivery">Livraison</string> <string name="poi_hgv_delivery">Livraison</string>
@ -3633,22 +3633,22 @@
<string name="poi_goods_designated">Indiqué</string> <string name="poi_goods_designated">Indiqué</string>
<string name="poi_disabled_yes">Oui</string> <string name="poi_disabled_yes">Oui</string>
<string name="poi_glacier_type_hanging">suspendu</string> <string name="poi_glacier_type_hanging">suspendu</string>
<string name="poi_motorcar_yes">Accès véhicules : oui</string> <string name="poi_motorcar_yes">Accès voiture : oui</string>
<string name="poi_motorcar_private">accès-voiture : privé</string> <string name="poi_motorcar_private">Accès voiture : privé</string>
<string name="poi_motorcar_no">accès-voiture : impossible</string> <string name="poi_motorcar_no">Accès voiture : non</string>
<string name="poi_motorcar_permissive">accès-voiture : possible</string> <string name="poi_motorcar_permissive">Accès voiture : permis</string>
<string name="poi_motorcar_customers">Accès aux automobiles:forestiers</string> <string name="poi_motorcar_customers">Accès voiture : clientèle</string>
<string name="poi_motor_vehicle_yes">accès-voiture : autorisé</string> <string name="poi_motor_vehicle_yes">Accès véhicule motorisé : oui</string>
<string name="poi_motor_vehicle_private">Accès-voiture : privé</string> <string name="poi_motor_vehicle_private">Accès véhicule motorisé : privé</string>
<string name="poi_motor_vehicle_delivery">Accès aux véhicules à moteur : livraison</string> <string name="poi_motor_vehicle_delivery">Accès véhicule motorisé : livraison</string>
<string name="poi_motor_vehicle_agricultural">Accès-véhicules : agricoles</string> <string name="poi_motor_vehicle_agricultural">Accès véhicule motorisé : agricole</string>
<string name="poi_motorcar_destination">Accès aux automobiles:riverains</string> <string name="poi_motorcar_destination">Accès voiture : riverains</string>
<string name="poi_motorcar_forestry">Accès aux automobiles:forestiers</string> <string name="poi_motorcar_forestry">Accès voiture : forestier</string>
<string name="poi_motor_vehicle_destination">Accès aux véhicules à moteurs:riverains</string> <string name="poi_motor_vehicle_destination">Accès véhicule motorisé : riverains</string>
<string name="poi_motor_vehicle_permissive">Accès véhicule à moteur:toléré</string> <string name="poi_motor_vehicle_permissive">Accès véhicule motorisé : toléré</string>
<string name="poi_motor_vehicle_customers">Accès au véhicule à moteur:clients</string> <string name="poi_motor_vehicle_customers">Accès véhicule motorisé : clientèle</string>
<string name="poi_motor_vehicle_military">Accès aux véhicules à moteur:militaires</string> <string name="poi_motor_vehicle_military">Accès véhicule motorisé : militaire</string>
<string name="poi_motor_vehicle_forestry">Accès aux véhicules à moteurs:forestiers</string> <string name="poi_motor_vehicle_forestry">Accès véhicule motorisé : forestier</string>
<string name="poi_cellar_entrance">Entrée de cave</string> <string name="poi_cellar_entrance">Entrée de cave</string>
<string name="poi_health_food">Magasin de diététique</string> <string name="poi_health_food">Magasin de diététique</string>
<string name="poi_craft_builder">Constructeur</string> <string name="poi_craft_builder">Constructeur</string>
@ -3688,7 +3688,7 @@
<string name="poi_bath_type">Type</string> <string name="poi_bath_type">Type</string>
<string name="poi_bath_open_air">Plein-air</string> <string name="poi_bath_open_air">Plein-air</string>
<string name="poi_bath_type_lake">Lac</string> <string name="poi_bath_type_lake">Lac</string>
<string name="poi_horse_forestry">Accès à cheval : forestiers seuls</string> <string name="poi_horse_forestry">Accès à cheval : forestier</string>
<string name="poi_foot_destination">Accès piétonnier : riverains</string> <string name="poi_foot_destination">Accès piétonnier : riverains</string>
<string name="poi_trailer_no">Accès aux remorques : non</string> <string name="poi_trailer_no">Accès aux remorques : non</string>
<string name="poi_psv_yes">Accès aux transports publics ou taxis : oui</string> <string name="poi_psv_yes">Accès aux transports publics ou taxis : oui</string>

View file

@ -3774,7 +3774,7 @@
<string name="lenght_limit_description">Indiquez la longueur de votre véhicule, certaines restrictions d\'itinéraire peuvent s\'appliquer aux véhicules longs.</string> <string name="lenght_limit_description">Indiquez la longueur de votre véhicule, certaines restrictions d\'itinéraire peuvent s\'appliquer aux véhicules longs.</string>
<string name="quick_action_remove_next_destination">Supprimer le prochain point</string> <string name="quick_action_remove_next_destination">Supprimer le prochain point</string>
<string name="please_provide_point_name_error">Merci de renseigner un nom pour le point</string> <string name="please_provide_point_name_error">Merci de renseigner un nom pour le point</string>
<string name="plugin_wikipedia_description">Utilisez le guide Wikipédia hors ligne. Activez le plugin Wikipédia : des points d\'intérêt seront affichés, ils vous permettrons d\'obtenir des informations sur les lieux qui vous entourent.</string> <string name="plugin_wikipedia_description">Obtenez des informations sur les points d\'intérêt avec les articles Wikipédia, un guide disponible hors-ligne.</string>
<string name="search_download_wikipedia_maps">Télécharger les cartes Wikipédia</string> <string name="search_download_wikipedia_maps">Télécharger les cartes Wikipédia</string>
<string name="app_mode_motor_scooter">Scooter</string> <string name="app_mode_motor_scooter">Scooter</string>
<string name="app_mode_enduro_motorcycle">Moto enduro</string> <string name="app_mode_enduro_motorcycle">Moto enduro</string>
@ -3998,4 +3998,10 @@
<string name="profile_type_osmand_string">Profil OsmAnd</string> <string name="profile_type_osmand_string">Profil OsmAnd</string>
<string name="profile_type_user_string">Profil utilisateur</string> <string name="profile_type_user_string">Profil utilisateur</string>
<string name="reverse_all_points">Inverser tous les points</string> <string name="reverse_all_points">Inverser tous les points</string>
<string name="profile_by_default_description">Sélectionnez le profil utilisé au démarrage de l\'application.</string>
<string name="shared_string_last_used">Dernier utilisé</string>
<string name="routing_attr_prefer_hiking_routes_name">Pirivilégier les itinéraires de randonnée</string>
<string name="routing_attr_prefer_hiking_routes_description">Pirivilégier les itinéraires de randonnée</string>
<string name="routing_attr_allow_intermittent_description">Autoriser les voies navigables intermittentes</string>
<string name="routing_attr_allow_intermittent_name">Autoriser les voies navigables intermittentes</string>
</resources> </resources>

View file

@ -1621,7 +1621,7 @@
<string name="shared_string_skip">Kihagyás</string> <string name="shared_string_skip">Kihagyás</string>
<string name="app_name_osmand">OsmAnd</string> <string name="app_name_osmand">OsmAnd</string>
<string name="offline_maps_and_navigation">Offline térképek\nés navigáció</string> <string name="offline_maps_and_navigation">Offline térképek\nés navigáció</string>
<string name="next_proceed">Tovább</string> <string name="next_proceed">Következő</string>
<string name="dahboard_options_dialog_title">Műszerfal beállításai</string> <string name="dahboard_options_dialog_title">Műszerfal beállításai</string>
<string name="traffic_warning_hazard">Veszély</string> <string name="traffic_warning_hazard">Veszély</string>
<string name="poi_action_delete">törlés</string> <string name="poi_action_delete">törlés</string>
@ -2277,7 +2277,7 @@
\n \n
\nÉlvezd a hangalapú és vizuális navigációs szolgáltatást, tekints meg érdekes helyeket (POI-kat), hozz létre és kezelj GPX nyomvonalakat, szintvonalak és magasságinformációk használatával (egy plugin segítségével), válassz az autós, kerékpáros és gyalogos üzemmód közül, szerkessz OSM-et és használd ki a számos egyéb lehetőséget.</string> \nÉlvezd a hangalapú és vizuális navigációs szolgáltatást, tekints meg érdekes helyeket (POI-kat), hozz létre és kezelj GPX nyomvonalakat, szintvonalak és magasságinformációk használatával (egy plugin segítségével), válassz az autós, kerékpáros és gyalogos üzemmód közül, szerkessz OSM-et és használd ki a számos egyéb lehetőséget.</string>
<string name="save_poi_too_many_uppercase">A név túl sok nagybetűt tartalmaz. Folytatja\?</string> <string name="save_poi_too_many_uppercase">A név túl sok nagybetűt tartalmaz. Folytatja\?</string>
<string name="private_access_routing_req">A célpont korlátozott hozzáférésű területen található. Engedélyezed a magánutak használatát ennél az útvonaltervnél\?</string> <string name="private_access_routing_req">A célpont korlátozott hozzáférésű területen található. Engedélyezi a magánutak használatát ennél az útvonaltervnél\?</string>
<string name="restart_search">Keresés újraindítása</string> <string name="restart_search">Keresés újraindítása</string>
<string name="increase_search_radius">Keresett terület szélesítése</string> <string name="increase_search_radius">Keresett terület szélesítése</string>
<string name="nothing_found">Nincs találat</string> <string name="nothing_found">Nincs találat</string>
@ -3422,7 +3422,7 @@
<string name="login_and_pass">Felhasználónév és jelszó</string> <string name="login_and_pass">Felhasználónév és jelszó</string>
<string name="plugin_global_prefs_info">Ezek a bővítménybeállítások globálisak, és minden profilra vonatkoznak</string> <string name="plugin_global_prefs_info">Ezek a bővítménybeállítások globálisak, és minden profilra vonatkoznak</string>
<string name="osm_editing">OSM-szerkesztés</string> <string name="osm_editing">OSM-szerkesztés</string>
<string name="osm_edits_view_descr">"A még fel nem töltött szerkesztéseket vagy OSM-hibákat megtekintheti itt: %1$s. A már feltöltött módosítások nem jelennek meg."</string> <string name="osm_edits_view_descr">A még fel nem töltött szerkesztéseket vagy OSM-hibákat megtekintheti itt: %1$s. A már feltöltött módosítások nem jelennek meg.</string>
<string name="app_mode_osm">OSM</string> <string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Navigáció vagy haladás közben megjelenő ikon.</string> <string name="select_nav_icon_descr">Navigáció vagy haladás közben megjelenő ikon.</string>
<string name="select_map_icon_descr">Álló helyzetben megjelenő ikon.</string> <string name="select_map_icon_descr">Álló helyzetben megjelenő ikon.</string>
@ -3998,16 +3998,25 @@
<string name="plan_route_split_after">Elvágás utána</string> <string name="plan_route_split_after">Elvágás utána</string>
<string name="plan_route_join_segments">Szakaszok egyesítése</string> <string name="plan_route_join_segments">Szakaszok egyesítése</string>
<string name="plan_route_add_new_segment">Új szakasz hozzáadása</string> <string name="plan_route_add_new_segment">Új szakasz hozzáadása</string>
<string name="release_3_9">"• Lehetőség az összes adat exportálására és importálására, beleértve a beállításokat, erőforrásokat és a saját helyeket is <string name="release_3_9">• Lehetőség az összes adat exportálására és importálására, beleértve a beállításokat, erőforrásokat és a saját helyeket is
\n \n
\n • Útvonaltervezés: grafikonok a nyomvonalszakaszokhoz útvonallal, valamint lehetőség több nyomvonalszakasz létrehozására és szerkesztésére \n • Útvonaltervezés: grafikonok a nyomvonalszakaszokhoz útvonallal, valamint lehetőség több nyomvonalszakasz létrehozására és szerkesztésére
\n \n
\n • OAuth hitelesítési módszer az OpenStreetMap-hez, az OSM párbeszédpanelek felhasználói felületének javítása \n • OAuth hitelesítési módszer az OpenStreetMap-hez, az OSM párbeszédpanelek felhasználói felületének javítása
\n \n
\n • Egyéni színek támogatása a kedvenceknél és a nyomvonalak útpontjainál \n • Egyéni színek támogatása a kedvenceknél és a nyomvonalak útpontjainál
\n \n
\n"</string> \n</string>
<string name="profile_type_osmand_string">OsmAnd profil</string> <string name="profile_type_osmand_string">OsmAnd profil</string>
<string name="profile_type_user_string">Felhasználói profil</string> <string name="profile_type_user_string">Felhasználói profil</string>
<string name="reverse_all_points">Összes pont megfordítása</string> <string name="reverse_all_points">Összes pont megfordítása</string>
<string name="app_mode_gap">Rés</string>
<string name="profile_by_default_description">Jelölje ki az alkalmazás elindításakor használandó profilt.</string>
<string name="shared_string_last_used">Utoljára használt</string>
<string name="routing_attr_prefer_hiking_routes_description">Túraútvonalak előnyben részesítése</string>
<string name="routing_attr_prefer_hiking_routes_name">Túraútvonalak előnyben részesítése</string>
<string name="routing_attr_allow_streams_description">Patakok és vízelvezető árkok engedélyezése</string>
<string name="routing_attr_allow_streams_name">Patakok és vízelvezető árkok engedélyezése</string>
<string name="routing_attr_allow_intermittent_description">Időszakos vízfolyások engedélyezése</string>
<string name="routing_attr_allow_intermittent_name">Időszakos vízfolyások engedélyezése</string>
</resources> </resources>

View file

@ -3913,7 +3913,7 @@
<string name="contour_lines_thanks">תודה לך על רכישת ‚קווי מתאר’</string> <string name="contour_lines_thanks">תודה לך על רכישת ‚קווי מתאר’</string>
<string name="routing_attr_avoid_footways_description">הימנעות משבילי הולכי רגל</string> <string name="routing_attr_avoid_footways_description">הימנעות משבילי הולכי רגל</string>
<string name="routing_attr_avoid_footways_name">הימנעות משבילי הולכי רגל</string> <string name="routing_attr_avoid_footways_name">הימנעות משבילי הולכי רגל</string>
<string name="osm_live_payment_desc_hw">המינוי חויב לתקופה הנבחרת. ניתן לבטל דרך ה־AppGallery בכל עת.</string> <string name="osm_live_payment_desc_hw">המינוי מחויב לפי התקופה הנבחרת. ניתן לבטל אותו דרך ה־AppGallery בכל עת.</string>
<string name="osm_live_payment_subscription_management_hw">חשבון ה־AppGallery שלך יחויב עם אישור הרכישה. <string name="osm_live_payment_subscription_management_hw">חשבון ה־AppGallery שלך יחויב עם אישור הרכישה.
\n \n
\nתוקף המינוי מתארך אוטומטי אלא אם כן בוטל בטרם תאריך החידוש. החשבון שלך יחויב על תקופת החידוש (חודש/שלושה חודשים/שנה) רק בתאריך החידוש. \nתוקף המינוי מתארך אוטומטי אלא אם כן בוטל בטרם תאריך החידוש. החשבון שלך יחויב על תקופת החידוש (חודש/שלושה חודשים/שנה) רק בתאריך החידוש.
@ -4023,4 +4023,10 @@
<string name="reverse_all_points">להפוך את כל הנקודות</string> <string name="reverse_all_points">להפוך את כל הנקודות</string>
<string name="profile_by_default_description">נא לבחור את הפרופיל בו יעשה שימוש עם הפעלת היישומון.</string> <string name="profile_by_default_description">נא לבחור את הפרופיל בו יעשה שימוש עם הפעלת היישומון.</string>
<string name="shared_string_last_used">שימוש אחרון</string> <string name="shared_string_last_used">שימוש אחרון</string>
<string name="routing_attr_prefer_hiking_routes_description">להעדיף מסלולי הליכה</string>
<string name="routing_attr_prefer_hiking_routes_name">להעדיף מסלולי הליכה</string>
<string name="routing_attr_allow_streams_description">לאפשר נחלים וניקוזים</string>
<string name="routing_attr_allow_streams_name">לאפשר נחלים וניקוזים</string>
<string name="routing_attr_allow_intermittent_description">לאפשר מקטעים עם דרכי מים עונתיים</string>
<string name="routing_attr_allow_intermittent_name">לאפשר מקטעים עם דרכי מים עונתיים</string>
</resources> </resources>

View file

@ -3940,4 +3940,7 @@
<string name="profile_type_osmand_string">OsmAnd-profil</string> <string name="profile_type_osmand_string">OsmAnd-profil</string>
<string name="profile_type_user_string">Brukerprofil</string> <string name="profile_type_user_string">Brukerprofil</string>
<string name="button_rate">Bedøm</string> <string name="button_rate">Bedøm</string>
<string name="shared_string_resources">Ressurser</string>
<string name="profile_by_default_description">Velg profilen som skal brukes når programmet starter.</string>
<string name="shared_string_last_used">Sist brukt</string>
</resources> </resources>

View file

@ -1267,7 +1267,7 @@
<string name="poi_piste_difficulty_advanced">Moeilijk</string> <string name="poi_piste_difficulty_advanced">Moeilijk</string>
<string name="poi_piste_difficulty_novice">Beginner</string> <string name="poi_piste_difficulty_novice">Beginner</string>
<string name="poi_piste_difficulty_expert">Expert</string> <string name="poi_piste_difficulty_expert">Expert</string>
<string name="poi_piste_difficulty_freeride">Freeride</string> <string name="poi_piste_difficulty_freeride">Gratis rit</string>
<string name="poi_piste_grooming_classic">Klassiek</string> <string name="poi_piste_grooming_classic">Klassiek</string>
<string name="poi_piste_grooming_classic_skating">Klassiek en skating</string> <string name="poi_piste_grooming_classic_skating">Klassiek en skating</string>
<string name="poi_piste_grooming_backcountry">Uithoek</string> <string name="poi_piste_grooming_backcountry">Uithoek</string>

View file

@ -3271,7 +3271,7 @@
<string name="rendering_attr_piste_difficulty_intermediate_name">Middelmatig</string> <string name="rendering_attr_piste_difficulty_intermediate_name">Middelmatig</string>
<string name="rendering_attr_piste_difficulty_advanced_name">Gevorderd</string> <string name="rendering_attr_piste_difficulty_advanced_name">Gevorderd</string>
<string name="rendering_attr_piste_difficulty_expert_name">Expert</string> <string name="rendering_attr_piste_difficulty_expert_name">Expert</string>
<string name="rendering_attr_piste_difficulty_freeride_name">Gratische rit</string> <string name="rendering_attr_piste_difficulty_freeride_name">Gratis rit</string>
<string name="rendering_attr_piste_difficulty_extreme_name">Extreem</string> <string name="rendering_attr_piste_difficulty_extreme_name">Extreem</string>
<string name="rendering_attr_piste_difficulty_undefined_name">Ongedefinieerd</string> <string name="rendering_attr_piste_difficulty_undefined_name">Ongedefinieerd</string>
<string name="routeInfo_piste_difficulty_name">Moeilijkheidsgraad piste</string> <string name="routeInfo_piste_difficulty_name">Moeilijkheidsgraad piste</string>

View file

@ -3624,7 +3624,7 @@
<string name="poi_vehicle_military">Dostęp dla pojazdów: dla wojska</string> <string name="poi_vehicle_military">Dostęp dla pojazdów: dla wojska</string>
<string name="poi_vehicle_delivery">Dostęp dla pojazdów: dla dostaw</string> <string name="poi_vehicle_delivery">Dostęp dla pojazdów: dla dostaw</string>
<string name="poi_vehicle_forestry">Dostęp dla pojazdów: dla leśnictwa</string> <string name="poi_vehicle_forestry">Dostęp dla pojazdów: dla leśnictwa</string>
<string name="poi_motorcar_yes">Dostęp dla samochodów:</string> <string name="poi_motorcar_yes">Dostęp dla samochodów: tak</string>
<string name="poi_motorcar_private">Dostęp dla samochodów: prywatny</string> <string name="poi_motorcar_private">Dostęp dla samochodów: prywatny</string>
<string name="poi_motorcar_no">Dostęp dla samochodów: nie</string> <string name="poi_motorcar_no">Dostęp dla samochodów: nie</string>
<string name="poi_motorcar_destination">Dostęp dla samochodów: do celu podróży</string> <string name="poi_motorcar_destination">Dostęp dla samochodów: do celu podróży</string>
@ -3872,4 +3872,12 @@
<string name="poi_diplomatic_services_non_immigrant_visas_filter">Wizy nieimigracyjne</string> <string name="poi_diplomatic_services_non_immigrant_visas_filter">Wizy nieimigracyjne</string>
<string name="poi_consulate_filter">Konsulat</string> <string name="poi_consulate_filter">Konsulat</string>
<string name="poi_embassy_filter">Ambasada</string> <string name="poi_embassy_filter">Ambasada</string>
<string name="poi_nurse">Pielęgniarka</string>
<string name="poi_siren">Syrena</string>
<string name="poi_water_source_water_tank">Zbiornik wodny</string>
<string name="poi_water_source_well">Studnia</string>
<string name="poi_water_source_lake">Jezioro</string>
<string name="poi_water_source_river">Rzeka</string>
<string name="poi_vaccination_covid19">Szczepienia: COVID19</string>
<string name="poi_health_specialty_vaccination_yes">Szczepienia</string>
</resources> </resources>

View file

@ -3549,7 +3549,7 @@
<string name="shared_string_quick_actions">Szybka czynność</string> <string name="shared_string_quick_actions">Szybka czynność</string>
<string name="keep_both">Zatrzymaj oba</string> <string name="keep_both">Zatrzymaj oba</string>
<string name="shared_string_rendering_style">Styl renderowania</string> <string name="shared_string_rendering_style">Styl renderowania</string>
<string name="osm_edits_view_descr">Możesz wyświetlić wszystkie swoje jeszcze nie przesłane edycje lub błędy OSM w %1$s. Przesłane punkty nie są wyświetlane w OsmAnd.</string> <string name="osm_edits_view_descr">Wyświetl wszystkie jeszcze nie przesłane swoje edycje lub błędy OSM w %1$s. Przesłane już zmiany nie będą wyświetlane.</string>
<string name="import_rendering_file">Importowanie pliku renderowania</string> <string name="import_rendering_file">Importowanie pliku renderowania</string>
<string name="restore_all_profile_settings">Przywrócić wszystkie ustawienia profilu\?</string> <string name="restore_all_profile_settings">Przywrócić wszystkie ustawienia profilu\?</string>
<string name="saving_new_profile">Zapisywanie nowego profilu</string> <string name="saving_new_profile">Zapisywanie nowego profilu</string>
@ -3926,7 +3926,7 @@
<string name="use_complex_routing">Routing złożony</string> <string name="use_complex_routing">Routing złożony</string>
<string name="complex_routing_descr">Dwufazowe wyznaczanie tras do nawigacji samochodowej.</string> <string name="complex_routing_descr">Dwufazowe wyznaczanie tras do nawigacji samochodowej.</string>
<string name="use_native_pt">Rozwój rodzimego transportu publicznego</string> <string name="use_native_pt">Rozwój rodzimego transportu publicznego</string>
<string name="use_native_pt_desc">Przejdź do (bezpiecznego) obliczania tras transportu publicznego w języku Java</string> <string name="use_native_pt_desc">Przejdź do (bezpiecznego) obliczania trasy transportu publicznego w języku Java</string>
<string name="perform_oauth_authorization_description">Zaloguj się za pomocą protokołu OAuth, aby korzystać z funkcji osmedit</string> <string name="perform_oauth_authorization_description">Zaloguj się za pomocą protokołu OAuth, aby korzystać z funkcji osmedit</string>
<string name="perform_oauth_authorization">Zaloguj się przez OAuth</string> <string name="perform_oauth_authorization">Zaloguj się przez OAuth</string>
<string name="clear_osm_token">Wyczyść token OpenStreetMap OAuth</string> <string name="clear_osm_token">Wyczyść token OpenStreetMap OAuth</string>

View file

@ -3897,4 +3897,5 @@
<string name="poi_weightbridge">Balança</string> <string name="poi_weightbridge">Balança</string>
<string name="poi_ranger_station">Posto de guarda florestal</string> <string name="poi_ranger_station">Posto de guarda florestal</string>
<string name="poi_waste_transfer_station">Estação de transferência de resíduos</string> <string name="poi_waste_transfer_station">Estação de transferência de resíduos</string>
<string name="poi_lavoir">Lavandaria pública</string>
</resources> </resources>

View file

@ -4014,4 +4014,12 @@
<string name="profile_type_osmand_string">Perfil do OsmAnd</string> <string name="profile_type_osmand_string">Perfil do OsmAnd</string>
<string name="profile_type_user_string">Perfil de usuário</string> <string name="profile_type_user_string">Perfil de usuário</string>
<string name="reverse_all_points">Reverter todos os pontos</string> <string name="reverse_all_points">Reverter todos os pontos</string>
<string name="profile_by_default_description">Selecione o perfil que será utilizado na inicialização do aplicativo.</string>
<string name="shared_string_last_used">Usado por último</string>
<string name="routing_attr_prefer_hiking_routes_description">Percursos de caminhada preferidos</string>
<string name="routing_attr_prefer_hiking_routes_name">Percursos de caminhada preferidos</string>
<string name="routing_attr_allow_streams_description">Permitir riachos e drenos</string>
<string name="routing_attr_allow_streams_name">Permitir riachos e drenos</string>
<string name="routing_attr_allow_intermittent_description">Permitir vias de água intermitentes</string>
<string name="routing_attr_allow_intermittent_name">Permitir vias de água intermitentes</string>
</resources> </resources>

View file

@ -3878,4 +3878,5 @@
<string name="poi_water_source_water_tank">Tanque de água</string> <string name="poi_water_source_water_tank">Tanque de água</string>
<string name="poi_water_source_tap">Torneira</string> <string name="poi_water_source_tap">Torneira</string>
<string name="poi_water_source_water_works">Estação de tratamento de água</string> <string name="poi_water_source_water_works">Estação de tratamento de água</string>
<string name="poi_ranger_station">Posto de guarda florestal</string>
</resources> </resources>

View file

@ -4016,4 +4016,12 @@
<string name="profile_type_osmand_string">Profilu de OsmAnd</string> <string name="profile_type_osmand_string">Profilu de OsmAnd</string>
<string name="profile_type_user_string">Profilu de s\'impreadore</string> <string name="profile_type_user_string">Profilu de s\'impreadore</string>
<string name="reverse_all_points">Fùrria totu sos puntos</string> <string name="reverse_all_points">Fùrria totu sos puntos</string>
<string name="profile_by_default_description">Ischerta su profilu de impreare a s\'allughìngiu de s\'aplicatzione.</string>
<string name="shared_string_last_used">Ùrtimu impreu</string>
<string name="routing_attr_prefer_hiking_routes_description">Preferi sas àndalas pro s\'escursionismu</string>
<string name="routing_attr_prefer_hiking_routes_name">Preferi sas àndalas pro s\'escursionismu</string>
<string name="routing_attr_allow_streams_description">Permite flussos e iscàrrigos</string>
<string name="routing_attr_allow_streams_name">Permite flussos e iscàrrigos</string>
<string name="routing_attr_allow_intermittent_description">Permite caminos de abba intermitentes</string>
<string name="routing_attr_allow_intermittent_name">Permite caminos de abba intermitentes</string>
</resources> </resources>

View file

@ -4019,4 +4019,12 @@
<string name="profile_type_osmand_string">Profil OsmAnd</string> <string name="profile_type_osmand_string">Profil OsmAnd</string>
<string name="profile_type_user_string">Profil používateľa</string> <string name="profile_type_user_string">Profil používateľa</string>
<string name="reverse_all_points">Otočiť všetky body</string> <string name="reverse_all_points">Otočiť všetky body</string>
<string name="profile_by_default_description">Zvoľte profil, ktorý bude použitý pri štarte aplikácie.</string>
<string name="shared_string_last_used">Naposledy použité</string>
<string name="routing_attr_prefer_hiking_routes_description">Uprednostniť turistické trasy</string>
<string name="routing_attr_prefer_hiking_routes_name">Uprednostniť turistické trasy</string>
<string name="routing_attr_allow_streams_description">Povoliť potoky a odtokové kanály</string>
<string name="routing_attr_allow_streams_name">Povoliť potoky a odtokové kanály</string>
<string name="routing_attr_allow_intermittent_description">Povoliť dočasné vodné toky</string>
<string name="routing_attr_allow_intermittent_name">Povoliť dočasné vodné toky</string>
</resources> </resources>

View file

@ -13,7 +13,7 @@
<string name="poi_bicycle_transport">Bisiklet taşıma</string> <string name="poi_bicycle_transport">Bisiklet taşıma</string>
<string name="poi_aerialway_transport">Askılı taşıma</string> <string name="poi_aerialway_transport">Askılı taşıma</string>
<string name="poi_node_networks">Yürüyüş/bisiklet ağ noktaları</string> <string name="poi_node_networks">Yürüyüş/bisiklet ağ noktaları</string>
<string name="poi_hiking_routes">Yürüyüş rotaları</string> <string name="poi_hiking_routes">Yürüyüş güzergahları</string>
<string name="poi_traffic_enforcement">Trafik uygulama</string> <string name="poi_traffic_enforcement">Trafik uygulama</string>
<string name="poi_man_made">İnsan yapımı</string> <string name="poi_man_made">İnsan yapımı</string>
<string name="poi_transport_construction">Ulaştırma inşaatı</string> <string name="poi_transport_construction">Ulaştırma inşaatı</string>
@ -938,10 +938,10 @@
<string name="poi_nwn_ref">Ulusal giden ağ düğümü</string> <string name="poi_nwn_ref">Ulusal giden ağ düğümü</string>
<string name="poi_rwn_ref">Bölgesel giden ağ düğümü</string> <string name="poi_rwn_ref">Bölgesel giden ağ düğümü</string>
<string name="poi_lwn_ref">Yerel yürüyüş ağ düğümü</string> <string name="poi_lwn_ref">Yerel yürüyüş ağ düğümü</string>
<string name="poi_route_hiking_iwn_poi">Uluslararası yürüyüş izleği</string> <string name="poi_route_hiking_iwn_poi">Uluslararası yürüyüş güzergahı</string>
<string name="poi_route_hiking_nwn_poi">Ulusal yürüyüş izleği</string> <string name="poi_route_hiking_nwn_poi">Ulusal yürüyüş güzergahı</string>
<string name="poi_route_hiking_rwn_poi">Bölgesel yürüyüş izleği</string> <string name="poi_route_hiking_rwn_poi">Bölgesel yürüyüş güzergahı</string>
<string name="poi_route_hiking_lwn_poi">Yerel yürüyüş izleği</string> <string name="poi_route_hiking_lwn_poi">Yerel yürüyüş güzergahı</string>
<string name="poi_route_hiking_ref_poi">Yürüyüş yolu başvurusu</string> <string name="poi_route_hiking_ref_poi">Yürüyüş yolu başvurusu</string>
<string name="poi_opening_hours">Çalışma saatleri</string> <string name="poi_opening_hours">Çalışma saatleri</string>
<string name="poi_collection_times">Koleksiyon kez</string> <string name="poi_collection_times">Koleksiyon kez</string>
@ -3135,4 +3135,6 @@
<string name="poi_diplomatic_services_citizen_services_filter">Vatandaş hizmetleri</string> <string name="poi_diplomatic_services_citizen_services_filter">Vatandaş hizmetleri</string>
<string name="poi_diplomatic_services_immigrant_visas_filter">Göçmen vizeleri</string> <string name="poi_diplomatic_services_immigrant_visas_filter">Göçmen vizeleri</string>
<string name="poi_diplomatic_services_non_immigrant_visas_filter">Göçmen olmayan vizeleri</string> <string name="poi_diplomatic_services_non_immigrant_visas_filter">Göçmen olmayan vizeleri</string>
<string name="poi_military_checkpoint">Askeri denetim noktası</string>
<string name="poi_checkpoint_hiking">Yürüyüş denetim noktası</string>
</resources> </resources>

View file

@ -3976,4 +3976,10 @@
<string name="reverse_all_points">Tüm noktaları tersine çevir</string> <string name="reverse_all_points">Tüm noktaları tersine çevir</string>
<string name="profile_by_default_description">Uygulama başlangıcında kullanılacak profili seçin.</string> <string name="profile_by_default_description">Uygulama başlangıcında kullanılacak profili seçin.</string>
<string name="shared_string_last_used">Son kullanılan</string> <string name="shared_string_last_used">Son kullanılan</string>
<string name="routing_attr_prefer_hiking_routes_description">Yürüyüş güzergahlarını tercih edin</string>
<string name="routing_attr_prefer_hiking_routes_name">Yürüyüş güzergahlarını tercih et</string>
<string name="routing_attr_allow_streams_description">Dere ve kanalizasyonlara izin verin</string>
<string name="routing_attr_allow_streams_name">Dere ve kanalizasyonlara izin ver</string>
<string name="routing_attr_allow_intermittent_description">Aralıklı su yollarına izin verin</string>
<string name="routing_attr_allow_intermittent_name">Aralıklı su yollarına izin ver</string>
</resources> </resources>

View file

@ -3185,7 +3185,7 @@
<string name="app_mode_campervan">Дім на колесах</string> <string name="app_mode_campervan">Дім на колесах</string>
<string name="rendering_attr_showLez_description">Показати на мапі зони низьких викидів. Не впливає на маршрутизацію.</string> <string name="rendering_attr_showLez_description">Показати на мапі зони низьких викидів. Не впливає на маршрутизацію.</string>
<string name="rendering_attr_showLez_name">Показати зони низьких викидів</string> <string name="rendering_attr_showLez_name">Показати зони низьких викидів</string>
<string name="temporary_conditional_routing">Враховувати тимчасові обмеження</string> <string name="temporary_conditional_routing">Враховувати часові обмеження</string>
<string name="shared_string_default">Усталений</string> <string name="shared_string_default">Усталений</string>
<string name="new_route_calculated_dist_dbg">Маршрут: відстань %s, час навігації %s <string name="new_route_calculated_dist_dbg">Маршрут: відстань %s, час навігації %s
\nРозрахунок: %.1f с, %d доріг, %d тайлів)</string> \nРозрахунок: %.1f с, %d доріг, %d тайлів)</string>
@ -4017,4 +4017,10 @@
<string name="reverse_all_points">Повернути назад всі точки</string> <string name="reverse_all_points">Повернути назад всі точки</string>
<string name="profile_by_default_description">Виберіть профіль, який застосовуватиметься під час запуску.</string> <string name="profile_by_default_description">Виберіть профіль, який застосовуватиметься під час запуску.</string>
<string name="shared_string_last_used">Востаннє використовувалось</string> <string name="shared_string_last_used">Востаннє використовувалось</string>
<string name="routing_attr_allow_intermittent_description">Дозволити переривчасті водні шляхи</string>
<string name="routing_attr_allow_intermittent_name">Дозволити переривчасті водні шляхи</string>
<string name="routing_attr_prefer_hiking_routes_description">Надавати перевагу пішохідним маршрутам</string>
<string name="routing_attr_prefer_hiking_routes_name">Надавати перевагу пішохідним маршрутам</string>
<string name="routing_attr_allow_streams_description">Дозволити потоки та стічні канали</string>
<string name="routing_attr_allow_streams_name">Дозволити потоки та стічні канали</string>
</resources> </resources>

View file

@ -4014,4 +4014,12 @@
<string name="profile_type_osmand_string">OsmAnd 設定檔</string> <string name="profile_type_osmand_string">OsmAnd 設定檔</string>
<string name="profile_type_user_string">使用者設定檔</string> <string name="profile_type_user_string">使用者設定檔</string>
<string name="reverse_all_points">反轉所有點</string> <string name="reverse_all_points">反轉所有點</string>
<string name="profile_by_default_description">選取要在應用程式啟動時使用的設定檔。</string>
<string name="shared_string_last_used">最後使用</string>
<string name="routing_attr_prefer_hiking_routes_description">偏好遠足路線</string>
<string name="routing_attr_prefer_hiking_routes_name">偏好遠足路線</string>
<string name="routing_attr_allow_streams_description">允許溪流與水溝</string>
<string name="routing_attr_allow_streams_name">允許溪流與水溝</string>
<string name="routing_attr_allow_intermittent_description">允許間歇水路</string>
<string name="routing_attr_allow_intermittent_name">允許間歇水路</string>
</resources> </resources>

View file

@ -556,6 +556,22 @@ public class TargetPointsHelper {
updateRouteAndRefresh(updateRoute); updateRouteAndRefresh(updateRoute);
} }
public void reorderIntermediatePoints(List<TargetPoint> points, boolean updateRoute) {
cancelAllIntermediatePointsAddressRequests();
if (points.size() > 0) {
ArrayList<String> names = new ArrayList<>(points.size());
ArrayList<LatLon> ls = new ArrayList<>(points.size());
for (int i = 0; i < points.size(); i++) {
names.add(PointDescription.serializeToString(points.get(i).pointDescription));
ls.add(points.get(i).point);
}
settings.saveIntermediatePoints(ls, names);
} else {
settings.clearIntermediatePoints();
}
readFromSettings();
updateRouteAndRefresh(updateRoute);
}
public boolean hasTooLongDistanceToNavigate() { public boolean hasTooLongDistanceToNavigate() {
if (routingHelper.getAppMode().getRouteService() != RouteService.OSMAND) { if (routingHelper.getAppMode().getRouteService() != RouteService.OSMAND) {

View file

@ -8,9 +8,9 @@ import net.osmand.PlatformUtil;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.map.OsmandRegions; import net.osmand.map.OsmandRegions;
import net.osmand.map.WorldRegion; import net.osmand.map.WorldRegion;
import net.osmand.plus.CustomRegion;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin; import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.CustomRegion;
import net.osmand.plus.download.DownloadOsmandIndexesHelper.AssetIndexItem; import net.osmand.plus.download.DownloadOsmandIndexesHelper.AssetIndexItem;
import net.osmand.plus.inapp.InAppPurchaseHelper; import net.osmand.plus.inapp.InAppPurchaseHelper;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
@ -21,6 +21,7 @@ import java.io.File;
import java.io.FilenameFilter; import java.io.FilenameFilter;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.text.DateFormat;
import java.text.ParseException; import java.text.ParseException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -80,7 +81,7 @@ public class DownloadResources extends DownloadResourceGroup {
List<IndexItem> items = getWikivoyageItems(); List<IndexItem> items = getWikivoyageItems();
if (items != null) { if (items != null) {
for (IndexItem ii : items) { for (IndexItem ii : items) {
if (ii.getFileName().equals(fileName)) { if (ii.getTargetFile(app).getName().equals(fileName)) {
return ii; return ii;
} }
} }
@ -177,6 +178,8 @@ public class DownloadResources extends DownloadResourceGroup {
} }
} }
if (date != null && !date.equals(indexActivatedDate) && !date.equals(indexFilesDate)) { if (date != null && !date.equals(indexActivatedDate) && !date.equals(indexFilesDate)) {
long oldItemSize = 0;
long itemSize = item.getContentSize();
if ((item.getType() == DownloadActivityType.NORMAL_FILE && !item.extra) if ((item.getType() == DownloadActivityType.NORMAL_FILE && !item.extra)
|| item.getType() == DownloadActivityType.ROADS_FILE || item.getType() == DownloadActivityType.ROADS_FILE
|| item.getType() == DownloadActivityType.WIKIPEDIA_FILE || item.getType() == DownloadActivityType.WIKIPEDIA_FILE
@ -185,15 +188,12 @@ public class DownloadResources extends DownloadResourceGroup {
outdated = true; outdated = true;
} else if (item.getType() == DownloadActivityType.WIKIVOYAGE_FILE } else if (item.getType() == DownloadActivityType.WIKIVOYAGE_FILE
|| item.getType() == DownloadActivityType.TRAVEL_FILE) { || item.getType() == DownloadActivityType.TRAVEL_FILE) {
long itemSize = item.getContentSize(); oldItemSize = app.getAppPath(IndexConstants.WIKIVOYAGE_INDEX_DIR +
long oldItemSize = app.getAppPath(IndexConstants.WIKIVOYAGE_INDEX_DIR +
item.getTargetFileName()).length(); item.getTargetFileName()).length();
if (itemSize != oldItemSize) { if (itemSize != oldItemSize) {
outdated = true; outdated = true;
} }
} else { } else {
long itemSize = item.getContentSize();
long oldItemSize = 0;
if (parsed && item.getTimestamp() > item.getLocalTimestamp()) { if (parsed && item.getTimestamp() > item.getLocalTimestamp()) {
outdated = true; outdated = true;
} else if (item.getType() == DownloadActivityType.VOICE_FILE) { } else if (item.getType() == DownloadActivityType.VOICE_FILE) {
@ -223,12 +223,23 @@ public class DownloadResources extends DownloadResourceGroup {
outdated = true; outdated = true;
} }
} }
if (outdated) {
logItemUpdateInfo(item, format, itemSize, oldItemSize);
}
} }
item.setOutdated(outdated); item.setOutdated(outdated);
return outdated; return outdated;
} }
private void logItemUpdateInfo(IndexItem item, DateFormat format, long itemSize, long oldItemSize) {
String date = item.getDate(format);
String sfName = item.getTargetFileName();
String indexActivatedDate = indexActivatedFileNames.get(sfName);
String indexFilesDate = indexFileNames.get(sfName);
LOG.info("name " + item.getFileName() + " timestamp " + item.timestamp + " localTimestamp " + item.localTimestamp + " date " + date
+ " indexActivatedDate " + indexActivatedDate + " indexFilesDate " + indexFilesDate
+ " itemSize " + itemSize + " oldItemSize " + oldItemSize);
}
protected void updateFilesToUpdate() { protected void updateFilesToUpdate() {
initAlreadyLoadedFiles(); initAlreadyLoadedFiles();

View file

@ -13,14 +13,15 @@ import net.osmand.PlatformUtil;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.data.PointDescription; import net.osmand.data.PointDescription;
import net.osmand.map.TileSourceManager; import net.osmand.map.TileSourceManager;
import net.osmand.plus.mapmarkers.MapMarkersGroup;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.PluginsFragment; import net.osmand.plus.activities.PluginsFragment;
import net.osmand.plus.dashboard.DashboardOnMap.DashboardType; import net.osmand.plus.dashboard.DashboardOnMap.DashboardType;
import net.osmand.plus.mapmarkers.MapMarkersDialogFragment; import net.osmand.plus.mapmarkers.MapMarkersDialogFragment;
import net.osmand.plus.mapmarkers.MapMarkersGroup;
import net.osmand.plus.mapsource.EditMapSourceDialogFragment; import net.osmand.plus.mapsource.EditMapSourceDialogFragment;
import net.osmand.plus.openplacereviews.OPRConstants;
import net.osmand.plus.search.QuickSearchDialogFragment; import net.osmand.plus.search.QuickSearchDialogFragment;
import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.settings.backend.OsmandSettings;
@ -36,7 +37,7 @@ import java.util.Map;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static net.osmand.plus.osmedit.oauth.OsmOAuthHelper.*; import static net.osmand.plus.osmedit.oauth.OsmOAuthHelper.OsmAuthorizationListener;
public class IntentHelper { public class IntentHelper {
@ -66,6 +67,9 @@ public class IntentHelper {
if (!applied) { if (!applied) {
applied = parseOAuthIntent(); applied = parseOAuthIntent();
} }
if (!applied) {
applied = parseOprOAuthIntent();
}
return applied; return applied;
} }
@ -306,6 +310,22 @@ public class IntentHelper {
return false; return false;
} }
private boolean parseOprOAuthIntent() {
Intent intent = mapActivity.getIntent();
if (intent != null && intent.getData() != null) {
Uri uri = intent.getData();
if (uri.toString().startsWith(OPRConstants.OPR_OAUTH_PREFIX)) {
String token = uri.getQueryParameter("opr-token");
String username = uri.getQueryParameter("opr-nickname");
app.getSettings().OPR_ACCESS_TOKEN.set(token);
app.getSettings().OPR_USERNAME.set(username);
mapActivity.setIntent(null);
return true;
}
}
return false;
}
private OsmAuthorizationListener getOnAuthorizeListener() { private OsmAuthorizationListener getOnAuthorizeListener() {
return new OsmAuthorizationListener() { return new OsmAuthorizationListener() {
@Override @Override

View file

@ -242,43 +242,45 @@ public class WaypointDialogHelper {
} }
} }
// switch start & finish public static void switchStartAndFinish(OsmandApplication app, Activity ctx, WaypointDialogHelper helper, boolean updateRoute) {
public static void switchStartAndFinish(TargetPointsHelper targetPointsHelper, TargetPoint finish, TargetPointsHelper targetsHelper = app.getTargetPointsHelper();
Activity ctx, TargetPoint start, OsmandApplication app, TargetPoint finish = targetsHelper.getPointToNavigate();
WaypointDialogHelper helper) { TargetPoint start = targetsHelper.getPointToStart();
if (finish == null) { if (finish == null) {
app.showShortToastMessage(R.string.mark_final_location_first); app.showShortToastMessage(R.string.mark_final_location_first);
} else { } else {
targetPointsHelper.setStartPoint(new LatLon(finish.getLatitude(), switchStartAndFinish(app, start, finish, updateRoute);
finish.getLongitude()), false, finish.getPointDescription(ctx));
if (start == null) {
Location loc = app.getLocationProvider().getLastKnownLocation();
if (loc != null) {
targetPointsHelper.navigateToPoint(new LatLon(loc.getLatitude(),
loc.getLongitude()), true, -1);
}
} else {
targetPointsHelper.navigateToPoint(new LatLon(start.getLatitude(),
start.getLongitude()), true, -1, start.getPointDescription(ctx));
}
updateControls(ctx, helper); updateControls(ctx, helper);
} }
} }
public static void reverseAllPoints(OsmandApplication app, Activity ctx, private static void switchStartAndFinish(OsmandApplication app, TargetPoint start, TargetPoint finish, boolean updateRoute) {
WaypointDialogHelper helper) { TargetPointsHelper targetsHelper = app.getTargetPointsHelper();
TargetPointsHelper targets = app.getTargetPointsHelper(); targetsHelper.setStartPoint(new LatLon(finish.getLatitude(), finish.getLongitude()),
if (!targets.getAllPoints().isEmpty()) { false, finish.getPointDescription(app));
List<TargetPoint> points = targets.getAllPoints(); if (start == null) {
Collections.reverse(points); Location loc = app.getLocationProvider().getLastKnownLocation();
TargetPoint start = points.get(0); if (loc != null) {
targets.setStartPoint(start.point, false, start.getOriginalPointDescription()); targetsHelper.navigateToPoint(new LatLon(loc.getLatitude(),
points.remove(start); loc.getLongitude()), updateRoute, -1);
targets.reorderAllTargetPoints(points, true); }
updateControls(ctx, helper); } else {
targetsHelper.navigateToPoint(new LatLon(start.getLatitude(),
start.getLongitude()), updateRoute, -1, start.getPointDescription(app));
} }
} }
public static void reverseAllPoints(OsmandApplication app, Activity ctx, WaypointDialogHelper helper) {
TargetPointsHelper targetsHelper = app.getTargetPointsHelper();
TargetPoint finish = targetsHelper.getPointToNavigate();
TargetPoint start = targetsHelper.getPointToStart();
switchStartAndFinish(app, start, finish, false);
List<TargetPoint> points = targetsHelper.getIntermediatePoints();
Collections.reverse(points);
targetsHelper.reorderIntermediatePoints(points, true);
updateControls(ctx, helper);
}
public static void updateControls(Activity ctx, WaypointDialogHelper helper) { public static void updateControls(Activity ctx, WaypointDialogHelper helper) {
if (helper != null && helper.helperCallbacks != null) { if (helper != null && helper.helperCallbacks != null) {
for (WaypointDialogHelperCallback callback : helper.helperCallbacks) { for (WaypointDialogHelperCallback callback : helper.helperCallbacks) {
@ -492,15 +494,7 @@ public class WaypointDialogHelper {
MapActivity mapActivity = getMapActivity(); MapActivity mapActivity = getMapActivity();
if (mapActivity != null) { if (mapActivity != null) {
OsmandApplication app = mapActivity.getMyApplication(); OsmandApplication app = mapActivity.getMyApplication();
TargetPointsHelper targetsHelper = app.getTargetPointsHelper(); switchStartAndFinish(app, mapActivity, mapActivity.getDashboard().getWaypointDialogHelper(), true);
WaypointDialogHelper.switchStartAndFinish(
targetsHelper,
targetsHelper.getPointToNavigate(),
mapActivity,
targetsHelper.getPointToStart(),
app,
mapActivity.getDashboard().getWaypointDialogHelper()
);
} }
dismiss(); dismiss();
} }
@ -508,27 +502,26 @@ public class WaypointDialogHelper {
.create(); .create();
items.add(reorderStartAndFinishItem); items.add(reorderStartAndFinishItem);
BaseBottomSheetItem reorderAllItems = new SimpleBottomSheetItem.Builder() if (!Algorithms.isEmpty(targetsHelper.getIntermediatePoints())) {
.setIcon(getContentIcon(R.drawable.ic_action_sort_reverse_order)) BaseBottomSheetItem reorderAllItems = new SimpleBottomSheetItem.Builder()
.setTitle(getString(R.string.reverse_all_points)) .setIcon(getContentIcon(R.drawable.ic_action_sort_reverse_order))
.setLayoutId(R.layout.bottom_sheet_item_simple) .setTitle(getString(R.string.reverse_all_points))
.setOnClickListener(new View.OnClickListener() { .setLayoutId(R.layout.bottom_sheet_item_simple)
@Override .setOnClickListener(new View.OnClickListener() {
public void onClick(View v) { @Override
MapActivity mapActivity = getMapActivity(); public void onClick(View v) {
if (mapActivity != null) { MapActivity mapActivity = getMapActivity();
WaypointDialogHelper.reverseAllPoints( if (mapActivity != null) {
app, WaypointDialogHelper.reverseAllPoints(
mapActivity, app,
mapActivity.getDashboard().getWaypointDialogHelper() mapActivity,
); mapActivity.getDashboard().getWaypointDialogHelper()
);
}
dismiss();
} }
dismiss(); })
} .create();
})
.create();
int intermediateSize = targetsHelper.getIntermediatePoints().size();
if (intermediateSize > 2) {
items.add(reorderAllItems); items.add(reorderAllItems);
} }

View file

@ -53,7 +53,7 @@ import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard.GetImageCardsTask
import net.osmand.plus.mapcontextmenu.builders.cards.NoImagesCard; import net.osmand.plus.mapcontextmenu.builders.cards.NoImagesCard;
import net.osmand.plus.mapcontextmenu.controllers.TransportStopController; import net.osmand.plus.mapcontextmenu.controllers.TransportStopController;
import net.osmand.plus.openplacereviews.AddPhotosBottomSheetDialogFragment; import net.osmand.plus.openplacereviews.AddPhotosBottomSheetDialogFragment;
import net.osmand.plus.openplacereviews.OPRWebviewActivity; import net.osmand.plus.openplacereviews.OPRConstants;
import net.osmand.plus.openplacereviews.OprStartFragment; import net.osmand.plus.openplacereviews.OprStartFragment;
import net.osmand.plus.osmedit.opr.OpenDBAPI; import net.osmand.plus.osmedit.opr.OpenDBAPI;
import net.osmand.plus.poi.PoiUIFilter; import net.osmand.plus.poi.PoiUIFilter;
@ -382,10 +382,10 @@ public class MenuBuilder {
AddPhotosBottomSheetDialogFragment.showInstance(mapActivity.getSupportFragmentManager()); AddPhotosBottomSheetDialogFragment.showInstance(mapActivity.getSupportFragmentManager());
} else { } else {
registerResultListener(view); registerResultListener(view);
final String baseUrl = OPRWebviewActivity.getBaseUrl(app); final String baseUrl = OPRConstants.getBaseUrl(app);
final String name = OPRWebviewActivity.getUsernameFromCookie(app); final String name = app.getSettings().OPR_USERNAME.get();
final String privateKey = OPRWebviewActivity.getPrivateKeyFromCookie(app); final String privateKey = app.getSettings().OPR_ACCESS_TOKEN.get();
if (privateKey == null || privateKey.isEmpty()) { if (Algorithms.isBlank(privateKey) || Algorithms.isBlank(name)) {
OprStartFragment.showInstance(mapActivity.getSupportFragmentManager()); OprStartFragment.showInstance(mapActivity.getSupportFragmentManager());
return; return;
} }
@ -464,18 +464,20 @@ public class MenuBuilder {
private void uploadImageToPlace(InputStream image) { private void uploadImageToPlace(InputStream image) {
InputStream serverData = new ByteArrayInputStream(compressImage(image)); InputStream serverData = new ByteArrayInputStream(compressImage(image));
final String baseUrl = OPRWebviewActivity.getBaseUrl(app); final String baseUrl = OPRConstants.getBaseUrl(app);
String url = baseUrl + "api/ipfs/image"; String url = baseUrl + "api/ipfs/image";
String response = NetworkUtils.sendPostDataRequest(url, serverData); String response = NetworkUtils.sendPostDataRequest(url, serverData);
if (response != null) { if (response != null) {
int res = 0; int res = 0;
try { try {
StringBuilder error = new StringBuilder(); StringBuilder error = new StringBuilder();
String privateKey = app.getSettings().OPR_ACCESS_TOKEN.get();
String username = app.getSettings().OPR_USERNAME.get();
res = openDBAPI.uploadImage( res = openDBAPI.uploadImage(
placeId, placeId,
baseUrl, baseUrl,
OPRWebviewActivity.getPrivateKeyFromCookie(app), privateKey,
OPRWebviewActivity.getUsernameFromCookie(app), username,
response, error); response, error);
if (res != 200) { if (res != 200) {
showToastMessage(error.toString()); showToastMessage(error.toString());
@ -511,9 +513,9 @@ public class MenuBuilder {
//This method runs on non main thread //This method runs on non main thread
private void checkTokenAndShowScreen() { private void checkTokenAndShowScreen() {
final String baseUrl = OPRWebviewActivity.getBaseUrl(app); final String baseUrl = OPRConstants.getBaseUrl(app);
final String name = OPRWebviewActivity.getUsernameFromCookie(app); final String name = app.getSettings().OPR_USERNAME.get();
final String privateKey = OPRWebviewActivity.getPrivateKeyFromCookie(app); final String privateKey = app.getSettings().OPR_ACCESS_TOKEN.get();
if (openDBAPI.checkPrivateKeyValid(baseUrl, name, privateKey)) { if (openDBAPI.checkPrivateKeyValid(baseUrl, name, privateKey)) {
String str = app.getString(R.string.cannot_upload_image); String str = app.getString(R.string.cannot_upload_image);
showToastMessage(str); showToastMessage(str);

View file

@ -28,7 +28,7 @@ import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapcontextmenu.MenuBuilder; import net.osmand.plus.mapcontextmenu.MenuBuilder;
import net.osmand.plus.mapillary.MapillaryContributeCard; import net.osmand.plus.mapillary.MapillaryContributeCard;
import net.osmand.plus.mapillary.MapillaryImageCard; import net.osmand.plus.mapillary.MapillaryImageCard;
import net.osmand.plus.openplacereviews.OPRWebviewActivity; import net.osmand.plus.openplacereviews.OPRConstants;
import net.osmand.plus.wikimedia.WikiImageHelper; import net.osmand.plus.wikimedia.WikiImageHelper;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
@ -467,7 +467,7 @@ public abstract class ImageCard extends AbstractCard {
if (o instanceof Amenity) { if (o instanceof Amenity) {
Amenity am = (Amenity) o; Amenity am = (Amenity) o;
long amenityId = am.getId() >> 1; long amenityId = am.getId() >> 1;
String baseUrl = OPRWebviewActivity.getBaseUrl(app); String baseUrl = OPRConstants.getBaseUrl(app);
String url = baseUrl + "api/objects-by-index?type=opr.place&index=osmid&key=" + amenityId; String url = baseUrl + "api/objects-by-index?type=opr.place&index=osmid&key=" + amenityId;
String response = AndroidNetworkUtils.sendRequest(app, url, Collections.<String, String>emptyMap(), String response = AndroidNetworkUtils.sendRequest(app, url, Collections.<String, String>emptyMap(),
"Requesting location images...", false, false); "Requesting location images...", false, false);

View file

@ -0,0 +1,38 @@
package net.osmand.plus.openplacereviews;
import android.content.Context;
import net.osmand.plus.R;
import net.osmand.plus.osmedit.opr.OpenDBAPI;
public class OPRConstants {
public static final String OPR_OAUTH_PREFIX = "opr-oauth";
private static final String PURPOSE = OpenDBAPI.PURPOSE;
private static final String CALLBACK_URL = OPR_OAUTH_PREFIX + "://osmand_opr_auth";
public static String getBaseUrl(Context ctx) {
return ctx.getString(R.string.opr_base_url);
}
public static String getLoginUrl(Context ctx) {
return getBaseUrl(ctx) + "login" + getQueryString(ctx);
}
public static String getRegisterUrl(Context ctx) {
return getBaseUrl(ctx) + "signup" + getQueryString(ctx);
}
public static String getQueryString(Context ctx) {
return "?" + getPurposeParam(ctx) + "&" + getCallbackParam(ctx);
}
public static String getPurposeParam(Context ctx) {
return "purpose=" + PURPOSE;
}
public static String getCallbackParam(Context ctx) {
return "callback=" + CALLBACK_URL;
}
}

View file

@ -1,143 +0,0 @@
package net.osmand.plus.openplacereviews;
import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.webkit.CookieManager;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import net.osmand.AndroidUtils;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.activities.OsmandActionBarActivity;
import net.osmand.plus.settings.backend.OsmandSettings;
import java.util.ArrayList;
import java.util.List;
public class OPRWebviewActivity extends OsmandActionBarActivity {
public static final String KEY_LOGIN = "LOGIN_KEY";
public static final String KEY_TITLE = "TITLE_KEY";
private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)";
private WebView webView;
private boolean isLogin = false;
public static String getBaseUrl(Context ctx) {
return ctx.getString(R.string.opr_base_url);
}
public static String getCookieUrl(Context ctx) {
return getBaseUrl(ctx) + "profile";
}
public static String getLoginUrl(Context ctx) {
return getBaseUrl(ctx) + "login";
}
public static String getRegisterUrl(Context ctx) {
return getBaseUrl(ctx) + "signup";
}
public static List<String> getFinishUrls(Context ctx) {
String googleOAuthFinishUrl = getBaseUrl(ctx) + "auth?code=4";
String profileUrl = getCookieUrl(ctx);
List<String> urls = new ArrayList<>();
urls.add(googleOAuthFinishUrl);
urls.add(profileUrl);
return urls;
}
public void onCreate(Bundle savedInstanceState) {
OsmandApplication app = getMyApplication();
OsmandSettings settings = app.getSettings();
boolean nightMode = !settings.isLightContent();
int themeId = nightMode ? R.style.OsmandDarkTheme_NoActionbar : R.style.OsmandLightTheme_NoActionbar_LightStatusBar;
setTheme(themeId);
getWindow().setStatusBarColor(ContextCompat.getColor(this, nightMode
? R.color.list_background_color_dark : R.color.list_background_color_light));
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_opr_webview);
Bundle bundle = getIntent().getExtras();
Toolbar toolbar = findViewById(R.id.toolbar);
if (bundle != null) {
TextView titleView = findViewById(R.id.toolbar_text);
String title = bundle.getString(KEY_TITLE, "");
titleView.setText(title);
}
toolbar.setBackgroundDrawable(new ColorDrawable(AndroidUtils.getColorFromAttr(this, R.attr.bg_color)));
final Drawable upArrow = app.getUIUtilities().getIcon(AndroidUtils.getNavigationIconResId(this));
upArrow.setColorFilter(ContextCompat.getColor(this, R.color.color_favorite_gray), PorterDuff.Mode.SRC_ATOP);
toolbar.setNavigationIcon(upArrow);
toolbar.setNavigationContentDescription(R.string.access_shared_string_navigate_up);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
webView = findViewById(R.id.printDialogWebview);
webView.getSettings().setUserAgentString(USER_AGENT);
webView.setWebViewClient(new CloseOnSuccessWebViewClient());
webView.getSettings().setJavaScriptEnabled(true);
WebView.setWebContentsDebuggingEnabled(true);
if (bundle != null) {
isLogin = bundle.getBoolean(KEY_LOGIN);
if (isLogin) {
webView.loadUrl(getLoginUrl(this));
} else {
webView.loadUrl(getRegisterUrl(this));
}
}
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
public static String getPrivateKeyFromCookie(Context ctx) {
return returnCookieByKey(ctx, "opr-token");
}
public static String getUsernameFromCookie(Context ctx) {
return returnCookieByKey(ctx, "opr-nickname");
}
private static String returnCookieByKey(Context ctx, String key) {
String CookieValue = null;
CookieManager cookieManager = CookieManager.getInstance();
String cookies = cookieManager.getCookie(getCookieUrl(ctx));
if (cookies == null || cookies.isEmpty()) {
return "";
}
String[] temp = cookies.split(";");
for (String ar1 : temp) {
if (ar1.contains(key)) {
String[] temp1 = ar1.split("=");
CookieValue = temp1[1];
break;
}
}
return CookieValue;
}
public class CloseOnSuccessWebViewClient extends WebViewClient {
@Override
public void onPageFinished(WebView view, String url) {
for (String furl : getFinishUrls(OPRWebviewActivity.this)) {
if (url.contains(furl) && isLogin) {
finish();
}
}
super.onPageFinished(view, url);
}
}
}

View file

@ -1,7 +1,7 @@
package net.osmand.plus.openplacereviews; package net.osmand.plus.openplacereviews;
import android.content.Intent;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.SpannableString; import android.text.SpannableString;
@ -13,15 +13,18 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.browser.customtabs.CustomTabsIntent;
import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
import net.osmand.plus.BuildConfig;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.UiUtilities; import net.osmand.plus.UiUtilities;
import net.osmand.plus.base.BaseOsmAndFragment; import net.osmand.plus.base.BaseOsmAndFragment;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
public class OprStartFragment extends BaseOsmAndFragment { public class OprStartFragment extends BaseOsmAndFragment {
@ -50,10 +53,7 @@ public class OprStartFragment extends BaseOsmAndFragment {
createAccount.setOnClickListener(new View.OnClickListener() { createAccount.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
Intent i = new Intent(requireContext(), OPRWebviewActivity.class); handleCreateAccount();
i.putExtra(OPRWebviewActivity.KEY_TITLE, getString(R.string.register_opr_create_new_account));
i.putExtra(OPRWebviewActivity.KEY_LOGIN, false);
startActivity(i);
} }
}); });
View haveAccount = v.findViewById(R.id.register_opr_have_account); View haveAccount = v.findViewById(R.id.register_opr_have_account);
@ -62,16 +62,27 @@ public class OprStartFragment extends BaseOsmAndFragment {
haveAccount.setOnClickListener(new View.OnClickListener() { haveAccount.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
Intent i = new Intent(requireContext(), OPRWebviewActivity.class); handleHaveAccount();
i.putExtra(OPRWebviewActivity.KEY_TITLE, getString(R.string.user_login));
i.putExtra(OPRWebviewActivity.KEY_LOGIN, true);
startActivity(i);
} }
}); });
setURLSpan(v); setURLSpan(v);
return v; return v;
} }
private void handleHaveAccount() {
String url = OPRConstants.getLoginUrl(requireContext());
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(requireContext(), Uri.parse(url));
}
private void handleCreateAccount() {
String url = OPRConstants.getRegisterUrl(requireContext());
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(requireContext(), Uri.parse(url));
}
private void setURLSpan(View v) { private void setURLSpan(View v) {
String desc = requireContext().getString(R.string.register_on_openplacereviews_desc); String desc = requireContext().getString(R.string.register_on_openplacereviews_desc);
SpannableString ss = new SpannableString(desc); SpannableString ss = new SpannableString(desc);

View file

@ -72,20 +72,13 @@ public class SendPoiBottomSheetFragment extends MenuBottomSheetDialogFragment {
String userNameOpenID = settings.USER_NAME.get(); String userNameOpenID = settings.USER_NAME.get();
String userName = isLoginOAuth(settings) ? userNameOAuth : userNameOpenID; String userName = isLoginOAuth(settings) ? userNameOAuth : userNameOpenID;
accountName.setText(userName); accountName.setText(userName);
closeChangeSet.setBackgroundResource(isNightMode ? R.drawable.layout_bg_dark : R.drawable.layout_bg);
final int paddingSmall = app.getResources().getDimensionPixelSize(R.dimen.content_padding_small); final int paddingSmall = app.getResources().getDimensionPixelSize(R.dimen.content_padding_small);
closeChangeSet.setPadding(paddingSmall, 0, paddingSmall, 0); closeChangeSet.setChecked(true);
setCloseChangeSet(isNightMode, paddingSmall);
closeChangeSet.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { closeChangeSet.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override @Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isNightMode) { setCloseChangeSet(isNightMode, paddingSmall);
closeChangeSet.setBackgroundResource(
isChecked ? R.drawable.layout_bg_dark_solid : R.drawable.layout_bg_dark);
} else {
closeChangeSet.setBackgroundResource(
isChecked ? R.drawable.layout_bg_solid : R.drawable.layout_bg);
}
closeChangeSet.setPadding(paddingSmall, 0, paddingSmall, 0);
} }
}); });
LinearLayout account = sendOsmPoiView.findViewById(R.id.account_container); LinearLayout account = sendOsmPoiView.findViewById(R.id.account_container);
@ -254,5 +247,16 @@ public class SendPoiBottomSheetFragment extends MenuBottomSheetDialogFragment {
} }
return comment; return comment;
} }
private void setCloseChangeSet(boolean isNightMode, int paddingSmall) {
if (isNightMode) {
closeChangeSet.setBackgroundResource(
closeChangeSet.isChecked() ? R.drawable.layout_bg_dark_solid : R.drawable.layout_bg_dark);
} else {
closeChangeSet.setBackgroundResource(
closeChangeSet.isChecked() ? R.drawable.layout_bg_solid : R.drawable.layout_bg);
}
closeChangeSet.setPadding(paddingSmall, 0, paddingSmall, 0);
}
} }

View file

@ -37,6 +37,7 @@ import static org.openplacereviews.opendb.SecUtils.signMessageWithKeyBase64;
public class OpenDBAPI { public class OpenDBAPI {
public static final String PURPOSE = "osmand-android";
private static final Log log = PlatformUtil.getLog(SecUtils.class); private static final Log log = PlatformUtil.getLog(SecUtils.class);
private static final String checkLoginEndpoint = "api/auth/user-check-loginkey?"; private static final String checkLoginEndpoint = "api/auth/user-check-loginkey?";
private static final String LOGIN_SUCCESS_MESSAGE = "{\"result\":\"OK\"}"; private static final String LOGIN_SUCCESS_MESSAGE = "{\"result\":\"OK\"}";
@ -45,7 +46,7 @@ public class OpenDBAPI {
/* /*
* method for check if user is loggined in blockchain * method for check if user is loggined in blockchain
* params * params
* - username: blockchain username in format "openplacereviews:test_1" * - username: blockchain username in format "openplacereviews"
* - privatekey: "base64:PKCS#8:actualKey" * - privatekey: "base64:PKCS#8:actualKey"
* Need to encode key * Need to encode key
* Do not call on mainThread * Do not call on mainThread
@ -53,7 +54,8 @@ public class OpenDBAPI {
public boolean checkPrivateKeyValid(String baseUrl, String username, String privateKey) { public boolean checkPrivateKeyValid(String baseUrl, String username, String privateKey) {
String url = null; String url = null;
try { try {
url = baseUrl + checkLoginEndpoint + String purposeParam = "purpose=" + PURPOSE;
url = baseUrl + checkLoginEndpoint + purposeParam + "&" +
"name=" + "name=" +
username + username +
"&" + "&" +
@ -74,7 +76,7 @@ public class OpenDBAPI {
Security.addProvider(new BouncyCastleProvider()); Security.addProvider(new BouncyCastleProvider());
} }
KeyPair kp = SecUtils.getKeyPair(ALGO_EC, privateKey, null); KeyPair kp = SecUtils.getKeyPair(ALGO_EC, privateKey, null);
String signed = username + ":opr-web"; String signed = username + ":" + PURPOSE;
JsonFormatter formatter = new JsonFormatter(); JsonFormatter formatter = new JsonFormatter();
OPRImage oprImage = new GsonBuilder().create().fromJson(image, OPRImage.class); OPRImage oprImage = new GsonBuilder().create().fromJson(image, OPRImage.class);

View file

@ -27,8 +27,6 @@ import net.osmand.data.FavouritePoint;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.data.PointDescription; import net.osmand.data.PointDescription;
import net.osmand.plus.FavouritesDbHelper; import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.mapmarkers.MapMarkersHelper;
import net.osmand.plus.mapmarkers.MapMarker;
import net.osmand.plus.OsmAndLocationProvider; import net.osmand.plus.OsmAndLocationProvider;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
@ -46,6 +44,8 @@ import net.osmand.plus.helpers.FontCache;
import net.osmand.plus.helpers.MapMarkerDialogHelper; import net.osmand.plus.helpers.MapMarkerDialogHelper;
import net.osmand.plus.helpers.WaypointDialogHelper; import net.osmand.plus.helpers.WaypointDialogHelper;
import net.osmand.plus.mapcontextmenu.other.FavouritesBottomSheetMenuFragment; import net.osmand.plus.mapcontextmenu.other.FavouritesBottomSheetMenuFragment;
import net.osmand.plus.mapmarkers.MapMarker;
import net.osmand.plus.mapmarkers.MapMarkersHelper;
import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu.PointType; import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu.PointType;
import net.osmand.plus.search.QuickSearchDialogFragment; import net.osmand.plus.search.QuickSearchDialogFragment;
import net.osmand.plus.widgets.style.CustomTypefaceSpan; import net.osmand.plus.widgets.style.CustomTypefaceSpan;
@ -348,9 +348,8 @@ public class AddPointBottomSheetDialog extends MenuBottomSheetDialogFragment {
mapActivity.getMyApplication().showShortToastMessage(R.string.route_add_start_point); mapActivity.getMyApplication().showShortToastMessage(R.string.route_add_start_point);
return; return;
} }
WaypointDialogHelper.switchStartAndFinish(targetsHelper, targetsHelper.getPointToNavigate(), WaypointDialogHelper.switchStartAndFinish(mapActivity.getMyApplication(), mapActivity,
mapActivity, targetsHelper.getPointToStart(), mapActivity.getMyApplication(), mapActivity.getDashboard().getWaypointDialogHelper(), true);
mapActivity.getDashboard().getWaypointDialogHelper());
} }
dismiss(); dismiss();
} }

View file

@ -65,6 +65,7 @@ import net.osmand.plus.base.ContextMenuFragment.MenuState;
import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo; import net.osmand.plus.helpers.AvoidSpecificRoads.AvoidRoadInfo;
import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.GpxUiHelper;
import net.osmand.plus.helpers.WaypointDialogHelper;
import net.osmand.plus.helpers.WaypointHelper; import net.osmand.plus.helpers.WaypointHelper;
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenuFragment; import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenuFragment;
import net.osmand.plus.mapmarkers.MapMarker; import net.osmand.plus.mapmarkers.MapMarker;
@ -1853,9 +1854,13 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener
new PointDescription(PointDescription.POINT_TYPE_MY_LOCATION, mapActivity.getString(R.string.shared_string_my_location))); new PointDescription(PointDescription.POINT_TYPE_MY_LOCATION, mapActivity.getString(R.string.shared_string_my_location)));
} }
if (startPoint != null) { if (startPoint != null) {
targetPointsHelper.navigateToPoint(startPoint.point, false, -1, startPoint.getPointDescription(mapActivity)); int intermediateSize = targetPointsHelper.getIntermediatePoints().size();
targetPointsHelper.setStartPoint(endPoint.point, false, endPoint.getPointDescription(mapActivity)); if (intermediateSize > 1) {
targetPointsHelper.updateRouteAndRefresh(true); WaypointDialogHelper.reverseAllPoints(app, mapActivity, mapActivity.getDashboard().getWaypointDialogHelper());
} else {
WaypointDialogHelper.switchStartAndFinish(mapActivity.getMyApplication(),
mapActivity, mapActivity.getDashboard().getWaypointDialogHelper(), true);
}
} else { } else {
app.showShortToastMessage(R.string.route_add_start_point); app.showShortToastMessage(R.string.route_add_start_point);
} }

View file

@ -1163,6 +1163,12 @@ public class OsmandSettings {
public final OsmandPreference<String> USER_ACCESS_TOKEN_SECRET = public final OsmandPreference<String> USER_ACCESS_TOKEN_SECRET =
new StringPreference(this, "user_access_token_secret", "").makeGlobal(); new StringPreference(this, "user_access_token_secret", "").makeGlobal();
public final OsmandPreference<String> OPR_ACCESS_TOKEN =
new StringPreference(this, "opr_user_access_token_secret", "").makeGlobal();
public final OsmandPreference<String> OPR_USERNAME =
new StringPreference(this, "opr_username_secret", "").makeGlobal();
// this value boolean is synchronized with settings_pref.xml preference offline POI/Bugs edition // this value boolean is synchronized with settings_pref.xml preference offline POI/Bugs edition
public final OsmandPreference<Boolean> OFFLINE_EDITION = new BooleanPreference(this, "offline_osm_editing", true).makeGlobal().makeShared(); public final OsmandPreference<Boolean> OFFLINE_EDITION = new BooleanPreference(this, "offline_osm_editing", true).makeGlobal().makeShared();
public final OsmandPreference<Boolean> USE_DEV_URL = new BooleanPreference(this, "use_dev_url", false).makeGlobal().makeShared(); public final OsmandPreference<Boolean> USE_DEV_URL = new BooleanPreference(this, "use_dev_url", false).makeGlobal().makeShared();

View file

@ -301,7 +301,7 @@ public class WikiArticleHelper {
return null; return null;
} }
String firstParagraphHtml = content.substring(firstParagraphStart, firstParagraphEnd + P_CLOSED.length()); String firstParagraphHtml = content.substring(firstParagraphStart, firstParagraphEnd + P_CLOSED.length());
while (firstParagraphHtml.length() == (P_OPENED.length() + P_CLOSED.length()) while (firstParagraphHtml.substring(P_OPENED.length(), firstParagraphHtml.length() - P_CLOSED.length()).trim().isEmpty()
&& (firstParagraphEnd + P_CLOSED.length()) < content.length()) { && (firstParagraphEnd + P_CLOSED.length()) < content.length()) {
firstParagraphStart = content.indexOf(P_OPENED, firstParagraphEnd); firstParagraphStart = content.indexOf(P_OPENED, firstParagraphEnd);
firstParagraphEnd = firstParagraphStart == -1 ? -1 : content.indexOf(P_CLOSED, firstParagraphStart); firstParagraphEnd = firstParagraphStart == -1 ? -1 : content.indexOf(P_CLOSED, firstParagraphStart);

View file

@ -33,6 +33,7 @@ public class TravelArticle {
String lang; String lang;
String contentsJson; String contentsJson;
String aggregatedPartOf; String aggregatedPartOf;
String fullContent;
public String getTitle() { public String getTitle() {

View file

@ -46,6 +46,7 @@ public class TravelDbHelper implements TravelHelper {
private static final Log LOG = PlatformUtil.getLog(TravelDbHelper.class); private static final Log LOG = PlatformUtil.getLog(TravelDbHelper.class);
private static final String WORLD_WIKIVOYAGE_FILE_NAME = "World_wikivoyage.sqlite";
private static final String ARTICLES_TABLE_NAME = "travel_articles"; private static final String ARTICLES_TABLE_NAME = "travel_articles";
private static final String POPULAR_TABLE_NAME = "popular_articles"; private static final String POPULAR_TABLE_NAME = "popular_articles";
private static final String ARTICLES_POP_INDEX = "popularity_index"; private static final String ARTICLES_POP_INDEX = "popularity_index";
@ -185,6 +186,11 @@ public class TravelDbHelper implements TravelHelper {
return null; return null;
} }
@Override
public String getWikivoyageFileName() {
return WORLD_WIKIVOYAGE_FILE_NAME;
}
public List<File> getExistingTravelBooks() { public List<File> getExistingTravelBooks() {
return existingTravelBooks; return existingTravelBooks;
} }

View file

@ -49,4 +49,6 @@ public interface TravelHelper {
// For TravelOBFHelper it could always return "" and should be no problem // For TravelOBFHelper it could always return "" and should be no problem
// Bookmarks should be refactored properly to support multiple files // Bookmarks should be refactored properly to support multiple files
String getSelectedTravelBookName(); String getSelectedTravelBookName();
String getWikivoyageFileName();
} }

View file

@ -9,7 +9,6 @@ import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; import net.osmand.plus.api.SQLiteAPI.SQLiteCursor;
import net.osmand.plus.wikipedia.WikiArticleHelper; import net.osmand.plus.wikipedia.WikiArticleHelper;
import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
@ -119,6 +118,8 @@ public class TravelLocalDataHelper {
saved.lat = article.lat; saved.lat = article.lat;
saved.lon = article.lon; saved.lon = article.lon;
saved.routeId = article.routeId; saved.routeId = article.routeId;
saved.fullContent = article.getContent();
saved.contentsJson = article.contentsJson;
savedArticles.add(saved); savedArticles.add(saved);
dbHelper.addSavedArticle(saved); dbHelper.addSavedArticle(saved);
notifySavedUpdated(); notifySavedUpdated();
@ -162,6 +163,18 @@ public class TravelLocalDataHelper {
return null; return null;
} }
@Nullable
public TravelArticle getSavedArticle(String routeId, String lang) {
for (TravelArticle article : savedArticles) {
if (article.routeId != null && article.routeId.equals(routeId)
&& article.lang != null && article.lang.equals(lang)) {
article.content = article.fullContent;
return article;
}
}
return null;
}
public interface Listener { public interface Listener {
void savedArticlesUpdated(); void savedArticlesUpdated();
@ -169,7 +182,7 @@ public class TravelLocalDataHelper {
private static class WikivoyageLocalDataDbHelper { private static class WikivoyageLocalDataDbHelper {
private static final int DB_VERSION = 5; private static final int DB_VERSION = 6;
private static final String DB_NAME = "wikivoyage_local_data"; private static final String DB_NAME = "wikivoyage_local_data";
private static final String HISTORY_TABLE_NAME = "wikivoyage_search_history"; private static final String HISTORY_TABLE_NAME = "wikivoyage_search_history";
@ -204,6 +217,8 @@ public class TravelLocalDataHelper {
private static final String BOOKMARKS_COL_LAT = "lat"; private static final String BOOKMARKS_COL_LAT = "lat";
private static final String BOOKMARKS_COL_LON = "lon"; private static final String BOOKMARKS_COL_LON = "lon";
private static final String BOOKMARKS_COL_ROUTE_ID = "route_id"; private static final String BOOKMARKS_COL_ROUTE_ID = "route_id";
private static final String BOOKMARKS_COL_CONTENT_JSON = "content_json";
private static final String BOOKMARKS_COL_CONTENT = "content";
private static final String BOOKMARKS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " + private static final String BOOKMARKS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " +
BOOKMARKS_TABLE_NAME + " (" + BOOKMARKS_TABLE_NAME + " (" +
@ -215,7 +230,9 @@ public class TravelLocalDataHelper {
BOOKMARKS_COL_TRAVEL_BOOK + " TEXT, " + BOOKMARKS_COL_TRAVEL_BOOK + " TEXT, " +
BOOKMARKS_COL_LAT + " double, " + BOOKMARKS_COL_LAT + " double, " +
BOOKMARKS_COL_LON + " double, " + BOOKMARKS_COL_LON + " double, " +
BOOKMARKS_COL_ROUTE_ID + " TEXT" + ");"; BOOKMARKS_COL_ROUTE_ID + " TEXT, " +
BOOKMARKS_COL_CONTENT_JSON + " TEXT, " +
BOOKMARKS_COL_CONTENT + " TEXT" + ");";
private static final String BOOKMARKS_TABLE_SELECT = "SELECT " + private static final String BOOKMARKS_TABLE_SELECT = "SELECT " +
BOOKMARKS_COL_ARTICLE_TITLE + ", " + BOOKMARKS_COL_ARTICLE_TITLE + ", " +
@ -225,7 +242,9 @@ public class TravelLocalDataHelper {
BOOKMARKS_COL_PARTIAL_CONTENT + ", " + BOOKMARKS_COL_PARTIAL_CONTENT + ", " +
BOOKMARKS_COL_LAT + ", " + BOOKMARKS_COL_LAT + ", " +
BOOKMARKS_COL_LON + ", " + BOOKMARKS_COL_LON + ", " +
BOOKMARKS_COL_ROUTE_ID + BOOKMARKS_COL_ROUTE_ID + ", " +
BOOKMARKS_COL_CONTENT_JSON + ", " +
BOOKMARKS_COL_CONTENT +
" FROM " + BOOKMARKS_TABLE_NAME; " FROM " + BOOKMARKS_TABLE_NAME;
private final OsmandApplication context; private final OsmandApplication context;
@ -278,6 +297,10 @@ public class TravelLocalDataHelper {
if (oldVersion < 5) { if (oldVersion < 5) {
conn.execSQL("ALTER TABLE " + BOOKMARKS_TABLE_NAME + " ADD " + BOOKMARKS_COL_ROUTE_ID + " TEXT"); conn.execSQL("ALTER TABLE " + BOOKMARKS_TABLE_NAME + " ADD " + BOOKMARKS_COL_ROUTE_ID + " TEXT");
} }
if (oldVersion < 6) {
conn.execSQL("ALTER TABLE " + BOOKMARKS_TABLE_NAME + " ADD " + BOOKMARKS_COL_CONTENT_JSON + " TEXT");
conn.execSQL("ALTER TABLE " + BOOKMARKS_TABLE_NAME + " ADD " + BOOKMARKS_COL_CONTENT + " TEXT");
}
} }
@NonNull @NonNull
@ -428,11 +451,14 @@ public class TravelLocalDataHelper {
BOOKMARKS_COL_TRAVEL_BOOK + ", " + BOOKMARKS_COL_TRAVEL_BOOK + ", " +
BOOKMARKS_COL_LAT + ", " + BOOKMARKS_COL_LAT + ", " +
BOOKMARKS_COL_LON + ", " + BOOKMARKS_COL_LON + ", " +
BOOKMARKS_COL_ROUTE_ID + BOOKMARKS_COL_ROUTE_ID + ", " +
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; BOOKMARKS_COL_CONTENT_JSON + ", " +
BOOKMARKS_COL_CONTENT +
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
conn.execSQL(query, new Object[]{article.title, article.lang, conn.execSQL(query, new Object[]{article.title, article.lang,
article.aggregatedPartOf, article.imageTitle, article.content, article.aggregatedPartOf, article.imageTitle, article.content,
travelBook, article.lat, article.lon, article.routeId}); travelBook, article.lat, article.lon, article.routeId, article.contentsJson,
article.fullContent});
} finally { } finally {
conn.close(); conn.close();
} }
@ -484,6 +510,8 @@ public class TravelLocalDataHelper {
res.lat = cursor.getDouble(cursor.getColumnIndex(BOOKMARKS_COL_LAT)); res.lat = cursor.getDouble(cursor.getColumnIndex(BOOKMARKS_COL_LAT));
res.lon = cursor.getDouble(cursor.getColumnIndex(BOOKMARKS_COL_LON)); res.lon = cursor.getDouble(cursor.getColumnIndex(BOOKMARKS_COL_LON));
res.routeId = cursor.getString(cursor.getColumnIndex(BOOKMARKS_COL_ROUTE_ID)); res.routeId = cursor.getString(cursor.getColumnIndex(BOOKMARKS_COL_ROUTE_ID));
res.contentsJson = cursor.getString(cursor.getColumnIndex(BOOKMARKS_COL_CONTENT_JSON));
res.fullContent = cursor.getString(cursor.getColumnIndex(BOOKMARKS_COL_CONTENT));
return res; return res;
} }

View file

@ -37,8 +37,10 @@ import static net.osmand.CollatorStringMatcher.StringMatcherMode.CHECK_EQUALS_FR
public class TravelObfHelper implements TravelHelper { public class TravelObfHelper implements TravelHelper {
private static final Log LOG = PlatformUtil.getLog(TravelObfHelper.class); private static final Log LOG = PlatformUtil.getLog(TravelObfHelper.class);
public static final String ROUTE_ARTICLE = "route_article";
public static final int SEARCH_RADIUS = 100000; private static final String WORLD_WIKIVOYAGE_FILE_NAME = "World_wikivoyage.travel.obf";
private static final String ROUTE_ARTICLE = "route_article";
private static final int SEARCH_RADIUS = 100000;
private final OsmandApplication app; private final OsmandApplication app;
private final Collator collator; private final Collator collator;
@ -249,9 +251,12 @@ public class TravelObfHelper implements TravelHelper {
TravelArticle article = cachedArticles.get(routeId); TravelArticle article = cachedArticles.get(routeId);
if (article != null) { if (article != null) {
return article; return article;
} else { }
article = getArticleByIdFromTravelBooks(routeId, lang);
if (article != null) {
return getArticleByIdFromTravelBooks(routeId, lang); return getArticleByIdFromTravelBooks(routeId, lang);
} }
return localDataHelper.getSavedArticle(routeId, lang);
} }
private TravelArticle getArticleByIdFromTravelBooks(final String routeId, final String lang) { private TravelArticle getArticleByIdFromTravelBooks(final String routeId, final String lang) {
@ -392,4 +397,9 @@ public class TravelObfHelper implements TravelHelper {
public String getSelectedTravelBookName() { public String getSelectedTravelBookName() {
return ""; return "";
} }
@Override
public String getWikivoyageFileName() {
return WORLD_WIKIVOYAGE_FILE_NAME;
}
} }

View file

@ -142,7 +142,9 @@ public class ExploreRvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
public void addNeededMapsCard(TravelNeededMapsCard card) { public void addNeededMapsCard(TravelNeededMapsCard card) {
this.neededMapsCard = card; this.neededMapsCard = card;
if (addItem(getNeededMapsCardPosition(), card)) { if (neededMapsCardExists(getNeededMapsCardPosition())) {
updateNeededMapsCard(false);
} else if (addItem(getNeededMapsCardPosition(), card)) {
notifyDataSetChanged(); notifyDataSetChanged();
} }
} }
@ -183,7 +185,9 @@ public class ExploreRvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
public void addDownloadUpdateCard(TravelDownloadUpdateCard card) { public void addDownloadUpdateCard(TravelDownloadUpdateCard card) {
this.downloadCard = card; this.downloadCard = card;
if (addItem(getDownloadUpdateCardPosition(), card)) { if (downloadUpdateCardExists(getDownloadUpdateCardPosition())) {
updateDownloadUpdateCard(false);
} else if (addItem(getDownloadUpdateCardPosition(), card)) {
notifyDataSetChanged(); notifyDataSetChanged();
} }
} }

View file

@ -45,8 +45,6 @@ import java.util.List;
public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEvents, TravelLocalDataHelper.Listener { public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEvents, TravelLocalDataHelper.Listener {
private static final String WORLD_WIKIVOYAGE_FILE_NAME = "World_wikivoyage.sqlite";
private static boolean SHOW_TRAVEL_UPDATE_CARD = true; private static boolean SHOW_TRAVEL_UPDATE_CARD = true;
private static boolean SHOW_TRAVEL_NEEDED_MAPS_CARD = true; private static boolean SHOW_TRAVEL_NEEDED_MAPS_CARD = true;
@ -342,14 +340,6 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv
return res.toArray(new IndexItem[0]); return res.toArray(new IndexItem[0]);
} }
@NonNull
private String getWikivoyageFileName() {
// OsmandApplication app = getMyApplication();
// File selectedTravelBook = app != null ? app.getTravelDbHelper().getSelectedTravelBook() : null;
// return selectedTravelBook == null ? WORLD_WIKIVOYAGE_FILE_NAME : selectedTravelBook.getName();
return WORLD_WIKIVOYAGE_FILE_NAME;
}
private void removeDownloadUpdateCard() { private void removeDownloadUpdateCard() {
if (adapter != null) { if (adapter != null) {
adapter.removeDownloadUpdateCard(); adapter.removeDownloadUpdateCard();
@ -379,7 +369,7 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv
ProcessIndexItemsTask(ExploreTabFragment fragment) { ProcessIndexItemsTask(ExploreTabFragment fragment) {
app = fragment.getMyApplication(); app = fragment.getMyApplication();
weakFragment = new WeakReference<>(fragment); weakFragment = new WeakReference<>(fragment);
fileName = fragment.getWikivoyageFileName(); fileName = app.getTravelHelper().getWikivoyageFileName();
} }
@Override @Override

View file

@ -50,7 +50,7 @@ public class SavedArticlesTabFragment extends BaseOsmAndFragment implements Trav
public void openArticle(TravelArticle article) { public void openArticle(TravelArticle article) {
FragmentManager fm = getFragmentManager(); FragmentManager fm = getFragmentManager();
if (fm != null) { if (fm != null) {
WikivoyageArticleDialogFragment.showInstanceByTitle(app, fm, article.getTitle(), article.getLang()); WikivoyageArticleDialogFragment.showInstance(app, fm, article.getRouteId(), article.getLang());
} }
} }
}); });
@ -161,7 +161,8 @@ public class SavedArticlesTabFragment extends BaseOsmAndFragment implements Trav
} }
TravelArticle oldArticle = (TravelArticle) oldItem; TravelArticle oldArticle = (TravelArticle) oldItem;
TravelArticle newArticle = (TravelArticle) newItem; TravelArticle newArticle = (TravelArticle) newItem;
return oldArticle.getRouteId().equals(newArticle.getRouteId()) return oldArticle.getRouteId() != null && oldArticle.getLang() != null &&
oldArticle.getRouteId().equals(newArticle.getRouteId())
&& oldArticle.getLang().equals(newArticle.getLang()); && oldArticle.getLang().equals(newArticle.getLang());
} }
return false; return false;