Merge pull request #10513 from osmandapp/master

update test branch
This commit is contained in:
Hardy 2021-01-03 08:14:28 +01:00 committed by GitHub
commit 5f2762e520
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
34 changed files with 1527 additions and 530 deletions

View file

@ -56,6 +56,7 @@
android:layout_height="wrap_content"
android:letterSpacing="@dimen/description_letter_spacing"
android:maxLines="4"
android:scrollbars="none"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular" />

View file

@ -3902,4 +3902,7 @@
<string name="poi_weightbridge">Fahrzeugwaage</string>
<string name="poi_ranger_station">Rangerstation</string>
<string name="poi_swimming_area">Schwimmbereich</string>
<string name="poi_wildlife_crossing_bat_tunnel">Fledermaustunnel</string>
<string name="poi_wildlife_crossing_bat_bridge">Fledermausbrücke</string>
<string name="poi_wildlife_crossing">Wildwechsel</string>
</resources>

View file

@ -322,7 +322,7 @@
<string name="poi_fuel_e85">E85</string>
<string name="poi_fuel_biogas">biogaso</string>
<string name="poi_fuel_electricity">elektro</string>
<string name="poi_electricity_combined_charging">Ŝargostacio</string>
<string name="poi_electricity_combined_charging">Ŝargostacio;shargostacio;sxargostacio;stacio de ŝargo;elektroaŭto;elektra aŭto;tesla</string>
<string name="poi_vehicle_ramp">Aŭtomobil-ripara fosaĵeto</string>
<string name="poi_taxi">Taksistacio</string>
<string name="poi_railway_buffer_stop">Baraĵo trakfina</string>
@ -3891,4 +3891,8 @@
<string name="poi_ranger_station">Oficejo de naturrezervejo</string>
<string name="poi_lavoir">Vestaĵ-lavejo (ĉe rivero)</string>
<string name="poi_waste_transfer_station">Stacio de rubmastrumado</string>
<string name="poi_wildlife_crossing_bat_tunnel">Tunelo por vespertoj</string>
<string name="poi_wildlife_crossing_bat_bridge">Ponto por vespertoj</string>
<string name="poi_wildlife_crossing">Trairejo por sovaĝaj bestoj</string>
<string name="poi_swimming_area">Naĝejo natura</string>
</resources>

View file

@ -189,7 +189,7 @@
<string name="poi_fuel_biogas">Biogás</string>
<string name="poi_fuel_lh2">Hidrógeno líquido</string>
<string name="poi_fuel_electricity">Electricidad</string>
<string name="poi_electricity_combined_charging">Estación vehícular de carga eléctrica</string>
<string name="poi_electricity_combined_charging">Estación de carga para vehículos eléctricos;Estación vehícular de carga eléctrica;Suministro para vehículos eléctricos</string>
<string name="poi_vehicle_ramp">Rampa de vehículos</string>
<string name="poi_compressed_air">Aire comprimido</string>
<string name="poi_parking">Estacionamiento;Aparcamiento</string>
@ -3905,4 +3905,8 @@
<string name="poi_ranger_station">Estación de guardabosques</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_wildlife_crossing_bat_tunnel">Túnel para murciélagos</string>
<string name="poi_wildlife_crossing_bat_bridge">Puente para murciélagos</string>
<string name="poi_wildlife_crossing">Cruce de vida silvestre</string>
<string name="poi_swimming_area">Área de natación</string>
</resources>

View file

@ -189,7 +189,7 @@
<string name="poi_fuel_biogas">Biogás</string>
<string name="poi_fuel_lh2">Hidrógeno líquido</string>
<string name="poi_fuel_electricity">Electricidad</string>
<string name="poi_electricity_combined_charging">Estación vehícular de carga eléctrica</string>
<string name="poi_electricity_combined_charging">Estación de carga para vehículos eléctricos;Estación vehícular de carga eléctrica;Suministro para vehículos eléctricos</string>
<string name="poi_vehicle_ramp">Rampa de vehículos</string>
<string name="poi_compressed_air">Aire comprimido</string>
<string name="poi_parking">Estacionamiento;Aparcamiento</string>
@ -3905,4 +3905,8 @@
<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>
<string name="poi_wildlife_crossing_bat_tunnel">Túnel para murciélagos</string>
<string name="poi_wildlife_crossing_bat_bridge">Puente para murciélagos</string>
<string name="poi_wildlife_crossing">Cruce de vida silvestre</string>
<string name="poi_swimming_area">Área de natación</string>
</resources>

View file

@ -124,7 +124,7 @@
<string name="poi_fuel_methanol">Metanol</string>
<string name="poi_fuel_lh2">Hidrógeno líquido</string>
<string name="poi_fuel_electricity">Electricidad</string>
<string name="poi_electricity_combined_charging">Estación de carga</string>
<string name="poi_electricity_combined_charging">Estación de carga;Estación de carga de vehículos eléctricos; Punto de recarga eléctrica; Punto de carga; Estación de carga electrónica; Equipo de suministro de vehículos eléctricos</string>
<string name="poi_vehicle_ramp">Rampa de vehículos</string>
<string name="poi_compressed_air">Aire comprimido</string>
<string name="poi_parking">Aparcamiento</string>
@ -3626,7 +3626,7 @@
<string name="poi_vehicle_military">Acceso de vehículos: militar</string>
<string name="poi_vehicle_delivery">Acceso del vehículo: entrega</string>
<string name="poi_vehicle_forestry">Acceso de vehículos: silvicultura</string>
<string name="poi_motorcar_yes">Acceso a los coches:</string>
<string name="poi_motorcar_yes">Acceso a los coches: si</string>
<string name="poi_motorcar_private">Acceso para automóviles: privado</string>
<string name="poi_motorcar_no">Acceso para automóviles: no</string>
<string name="poi_motorcar_destination">Acceso para automóviles: destino</string>
@ -3851,4 +3851,56 @@
<string name="poi_parking_rooftop">Azotea</string>
<string name="poi_gpx_point">Punto GPX</string>
<string name="poi_fuel_lng">Gas natural licuado</string>
<string name="poi_liaison_filter">Enlace</string>
<string name="poi_diplomatic_liaison">Enlace</string>
<string name="poi_wildlife_crossing_bat_tunnel">Túnel para murciélagos</string>
<string name="poi_wildlife_crossing_bat_bridge">Puente para murciélagos</string>
<string name="poi_wildlife_crossing">Cruce de vida silvestre</string>
<string name="poi_swimming_area">Área de natación</string>
<string name="poi_lavoir">Lavadero público de ropa</string>
<string name="poi_ranger_station">Estación de guardabosques</string>
<string name="poi_water_source_well">Pozo</string>
<string name="poi_water_source_tube_well">Pozo entubado</string>
<string name="poi_nurse">Enfermera</string>
<string name="poi_mobile_money_agent">Agente de dinero móvil</string>
<string name="poi_consulate_honorary_consul">Cónsul honorario</string>
<string name="poi_consulate_consular_office">Oficina consular</string>
<string name="poi_consulate_consular_agency">Agencia consular</string>
<string name="poi_consulate_yes">Dirigido por un cónsul</string>
<string name="poi_embassy_nunciature">Nunciatura</string>
<string name="poi_diplomatic_services_citizen_services_filter">Servicios al ciudadano</string>
<string name="poi_diplomatic_services_immigrant_visas_filter">Visas de inmigrante</string>
<string name="poi_diplomatic_services_non_immigrant_visas_filter">Visas de no inmigrante</string>
<string name="poi_waste_transfer_station">Estación de transferencia de residuos</string>
<string name="poi_weightbridge">Báscula</string>
<string name="poi_water_source_lake">Lago</string>
<string name="poi_water_source_river">Río</string>
<string name="poi_water_source_powered_pump">Bomba accionada</string>
<string name="poi_water_source_water_tank">Depósito de agua</string>
<string name="poi_water_source_tap">Grifo</string>
<string name="poi_water_source_water_works">Planta potabilizadora</string>
<string name="poi_vaccination_covid19">Vacunación: COVID 19</string>
<string name="poi_health_specialty_vaccination_yes">Vacunación</string>
<string name="poi_lifeguard_base">Base de salvavidas</string>
<string name="poi_siren">Sirena</string>
<string name="poi_diplomatic_services_citizen_services_no">No</string>
<string name="poi_diplomatic_services_citizen_services_yes"></string>
<string name="poi_diplomatic_services_immigrant_visas_no">No</string>
<string name="poi_diplomatic_services_immigrant_visas_yes"></string>
<string name="poi_diplomatic_services_non_immigrant_visas_no">No</string>
<string name="poi_diplomatic_services_non_immigrant_visas_yes"></string>
<string name="poi_liaison_subnational">Subnacional</string>
<string name="poi_liaison_representative_office">Oficina representativa</string>
<string name="poi_liaison_liaison_office">Oficina</string>
<string name="poi_consulate_consulate_general">Consulado general</string>
<string name="poi_embassy_residence">Residencia</string>
<string name="poi_embassy_mission">Misión</string>
<string name="poi_embassy_interests_section">Sección de intereses</string>
<string name="poi_embassy_high_commission">Alto comisionado</string>
<string name="poi_embassy_delegation">Delegación</string>
<string name="poi_embassy_branch_embassy">Rama/sucursal</string>
<string name="poi_embassy_yes">Encabezado por un embajador</string>
<string name="poi_diplomatic_embassy">Embajada</string>
<string name="poi_consulate_filter">Consulado</string>
<string name="poi_embassy_filter">Embajada</string>
</resources>

View file

@ -14,7 +14,7 @@
<string name="use_fluorescent_overlays">Usar superpuestos fluorescentes</string>
<string name="use_fluorescent_overlays_descr">Usa colores fluorescentes para mostrar trazas y rutas.</string>
<string name="offline_edition">Edición sin conexión</string>
<string name="offline_edition_descr">Usa siempre edición sin conexión.</string>
<string name="offline_edition_descr">Si la edición sin conexión está habilitada, los cambios se guardarán primero localmente y se cargarán a pedido; de lo contrario, los cambios se cargarán inmediatamente.</string>
<string name="update_poi_does_not_change_indexes">Los cambios de PDI dentro de la aplicación no afectan a los archivos de mapa descargados; en su lugar, los cambios se guardan como un archivo en el dispositivo.</string>
<string name="local_openstreetmap_uploading">Subiendo…</string>
<string name="local_openstreetmap_were_uploaded">{0} PDI/Notas de OSM subidos</string>
@ -64,7 +64,7 @@
<string name="global_app_settings">Ajustes globales de la aplicación</string>
<string name="user_name">Usuario de OSM</string>
<string name="open_street_map_login_descr">Necesario para envíos a openstreetmap.org.</string>
<string name="user_password">Contraseña de OSM</string>
<string name="user_password">Contraseña</string>
<string name="osmand_service">Modo reposo</string>
<string name="osmand_service_descr">OsmAnd se ejecuta en modo reposo con la pantalla apagada.</string>
<string name="switch_to_raster_map_to_see">Descargar un mapa vectorial sin conexión de esta ubicación en «Ajustes → Gestionar mapas», o cambiar al complemento «Mapas en línea».</string>
@ -616,7 +616,7 @@
\nDescarga los mapas de teselas directamente a través de fuentes en línea, o prepararlos para tu uso sin conexión (copiándolos manualmente en la carpeta de datos OsmAnd) como una base de datos SQLite que puede generarse con varias herramientas de preparación de mapas de terceros.</string>
<string name="osmand_background_plugin_description">Muestra los ajustes para activar en modo reposo el seguimiento y la navegación, activando periódicamente el dispositivo GPS (con la pantalla apagada).</string>
<string name="osmand_accessibility_description">Activa las funciones de accesibilidad del dispositivo directamente en OsmAnd. Facilita por ejemplo, el ajuste de la velocidad de la voz para voces de texto a voz, la configuración de navegación de pantalla con el panel direccional, usando la rueda de desplazamiento para el control del zoom, o la retroalimentación de texto a voz, por ejemplo, para anunciar la ubicación automáticamente.</string>
<string name="osmand_development_plugin_description">Este complemento muestra los ajustes de funciones de desarrollo y depuración para probar la simulación de rutas, el rendimiento del renderizado, o las indicaciones por voz. Estos ajustes están destinados para los desarrolladores y no son necesarios para el usuario general.</string>
<string name="osmand_development_plugin_description">Ajustes de funciones de desarrollo y depuración, como simulación de navegación, el rendimiento del renderizado, o las indicaciones por voz. Destinados a desarrolladores y no son necesarios para el uso normal de la aplicación.</string>
<string name="plugins_screen">Complementos</string>
<string name="prefs_plugins_descr">Los complementos activan ajustes avanzados y funcionalidades adicionales.</string>
<string name="prefs_plugins">Complementos</string>
@ -976,7 +976,7 @@
<string name="files_limit">Quedan %1$d archivos</string>
<string name="available_downloads_left">%1$d archivos para descargar</string>
<string name="install_paid">Versión completa</string>
<string name="cancel_route">Descartar ruta</string>
<string name="cancel_route">¿Descartar ruta\?</string>
<string name="cancel_navigation">Parar navegación</string>
<string name="clear_destination">Limpiar destino</string>
<string name="download_using_mobile_internet">No está conectado a una red Wi-Fi. ¿Usar la conexión actual a Internet para descargar?</string>
@ -1054,15 +1054,15 @@
<string name="driving_region_descr">Región de conducción: EEUU, Europa, Reino Unido, Asia u otras.</string>
<string name="driving_region">Región de conducción</string>
<string name="edit_tilesource_minzoom">Zoom mínimo</string>
<string name="edit_tilesource_expiration_time">Expira (minutos)</string>
<string name="edit_tilesource_expiration_time">Tiempo expirado (minutos)</string>
<string name="edit_tilesource_successfully">Fuente de teselas «%1$s» guardada</string>
<string name="local_index_tile_data_name">Datos de teselas: %1$s</string>
<string name="local_index_tile_data_expire">Expira (minutos): %1$s</string>
<string name="local_index_tile_data_expire">Tiempo de expiración (minutos): %1$s</string>
<string name="shared_string_about">Información</string>
<string name="about_settings_descr">Información de la versión, licencias, miembros del proyecto</string>
<string name="edit_tilesource_choose_existing">Elegir existente…</string>
<string name="local_index_tile_data_zooms">Zooms descargados: %1$s</string>
<string name="edit_tilesource_elliptic_tile">Mercator elíptica</string>
<string name="local_index_tile_data_zooms">Niveles de zooms descargados: %1$s</string>
<string name="edit_tilesource_elliptic_tile">Proyección Mercator elíptica</string>
<string name="map_widget_fps_info">Información de FPS</string>
<string name="base_world_map">Mapa base mundial</string>
<string name="map_magnifier">Ampliar mapa</string>
@ -1537,7 +1537,7 @@
<string name="routing_attr_height_name">Límite de altura</string>
<string name="routing_attr_height_description">Indica la altura permitida del vehículo en rutas.</string>
<string name="use_fast_recalculation">Recálculo inteligente de ruta</string>
<string name="use_fast_recalculation_desc">Para viajes largos, recalcula sólo la parte inicial de la ruta.</string>
<string name="use_fast_recalculation_desc">Recalcula solo la parte inicial de la ruta, útil para viajes largos.</string>
<string name="rendering_value_disabled_name">Desactivado</string>
<string name="rendering_value_walkingRoutesScopeOSMC_name">Color por red de afiliación</string>
<string name="rendering_value_walkingRoutesOSMC_name">Color por símbolo de senderismo OSMC</string>
@ -1728,7 +1728,7 @@
<string name="faq_item">Preguntas Frecuentes</string>
<string name="faq_item_description">Preguntas Frecuentes</string>
<string name="map_viewing_item">Vista del mapa</string>
<string name="search_on_the_map_item">Búsqueda en el mapa</string>
<string name="search_on_the_map_item">Buscando en el mapa</string>
<string name="planning_trip_item">Planificación de viaje</string>
<string name="instalation_troubleshooting_item">Instalación y solución de problemas</string>
<string name="techical_articles_item">Artículos técnicos</string>
@ -1919,7 +1919,7 @@
<string name="report">Informe</string>
<string name="no_map_markers_found">Añade marcadores a través del mapa</string>
<string name="no_waypoints_found">No se encontraron puntos de referencia</string>
<string name="file_name_containes_illegal_char">El nombre del archivo contiene caracteres ilegales</string>
<string name="file_name_containes_illegal_char">Carácter ilegal en el nombre del archivo</string>
<string name="map_mode">Modo del mapa</string>
<string name="rendering_value_thin_name">Fino</string>
<string name="rendering_value_medium_name">Medio</string>
@ -1955,7 +1955,7 @@
<string name="access_direction_haptic_feedback_descr">Indica la dirección del destino mediante vibración.</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="access_no_destination">Destino indefinido</string>
<string name="access_no_destination">Complemento de accesibilidad: sin destino definido</string>
<string name="map_widget_magnetic_bearing">Rumbo magnético</string>
<string name="map_widget_bearing">Rumbo relativo</string>
<string name="current_track">Traza actual</string>
@ -2368,19 +2368,19 @@
\n • (Opcional) Grabación del viaje en modo reposo (mientras el dispositivo está bloqueado)
\n OsmAnd es un software de código abierto, activamente desarrollado. Cualquiera puede contribuir con la aplicación informando sobre errores, mejorando las traducciones o desarrollando nuevas funciones. Además, el proyecto también depende de contribuciones financieras para desarrollar y probar nuevas funcionalidades.
\n</string>
<string name="osmand_plus_extended_description_part8">Cobertura y calidad aproximada del mapa:
\n • Europa Occidental: ****
\n • Europa Oriental: ***
\n • Rusia: ***
\n • Norteamérica: ***
\n • Sudamérica: **
\n • Asia: **
\n • Japón y Corea: ***
\n • Medio Oriente: **
\n • África: **
\n • Antártida: *
\n
\n ¡Más países alrededor del globo están disponibles para descargar! Desde Afganistán a Zimbabue, desde Australia a Estados Unidos. Argentina, Brasil, Canadá, Francia, Alemania, México, Reino Unido, España, …
<string name="osmand_plus_extended_description_part8">Cobertura y calidad aproximada del mapa:
\n • Europa Occidental: ****
\n • Europa Oriental: ***
\n • Rusia: ***
\n • Norteamérica: ***
\n • Sudamérica: **
\n • Asia: **
\n • Japón y Corea: ***
\n • Medio Oriente: **
\n • África: **
\n • Antártida: *
\n ¡Más países alrededor del globo están disponibles para descargar!
\n Desde Afganistán a Zimbabue, desde Australia a Estados Unidos. Argentina, Brasil, Canadá, Francia, Alemania, México, Reino Unido, España, …
\n</string>
<string name="save_poi_too_many_uppercase">El nombre contiene demasiadas mayúsculas. ¿Continuar?</string>
<string name="srtm_menu_download_descr">Descarga el mapa de «Curvas de nivel» para usarlas en esta región.</string>
@ -2516,7 +2516,7 @@
<string name="use_location">Usar ubicación</string>
<string name="add_location_as_first_point_descr">Añade la ubicación como punto de partida para planificar la ruta perfecta.</string>
<string name="my_location">Mi ubicación</string>
<string name="shared_string_finish">Finalizar</string>
<string name="shared_string_finish">Terminar</string>
<string name="plan_route">Planificar ruta</string>
<string name="shared_string_sort">Ordenar</string>
<string name="coordinate_input">Ingresar coordenadas</string>
@ -2644,7 +2644,7 @@
<string name="copy_location_name">Copiar nombre de ubicación/PDI</string>
<string name="toast_empty_name_error">Ubicación sin nombre</string>
<string name="show_closed_notes">Mostrar notas de OSM cerradas</string>
<string name="switch_osm_notes_visibility_desc">Mostrar/ocultar notas de OSM en el mapa.</string>
<string name="switch_osm_notes_visibility_desc">Mostrar u ocultar notas de OSM en el mapa.</string>
<string name="tunnel_warning">Túnel adelante</string>
<string name="show_tunnels">Túneles</string>
<string name="shared_string_current">Actual</string>
@ -3118,9 +3118,9 @@
<string name="zoom_by_wunderlinq_descr">Cambia el zoom del mapa desplazando la rueda hacia arriba y hacia abajo. Salir te devuelve a la aplicación WunderLINQ.</string>
<string name="zoom_by_wunderlinq">Usa WunderLINQ para controlar</string>
<string name="quick_action_need_to_add_item_to_list">Añadir al menos un elemento a la lista en los ajustes de «Acción rápida»</string>
<string name="routing_attr_piste_type_downhill_name">Esquí alpino/de descenso</string>
<string name="routing_attr_piste_type_downhill_name">Esquí alpino y de descenso</string>
<string name="routing_attr_piste_type_downhill_description">Pistas de esquí alpino o de descenso y acceso a remontes mecánicos.</string>
<string name="routing_attr_piste_type_nordic_name">Esquí de travesía/nórdico</string>
<string name="routing_attr_piste_type_nordic_name">Esquí de travesía y nórdico</string>
<string name="routing_attr_piste_type_nordic_description">Senderos para esquí nórdico o de travesía.</string>
<string name="routing_attr_piste_type_skitour_name">Esquí de travesía</string>
<string name="routing_attr_piste_type_skitour_description">Rutas para el esquí de montaña.</string>
@ -3358,7 +3358,7 @@
<string name="default_speed_dialog_msg">Estima la hora de llegada para tipos de vías desconocidos y límites de velocidad en todas las vías (puede afectar al enrutado)</string>
<string name="rendering_attr_piste_type_skitour_name">Esquí de travesía</string>
<string name="simulate_your_location_gpx_descr">Simular la ubicación usando una traza GPX grabada.</string>
<string name="empty_filename">El nombre de archivo está vacío</string>
<string name="empty_filename">Nombre de archivo vacío</string>
<string name="track_saved">Traza guardada</string>
<string name="shared_string_revert">Revertir</string>
<string name="quick_action_directions_from_desc">Un botón que añade el centro de la pantalla como punto de partida. Pedirá luego que se fije el destino o iniciará el cálculo de la ruta.</string>
@ -3424,9 +3424,9 @@
<string name="route_recalculation">Recálculo de la ruta</string>
<string name="accessibility_announce">Anunciar</string>
<string name="login_and_pass">Nombre de usuario y clave</string>
<string name="plugin_global_prefs_info">La configuración se aplica a todos los perfiles.</string>
<string name="plugin_global_prefs_info">Esta configuración de complementos es global, y se aplica a todos los perfiles</string>
<string name="osm_editing">Edición de OSM</string>
<string name="osm_edits_view_descr">Puedes ver todas las ediciones y errores de osm no enviadas en %1$s. Los puntos enviados no se muestran en OsmAnd.</string>
<string name="osm_edits_view_descr">Puedes ver todas las ediciones y errores de osm no subidos en %1$s. Los puntos ya subidos no se muestrarán más.</string>
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">El icono se muestra mientras navega o mientras te estés moviendo.</string>
<string name="select_map_icon_descr">Icono que se muestra en reposo.</string>
@ -3520,7 +3520,7 @@
<string name="hillshade_description">Mapa de sombreado utilizando tonos oscuros para mostrar pendientes, picos y tierras bajas.</string>
<string name="slope_description">Pendiente utiliza colores para visualizar la inclinación del terreno.</string>
<string name="terrain_slider_description">Establezca los niveles de zoom mínimo y máximo en los que se mostrará la capa.</string>
<string name="hillshade_download_description">Se necesitan mapas adicionales para ver Sombreado en el mapa.</string>
<string name="hillshade_download_description">Se necesitan mapas adicionales para ver sombreado en el mapa.</string>
<string name="slope_download_description">Se necesitan mapas adicionales para ver Pendientes en el mapa.</string>
<string name="slope_read_more">Puede leer más sobre Pendientes en %1$s.</string>
<string name="shared_string_transparency">Transparencia</string>
@ -3542,7 +3542,7 @@
<string name="recalculate_route_in_deviation">Recalcular ruta en caso de desvío</string>
<string name="n_items_of_z">%1$s de %2$s</string>
<string name="download_slope_maps">Cuestas</string>
<string name="quick_action_show_hide_terrain">Mostrar / esconder terreno</string>
<string name="quick_action_show_hide_terrain">Mostrar o esconder terreno</string>
<string name="quick_action_terrain_hide">Esconder terreno</string>
<string name="quick_action_terrain_show">Mostrar terreno</string>
<string name="quick_action_terrain_descr">Un botón para mostrar o esconder una capa de terreno en el mapa.</string>
@ -3591,11 +3591,11 @@
<string name="map_markers_item">Marcadores de mapa</string>
<string name="favorites_item">Favoritos</string>
<string name="navigation_profiles_item">Perfiles de navegación</string>
<string name="quick_action_show_hide_transport">Mostrar/ocultar transporte público</string>
<string name="quick_action_show_hide_transport">Mostrar u ocultar transporte público</string>
<string name="quick_action_transport_hide">Ocultar transporte público</string>
<string name="quick_action_transport_show">Mostrar transporte público</string>
<string name="create_edit_poi">Crear / Editar POI</string>
<string name="add_edit_favorite">Agregar / Editar Favorito</string>
<string name="create_edit_poi">Crear o editar POI</string>
<string name="add_edit_favorite">Agregar o editar Favorito</string>
<string name="shared_string_add_profile">Agregar perfil</string>
<string name="lang_an">Aragones</string>
<string name="custom_color">Color personalizado</string>
@ -3787,7 +3787,7 @@
<string name="lenght_limit_description">Proporcione la longitud de su vehículo, se pueden aplicar algunas restricciones de rutas para vehículos largos.</string>
<string name="quick_action_remove_next_destination">Eliminar el punto de destino más cercano</string>
<string name="please_provide_point_name_error">Por favor, proporcione un nombre para el punto</string>
<string name="quick_action_remove_next_destination_descr">El punto de destino actual de la ruta será borrado. Si se trata del destino, la navegación se detendrá.</string>
<string name="quick_action_remove_next_destination_descr">Elimina el próximo destino de su ruta. Si se trata del destino, la navegación se detendrá.</string>
<string name="search_download_wikipedia_maps">Descargar mapas de Wikipedia</string>
<string name="plan_route_open_existing_track">Abrir la pista existente</string>
<string name="plan_route_create_new_route">Crea una nueva ruta</string>
@ -3802,7 +3802,7 @@
<string name="shared_string_file_name">Nombre de archivo</string>
<string name="number_of_gpx_files_selected_pattern">%s archivos de traza seleccionados</string>
<string name="monitoring_control_start">GRABAR</string>
<string name="save_global_track_interval_descr">Especifica el intervalo de grabación general para trazas (habilitado a través del widget de grabación en el mapa).</string>
<string name="save_global_track_interval_descr">Especifica el intervalo de grabación general para trazas (activado a través del widget de grabación en el mapa).</string>
<string name="gpx_monitoring_stop">Pausar grabación del viaje</string>
<string name="gpx_monitoring_start">Seguir grabando el viaje</string>
<string name="system_default_theme">Predeterminado del sistema</string>
@ -3817,7 +3817,7 @@
<string name="one_point_error">Añade al menos dos puntos.</string>
<string name="select_track_width">Seleccionar anchura</string>
<string name="save_track_to_gpx">Grabar automáticamente la traza durante la navegación</string>
<string name="plugin_wikipedia_description">Consigue información sobre puntos de interés en Wikipedia. Es tu guía de bolsillo sin conexión. Sólo tienes que activar el complemento de Wikipedia y disfrutar de los artículos sobre los objetos que te rodean.</string>
<string name="plugin_wikipedia_description">Consigue información sobre puntos de interés en Wikipedia, una guía de bolsillo sin conexión con artículos sobre lugares y destinos.</string>
<string name="add_hidden_group_info">El punto agregado no será visible en el mapa, ya que el grupo seleccionado está oculto, puedes encontrarlo en \"%s\".</string>
<string name="app_mode_enduro_motorcycle">Motocicleta de enduro</string>
<string name="app_mode_motor_scooter">Moto scooter</string>
@ -3850,7 +3850,7 @@
<string name="navigation_profile">Perfil de navegación</string>
<string name="route_between_points_add_track_desc">Selecciona un archivo de traza al que agregar el nuevo segmento.</string>
<string name="street_level_imagery">Fotos a pie de calle</string>
<string name="plan_route_exit_dialog_descr">¿Estás seguro de que quieres descartar todos los cambios en la ruta planeada cerrándola\?</string>
<string name="plan_route_exit_dialog_descr">¿Estás seguro de que quieres descartar todos los cambios en la ruta planeada\?</string>
<string name="in_case_of_reverse_direction">En caso de dirección contraria</string>
<string name="shared_string_save_as_gpx">Guardar como nuevo archivo de traza</string>
<string name="add_segment_to_the_track">Añadir a un archivo de traza</string>
@ -3877,11 +3877,11 @@
<string name="plan_route_trim_before">Recortar antes de</string>
<string name="plan_route_trim_after">Recortar después de</string>
<string name="plan_route_change_route_type_after">Cambiar el tipo de ruta después de</string>
<string name="disable_recording_once_app_killed_descrp">Pausará el registro de trazas cuando se mate la aplicación (a través de aplicaciones recientes). (La indicación OsmAnd de fondo desaparece de la barra de notificaciones de Android.)</string>
<string name="disable_recording_once_app_killed_descrp">El registro de trazas se detendrá cuando se mate la aplicación (a través de aplicaciones recientes). (La indicación OsmAnd de fondo desaparece de la barra de notificaciones de Android.)</string>
<string name="shared_string_redo">Rehacer</string>
<string name="release_3_8">- Función actualizada de Planificar una ruta: permite utilizar diferentes tipos de navegación por segmento y la inclusión de trazas
\n
\n - Nuevo menú Apariencia para las trazas: selecciona el color, el grosor, muestra las flechas de dirección, los iconos de inicio/fin
\n - Nuevo menú Apariencia para las trazas: selecciona el color, el grosor, muestra las flechas de dirección, los iconos de inicio y fin
\n
\n - Mejorada la visibilidad de los nodos de bicicleta.
\n
@ -3914,9 +3914,9 @@
<string name="icon_group_sport">Deporte</string>
<string name="icon_group_emergency">Emergencia</string>
<string name="icon_group_travel">Viajar</string>
<string name="message_you_need_add_two_points_to_show_graphs">Necesita añadir al menos dos puntos</string>
<string name="message_you_need_add_two_points_to_show_graphs">Añadir al menos dos puntos</string>
<string name="login_account">Cuenta</string>
<string name="user_login">Nombre de usuario</string>
<string name="user_login">Login</string>
<string name="manage_subscription">Gestionar suscripción</string>
<string name="send_files_to_openstreetmap">Enviar fichero GPX a OpenStreetMap</string>
<string name="enter_text_separated">Introduzca las etiquetas separadas por una coma.</string>
@ -3935,7 +3935,7 @@
<string name="add_photos_descr">OsmAnd muestra fotos de diferentes fuentes:
\nOpenPlaceReviews - fotos POI;
\nMapillary - imágenes a nivel de calle;
\nWeb / Wikimedia - fotos POI especificadas en los datos de OpenStreetMap.</string>
\nWeb / Wikimedia - fotos POI según los datos de OpenStreetMap.</string>
<string name="shared_string_resources">Recursos</string>
<string name="approximate_file_size">Tamaño de fichero aproximado</string>
<string name="select_data_to_export">Seleccione los datos para exportar al fichero.</string>
@ -3943,11 +3943,80 @@
<string name="export_not_enough_space">No hay espacio suficiente</string>
<string name="release_3_9">• Se ha añadido la opción de exportar e importar todos los datos, incluyendo los ajustes, los recursos y «Mis sitios»
\n
\n • Planificar ruta: se añadieron gráficos para los segmentos de trazas con la ruta y capacidad de crear o editar trazas de segmentos múltiples
\n • Planificar ruta: gráficos para los segmentos de trazas con la ruta y añadio capacidad de crear o editar trazas de segmentos múltiples
\n
\n • Se ha añadido el método de autenticación OAuth para OpenStreetMap y se ha mejorado la interfaz de usuario de los diálogos de OSM
\n
\n • Se añadieron colores personalizados para los favoritos y los puntos de referencia de la traza
\n • Admite colores personalizados para los favoritos y los puntos de referencia de la traza
\n
\n</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.
\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
\nPuedes administrar y cancelar las suscripciones en los ajustes de AppGallery.</string>
<string name="use_native_pt">Desarrollo nativo del transporte público</string>
<string name="use_native_pt_desc">Cambiar al cálculo de ruta Java (seguro) del transporte público</string>
<string name="message_need_calculate_route_before_show_graph">Los datos de %1$s sólo están disponibles con las carreteras, calcula una ruta usando \"Ruta entre puntos\" para ver los gráficos.</string>
<string name="app_mode_gap">Separador</string>
<string name="gpx_upload_public_visibility_descr">\"Público\" significa que la traza se muestra públicamente en sus trazas de GPS y en listas de trazas de GPS públicas, y en la lista de trazas públicas con marcas de tiempo en forma sin formato. Los datos proporcionados a través de la API no hacen referencia a su página de seguimiento. Las marcas de tiempo de los puntos de seguimiento no están disponibles a través de la API de GPS pública y los puntos de seguimiento no están ordenados cronológicamente.</string>
<string name="gpx_upload_private_visibility_descr">\"Privado\" significa que la traza no aparece en ninguna lista pública, pero los puntos de la traza en orden no cronológico están disponibles a través de la API de GPS pública sin marcas de tiempo.</string>
<string name="gpx_upload_identifiable_visibility_descr">\"Identificable\" significa que la traza se mostrará públicamente en sus trazas GPS y en listas de trazas GPS públicas, es decir, otros usuarios podrán descargar la traza sin procesar y asociarla con su nombre de usuario. Los datos de puntos de seguimiento públicos con marca de tiempo de la API de GPS que se proporcionan a través de la API de puntos de seguimiento harán referencia a su página de seguimiento original.</string>
<string name="gpx_upload_trackable_visibility_descr">\"Rastreable\" significa que el rastreo no aparece en ningún listado público, pero los trackpoints son procesados con marcas de tiempo (que no se pueden asociar con usted directamente) lo hacen mediante descargas de la API de GPS pública.</string>
<string name="lang_de_casual">Alemán (casual)</string>
<string name="snowmobile_render_descr">Para conducción de motos de nieve con carreteras y pistas exclusivas.</string>
<string name="contour_lines_thanks">Gracias por comprar \'Contour lines\'</string>
<string name="routing_attr_avoid_footways_description">Evite las aceras</string>
<string name="routing_attr_avoid_footways_name">Evite las aceras</string>
<string name="use_live_public_transport">Datos OsmAnd Live</string>
<string name="use_live_routing">Datos OsmAnd Live</string>
<string name="complex_routing_descr">Enrutamiento de dos fases para la navegación del automóvil.</string>
<string name="perform_oauth_authorization_description">Inicie sesión con OAuth para usar las funciones de osmedit</string>
<string name="perform_oauth_authorization">Iniciar sesión a través de OAuth</string>
<string name="clear_osm_token">Borrar token de OpenStreetMap OAuth</string>
<string name="osm_edit_logout_success">Desconectado</string>
<string name="use_two_phase_routing">Utilice un algoritmo de enrutamiento de 2-fases A *</string>
<string name="open_street_map_login_mode">Deberas iniciar sesión para subir cambios nuevos o modificados.
\n
\nPuede iniciar sesión utilizando el método seguro OAuth o utilizar su nombre de usuario y contraseña.</string>
<string name="ltr_or_rtl_combine_via_star">%1$s * %2$s</string>
<string name="routing_attr_allow_intermittent_name">Permitir vías de agua intermitentes</string>
<string name="shared_string_graph">Gráfico</string>
<string name="message_graph_will_be_available_after_recalculation">Por favor espera.
\nEl gráfico estará disponible después del nuevo cálculo de la ruta.</string>
<string name="login_open_street_map">Inicie sesión en OpenStreetMap</string>
<string name="login_open_street_map_org">Inicie sesión en OpenStreetMap.org</string>
<string name="sign_in_with_open_street_map">Iniciar sesión con OpenStreetMap</string>
<string name="use_login_password">Usar nombre de usuario y contraseña</string>
<string name="subscription_payment_issue_title">Toque el botón para configurar un método de pago en Google Play para corregir su suscripción.</string>
<string name="subscription_expired_title">La suscripción a OsmAnd Live ha caducado</string>
<string name="subscription_paused_title">La suscripción a OsmAnd Live ha sido pausada</string>
<string name="subscription_on_hold_title">La suscripción a OsmAnd Live está en espera</string>
<string name="markers_history">Historial de marcadores</string>
<string name="osm_login_descr">Puede iniciar sesión utilizando el método seguro OAuth o utilizar su nombre de usuario y contraseña.</string>
<string name="register_on_openplacereviews_desc">Las fotos son proporcionadas por el proyecto de datos abiertos OpenPlaceReviews.org. Para cargar sus fotos, debe registrarse en su sitio web.</string>
<string name="cannot_upload_image">No se puede cargar la imagen. Vuelve a intentarlo más tarde</string>
<string name="select_picture">Seleccionar imagen</string>
<string name="export_not_enough_space_descr">Tu dispositivo solo tiene %1$s libres. Libere espacio o anule la selección de algunos elementos para exportar.</string>
<string name="select_groups_for_import">Seleccione los grupos que se importarán.</string>
<string name="select_items_for_import">Seleccione los elementos que se importarán.</string>
<string name="use_dev_url_descr">Cambie para usar dev.openstreetmap.org en lugar de openstreetmap.org para probar la carga de OSM Note / POI / GPX.</string>
<string name="use_dev_url">Usar dev.openstreetmap.org</string>
<string name="elevation_data">Puede utilizar los datos de elevación para tener en cuenta el ascenso/descenso de su viaje</string>
<string name="app_mode_light_aircraft">Aeronave ligera</string>
<string name="plan_route_join_segments">Unir segmentos</string>
<string name="plan_route_split_before">Dividir antes</string>
<string name="plan_route_split_after">Dividir después</string>
<string name="plan_route_add_new_segment">Añadir un nuevo segmento</string>
<string name="profile_type_osmand_string">Perfil de OsmAnd</string>
<string name="profile_type_user_string">Perfil de usuario</string>
<string name="reverse_all_points">Invertir todos los puntos</string>
<string name="profile_by_default_description">Seleccione el perfil que se utilizará al iniciar la aplicación.</string>
<string name="shared_string_last_used">Utilizado por última vez</string>
<string name="routing_attr_prefer_hiking_routes_description">Prefiero rutas de senderismo</string>
<string name="routing_attr_prefer_hiking_routes_name">Prefiero rutas de senderismo</string>
<string name="routing_attr_allow_streams_description">Permitir 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">Permitir vías de agua intermitentes</string>
</resources>

View file

@ -3891,4 +3891,8 @@
<string name="poi_vaccination_covid19">Vacinación: COVID19</string>
<string name="poi_health_specialty_vaccination_yes">Vacinación</string>
<string name="poi_lifeguard_base">Base de salvavidas</string>
<string name="poi_wildlife_crossing_bat_tunnel">Túnel para morcegos</string>
<string name="poi_wildlife_crossing_bat_bridge">Ponte para morcegos</string>
<string name="poi_wildlife_crossing">Paso de fauna</string>
<string name="poi_swimming_area">Área de natación</string>
</resources>

View file

@ -3998,7 +3998,7 @@ Lon %2$s</string>
<string name="shared_string_add_photo">Engadir imaxe</string>
<string name="register_on_openplacereviews">Rexistrarse no
\nOpenPlaceReviews.org</string>
<string name="register_on_openplacereviews_desc">As imaxes son fornecidas polo proxecto de datos abertos do OpenPlaceReviews.org. Para subir a túas imaxes precisas rexistrarte no sitio web.</string>
<string name="register_on_openplacereviews_desc">As imaxes son fornecidas polo proxecto de datos abertos do OpenPlaceReviews.org. Para subir a túas imaxes precisas rexistrarte no seu sitio web.</string>
<string name="register_opr_create_new_account">Crear nova conta</string>
<string name="register_opr_have_account">Xa teño unha conta</string>
<string name="shared_string_search_history">Historial de procura</string>
@ -4042,4 +4042,12 @@ Lon %2$s</string>
\n
\n</string>
<string name="reverse_all_points">Inverter todos os puntos</string>
<string name="profile_by_default_description">Escolle o perfil que será empregado ao iniciar a aplicación.</string>
<string name="shared_string_last_used">Usado por última vez</string>
<string name="routing_attr_prefer_hiking_routes_description">Preferir rutas de sendeirismo</string>
<string name="routing_attr_prefer_hiking_routes_name">Preferir rutas de sendeirismo</string>
<string name="routing_attr_allow_streams_description">Permitir regatos e cunetas</string>
<string name="routing_attr_allow_streams_name">Permitir regatos e cunetas</string>
<string name="routing_attr_allow_intermittent_description">Permitir canles de auga intermitentes</string>
<string name="routing_attr_allow_intermittent_name">Permitir canles de auga intermitentes</string>
</resources>

View file

@ -2176,7 +2176,7 @@
<string name="poi_wheelchair_description">Leírás kerekesszékeseknek</string>
<string name="poi_blind_description">Leírás vakoknak</string>
<string name="poi_highway_steps">Lépcső</string>
<string name="poi_handrail_yes">Korlát</string>
<string name="poi_handrail_yes">Korlát van</string>
<string name="poi_handrail_no">Korlát nincs</string>
<string name="poi_ramp_yes">Rámpa</string>
<string name="poi_ramp_no">Rámpa nincs</string>
@ -2832,7 +2832,7 @@
<string name="poi_free_flying_hanggliding_yes">Sárkányrepülés</string>
<string name="poi_medical_system_ayurveeda_yes">Hagyományos indiai (ájurvéda)</string>
<string name="poi_treat_inpatient_yes">Fekvőbeteg-ellátás</string>
<string name="poi_emergency_yes">Vészhelyzet</string>
<string name="poi_emergency_yes">Sürgősségi ellátás</string>
<string name="poi_dispensing_yes">beváltható</string>
<string name="poi_hygrometer_yes">Páratartalom-mérő</string>
<string name="poi_water_heater_no">Vízforraló nincs</string>
@ -2865,7 +2865,7 @@
<string name="poi_free_flying_no_flight_time">Repüléstilalmi idő (siklórepüléshez)</string>
<string name="poi_free_flying_guest_guidelines_yes">Vendégeknek szóló iránymutatás</string>
<string name="poi_free_flying_guest_guidelines_no">Vendégeknek szóló iránymutatás nincs</string>
<string name="poi_emergency_no">Vészhelyzet nincs</string>
<string name="poi_emergency_no">Sürgősségi ellátás nincs</string>
<string name="poi_bridge_ref">Híd száma</string>
<string name="poi_cafeteria">Menza</string>
<string name="poi_forestry_compartment">Útirányjelző tábla: erdőtag (RU)</string>
@ -3317,7 +3317,7 @@
<string name="poi_scooter_yes">Roller</string>
<string name="poi_scooter_no">Roller nem</string>
<string name="poi_truck_yes">Teherautó</string>
<string name="poi_truck_no">Teherautó nem</string>
<string name="poi_truck_no">Teherautóval nem használható</string>
<string name="poi_parking_fee_yes">Parkolási díj</string>
<string name="poi_parking_fee_no">Parkolási díj nincs</string>
<string name="poi_parking_fee">Parkolási díj</string>
@ -3891,4 +3891,7 @@
<string name="poi_water_source_water_works">Vízmű</string>
<string name="poi_water_source_tube_well">Csöves kút</string>
<string name="poi_swimming_area">Fürdésre kijelölt terület</string>
<string name="poi_wildlife_crossing_bat_tunnel">Denevéralagút</string>
<string name="poi_wildlife_crossing_bat_bridge">Denevérhíd</string>
<string name="poi_wildlife_crossing">Vadátjáró</string>
</resources>

View file

@ -3802,7 +3802,7 @@
<string name="please_provide_point_name_error">נא לספק שם לנקודה</string>
<string name="quick_action_remove_next_destination_descr">מוחק את נקודת היעד הבאה במסלול שלך. אם זו נקודת היעד, הניווט ייפסק.</string>
<string name="search_download_wikipedia_maps">הורדת מפות ויקיפדיה</string>
<string name="plugin_wikipedia_description">קבלת מידע על נקודות עניין מוויקיפדיה. מדריך הכיס הפרטי שלך - עליך פשוט להפעיל את התוסף של ויקיפדיה וליהנות מערכים על מה שסביבך.</string>
<string name="plugin_wikipedia_description">קבלת מידע על נקודות עניין מוויקיפדיה, מדריך הכיס הפרטי שלך עם ערכים על מקומות ויעדים.</string>
<string name="app_mode_enduro_motorcycle">אופנוע שטח</string>
<string name="app_mode_motor_scooter">טוסטוס</string>
<string name="app_mode_wheelchair">כסא גלגלים</string>
@ -3982,7 +3982,7 @@
<string name="shared_string_search_history">היסטוריית חיפוש</string>
<string name="app_mode_kayak">קיאק</string>
<string name="app_mode_motorboat">סירת מנוע</string>
<string name="gpx_upload_identifiable_visibility_descr"/>
<string name="gpx_upload_identifiable_visibility_descr">„ניתן לזיהוי” משמעו שהעקבות תופענה באופן ציבורי בעקבות ה־GPS וברישומי עקבות GPS ציבוריים, כלומר שמשתמשים אחרים יוכלו להוריד את העקבות הגולמיים ולשייך אותם עם שם המשתמש שלך. נתוני נקודות מעקב ציבורית עם חתימת זמן מה־API של ה־GPS שמוגשות דרך ה־API של נקודות המעקב יפנו אל עמוד המעקב המקורי שלך.</string>
<string name="shared_string_resources">משאבים</string>
<string name="approximate_file_size">גודל קובץ משוערך</string>
<string name="select_data_to_export">נא לבחור את הנתונים שייוצאו לקובץ.</string>
@ -4029,4 +4029,6 @@
<string name="routing_attr_allow_streams_name">לאפשר נחלים וניקוזים</string>
<string name="routing_attr_allow_intermittent_description">לאפשר מקטעים עם דרכי מים עונתיים</string>
<string name="routing_attr_allow_intermittent_name">לאפשר מקטעים עם דרכי מים עונתיים</string>
<string name="gpx_upload_public_visibility_descr">„ציבורי” משמעו שהעקבות מופיעים באופן ציבורי בעקבות ה־GPS שלך וברישומי עקבות GPS ציבוריים וברישומי מעקב ציבוריים עם חותמות זמן בתצורה גולמית. הנתונים שמוגשים דרך ה־API אינם מפנים אל עמוד העקבות שלך. חותמות הזמן של נקודות המעקב אינן זמינות דרך ה־API של ה־GPS ונקודות המעקב אינן מסודרות בהתאם לזמן שתועדו.</string>
<string name="gpx_upload_private_visibility_descr">„פרטי” משמעות שהעקבות לא תופענה ברישומים ציבוריים אך נקודות מעקב ממתוכן תהיינה זמינות בסדר אקראי דרך ה־API הציבורי של ה־GPS ללא חותמות זמן.</string>
</resources>

File diff suppressed because it is too large Load diff

View file

@ -3899,4 +3899,7 @@
<string name="poi_waste_transfer_station">Estação de transferência de resíduos</string>
<string name="poi_lavoir">Lavandaria pública</string>
<string name="poi_swimming_area">Área de natação</string>
<string name="poi_wildlife_crossing_bat_tunnel">Túnel para morcego</string>
<string name="poi_wildlife_crossing_bat_bridge">Ponte para morcego</string>
<string name="poi_wildlife_crossing">Travessia de vida selvagem</string>
</resources>

View file

@ -306,7 +306,7 @@
<string name="poi_funicular">Funiculare</string>
<string name="poi_military_naval_base">Base militare navale</string>
<string name="poi_military_barracks">Caserma</string>
<string name="poi_electricity_combined_charging">Istatzione de carrigamentu</string>
<string name="poi_electricity_combined_charging">Istatzione de carrigamentu;Istatzione de carrigamentu de veìculos elètricos;Istatzione de càrriga elètrica;Puntu de càrriga;Istatzione de càrriga elètrica;Trastes pro s\'alimentatzione de veìculos elètricos</string>
<string name="poi_vehicle_ramp">Rampa pro veìculos</string>
<string name="poi_compressed_air">Àera cumpressa</string>
<string name="poi_bicycle_rental">Nolu bitziclètas</string>
@ -3894,4 +3894,8 @@
<string name="poi_ranger_station">Istatzione de sos rangers</string>
<string name="poi_lavoir">Sabunadòrgiu</string>
<string name="poi_waste_transfer_station">Istatzione de tramudòngiu de s\'arga</string>
<string name="poi_wildlife_crossing_bat_tunnel">Gallerias pro tzintzimurreddos</string>
<string name="poi_wildlife_crossing_bat_bridge">Pontes pro tzintzimurreddos</string>
<string name="poi_wildlife_crossing">Logu de atraessamentu de sa fàuna areste</string>
<string name="poi_swimming_area">Logu pro nadare</string>
</resources>

View file

@ -294,7 +294,7 @@ Du hittar din parkeringsplats och -tid på instrumentbrädan och i widgeten på
<string name="global_app_settings">Globala app-inställningar</string>
<string name="user_name">Ditt OSM-användarnamn</string>
<string name="open_street_map_login_descr">Behövs för ändringar i openstreetmap.org.</string>
<string name="user_password">Ditt OSM-lösenord</string>
<string name="user_password">Lösenord</string>
<string name="osmand_service">Bakgrundsläge</string>
<string name="osmand_service_descr">OsmAnd körs i bakgrunden medan skärmen är avstängd.</string>
<string name="download_files_not_enough_space">Det finns inte tillräckligt med ledigt utrymme för att hämta %1$s MB (ledigt: %2$s).</string>
@ -805,7 +805,7 @@ Nyttjat utrymme är {1} MB.
<string name="error_calculating_route_occured">Ett fel uppstod vid ruttberäkningen</string>
<string name="empty_route_calculated">Fel: Den beräknade rutten är tom</string>
<string name="new_route_calculated_dist">Ny rutt beräknad, avstånd</string>
<string name="invalid_locations">Koordinaterna är ogiltiga!</string>
<string name="invalid_locations">Ogiltiga koordinater</string>
<string name="go_back_to_osmand">Tillbaka till OsmAnd-kartan</string>
<string name="previous_run_crashed">Den senaste körningen av OsmAnd kraschade. Loggen finns i {0}. Rapportera felet och bifoga gärna loggfilen.</string>
<string name="saving_gpx_tracks">Sparar GPX-spår till SD-kortet …</string>
@ -857,8 +857,8 @@ Nyttjat utrymme är {1} MB.
<string name="navigate_point_latitude">Latitud</string>
<string name="navigate_point_longitude">Longitud</string>
<string name="navigate_point_format_D">DDD.DD</string>
<string name="navigate_point_format_DM">DDD MM.MM</string>
<string name="navigate_point_format_DMS">DDD MM SS.SS</string>
<string name="navigate_point_format_DM">DDD MM.MMM</string>
<string name="navigate_point_format_DMS">DDD MM SS.S</string>
<string name="get_directions">Vägvisning</string>
<string name="precise_routing_mode_descr">Aktivera exakt ruttning för beräkning utan småfel. Mycket begränsad av avståndet samt långsam.</string>
<string name="route_descr_lat_lon">Lat %1$.3f, long %2$.3f</string>
@ -902,7 +902,7 @@ Nyttjat utrymme är {1} MB.
<string name="street_name">Gatunamn</string>
<string name="hno">Husnummer</string>
<string name="monitoring_settings_descr">Konfigurera inspelningen av dina resor.</string>
<string name="monitoring_settings">Trippinspelning</string>
<string name="monitoring_settings">Inspelning av resa</string>
<string name="use_kalman_filter_compass_descr">Minskar kompassmissvisningen men blir trögare.</string>
<string name="use_kalman_filter_compass">Använd Kalman-filter</string>
<string name="choose_osmand_theme">App-tema</string>
@ -1153,8 +1153,7 @@ Nyttjat utrymme är {1} MB.
<string name="sort_by_name">Sortera efter namn</string>
<string name="arrival_distance">Ankomstmeddelande</string>
<string name="arrival_distance_descr">Hur tidigt vill du höra ankomstmeddelandet?</string>
<string name="create_poi_link_to_osm_doc">
<u>Online OSM</u>-kartklassificering med bilder.</string>
<string name="create_poi_link_to_osm_doc"><u>Online OSM</u>-kartklassificering med bilder.</string>
<string name="import_file_favourites">Spara data som GPX-fil eller importera waypoints till \"Favoriter\"?</string>
<string name="share_fav_subject">Favoriter utdelade via OsmAnd</string>
<string name="commiting_node">Skickar nod…</string>
@ -1225,7 +1224,7 @@ Nyttjat utrymme är {1} MB.
<string name="record_plugin_description">"Denna modul aktiverar funktionen att antingen spela in och spara dina spår genom att du trycker på widgeten GPX-loggning på kartskärmen eller att alla dina rutter sparas automatiskt i en GPX-fil.
\n
\nInspelade spår kan delas ut till vänner eller användas som bidrag till OSM. Idrottsmän kan använda inspelade spår för att följa sin träning. Viss grundläggande spåranalys kan göras direkt i OsmAnd, såsom varvtider, genomsnittshastighet o.s.v. och spår kan givetvis också analyseras i efterhand i speciella analysverktyg från tredje part. "</string>
<string name="record_plugin_name">Inspelning av resor</string>
<string name="record_plugin_name">Inspelning av resa</string>
<string name="int_hour">h</string>
<string name="duration">Längd</string>
<string name="distance">Sträcka</string>
@ -1402,7 +1401,7 @@ Nyttjat utrymme är {1} MB.
<string name="shared_string_remember_my_choice">Kom ihåg mitt val</string>
<string name="shared_string_refresh">Uppdatera</string>
<string name="shared_string_download">Hämta</string>
<string name="shared_string_downloading">Laddar ner</string>
<string name="shared_string_downloading">Laddar ner</string>
<string name="shared_string_download_successful">Hämtningen lyckades</string>
<string name="shared_string_unexpected_error">Ett oväntat fel uppstod</string>
<string name="shared_string_action_template">Åtgärd {0}</string>
@ -1486,7 +1485,7 @@ Long %2$s</string>
<string name="routing_attr_avoid_borders_description">Undvik att korsa nationella gränser</string>
<string name="routing_attr_height_name">Höjdgräns</string>
<string name="use_fast_recalculation">Smart omräkning av rutt</string>
<string name="use_fast_recalculation_desc">Räkna om endast början av rutten för långa resor.</string>
<string name="use_fast_recalculation_desc">Räkna om endast början av färdvägen, användbart för längre resor.</string>
<string name="routing_attr_height_description">Ange tillåten fordonshöjd på rutter.</string>
<string name="shared_string_logoff">Logga ut</string>
<string name="rendering_value_disabled_name">Inaktiverad</string>
@ -1616,7 +1615,7 @@ Long %2$s</string>
<string name="si_min_km">Minuter per kilometer</string>
<string name="si_min_m">Minuter per engelsk mil</string>
<string name="si_nm_h">Sjömil i timmen (knop)</string>
<string name="shared_string_trip_recording">Trippinspelning</string>
<string name="shared_string_trip_recording">Inspelning av resa</string>
<string name="shared_string_navigation">Navigering</string>
<string name="osmand_running_in_background">Körs i bakgrunden</string>
<string name="favorite_category_add_new">Lägg till ny</string>
@ -1835,7 +1834,8 @@ Tillgängligt utrymme är blott {2} MB.</string>
<string name="osm_live_not_active">Inaktiv</string>
<string name="osm_live_enter_email">Ange en giltig e-postadress</string>
<string name="osm_live_enter_user_name">Ange publikt namn</string>
<string name="osm_live_thanks">Tack för att du prenumererar på live-uppdateringar!</string>
<string name="osm_live_thanks">Tack för att du stödjer OsmAnd!
\nFör att aktivera alla nya funktioner behöver du starta om OsmAnd.</string>
<string name="osm_live_region_desc">Delar av din donation kommer att skickas till OSM-användare som skickar in kartändringar i det området.</string>
<string name="osm_live_subscription_settings">Prenumerationsinställningar</string>
<string name="osm_live_ask_for_purchase">Köp en OsmAnd Live-prenumeration först</string>
@ -2055,7 +2055,7 @@ Om du tycker om OsmAnd och OSM och vill stödja dem så är detta ett utmärkt s
<string name="rendering_value_fine_name">Fin</string>
<string name="navigate_point_olc">Öppna platskod</string>
<string name="navigate_point_olc_info_invalid">Ogiltig OLC
</string>
\n</string>
<string name="navigate_point_olc_info_short">Kort OLC
Vänligen tillhandahåll fullständig kod</string>
<string name="file_can_not_be_moved">Filen kan inte flyttas.</string>
@ -2439,7 +2439,18 @@ Vänligen tillhandahåll fullständig kod</string>
<string name="min_max">Min/Max</string>
<string name="route_is_too_long_v2">Denna väg kan vara för lång tid att beräkna. Lägg till mellanliggande destinationer om inget resultat finns inom 10 minuter.</string>
<string name="osmand_extended_description_part1">"OsmAnd (OSM Automated Navigation Directions) är en kartnavigationsapp med tillgång till gratis, världsomfattande OpenStreetMap (OSM)-data av hög kvalitet. Njut av röstnavigation eller visuell navigation, visning av POI (points of interest - nyttoplatser), att skapa och hantera GPX-spår, visa höjdkurvor och höjdinfo (via plugin), val mellan bil-, cykel-, fotgängar-lägen, OSM-redigering och mycket mer."</string>
<string name="osmand_extended_description_part2">GPS-navigering • Du kan välja mellan offline (inga roaming-avgifter när du är utomlands) eller på online(snabbare)-läge • Turn-by-Turn röstguidning leder dig längs vägen (inspelade och genererade röster) • Rutten uppdateras om du avviker från den. • Filval och beräknad ankomsttid hjälper dig längs vägen • För att göra din resa säkrare, dag/natt-läge växlar automatiskt • Du kan välja att visa hastighetsbegränsningar och få påminnelser om du överskrider den • Kartzoomen anpassar sig till din hastighet. • Du kan söka destinationer efter adress eller efter typ (t.ex.: parkering, restaurang, hotell, bensinstation, museum), eller av geografiska koordinater • Stödjer mellanliggande punkter på din rutt • Du kan spela in dina egna eller ladda upp en GPX-spår och följa dem</string>
<string name="osmand_extended_description_part2">GPS-navigering
\n• Välj mellan offline- (inga roaming-avgifter när du är utomlands) eller online-läge a(snabbare)
\n• Steg-för-steg röstguidning leder dig längs vägen (inspelade och genererade röster)
\n• Färdvägen uppdateras närhellst du avviker från den.
\n• Guidning vid val av filer, gatunamn och beräknad ankomsttid hjälper dig längs vägen
\n• Dag-/natt-läge för appen växlas automatiskt för att göra din resa säkrare
\n• Visa hastighetsbegränsningar och få påminnelser om du överskrider den
\n• Kartzoomen anpassar sig till din hastighet
\n• Sök destinationer genom adress, typ (t.ex.: parkering, restaurang, hotell, bensinstation, museum), eller geografiska koordinater
\n• Stödjer användande av delmål på din resväg
\n• Spela in dina egna, eller ladda upp en GPX-spår och följa dem
\n</string>
<string name="osmand_extended_description_part3">Karta
\n • Visar Poi (point of interests) runt omkring dig
\n • Justera kartan baserat på riktning (eller kompass)
@ -2531,7 +2542,7 @@ Vänligen tillhandahåll fullständig kod</string>
<string name="mapnik_render_descr">Gamla \"Mapnik\'-stil standardrendering. Viktiga funktioner: Färger som liknar \"Mapnik\" stil.</string>
<string name="touring_view_render_descr">Högsdetaljsstil för turiständamål. Innehåller alla konfigurationsinställningar av standardstilen, dessutom: Visar så mycket detaljer som möjligt, i synnerhet alla vägar, stigar och andra sätt att resa. Tydliga visuella skillnader mellan olika vägtyper som påminner om många turistatlaser. Högkontrastfärger för utomhusbruk, dag- och nattläge.</string>
<string name="default_render_descr">Stil för allmänna ändamål. Förenklad återgivning i tätbefolkade städer. Viktiga funktioner: höjdkurvor, rutter, ytkvalitet, tillträdeskontroll, farthinder, stigrendering enligt SAC-skala, vattensporter.</string>
<string name="open_wikipedia_link_online">Öppna Wikipedia-länk på nätet</string>
<string name="open_wikipedia_link_online">Öppna Wikipedia-länk på internet</string>
<string name="open_wikipedia_link_online_description">Länken kommer att öppnas i en webbläsare.</string>
<string name="read_wikipedia_offline_description">Skaffa OsmAnd Live-prenumeration för att läsa Wikipedia och Wikivoyage-artiklar frånkopplad.</string>
<string name="how_to_open_link">Hur öppnar man länken?</string>
@ -2601,7 +2612,12 @@ Vänligen tillhandahåll fullständig kod</string>
\n• Kompakta offline vektorkartor som uppdateras minst en gång i månaden
\n
\n• Val mellan data för hela regionen och bara vägnätet (Exempel: Hela Japan är 700 MB eller endast vägnätet för 200 MB)</string>
<string name="osmand_plus_extended_description_part5">Säkerhetsfunktioner • Valfri växling mellan dag-/nattläge • Valfri visning av hastighet, med en påminnelse om du överskrider den • Valfri hastighetsbaserad zoomning • Dela din position så att dina vänner kan hitta dig</string>
<string name="osmand_plus_extended_description_part5">Säkerhetsfunktioner
\n• Valfri växling mellan dag-/nattläge
\n• Valfri visning av hastighet, med en påminnelse om du överskrider den
\n• Valfri hastighetsbaserad zoomning
\n• Dela din position så att dina vänner kan hitta dig
\n</string>
<string name="osmand_plus_extended_description_part6">Funktioner för cykel och gående • Se vägar för gående och cyklande samt vandringsstigar, utmärkta för utomhusaktiviteter • Speciella ruttval och visningsläge för cykel och gående • Valfria kollektivtrafiksplatser (buss, spårvagn, tåg) inklusive linjenamn • Valfri reseinspelning till lokal GPX-fil eller onlinetjänst • Valfri visning av hastighet och höjd • Visa konturlinjer och höjdreliefer (via separat plugin)</string>
<string name="osmand_plus_extended_description_part7">Bidra direkt till OSM
\n• Rapportera databuggar
@ -2974,4 +2990,112 @@ Vänligen tillhandahåll fullständig kod</string>
<string name="plan_route_add_new_segment">Lägg till ett nytt segment</string>
<string name="profile_type_osmand_string">OsmAnd profil</string>
<string name="profile_type_user_string">Användarprofil</string>
<string name="clear_confirmation_msg">Rensa %1$s\?</string>
<string name="new_plugin_added">Nytt insticksprogram tillagd</string>
<string name="shared_string_turn_off">Stäng av</string>
<string name="added_profiles_descr">Profiler tillaggda av insticksprogram</string>
<string name="added_profiles">Tillagda profiler</string>
<string name="suggested_maps_descr">Dessa kartor erfordras av insticksprogrammet.</string>
<string name="suggested_maps">Föreslagna kartor</string>
<string name="dialogs_and_notifications_descr">Kontrollera vilka popups, dialoger och notifieringar som OsmAnd visar under användning.</string>
<string name="dialogs_and_notifications_title">Dialoger och notifieringar</string>
<string name="download_map_dialog">Kartnedladdningsdialog</string>
<string name="join_segments">Slå ihop segment</string>
<string name="rendering_attr_showCycleNodeNetworkRoutes_name">Visa cykelrutter längs nodnätverk</string>
<string name="rendering_value_walkingRoutesOSMCNodes_name">Nodnätverk</string>
<string name="save_heading">Inkludera rubrik</string>
<string name="add_new_profile_q">Lägg till ny profil \'%1$s\'\?</string>
<string name="personal_category_name">Personlig</string>
<string name="shared_string_downloading_formatted">Laddar ned %s</string>
<string name="desert_render_descr">För öknar och andra glesbefolkade områden. Mer detaljerad.</string>
<string name="rendering_value_thick_name">Tät</string>
<string name="empty_state_my_tracks_desc">Importera eller spela in spårfiler</string>
<string name="gpx_monitoring_stop">Pausa inspelning av resa</string>
<string name="gpx_monitoring_start">Återuppta inspelning av resa</string>
<string name="development">Utveckling</string>
<string name="use_live_public_transport">OsmAnd Live data</string>
<string name="use_live_routing">OsmAnd Live data</string>
<string name="complex_routing_descr">Dirigering i två steg för bilnavigation.</string>
<string name="perform_oauth_authorization_description">Logga in med OAuth för att använda OsmEdit funktioner</string>
<string name="perform_oauth_authorization">Logga in via OAuth</string>
<string name="clear_osm_token">Rensa OpenStreetMap OAuth igenkänningstecken</string>
<string name="osm_edit_logout_success">Utloggad</string>
<string name="file_already_imported">Filen är redan importerad i OsmAnd</string>
<string name="use_two_phase_routing">Använd en 2-fas A* dirigeringsalgoritm</string>
<string name="shared_string_graph">Graf</string>
<string name="message_need_calculate_route_before_show_graph">%1$s data tillgänglig enbart på vägar, räkna ut en färdväg genom att använda \"Färdväg mellan punkter\" för att se grafer.</string>
<string name="message_graph_will_be_available_after_recalculation">Vänligen vänta.
\nGrafen kommer bli tillgänglig efter att färdvägen omberäknats.</string>
<string name="shared_string_local_maps">Lokala kartor</string>
<string name="ltr_or_rtl_combine_via_dash">%1$s — %2$s</string>
<string name="ltr_or_rtl_combine_via_star">%1$s * %2$s</string>
<string name="icon_group_transport">Kollektivtrafik</string>
<string name="app_mode_gap">Tomrum</string>
<string name="icon_group_amenity">bekvämligheter</string>
<string name="icon_group_special">Speciell</string>
<string name="icon_group_symbols">Symboler</string>
<string name="icon_group_travel">Resa</string>
<string name="message_you_need_add_two_points_to_show_graphs">Lägg till minst 2 punkter</string>
<string name="icon_group_sport">Idrott</string>
<string name="icon_group_service">Service</string>
<string name="icon_group_emergency">Nödsituation</string>
<string name="plugin_global_prefs_info">Dessa inställningar för insticksmoduler är globala och appliceras för alla profiler</string>
<string name="login_open_street_map">Logga in till OpenStreetMap</string>
<string name="login_open_street_map_org">Logga in på OpenStreetMap.org</string>
<string name="sign_in_with_open_street_map">Logga in på OpenStreetMap</string>
<string name="use_login_password">Användarnamn och lösenord</string>
<string name="login_account">Konto</string>
<string name="markers_history">Markörhistorik</string>
<string name="user_login">Inloggning</string>
<string name="manage_subscription">Hantera prenumeration</string>
<string name="subscription_payment_issue_title">Klicka på knappen för att registrera en betalningsplan på Google Play för att åtruppta prenumerationen.</string>
<string name="subscription_expired_title">Prenumerationen på OsmAnd Live har</string>
<string name="subscription_paused_title">Prenumerationen på OsmAnd Live är pausad</string>
<string name="subscription_on_hold_title">Prenumerationen på OsmAnd Live är</string>
<string name="send_files_to_openstreetmap">Skicka GPX fil till OpenStreetMap</string>
<string name="enter_text_separated">Ange taggar sepparerade med komma (,).</string>
<string name="select_track_width">Välj bredd</string>
<string name="shared_string_custom">Anpassad</string>
<string name="gpx_direction_arrows">Dirigeringspilar</string>
<string name="plan_route_last_edited">Senast ändrad</string>
<string name="shared_string_done">Klar</string>
<string name="next_segment">Nästa segment</string>
<string name="navigation_profile">Navigationsprofil</string>
<string name="street_level_imagery">Bilder på gatunivå</string>
<string name="plan_route_exit_dialog_descr">Är du säker på att du vill avfärda alla ändringar i den plannerade färdvägen\?</string>
<string name="map_widget_monitoring">Inspelning av resa</string>
<string name="follow_track">Följ färdväg</string>
<string name="select_another_track">välj en annan färdväg</string>
<string name="start_of_the_track">Början på färdvägen</string>
<string name="nearest_point">Närmaste punkt</string>
<string name="delete_address">Ta bort adress</string>
<string name="add_address">Lägg till adress</string>
<string name="access_hint_enter_address">Ange adress</string>
<string name="plan_route_trim_before">Korta ner innan</string>
<string name="plan_route_trim_after">Korta ner efter</string>
<string name="plan_route_change_route_type_before">Ändra typ av färdväg innan</string>
<string name="plan_route_change_route_type_after">Ändra typ av färdväg efter</string>
<string name="simplified_track">Förenklad färdväg</string>
<string name="simplified_track_description">Bara färdvägens linje kommer sparas, delmålen tas bort.</string>
<string name="number_of_gpx_files_selected_pattern">%s GPX filer valda</string>
<string name="shared_string_file_name">Filnamn</string>
<string name="monitoring_control_start">Spela in</string>
<string name="system_default_theme">Systemstandard</string>
<string name="all_next_segments">Alla efterföljande delar</string>
<string name="previous_segment">Tidigare delar</string>
<string name="all_previous_segments">Alla tidigare delar</string>
<string name="only_selected_segment_recalc">Bara valda delar kommer bli omräknad med vald profil.</string>
<string name="all_next_segments_will_be_recalc">Alla kommande delar kommer bli omräknad med den valda profilen.</string>
<string name="all_previous_segments_will_be_recalc">Alla tidigare delar kommer bli omräknade med den valda profilen.</string>
<string name="open_saved_track">Öppna sparad färdväg</string>
<string name="shared_string_is_saved">är sparad</string>
<string name="shared_string_redo">Upprepa</string>
<string name="one_point_error">Vänligen lägg till minst två punkter.</string>
<string name="sort_last_modified">Senast ändrad</string>
<string name="sort_name_ascending">Namn: A Ö</string>
<string name="sort_name_descending">Namn: Ö A</string>
<string name="start_finish_icons">Ikoner för start och mål</string>
<string name="osm_live_payment_desc_hw">Betalningen för prenumerationen är i enlighet med vad som valts. Du kan avbryta den i AppGallery när som hellst.</string>
<string name="routing_attr_avoid_footways_description">Undvik resor till fots</string>
<string name="routing_attr_avoid_footways_name">Undvik resor till</string>
</resources>

View file

@ -3887,4 +3887,7 @@
<string name="poi_lavoir">Громадська пральня</string>
<string name="poi_waste_transfer_station">Станція перевезення відходів</string>
<string name="poi_swimming_area">Плавальний майданчик</string>
<string name="poi_wildlife_crossing_bat_tunnel">Тунель кажанів</string>
<string name="poi_wildlife_crossing_bat_bridge">Міст кажанів</string>
<string name="poi_wildlife_crossing">Переправа диких тварин</string>
</resources>

View file

@ -4010,6 +4010,7 @@
<string name="routing_attr_difficulty_preference_description">Prefer routes of this difficulty, although routing over harder or easier pistes is still possible if shorter.</string>
<string name="routing_attr_freeride_policy_name">Off-piste</string>
<string name="routing_attr_freeride_policy_description">\'Freeride\' and \'Off-piste\' are unofficial routes and passages. Typically ungroomed, unmaintained and not checked in the evening. Enter at your own risk.</string>
<string name="voice_prompts_timetable">Voice prompts times</string>
</resources>

View file

@ -91,6 +91,12 @@
android:layout="@layout/preference_with_descr"
android:title="@string/arrival_distance" />
<Preference
android:key="voice_prompts_timetable"
android:layout="@layout/preference_with_descr"
android:persistent="false"
android:title="@string/voice_prompts_timetable" />
<Preference
android:layout="@layout/simple_divider_item"
android:selectable="false" />

View file

@ -519,10 +519,6 @@ public abstract class OsmandPlugin {
}
}
public boolean destinationReached() {
return true;
}
protected void registerLayerContextMenuActions(OsmandMapTileView mapView, ContextMenuAdapter adapter, MapActivity mapActivity) {
}
@ -781,17 +777,6 @@ public abstract class OsmandPlugin {
}
}
public static boolean onDestinationReached() {
boolean b = true;
for (OsmandPlugin plugin : getEnabledPlugins()) {
if (!plugin.destinationReached()) {
b = false;
}
}
return b;
}
public static void createLayers(OsmandMapTileView mapView, MapActivity activity) {
for (OsmandPlugin plugin : getEnabledPlugins()) {
plugin.registerLayers(activity);

View file

@ -33,6 +33,7 @@ import net.osmand.plus.routing.AlarmInfo;
import net.osmand.plus.routing.AlarmInfo.AlarmInfoType;
import net.osmand.plus.routing.RouteCalculationResult;
import net.osmand.plus.routing.VoiceRouter;
import net.osmand.plus.routing.data.AnnounceTimeDistances;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.util.MapUtils;
@ -46,6 +47,11 @@ import java.util.concurrent.ConcurrentHashMap;
import gnu.trove.list.array.TIntArrayList;
import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_LONG_ALARM_ANNOUNCE;
import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_LONG_PNT_APPROACH;
import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_SHORT_ALARM_ANNOUNCE;
import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_SHORT_PNT_APPROACH;
// import android.widget.Toast;
/**
@ -57,10 +63,6 @@ public class WaypointHelper {
private int searchDeviationRadius = 500;
private int poiSearchDeviationRadius = 100;
private static final int LONG_ANNOUNCE_RADIUS = 700;
private static final int SHORT_ANNOUNCE_RADIUS = 150;
private static final int ALARMS_ANNOUNCE_RADIUS = 150;
private static final int ALARMS_SHORT_ANNOUNCE_RADIUS = 100;
// don't annoy users by lots of announcements
private static final int APPROACH_POI_LIMIT = 1;
@ -167,6 +169,7 @@ public class WaypointHelper {
list.clear();
}
LocationPointWrapper found = null;
AnnounceTimeDistances atd = getVoiceRouter().getAnnounceTimeDistances();
for (int type = 0; type < locationPoints.size(); type++) {
if (type == ALARMS || type == TARGETS) {
continue;
@ -178,7 +181,8 @@ public class WaypointHelper {
if (lp.get(kIterator).routeIndex < route.getCurrentRoute()) {
// skip
} else {
if (route.getDistanceToPoint(lwp.routeIndex) <= LONG_ANNOUNCE_RADIUS) {
if (atd.isTurnStateActive(0,
route.getDistanceToPoint(lwp.routeIndex), STATE_LONG_PNT_APPROACH)) {
if (found == null || found.routeIndex < lwp.routeIndex) {
found = lwp;
if (list != null) {
@ -205,6 +209,7 @@ public class WaypointHelper {
AlarmInfo mostImportant = speedAlarm;
int value = speedAlarm != null ? speedAlarm.updateDistanceAndGetPriority(0, 0) : Integer.MAX_VALUE;
float speed = lastProjection != null && lastProjection.hasSpeed() ? lastProjection.getSpeed() : 0;
AnnounceTimeDistances atd = getVoiceRouter().getAnnounceTimeDistances();
if (ALARMS < pointsProgress.size()) {
int kIterator = pointsProgress.get(ALARMS);
List<LocationPointWrapper> lp = locationPoints.get(ALARMS);
@ -221,7 +226,7 @@ public class WaypointHelper {
inf.setFloatValue(route.getDistanceToPoint(inf.getLastLocationIndex()));
}
int d = route.getDistanceToPoint(inf.getLocationIndex());
if (d > LONG_ANNOUNCE_RADIUS) {
if (!atd.isTurnStateActive(0, d, STATE_LONG_PNT_APPROACH)) {
break;
}
float time = speed > 0 ? d / speed : Integer.MAX_VALUE;
@ -371,6 +376,8 @@ public class WaypointHelper {
pointsProgress.set(type, kIterator);
VoiceRouter voiceRouter = getVoiceRouter();
AnnounceTimeDistances atd = voiceRouter.getAnnounceTimeDistances();
float atdSpeed = atd.getSpeed(lastKnownLocation);
while (kIterator < lp.size()) {
LocationPointWrapper lwp = lp.get(kIterator);
if (type == ALARMS && lwp.routeIndex < currentRoute) {
@ -378,7 +385,8 @@ public class WaypointHelper {
continue;
}
if (lwp.announce) {
if (route.getDistanceToPoint(lwp.routeIndex) > LONG_ANNOUNCE_RADIUS * 2) {
if (!atd.isTurnStateActive(atdSpeed,
route.getDistanceToPoint(lwp.routeIndex) / 2, STATE_LONG_PNT_APPROACH)) {
break;
}
LocationPoint point = lwp.point;
@ -386,33 +394,33 @@ public class WaypointHelper {
point.getLatitude(), point.getLongitude()) - lwp.getDeviationDistance());
Integer state = locationPointsStates.get(point);
if (state != null && state == ANNOUNCED_ONCE
&& voiceRouter.isDistanceLess(lastKnownLocation.getSpeed(), d1, SHORT_ANNOUNCE_RADIUS)) {
&& atd.isTurnStateActive(atdSpeed, d1, STATE_SHORT_PNT_APPROACH)) {
locationPointsStates.put(point, ANNOUNCED_DONE);
announcePoints.add(lwp);
} else if (type != ALARMS && (state == null || state == NOT_ANNOUNCED)
&& voiceRouter.isDistanceLess(lastKnownLocation.getSpeed(), d1, LONG_ANNOUNCE_RADIUS)) {
&& atd.isTurnStateActive(atdSpeed, d1, STATE_LONG_PNT_APPROACH)) {
locationPointsStates.put(point, ANNOUNCED_ONCE);
approachPoints.add(lwp);
} else if (type == ALARMS && (state == null || state == NOT_ANNOUNCED)) {
AlarmInfo alarm = (AlarmInfo) point;
AlarmInfoType t = alarm.getType();
int announceRadius;
boolean filter = false;
boolean filterCloseAlarms = false;
switch (t) {
case TRAFFIC_CALMING:
announceRadius = ALARMS_SHORT_ANNOUNCE_RADIUS;
filter = true;
announceRadius = STATE_SHORT_ALARM_ANNOUNCE;
filterCloseAlarms = true;
break;
default:
announceRadius = ALARMS_ANNOUNCE_RADIUS;
announceRadius = STATE_LONG_ALARM_ANNOUNCE;
break;
}
boolean proceed = voiceRouter.isDistanceLess(lastKnownLocation.getSpeed(), d1, announceRadius);
if (proceed && filter) {
boolean proceed = atd.isTurnStateActive(atdSpeed, d1, announceRadius);
if (proceed && filterCloseAlarms) {
AlarmInfo lastAlarm = lastAnnouncedAlarms.get(t);
if (lastAlarm != null) {
double dist = MapUtils.getDistance(lastAlarm.getLatitude(), lastAlarm.getLongitude(), alarm.getLatitude(), alarm.getLongitude());
if (dist < ALARMS_SHORT_ANNOUNCE_RADIUS) {
if (atd.isTurnStateActive(atdSpeed, dist, STATE_SHORT_ALARM_ANNOUNCE)) {
locationPointsStates.put(point, ANNOUNCED_DONE);
proceed = false;
}

View file

@ -5,6 +5,7 @@ import androidx.annotation.NonNull;
import net.osmand.Location;
import net.osmand.binary.RouteDataObject;
import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo;
import net.osmand.plus.routing.data.AnnounceTimeDistances;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.router.RouteSegmentResult;
import net.osmand.router.TurnType;
@ -35,10 +36,11 @@ public class CurrentStreetName {
if (l != null && l.hasSpeed()) {
speed = l.getSpeed();
}
AnnounceTimeDistances adt = routingHelper.getVoiceRouter().getAnnounceTimeDistances();
boolean isSet = false;
// 1. turn is imminent
if (n.distanceTo > 0 && n.directionInfo != null && !n.directionInfo.getTurnType().isSkipToSpeak() &&
routingHelper.getVoiceRouter().isDistanceLess(speed, n.distanceTo, routingHelper.getVoiceRouter().PREPARE_DISTANCE * 0.75f)) {
adt.isTurnStateActive(adt.getSpeed(l), n.distanceTo * 1.3, AnnounceTimeDistances.STATE_PREPARE_TURN)) {
String nm = n.directionInfo.getStreetName();
String rf = n.directionInfo.getRef();
String dn = n.directionInfo.getDestinationName();

View file

@ -17,6 +17,7 @@ import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.TargetPointsHelper;
import net.osmand.plus.TargetPointsHelper.TargetPoint;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.notifications.OsmandNotification.NotificationType;
import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo;
import net.osmand.plus.routing.RouteProvider.GPXRouteParamsBuilder;
@ -29,7 +30,6 @@ import net.osmand.router.RouteExporter;
import net.osmand.router.RoutePlannerFrontEnd.GpxPoint;
import net.osmand.router.RoutePlannerFrontEnd.GpxRouteApproximation;
import net.osmand.router.RouteSegmentResult;
import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils;
import java.io.IOException;
@ -43,12 +43,12 @@ public class RoutingHelper {
private static final org.apache.commons.logging.Log log = PlatformUtil.getLog(RoutingHelper.class);
public static final float ALLOWED_DEVIATION = 2;
// This should be correlated with RoutingHelper.updateCurrentRouteStatus ( when processed turn now is not announced)
private static final int DEFAULT_GPS_TOLERANCE = 12;
public static int GPS_TOLERANCE = DEFAULT_GPS_TOLERANCE;
public static float ARRIVAL_DISTANCE_FACTOR = 1;
// POS_TOLERANCE
// 1) calculate current closest segment of the route during navigation
// 2) identify u-turn, projected distance
// 3) calculate max allowed deviation before route recalculation * multiplier
private static final float POS_TOLERANCE = 60; // 60m or 30m + accuracy
private static final float POS_TOLERANCE_DEVIATION_MULTIPLIER = 2;
private List<WeakReference<IRouteInformationListener>> listeners = new LinkedList<>();
private List<WeakReference<IRoutingDataUpdateListener>> updateListeners = new LinkedList<>();
@ -299,8 +299,6 @@ public class RoutingHelper {
public void setAppMode(ApplicationMode mode) {
this.mode = mode;
ARRIVAL_DISTANCE_FACTOR = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(mode), 0.1f);
GPS_TOLERANCE = (int) (DEFAULT_GPS_TOLERANCE * ARRIVAL_DISTANCE_FACTOR);
voiceRouter.updateAppMode();
}
@ -413,7 +411,7 @@ public class RoutingHelper {
isDeviatedFromRoute = false;
return locationProjection;
}
float posTolerance = RoutingHelperUtils.getPosTolerance(currentLocation.hasAccuracy() ? currentLocation.getAccuracy() : 0);
float posTolerance = getPosTolerance(currentLocation.hasAccuracy() ? currentLocation.getAccuracy() : 0);
boolean calculateRoute = false;
synchronized (this) {
isDeviatedFromRoute = false;
@ -432,7 +430,7 @@ public class RoutingHelper {
int currentRoute = route.currentRoute;
double allowableDeviation = route.getRouteRecalcDistance();
if (allowableDeviation == 0) {
allowableDeviation = RoutingHelperUtils.getDefaultAllowedDeviation(settings, route.getAppMode(), posTolerance);
allowableDeviation = RoutingHelper.getDefaultAllowedDeviation(settings, route.getAppMode(), posTolerance);
}
// 2. Analyze if we need to recalculate route
@ -471,22 +469,12 @@ public class RoutingHelper {
voiceRouter.interruptRouteCommands();
voiceRouterStopped = true; // Prevents excessive execution of stop() code
}
if (distOrth > mode.getOffRouteDistance() * ARRIVAL_DISTANCE_FACTOR && !settings.DISABLE_OFFROUTE_RECALC.get()) {
voiceRouter.announceOffRoute(distOrth);
}
voiceRouter.announceOffRoute(distOrth);
}
// calculate projection of current location
if (currentRoute > 0) {
locationProjection = new Location(currentLocation);
Location nextLocation = routeNodes.get(currentRoute);
LatLon project = RoutingHelperUtils.getProject(currentLocation, routeNodes.get(currentRoute - 1), routeNodes.get(currentRoute));
locationProjection.setLatitude(project.getLatitude());
locationProjection.setLongitude(project.getLongitude());
// we need to update bearing too
float bearingTo = locationProjection.bearingTo(nextLocation);
locationProjection.setBearing(bearingTo);
locationProjection = RoutingHelperUtils.getProject(currentLocation, routeNodes.get(currentRoute - 1), routeNodes.get(currentRoute));
}
}
lastFixedLocation = currentLocation;
@ -532,8 +520,8 @@ public class RoutingHelper {
}
processed = true;
}
} else if (newDist < dist || newDist < GPS_TOLERANCE / 2) {
// newDist < GPS_TOLERANCE (avoid distance 0 till next turn)
} else if (newDist < dist || newDist < posTolerance / 8) {
// newDist < posTolerance / 8 - 4-8 m (avoid distance 0 till next turn)
if (dist > posTolerance) {
processed = true;
if (log.isDebugEnabled()) {
@ -571,7 +559,7 @@ public class RoutingHelper {
// 2. check if intermediate found
if (route.getIntermediatePointsToPass() > 0
&& route.getDistanceToNextIntermediate(lastFixedLocation) < RoutingHelperUtils.getArrivalDistance(mode, settings) * 2f && !isRoutePlanningMode) {
&& route.getDistanceToNextIntermediate(lastFixedLocation) < voiceRouter.getArrivalDistance() && !isRoutePlanningMode) {
showMessage(app.getString(R.string.arrived_at_intermediate_point));
route.passIntermediatePoint();
TargetPointsHelper targets = app.getTargetPointsHelper();
@ -603,7 +591,7 @@ public class RoutingHelper {
// 3. check if destination found
Location lastPoint = routeNodes.get(routeNodes.size() - 1);
if (currentRoute > routeNodes.size() - 3
&& currentLocation.distanceTo(lastPoint) < RoutingHelperUtils.getArrivalDistance(mode, settings)
&& currentLocation.distanceTo(lastPoint) < voiceRouter.getArrivalDistance()
&& !isRoutePlanningMode) {
//showMessage(app.getString(R.string.arrived_at_destination));
TargetPointsHelper targets = app.getTargetPointsHelper();
@ -612,8 +600,7 @@ public class RoutingHelper {
if (isFollowingMode) {
voiceRouter.arrivedDestinationPoint(description);
}
boolean onDestinationReached = OsmandPlugin.onDestinationReached();
onDestinationReached &= app.getAppCustomization().onDestinationReached();
boolean onDestinationReached = true;
if (onDestinationReached) {
clearCurrentRoute(null, null);
setRoutePlanningMode(false);
@ -672,6 +659,37 @@ public class RoutingHelper {
return false;
}
private static float getPosTolerance(float accuracy) {
if (accuracy > 0) {
return POS_TOLERANCE / 2 + accuracy;
}
return POS_TOLERANCE;
}
private static float getDefaultAllowedDeviation(OsmandSettings settings, ApplicationMode mode, float posTolerance) {
if (settings.DISABLE_OFFROUTE_RECALC.getModeValue(mode)) {
return -1.0f;
} else if (mode.getRouteService() == RouteProvider.RouteService.DIRECT_TO) {
return -1.0f;
} else if (mode.getRouteService() == RouteProvider.RouteService.STRAIGHT) {
MetricsConstants mc = settings.METRIC_SYSTEM.getModeValue(mode);
if (mc == MetricsConstants.KILOMETERS_AND_METERS || mc == MetricsConstants.MILES_AND_METERS) {
return 500.f;
} else {
// 1/4 mile
return 482.f;
}
}
return posTolerance * POS_TOLERANCE_DEVIATION_MULTIPLIER;
}
public static float getDefaultAllowedDeviation(OsmandSettings settings, ApplicationMode mode) {
return getDefaultAllowedDeviation(settings, mode, getPosTolerance(0));
}
private void fireRoutingDataUpdateEvent() {
if (!updateListeners.isEmpty()) {
ArrayList<WeakReference<IRoutingDataUpdateListener>> tmp = new ArrayList<>(updateListeners);

View file

@ -17,7 +17,6 @@ import java.util.List;
public class RoutingHelperUtils {
private static final float POSITION_TOLERANCE = 60;
private static final int CACHE_RADIUS = 100000;
@NonNull
@ -66,10 +65,17 @@ public class RoutingHelperUtils {
return rect.left == 0 && rect.right == 0 ? null : rect;
}
static LatLon getProject(Location loc, Location from, Location to) {
return MapUtils.getProjection(loc.getLatitude(),
static Location getProject(Location loc, Location from, Location to) {
LatLon project = MapUtils.getProjection(loc.getLatitude(),
loc.getLongitude(), from.getLatitude(), from.getLongitude(),
to.getLatitude(), to.getLongitude());
Location locationProjection = new Location(loc);
locationProjection.setLatitude(project.getLatitude());
locationProjection.setLongitude(project.getLongitude());
// we need to update bearing too
float bearingTo = locationProjection.bearingTo(to);
locationProjection.setBearing(bearingTo);
return locationProjection;
}
static double getOrthogonalDistance(Location loc, Location from, Location to) {
@ -94,30 +100,6 @@ public class RoutingHelperUtils {
return index;
}
public static float getPosTolerance(float accuracy) {
if (accuracy > 0) {
return POSITION_TOLERANCE / 2 + accuracy;
}
return POSITION_TOLERANCE;
}
public static float getDefaultAllowedDeviation(OsmandSettings settings, ApplicationMode mode, float posTolerance) {
if (settings.DISABLE_OFFROUTE_RECALC.getModeValue(mode)) {
return -1.0f;
} else if (mode.getRouteService() == RouteProvider.RouteService.DIRECT_TO) {
return -1.0f;
} else if (mode.getRouteService() == RouteProvider.RouteService.STRAIGHT) {
MetricsConstants mc = settings.METRIC_SYSTEM.getModeValue(mode);
if (mc == MetricsConstants.KILOMETERS_AND_METERS || mc == MetricsConstants.MILES_AND_METERS) {
return 500.f;
} else {
// 1/4 mile
return 482.f;
}
}
return posTolerance * RoutingHelper.ALLOWED_DEVIATION;
}
/**
* Wrong movement direction is considered when between
* current location bearing (determines by 2 last fixed position or provided)
@ -181,16 +163,6 @@ public class RoutingHelperUtils {
return isOffRoute;
}
static float getArrivalDistance(ApplicationMode mode, OsmandSettings settings) {
ApplicationMode m = mode == null ? settings.getApplicationMode() : mode;
float defaultSpeed = Math.max(0.3f, m.getDefaultSpeed());
/// Used to be: car - 90 m, bicycle - 50 m, pedestrian - 20 m
// return ((float)settings.getApplicationMode().getArrivalDistance()) * settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(m);
// GPS_TOLERANCE - 12 m
// 5 seconds: car - 80 m @ 50 kmh, bicyle - 45 m @ 25 km/h, bicyle - 25 m @ 10 km/h, pedestrian - 18 m @ 4 km/h,
return RoutingHelper.GPS_TOLERANCE + defaultSpeed * 5 * RoutingHelper.ARRIVAL_DISTANCE_FACTOR;
}
public static void checkAndUpdateStartLocation(@NonNull OsmandApplication app, LatLon newStartLocation) {
if (newStartLocation != null) {

View file

@ -13,6 +13,7 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.helpers.WaypointHelper.LocationPointWrapper;
import net.osmand.plus.routing.AlarmInfo.AlarmInfoType;
import net.osmand.plus.routing.RouteCalculationResult.NextDirectionInfo;
import net.osmand.plus.routing.data.AnnounceTimeDistances;
import net.osmand.plus.routing.data.StreetName;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmAndAppCustomization.OsmAndAppCustomizationListener;
@ -35,6 +36,11 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_LONG_PREPARE_TURN;
import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_PREPARE_TURN;
import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_TURN_IN;
import static net.osmand.plus.routing.data.AnnounceTimeDistances.STATE_TURN_NOW;
public class VoiceRouter {
private static final int STATUS_UTWP_TOLD = -1;
@ -57,6 +63,8 @@ public class VoiceRouter {
protected final OsmandApplication app;
protected final RoutingHelper router;
protected OsmandSettings settings;
private ApplicationMode appMode;
private AnnounceTimeDistances atd;
private int currentStatus = STATUS_UNKNOWN;
private boolean playedAndArriveAtTarget = false;
@ -69,19 +77,8 @@ public class VoiceRouter {
private boolean announceBackOnRoute = false;
// private long lastTimeRouteRecalcAnnounced = 0;
// Remember when last announcement was made
private long lastAnnouncement = 0;
private long lastAnnouncement = 0;
// Default speed to have comfortable announcements (Speed in m/s)
private float DEFAULT_SPEED = 12;
private float TURN_NOW_SPEED;
private int PREPARE_LONG_DISTANCE;
private int PREPARE_LONG_DISTANCE_END;
protected int PREPARE_DISTANCE;
private int PREPARE_DISTANCE_END;
private int TURN_IN_DISTANCE;
private int TURN_IN_DISTANCE_END;
private int TURN_NOW_DISTANCE;
private SoundPool soundPool;
private int soundClick = -1;
@ -89,6 +86,7 @@ public class VoiceRouter {
private VoiceCommandPending pendingCommand = null;
private RouteDirectionInfo nextRouteDirection;
public interface VoiceMessageListener {
void onVoiceMessage(List<String> listCommands, List<String> played);
}
@ -179,103 +177,12 @@ public class VoiceRouter {
public void updateAppMode() {
ApplicationMode appMode = router.getAppMode() == null ? settings.getApplicationMode() : router.getAppMode();
if (appMode.isDerivedRoutingFrom(ApplicationMode.CAR)) {
// could be changed in future as others by default in settings is 45 kmh
DEFAULT_SPEED = 14; // ~50 km/h
//DEFAULT speed is configurable
// } else if (router.getAppMode().isDerivedRoutingFrom(ApplicationMode.BICYCLE)) {
// DEFAULT_SPEED = 2.77f; // 10 km/h
// } else if (router.getAppMode().isDerivedRoutingFrom(ApplicationMode.PEDESTRIAN)) {
// DEFAULT_SPEED = 1.11f; //4 km/h 2f; // 7,2 km/h
} else {
// minimal is 1 meter for turn now
DEFAULT_SPEED = (float) Math.max(0.3, appMode.getDefaultSpeed());
}
// Do not play [issue 1411]: prepare_long_distance warning not needed, used only for goAhead prompt
// 300 sec: 4 200 - 3 500 m - car [ 115 - 95 sec @ 120 km/h]
PREPARE_LONG_DISTANCE = (int) (DEFAULT_SPEED * 300);
PREPARE_LONG_DISTANCE_END = (int) (DEFAULT_SPEED * 250) ;
if (DEFAULT_SPEED < 30) {
// if (PREPARE_LONG_DISTANCE_END - PREPARE_DISTANCE < 4000) {
// Play only for high speed vehicle with speed > 110 km/h
PREPARE_DISTANCE_END = PREPARE_DISTANCE * 2;
}
// *#8749: Here the change for bicycle: 40-30 sec, 200-150 m -> 115-90 sec, 320-250m [ need to be tested ]
// 115 sec: 1 500 m - car [45 sec @ 120 km/h], 320 m - bicycle [45 sec @ 25 km/h], 230 m - pedestrian
PREPARE_DISTANCE = (int) (DEFAULT_SPEED * 115);
// 90 sec: 1 200 m - car, 250 m - bicycle [36 sec @ 25 km/h],
PREPARE_DISTANCE_END = (int) (DEFAULT_SPEED * 90);
// 22 sec: 310 m - car, 60 m - bicycle, 50m - pedestrian
TURN_IN_DISTANCE = (int) (DEFAULT_SPEED * 22);
// 15 sec: 210 m - car, 40 m - bicycle, 30 m - pedestrian
TURN_IN_DISTANCE_END = (int) (DEFAULT_SPEED * 15);
// same as speed < 150/(90-22) m/s = 2.2 m/s = 8 km/h
if (PREPARE_DISTANCE_END - TURN_IN_DISTANCE < 150) {
// Do not play: for pedestrian and slow transport
PREPARE_DISTANCE_END = PREPARE_DISTANCE * 2;
}
// Turn now: 3.5 sec normal speed, 7 second for halfspeed (default)
// float TURN_NOW_TIME = 7;
// ** #8749 to keep 1m / 1 sec precision (GPS_TOLERANCE - 12 m)
// 1 kmh - 1 m, 4 kmh - 4 m (pedestrian), 10 kmh - 10 m (bicycle), 50 kmh - 50 m (car)
// TURN_NOW_DISTANCE = (int) (DEFAULT_SPEED * 3.6); // 3.6 sec
// 50 kmh - 48 m (car), 10 kmh - 20 m, 4 kmh - 15 m, 1 kmh - 12 m
TURN_NOW_DISTANCE = (int) (RoutingHelper.GPS_TOLERANCE + DEFAULT_SPEED * 2.5 * RoutingHelper.ARRIVAL_DISTANCE_FACTOR); // 3.6 sec
// 1 kmh - 1 sec, 4 kmh - 2 sec (pedestrian), 10 kmh - 3 sec (*bicycle), 50 kmh - 7 sec (car)
float TURN_NOW_TIME = (float) Math.min(Math.sqrt(DEFAULT_SPEED * 3.6), 8);
TURN_NOW_SPEED = TURN_NOW_DISTANCE / TURN_NOW_TIME;
}
private double voicePromptDelayDistance = 0;
public boolean isDistanceLess(float currentSpeed, double dist, double etalon) {
return isDistanceLess(currentSpeed, dist, etalon, DEFAULT_SPEED);
}
private boolean isDistanceLess(float currentSpeed, double dist, double etalon, float defSpeed) {
if (currentSpeed <= 0) {
currentSpeed = DEFAULT_SPEED;
}
// Trigger close prompts earlier to allow BT SCO link being established, or when VOICE_PROMPT_DELAY is set >0 for the other stream types
int ams = settings.AUDIO_MANAGER_STREAM.getModeValue(router.getAppMode());
if ((ams == 0 && !AbstractPrologCommandPlayer.btScoStatus) || ams > 0) {
if (settings.VOICE_PROMPT_DELAY[ams] != null) {
voicePromptDelayDistance = currentSpeed * (double) settings.VOICE_PROMPT_DELAY[ams].get() / 1000;
}
}
if (dist - voicePromptDelayDistance < etalon ||
(dist - voicePromptDelayDistance) / currentSpeed < etalon / defSpeed) {
return true;
}
return false;
appMode = router.getAppMode() == null ? settings.getApplicationMode() : router.getAppMode();
atd = new AnnounceTimeDistances(appMode, settings);
}
public int calculateImminent(float dist, Location loc) {
float speed = DEFAULT_SPEED;
if (loc != null && loc.hasSpeed()) {
speed = loc.getSpeed();
}
if (isDistanceLess(speed, dist, TURN_NOW_DISTANCE)) {
return 0;
} else if (dist <= PREPARE_DISTANCE) {
return 1;
} else if (dist <= PREPARE_LONG_DISTANCE) {
return 2;
} else {
return -1;
}
return atd.getImminentTurnStatus(dist, loc);
}
private void nextStatusAfter(int previousStatus) {
@ -290,22 +197,32 @@ public class VoiceRouter {
private boolean statusNotPassed(int statusToCheck) {
return currentStatus <= statusToCheck;
}
public AnnounceTimeDistances getAnnounceTimeDistances() {
return atd;
}
public float getArrivalDistance() {
return atd.getArrivalDistance();
}
public void announceOffRoute(double dist) {
long ms = System.currentTimeMillis();
if (waitAnnouncedOffRoute == 0 || ms - lastAnnouncedOffRoute > waitAnnouncedOffRoute) {
CommandBuilder p = getNewCommandPlayerToPlay();
if (p != null) {
p.offRoute(dist);
announceBackOnRoute = true;
if (dist > atd.getOffRouteDistance() && !settings.DISABLE_OFFROUTE_RECALC.get()) {
long ms = System.currentTimeMillis();
if (waitAnnouncedOffRoute == 0 || ms - lastAnnouncedOffRoute > waitAnnouncedOffRoute) {
CommandBuilder p = getNewCommandPlayerToPlay();
if (p != null) {
p.offRoute(dist);
announceBackOnRoute = true;
}
play(p);
if (waitAnnouncedOffRoute == 0) {
waitAnnouncedOffRoute = 60000;
} else {
waitAnnouncedOffRoute *= 2.5;
}
lastAnnouncedOffRoute = ms;
}
play(p);
if (waitAnnouncedOffRoute == 0) {
waitAnnouncedOffRoute = 60000;
} else {
waitAnnouncedOffRoute *= 2.5;
}
lastAnnouncedOffRoute = ms;
}
}
@ -486,15 +403,7 @@ public class VoiceRouter {
* @param currentLocation
*/
protected void updateStatus(Location currentLocation, boolean repeat) {
// Directly after turn: goAhead (dist), unless:
// < PREPARE_LONG_DISTANCE (e.g. 3500m): playPrepareTurn (-not played any more-)
// < PREPARE_DISTANCE (e.g. 1500m): playPrepareTurn ("Turn after ...")
// < TURN_IN_DISTANCE (e.g. 390m or 30sec): playMakeTurnIn ("Turn in ...")
// < TURN_NOW_DISTANCE (e.g. 50m or 7sec): playMakeTurn ("Turn ...")
float speed = DEFAULT_SPEED;
if (currentLocation != null && currentLocation.hasSpeed()) {
speed = Math.max(currentLocation.getSpeed(), speed);
}
float speed = atd.getSpeed(currentLocation);
NextDirectionInfo nextInfo = router.getNextRouteDirectionInfo(new NextDirectionInfo(), true);
RouteSegmentResult currentSegment = router.getCurrentSegmentResult();
@ -531,23 +440,24 @@ public class VoiceRouter {
if (currentStatus == STATUS_UNKNOWN) {
// Play "Continue for ..." if (1) after route calculation if no other prompt is due, or (2) after a turn if next turn is more than PREPARE_LONG_DISTANCE away
if ((playGoAheadDist == -1) || (dist > PREPARE_LONG_DISTANCE)) {
playGoAheadDist = dist - 3 * TURN_NOW_DISTANCE;
if ((playGoAheadDist == -1) || !atd.isTurnStateActive(0, dist, STATE_LONG_PREPARE_TURN)) {
// 10 seconds
playGoAheadDist = dist - 10 * speed;
}
}
NextDirectionInfo nextNextInfo = router.getNextRouteDirectionInfoAfter(nextInfo, new NextDirectionInfo(), true); //I think "true" is correct here, not "!repeat"
// Note: getNextRouteDirectionInfoAfter(nextInfo, x, y).distanceTo is distance from nextInfo, not from current position!
// STATUS_TURN = "Turn (now)"
if ((repeat || statusNotPassed(STATUS_TURN)) && isDistanceLess(speed, dist, TURN_NOW_DISTANCE, TURN_NOW_SPEED)) {
if (nextNextInfo.distanceTo < TURN_IN_DISTANCE_END && nextNextInfo != null) {
if ((repeat || statusNotPassed(STATUS_TURN)) && atd.isTurnStateActive(speed, dist, STATE_TURN_NOW)) {
if (nextNextInfo != null && !atd.isTurnStateNotPassed(0, nextNextInfo.distanceTo, STATE_TURN_IN )) {
playMakeTurn(currentSegment, next, nextNextInfo);
} else {
playMakeTurn(currentSegment, next, null);
}
if (!next.getTurnType().goAhead() && isTargetPoint(nextNextInfo)) { // !goAhead() avoids isolated "and arrive.." prompt, as goAhead() is not pronounced
if (nextNextInfo.distanceTo < TURN_IN_DISTANCE_END) {
if (!next.getTurnType().goAhead() && isTargetPoint(nextNextInfo) && nextNextInfo != null) {
// !goAhead() avoids isolated "and arrive.." prompt, as goAhead() is not pronounced
if (!atd.isTurnStateNotPassed(0, nextNextInfo.distanceTo, STATE_TURN_IN )) {
// Issue #2865: Ensure a distance associated with the destination arrival is always announced, either here, or in subsequent "Turn in" prompt
// Distance fon non-straights already announced in "Turn (now)"'s nextnext code above
if ((nextNextInfo != null) && (nextNextInfo.directionInfo != null) && nextNextInfo.directionInfo.getTurnType().goAhead()) {
@ -555,7 +465,7 @@ public class VoiceRouter {
playGoAhead(nextNextInfo.distanceTo, new StreetName());
}
playAndArriveAtDestination(nextNextInfo);
} else if (nextNextInfo.distanceTo < 1.2f * TURN_IN_DISTANCE_END) {
} else if (!atd.isTurnStateNotPassed(0, nextNextInfo.distanceTo / 1.2f, STATE_TURN_IN )) {
// 1.2 is safety margin should the subsequent "Turn in" prompt not fit in amy more
playThen();
playGoAhead(nextNextInfo.distanceTo, new StreetName());
@ -565,33 +475,33 @@ public class VoiceRouter {
nextStatusAfter(STATUS_TURN);
// STATUS_TURN_IN = "Turn in ..."
} else if ((repeat || statusNotPassed(STATUS_TURN_IN)) && isDistanceLess(speed, dist, TURN_IN_DISTANCE)) {
if (repeat || dist >= TURN_IN_DISTANCE_END) {
if ((isDistanceLess(speed, nextNextInfo.distanceTo, TURN_NOW_DISTANCE) || nextNextInfo.distanceTo < TURN_IN_DISTANCE_END) &&
nextNextInfo != null) {
playMakeTurnIn(currentSegment, next, dist - (int) voicePromptDelayDistance, nextNextInfo.directionInfo);
} else if ((repeat || statusNotPassed(STATUS_TURN_IN)) && atd.isTurnStateActive(speed, dist, STATE_TURN_IN)) {
if (repeat || atd.isTurnStateNotPassed(0, dist, STATE_TURN_IN)) {
if (nextNextInfo != null && (atd.isTurnStateActive(speed, nextNextInfo.distanceTo, STATE_TURN_NOW)
|| !atd.isTurnStateNotPassed(speed, nextNextInfo.distanceTo, STATE_TURN_IN))) {
playMakeTurnIn(currentSegment, next, atd.calcDistanceWithoutDelay(speed, dist), nextNextInfo.directionInfo);
} else {
playMakeTurnIn(currentSegment, next, dist - (int) voicePromptDelayDistance, null);
playMakeTurnIn(currentSegment, next, atd.calcDistanceWithoutDelay(speed, dist), null);
}
playGoAndArriveAtDestination(repeat, nextInfo, currentSegment);
}
nextStatusAfter(STATUS_TURN_IN);
// STATUS_PREPARE = "Turn after ..."
} else if ((repeat || statusNotPassed(STATUS_PREPARE)) && (dist <= PREPARE_DISTANCE)) {
if (repeat || dist >= PREPARE_DISTANCE_END) {
} else if ((repeat || statusNotPassed(STATUS_PREPARE)) && atd.isTurnStateActive(0, dist, STATE_PREPARE_TURN)) {
if (repeat || atd.isTurnStateNotPassed(0, dist, STATE_PREPARE_TURN)) {
if (!repeat && (next.getTurnType().keepLeft() || next.getTurnType().keepRight())) {
// Do not play prepare for keep left/right
} else {
playPrepareTurn(currentSegment, next, dist);
playPrepareTurn(currentSegment, next, atd.calcDistanceWithoutDelay(speed, dist));
playGoAndArriveAtDestination(repeat, nextInfo, currentSegment);
}
}
nextStatusAfter(STATUS_PREPARE);
// STATUS_LONG_PREPARE = also "Turn after ...", we skip this now, users said this is obsolete
} else if ((repeat || statusNotPassed(STATUS_LONG_PREPARE)) && (dist <= PREPARE_LONG_DISTANCE)) {
if (repeat || dist >= PREPARE_LONG_DISTANCE_END) {
} else if ((repeat || statusNotPassed(STATUS_LONG_PREPARE)) && atd.isTurnStateActive(0, dist, STATE_LONG_PREPARE_TURN)) {
if (repeat || atd.isTurnStateNotPassed(0, dist, STATE_LONG_PREPARE_TURN)) {
playPrepareTurn(currentSegment, next, dist);
playGoAndArriveAtDestination(repeat, nextInfo, currentSegment);
}
@ -835,7 +745,8 @@ public class VoiceRouter {
playGoAhead(nextInfo.distanceTo, getSpeakableStreetName(currentSegment, next, false));
playAndArriveAtDestination(nextInfo);
playedAndArriveAtTarget = true;
} else if (nextInfo.distanceTo <= 2 * TURN_IN_DISTANCE) {
} else if (nextInfo != null &&
atd.isTurnStateActive(0, nextInfo.distanceTo / 2, STATE_TURN_IN)) {
playAndArriveAtDestination(nextInfo);
playedAndArriveAtTarget = true;
}

View file

@ -0,0 +1,236 @@
package net.osmand.plus.routing.data;
import net.osmand.Location;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.voice.AbstractPrologCommandPlayer;
public class AnnounceTimeDistances {
// Avoids false negatives: Pre-pone close announcements by this distance to allow for the possible over-estimation of the 'true' lead distance due to positioning error.
// A smaller value will increase the timing precision, but at the risk of missing prompts which do not meet the precision limit.
// We can research if a flexible value like min(12, x * gps-hdop) has advantages over a constant (x could be 2 or so).
private static final int POSITIONING_TOLERANCE = 12;
public final static int STATE_TURN_NOW = 0;
public final static int STATE_TURN_IN = 1;
public final static int STATE_PREPARE_TURN = 2;
public final static int STATE_LONG_PREPARE_TURN = 3;
public final static int STATE_SHORT_ALARM_ANNOUNCE = 4;
public final static int STATE_LONG_ALARM_ANNOUNCE = 5;
public final static int STATE_SHORT_PNT_APPROACH = 6;
public final static int STATE_LONG_PNT_APPROACH = 7;
// Default speed to have comfortable announcements (Speed in m/s)
// initial value is updated from default speed settings anyway
private float DEFAULT_SPEED = 10;
private double voicePromptDelayTimeSec = 0;
private float ARRIVAL_DISTANCE;
private float OFF_ROUTE_DISTANCE;
private float TURN_NOW_SPEED;
private int PREPARE_LONG_DISTANCE;
private int PREPARE_LONG_DISTANCE_END;
private int PREPARE_DISTANCE;
private int PREPARE_DISTANCE_END;
private int TURN_IN_DISTANCE;
private int TURN_IN_DISTANCE_END;
private int TURN_NOW_DISTANCE;
private int LONG_PNT_ANNOUNCE_RADIUS;
private int SHORT_PNT_ANNOUNCE_RADIUS;
private int LONG_ALARM_ANNOUNCE_RADIUS;
private int SHORT_ALARM_ANNOUNCE_RADIUS;
public AnnounceTimeDistances(ApplicationMode appMode, OsmandSettings settings) {
if (appMode.isDerivedRoutingFrom(ApplicationMode.CAR)) {
// keep it as minimum 30 kmh for voice announcement
DEFAULT_SPEED = (float) Math.max(8, appMode.getDefaultSpeed());
} else {
// minimal is 1 meter for turn now
DEFAULT_SPEED = (float) Math.max(0.3, appMode.getDefaultSpeed());
}
// Calculate minimal distance / time to announce turns, so time to turn is always >= ETALON_TIME
// Distance < ETALON_DIST or TIME_WITH_CURRENT_SPEED < ETALON_TIME_DEFAULT_SPEED
// 300 sec: 4 200 - 3 500 m - car [ 115 - 95 sec @ 120 km/h]
PREPARE_LONG_DISTANCE = (int) (DEFAULT_SPEED * 300);
PREPARE_LONG_DISTANCE_END = (int) (DEFAULT_SPEED * 250) ;
if (DEFAULT_SPEED < 30) {
// Play only for high speed vehicle with speed > 110 km/h
// [issue 1411] - used only for goAhead prompt
PREPARE_LONG_DISTANCE_END = PREPARE_LONG_DISTANCE * 2;
}
// 115 sec: 1 500 m - car [45 sec @ 120 km/h], 320 m - bicycle [45 sec @ 25 km/h], 230 m - pedestrian
PREPARE_DISTANCE = (int) (DEFAULT_SPEED * 115);
// 90 sec: 1 200 m - car, 250 m - bicycle [36 sec @ 25 km/h],
PREPARE_DISTANCE_END = (int) (DEFAULT_SPEED * 90);
// 22 sec: 310 m - car, 60 m - bicycle, 50m - pedestrian
TURN_IN_DISTANCE = (int) (DEFAULT_SPEED * 22);
// 15 sec: 210 m - car, 40 m - bicycle, 30 m - pedestrian
TURN_IN_DISTANCE_END = (int) (DEFAULT_SPEED * 15);
// Do not play prepare: for pedestrian and slow transport
// same check as speed < 150/(90-22) m/s = 2.2 m/s = 8 km/h
// if (DEFAULT_SPEED < 2.3) {
if (PREPARE_DISTANCE_END - TURN_IN_DISTANCE < 150) {
PREPARE_DISTANCE_END = PREPARE_DISTANCE * 2;
}
// Turn now: 3.5 sec normal speed, 7 second for halfspeed (default)
// float TURN_NOW_TIME = 7;
// ** #8749 to keep 1m / 1 sec precision (POSITIONING_TOLERANCE = 12 m)
// 1 kmh - 1 sec, 4 kmh - 2 sec (pedestrian), 10 kmh - 3 sec (*bicycle), 50 kmh - 7 sec (car)
float TURN_NOW_TIME = (float) Math.min(Math.sqrt(DEFAULT_SPEED * 3.6), 8);
float ARRIVAL_DISTANCE_FACTOR = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f);
// TURN_NOW_DISTANCE = (int) (DEFAULT_SPEED * 3.6); // 3.6 sec
// 50 kmh - 48 m (car), 10 kmh - 20 m, 4 kmh - 15 m, 1 kmh - 12 m
// 3.6 sec: 43 m (car), 18 m (bicycle), 12 m (walking, capped by POSITIONING_TOLERANCE)
TURN_NOW_DISTANCE = (int) (Math.max(POSITIONING_TOLERANCE, DEFAULT_SPEED * 3.6) * ARRIVAL_DISTANCE_FACTOR);
TURN_NOW_SPEED = TURN_NOW_DISTANCE / TURN_NOW_TIME;
// 5 sec: 60 m (car), 25 m (bicycle), 12 m (walking)
ARRIVAL_DISTANCE = (int) (Math.max(POSITIONING_TOLERANCE, DEFAULT_SPEED * 5.) * ARRIVAL_DISTANCE_FACTOR);
// 50 kmh - 280 m, 10 kmh - 55 m, 4 kmh - 22 m
OFF_ROUTE_DISTANCE = DEFAULT_SPEED * 20 * ARRIVAL_DISTANCE_FACTOR; // 20 seconds
// assume for backward compatibility speed - 10 m/s
LONG_PNT_ANNOUNCE_RADIUS = (int) (60 * DEFAULT_SPEED * ARRIVAL_DISTANCE_FACTOR); // 700m
SHORT_PNT_ANNOUNCE_RADIUS = (int) (15 * DEFAULT_SPEED * ARRIVAL_DISTANCE_FACTOR); // 150m
LONG_ALARM_ANNOUNCE_RADIUS = (int) (12 * DEFAULT_SPEED * ARRIVAL_DISTANCE_FACTOR); // 150m
SHORT_ALARM_ANNOUNCE_RADIUS = (int) (7 * DEFAULT_SPEED * ARRIVAL_DISTANCE_FACTOR); // 100m
// Trigger close prompts earlier to allow BT SCO link being established, or when VOICE_PROMPT_DELAY is set >0 for the other stream types
int ams = settings.AUDIO_MANAGER_STREAM.getModeValue(appMode);
if ((ams == 0 && !AbstractPrologCommandPlayer.btScoStatus) || ams > 0) {
if (settings.VOICE_PROMPT_DELAY[ams] != null) {
voicePromptDelayTimeSec = (double) settings.VOICE_PROMPT_DELAY[ams].get() / 1000;
}
}
}
public int getImminentTurnStatus(float dist, Location loc) {
float speed = getSpeed(loc);
if (isTurnStateActive(speed, dist, STATE_TURN_NOW)) {
return 0;
} else if (isTurnStateActive(speed, dist, STATE_PREPARE_TURN)) {
// STATE_TURN_IN included
return 1;
} else {
return -1;
}
}
public boolean isTurnStateActive(float currentSpeed, double dist, int turnType) {
switch (turnType) {
case STATE_TURN_IN:
return isDistanceLess(currentSpeed, dist, TURN_IN_DISTANCE);
case STATE_PREPARE_TURN:
return isDistanceLess(currentSpeed, dist, PREPARE_DISTANCE);
case STATE_LONG_PREPARE_TURN:
return isDistanceLess(currentSpeed, dist, PREPARE_LONG_DISTANCE);
case STATE_TURN_NOW:
return isDistanceLess(currentSpeed, dist, TURN_NOW_DISTANCE, TURN_NOW_SPEED);
case STATE_LONG_PNT_APPROACH:
return isDistanceLess(currentSpeed, dist, LONG_PNT_ANNOUNCE_RADIUS);
case STATE_SHORT_PNT_APPROACH:
return isDistanceLess(currentSpeed, dist, SHORT_PNT_ANNOUNCE_RADIUS);
case STATE_LONG_ALARM_ANNOUNCE:
return isDistanceLess(currentSpeed, dist, LONG_ALARM_ANNOUNCE_RADIUS);
case STATE_SHORT_ALARM_ANNOUNCE:
return isDistanceLess(currentSpeed, dist, SHORT_ALARM_ANNOUNCE_RADIUS);
}
return false;
}
public boolean isTurnStateNotPassed(float currentSpeed, double dist, int turnType) {
switch (turnType) {
case STATE_TURN_IN:
return !isDistanceLess(currentSpeed, dist, TURN_IN_DISTANCE_END);
case STATE_PREPARE_TURN:
return !isDistanceLess(currentSpeed, dist, PREPARE_DISTANCE_END);
case STATE_LONG_PREPARE_TURN:
return !isDistanceLess(currentSpeed, dist, PREPARE_LONG_DISTANCE_END);
case STATE_LONG_PNT_APPROACH:
return !isDistanceLess(currentSpeed, dist, LONG_PNT_ANNOUNCE_RADIUS * 0.5);
case STATE_LONG_ALARM_ANNOUNCE:
return !isDistanceLess(currentSpeed, dist, LONG_ALARM_ANNOUNCE_RADIUS * 0.5);
}
return true;
}
private boolean isDistanceLess(float currentSpeed, double dist, double etalon) {
return isDistanceLess(currentSpeed, dist, etalon, DEFAULT_SPEED);
}
private boolean isDistanceLess(float currentSpeed, double dist, double etalon, float defSpeed) {
if (dist - voicePromptDelayTimeSec * currentSpeed <= etalon) {
return true;
}
// check only if speed > 0
if (currentSpeed > 0 && (dist / currentSpeed - voicePromptDelayTimeSec) <= etalon / defSpeed) {
return true;
}
return false;
}
public float getSpeed(Location loc) {
float speed = DEFAULT_SPEED;
if (loc != null && loc.hasSpeed()) {
speed = Math.max(loc.getSpeed(), speed);
}
return speed;
}
public float getOffRouteDistance() {
return OFF_ROUTE_DISTANCE;
}
public float getArrivalDistance() {
return ARRIVAL_DISTANCE;
}
public int calcDistanceWithoutDelay(float speed, int dist) {
return (int) (dist - voicePromptDelayTimeSec * speed);
}
private void appendTurnDesc(StringBuilder s, String name, int dist) {
appendTurnDesc(s, name, dist, DEFAULT_SPEED);
}
private void appendTurnDesc(StringBuilder s, String name, int dist, float speed) {
int minDist = (dist / 5) * 5;
int time = (int) (dist / speed);
if(time > 15) {
// round to 5
time = (time / 5) * 5;
}
s.append(String.format("%s: %d - %d m, %d sec\n", name, minDist, minDist + 5, time));
}
public String getTurnsDescription() {
StringBuilder turnDescriptions = new StringBuilder();
appendTurnDesc(turnDescriptions, "Turn (now)", TURN_NOW_DISTANCE, TURN_NOW_SPEED);
appendTurnDesc(turnDescriptions, "Turn (approach)", TURN_IN_DISTANCE);
if (PREPARE_DISTANCE_END <= PREPARE_DISTANCE) {
appendTurnDesc(turnDescriptions, "Turn (prepare)", PREPARE_DISTANCE);
}
if (PREPARE_LONG_DISTANCE_END <= PREPARE_LONG_DISTANCE) {
appendTurnDesc(turnDescriptions, "Turn (early prepare)", PREPARE_LONG_DISTANCE);
}
appendTurnDesc(turnDescriptions, "Finish", (int) getArrivalDistance());
if (getOffRouteDistance() > 0) {
appendTurnDesc(turnDescriptions, "Off-route", (int) getOffRouteDistance());
}
appendTurnDesc(turnDescriptions, "Alarm (now)", SHORT_ALARM_ANNOUNCE_RADIUS);
appendTurnDesc(turnDescriptions, "Alarm (prepare)", LONG_ALARM_ANNOUNCE_RADIUS);
appendTurnDesc(turnDescriptions, "POI/Waypoint (now)", SHORT_PNT_ANNOUNCE_RADIUS);
appendTurnDesc(turnDescriptions, "POI/Waypoint (prepare)", LONG_PNT_ANNOUNCE_RADIUS);
return turnDescriptions.toString();
}
}

View file

@ -374,13 +374,6 @@ public class ApplicationMode {
}
public int getOffRouteDistance() {
// used to be: 50/14 - 350 m, 10/2.7 - 50 m, 4/1.11 - 20 m
float speed = Math.max(getDefaultSpeed(), 0.3f);
// become: 50 kmh - 280 m, 10 kmh - 55 m, 4 kmh - 22 m
return (int) (speed * 20);
}
public boolean hasFastSpeed() {
return getDefaultSpeed() > 10;
}

View file

@ -227,9 +227,6 @@ public class OsmAndAppCustomization {
return true;
}
public boolean onDestinationReached() {
return true;
}
@Nullable
public Bitmap getNavDrawerLogo() {

View file

@ -15,7 +15,7 @@ import com.google.android.material.slider.Slider;
import net.osmand.AndroidUtils;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.routing.RoutingHelperUtils;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
@ -207,8 +207,7 @@ public class RecalculateRouteInDeviationBottomSheet extends BooleanPreferenceBot
}
private void getDefaultValue() {
currentValue = RoutingHelperUtils.getDefaultAllowedDeviation(settings, appMode,
RoutingHelperUtils.getPosTolerance(0));
currentValue = RoutingHelper.getDefaultAllowedDeviation(settings, appMode);
}
private int findIndexOfValue(float allowedValue) {

View file

@ -33,7 +33,6 @@ import net.osmand.plus.UiUtilities;
import net.osmand.plus.Version;
import net.osmand.plus.routing.RouteProvider;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.routing.RoutingHelperUtils;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.BooleanPreference;
import net.osmand.plus.settings.backend.CommonPreference;
@ -479,7 +478,7 @@ public class RouteParametersFragment extends BaseSettingsFragment implements OnP
float allowedValue = settings.ROUTE_RECALCULATION_DISTANCE.getModeValue(appMode);
boolean enabled = allowedValue != DISABLE_MODE;
if (allowedValue <= 0) {
allowedValue = RoutingHelperUtils.getDefaultAllowedDeviation(settings, appMode, RoutingHelperUtils.getPosTolerance(0));
allowedValue = RoutingHelper.getDefaultAllowedDeviation(settings, appMode);
}
String summary = String.format(getString(R.string.ltr_or_rtl_combine_via_bold_point),
enabled ? getString(R.string.shared_string_enabled) : getString(R.string.shared_string_disabled),

View file

@ -17,6 +17,7 @@ import androidx.preference.PreferenceViewHolder;
import androidx.preference.SwitchPreferenceCompat;
import net.osmand.AndroidUtils;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.Version;
@ -26,6 +27,7 @@ import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.download.DownloadActivityType;
import net.osmand.plus.helpers.FileNameTranslationHelper;
import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.routing.data.AnnounceTimeDistances;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.preferences.ListPreferenceEx;
@ -40,6 +42,7 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr
public static final String TAG = VoiceAnnouncesFragment.class.getSimpleName();
private static final String MORE_VALUE = "MORE_VALUE";
private static final String VOICE_PROMPTS_TIMETABLE = "voice_prompts_timetable";
@Override
protected void createToolbar(LayoutInflater inflater, View view) {
@ -93,6 +96,7 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr
setupKeepInformingPref();
setupArrivalAnnouncementPref();
updateVoicePromptsTimes();
setupVoiceProviderPref();
if (!Version.isBlackberry(app)) {
@ -104,6 +108,17 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr
setupSpeedCamerasAlert();
}
private void updateVoicePromptsTimes() {
Preference pref = findPreference(VOICE_PROMPTS_TIMETABLE);
if (OsmandPlugin.isDevelopment()) {
AnnounceTimeDistances atd = new AnnounceTimeDistances(getSelectedAppMode(), settings);
pref.setSummary(atd.getTurnsDescription().trim());
pref.setVisible(true);
} else {
pref.setVisible(false);
}
}
private void setupSpeedLimitExceedPref() {
//array size must be equal!
Float[] valuesKmh = new Float[] {-10f, -7f, -5f, 0f, 5f, 7f, 10f, 15f, 20f};
@ -259,6 +274,9 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr
settings.SPEAK_SPEED_CAMERA.getId(), false, ApplyQueryType.SNACK_BAR);
}
}
if (prefId.equals(settings.ARRIVAL_DISTANCE_FACTOR.getId())) {
updateVoicePromptsTimes();
}
if (prefId.equals(settings.AUDIO_MANAGER_STREAM.getId())) {
return onConfirmPreferenceChange(
settings.AUDIO_MANAGER_STREAM.getId(), newValue, ApplyQueryType.SNACK_BAR);
@ -293,8 +311,11 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr
@Override
public boolean onPreferenceClick(Preference preference) {
if (settings.SPEED_CAMERAS_UNINSTALLED.getId().equals(preference.getKey())) {
String prefId = preference.getKey();
if (settings.SPEED_CAMERAS_UNINSTALLED.getId().equals(prefId)) {
SpeedCamerasBottomSheet.showInstance(requireActivity().getSupportFragmentManager(), this);
} else if (VOICE_PROMPTS_TIMETABLE.equals(prefId)) {
app.showToastMessage(String.valueOf(preference.getSummary()));
}
return super.onPreferenceClick(preference);
}

View file

@ -55,7 +55,7 @@ android {
repositories {
ivy {
name = "OsmAndBinariesIvy"
url = "http://builder.osmand.net"
url = "https://builder.osmand.net"
layout "pattern", {
artifact "ivy/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}

View file

@ -55,7 +55,7 @@ android {
repositories {
ivy {
name = "OsmAndBinariesIvy"
url = "http://builder.osmand.net"
url = "https://builder.osmand.net"
layout "pattern", {
artifact "ivy/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}

View file

@ -55,7 +55,7 @@ android {
repositories {
ivy {
name = "OsmAndBinariesIvy"
url = "http://builder.osmand.net"
url = "https://builder.osmand.net"
layout "pattern", {
artifact "ivy/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}

View file

@ -56,7 +56,7 @@ android {
repositories {
ivy {
name = "OsmAndBinariesIvy"
url = "http://builder.osmand.net"
url = "https://builder.osmand.net"
layout "pattern", {
artifact "ivy/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}