Merge branch 'master' into Unbookmark_gpx

This commit is contained in:
Vitaliy 2021-04-13 01:36:26 +03:00
commit 08e2c4ed26
68 changed files with 1740 additions and 574 deletions

View file

@ -64,4 +64,37 @@
<string name="shared_string_end">Fino</string> <string name="shared_string_end">Fino</string>
<string name="time_zone">Horzono</string> <string name="time_zone">Horzono</string>
<string name="send_report">Sendi raporton</string> <string name="send_report">Sendi raporton</string>
<string name="search_contacts">Serĉi kontaktojn</string>
<string name="bearing">Direkto</string>
<string name="proxy_settings">Agordoj pri la Retperanto</string>
<string name="proxy_type">Tipo de retperanto</string>
<string name="units_and_formats">Mezurunuoj &amp; formoj</string>
<string name="shared_string_export">Elporti</string>
<string name="points_size">%1$d punktoj</string>
<string name="shared_string_appearance">Aspekto</string>
<string name="telegram_privacy_policy">Reguloj pri Privateco de Telegram</string>
<string name="osmand_privacy_policy">Reguloj pri Privateco de OsmAnd</string>
<string name="shared_string_update">Ĝisdatigi</string>
<string name="shared_string_collected">Kolektita</string>
<string name="open_in_osmand">Montri per OsmAnd</string>
<string name="background_work">Fona laboro</string>
<string name="no_internet_connection">Sen interreta konekto</string>
<string name="shared_string_status">Stato</string>
<string name="proxy">Retperanto</string>
<string name="gpx_settings">Agordoj pri GPX</string>
<string name="start_end_date">Komenca Fina datoj</string>
<string name="unit_of_speed_system_descr">Difinu la mezurunuon de rapido.</string>
<string name="unit_of_length">Mezurunuoj de longo</string>
<string name="unit_of_speed_system">Mezurunuo de rapido</string>
<string name="shared_string_error_short">ERARO</string>
<string name="back_to_osmand">Reen al OsmAnd</string>
<string name="duration_ago">antaŭ %1$s</string>
<string name="last_response_duration">Lasta respondo: antaŭ %1$s</string>
<string name="last_update_from_telegram_duration">Lasta ĝisdatigo de Telegram: antaŭ %1$s</string>
<string name="last_update_from_telegram_date">Lasta ĝisdatigo de Telegram: %1$s</string>
<string name="last_response_date">Lasta respondo: %1$s</string>
<string name="show_users_on_map">Montri uzantojn sur la mapo</string>
<string name="install_osmand">Instali OsmAnd</string>
<string name="shared_string_suggested">Sugestataj</string>
<string name="average_speed">Mezuma rapido</string>
</resources> </resources>

View file

@ -237,7 +237,7 @@
<string name="not_possible_to_send_to_telegram_chats">Impossible d\'envoyer dans les discussions Telegram :</string> <string name="not_possible_to_send_to_telegram_chats">Impossible d\'envoyer dans les discussions Telegram :</string>
<string name="successfully_sent_and_updated">Envoyé et mis à jour avec succès</string> <string name="successfully_sent_and_updated">Envoyé et mis à jour avec succès</string>
<string name="last_updated_location">Dernière position mise à jour :</string> <string name="last_updated_location">Dernière position mise à jour :</string>
<string name="share_location_as_description">Si vous voulez connecter plusieurs appareils à un même compte Telegram, vous devez utiliser un appareil différent pour partager votre position.</string> <string name="share_location_as_description">Si vous souhaitez connecter plusieurs appareils à un même compte Telegram, vous devez partager votre position depuis chaque appareil.</string>
<string name="share_location_as_description_second_line">Vous pouvez créer et visualiser l\'identifiant du périphérique dans le client Telegram en utilisant le chat-bot %1$s. %2$s</string> <string name="share_location_as_description_second_line">Vous pouvez créer et visualiser l\'identifiant du périphérique dans le client Telegram en utilisant le chat-bot %1$s. %2$s</string>
<string name="enter_device_name_description">Nommez votre nouveau périphérique en max 200 symboles.</string> <string name="enter_device_name_description">Nommez votre nouveau périphérique en max 200 symboles.</string>
<string name="enter_another_device_name">Choisissez un nom que vous n\'avez pas encore utilisé</string> <string name="enter_another_device_name">Choisissez un nom que vous n\'avez pas encore utilisé</string>
@ -266,7 +266,7 @@
<string name="location_history_desc">Cacher les contacts qui ne se sont pas déplacés depuis un temps donné.</string> <string name="location_history_desc">Cacher les contacts qui ne se sont pas déplacés depuis un temps donné.</string>
<string name="set_time_description">Définissez l\'heure à laquelle les contacts et groupes sélectionnés verront votre position en temps réel.</string> <string name="set_time_description">Définissez l\'heure à laquelle les contacts et groupes sélectionnés verront votre position en temps réel.</string>
<string name="osmand_connect">OsmAnd connect</string> <string name="osmand_connect">OsmAnd connect</string>
<string name="time_ago">depuis</string> <string name="time_ago">il y a</string>
<string name="logcat_buffer">Buffer Logcat</string> <string name="logcat_buffer">Buffer Logcat</string>
<string name="logcat_buffer_descr">Vérifier et partager les logs détaillés de l\'application</string> <string name="logcat_buffer_descr">Vérifier et partager les logs détaillés de l\'application</string>
<string name="shared_string_export">Exporter</string> <string name="shared_string_export">Exporter</string>

View file

@ -2,12 +2,12 @@
<resources> <resources>
<string name="timeline_no_data">Sem dados</string> <string name="timeline_no_data">Sem dados</string>
<string name="shared_string_select">Selecionar</string> <string name="shared_string_select">Selecionar</string>
<string name="min_logging_distance">Distância mínima de registro</string> <string name="min_logging_distance">Distância mínima de registo</string>
<string name="min_logging_distance_descr">Filtro: distância mínima para registrar um novo ponto</string> <string name="min_logging_distance_descr">Filtro: distância mínima para registar um novo ponto</string>
<string name="min_logging_accuracy">Precisão mínima de registro</string> <string name="min_logging_accuracy">Precisão mínima de registo</string>
<string name="min_logging_accuracy_descr">Filtro: sem registro, a menos que a precisão seja atingida</string> <string name="min_logging_accuracy_descr">Filtro: sem registo, a não ser que seja atingida a precisão</string>
<string name="min_logging_speed">Velocidade mínima de registro</string> <string name="min_logging_speed">Velocidade mínima de registo</string>
<string name="min_logging_speed_descr">Filtro: sem registro abaixo da velocidade selecionada</string> <string name="min_logging_speed_descr">Filtro: sem registo abaixo da velocidade selecionada</string>
<string name="proxy_password">Palavra-passe</string> <string name="proxy_password">Palavra-passe</string>
<string name="proxy_username">Nome de utilizador</string> <string name="proxy_username">Nome de utilizador</string>
<string name="shared_string_enable">Ativar</string> <string name="shared_string_enable">Ativar</string>
@ -16,7 +16,7 @@
<string name="altitude">Altitude</string> <string name="altitude">Altitude</string>
<string name="shared_string_search">Pesquisar</string> <string name="shared_string_search">Pesquisar</string>
<string name="shared_string_ok">Ok</string> <string name="shared_string_ok">Ok</string>
<string name="app_name_short">Rastreador OsmAnd</string> <string name="app_name_short">OsmAnd Tracker</string>
<string name="shared_string_telegram">Telegram</string> <string name="shared_string_telegram">Telegram</string>
<string name="shared_string_appearance">Aparência</string> <string name="shared_string_appearance">Aparência</string>
<string name="shared_string_update">Atualizar</string> <string name="shared_string_update">Atualizar</string>
@ -35,13 +35,13 @@
<string name="shared_string_end">Fim</string> <string name="shared_string_end">Fim</string>
<string name="shared_string_start">Iniciar</string> <string name="shared_string_start">Iniciar</string>
<string name="shared_string_apply">Aplicar</string> <string name="shared_string_apply">Aplicar</string>
<string name="set_time_timeline_descr">Selecionar a hora para exibir</string> <string name="set_time_timeline_descr">Selecionar a hora de visualização</string>
<string name="start_end_date">Data de início - fim</string> <string name="start_end_date">Data de início - fim</string>
<string name="timeline_no_data_descr">Não coletamos dados para o dia selecionado</string> <string name="timeline_no_data_descr">Não temos dados recolhidos para o dia selecionado</string>
<string name="gpx_settings">Configurações de GPX</string> <string name="gpx_settings">Configurações de GPX</string>
<string name="proxy_key">Chave</string> <string name="proxy_key">Chave</string>
<string name="proxy_credentials">Credenciais</string> <string name="proxy_credentials">Credenciais</string>
<string name="proxy_port">Port</string> <string name="proxy_port">Porta</string>
<string name="proxy_server">Servidor</string> <string name="proxy_server">Servidor</string>
<string name="shared_string_connection">Conexão</string> <string name="shared_string_connection">Conexão</string>
<string name="proxy_type">Tipo de proxy</string> <string name="proxy_type">Tipo de proxy</string>
@ -50,16 +50,16 @@
<string name="proxy_settings">Configurações de proxy</string> <string name="proxy_settings">Configurações de proxy</string>
<string name="proxy">Proxy</string> <string name="proxy">Proxy</string>
<string name="precision">Precisão</string> <string name="precision">Precisão</string>
<string name="bearing">Rolamento</string> <string name="bearing">Rumo</string>
<string name="search_contacts">Pesquisar contatos</string> <string name="search_contacts">Pesquisar contactos</string>
<string name="search_contacts_descr">Pesquise em todos os seus grupos e contatos.</string> <string name="search_contacts_descr">Pesquise em todos os seus grupos e contactos.</string>
<string name="type_contact_or_group_name">Digite o nome do contato ou do grupo</string> <string name="type_contact_or_group_name">Digite o nome do contacto ou do grupo</string>
<string name="timeline_available_for_free_now">Linha do tempo é um recurso disponível agora gratuitamente.</string> <string name="timeline_available_for_free_now">Linha do tempo é um recurso disponível agora gratuitamente.</string>
<string name="disable_monitoring">Desativar monitoramento</string> <string name="disable_monitoring">Desativar monitorização</string>
<string name="location_recording_enabled">Gravação de localização ativada</string> <string name="location_recording_enabled">Gravação de localização ativada</string>
<string name="timeline_description">Ative o monitoramento para gravar todos os locais no histórico.</string> <string name="timeline_description">Ative a monitorização para gravar todos os locais no histórico.</string>
<string name="privacy_policy_use_telegram">Telegram (a app de mensagens) é usado para conectar e comunicar com as pessoas.</string> <string name="privacy_policy_use_telegram">O Telegram (a aplicação de mensagens) é usado para conectar e comunicar com outras pessoas.</string>
<string name="privacy_policy_telegram_client">OsmAnd tracker é um dos clientes que usam a Plataforma aberta do Telegram . Seus contatos podem usar qualquer outro cliente Telegram.</string> <string name="privacy_policy_telegram_client">OsmAnd Tracker é um dos clientes que usam a Plataforma aberta do Telegram. Os seus contactos podem usar qualquer outro cliente Telegram.</string>
<string name="privacy_policy_agree">Ao clicar em \"Continuar\" concorda com as condições da política de privacidade do Telegram e OsmAnd.</string> <string name="privacy_policy_agree">Ao clicar em \"Continuar\" concorda com as condições da política de privacidade do Telegram e OsmAnd.</string>
<string name="shared_string_accept">Aceitar</string> <string name="shared_string_accept">Aceitar</string>
<string name="telegram_privacy_policy">Política de privacidade do Telegram</string> <string name="telegram_privacy_policy">Política de privacidade do Telegram</string>
@ -67,68 +67,68 @@
<string name="how_it_works">Como funciona</string> <string name="how_it_works">Como funciona</string>
<string name="received_gps_points">Pontos GPX recebidos: %1$s</string> <string name="received_gps_points">Pontos GPX recebidos: %1$s</string>
<string name="show_gps_points">Mostrar pontos de GPS</string> <string name="show_gps_points">Mostrar pontos de GPS</string>
<string name="show_gps_points_descr">Mostrar quantidade de pontos de GPS coletados e enviados.</string> <string name="show_gps_points_descr">Mostrar quantidade de pontos de GPS recolhidos e enviados.</string>
<string name="please_update_osmand">Por favor, atualize o OsmAnd para ver os dados no mapa</string> <string name="please_update_osmand">Por favor, atualize o OsmAnd para ver os dados no mapa</string>
<string name="gps_points_in_buffer">enviado (%1$d em buffer)</string> <string name="gps_points_in_buffer">enviado (%1$d em buffer)</string>
<string name="points_size">%1$d pontos</string> <string name="points_size">%1$d pontos</string>
<string name="shared_string_collected">Coletado</string> <string name="shared_string_collected">Recolhidos</string>
<string name="gps_points">Pontos de GPS</string> <string name="gps_points">Pontos de GPS</string>
<string name="shared_string_sent">Enviado</string> <string name="shared_string_sent">Enviado</string>
<string name="monitoring_is_enabled">Monitoramento está ativado</string> <string name="monitoring_is_enabled">A monitorização está ativada</string>
<string name="monitoring_is_disabled">Monitoramento está desativado</string> <string name="monitoring_is_disabled">A monitorização está desativada</string>
<string name="open_in_osmand">Mostrar no OsmAnd</string> <string name="open_in_osmand">Mostrar no OsmAnd</string>
<string name="end_date">Data final</string> <string name="end_date">Data de fim</string>
<string name="send_location_as">Enviar localização como</string> <string name="send_location_as">Enviar localização como</string>
<string name="send_location_as_descr">Escolha como as mensagens com sua localização serão exibidas.</string> <string name="send_location_as_descr">Escolha a forma como as mensagens com a sua localização serão mostradas.</string>
<string name="map_and_text">Mapa e texto</string> <string name="map_and_text">Mapa e texto</string>
<string name="last_update_from_telegram">Última atualização do Telegram</string> <string name="last_update_from_telegram">Última atualização do Telegram</string>
<string name="enter_another_device_name">Escolha um nome que ainda não usou</string> <string name="enter_another_device_name">Escolha um nome que ainda não usou</string>
<string name="device_added_successfully">%1$s adicionado.</string> <string name="device_added_successfully">%1$s adicionado.</string>
<string name="error_adding_new_device">Não foi possível adicionar novo aparelho</string> <string name="error_adding_new_device">Não foi possível adicionar o novo dispositivo</string>
<string name="enter_device_name_description">Nomeie seu novo aparelho no máximo 200 símbolos.</string> <string name="enter_device_name_description">Atribua um nome a seu novo dispositivo com o máximo de 200 caracteres.</string>
<string name="device_name_is_too_long">Nome do aparelho muito longo</string> <string name="device_name_is_too_long">Nome do dispositivo muito longo</string>
<string name="device_name_cannot_be_empty">O nome do aparelho não pode estar vazio</string> <string name="device_name_cannot_be_empty">O nome do dispositivo não pode estar vazio</string>
<string name="device_name">Nome do aparelho</string> <string name="device_name">Nome do dispositivo</string>
<string name="share_location_as_description_second_line">Pode criar e visualizar o ID do aparelho no cliente de telegrama usando o bot de bate-papo %1$s. %2$s</string> <string name="share_location_as_description_second_line">Pode criar e visualizar o ID do dispositivo no cliente de Telegram usando o robô de bate-papo %1$s. %2$s</string>
<string name="share_location_as_description">Se deseja conectar vários aparelhos a uma conta de telegrama, é necessário usar um aparelho diferente para compartilhar a sua localização.</string> <string name="share_location_as_description">Se quer conectar vários dispositivos a uma conta no Telegram, é necessário usar um dispositivo diferente para partilhar a sua localização.</string>
<string name="last_updated_location">Última localização atualizada:</string> <string name="last_updated_location">Última localização atualizada:</string>
<string name="successfully_sent_and_updated">Enviado e atualizado com sucesso</string> <string name="successfully_sent_and_updated">Enviado e atualizado com sucesso</string>
<string name="not_possible_to_send_to_telegram_chats">Não é possível enviar para bate-papo do Telegram:</string> <string name="not_possible_to_send_to_telegram_chats">Não é possível enviar para bate-papo do Telegram:</string>
<string name="waiting_for_response_from_telegram">Aguardando resposta do Telegram</string> <string name="waiting_for_response_from_telegram">A aguardar a resposta do Telegram</string>
<string name="sending_location_messages">enviando localização</string> <string name="sending_location_messages">A enviar a localização</string>
<string name="initializing">Iniciando</string> <string name="initializing">A iniciar</string>
<string name="searching_for_gps">Posicionando</string> <string name="searching_for_gps">A posicionar</string>
<string name="connecting_to_the_internet">Conectando-se à Internet</string> <string name="connecting_to_the_internet">Conectando-se à Internet</string>
<string name="background_work_description">Altere as configurações de otimização da bateria para estabilizar o compartilhamento de local.</string> <string name="background_work_description">Altere as configurações de otimização da bateria para estabilizar a partilha da localização.</string>
<string name="background_work">Funcionamento em segundo plano</string> <string name="background_work">Funcionamento em segundo plano</string>
<string name="battery_optimization_description">Desative a otimização da bateria do OsmAnd Tracker para que ele não seja desligado repentinamente quando estiver em segundo plano.</string> <string name="battery_optimization_description">Desative a otimização da bateria do OsmAnd Tracker para que ele não seja desligado repentinamente quando estiver em segundo plano.</string>
<string name="sharing_in_background">Compartilhando em segundo plano</string> <string name="sharing_in_background">Partilha em segundo plano</string>
<string name="go_to_settings">Vá para as configurações</string> <string name="go_to_settings">Ir às configurações</string>
<string name="not_sent_yet">Ainda não enviado</string> <string name="not_sent_yet">Ainda não enviado</string>
<string name="not_found_yet">Ainda não encontrado</string> <string name="not_found_yet">Ainda não encontrado</string>
<string name="re_send_location">Reenvie o local</string> <string name="re_send_location">Reenvie o local</string>
<string name="last_available_location">Última localização disponível</string> <string name="last_available_location">Última localização disponível</string>
<string name="sharing_status">Estado de compartilhamento</string> <string name="sharing_status">Estado da partilha</string>
<string name="location_sharing_status">Compartilhamento: %1$s</string> <string name="location_sharing_status">Partilha: %1$s</string>
<string name="shared_string_enabled">Ativado</string> <string name="shared_string_enabled">Ativado</string>
<string name="no_gps_connection">Sem conexão GPS</string> <string name="no_gps_connection">Sem conexão GPS</string>
<string name="no_internet_connection">Sem conexão com a internet</string> <string name="no_internet_connection">Sem ligação à Internet</string>
<string name="shared_string_disable">Desativar</string> <string name="shared_string_disable">Desativar</string>
<string name="shared_string_save">Gravar</string> <string name="shared_string_save">Gravar</string>
<string name="add_device">Adicionar aparelho</string> <string name="add_device">Adicionar dispositivo</string>
<string name="share_location_as">Compartilhar localização como</string> <string name="share_location_as">Partilhar localização como</string>
<string name="live_now_description">Contatos e grupos compartilhando o local consigo.</string> <string name="live_now_description">Contactos e grupos partilhando a localização consigo.</string>
<string name="logout_from_osmand_telegram_descr">Tem certeza de que deseja sair do OsmAnd Tracker para que não possa compartilhar o local ou ver a localização de outras pessoas\?</string> <string name="logout_from_osmand_telegram_descr">Tem a certeza de que quer sair do OsmAnd Tracker para que não possa partilhar a localização ou ver a localização de outras pessoas\?</string>
<string name="logout_from_osmand_telegram">Sair do OsmAnd Tracker\?</string> <string name="logout_from_osmand_telegram">Sair do OsmAnd Tracker\?</string>
<string name="shared_string_name">Nome</string> <string name="shared_string_name">Nome</string>
<string name="by_distance">Pela distância</string> <string name="by_distance">Pela distância</string>
<string name="by_name">Por nome</string> <string name="by_name">Por nome</string>
<string name="by_group">Por grupo</string> <string name="by_group">Por grupo</string>
<string name="shared_string_sort">Ordenar</string> <string name="shared_string_sort">Ordenar</string>
<string name="choose_osmand_desc">Selecione a versão OsmAnd, onde os contatos serão exibidos no mapa.</string> <string name="choose_osmand_desc">Selecione a versão OsmAnd onde os contactos serão mostrados no mapa.</string>
<string name="choose_osmand">Selecione a versão do OsmAnd para usar</string> <string name="choose_osmand">Selecione a versão do OsmAnd para usar</string>
<string name="disable_all_sharing_desc">Desativa o compartilhamento de local para todos os bate-papos selecionados (%1$d).</string> <string name="disable_all_sharing_desc">Desativa a partilha da localização para todos os bate-papos selecionados (%1$d).</string>
<string name="disable_all_sharing">Desativar todo o compartilhamento</string> <string name="disable_all_sharing">Desativar todas as partilhas</string>
<string name="turn_off_all">Desligue todos</string> <string name="turn_off_all">Desligue todos</string>
<string name="shared_string_exit">Sair</string> <string name="shared_string_exit">Sair</string>
<string name="time_ago">atrás</string> <string name="time_ago">atrás</string>
@ -136,34 +136,34 @@
<string name="shared_string_group">Grupo</string> <string name="shared_string_group">Grupo</string>
<string name="logout_no_internet_msg">Conecte-se à Internet para efetuar a saída do Telegram corretamente.</string> <string name="logout_no_internet_msg">Conecte-se à Internet para efetuar a saída do Telegram corretamente.</string>
<string name="shared_string_close">Fechar</string> <string name="shared_string_close">Fechar</string>
<string name="disconnect_from_telegram_desc">Para revogar o acesso ao compartilhamento de local. Abra o Telegram, vá para Configurações → Privacidade e Segurança → Sessões e termine a sessão do OsmAnd Tracker.</string> <string name="disconnect_from_telegram_desc">Para revogar o acesso à partilha da localização. Abra o Telegram, vá para Configurações → Privacidade e Segurança → Sessões e termine a sessão do OsmAnd Tracker.</string>
<string name="disconnect_from_telegram">Como desativar o OsmAnd Tracker para Telegram</string> <string name="disconnect_from_telegram">Como desativar o OsmAnd Tracker para Telegram</string>
<string name="logout_help_desc">Como desativar o OsmAnd Tracker para Telegram</string> <string name="logout_help_desc">Como desativar o OsmAnd Tracker para Telegram</string>
<string name="connected_account">Conta conectada</string> <string name="connected_account">Conta conectada</string>
<string name="shared_string_account">Conta</string> <string name="shared_string_account">Conta</string>
<string name="in_time">no %1$s</string> <string name="in_time">no %1$s</string>
<string name="osmand_connect_desc">Escolha a versão OsmAnd que OsmAnd Tracker usa para exibir posições.</string> <string name="osmand_connect_desc">Escolha a versão OsmAnd que OsmAnd Tracker usa para mostrar posições.</string>
<string name="osmand_connect">Conectar OsmAnd</string> <string name="osmand_connect">Conectar OsmAnd</string>
<string name="location_history_desc">Ocultar contactos que não foram movidos num determinado momento.</string> <string name="location_history_desc">Ocultar contactos que não foram movidos num determinado momento.</string>
<string name="location_history">Histórico de localização</string> <string name="location_history">Histórico de localização</string>
<string name="stale_location_desc">A última vez que um contato foi movido.</string> <string name="stale_location_desc">A última vez que um contacto foi movido.</string>
<string name="stale_location">Parado</string> <string name="stale_location">Parado</string>
<string name="send_my_location_desc">Defina o intervalo mínimo para o compartilhamento de local.</string> <string name="send_my_location_desc">Defina o intervalo mínimo para a partilha da localização.</string>
<string name="send_my_location">Enviar minha localização</string> <string name="send_my_location">Enviar a minha localização</string>
<string name="gps_and_location">Posição</string> <string name="gps_and_location">Posição</string>
<string name="sharing_time">Tempo de compartilhamento</string> <string name="sharing_time">Tempo de partilha</string>
<string name="expire_at">Expira</string> <string name="expire_at">Expira</string>
<string name="stop_sharing_all">O compartilhamento está ativado (desativado)</string> <string name="stop_sharing_all">A partilha está ativada (desativar)</string>
<string name="turn_off_location_sharing">Desativar o compartilhamento de local</string> <string name="turn_off_location_sharing">Desativar a partilha da localização</string>
<string name="open_osmand">Abrir OsmAnd</string> <string name="open_osmand">Abrir OsmAnd</string>
<string name="shared_string_live">Vivo</string> <string name="shared_string_live">Tempo real</string>
<string name="shared_string_bot">Robô</string> <string name="shared_string_bot">Robô</string>
<string name="get_telegram_title">Registro no Telegram</string> <string name="get_telegram_title">Registo no Telegram</string>
<string name="get_telegram_account_first">Precisa de uma conta do Telegram para usar o compartilhamento de local.</string> <string name="get_telegram_account_first">Precisa de uma conta do Telegram para usar a partilha de localização.</string>
<string name="get_telegram_description_continue">Por favor, instale o Telegram e configure uma conta.</string> <string name="get_telegram_description_continue">Por favor, instale o Telegram e configure uma conta.</string>
<string name="get_telegram_after_creating_account">Então pode usar esta app.</string> <string name="get_telegram_after_creating_account">Depois pode usar esta aplicação.</string>
<string name="shared_string_all">Todos</string> <string name="shared_string_all">Tudo</string>
<string name="shared_string_off">Desligado</string> <string name="shared_string_off">Desativado</string>
<string name="already_registered_in_telegram">Precisa de uma conta e número de telefone registados no Telegram</string> <string name="already_registered_in_telegram">Precisa de uma conta e número de telefone registados no Telegram</string>
<string name="do_not_have_telegram">Não tenho uma conta do Telegram</string> <string name="do_not_have_telegram">Não tenho uma conta do Telegram</string>
<string name="enter_phone_number">Digite o número de telefone</string> <string name="enter_phone_number">Digite o número de telefone</string>
@ -173,42 +173,42 @@
<string name="minutes_format">%1$d m</string> <string name="minutes_format">%1$d m</string>
<string name="hours_format">%1$d h</string> <string name="hours_format">%1$d h</string>
<string name="shared_string_install">Instalar</string> <string name="shared_string_install">Instalar</string>
<string name="shared_string_share">Compartilhar</string> <string name="shared_string_share">Partilhar</string>
<string name="shared_string_back">Voltar</string> <string name="shared_string_back">Voltar</string>
<string name="visible_time_for_all">Hora visível para todos</string> <string name="visible_time_for_all">Hora visível para todos</string>
<string name="set_time_description">Defina a hora em que seus contatos e grupos selecionados verão sua localização em tempo real.</string> <string name="set_time_description">Defina a hora em que os seus contactos e grupos selecionados verão a sua localização em tempo real.</string>
<string name="set_time">Definir tempo</string> <string name="set_time">Definir hora</string>
<string name="location_sharing_description">Selecione os contactos e grupos com os quais deseja compartilhar sua localização.</string> <string name="location_sharing_description">Selecione os contactos e grupos com os quais deseja partilhar a sua localização.</string>
<string name="my_location_search_hint">Pesquisa: Grupo ou contato</string> <string name="my_location_search_hint">Pesquisa: grupo ou contacto</string>
<string name="start_location_sharing">Compartilhar localização</string> <string name="start_location_sharing">Partilhar localização</string>
<string name="show_on_map">Mostrar no mapa</string> <string name="show_on_map">Mostrar no mapa</string>
<string name="app_name">OsmAnd Online GPS Tracker</string> <string name="app_name">OsmAnd Online GPS Tracker</string>
<string name="phone_number_title">Número de telefone</string> <string name="phone_number_title">Número de telefone</string>
<string name="phone_number_descr">Número de telefone no formato internacional</string> <string name="phone_number_descr">Número de telefone no formato internacional</string>
<string name="shared_string_password">Palavra-passe</string> <string name="shared_string_password">Palavra-passe</string>
<string name="enter_code">Digite o código</string> <string name="enter_code">Digite o código</string>
<string name="authentication_code">Código de Autenticação</string> <string name="authentication_code">Código de autenticação</string>
<string name="authentication_code_descr">Uma faixa GPX é salva automaticamente durante a navegação.</string> <string name="authentication_code_descr">O Telegram enviou-lhe um código para o OsmAnd para iniciar sessão na sua conta.</string>
<string name="enter_password">Digite a palavra-passe</string> <string name="enter_password">Digite a palavra-passe</string>
<string name="password_descr">Palavra-passe do telegrama</string> <string name="password_descr">Palavra-passe do Telegram</string>
<string name="shared_string_login">Entrar</string> <string name="shared_string_login">Entrar</string>
<string name="shared_string_logout">Sair</string> <string name="shared_string_logout">Sair</string>
<string name="initialization">Iniciando</string> <string name="initialization">A iniciar</string>
<string name="logging_out">Saindo</string> <string name="logging_out">A terminar sessão</string>
<string name="closing">Fechando</string> <string name="closing">A fechar</string>
<string name="gps_network_not_enabled">Ativar \"Localização\"\?</string> <string name="gps_network_not_enabled">Ativar \"Localização\"\?</string>
<string name="not_logged_in">você não está logado no</string> <string name="not_logged_in">Não tem a sessão iniciada</string>
<string name="shared_string_continue">Continuar</string> <string name="shared_string_continue">Continuar</string>
<string name="shared_string_cancel">Cancelar</string> <string name="shared_string_cancel">Cancelar</string>
<string name="shared_string_settings">Configurações</string> <string name="shared_string_settings">Configurações</string>
<string name="no_location_permission">A app não tem permissão para acessar os dados de localização.</string> <string name="no_location_permission">A aplicação não tem permissão para aceder aos dados de localização.</string>
<string name="gps_not_available">Por favor, ligue \"Localização\" nas configurações do sistema</string> <string name="gps_not_available">Por favor, ative a \"Localização\" nas configurações do sistema</string>
<string name="location_service_no_gps_available">Selecione um dos provedores de localização para compartilhar sua localização.</string> <string name="location_service_no_gps_available">Selecione um dos fornecedores de localização para partilhar a sua localização.</string>
<string name="osmand_service">Modo em segundo plano</string> <string name="osmand_service">Modo em segundo plano</string>
<string name="osmand_service_descr">OsmAnd Tracker é executado em segundo plano com o ecrã desligado.</string> <string name="osmand_service_descr">O OsmAnd Tracker é executado em segundo plano com o ecrã desligado.</string>
<string name="shared_string_distance">Distância</string> <string name="shared_string_distance">Distância</string>
<string name="share_location">Compartilhar localização</string> <string name="share_location">Partilhar localização</string>
<string name="sharing_location">Compartilhando localização</string> <string name="sharing_location">A partilhar a localização</string>
<string name="process_service">Serviço OsmAnd Tracker</string> <string name="process_service">Serviço OsmAnd Tracker</string>
<string name="osmand_logo">Logotipo do OsmAnd</string> <string name="osmand_logo">Logotipo do OsmAnd</string>
<string name="install_osmand_dialog_message">Precisa instalar a versão gratuita ou paga do OsmAnd primeiro</string> <string name="install_osmand_dialog_message">Precisa instalar a versão gratuita ou paga do OsmAnd primeiro</string>
@ -235,7 +235,7 @@
<string name="si_m_s">Metros por segundo</string> <string name="si_m_s">Metros por segundo</string>
<string name="si_min_km">Minutos por quilómetro</string> <string name="si_min_km">Minutos por quilómetro</string>
<string name="si_min_m">Minutos por milha</string> <string name="si_min_m">Minutos por milha</string>
<string name="si_nm_h">Milhas náuticas por hora (nó)</string> <string name="si_nm_h">Milhas náuticas por hora (nós)</string>
<string name="si_mi_feet">Milhas/pés</string> <string name="si_mi_feet">Milhas/pés</string>
<string name="si_mi_yard">Milhas/jardas</string> <string name="si_mi_yard">Milhas/jardas</string>
<string name="si_km_m">Quilómetros/metros</string> <string name="si_km_m">Quilómetros/metros</string>
@ -244,8 +244,8 @@
<string name="shared_string_hour_short">h</string> <string name="shared_string_hour_short">h</string>
<string name="shared_string_minute_short">min</string> <string name="shared_string_minute_short">min</string>
<string name="shared_string_second_short">seg</string> <string name="shared_string_second_short">seg</string>
<string name="welcome_descr"><b>OsmAnd Tracker</b> permite que partilhe a sua localização e veja a dos outros no OsmAnd.<br/> <br/>O app usa a API Telegram e precisa de uma conta do Telegram.</string> <string name="welcome_descr"><b>OsmAnd Tracker</b> permite que partilhe a sua localização e veja a dos outros no OsmAnd.<br/> <br/>A aplicação usa a API do Telegram e é necessário ter uma conta no Telegram.</string>
<string name="my_location">Minha localização</string> <string name="my_location">A minha posição</string>
<string name="live_now">Ao vivo agora</string> <string name="live_now">Ao vivo agora</string>
<string name="timeline">Cronologia</string> <string name="timeline">Cronologia</string>
<string name="saved_messages">Mensagens gravadas</string> <string name="saved_messages">Mensagens gravadas</string>
@ -259,7 +259,7 @@
<string name="buffer_time_descr">Tempo máximo para armazenar pontos no buffer</string> <string name="buffer_time_descr">Tempo máximo para armazenar pontos no buffer</string>
<string name="buffer_time">Tempo de expiração do buffer</string> <string name="buffer_time">Tempo de expiração do buffer</string>
<string name="shared_string_suggested">Sugerido</string> <string name="shared_string_suggested">Sugerido</string>
<string name="status_widget_title">Estado do Rastreador de OsmAnd</string> <string name="status_widget_title">Estado do OsmAnd Tracker</string>
<string name="back_to_osmand">Voltar para OsmAnd</string> <string name="back_to_osmand">Voltar para OsmAnd</string>
<string name="duration_ago">%1$s atrás</string> <string name="duration_ago">%1$s atrás</string>
<string name="last_response_duration">Última resposta: %1$s atrás</string> <string name="last_response_duration">Última resposta: %1$s atrás</string>

View file

@ -1026,6 +1026,7 @@
</activity> </activity>
<activity android:name="net.osmand.plus.development.TestVoiceActivity" /> <activity android:name="net.osmand.plus.development.TestVoiceActivity" />
<activity android:name="net.osmand.plus.development.TestBackupActivity" />
<activity android:name="net.osmand.plus.development.LogcatActivity" /> <activity android:name="net.osmand.plus.development.LogcatActivity" />
<activity android:name="net.osmand.plus.download.DownloadActivity" android:label="" /> <activity android:name="net.osmand.plus.download.DownloadActivity" android:label="" />

View file

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/activity_background_basic"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="?attr/toolbar_theme">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding">
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="@dimen/card_button_progress_size"
android:layout_height="@dimen/card_button_progress_size"
android:visibility="gone" />
</LinearLayout>
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/content_padding"
android:orientation="vertical"
android:paddingBottom="@dimen/content_padding">
<net.osmand.plus.widgets.OsmandTextFieldBoxes
android:id="@+id/edit_email_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
android:paddingBottom="@dimen/content_padding_small"
app:errorColor="@color/color_invalid"
app:hasClearButton="true"
app:labelText="Email"
app:primaryColor="@color/active_color_primary_dark"
app:secondaryColor="?android:textColorSecondary">
<studio.carbonylgroup.textfieldboxes.ExtendedEditText
android:id="@+id/edit_email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="actionNext"
android:inputType="textEmailAddress"
android:maxLines="1"
tools:text="test@test.com" />
</net.osmand.plus.widgets.OsmandTextFieldBoxes>
<include
android:id="@+id/btn_register"
layout="@layout/bottom_sheet_dialog_button"
android:layout_width="match_parent"
android:layout_height="@dimen/dialog_button_height" />
<net.osmand.plus.widgets.OsmandTextFieldBoxes
android:id="@+id/edit_token_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
android:paddingTop="@dimen/content_padding_small"
android:paddingBottom="@dimen/content_padding_small"
app:errorColor="@color/color_invalid"
app:hasClearButton="true"
app:labelText="Token"
app:primaryColor="@color/active_color_primary_dark"
app:secondaryColor="?android:textColorSecondary">
<studio.carbonylgroup.textfieldboxes.ExtendedEditText
android:id="@+id/edit_token"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="actionNext"
android:inputType="numberDecimal"
android:maxLines="1"
tools:text="123456" />
</net.osmand.plus.widgets.OsmandTextFieldBoxes>
<include
android:id="@+id/btn_verify"
layout="@layout/bottom_sheet_dialog_button"
android:layout_width="match_parent"
android:layout_height="@dimen/dialog_button_height" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/content_padding"
android:text="Actions"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size" />
<include
android:id="@+id/btn_backup"
layout="@layout/bottom_sheet_dialog_button"
android:layout_width="match_parent"
android:layout_height="@dimen/dialog_button_height"
android:layout_marginTop="@dimen/content_padding_half" />
<include
android:id="@+id/btn_restore"
layout="@layout/bottom_sheet_dialog_button"
android:layout_width="match_parent"
android:layout_height="@dimen/dialog_button_height"
android:layout_marginTop="@dimen/content_padding_half" />
<TextView
android:id="@+id/text_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/content_padding"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
tools:text="Last backup time: 2021-04-01 10:10:00\nModified files: 3" />
</LinearLayout>
</ScrollView>
</LinearLayout>

View file

@ -998,7 +998,7 @@
<string name="get_directions">التوجيه مع الطرق</string> <string name="get_directions">التوجيه مع الطرق</string>
<string name="show_point_options">استخدام الموقع…</string> <string name="show_point_options">استخدام الموقع…</string>
<string name="favorite">مفضلة</string> <string name="favorite">مفضلة</string>
<string name="speak_favorites">نقاط مفضلة مجاورة</string> <string name="speak_favorites">مفضلة مجاورة</string>
<string name="save_as_favorites_points">حفظ كمجموعة مفضلة</string> <string name="save_as_favorites_points">حفظ كمجموعة مفضلة</string>
<string name="add_favorite_dialog_top_text">أدخل اسم المفضلة</string> <string name="add_favorite_dialog_top_text">أدخل اسم المفضلة</string>
<string name="add_favorite_dialog_favourite_added_template">تم إضافة إحداثية المفضلة \'\'{0}\'\' بنجاح.</string> <string name="add_favorite_dialog_favourite_added_template">تم إضافة إحداثية المفضلة \'\'{0}\'\' بنجاح.</string>
@ -4075,7 +4075,7 @@
<string name="activity_type_car_name">سيارة</string> <string name="activity_type_car_name">سيارة</string>
<string name="copy_poi_name">نسخ اسم POI</string> <string name="copy_poi_name">نسخ اسم POI</string>
<string name="select_another_colorization">الرجاء اختيار أنواع أخرى من التلوين.</string> <string name="select_another_colorization">الرجاء اختيار أنواع أخرى من التلوين.</string>
<string name="snap_to_road_descr">سيتم التقاط الرمز إلى مسار التنقل الحالي</string> <string name="snap_to_road_descr">سيتم القاط أيقونة المكان الحالي إلى مسار التنقل الحالي</string>
<string name="select_segments">حدد الجزء</string> <string name="select_segments">حدد الجزء</string>
<string name="select_segments_description">%1$s يحتوي على أكثر من مقطع ، تحتاج إلى تحديد الجزء المطلوب للتنقل.</string> <string name="select_segments_description">%1$s يحتوي على أكثر من مقطع ، تحتاج إلى تحديد الجزء المطلوب للتنقل.</string>
<string name="segments_count">الجزء %1$d</string> <string name="segments_count">الجزء %1$d</string>
@ -4094,7 +4094,7 @@
<string name="on_pause">عند الإيقاف المؤقت</string> <string name="on_pause">عند الإيقاف المؤقت</string>
<string name="app_restart_required">يلزم إعادة تشغيل التطبيق لتطبيق بعض الإعدادات.</string> <string name="app_restart_required">يلزم إعادة تشغيل التطبيق لتطبيق بعض الإعدادات.</string>
<string name="routing_attr_height_obstacles_description">التوجيه يمكن أن يتجنب المرتفعات القوية.</string> <string name="routing_attr_height_obstacles_description">التوجيه يمكن أن يتجنب المرتفعات القوية.</string>
<string name="quick_action_coordinates_widget_descr">تبديل لإظهار أو إخفاء أداة الإحداثيات على الخريطة.</string> <string name="quick_action_coordinates_widget_descr">مقبس لإظهار أو إخفاء أداة الإحداثيات على الخريطة.</string>
<string name="map_widget_distance_by_tap">المسافة عن طريق الضغط</string> <string name="map_widget_distance_by_tap">المسافة عن طريق الضغط</string>
<string name="latest_openstreetmap_update">آخر تحديث خريطة الشارع المفتوح المتاحة:</string> <string name="latest_openstreetmap_update">آخر تحديث خريطة الشارع المفتوح المتاحة:</string>
<string name="updated">تحديث: %s</string> <string name="updated">تحديث: %s</string>
@ -4153,6 +4153,5 @@
<string name="exit_number">رقم الخروج</string> <string name="exit_number">رقم الخروج</string>
<string name="announce_when_exceeded">الإعلان عند التجاوز</string> <string name="announce_when_exceeded">الإعلان عند التجاوز</string>
<string name="user_points">نقاط المستخدم</string> <string name="user_points">نقاط المستخدم</string>
<string name="output">المخرج</string> <string name="output">الإخراج</string>
<string name="map_quick_action_pattern">%1$s ← …</string>
</resources> </resources>

View file

@ -4089,5 +4089,4 @@
<string name="announce_when_exceeded">Meldung bei Überschreitung</string> <string name="announce_when_exceeded">Meldung bei Überschreitung</string>
<string name="user_points">Anwenderpunkte</string> <string name="user_points">Anwenderpunkte</string>
<string name="output">Leistung</string> <string name="output">Leistung</string>
<string name="map_quick_action_pattern">%1$s → …</string>
</resources> </resources>

View file

@ -1526,7 +1526,7 @@
<string name="error_doing_search">Okazis eraro dum malkonekta serĉado.</string> <string name="error_doing_search">Okazis eraro dum malkonekta serĉado.</string>
<string name="search_osm_offline">Serĉi per pozici-trova servo</string> <string name="search_osm_offline">Serĉi per pozici-trova servo</string>
<string name="preferred_locale_descr">Elekti lingvon de fasado (post ŝanĝi necesas restarti la aplikaĵon).</string> <string name="preferred_locale_descr">Elekti lingvon de fasado (post ŝanĝi necesas restarti la aplikaĵon).</string>
<string name="unit_of_length">Unuoj de longo</string> <string name="unit_of_length">Mezurunuoj de longo</string>
<string name="unit_of_length_descr">Ŝanĝi unuojn por reprezenti distancoj.</string> <string name="unit_of_length_descr">Ŝanĝi unuojn por reprezenti distancoj.</string>
<string name="si_mi_feet">Mejloj/futoj</string> <string name="si_mi_feet">Mejloj/futoj</string>
<string name="si_mi_yard">Mejloj/jardoj</string> <string name="si_mi_yard">Mejloj/jardoj</string>
@ -3137,7 +3137,7 @@
<string name="turn_screen_on_info">Montri mapon sur la ŝlosekrano dum navigado.</string> <string name="turn_screen_on_info">Montri mapon sur la ŝlosekrano dum navigado.</string>
<string name="route_parameters_info">Agordoj pri kursdifinado por la elektita profilo: “%1$s”.</string> <string name="route_parameters_info">Agordoj pri kursdifinado por la elektita profilo: “%1$s”.</string>
<string name="wake_time">Aktiveca periodo de ekrano</string> <string name="wake_time">Aktiveca periodo de ekrano</string>
<string name="units_and_formats">Unuoj kaj formoj</string> <string name="units_and_formats">Mezurunuoj &amp; formoj</string>
<string name="map_look_descr">Alĝustigi mapon</string> <string name="map_look_descr">Alĝustigi mapon</string>
<string name="map_look">Mapaspekto</string> <string name="map_look">Mapaspekto</string>
<string name="list_of_installed_plugins">Instalitaj kromprogramoj</string> <string name="list_of_installed_plugins">Instalitaj kromprogramoj</string>
@ -4085,5 +4085,4 @@
<string name="exit_number">Numero de elirejo</string> <string name="exit_number">Numero de elirejo</string>
<string name="user_points">Poentoj de uzanto</string> <string name="user_points">Poentoj de uzanto</string>
<string name="output">Eligo</string> <string name="output">Eligo</string>
<string name="map_quick_action_pattern">%1$s → …</string>
</resources> </resources>

View file

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

View file

@ -4087,5 +4087,4 @@
<string name="announce_when_exceeded">Anunciar al excederse</string> <string name="announce_when_exceeded">Anunciar al excederse</string>
<string name="user_points">Puntos de usuario</string> <string name="user_points">Puntos de usuario</string>
<string name="output">Salida</string> <string name="output">Salida</string>
<string name="map_quick_action_pattern">%1$s → …</string>
</resources> </resources>

View file

@ -1294,7 +1294,7 @@
<string name="download_additional_maps">¿Descargar los %1$s mapas que faltan (%2$d MB)?</string> <string name="download_additional_maps">¿Descargar los %1$s mapas que faltan (%2$d MB)?</string>
<string name="shared_string_waypoints">Puntos de referencia</string> <string name="shared_string_waypoints">Puntos de referencia</string>
<string name="way_alarms">Advertencias de tráfico</string> <string name="way_alarms">Advertencias de tráfico</string>
<string name="speak_favorites">Favoritos cerca</string> <string name="speak_favorites">Favoritos cercanos</string>
<string name="speak_poi">PDI cercanos</string> <string name="speak_poi">PDI cercanos</string>
<string name="shared_string_all">Todos</string> <string name="shared_string_all">Todos</string>
<string name="index_tours">Excursiones</string> <string name="index_tours">Excursiones</string>
@ -1988,7 +1988,7 @@
<string name="update_all_maps_now">¿Actualizar todos los mapas ahora?</string> <string name="update_all_maps_now">¿Actualizar todos los mapas ahora?</string>
<string name="clear_tile_data">Limpiar todas las teselas</string> <string name="clear_tile_data">Limpiar todas las teselas</string>
<string name="routing_attr_short_way_name">Ruta de bajo consumo (corta)</string> <string name="routing_attr_short_way_name">Ruta de bajo consumo (corta)</string>
<string name="replace_favorite_confirmation">¿Reemplazar el Favorito «%1$s»?</string> <string name="replace_favorite_confirmation">¿Seguro que quieres reemplazar el favorito «%1$s»\?</string>
<string name="rendering_attr_hideOverground_name">Objetos en superficie</string> <string name="rendering_attr_hideOverground_name">Objetos en superficie</string>
<string name="shared_string_change">Cambiar</string> <string name="shared_string_change">Cambiar</string>
<string name="get_started">Empezar</string> <string name="get_started">Empezar</string>
@ -2000,12 +2000,12 @@
<string name="location_not_found">Ubicación no encontrada</string> <string name="location_not_found">Ubicación no encontrada</string>
<string name="no_inet_connection">Sin conexión a Internet</string> <string name="no_inet_connection">Sin conexión a Internet</string>
<string name="no_inet_connection_desc_map">Necesario para descargar mapas.</string> <string name="no_inet_connection_desc_map">Necesario para descargar mapas.</string>
<string name="search_location">Buscando la ubicación…</string> <string name="search_location">Buscando ubicación…</string>
<string name="storage_free_space">Espacio libre</string> <string name="storage_free_space">Espacio libre</string>
<string name="storage_place_description">Almacenamiento de datos de OsmAnd (para mapas, trazas, etc.): %1$s.</string> <string name="storage_place_description">Almacenamiento de datos de OsmAnd (para mapas, trazas, etc.): %1$s.</string>
<string name="give_permission">Conceder permiso</string> <string name="give_permission">Conceder permiso</string>
<string name="allow_access_location">Permitir el acceso a la ubicación</string> <string name="allow_access_location">Permitir el acceso a la ubicación</string>
<string name="first_usage_greeting">Obtén direcciones y descubre sitios nuevos sin una conexión a Internet</string> <string name="first_usage_greeting">Obtén indicaciones y descubre lugares nuevos sin conexión a Internet</string>
<string name="search_my_location">Encontrar mi ubicación</string> <string name="search_my_location">Encontrar mi ubicación</string>
<string name="osm_live_payment_desc">La suscripción se cobra por el período elegido. Puedes cancelarlo en cualquier momento en Google Play.</string> <string name="osm_live_payment_desc">La suscripción se cobra por el período elegido. Puedes cancelarlo en cualquier momento en Google Play.</string>
<string name="donation_to_osm">Donaciones a la comunidad de OSM</string> <string name="donation_to_osm">Donaciones a la comunidad de OSM</string>
@ -2066,7 +2066,7 @@
<string name="save_filter">Guardar filtro</string> <string name="save_filter">Guardar filtro</string>
<string name="delete_filter">Borrar filtro</string> <string name="delete_filter">Borrar filtro</string>
<string name="new_filter">Nuevo filtro</string> <string name="new_filter">Nuevo filtro</string>
<string name="new_filter_desc">Ingresa el nombre del nuevo filtro, que se añadirá en tu pestaña «Categorías».</string> <string name="new_filter_desc">Escribe el nombre del nuevo filtro, que se añadirá en tu pestaña «Categorías».</string>
<string name="rendering_value_fine_name">Muy fino</string> <string name="rendering_value_fine_name">Muy fino</string>
<string name="lang_sr_latn">Serbio (latino)</string> <string name="lang_sr_latn">Serbio (latino)</string>
<string name="lang_zh_hk">Chino (Hong Kong)</string> <string name="lang_zh_hk">Chino (Hong Kong)</string>
@ -2385,12 +2385,12 @@
<string name="restart_search">Reiniciar búsqueda</string> <string name="restart_search">Reiniciar búsqueda</string>
<string name="increase_search_radius">Aumentar radio de búsqueda</string> <string name="increase_search_radius">Aumentar radio de búsqueda</string>
<string name="nothing_found">Nada encontrado</string> <string name="nothing_found">Nada encontrado</string>
<string name="nothing_found_descr">Cambiar la búsqueda o aumentar su radio.</string> <string name="nothing_found_descr">Cambia la búsqueda o aumenta su radio.</string>
<string name="hillshade_menu_download_descr">Descarga la capa superpuesta del mapa «Sombreado» para mostrar el sombreado vertical.</string> <string name="hillshade_menu_download_descr">Descarga la capa superpuesta del mapa «Sombreado» para mostrar el sombreado vertical.</string>
<string name="hillshade_purchase_header">Instala el complemento «Curvas de nivel» para mostrar las áreas verticales graduadas.</string> <string name="hillshade_purchase_header">Instala el complemento «Curvas de nivel» para mostrar las áreas verticales graduadas.</string>
<string name="private_access_routing_req">El destino se ubica en un área de acceso privado. ¿Permitir el uso de caminos privados para este viaje\?</string> <string name="private_access_routing_req">El destino se ubica en un área de acceso privado. ¿Permitir el uso de caminos privados para este viaje\?</string>
<string name="mapillary_widget">Widget de Mapillary</string> <string name="mapillary_widget">Widget de Mapillary</string>
<string name="mapillary_descr">Fotos a nivel de calle en línea para todos. Descubre sitios, colabora, captura el mundo.</string> <string name="mapillary_descr">Fotos a nivel de calle en línea para todos. Descubre lugares, colabora, captura el mundo.</string>
<string name="mapillary">Mapillary</string> <string name="mapillary">Mapillary</string>
<string name="shared_string_add_photos">Añadir fotos</string> <string name="shared_string_add_photos">Añadir fotos</string>
<string name="mapillary_action_descr">Comparte tus imágenes a nivel de calle a través de Mapillary.</string> <string name="mapillary_action_descr">Comparte tus imágenes a nivel de calle a través de Mapillary.</string>
@ -2858,7 +2858,7 @@
<string name="rendering_attr_surface_concrete_name">Hormigón</string> <string name="rendering_attr_surface_concrete_name">Hormigón</string>
<string name="rendering_attr_surface_sett_name">Adoquín</string> <string name="rendering_attr_surface_sett_name">Adoquín</string>
<string name="rendering_attr_surface_cobblestone_name">Empedrado (adoquín)</string> <string name="rendering_attr_surface_cobblestone_name">Empedrado (adoquín)</string>
<string name="rendering_attr_surface_paving_stones_name">Pavimento intertrabado / Adoquín prefabricado</string> <string name="rendering_attr_surface_paving_stones_name">Adoquinado</string>
<string name="rendering_attr_surface_pebblestone_name">Canto rodado</string> <string name="rendering_attr_surface_pebblestone_name">Canto rodado</string>
<string name="rendering_attr_surface_stone_name">Piedra</string> <string name="rendering_attr_surface_stone_name">Piedra</string>
<string name="rendering_attr_surface_metal_name">Metal</string> <string name="rendering_attr_surface_metal_name">Metal</string>
@ -2875,7 +2875,7 @@
<string name="rendering_attr_smoothness_very_horrible_name">Muy horrible</string> <string name="rendering_attr_smoothness_very_horrible_name">Muy horrible</string>
<string name="rendering_attr_smoothness_impassable_name">Intransitable</string> <string name="rendering_attr_smoothness_impassable_name">Intransitable</string>
<string name="rendering_attr_highway_class_motorway_name">Autopista</string> <string name="rendering_attr_highway_class_motorway_name">Autopista</string>
<string name="rendering_attr_highway_class_state_road_name">Carretera/ruta estatal</string> <string name="rendering_attr_highway_class_state_road_name">Carretera estatal</string>
<string name="rendering_attr_highway_class_road_name">Carretera principal</string> <string name="rendering_attr_highway_class_road_name">Carretera principal</string>
<string name="rendering_attr_highway_class_street_name">Calle</string> <string name="rendering_attr_highway_class_street_name">Calle</string>
<string name="rendering_attr_highway_class_service_name">Vía de servicio</string> <string name="rendering_attr_highway_class_service_name">Vía de servicio</string>
@ -2884,7 +2884,7 @@
<string name="rendering_attr_highway_class_bridleway_name">Camino ecuestre</string> <string name="rendering_attr_highway_class_bridleway_name">Camino ecuestre</string>
<string name="rendering_attr_highway_class_steps_name">Escalera</string> <string name="rendering_attr_highway_class_steps_name">Escalera</string>
<string name="rendering_attr_highway_class_path_name">Sendero</string> <string name="rendering_attr_highway_class_path_name">Sendero</string>
<string name="rendering_attr_highway_class_cycleway_name">Ciclovía/Bicisenda</string> <string name="rendering_attr_highway_class_cycleway_name">Ciclovía</string>
<string name="rendering_attr_undefined_name">Indefinido</string> <string name="rendering_attr_undefined_name">Indefinido</string>
<string name="public_transport_warning_descr_blog">Lea más sobre el cálculo de las rutas de OsmAnd en nuestro blog.</string> <string name="public_transport_warning_descr_blog">Lea más sobre el cálculo de las rutas de OsmAnd en nuestro blog.</string>
<string name="public_transport_warning_title">La navegación en transporte público se encuentra actualmente en fase de pruebas beta, se esperan errores e imprecisiones.</string> <string name="public_transport_warning_title">La navegación en transporte público se encuentra actualmente en fase de pruebas beta, se esperan errores e imprecisiones.</string>
@ -2898,7 +2898,7 @@
<string name="routing_attr_avoid_sett_name">Sin empedrado y adoquinado</string> <string name="routing_attr_avoid_sett_name">Sin empedrado y adoquinado</string>
<string name="routing_attr_avoid_sett_description">Evitar las calles empedradas y adoquinadas</string> <string name="routing_attr_avoid_sett_description">Evitar las calles empedradas y adoquinadas</string>
<string name="shared_string_degrees">Grados</string> <string name="shared_string_degrees">Grados</string>
<string name="shared_string_milliradians">Milésimas angulares</string> <string name="shared_string_milliradians">Milirradianes</string>
<string name="angular_measeurement">Unidad angular</string> <string name="angular_measeurement">Unidad angular</string>
<string name="angular_measeurement_descr">Cambiar el acimut en el que se mide.</string> <string name="angular_measeurement_descr">Cambiar el acimut en el que se mide.</string>
<string name="routing_attr_avoid_tram_name">Sin tranvías</string> <string name="routing_attr_avoid_tram_name">Sin tranvías</string>
@ -2927,7 +2927,7 @@
<string name="public_transport_calc_pedestrian">Calcular la ruta a pie</string> <string name="public_transport_calc_pedestrian">Calcular la ruta a pie</string>
<string name="public_transport_type">Tipo de transporte</string> <string name="public_transport_type">Tipo de transporte</string>
<string name="searching_gps">Buscando GPS</string> <string name="searching_gps">Buscando GPS</string>
<string name="coordinates_widget">Widget de coordenadas</string> <string name="coordinates_widget">Control de coordenadas</string>
<string name="app_mode_ufo">OVNI</string> <string name="app_mode_ufo">OVNI</string>
<string name="release_3_4">• Perfiles de aplicación: crea un perfil personalizado según tus necesidades, con un icono y color personalizado. <string name="release_3_4">• Perfiles de aplicación: crea un perfil personalizado según tus necesidades, con un icono y color personalizado.
\n \n
@ -3414,7 +3414,7 @@
<string name="shared_string_profiles">Perfiles</string> <string name="shared_string_profiles">Perfiles</string>
<string name="shared_string_quick_actions">Acciones rápidas</string> <string name="shared_string_quick_actions">Acciones rápidas</string>
<string name="shared_string_nothing_selected">No hay nada seleccionado</string> <string name="shared_string_nothing_selected">No hay nada seleccionado</string>
<string name="shared_string_poi_types">Tipo de PDI</string> <string name="shared_string_poi_types">Tipos de PDI</string>
<string name="shared_string_preparing">Preparando</string> <string name="shared_string_preparing">Preparando</string>
<string name="recalc_angle_dialog_title">Ángulo mínimo entre mi ubicación y ruta</string> <string name="recalc_angle_dialog_title">Ángulo mínimo entre mi ubicación y ruta</string>
<string name="recalc_angle_dialog_descr">Se mostrará un segmento recto adicional entre mi ubicación y la ruta calculada hasta que se vuelva a calcular la ruta</string> <string name="recalc_angle_dialog_descr">Se mostrará un segmento recto adicional entre mi ubicación y la ruta calculada hasta que se vuelva a calcular la ruta</string>
@ -3496,7 +3496,7 @@
<string name="navigation_profiles_item">Perfiles de navegación</string> <string name="navigation_profiles_item">Perfiles de navegación</string>
<string name="create_edit_poi">Crear o editar PDI</string> <string name="create_edit_poi">Crear o editar PDI</string>
<string name="add_edit_favorite">Añadir o editar favorito</string> <string name="add_edit_favorite">Añadir o editar favorito</string>
<string name="shared_string_add_profile">Agregar perfil</string> <string name="shared_string_add_profile">Añadir perfil</string>
<string name="lang_an">Aragonés</string> <string name="lang_an">Aragonés</string>
<string name="custom_color">Color personalizado</string> <string name="custom_color">Color personalizado</string>
<string name="ltr_or_rtl_combine_via_slash_with_space">%1$s / %2$s</string> <string name="ltr_or_rtl_combine_via_slash_with_space">%1$s / %2$s</string>
@ -3668,8 +3668,8 @@
<string name="clear_tiles_warning">Al aplicar estos cambios, los datos almacenados serán borrados para este repositorio de teselas</string> <string name="clear_tiles_warning">Al aplicar estos cambios, los datos almacenados serán borrados para este repositorio de teselas</string>
<string name="vessel_height_warning_link">Fijar la altura del navío</string> <string name="vessel_height_warning_link">Fijar la altura del navío</string>
<string name="vessel_height_warning">Puedes establecer la altura del navío para evitar los puentes bajos. Ten en cuenta que si el puente es móvil, usaremos su altura en estado abierto.</string> <string name="vessel_height_warning">Puedes establecer la altura del navío para evitar los puentes bajos. Ten en cuenta que si el puente es móvil, usaremos su altura en estado abierto.</string>
<string name="vessel_height_limit_description">Fija la altura del navío para evitar los puentes bajos. Ten en cuenta que si el puente es móvil, usaremos su altura en estado abierto.</string> <string name="vessel_height_limit_description">Define la altura de la embarcación para evitar los puentes bajos. Ten en cuenta que si el puente es móvil, usaremos su altura en estado abierto.</string>
<string name="vessel_width_limit_description">Fija el ancho del navío para evitar puentes estrechos</string> <string name="vessel_width_limit_description">Define el ancho de la embarcación para evitar puentes estrechos</string>
<string name="quick_action_showhide_mapillary_descr">Un botón que alterna la capa de Mapillary en el mapa.</string> <string name="quick_action_showhide_mapillary_descr">Un botón que alterna la capa de Mapillary en el mapa.</string>
<string name="routing_attr_length_description">Especifica la longitud del vehículo que se permitirá en las rutas.</string> <string name="routing_attr_length_description">Especifica la longitud del vehículo que se permitirá en las rutas.</string>
<string name="routing_attr_length_name">Límite de longitud</string> <string name="routing_attr_length_name">Límite de longitud</string>
@ -3695,11 +3695,11 @@
<string name="access_hint_enter_address">Ingresar dirección</string> <string name="access_hint_enter_address">Ingresar dirección</string>
<string name="shared_string_done">Hecho</string> <string name="shared_string_done">Hecho</string>
<string name="simplified_track">Traza simplificada</string> <string name="simplified_track">Traza simplificada</string>
<string name="simplified_track_description">Sólo se grabará la línea de la ruta, los puntos intermedios (waypoints) se borrarán.</string> <string name="simplified_track_description">Sólo se grabará la línea de la ruta, los puntos intermedios se borrarán.</string>
<string name="shared_string_file_name">Nombre de archivo</string> <string name="shared_string_file_name">Nombre de archivo</string>
<string name="number_of_gpx_files_selected_pattern">%s archivos de trazas marcados</string> <string name="number_of_gpx_files_selected_pattern">%s archivos de trazas marcados</string>
<string name="monitoring_control_start">Grabar</string> <string name="monitoring_control_start">Grabar</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="save_global_track_interval_descr">Especifica el intervalo de registro para la grabación general de trazas (activado a través del control \'Grabación de viaje\' en el mapa).</string>
<string name="gpx_monitoring_stop">Pausar grabación del viaje</string> <string name="gpx_monitoring_stop">Pausar grabación del viaje</string>
<string name="gpx_monitoring_start">Reanudar grabación del viaje</string> <string name="gpx_monitoring_start">Reanudar grabación del viaje</string>
<string name="system_default_theme">Predeterminado del sistema</string> <string name="system_default_theme">Predeterminado del sistema</string>
@ -3765,7 +3765,7 @@
<string name="follow_track">Seguir traza</string> <string name="follow_track">Seguir traza</string>
<string name="follow_track_descr">Elige el archivo de la traza a seguir</string> <string name="follow_track_descr">Elige el archivo de la traza a seguir</string>
<string name="import_track_descr">Elige el archivo de la traza a seguir o impórtala desde el dispositivo.</string> <string name="import_track_descr">Elige el archivo de la traza a seguir o impórtala desde el dispositivo.</string>
<string name="select_another_track">Selecciona otra traza</string> <string name="select_another_track">Seleccionar otra traza</string>
<string name="navigate_to_track_descr">Navegar desde mi ubicación a la traza</string> <string name="navigate_to_track_descr">Navegar desde mi ubicación a la traza</string>
<string name="pass_whole_track_descr">Apuntar a la traza para navegar</string> <string name="pass_whole_track_descr">Apuntar a la traza para navegar</string>
<string name="start_of_the_track">Inicio de la traza</string> <string name="start_of_the_track">Inicio de la traza</string>
@ -3924,15 +3924,15 @@
\nPuedes leer más en: https://openplacereviews.org</string> \nPuedes leer más en: https://openplacereviews.org</string>
<string name="open_place_reviews">OpenPlaceReviews</string> <string name="open_place_reviews">OpenPlaceReviews</string>
<string name="online_routing_example_hint">La URL con todos los parámetros se verá así:</string> <string name="online_routing_example_hint">La URL con todos los parámetros se verá así:</string>
<string name="online_routing_engines">Motores de navegación en línea</string> <string name="online_routing_engines">Enrutadores en línea</string>
<string name="online_routing_engine">Motor de navegación en línea</string> <string name="online_routing_engine">Enrutadores en línea</string>
<string name="message_server_error">Error de servidor: %1$s</string> <string name="message_server_error">Error de servidor: %1$s</string>
<string name="message_name_is_already_exists">El nombre ya existe</string> <string name="message_name_is_already_exists">El nombre ya existe</string>
<string name="login_open_place_reviews">Acceder a OpenPlaceReviews</string> <string name="login_open_place_reviews">Acceder a OpenPlaceReviews</string>
<string name="keep_it_empty_if_not">Si no, mantenerlo vacío</string> <string name="keep_it_empty_if_not">Mantenerlo vación si no</string>
<string name="hillshade_slope_contour_lines">Sombreado / Pendiente / Curvas de nivel</string> <string name="hillshade_slope_contour_lines">Sombreado / Pendiente / Curvas de nivel</string>
<string name="edit_track">Editar traza</string> <string name="edit_track">Editar traza</string>
<string name="edit_online_routing_engine">Editar motor de navegación en línea</string> <string name="edit_online_routing_engine">Editar enrutador en linea</string>
<string name="delete_waypoints">Borrar puntos de referencia</string> <string name="delete_waypoints">Borrar puntos de referencia</string>
<string name="delete_online_routing_engine">¿Borrar este motor de navegación en línea\?</string> <string name="delete_online_routing_engine">¿Borrar este motor de navegación en línea\?</string>
<string name="copy_to_map_markers">Copiar a «Marcadores del mapa»</string> <string name="copy_to_map_markers">Copiar a «Marcadores del mapa»</string>
@ -3951,7 +3951,7 @@
<string name="announcement_time_arrive">Has llegado al destino</string> <string name="announcement_time_arrive">Has llegado al destino</string>
<string name="announcement_time_approach">Acercarse</string> <string name="announcement_time_approach">Acercarse</string>
<string name="analyze_by_intervals">Analizar intervalos divididos</string> <string name="analyze_by_intervals">Analizar intervalos divididos</string>
<string name="add_online_routing_engine">Añadir motor de navegación en línea</string> <string name="add_online_routing_engine">Agregar enrutador en linea</string>
<string name="activity_type_winter_name">Invierno</string> <string name="activity_type_winter_name">Invierno</string>
<string name="activity_type_water_name">Agua</string> <string name="activity_type_water_name">Agua</string>
<string name="activity_type_walking_name">Peatón</string> <string name="activity_type_walking_name">Peatón</string>
@ -3965,4 +3965,124 @@
<string name="activity_type_hiking_name">Senderismo</string> <string name="activity_type_hiking_name">Senderismo</string>
<string name="activity_type_cycling_name">Bicicleta</string> <string name="activity_type_cycling_name">Bicicleta</string>
<string name="activity_type_car_name">Automóvil</string> <string name="activity_type_car_name">Automóvil</string>
<string name="shared_string_api_key">Clave API</string>
<string name="uploaded_count">Subido %1$d de %2$d</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">Límites de reservas naturales</string>
<string name="map_quick_action_pattern">%1$s → …</string>
<string name="shared_string_subtype">Subtipo</string>
<string name="shared_string_vehicle">Vehículo</string>
<string name="shared_string_server_url">URL del servidor</string>
<string name="shared_string_enter_param">Introduce parámetro</string>
<string name="test_route_calculation">Cálculo de la ruta de prueba</string>
<string name="routing_engine_vehicle_type_driving">Conduciendo</string>
<string name="routing_engine_vehicle_type_foot">A pie</string>
<string name="routing_engine_vehicle_type_bike">Bicicleta</string>
<string name="routing_engine_vehicle_type_car">Coche</string>
<string name="shared_string_folders">Carpetas</string>
<string name="select_folder">Seleccionar carpeta</string>
<string name="select_folder_descr">Selecciona carpeta o agrega una nueva</string>
<string name="shared_string_empty">Vacío</string>
<string name="upload_to_openstreetmap">Subir a OpenStreetMap</string>
<string name="rename_track">Renombrar traza</string>
<string name="shared_string_sec">seg</string>
<string name="shared_string_turn">Giro</string>
<string name="start_recording">Iniciar grabación</string>
<string name="show_track_on_map">Mostrar pista en el mapa</string>
<string name="routing_engine_vehicle_type_wheelchair">Silla de ruedas</string>
<string name="routing_engine_vehicle_type_hiking">Senderismo</string>
<string name="routing_engine_vehicle_type_walking">Andando</string>
<string name="routing_engine_vehicle_type_cycling_electric">Ciclismo eléctrico</string>
<string name="routing_engine_vehicle_type_cycling_mountain">Ciclismo de montaña</string>
<string name="routing_engine_vehicle_type_cycling_road">Ciclismo de carretera</string>
<string name="routing_engine_vehicle_type_cycling_regular">Ciclismo normal</string>
<string name="routing_engine_vehicle_type_hgv">Vehículo pesado</string>
<string name="routing_engine_vehicle_type_small_truck">Camión pequeño</string>
<string name="routing_engine_vehicle_type_truck">Camión</string>
<string name="routing_engine_vehicle_type_scooter">Escúter</string>
<string name="routing_engine_vehicle_type_racingbike">Bicicleta de carreras</string>
<string name="routing_engine_vehicle_type_mtb">MTB</string>
<string name="upload_photo">Subiendo</string>
<string name="upload_photo_completed">Subida completa</string>
<string name="uploading_count">Subiendo %1$d de %2$d</string>
<string name="select_segments">Seleccionar segmentos</string>
<string name="select_segments_description">%1$s contiene más de un segmento, necesitas seleccionar la parte necesaria para la navegación.</string>
<string name="segments_count">Segmento %1$d</string>
<string name="toast_select_edits_for_upload">Seleccionar ediciones a subir</string>
<string name="temporary_conditional_routing_descr">Utiliza las restricciones viales que están activas ahora en el mapa</string>
<string name="routing_attr_short_way_description">Ruta más corta optimizada (ahorro de energía)</string>
<string name="routing_attr_driving_style_description">Selecciona el propósito de conducción para obtener una ruta más corta, más rápida o más segura</string>
<string name="snap_to_road_descr">El icono de ubicación actual seguirá la ruta de navegación actual</string>
<string name="map_orientation_threshold_descr">No gira la vista del mapa si la velocidad es inferior a un umbral</string>
<string name="restart">Reiniciar</string>
<string name="shared_strings_all_regions">Todas las regiones</string>
<string name="delete_number_files_question">¿Borrar %1$d archivos\?</string>
<string name="track_recording_stop_without_saving">Parar sin guardar</string>
<string name="track_recording_save_and_stop">Guardar y detener la grabación</string>
<string name="track_recording_title">Grabación de traza detenida</string>
<string name="track_recording_description">¿Seguro que quieres dejar de grabar\?
\nSe perderán todos los datos no guardados.</string>
<string name="on_pause">En pausa</string>
<string name="app_restart_required">Es necesario reiniciar la aplicación para aplicar algunos ajustes.</string>
<string name="routing_attr_height_obstacles_description">El enrutamiento podría evitar fuertes subidas.</string>
<string name="quick_action_coordinates_widget_descr">Un conmutador para mostrar u ocultar el control de coordenadas en el mapa.</string>
<string name="map_widget_distance_by_tap">Distancia por toque</string>
<string name="latest_openstreetmap_update">Última actualización de OpenStreetMap disponible:</string>
<string name="updated">Actualizado: %s</string>
<string name="last_time_checked">Última verificación: %s</string>
<string name="update_frequency">Frecuencia de actualización</string>
<string name="live_update_frequency_week_variant">Las actualizaciones de los mapas se revisarán cada semana. La próxima vez %1$s en %2$s.</string>
<string name="live_update_frequency_day_variant">Las actualizaciones del mapa se comprobarán cada día. La próxima vez %1$s en %2$s.</string>
<string name="live_update_frequency_hour_variant">Las actualizaciones del mapa se comprobarán cada hora. La próxima vez %1$s en %2$s.</string>
<string name="delete_updates">Borrar las actualizaciones</string>
<string name="live_update_delete_updates_msg">¿Seguro que deseas eliminar todas las %s actualizaciones en vivo\?</string>
<string name="purchases">Compras</string>
<string name="select_category_descr">Selecciona una categoría o añada una nueva</string>
<string name="track_recording_will_be_continued">La grabación continuará.</string>
<string name="copy_poi_name">Copiar nombre de PDI</string>
<string name="quick_action_show_hide_title">Mostrar/Ocultar</string>
<string name="shared_string_interval">Intervalo</string>
<string name="rendering_attr_noNatureReserveBoundaries_description">Ocultar los límites de las reservas naturales, las áreas protegidas y los parques nacionales</string>
<string name="track_has_no_altitude">La traza no contiene dato de altitud.</string>
<string name="track_has_no_speed">La traza no contiene datos de velocidad.</string>
<string name="select_another_colorization">Selecciona otro tipo de coloración.</string>
<string name="trip_recording_logging_interval_info">El intervalo de registro establece el periodo de tiempo en el que OsmAnd pedirá los datos de la posición actual.</string>
<string name="trip_recording_save_and_continue">Guardar y continuar</string>
<string name="lost_data_warning">Todos los datos no guardados se perderán.</string>
<string name="show_start_dialog">Mostrar cuadro de diálogo de inicio</string>
<string name="trip_recording_show_start_dialog_setting">Si se desactiva, la grabación se iniciará justo después de tocar el control o el elemento de menú, saltándose el diálogo de confirmación.</string>
<string name="customize_route_line">Personalizar la línea de ruta</string>
<string name="shared_string_route_line">Línea de ruta</string>
<string name="route_line_use_map_style_appearance">La línea de ruta sería usar %1$s especificada en el estilo de mapa seleccionado: %2$s.</string>
<string name="specify_color_for_map_mode">Especifica el color para el modo de mapa: %1$s.</string>
<string name="no_purchases">No tienes compras</string>
<string name="new_device_account">Nuevo dispositivo / nueva cuenta</string>
<string name="contact_support_description">Si tienes alguna duda, ponte en contacto con nosotros en %1$s.</string>
<string name="troubleshooting_description">Por favor, sigue este enlace si tiense algún problema con las compras.</string>
<string name="contact_support">Contacta con asistencia</string>
<string name="empty_purchases_description">Si tus compras no aparecen aquí, pulsa sobre \"%1$s\", o ponte en contacto con nuestro equipo de asistencia.</string>
<string name="troubleshooting">Solución de problemas</string>
<string name="osmand_live">OsmAnd En vivo</string>
<string name="annual_subscription">Suscripción anual</string>
<string name="monthly_subscription">Suscripción mensual</string>
<string name="three_months_subscription">Suscripción de tres meses</string>
<string name="next_billing_date">Próxima fecha de facturación: %1$s</string>
<string name="osmand_live_cancelled">Cancelado</string>
<string name="renew_subscription">Renovar la suscripción</string>
<string name="in_grace_period">En periodo de gracia</string>
<string name="on_hold">En espera</string>
<string name="expired">Expirado</string>
<string name="release_4_0_beta">- Las actualizaciones de OsmAnd Live se han movido a \"Descargas &gt; Actualizaciones\".
\n
\n - Los tracks ahora pueden ser coloreados por altitud, velocidad o pendiente.
\n
\n - Añadida la opción de cambiar la apariencia de la línea de la ruta de navegación
\n
\n - Actualizado el cuadro de diálogo \"Grabación del viaje\".
\n
\n</string>
<string name="update_all_maps_added">¿Actualizar todos los mapas añadidos a %1$s\?</string>
<string name="exit_number">Número de salida</string>
<string name="announce_when_exceeded">Anunciar cuando se excede</string>
<string name="user_points">Puntos de usuario</string>
<string name="output">Salida</string>
</resources> </resources>

View file

@ -4094,7 +4094,7 @@
<string name="empty_purchases_description">اگر خریدهای شما اینجا نمایش داده نمی‌شود، روی «%1$s» بزنید یا با تیم پشتیبانی ما تماس بگیرید.</string> <string name="empty_purchases_description">اگر خریدهای شما اینجا نمایش داده نمی‌شود، روی «%1$s» بزنید یا با تیم پشتیبانی ما تماس بگیرید.</string>
<string name="contact_support">تماس با پشتیبانی</string> <string name="contact_support">تماس با پشتیبانی</string>
<string name="troubleshooting">عیب‌یابی</string> <string name="troubleshooting">عیب‌یابی</string>
<string name="troubleshooting_description">اگر با مسئله‌ای در خرید مواجه شدید این پیوند را دنبال کنید.</string> <string name="troubleshooting_description">اگر در خرید با مسئله‌ای مواجه هستید این پیوند را دنبال کنید.</string>
<string name="osmand_live">OsmAnd Live</string> <string name="osmand_live">OsmAnd Live</string>
<string name="annual_subscription">اشتراک سالانه</string> <string name="annual_subscription">اشتراک سالانه</string>
<string name="monthly_subscription">اشتراک ماهانه</string> <string name="monthly_subscription">اشتراک ماهانه</string>
@ -4105,4 +4105,6 @@
<string name="in_grace_period">در مهلت اضافه</string> <string name="in_grace_period">در مهلت اضافه</string>
<string name="expired">منقضی شده</string> <string name="expired">منقضی شده</string>
<string name="update_all_maps_added">همهٔ نقشه‌های اضافه‌شده به %1$s روزآمد شود؟</string> <string name="update_all_maps_added">همهٔ نقشه‌های اضافه‌شده به %1$s روزآمد شود؟</string>
<string name="exit_number">شمارهٔ خروج</string>
<string name="output">خروجی</string>
</resources> </resources>

View file

@ -4075,5 +4075,4 @@
<string name="exit_number">Numéro de sortie</string> <string name="exit_number">Numéro de sortie</string>
<string name="announce_when_exceeded">Annoncer en cas de dépassement</string> <string name="announce_when_exceeded">Annoncer en cas de dépassement</string>
<string name="output">Sortie</string> <string name="output">Sortie</string>
<string name="map_quick_action_pattern">%1$s → …</string>
</resources> </resources>

View file

@ -4074,7 +4074,6 @@
<string name="on_hold">Várakoztatva</string> <string name="on_hold">Várakoztatva</string>
<string name="expired">Lejárt</string> <string name="expired">Lejárt</string>
<string name="update_all_maps_added">Frissüljön minden térkép, amely hozzá lett adva ehhez: %1$s\?</string> <string name="update_all_maps_added">Frissüljön minden térkép, amely hozzá lett adva ehhez: %1$s\?</string>
<string name="map_quick_action_pattern">%1$s → …</string>
<string name="exit_number">Kijárat száma</string> <string name="exit_number">Kijárat száma</string>
<string name="announce_when_exceeded">Értesítés túllépéskor</string> <string name="announce_when_exceeded">Értesítés túllépéskor</string>
<string name="user_points">Felhasználói pontok</string> <string name="user_points">Felhasználói pontok</string>

View file

@ -4071,4 +4071,9 @@
<string name="on_hold">In attesa</string> <string name="on_hold">In attesa</string>
<string name="expired">Scaduto</string> <string name="expired">Scaduto</string>
<string name="update_all_maps_added">Aggiornare tutte le mappe aggiunte a %1$s\?</string> <string name="update_all_maps_added">Aggiornare tutte le mappe aggiunte a %1$s\?</string>
<string name="exit_number">Numero uscita</string>
<string name="announce_when_exceeded">Annuncia quando si supera</string>
<string name="user_points">Punti utente</string>
<string name="output">Output</string>
<string name="map_quick_action_pattern">%1$s → …</string>
</resources> </resources>

View file

@ -4087,5 +4087,4 @@
<string name="announce_when_exceeded">להכריז בחריגה</string> <string name="announce_when_exceeded">להכריז בחריגה</string>
<string name="user_points">נקודות משתמש</string> <string name="user_points">נקודות משתמש</string>
<string name="output">פלט</string> <string name="output">פלט</string>
<string name="map_quick_action_pattern">%1$s ← …</string>
</resources> </resources>

View file

@ -4044,4 +4044,26 @@
<string name="osmand_live_cancelled">Anulowano</string> <string name="osmand_live_cancelled">Anulowano</string>
<string name="renew_subscription">Odnów subskrypcję</string> <string name="renew_subscription">Odnów subskrypcję</string>
<string name="update_all_maps_added">Zaktualizować wszystkie mapy dodane do %1$s\?</string> <string name="update_all_maps_added">Zaktualizować wszystkie mapy dodane do %1$s\?</string>
<string name="routing_attr_height_obstacles_description">Trasa mogłaby unikać silnych podjazdów.</string>
<string name="select_another_colorization">Proszę wybrać inny typ barwy.</string>
<string name="shared_string_interval">Interwał</string>
<string name="rendering_attr_noNatureReserveBoundaries_name">Naturalne granice</string>
<string name="track_has_no_altitude">Ślady nie zawierają danych o wysokości.</string>
<string name="track_has_no_speed">Ślady nie zawierają informacji o prędkości.</string>
<string name="trip_recording_logging_interval_info">Interwały logowania ustala okres czasu, w któtym OsmAnd będzie prosił o dane obecnej lokalizacji pozycji.</string>
<string name="show_start_dialog">Pokaż okno rozpocznij</string>
<string name="trip_recording_show_start_dialog_setting">Gdy wyłączone, nagrywanie rozpocznie się niezwłocznie po naciśnięciu w widżet lub w menu, pomijając okno potwierdzenia.</string>
<string name="customize_route_line">Zmień trasę nawigacji</string>
<string name="shared_string_route_line">Trasa nawigacji</string>
<string name="expired">Wygasł</string>
<string name="release_4_0_beta">• OsmAnd Live aktualizacje przeniesiono do \"Pobrane &gt; Aktualizacje\"
\n
\n •Ślady mogą być pokolorowane względem wysokości, prędkości, wzniesień.
\n
\n • Dodano opcję zmiany wyglądu trasy nawigacji
\n
\n • zaktualizowano okno \"Nagrywanie Trasy\"
\n
\n</string>
<string name="map_quick_action_pattern">%1$s → …</string>
</resources> </resources>

View file

@ -4064,7 +4064,7 @@
<string name="empty_purchases_description">Se suas compras não aparecerem aqui, toque em \"%1$s\", ou entre em contato com nossa equipe de suporte.</string> <string name="empty_purchases_description">Se suas compras não aparecerem aqui, toque em \"%1$s\", ou entre em contato com nossa equipe de suporte.</string>
<string name="contact_support">Contato com o suporte</string> <string name="contact_support">Contato com o suporte</string>
<string name="troubleshooting">Solução de problemas</string> <string name="troubleshooting">Solução de problemas</string>
<string name="troubleshooting_description">Por favor, siga este link se você tiver algum problema com compras.</string> <string name="troubleshooting_description">Por favor, siga este link se tiver problemas com as compras.</string>
<string name="osmand_live">OsmAnd Live</string> <string name="osmand_live">OsmAnd Live</string>
<string name="annual_subscription">Assinatura anual</string> <string name="annual_subscription">Assinatura anual</string>
<string name="monthly_subscription">Assinatura mensal</string> <string name="monthly_subscription">Assinatura mensal</string>
@ -4076,4 +4076,9 @@
<string name="on_hold">Em espera</string> <string name="on_hold">Em espera</string>
<string name="expired">Expirado</string> <string name="expired">Expirado</string>
<string name="update_all_maps_added">Atualizar todos os mapas adicionados a %1$s\?</string> <string name="update_all_maps_added">Atualizar todos os mapas adicionados a %1$s\?</string>
<string name="exit_number">Número de saída</string>
<string name="announce_when_exceeded">Anunciar quando ultrapassado</string>
<string name="user_points">Pontos do usuário</string>
<string name="output">Saída</string>
<string name="map_quick_action_pattern">%1$s → …</string>
</resources> </resources>

View file

@ -1409,7 +1409,7 @@
<string name="poi_fireplace_yes">Sim</string> <string name="poi_fireplace_yes">Sim</string>
<string name="poi_fireplace_no">Sem lareira</string> <string name="poi_fireplace_no">Sem lareira</string>
<string name="poi_covered_yes">Sim</string> <string name="poi_covered_yes">Sim</string>
<string name="poi_covered_no">Descoberto</string> <string name="poi_covered_no">Não coberto</string>
<string name="poi_smoking_no">Não permitido</string> <string name="poi_smoking_no">Não permitido</string>
<string name="poi_smoking_outside">Apenas do lado de fora</string> <string name="poi_smoking_outside">Apenas do lado de fora</string>
<string name="poi_smoking_yes">Permitido</string> <string name="poi_smoking_yes">Permitido</string>
@ -1959,8 +1959,8 @@
<string name="poi_surface_paved">Superfície: pavimentada</string> <string name="poi_surface_paved">Superfície: pavimentada</string>
<string name="poi_surface_asphalt">Superfície: asfalto</string> <string name="poi_surface_asphalt">Superfície: asfalto</string>
<string name="poi_surface_concrete">Superfície: cimento</string> <string name="poi_surface_concrete">Superfície: cimento</string>
<string name="poi_surface_sett">Superfície: paralelepípedo</string> <string name="poi_surface_sett">Superfície: paralelos</string>
<string name="poi_surface_cobblestone">Superfície: piso de seixos</string> <string name="poi_surface_cobblestone">Superfície: pedras irregulares</string>
<string name="poi_surface_paving_stones">Superfície: piso intertravado</string> <string name="poi_surface_paving_stones">Superfície: piso intertravado</string>
<string name="poi_surface_pebblestone">Superfície: cascalho</string> <string name="poi_surface_pebblestone">Superfície: cascalho</string>
<string name="poi_surface_stone">Superfície: pedra</string> <string name="poi_surface_stone">Superfície: pedra</string>
@ -2789,7 +2789,7 @@
<string name="poi_crossing_supervision_attendant">Cruzamento vigiado: pessoa física</string> <string name="poi_crossing_supervision_attendant">Cruzamento vigiado: pessoa física</string>
<string name="poi_crossing_supervision_camera">Cruzamento vigiado: câmara</string> <string name="poi_crossing_supervision_camera">Cruzamento vigiado: câmara</string>
<string name="poi_dispensing_yes">Sim</string> <string name="poi_dispensing_yes">Sim</string>
<string name="poi_dispensing_no">Emite receitas: não</string> <string name="poi_dispensing_no">Não vende medicamentos sujeitos a receita médica</string>
<string name="poi_aerodrome_type_international">Internacional</string> <string name="poi_aerodrome_type_international">Internacional</string>
<string name="poi_aerodrome_type_regional">Regional</string> <string name="poi_aerodrome_type_regional">Regional</string>
<string name="poi_aerodrome_type_public">Público</string> <string name="poi_aerodrome_type_public">Público</string>
@ -3488,7 +3488,7 @@
<string name="poi_checkpoint_type_electronic">Eletrónico</string> <string name="poi_checkpoint_type_electronic">Eletrónico</string>
<string name="poi_course">Curso</string> <string name="poi_course">Curso</string>
<string name="poi_rock">Rocha</string> <string name="poi_rock">Rocha</string>
<string name="poi_end_date">Data final</string> <string name="poi_end_date">Data de fim</string>
<string name="poi_appliance">Loja de eletrodomésticos</string> <string name="poi_appliance">Loja de eletrodomésticos</string>
<string name="poi_outcrop">Afloramento</string> <string name="poi_outcrop">Afloramento</string>
<string name="poi_payment_contactless_yes">Sem contacto</string> <string name="poi_payment_contactless_yes">Sem contacto</string>
@ -3704,7 +3704,7 @@
<string name="poi_craft_floorer">Assentador de piso</string> <string name="poi_craft_floorer">Assentador de piso</string>
<string name="poi_craft_bakery">Padaria</string> <string name="poi_craft_bakery">Padaria</string>
<string name="poi_craft_cabinet_maker">Marceneiro</string> <string name="poi_craft_cabinet_maker">Marceneiro</string>
<string name="poi_charge">Cobrança</string> <string name="poi_charge">Custo</string>
<string name="poi_pet_grooming">Banho e tosquia de animais</string> <string name="poi_pet_grooming">Banho e tosquia de animais</string>
<string name="poi_atm_yes">Caixa automática: sim</string> <string name="poi_atm_yes">Caixa automática: sim</string>
<string name="poi_cash_withdrawal_bank_card">Levantamento de dinheiro</string> <string name="poi_cash_withdrawal_bank_card">Levantamento de dinheiro</string>

File diff suppressed because it is too large Load diff

View file

@ -3908,4 +3908,5 @@
<string name="poi_pilates">Пилатес</string> <string name="poi_pilates">Пилатес</string>
<string name="poi_karate">Каратэ</string> <string name="poi_karate">Каратэ</string>
<string name="poi_jiu_jitsu">Джиу-джитсу</string> <string name="poi_jiu_jitsu">Джиу-джитсу</string>
<string name="poi_mobile_library">Место остановки передвижной библиотеки</string>
</resources> </resources>

View file

@ -1545,7 +1545,7 @@
<string name="download_additional_maps">Скачать недостающие карты %1$s (%2$d МБ)\?</string> <string name="download_additional_maps">Скачать недостающие карты %1$s (%2$d МБ)\?</string>
<string name="shared_string_waypoints">Путевые точки</string> <string name="shared_string_waypoints">Путевые точки</string>
<string name="way_alarms">Дорожные предупреждения</string> <string name="way_alarms">Дорожные предупреждения</string>
<string name="speak_favorites">Мои места рядом</string> <string name="speak_favorites">Ближайшие избранные</string>
<string name="speak_poi">Ближайшие POI</string> <string name="speak_poi">Ближайшие POI</string>
<string name="index_tours">Туры</string> <string name="index_tours">Туры</string>
<string name="shared_string_all">Все</string> <string name="shared_string_all">Все</string>
@ -4082,4 +4082,8 @@
<string name="expired">Срок истёк</string> <string name="expired">Срок истёк</string>
<string name="on_hold">Приостановлено</string> <string name="on_hold">Приостановлено</string>
<string name="renew_subscription">Продление подписки</string> <string name="renew_subscription">Продление подписки</string>
<string name="announce_when_exceeded">Объявлять о превышении</string>
<string name="user_points">Точки пользователя</string>
<string name="output">Вывод</string>
<string name="map_quick_action_pattern">%1$s → …</string>
</resources> </resources>

View file

@ -4076,4 +4076,9 @@
<string name="on_hold">Pozdržané</string> <string name="on_hold">Pozdržané</string>
<string name="expired">Expirované</string> <string name="expired">Expirované</string>
<string name="update_all_maps_added">Aktualizovať všetky mapy pridané do %1$s\?</string> <string name="update_all_maps_added">Aktualizovať všetky mapy pridané do %1$s\?</string>
<string name="exit_number">Číslo výjazdu</string>
<string name="announce_when_exceeded">Hlásiť keď je prekročené</string>
<string name="user_points">Body používateľa</string>
<string name="output">Výstup</string>
<string name="map_quick_action_pattern">%1$s → …</string>
</resources> </resources>

View file

@ -24,7 +24,7 @@
<string name="snap_to_road">Fäst på vägen</string> <string name="snap_to_road">Fäst på vägen</string>
<string name="filterpoi_activity">Skapa POI-filter</string> <string name="filterpoi_activity">Skapa POI-filter</string>
<string name="recalculate_route_to_your_location">Transportsätt:</string> <string name="recalculate_route_to_your_location">Transportsätt:</string>
<string name="select_navigation_mode">Välj transportsätt</string> <string name="select_navigation_mode">Transportsätt:</string>
<string name="day_night_info_description">Soluppgång: %1$s <string name="day_night_info_description">Soluppgång: %1$s
\nSolnedgång: %2$s</string> \nSolnedgång: %2$s</string>
<string name="day_night_info">Dag-/nattinformation</string> <string name="day_night_info">Dag-/nattinformation</string>
@ -81,7 +81,7 @@
<string name="osmand_parking_hours">timmar</string> <string name="osmand_parking_hours">timmar</string>
<string name="osmand_parking_minutes">minuter</string> <string name="osmand_parking_minutes">minuter</string>
<string name="osmand_parking_position_description_add_time">Bilen är parkerad vid</string> <string name="osmand_parking_position_description_add_time">Bilen är parkerad vid</string>
<string name="select_animate_speedup">Välj animerad ruttacceleration</string> <string name="select_animate_speedup">Ruttsimuleringshastighet:</string>
<string name="global_app_allocated_memory_descr">Allokerat minne %1$s MB (Android-gräns %2$s MB, Dalvik %3$s MB).</string> <string name="global_app_allocated_memory_descr">Allokerat minne %1$s MB (Android-gräns %2$s MB, Dalvik %3$s MB).</string>
<string name="global_app_allocated_memory">Allokerat minne</string> <string name="global_app_allocated_memory">Allokerat minne</string>
<string name="native_app_allocated_memory_descr">Totalt inbyggt minne allokerat av appen %1$s MB (Dalvik %2$s MB, övrigt %3$s MB). <string name="native_app_allocated_memory_descr">Totalt inbyggt minne allokerat av appen %1$s MB (Dalvik %2$s MB, övrigt %3$s MB).
@ -112,8 +112,8 @@
<string name="offline_navigation_not_available">OsmAnd offlinenavigering är inte tillgänglig för tillfället.</string> <string name="offline_navigation_not_available">OsmAnd offlinenavigering är inte tillgänglig för tillfället.</string>
<string name="left_side_navigation">Vänstertrafik</string> <string name="left_side_navigation">Vänstertrafik</string>
<string name="left_side_navigation_descr">Välj för länder med vänstertrafik.</string> <string name="left_side_navigation_descr">Välj för länder med vänstertrafik.</string>
<string name="unknown_from_location">Startpunkten är ännu inte bestämd</string> <string name="unknown_from_location">Avgångspunkten är ännu inte fastställd.</string>
<string name="unknown_location">Positionen är ännu inte känd</string> <string name="unknown_location">Positionen är ännu inte känd.</string>
<string name="confirm_interrupt_download">Avbryt filhämtningen?</string> <string name="confirm_interrupt_download">Avbryt filhämtningen?</string>
<string name="local_indexes_cat_tile">Online-kartor och mellanlagrade kartrutor</string> <string name="local_indexes_cat_tile">Online-kartor och mellanlagrade kartrutor</string>
<string name="local_indexes_cat_map">Standardkartor (vektor)</string> <string name="local_indexes_cat_map">Standardkartor (vektor)</string>
@ -210,7 +210,7 @@
<string name="prefs_plugins">Insticksmoduler</string> <string name="prefs_plugins">Insticksmoduler</string>
<string name="osm_editing_plugin_description">Ge OSM-bidrag som att skapa eller modifiera OSM POI-objekt, öppna eller kommentera OSM-anteckningar och bidra med inspelade GPX-filer i OsmAnd genom att ange ditt användarnamn och lösenord. OpenStreetMap.org är ett community-driven, globalt kartläggningsprojekt för allmän domän.</string> <string name="osm_editing_plugin_description">Ge OSM-bidrag som att skapa eller modifiera OSM POI-objekt, öppna eller kommentera OSM-anteckningar och bidra med inspelade GPX-filer i OsmAnd genom att ange ditt användarnamn och lösenord. OpenStreetMap.org är ett community-driven, globalt kartläggningsprojekt för allmän domän.</string>
<string name="vector_maps_may_display_faster_on_some_devices">Vektorkartor ritas sannolikt upp snabbare. Fungerar kanske inte så bra på vissa enheter.</string> <string name="vector_maps_may_display_faster_on_some_devices">Vektorkartor ritas sannolikt upp snabbare. Fungerar kanske inte så bra på vissa enheter.</string>
<string name="play_commands_of_currently_selected_voice">Spela upp kommandon med vald röst</string> <string name="play_commands_of_currently_selected_voice">Välj en röst och testa genom att spela meddelanden:</string>
<string name="test_voice_prompts">Test av röstmeddelanden</string> <string name="test_voice_prompts">Test av röstmeddelanden</string>
<string name="switch_to_raster_map_to_see">Det finns ingen offline vektorkarta för den här platsen. Du kan hämta en i Inställningar (Hantera kartfiler) eller byta till online-kartor (aktivera modulen för online-kartor för detta).</string> <string name="switch_to_raster_map_to_see">Det finns ingen offline vektorkarta för den här platsen. Du kan hämta en i Inställningar (Hantera kartfiler) eller byta till online-kartor (aktivera modulen för online-kartor för detta).</string>
<string name="osmand_long_description_1000_chars">OsmAnd (OSM Automated Navigation Directions) <string name="osmand_long_description_1000_chars">OsmAnd (OSM Automated Navigation Directions)
@ -247,7 +247,7 @@
<string name="direction_style_sidewise">Sidled (8 sektorer)</string> <string name="direction_style_sidewise">Sidled (8 sektorer)</string>
<string name="direction_style_clockwise">Medurs (12 sektorer)</string> <string name="direction_style_clockwise">Medurs (12 sektorer)</string>
<string name="settings_direction_style">Riktningsstil</string> <string name="settings_direction_style">Riktningsstil</string>
<string name="settings_direction_style_descr">Välj sätt att uttrycka relativa riktningar under rörelse.</string> <string name="settings_direction_style_descr">Välj sätt att uttrycka relativa riktningar under rörelse</string>
<string name="auto_announce_on">Börja meddela automatiskt</string> <string name="auto_announce_on">Börja meddela automatiskt</string>
<string name="auto_announce_off">Sluta meddela automatiskt</string> <string name="auto_announce_off">Sluta meddela automatiskt</string>
<string name="i_am_here">Jag är här</string> <string name="i_am_here">Jag är här</string>
@ -335,7 +335,7 @@
<string name="animate_route">Starta simuleringen</string> <string name="animate_route">Starta simuleringen</string>
<string name="file_can_not_be_renamed">Filen kan inte döpas om.</string> <string name="file_can_not_be_renamed">Filen kan inte döpas om.</string>
<string name="file_with_name_already_exists">En fil med det namnet finns redan.</string> <string name="file_with_name_already_exists">En fil med det namnet finns redan.</string>
<string name="poi_query_by_name_matches_categories">Hittade flera POI-kategorier som matchar frågan:</string> <string name="poi_query_by_name_matches_categories">Hittade flera relaterade IP-kategorier.</string>
<string name="data_to_search_poi_not_available">Lokala data för att söka POI är inte tillgängliga.</string> <string name="data_to_search_poi_not_available">Lokala data för att söka POI är inte tillgängliga.</string>
<string name="poi_filter_by_name">Sök efter namn</string> <string name="poi_filter_by_name">Sök efter namn</string>
<string name="old_poi_file_should_be_deleted">POI-datafilen \'%1$s\' är överflödig och kan tas bort.</string> <string name="old_poi_file_should_be_deleted">POI-datafilen \'%1$s\' är överflödig och kan tas bort.</string>
@ -388,7 +388,7 @@
<string name="local_indexes_cat_poi">Intressepunktsdata</string> <string name="local_indexes_cat_poi">Intressepunktsdata</string>
<string name="ttsvoice">TTS-röst</string> <string name="ttsvoice">TTS-röst</string>
<string name="search_offline_clear_search">Ny sökning</string> <string name="search_offline_clear_search">Ny sökning</string>
<string name="map_text_size_descr">Välj textstorlek för namn på kartan.</string> <string name="map_text_size_descr">Textstorlek för namn på kartan:</string>
<string name="map_text_size">Teckenstorlek på karta</string> <string name="map_text_size">Teckenstorlek på karta</string>
<string name="trace_rendering">Renderingsfelsökningsinformation</string> <string name="trace_rendering">Renderingsfelsökningsinformation</string>
<string name="trace_rendering_descr">Visa renderingsprestanda.</string> <string name="trace_rendering_descr">Visa renderingsprestanda.</string>
@ -415,10 +415,10 @@
<string name="map_transparency">Transparens för baskartan</string> <string name="map_transparency">Transparens för baskartan</string>
<string name="layer_underlay">Underläggskarta …</string> <string name="layer_underlay">Underläggskarta …</string>
<string name="map_underlay">Underläggskarta</string> <string name="map_underlay">Underläggskarta</string>
<string name="map_underlay_descr">Välj underläggskarta.</string> <string name="map_underlay_descr">Välj underläggskarta</string>
<string name="layer_overlay">Överläggskarta …</string> <string name="layer_overlay">Överläggskarta …</string>
<string name="map_overlay">Överläggskarta</string> <string name="map_overlay">Överläggskarta</string>
<string name="map_overlay_descr">Välj överläggskarta.</string> <string name="map_overlay_descr">Välj överläggskarta</string>
<string name="tile_source_already_installed">Kartan är redan installerad; inställningarna kommer att uppdateras.</string> <string name="tile_source_already_installed">Kartan är redan installerad; inställningarna kommer att uppdateras.</string>
<string name="select_tile_source_to_install">Välj kartor/kartrutor att installera eller uppdatera.</string> <string name="select_tile_source_to_install">Välj kartor/kartrutor att installera eller uppdatera.</string>
<string name="internet_not_available">En anslutning till Internet krävs för denna åtgärd men någon sådan är inte tillgänglig.</string> <string name="internet_not_available">En anslutning till Internet krävs för denna åtgärd men någon sådan är inte tillgänglig.</string>
@ -538,12 +538,12 @@
<string name="maps_could_not_be_downloaded">Denna karta kunde inte laddas ner</string> <string name="maps_could_not_be_downloaded">Denna karta kunde inte laddas ner</string>
<string name="continuous_rendering">Kontinuerlig rendering</string> <string name="continuous_rendering">Kontinuerlig rendering</string>
<string name="continuous_rendering_descr">Visa kontinuerlig rendering istället för direkt-bild.</string> <string name="continuous_rendering_descr">Visa kontinuerlig rendering istället för direkt-bild.</string>
<string name="rendering_exception">Ett fel uppstod vid renderingen av valt område</string> <string name="rendering_exception">Det gick inte att rita valt område.</string>
<string name="show_point_options">Använd platsen …</string> <string name="show_point_options">Använd platsen …</string>
<string name="renderer_load_sucess">Renderaren lästes in</string> <string name="renderer_load_sucess">Renderaren lästes in</string>
<string name="renderer_load_exception">Kunde inte läsa in renderaren</string> <string name="renderer_load_exception">Kunde inte ladda renderaren.</string>
<string name="renderers">Vektorrenderare</string> <string name="renderers">Vektorrenderare</string>
<string name="renderers_descr">Välj renderingsutseende.</string> <string name="renderers_descr">Välj renderingsutseende</string>
<string name="poi_context_menu_website">Visa POI-webbplats</string> <string name="poi_context_menu_website">Visa POI-webbplats</string>
<string name="poi_context_menu_call">Visa POI-telefon</string> <string name="poi_context_menu_call">Visa POI-telefon</string>
<string name="osmand_routing_experimental">OsmAnd offline-navigering är en experimentell funktion och den fungerar inte för sträckor över c:a 20 km.\n\nNavigeringstjänsten är tillfälligt kopplad till online CloudMade.</string> <string name="osmand_routing_experimental">OsmAnd offline-navigering är en experimentell funktion och den fungerar inte för sträckor över c:a 20 km.\n\nNavigeringstjänsten är tillfälligt kopplad till online CloudMade.</string>
@ -559,7 +559,7 @@
<string name="voice">Inspelad röst</string> <string name="voice">Inspelad röst</string>
<string name="no_vector_map_loaded">Vektorkartorna lästes inte in</string> <string name="no_vector_map_loaded">Vektorkartorna lästes inte in</string>
<string name="gpx_files_not_found">Hittar inga GPX-filer i spårmappen</string> <string name="gpx_files_not_found">Hittar inga GPX-filer i spårmappen</string>
<string name="error_reading_gpx">Kunde inte läsa GPX-data</string> <string name="error_reading_gpx">Kunde inte läsa GPX-data.</string>
<string name="vector_data">Offline vektorkartor</string> <string name="vector_data">Offline vektorkartor</string>
<string name="transport_context_menu">Sök transport vid stopp</string> <string name="transport_context_menu">Sök transport vid stopp</string>
<string name="poi_context_menu_modify">Ändra Intressepunkt</string> <string name="poi_context_menu_modify">Ändra Intressepunkt</string>
@ -567,14 +567,14 @@
<string name="rotate_map_compass_opt">Till kompass</string> <string name="rotate_map_compass_opt">Till kompass</string>
<string name="rotate_map_bearing_opt">I färdriktningen</string> <string name="rotate_map_bearing_opt">I färdriktningen</string>
<string name="rotate_map_none_opt">Vrid inte (norr är uppåt)</string> <string name="rotate_map_none_opt">Vrid inte (norr är uppåt)</string>
<string name="rotate_map_to_bearing_descr">Välj justering av kartskärmen.</string> <string name="rotate_map_to_bearing_descr">Kartjustering:</string>
<string name="rotate_map_to_bearing">Kartorientering</string> <string name="rotate_map_to_bearing">Kartorientering</string>
<string name="show_route">Ruttdetaljer</string> <string name="show_route">Ruttdetaljer</string>
<string name="fav_imported_sucessfully">Favoriterna importerades utan problem</string> <string name="fav_imported_sucessfully">Favoriterna importerades utan problem</string>
<string name="fav_file_to_load_not_found">GPX-fil med favoriter finns inte på {0}</string> <string name="fav_file_to_load_not_found">GPX-fil med favoriter finns inte på {0}</string>
<string name="fav_saved_sucessfully">Favoriterna sparade utan problem i {0}</string> <string name="fav_saved_sucessfully">Favoriterna sparade utan problem i {0}</string>
<string name="no_fav_to_save">Inga favoritpunkter att spara</string> <string name="no_fav_to_save">Inga favoritpunkter att spara</string>
<string name="error_occurred_loading_gpx">Kunde inte läsa in GPX</string> <string name="error_occurred_loading_gpx">Kunde inte läsa in GPX.</string>
<string name="send_report">Skicka rapport</string> <string name="send_report">Skicka rapport</string>
<string name="none_region_found">Det gick inte att hitta några hämtade kartor på minneskortet.</string> <string name="none_region_found">Det gick inte att hitta några hämtade kartor på minneskortet.</string>
<string name="poi_namefinder_query_empty">Ange sökfråga för att hitta POI</string> <string name="poi_namefinder_query_empty">Ange sökfråga för att hitta POI</string>
@ -596,9 +596,9 @@
<string name="network_provider">Nätverk</string> <string name="network_provider">Nätverk</string>
<string name="gps_provider">GPS</string> <string name="gps_provider">GPS</string>
<string name="int_seconds">sekunder</string> <string name="int_seconds">sekunder</string>
<string name="background_service_int_descr">Ange väckningsintervall som används av bakgrundstjänsten.</string> <string name="background_service_int_descr">Väckningsintervall som används av bakgrundstjänsten:</string>
<string name="background_service_int">GPS-väckningsintervall</string> <string name="background_service_int">GPS-väckningsintervall</string>
<string name="background_service_provider_descr">Välj platsleverantör för bakgrundstjänsten.</string> <string name="background_service_provider_descr">Platsmetod som används av bakgrundstjänsten:</string>
<string name="background_service_provider">Platsleverantör</string> <string name="background_service_provider">Platsleverantör</string>
<string name="background_router_service_descr">Kör OsmAnd i bakgrunden för att spåra din position medan skärmen är avstängd.</string> <string name="background_router_service_descr">Kör OsmAnd i bakgrunden för att spåra din position medan skärmen är avstängd.</string>
<string name="background_router_service">Kör OsmAnd i bakgrunden</string> <string name="background_router_service">Kör OsmAnd i bakgrunden</string>
@ -635,7 +635,7 @@
<string name="map_orientation_landscape">Liggande</string> <string name="map_orientation_landscape">Liggande</string>
<string name="map_screen_orientation">Skärmorientering</string> <string name="map_screen_orientation">Skärmorientering</string>
<string name="map_screen_orientation_descr">Stående, liggande eller som enheten.</string> <string name="map_screen_orientation_descr">Stående, liggande eller som enheten.</string>
<string name="opening_hours_not_supported">Öppettider format stöds inte för redigering</string> <string name="opening_hours_not_supported">Det går inte att ändra format för öppettider.</string>
<string name="add_new_rule">Lägg till en ny regel</string> <string name="add_new_rule">Lägg till en ny regel</string>
<string name="transport_Routes">Rutter</string> <string name="transport_Routes">Rutter</string>
<string name="transport_Stop">Hållplats</string> <string name="transport_Stop">Hållplats</string>
@ -654,8 +654,8 @@
<string name="show_transport_over_map">Visa hållplatser</string> <string name="show_transport_over_map">Visa hållplatser</string>
<string name="hello">Navigationsappen OsmAnd</string> <string name="hello">Navigationsappen OsmAnd</string>
<string name="update_poi_success">POI-data uppdaterades ({0} lästes in)</string> <string name="update_poi_success">POI-data uppdaterades ({0} lästes in)</string>
<string name="update_poi_error_local">Fel vid uppdatering av lokal POI-lista</string> <string name="update_poi_error_local">Det gick inte att uppdatera den lokala POI-listan.</string>
<string name="update_poi_error_loading">Kunde inte läsa in data från servern</string> <string name="update_poi_error_loading">Kunde inte läsa in data från servern.</string>
<string name="update_poi_no_offline_poi_index">Inga offline POI-data tillgängliga för detta område</string> <string name="update_poi_no_offline_poi_index">Inga offline POI-data tillgängliga för detta område</string>
<string name="update_poi_is_not_available_for_zoom">Det går inte att uppdatera POI för små zoomnivåer</string> <string name="update_poi_is_not_available_for_zoom">Det går inte att uppdatera POI för små zoomnivåer</string>
<string name="context_menu_item_update_poi">Uppdatera intressepunkt</string> <string name="context_menu_item_update_poi">Uppdatera intressepunkt</string>
@ -699,7 +699,7 @@
<string name="loading_streets">Läser in gator…</string> <string name="loading_streets">Läser in gator…</string>
<string name="loading_cities">Läser in städer…</string> <string name="loading_cities">Läser in städer…</string>
<string name="poi">POI</string> <string name="poi">POI</string>
<string name="arrived_at_destination">Du har anlänt till din destination</string> <string name="arrived_at_destination">Du har anlänt.</string>
<string name="loading_data">Läser in data…</string> <string name="loading_data">Läser in data…</string>
<string name="reading_indexes">Läser lokala data …</string> <string name="reading_indexes">Läser lokala data …</string>
<string name="zxing_barcode_scanner_not_found">Appen ZXing Barcode Scanner är inte installerad. Vill du söka på Google Play?</string> <string name="zxing_barcode_scanner_not_found">Appen ZXing Barcode Scanner är inte installerad. Vill du söka på Google Play?</string>
@ -737,7 +737,7 @@
<string name="osb_comment_dialog_message">Meddelande</string> <string name="osb_comment_dialog_message">Meddelande</string>
<string name="osb_comment_dialog_author">Författarnamn</string> <string name="osb_comment_dialog_author">Författarnamn</string>
<string name="osb_comment_dialog_success">Kommentaren lades till utan problem</string> <string name="osb_comment_dialog_success">Kommentaren lades till utan problem</string>
<string name="osb_comment_dialog_error">Ett undantagsfel inträffade: kommentaren lades inte till</string> <string name="osb_comment_dialog_error">Det gick inte att lägga till kommentar.</string>
<string name="poi_edit_title">Redigera POI</string> <string name="poi_edit_title">Redigera POI</string>
<string name="poi_create_title">Skapa POI</string> <string name="poi_create_title">Skapa POI</string>
<string name="poi_remove_confirm_template">Ta bort {0} (ange kommentar)?</string> <string name="poi_remove_confirm_template">Ta bort {0} (ange kommentar)?</string>
@ -750,7 +750,7 @@
<string name="recording_context_menu_arecord">Gör en ljudanteckning</string> <string name="recording_context_menu_arecord">Gör en ljudanteckning</string>
<string name="recording_context_menu_vrecord">Gör en videoanteckning</string> <string name="recording_context_menu_vrecord">Gör en videoanteckning</string>
<string name="layer_recordings">Inspelningsskikt</string> <string name="layer_recordings">Inspelningsskikt</string>
<string name="recording_can_not_be_played">Inspelningen kan inte spelas upp</string> <string name="recording_can_not_be_played">Det gick inte att spela upp inspelningen.</string>
<string name="recording_context_menu_delete">Ta bort inspelningen</string> <string name="recording_context_menu_delete">Ta bort inspelningen</string>
<string name="recording_context_menu_play">Spela upp</string> <string name="recording_context_menu_play">Spela upp</string>
<string name="recording_description">Inspelning %1$s %3$s %2$s</string> <string name="recording_description">Inspelning %1$s %3$s %2$s</string>
@ -786,9 +786,9 @@
<string name="dropbox_plugin_description">Dropbox-modulen låter dig synkronisera spår och ljud-/videoanteckningar med ditt Dropbox-konto.</string> <string name="dropbox_plugin_description">Dropbox-modulen låter dig synkronisera spår och ljud-/videoanteckningar med ditt Dropbox-konto.</string>
<string name="srtm_paid_version_msg">Köp gärna pluginen Höjdkurvor på Market för att stödja fortsatt utveckling.</string> <string name="srtm_paid_version_msg">Köp gärna pluginen Höjdkurvor på Market för att stödja fortsatt utveckling.</string>
<string name="av_def_action_audio">Spela in ljud</string> <string name="av_def_action_audio">Spela in ljud</string>
<string name="av_widget_action_descr">Välj standardåtgärd för widget.</string> <string name="av_widget_action_descr">Standardåtgärd för widget:</string>
<string name="av_widget_action">Standardåtgärd för widget</string> <string name="av_widget_action">Standardåtgärd för widget</string>
<string name="av_video_format_descr">Välj videoformat.</string> <string name="av_video_format_descr">Videoformat:</string>
<string name="av_video_format">Videoformat</string> <string name="av_video_format">Videoformat</string>
<string name="av_use_external_recorder_descr">Använd systemets inspelare för video.</string> <string name="av_use_external_recorder_descr">Använd systemets inspelare för video.</string>
<string name="av_use_external_recorder">Använd systemets inspelare</string> <string name="av_use_external_recorder">Använd systemets inspelare</string>
@ -811,10 +811,10 @@
<string name="auth_failed">Åtkomst nekades</string> <string name="auth_failed">Åtkomst nekades</string>
<string name="failed_op">misslyckades</string> <string name="failed_op">misslyckades</string>
<string name="converting_names">Konverterar inhemska/engelska namn…</string> <string name="converting_names">Konverterar inhemska/engelska namn…</string>
<string name="error_occurred_saving_gpx">Ett fel uppstod när GPX sparades</string> <string name="error_occurred_saving_gpx">Det gick inte att spara GPX-filen.</string>
<string name="error_calculating_route">Fel vid ruttberäkningen</string> <string name="error_calculating_route">Det gick inte att beräkna rutten.</string>
<string name="error_calculating_route_occured">Ett fel uppstod vid ruttberäkningen</string> <string name="error_calculating_route_occured">Det gick inte att beräkna rutten.</string>
<string name="empty_route_calculated">Fel: Den beräknade rutten är tom</string> <string name="empty_route_calculated">Den beräknade rutten är tom.</string>
<string name="invalid_locations">Ogiltiga koordinater</string> <string name="invalid_locations">Ogiltiga koordinater</string>
<string name="go_back_to_osmand">Tillbaka till OsmAnd-kartan</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="previous_run_crashed">Den senaste körningen av OsmAnd kraschade. Loggen finns i {0}. Rapportera felet och bifoga gärna loggfilen.</string>
@ -830,7 +830,7 @@
<string name="save_current_track_descr">Spara aktuellt spår till SD-kortet nu.</string> <string name="save_current_track_descr">Spara aktuellt spår till SD-kortet nu.</string>
<string name="save_current_track">Spara aktuellt GPX-spår</string> <string name="save_current_track">Spara aktuellt GPX-spår</string>
<string name="save_track_interval">Loggningsintervall under navigering</string> <string name="save_track_interval">Loggningsintervall under navigering</string>
<string name="save_track_interval_descr">Välj loggningsintervall för inspelning av spår under navigering.</string> <string name="save_track_interval_descr">Ange loggningsintervallet för spårinspelning under navigering</string>
<string name="save_track_to_gpx_descrp">Ett GPX-spår sparas automatiskt i spårmappen under navigering.</string> <string name="save_track_to_gpx_descrp">Ett GPX-spår sparas automatiskt i spårmappen under navigering.</string>
<string name="save_track_to_gpx">Spela in spår automatiskt under navigering</string> <string name="save_track_to_gpx">Spela in spår automatiskt under navigering</string>
<string name="update_tile">Uppdatera kartan</string> <string name="update_tile">Uppdatera kartan</string>
@ -928,7 +928,7 @@
<string name="search_street_in_neighborhood_cities">Sök gator i grannstäder</string> <string name="search_street_in_neighborhood_cities">Sök gator i grannstäder</string>
<string name="intermediate_items_sort_return">Mellanliggande mål ordnade för att optimera deras ordning från aktuell position till destinationen.</string> <string name="intermediate_items_sort_return">Mellanliggande mål ordnade för att optimera deras ordning från aktuell position till destinationen.</string>
<string name="intermediate_items_sort_by_distance">Sortera dörr-till-dörr</string> <string name="intermediate_items_sort_by_distance">Sortera dörr-till-dörr</string>
<string name="local_osm_changes_backup_failed">Säkerhetskopieringen av OSM-ändringar misslyckades</string> <string name="local_osm_changes_backup_failed">Det gick inte att säkerhetskopiera OSM-ändringar.</string>
<string name="local_osm_changes_backup">Säkerhetskopiera som OSM-förändring</string> <string name="local_osm_changes_backup">Säkerhetskopiera som OSM-förändring</string>
<string name="delete_point">Ta bort punkt</string> <string name="delete_point">Ta bort punkt</string>
<string name="plugin_distance_point_time">tid</string> <string name="plugin_distance_point_time">tid</string>
@ -996,7 +996,7 @@
<string name="maps_define_edit">Definiera/Redigera …</string> <string name="maps_define_edit">Definiera/Redigera …</string>
<string name="base_world_map">Baskarta (världen)</string> <string name="base_world_map">Baskarta (världen)</string>
<string name="av_camera_focus">Typ av kamerafokus</string> <string name="av_camera_focus">Typ av kamerafokus</string>
<string name="av_camera_focus_descr">Välj läge för intern kamerafokus.</string> <string name="av_camera_focus_descr">Kamerafokusläge:</string>
<string name="av_camera_focus_auto">Autofokus</string> <string name="av_camera_focus_auto">Autofokus</string>
<string name="av_camera_focus_hiperfocal">Hyperfokal fokus</string> <string name="av_camera_focus_hiperfocal">Hyperfokal fokus</string>
<string name="av_camera_focus_edof">Utökat skärpedjup (EDOF)</string> <string name="av_camera_focus_edof">Utökat skärpedjup (EDOF)</string>
@ -1038,11 +1038,11 @@
<string name="calculate_osmand_route_gpx">Beräkna OsmAnd offline-rutt</string> <string name="calculate_osmand_route_gpx">Beräkna OsmAnd offline-rutt</string>
<string name="app_mode_truck">Lastbil</string> <string name="app_mode_truck">Lastbil</string>
<string name="routing_attr_prefer_motorway_name">Föredra motorvägar</string> <string name="routing_attr_prefer_motorway_name">Föredra motorvägar</string>
<string name="routing_attr_prefer_motorway_description">Föredra motorvägar.</string> <string name="routing_attr_prefer_motorway_description">Föredra motorvägar</string>
<string name="routing_attr_avoid_toll_name">Undvik vägtullar</string> <string name="routing_attr_avoid_toll_name">Undvik vägtullar</string>
<string name="routing_attr_avoid_toll_description">Undvik vägtullar</string> <string name="routing_attr_avoid_toll_description">Undvik vägtullar</string>
<string name="routing_attr_avoid_unpaved_name">Undvik oasfalterade vägar</string> <string name="routing_attr_avoid_unpaved_name">Undvik oasfalterade vägar</string>
<string name="routing_attr_avoid_unpaved_description">Undvik oasfalterade vägar.</string> <string name="routing_attr_avoid_unpaved_description">Undvik oasfalterade vägar</string>
<string name="routing_attr_avoid_ferries_name">Undvik färjor</string> <string name="routing_attr_avoid_ferries_name">Undvik färjor</string>
<string name="routing_attr_avoid_ferries_description">Undvik färjor</string> <string name="routing_attr_avoid_ferries_description">Undvik färjor</string>
<string name="routing_attr_avoid_motorway_name">Undvik motorvägar</string> <string name="routing_attr_avoid_motorway_name">Undvik motorvägar</string>
@ -1219,7 +1219,7 @@
<string name="arrival_distance_factor_late">Sent</string> <string name="arrival_distance_factor_late">Sent</string>
<string name="arrival_distance_factor_at_last">De sista metrarna</string> <string name="arrival_distance_factor_at_last">De sista metrarna</string>
<string name="av_camera_pic_size">Fotostorlek</string> <string name="av_camera_pic_size">Fotostorlek</string>
<string name="av_camera_pic_size_descr">Välj fotostorlek för den interna kameran.</string> <string name="av_camera_pic_size_descr">Ställ in kamerans bildstorlek</string>
<string name="rendering_value_car_name">Bil</string> <string name="rendering_value_car_name">Bil</string>
<string name="rendering_value_bicycle_name">Cykel</string> <string name="rendering_value_bicycle_name">Cykel</string>
<string name="rendering_value_pedestrian_name">Fotgängare</string> <string name="rendering_value_pedestrian_name">Fotgängare</string>
@ -1347,8 +1347,8 @@
<string name="get_plugin">Hämta</string> <string name="get_plugin">Hämta</string>
<string name="plugin_ski_name">Skidkartsvy</string> <string name="plugin_ski_name">Skidkartsvy</string>
<string name="plugin_nautical_name">Sjökortsvy</string> <string name="plugin_nautical_name">Sjökortsvy</string>
<string name="world_ski_missing">För att kunna visa skidkartor måste den speciella offline-kartan hämtas</string> <string name="world_ski_missing">Ladda ner den speciella offline-kartan för att visa skidåkning.</string>
<string name="nautical_maps_missing">För att kunna visa sjökort måste den speciella offline-kartan hämtas</string> <string name="nautical_maps_missing">Ladda ner den speciella offline-kartan för att visa nautiska detaljer.</string>
<string name="rendering_attr_pisteGrooming_name">Pist- och spårpreparering</string> <string name="rendering_attr_pisteGrooming_name">Pist- och spårpreparering</string>
<string name="free">Ledigt %1$s</string> <string name="free">Ledigt %1$s</string>
<string name="device_memory">Intern lagring</string> <string name="device_memory">Intern lagring</string>
@ -1639,7 +1639,7 @@
<string name="favorite_category_select">Välj kategori</string> <string name="favorite_category_select">Välj kategori</string>
<string name="count_of_lines">Antal rader</string> <string name="count_of_lines">Antal rader</string>
<string name="nm">di</string> <string name="nm">di</string>
<string name="nm_h">M</string> <string name="nm_h">knop</string>
<string name="min_mile">min/mi</string> <string name="min_mile">min/mi</string>
<string name="min_km">min/km</string> <string name="min_km">min/km</string>
<string name="m_s">m/s</string> <string name="m_s">m/s</string>
@ -1722,12 +1722,12 @@
<string name="osn_reopen_dialog_title">Öppna anteckning igen</string> <string name="osn_reopen_dialog_title">Öppna anteckning igen</string>
<string name="osn_close_dialog_title">Stäng anteckning</string> <string name="osn_close_dialog_title">Stäng anteckning</string>
<string name="osn_add_dialog_success">En anteckning har skapats utan problem</string> <string name="osn_add_dialog_success">En anteckning har skapats utan problem</string>
<string name="osn_add_dialog_error">Ett undantag uppstod: anteckningen skapades inte</string> <string name="osn_add_dialog_error">Det gick inte att skapa anteckningen.</string>
<string name="osn_close_dialog_success">Anteckningen stängdes utan problem</string> <string name="osn_close_dialog_success">Anteckningen stängdes utan problem</string>
<string name="osn_close_dialog_error">Ett undantag uppstod: anteckningen stängdes inte</string> <string name="osn_close_dialog_error">Det gick inte att stänga anteckningen.</string>
<string name="context_menu_item_delete_waypoint">Ta bort GPX-waypoint?</string> <string name="context_menu_item_delete_waypoint">Ta bort GPX-waypoint?</string>
<string name="context_menu_item_edit_waypoint">Redigera GPX-waypoint</string> <string name="context_menu_item_edit_waypoint">Redigera GPX-waypoint</string>
<string name="access_from_map_description">Menyknapp visar panelen och inte menyn.</string> <string name="access_from_map_description">Menyknappen startar instrumentpanelen snarare än menyn</string>
<string name="access_from_map">Tillgång från kartan</string> <string name="access_from_map">Tillgång från kartan</string>
<string name="rendering_attr_currentTrackColor_description">GPX-färg</string> <string name="rendering_attr_currentTrackColor_description">GPX-färg</string>
<string name="rendering_attr_currentTrackWidth_description">GPX-bredd</string> <string name="rendering_attr_currentTrackWidth_description">GPX-bredd</string>
@ -1766,7 +1766,7 @@
<string name="route_distance">Avstånd:</string> <string name="route_distance">Avstånd:</string>
<string name="route_duration">Tid:</string> <string name="route_duration">Tid:</string>
<string name="missing_write_external_storage_permission">Appen har inte tillåtelse att använda SD-kortet</string> <string name="missing_write_external_storage_permission">Appen har inte tillåtelse att använda SD-kortet</string>
<string name="no_location_permission">Appen saknar behörigheter för att komma åt platsdata.</string> <string name="no_location_permission">Ge platsåtkomst.</string>
<string name="no_camera_permission">Appen har inte tillräckliga behörigheter för att komma åt kameran.</string> <string name="no_camera_permission">Appen har inte tillräckliga behörigheter för att komma åt kameran.</string>
<string name="no_microphone_permission">Appen har inte tillräckliga behörigheter för att komma åt mikrofonen.</string> <string name="no_microphone_permission">Appen har inte tillräckliga behörigheter för att komma åt mikrofonen.</string>
<string name="select_voice_provider">Välj röstvägledning</string> <string name="select_voice_provider">Välj röstvägledning</string>
@ -1785,7 +1785,7 @@
<string name="weekly">Varje vecka</string> <string name="weekly">Varje vecka</string>
<string name="morning">Morgon</string> <string name="morning">Morgon</string>
<string name="shared_string_not_selected">Inte markerad</string> <string name="shared_string_not_selected">Inte markerad</string>
<string name="select_month_and_country">Välj månad och land</string> <string name="select_month_and_country">Månad och land:</string>
<string name="shared_string_type">Typ</string> <string name="shared_string_type">Typ</string>
<string name="starting_point">Startpunkt</string> <string name="starting_point">Startpunkt</string>
<string name="item_removed">Post borttagen</string> <string name="item_removed">Post borttagen</string>
@ -1846,7 +1846,7 @@
<string name="osm_live_user_public_name">Publikt namn</string> <string name="osm_live_user_public_name">Publikt namn</string>
<string name="osm_live_hide_user_name">Visa inte mitt namn i rapporter</string> <string name="osm_live_hide_user_name">Visa inte mitt namn i rapporter</string>
<string name="osm_live_month_cost">Månadskostnad</string> <string name="osm_live_month_cost">Månadskostnad</string>
<string name="osm_live_month_cost_desc">Månadsbetalning.</string> <string name="osm_live_month_cost_desc">Månadsbetalning</string>
<string name="osm_live_active">Aktiv</string> <string name="osm_live_active">Aktiv</string>
<string name="osm_live_not_active">Inaktiv</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_email">Ange en giltig e-postadress</string>
@ -2141,13 +2141,13 @@
<string name="select_city">Välj stad</string> <string name="select_city">Välj stad</string>
<string name="select_postcode">Välj postnummer</string> <string name="select_postcode">Välj postnummer</string>
<string name="quick_action_auto_zoom">Autozoomning på/av</string> <string name="quick_action_auto_zoom">Autozoomning på/av</string>
<string name="quick_action_showhide_osmbugs_descr">Ett tryck på denna åtgärdsknapp visar eller döljer OSM-anteckningar på kartan.</string> <string name="quick_action_showhide_osmbugs_descr">Knapp för att visa eller dölja OSM-anteckningar på kartan.</string>
<string name="restart_search">Starta om sökningen</string> <string name="restart_search">Starta om sökningen</string>
<string name="increase_search_radius">Utöka sökradien</string> <string name="increase_search_radius">Utöka sökradien</string>
<string name="nothing_found">Hittade ingenting</string> <string name="nothing_found">Hittade ingenting</string>
<string name="nothing_found_descr">Ändra sökord eller utöka sökradien.</string> <string name="nothing_found_descr">Ändra sökningen eller utöka sökradien.</string>
<string name="sorted_by_distance">Sorterat efter avstånd</string> <string name="sorted_by_distance">Sorterat efter avstånd</string>
<string name="search_favorites">Sök Favoriter</string> <string name="search_favorites">Sök i Favoriter</string>
<string name="shared_string_plugin">Insticksmodul</string> <string name="shared_string_plugin">Insticksmodul</string>
<string name="srtm_color_scheme">Färgschema</string> <string name="srtm_color_scheme">Färgschema</string>
<string name="favorite_group_name">Gruppnamn</string> <string name="favorite_group_name">Gruppnamn</string>
@ -2162,12 +2162,12 @@
<string name="shared_string_visible">Synlig</string> <string name="shared_string_visible">Synlig</string>
<string name="online_photos">Online-foton</string> <string name="online_photos">Online-foton</string>
<string name="shared_string_add_photos">Lägg till foton</string> <string name="shared_string_add_photos">Lägg till foton</string>
<string name="no_photos_descr">Vi har inga foton från denna plats.</string> <string name="no_photos_descr">Inga foton här.</string>
<string name="mapillary_widget">Mapillary-widget</string> <string name="mapillary_widget">Mapillary-widget</string>
<string name="mapillary">Mapillary</string> <string name="mapillary">Mapillary</string>
<string name="shared_string_install">Installera</string> <string name="shared_string_install">Installera</string>
<string name="shared_string_permissions">Tillstånd</string> <string name="shared_string_permissions">Tillstånd</string>
<string name="import_gpx_failed_descr">OsmAnd kan inte importera filen. Kolla om OsmAnd har tillåtelse att läsa filen från sin plats.</string> <string name="import_gpx_failed_descr">Kan inte importera filen. Kolla om OsmAnd har tillåtelse att läsa filen.</string>
<string name="distance_moving">Distansen korrigerad</string> <string name="distance_moving">Distansen korrigerad</string>
<string name="enter_new_name">Ange nytt namn</string> <string name="enter_new_name">Ange nytt namn</string>
<string name="shared_string_back">Bakåt</string> <string name="shared_string_back">Bakåt</string>
@ -2179,15 +2179,15 @@
<string name="round_trip">Rundtur</string> <string name="round_trip">Rundtur</string>
<string name="make_round_trip">Gör en rundtur</string> <string name="make_round_trip">Gör en rundtur</string>
<string name="shared_string_markers">Markörer</string> <string name="shared_string_markers">Markörer</string>
<string name="routing_attr_avoid_ice_roads_fords_name">Undvik isvägar och vadställen</string> <string name="routing_attr_avoid_ice_roads_fords_name">Inga isvägar eller vadställen</string>
<string name="routing_attr_avoid_ice_roads_fords_description">Undvik isvägar och vadställen.</string> <string name="routing_attr_avoid_ice_roads_fords_description">Undviker isvägar och vadställen.</string>
<string name="my_location">Min plats</string> <string name="my_location">Min plats</string>
<string name="shared_string_sort">Sortera</string> <string name="shared_string_sort">Sortera</string>
<string name="move_to_history">Flytta till historiken</string> <string name="move_to_history">Flytta till historiken</string>
<string name="show_arrows_on_the_map">Visa pilar på kartan</string> <string name="show_arrows_on_the_map">Visa pilar på kartan</string>
<string name="show_passed">Visa passerade</string> <string name="show_passed">Visa passerade</string>
<string name="hide_passed">Dölj passerade</string> <string name="hide_passed">Dölj passerade</string>
<string name="remove_from_map_markers">Tag bort från kartmarkörer\'</string> <string name="remove_from_map_markers">Tag bort från \'Kartmarkörer\'</string>
<string name="shared_string_list">Lista</string> <string name="shared_string_list">Lista</string>
<string name="shared_string_groups">Grupper</string> <string name="shared_string_groups">Grupper</string>
<string name="passed">Senast använt: %1$s</string> <string name="passed">Senast använt: %1$s</string>
@ -2229,12 +2229,12 @@
<string name="plan_route">Planera rutt</string> <string name="plan_route">Planera rutt</string>
<string name="marker_save_as_track_descr">Exportera dina markörer till följande GPX-fil:</string> <string name="marker_save_as_track_descr">Exportera dina markörer till följande GPX-fil:</string>
<string name="group_will_be_removed_after_restart">Gruppen kommer att försvinna nästa gång du startar appen.</string> <string name="group_will_be_removed_after_restart">Gruppen kommer att försvinna nästa gång du startar appen.</string>
<string name="date_added">Datum tillagd</string> <string name="date_added">Tillagd</string>
<string name="order_by">Ordna efter:</string> <string name="order_by">Ordna efter:</string>
<string name="all_markers_moved_to_history">Alla kartmarkörer har flyttats till historiken</string> <string name="all_markers_moved_to_history">Alla kartmarkörer har flyttats till historiken</string>
<string name="marker_moved_to_history">Kartmarkören har flyttats till historiken</string> <string name="marker_moved_to_history">Kartmarkören har flyttats till historiken</string>
<string name="do_not_use_animations">Inga animeringar</string> <string name="do_not_use_animations">Inga animeringar</string>
<string name="do_not_use_animations_descr">Inaktiverar animeringar i appen.</string> <string name="do_not_use_animations_descr">Stänger av kartanimationer.</string>
<string name="line">Linje</string> <string name="line">Linje</string>
<string name="save_as_route_point">Spara som ruttpunkter</string> <string name="save_as_route_point">Spara som ruttpunkter</string>
<string name="save_as_line">Spara som linje</string> <string name="save_as_line">Spara som linje</string>
@ -2245,14 +2245,14 @@
<string name="measurement_tool_save_as_new_track_descr">Spara punkterna antingen som ruttpunkter eller som en linje.</string> <string name="measurement_tool_save_as_new_track_descr">Spara punkterna antingen som ruttpunkter eller som en linje.</string>
<string name="none_point_error">Lägg till minst en punkt.</string> <string name="none_point_error">Lägg till minst en punkt.</string>
<string name="show_on_map_after_saving">Visa på kartan när den sparats</string> <string name="show_on_map_after_saving">Visa på kartan när den sparats</string>
<string name="quick_action_resume_pause_navigation_descr">Peta på denna knapp för att pausa eller fortsätta med navigeringen.</string> <string name="quick_action_resume_pause_navigation_descr">Knapp för att pausa eller fortsätta med navigeringen.</string>
<string name="quick_action_start_stop_navigation_descr">Peta på denna knapp för att starta eller avsluta navigeringen.</string> <string name="quick_action_start_stop_navigation_descr">Knapp för att starta eller avsluta navigeringen.</string>
<string name="mapillary_image">Mapillary-bild</string> <string name="mapillary_image">Mapillary-bild</string>
<string name="open_mapillary">Öppna Mapillary</string> <string name="open_mapillary">Öppna Mapillary</string>
<string name="improve_coverage_mapillary">Förbättra fototäckning med Mapillary</string> <string name="improve_coverage_mapillary">Förbättra fototäckning med Mapillary</string>
<string name="mapillary_widget_descr">Möjliggör snabba bidrag till Mapillary.</string> <string name="mapillary_widget_descr">Möjliggör snabba bidrag till Mapillary.</string>
<string name="descendingly">nedåt</string> <string name="descendingly">Z-A</string>
<string name="ascendingly">uppåt</string> <string name="ascendingly">A-Z</string>
<string name="marker_moved_to_active">Kartmarkören flyttad till aktiva</string> <string name="marker_moved_to_active">Kartmarkören flyttad till aktiva</string>
<string name="move_all_to_history">Flytta alla till historiken</string> <string name="move_all_to_history">Flytta alla till historiken</string>
<string name="keep_showing_on_map">Fortsätt att visa på kartan</string> <string name="keep_showing_on_map">Fortsätt att visa på kartan</string>
@ -2268,9 +2268,9 @@
<string name="import_file">Importera fil</string> <string name="import_file">Importera fil</string>
<string name="wrong_input">Felaktig inmatning</string> <string name="wrong_input">Felaktig inmatning</string>
<string name="waypoints_added_to_map_markers">Waypoints tillagda i kartmarkörer</string> <string name="waypoints_added_to_map_markers">Waypoints tillagda i kartmarkörer</string>
<string name="make_round_trip_descr">Lägg till kopia av startpunkten som destination.</string> <string name="make_round_trip_descr">Lägg till kopia av avgångspunkten som destination.</string>
<string name="fast_coordinates_input">Snabbinmatning av koordinater</string> <string name="fast_coordinates_input">Snabbinmatning av koordinater</string>
<string name="add_location_as_first_point_descr">Lägg till din position som första punkt för att planera den perfekta rutten.</string> <string name="add_location_as_first_point_descr">Lägg till din position som avgångspunkt för att planera den perfekta rutten.</string>
<string name="coordinate_input">Koordinatinmatning</string> <string name="coordinate_input">Koordinatinmatning</string>
<string name="modify_the_search_query">Ändra sökningen.</string> <string name="modify_the_search_query">Ändra sökningen.</string>
<string name="empty_state_osm_edits">Skapa eller ändra OSM-objekt</string> <string name="empty_state_osm_edits">Skapa eller ändra OSM-objekt</string>
@ -2380,18 +2380,18 @@
<string name="measurement_tool_snap_to_road_descr">Charlott ansluter punkter med vägar för den valda profilen.</string> <string name="measurement_tool_snap_to_road_descr">Charlott ansluter punkter med vägar för den valda profilen.</string>
<string name="mapillary_menu_descr_tile_cache">Uppdatera rutor för att se aktuell data.</string> <string name="mapillary_menu_descr_tile_cache">Uppdatera rutor för att se aktuell data.</string>
<string name="mapillary_menu_title_tile_cache">Tile-cache</string> <string name="mapillary_menu_title_tile_cache">Tile-cache</string>
<string name="mapillary_menu_filter_description">Filtrera bilderna enligt inlämnare eller datum. Filter tillämpas endast för närbildszoom.</string> <string name="mapillary_menu_filter_description">Filtrera bilder efter avsändare, efter datum eller typ. Endast aktiv i närbildszoom.</string>
<string name="map_widget_ruler_control">Radielinjal</string> <string name="map_widget_ruler_control">Radielinjal</string>
<string name="improve_coverage_install_mapillary_desc">Installera Mapillary för att lägga till en eller flera bilder till denna plats på kartan.</string> <string name="improve_coverage_install_mapillary_desc">Installera Mapillary för att lägga till bilder till denna plats på kartan.</string>
<string name="mapillary_action_descr">Bidra med din egen gatnivåvy på denna plats via Mapillary.</string> <string name="mapillary_action_descr">Dela din vy på gatunivå via Mapillary.</string>
<string name="mapillary_descr">Online gatunivåbilder för alla. Upptäck platser, samarbeta, fånga världen.</string> <string name="mapillary_descr">Online gatunivåbilder för alla. Upptäck platser, samarbeta, fånga världen.</string>
<string name="plugin_mapillary_descr">Gatunivå bilder för alla. Upptäck platser, samarbeta, fånga världen.</string> <string name="plugin_mapillary_descr">Gatunivå bilder för alla. Upptäck platser, samarbeta, fånga världen.</string>
<string name="private_access_routing_req">Din destination är belägen i ett område med privat tillträde. Tillåt tillgång till privata vägar för denna resa?</string> <string name="private_access_routing_req">Din destination är belägen i ett område med privat tillträde. Tillåt anvädning av privata vägar för denna resa\?</string>
<string name="hillshade_menu_download_descr">För att se relief-höjdskuggning på kartan, hämta höjdskuggskartan för denna region.</string> <string name="hillshade_menu_download_descr">Ladda ner \'Hillshade\' överläggskartan för att visa vertikal skuggning.</string>
<string name="hillshade_purchase_header">För att se höjdskuggningsrelief på kartan, behöver du köpa och installera insticksmodulen \'Konturlinjer\'</string> <string name="hillshade_purchase_header">Installera plugin-programmet \'Contour lines\' för att visa graderade vertikala områden.</string>
<string name="hide_from_zoom_level">Dölja från zoom-nivå</string> <string name="hide_from_zoom_level">Dölj start från zoomnivå</string>
<string name="srtm_menu_download_descr">Hämta \'konturlinjekarta\' över denna region.</string> <string name="srtm_menu_download_descr">Ladda ner kartan \"Konturlinje\" för användning i denna region.</string>
<string name="srtm_purchase_header">För att se höjdkurvor på kartan, behöver du köpa och installera insticksmodulen \'Konturlinjer\'</string> <string name="srtm_purchase_header">Köp och installera pluginprogrammet \'Contour lines\' för att visa graderade vertikala områden.</string>
<string name="show_from_zoom_level">Visa från zoom-nivå</string> <string name="show_from_zoom_level">Visa från zoom-nivå</string>
<string name="routing_attr_allow_private_name">Tillåt privat åtkomst</string> <string name="routing_attr_allow_private_name">Tillåt privat åtkomst</string>
<string name="routing_attr_allow_private_description">Tillåta åtkomst till privata områden.</string> <string name="routing_attr_allow_private_description">Tillåta åtkomst till privata områden.</string>
@ -2692,7 +2692,7 @@
\nFrån Afghanistan till Zimbabwe, från Australien till USA. Argentina, Brasilien, Kanada, Frankrike, Tyskland, Mexiko, Storbritannien, Spanien, ... \nFrån Afghanistan till Zimbabwe, från Australien till USA. Argentina, Brasilien, Kanada, Frankrike, Tyskland, Mexiko, Storbritannien, Spanien, ...
\n</string> \n</string>
<string name="quick_action_bug_descr">Detta meddelande ingår i kommentarsfältet.</string> <string name="quick_action_bug_descr">Detta meddelande ingår i kommentarsfältet.</string>
<string name="quick_action_category_descr">Välj kategorin du vill spara favoriten i.</string> <string name="quick_action_category_descr">Kategori för att spara favoriten i:</string>
<string name="quick_action_gpx_category_descr">Välj en valfri kategori.</string> <string name="quick_action_gpx_category_descr">Välj en valfri kategori.</string>
<string name="quick_action_poi_list">POI-lista</string> <string name="quick_action_poi_list">POI-lista</string>
<string name="quick_action_sh_poi_descr">Lägga till en eller flera POI-kategorier som ska visas på kartan.</string> <string name="quick_action_sh_poi_descr">Lägga till en eller flera POI-kategorier som ska visas på kartan.</string>

View file

@ -425,7 +425,7 @@
<string name="fav_file_to_load_not_found">GPX-файл з Закладками не знайдено в {0}</string> <string name="fav_file_to_load_not_found">GPX-файл з Закладками не знайдено в {0}</string>
<string name="fav_saved_sucessfully">Закладки збережено в {0}</string> <string name="fav_saved_sucessfully">Закладки збережено в {0}</string>
<string name="no_fav_to_save">Відсутні точки Закладок для збереження</string> <string name="no_fav_to_save">Відсутні точки Закладок для збереження</string>
<string name="shared_string_import">Імпортувати</string> <string name="shared_string_import">Імпорт</string>
<string name="error_occurred_loading_gpx">Не вдалося завантажити GPX.</string> <string name="error_occurred_loading_gpx">Не вдалося завантажити GPX.</string>
<string name="send_report">Надіслати звіт</string> <string name="send_report">Надіслати звіт</string>
<string name="none_region_found">Не знайдено завантаженої мапи на карті пам\'яті.</string> <string name="none_region_found">Не знайдено завантаженої мапи на карті пам\'яті.</string>
@ -3851,7 +3851,7 @@
<string name="login_account">Обліковий запис</string> <string name="login_account">Обліковий запис</string>
<string name="user_login">Ім\'я користувача</string> <string name="user_login">Ім\'я користувача</string>
<string name="sign_in_with_open_street_map">Увійти за допомогою OpenStreetMap</string> <string name="sign_in_with_open_street_map">Увійти за допомогою OpenStreetMap</string>
<string name="markers_history">Історія маркерів</string> <string name="markers_history">Історія позначок</string>
<string name="send_files_to_openstreetmap">Надіслати файл GPX на OpenStreetMap</string> <string name="send_files_to_openstreetmap">Надіслати файл GPX на OpenStreetMap</string>
<string name="enter_text_separated">Введіть мітки через коми.</string> <string name="enter_text_separated">Введіть мітки через коми.</string>
<string name="gpx_upload_public_visibility_descr">«Загальнодоступне» означає, що трасування показано загальнодоступно у ваших GPS-трасуваннях та у загальнодоступних списках GPS-трасування, а також у загальнодоступному списку трасування з позначками часу в необробленому вигляді.. Дані, що подаються через API, не посилаються на вашу сторінку трасування. Мітки часу точок трасування недоступні через загальнодоступний API GPS і не впорядковані хронологічно.</string> <string name="gpx_upload_public_visibility_descr">«Загальнодоступне» означає, що трасування показано загальнодоступно у ваших GPS-трасуваннях та у загальнодоступних списках GPS-трасування, а також у загальнодоступному списку трасування з позначками часу в необробленому вигляді.. Дані, що подаються через API, не посилаються на вашу сторінку трасування. Мітки часу точок трасування недоступні через загальнодоступний API GPS і не впорядковані хронологічно.</string>
@ -4084,5 +4084,4 @@
<string name="announce_when_exceeded">Повідомляти про перевищення</string> <string name="announce_when_exceeded">Повідомляти про перевищення</string>
<string name="user_points">Користувацькі точки</string> <string name="user_points">Користувацькі точки</string>
<string name="output">Вивід</string> <string name="output">Вивід</string>
<string name="map_quick_action_pattern">%1$s → …</string>
</resources> </resources>

View file

@ -3924,4 +3924,6 @@
<string name="poi_jiu_jitsu">柔術</string> <string name="poi_jiu_jitsu">柔術</string>
<string name="poi_karate">空手道</string> <string name="poi_karate">空手道</string>
<string name="poi_hoops">籃圈</string> <string name="poi_hoops">籃圈</string>
<string name="poi_office_diplomatic">外交部</string>
<string name="poi_bay_filter">海灣類型</string>
</resources> </resources>

View file

@ -4074,4 +4074,9 @@
<string name="on_hold">保留</string> <string name="on_hold">保留</string>
<string name="expired">過期</string> <string name="expired">過期</string>
<string name="update_all_maps_added">更新所有新增至 %1$s 的地圖?</string> <string name="update_all_maps_added">更新所有新增至 %1$s 的地圖?</string>
<string name="exit_number">出口編號</string>
<string name="announce_when_exceeded">超過時宣佈</string>
<string name="user_points">使用者點</string>
<string name="output">輸出</string>
<string name="map_quick_action_pattern">%1$s → …</string>
</resources> </resources>

View file

@ -12,7 +12,6 @@
--> -->
<string name="map_quick_action_pattern">%1$s → …</string>
<string name="output">Output</string> <string name="output">Output</string>
<string name="user_points">User points</string> <string name="user_points">User points</string>
<string name="announce_when_exceeded">Announce when exceeded</string> <string name="announce_when_exceeded">Announce when exceeded</string>

View file

@ -70,6 +70,13 @@
android:summary="@string/play_commands_of_currently_selected_voice" android:summary="@string/play_commands_of_currently_selected_voice"
android:title="@string/test_voice_prompts" /> android:title="@string/test_voice_prompts" />
<Preference
android:key="test_backup"
android:layout="@layout/preference_with_descr"
android:persistent="false"
android:summary="Register and backup/restore tracks and favorites"
android:title="Test backup" />
<Preference <Preference
android:key="logcat_buffer" android:key="logcat_buffer"
android:layout="@layout/preference_with_descr" android:layout="@layout/preference_with_descr"

View file

@ -3,6 +3,7 @@ package net.osmand;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.util.Pair;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -33,8 +34,10 @@ import java.net.URLEncoder;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.zip.GZIPOutputStream; import java.util.zip.GZIPOutputStream;
public class AndroidNetworkUtils { public class AndroidNetworkUtils {
@ -46,6 +49,13 @@ public class AndroidNetworkUtils {
void onResult(String result); void onResult(String result);
} }
public interface OnFilesUploadCallback {
@Nullable
Map<String, String> getAdditionalParams(@NonNull File file);
void onFileUploadProgress(@NonNull File file, int percent);
void onFilesUploadDone(@NonNull Map<File, String> errors);
}
public static class RequestResponse { public static class RequestResponse {
private Request request; private Request request;
private String response; private String response;
@ -156,7 +166,7 @@ public class AndroidNetworkUtils {
String params = null; String params = null;
if (parameters != null && parameters.size() > 0) { if (parameters != null && parameters.size() > 0) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : parameters.entrySet()) { for (Entry<String, String> entry : parameters.entrySet()) {
if (sb.length() > 0) { if (sb.length() > 0) {
sb.append("&"); sb.append("&");
} }
@ -296,16 +306,18 @@ public class AndroidNetworkUtils {
private static final String BOUNDARY = "CowMooCowMooCowCowCow"; private static final String BOUNDARY = "CowMooCowMooCowCowCow";
public static String uploadFile(String urlText, File file, boolean gzip, Map<String, String> additionalParams) throws IOException { public static String uploadFile(@NonNull String urlText, @NonNull File file, boolean gzip,
return uploadFile(urlText, new FileInputStream(file), file.getName(), gzip, additionalParams); @NonNull Map<String, String> additionalParams, @Nullable Map<String, String> headers) throws IOException {
return uploadFile(urlText, new FileInputStream(file), file.getName(), gzip, additionalParams, headers);
} }
public static String uploadFile(String urlText, InputStream inputStream, String fileName, boolean gzip, Map<String, String> additionalParams) { public static String uploadFile(@NonNull String urlText, @NonNull InputStream inputStream, @NonNull String fileName, boolean gzip,
Map<String, String> additionalParams, @Nullable Map<String, String> headers) {
URL url; URL url;
try { try {
boolean firstPrm = !urlText.contains("?"); boolean firstPrm = !urlText.contains("?");
StringBuilder sb = new StringBuilder(urlText); StringBuilder sb = new StringBuilder(urlText);
for (Map.Entry<String, String> entry : additionalParams.entrySet()) { for (Entry<String, String> entry : additionalParams.entrySet()) {
sb.append(firstPrm ? "?" : "&").append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "UTF-8")); sb.append(firstPrm ? "?" : "&").append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "UTF-8"));
firstPrm = false; firstPrm = false;
} }
@ -320,6 +332,11 @@ public class AndroidNetworkUtils {
conn.setRequestMethod("POST"); conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
conn.setRequestProperty("User-Agent", "OsmAnd"); conn.setRequestProperty("User-Agent", "OsmAnd");
if (headers != null) {
for (Entry<String, String> header : headers.entrySet()) {
conn.setRequestProperty(header.getKey(), header.getValue());
}
}
OutputStream ous = conn.getOutputStream(); OutputStream ous = conn.getOutputStream();
ous.write(("--" + BOUNDARY + "\r\n").getBytes()); ous.write(("--" + BOUNDARY + "\r\n").getBytes());
@ -376,6 +393,58 @@ public class AndroidNetworkUtils {
} }
} }
public static void uploadFilesAsync(final @NonNull String url,
final @NonNull List<File> files,
final boolean gzip,
final @NonNull Map<String, String> parameters,
final @Nullable Map<String, String> headers,
final OnFilesUploadCallback callback) {
new AsyncTask<Void, Object, Map<File, String>>() {
@Override
@NonNull
protected Map<File, String> doInBackground(Void... v) {
Map<File, String> errors = new HashMap<>();
for (File file : files) {
publishProgress(file, 0);
try {
Map<String, String> params = new HashMap<>(parameters);
if (callback != null) {
Map<String, String> additionalParams = callback.getAdditionalParams(file);
if (additionalParams != null) {
params.putAll(additionalParams);
}
}
String res = uploadFile(url, file, gzip, params, headers);
if (res != null) {
errors.put(file, res);
}
} catch (Exception e) {
errors.put(file, e.getMessage());
}
publishProgress(file, 100);
}
return errors;
}
@Override
protected void onProgressUpdate(Object... objects) {
if (callback != null) {
callback.onFileUploadProgress((File) objects[0], (Integer) objects[1]);
}
}
@Override
protected void onPostExecute(@NonNull Map<File, String> errors) {
if (callback != null) {
callback.onFilesUploadDone(errors);
}
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null);
}
private static void showToast(OsmandApplication ctx, String message) { private static void showToast(OsmandApplication ctx, String message) {
ctx.showToastMessage(message); ctx.showToastMessage(message);
} }

View file

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

View file

@ -155,7 +155,7 @@ public class AudioNotesLayer extends OsmandMapLayer implements
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return false; return false;
} }
@ -169,6 +169,11 @@ public class AudioNotesLayer extends OsmandMapLayer implements
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
@Override @Override
public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> objects, boolean unknownLocation) { public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> objects, boolean unknownLocation) {
if (tileBox.getZoom() >= startZoom) { if (tileBox.getZoom() >= startZoom) {

View file

@ -48,6 +48,7 @@ public class DevelopmentSettingsFragment extends BaseSettingsFragment {
setupSimulateInitialStartupPref(); setupSimulateInitialStartupPref();
setupShouldShowFreeVersionBannerPref(); setupShouldShowFreeVersionBannerPref();
setupTestVoiceCommandsPref(); setupTestVoiceCommandsPref();
setupTestBackupsPref();
setupLogcatBufferPref(); setupLogcatBufferPref();
Preference info = findPreference("info"); Preference info = findPreference("info");
@ -117,6 +118,12 @@ public class DevelopmentSettingsFragment extends BaseSettingsFragment {
testVoiceCommands.setIconSpaceReserved(false); testVoiceCommands.setIconSpaceReserved(false);
} }
private void setupTestBackupsPref() {
Preference testBackups = findPreference("test_backup");
testBackups.setIntent(new Intent(getActivity(), TestBackupActivity.class));
testBackups.setIconSpaceReserved(false);
}
private void setupLogcatBufferPref() { private void setupLogcatBufferPref() {
Preference logcatBuffer = findPreference("logcat_buffer"); Preference logcatBuffer = findPreference("logcat_buffer");
logcatBuffer.setIntent(new Intent(getActivity(), LogcatActivity.class)); logcatBuffer.setIntent(new Intent(getActivity(), LogcatActivity.class));

View file

@ -0,0 +1,595 @@
package net.osmand.plus.development;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Patterns;
import android.util.TypedValue;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import net.osmand.AndroidNetworkUtils;
import net.osmand.AndroidNetworkUtils.OnFilesUploadCallback;
import net.osmand.AndroidNetworkUtils.OnRequestResultListener;
import net.osmand.AndroidUtils;
import net.osmand.IndexConstants;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.ProgressImplementation;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.UiUtilities.DialogButtonType;
import net.osmand.plus.activities.OsmandActionBarActivity;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.util.Algorithms;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestBackupActivity extends OsmandActionBarActivity {
// TODO pass actual sub order id!
private static final String TEST_ORDER_ID = "";
private OsmandApplication app;
private OsmandSettings settings;
private ProgressBar progressBar;
private View buttonRegister;
private View buttonVerify;
private View buttonBackup;
private View buttonRestore;
private EditText emailEditText;
private EditText tokenEditText;
private TextView infoView;
public interface OnResultListener {
void onResult(boolean success, @Nullable String result);
}
@Override
public void onCreate(Bundle savedInstanceState) {
app = getMyApplication();
settings = app.getSettings();
final WeakReference<TestBackupActivity> activityRef = new WeakReference<>(this);
boolean nightMode = !app.getSettings().isLightContent();
int themeId = nightMode ? R.style.OsmandDarkTheme_NoActionbar : R.style.OsmandLightTheme_NoActionbar;
setTheme(themeId);
super.onCreate(savedInstanceState);
setContentView(R.layout.test_backup_layout);
Toolbar tb = findViewById(R.id.toolbar);
tb.setTitle("Backup test");
tb.setClickable(true);
Drawable icBack = ((OsmandApplication) getApplication()).getUIUtilities().getIcon(AndroidUtils.getNavigationIconResId(app));
tb.setNavigationIcon(icBack);
tb.setNavigationContentDescription(R.string.access_shared_string_navigate_up);
tb.setBackgroundColor(getResources().getColor(resolveResourceId(this, R.attr.pstsTabBackground)));
tb.setTitleTextColor(getResources().getColor(resolveResourceId(this, R.attr.pstsTextColor)));
tb.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
finish();
}
});
buttonRegister = findViewById(R.id.btn_register);
UiUtilities.setupDialogButton(nightMode, buttonRegister, DialogButtonType.PRIMARY, "Register");
buttonVerify = findViewById(R.id.btn_verify);
UiUtilities.setupDialogButton(nightMode, buttonVerify, DialogButtonType.PRIMARY, "Verify");
buttonBackup = findViewById(R.id.btn_backup);
UiUtilities.setupDialogButton(nightMode, buttonBackup, DialogButtonType.PRIMARY, "Backup");
buttonRestore = findViewById(R.id.btn_restore);
UiUtilities.setupDialogButton(nightMode, buttonRestore, DialogButtonType.PRIMARY, "Restore");
tokenEditText = findViewById(R.id.edit_token);
infoView = findViewById(R.id.text_info);
progressBar = findViewById(R.id.progress_bar);
buttonVerify.setEnabled(false);
emailEditText = findViewById(R.id.edit_email);
String email = settings.BACKUP_USER_EMAIL.get();
if (!Algorithms.isEmpty(email)) {
emailEditText.setText(email);
}
buttonRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String email = emailEditText.getText().toString();
if (isEmailValid(email)) {
buttonRegister.setEnabled(false);
settings.BACKUP_USER_EMAIL.set(email);
progressBar.setVisibility(View.VISIBLE);
registerUser(email, new OnResultListener() {
@Override
public void onResult(boolean success, @Nullable String result) {
TestBackupActivity a = activityRef.get();
if (AndroidUtils.isActivityNotDestroyed(a)) {
a.progressBar.setVisibility(View.GONE);
a.buttonRegister.setEnabled(!success);
a.buttonVerify.setEnabled(success);
a.tokenEditText.requestFocus();
}
}
});
} else {
emailEditText.requestFocus();
emailEditText.setError(getString(R.string.osm_live_enter_email));
}
}
});
buttonVerify.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String token = tokenEditText.getText().toString();
if (isTokenValid(token)) {
buttonVerify.setEnabled(false);
progressBar.setVisibility(View.VISIBLE);
registerDevice(token, new OnResultListener() {
@Override
public void onResult(boolean success, @Nullable String result) {
TestBackupActivity a = activityRef.get();
if (AndroidUtils.isActivityNotDestroyed(a)) {
a.progressBar.setVisibility(View.GONE);
a.buttonVerify.setEnabled(!success);
a.loadBackupInfo();
}
}
});
} else {
tokenEditText.requestFocus();
tokenEditText.setError("Token is not valid");
buttonVerify.setEnabled(true);
}
}
});
buttonBackup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
uploadFiles();
}
});
buttonRestore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
loadBackupInfo();
}
private void loadBackupInfo() {
if (!Algorithms.isEmpty(getDeviceId()) && !Algorithms.isEmpty(getAccessToken())) {
final WeakReference<TestBackupActivity> activityRef = new WeakReference<>(this);
progressBar.setVisibility(View.VISIBLE);
loadBackupInfo(new OnResultListener() {
@Override
public void onResult(boolean success, @Nullable String result) {
TestBackupActivity a = activityRef.get();
if (AndroidUtils.isActivityNotDestroyed(a)) {
a.progressBar.setVisibility(View.GONE);
a.infoView.setText(result);
a.infoView.requestFocus();
}
}
});
}
}
private boolean isEmailValid(CharSequence target) {
return (!TextUtils.isEmpty(target) && Patterns.EMAIL_ADDRESS.matcher(target).matches());
}
private String getOrderId() {
return TEST_ORDER_ID;
}
private String getDeviceId() {
return settings.BACKUP_DEVICE_ID.get();
}
private String getAccessToken() {
return settings.BACKUP_ACCESS_TOKEN.get();
}
private void registerUser(@NonNull String email, @Nullable final OnResultListener listener) {
Map<String, String> params = new HashMap<>();
params.put("email", email);
params.put("orderid", getOrderId());
params.put("deviceid", app.getUserAndroidId());
AndroidNetworkUtils.sendRequestAsync(app, "https://osmand.net/userdata/user-register", params, "Register user", true, true, new OnRequestResultListener() {
@Override
public void onResult(String resultJson) {
boolean success = false;
if (!Algorithms.isEmpty(resultJson)) {
try {
// {"status":"ok"}
JSONObject result = new JSONObject(resultJson);
String status = result.getString("status");
success = status.equals("ok");
app.showToastMessage(success
? "You have been registered successfully. Please check for email with activation code."
: "User registration error: " + status);
} catch (JSONException e) {
app.showToastMessage("User registration error: json parsing");
}
} else {
app.showToastMessage("User registration error: empty response");
}
if (listener != null) {
listener.onResult(success, resultJson);
}
}
});
}
private void registerDevice(String token, @Nullable final OnResultListener listener) {
Map<String, String> params = new HashMap<>();
params.put("email", settings.BACKUP_USER_EMAIL.get());
params.put("orderid", getOrderId());
params.put("deviceid", app.getUserAndroidId());
params.put("token", token);
AndroidNetworkUtils.sendRequestAsync(app, "https://osmand.net/userdata/device-register", params, "Register device", true, true, new OnRequestResultListener() {
@Override
public void onResult(String resultJson) {
boolean success = false;
if (!Algorithms.isEmpty(resultJson)) {
try {
/*
{
"id": 1034,
"userid": 1033,
"deviceid": "2fa8080d2985a777",
"orderid": "460000687003939",
"accesstoken": "4bc0a61f-397a-4c3e-9ffc-db382ec00372",
"udpatetime": "Apr 11, 2021, 11:32:20 AM"
}
*/
JSONObject result = new JSONObject(resultJson);
settings.BACKUP_DEVICE_ID.set(result.getString("id"));
settings.BACKUP_USER_ID.set(result.getString("userid"));
settings.BACKUP_NATIVE_DEVICE_ID.set(result.getString("deviceid"));
settings.BACKUP_ACCESS_TOKEN.set(result.getString("accesstoken"));
settings.BACKUP_ACCESS_TOKEN_UPDATE_TIME.set(result.getString("udpatetime"));
success = true;
app.showToastMessage("Device have been registered successfully");
} catch (JSONException e) {
app.showToastMessage("Device registration error: json parsing");
}
} else {
app.showToastMessage("Device registration error: empty response");
}
if (listener != null) {
listener.onResult(success, resultJson);
}
}
});
}
private void uploadFiles() {
LoadGpxTask loadGpxTask = new LoadGpxTask(this, new LoadGpxTask.OnLoadGpxListener() {
@Override
public void onLoadGpxDone(@NonNull List<GpxInfo> result) {
uploadFiles(result);
}
});
loadGpxTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, this);
}
private void uploadFiles(List<GpxInfo> gpxFiles) {
//{"status":"ok"}
final WeakReference<TestBackupActivity> activityRef = new WeakReference<>(this);
Map<String, String> params = new HashMap<>();
params.put("deviceid", getDeviceId());
params.put("accessToken", getAccessToken());
Map<String, String> headers = new HashMap<>();
headers.put("Accept-Encoding", "deflate, gzip");
final Map<File, GpxInfo> gpxInfos = new HashMap<>();
for (GpxInfo gpxFile : gpxFiles) {
gpxInfos.put(gpxFile.file, gpxFile);
}
final List<File> files = new ArrayList<>(gpxInfos.keySet());
File favoritesFile = app.getFavorites().getExternalFile();
files.add(favoritesFile);
final ProgressImplementation progress = ProgressImplementation.createProgressDialog(this,
"Create backup", "Uploading " + files.size() + " file(s) to server", ProgressDialog.STYLE_HORIZONTAL);
AndroidNetworkUtils.uploadFilesAsync("https://osmand.net/userdata/upload-file", files, true, params, headers, new OnFilesUploadCallback() {
@Nullable
@Override
public Map<String, String> getAdditionalParams(@NonNull File file) {
GpxInfo gpxInfo = gpxInfos.get(file);
Map<String, String> additionaParams = new HashMap<>();
additionaParams.put("name", gpxInfo == null ? file.getName() : gpxInfo.getFileName(true));
additionaParams.put("type", Algorithms.getFileExtension(file));
return additionaParams;
}
@Override
public void onFileUploadProgress(@NonNull File file, int percent) {
Activity a = activityRef.get();
if (AndroidUtils.isActivityNotDestroyed(a)) {
if (percent < 100) {
progress.startTask(file.getName(), percent);
} else {
progress.finishTask();
}
}
}
@Override
public void onFilesUploadDone(@NonNull Map<File, String> errors) {
Activity a = activityRef.get();
if (AndroidUtils.isActivityNotDestroyed(a)) {
app.runInUIThread(new Runnable() {
@Override
public void run() {
try {
if (progress.getDialog().isShowing()) {
progress.getDialog().dismiss();
}
} catch (Exception e) {
//ignored
}
}
}, 300);
app.showToastMessage("Uploaded " + (files.size() - errors.size() + " files" +
(errors.size() > 0 ? ". Errors: " + errors.size() : "")));
loadBackupInfo();
}
}
});
}
private void loadBackupInfo(@Nullable final OnResultListener listener) {
Map<String, String> params = new HashMap<>();
params.put("deviceid", getDeviceId());
params.put("accessToken", getAccessToken());
AndroidNetworkUtils.sendRequestAsync(app, "https://osmand.net/userdata/list-files", params, "Get backup info", true, false, new OnRequestResultListener() {
@Override
public void onResult(String resultJson) {
boolean success = false;
StringBuilder resultString = new StringBuilder();
if (!Algorithms.isEmpty(resultJson)) {
try {
/*
{
"totalZipSize": 21792,
"totalFileSize": 185920,
"totalFiles": 1,
"totalFileVersions": 2,
"uniqueFiles": [
{
"userid": 1033,
"id": 7,
"deviceid": 1034,
"filesize": 92960,
"type": "gpx",
"name": "test/Day 2.gpx",
"updatetime": "Apr 11, 2021, 1:49:01 PM",
"updatetimems": 1618141741822,
"zipSize": 10896
}
],
"deviceid": 1034
}
*/
JSONObject result = new JSONObject(resultJson);
String totalZipSize = result.getString("totalZipSize");
String totalFiles = result.getString("totalFiles");
String totalFileVersions = result.getString("totalFileVersions");
JSONArray files = result.getJSONArray("uniqueFiles");
resultString.append("Total files: ").append(totalFiles).append("\n");
resultString.append("Total zip size: ").append(AndroidUtils.formatSize(app, Long.parseLong(totalZipSize))).append("\n");
resultString.append("Total file versions: ").append(totalFileVersions);
success = true;
} catch (JSONException e) {
}
}
if (listener != null) {
listener.onResult(success, resultString.toString());
}
}
});
}
private boolean isTokenValid(String token) {
return token.matches("[0-9]+");
}
private int resolveResourceId(final Activity activity, final int attr) {
final TypedValue typedvalueattr = new TypedValue();
activity.getTheme().resolveAttribute(attr, typedvalueattr, true);
return typedvalueattr.resourceId;
}
private static class LoadGpxTask extends AsyncTask<Activity, GpxInfo, List<GpxInfo>> {
private final OsmandApplication app;
private final OnLoadGpxListener listener;
private final WeakReference<Activity> activityRef;
private List<GpxInfo> result;
private ProgressImplementation progress;
interface OnLoadGpxListener {
void onLoadGpxDone(@NonNull List<GpxInfo> result);
}
LoadGpxTask(@NonNull Activity activity, @Nullable OnLoadGpxListener listener) {
this.activityRef = new WeakReference<>(activity);
this.app = (OsmandApplication) activity.getApplication();
this.listener = listener;
}
public List<GpxInfo> getResult() {
return result;
}
@NonNull
@Override
protected List<GpxInfo> doInBackground(Activity... params) {
List<GpxInfo> result = new ArrayList<>();
loadGPXData(app.getAppPath(IndexConstants.GPX_INDEX_DIR), result, this);
return result;
}
public void loadFile(GpxInfo... loaded) {
publishProgress(loaded);
}
@Override
protected void onPreExecute() {
Activity a = activityRef.get();
if (AndroidUtils.isActivityNotDestroyed(a)) {
progress = ProgressImplementation.createProgressDialog(a,
"Create backup", "Collecting gpx files...", ProgressDialog.STYLE_HORIZONTAL);
}
}
@Override
protected void onProgressUpdate(GpxInfo... values) {
Activity a = activityRef.get();
if (AndroidUtils.isActivityNotDestroyed(a)) {
progress.startTask(values[0].getFileName(true), -1);
}
}
@Override
protected void onPostExecute(@NonNull List<GpxInfo> result) {
this.result = result;
if (listener != null) {
listener.onLoadGpxDone(result);
}
Activity a = activityRef.get();
if (AndroidUtils.isActivityNotDestroyed(a)) {
progress.finishTask();
app.runInUIThread(new Runnable() {
@Override
public void run() {
try {
if (progress.getDialog().isShowing()) {
progress.getDialog().dismiss();
}
} catch (Exception e) {
//ignored
}
}
}, 300);
}
}
private void loadGPXData(File mapPath, List<GpxInfo> result, LoadGpxTask loadTask) {
if (mapPath.canRead()) {
List<GpxInfo> progress = new ArrayList<>();
loadGPXFolder(mapPath, result, loadTask, progress, "");
if (!progress.isEmpty()) {
loadTask.loadFile(progress.toArray(new GpxInfo[0]));
}
}
}
private void loadGPXFolder(File mapPath, List<GpxInfo> result, LoadGpxTask loadTask, List<GpxInfo> progress,
String gpxSubfolder) {
File[] listFiles = mapPath.listFiles();
if (listFiles != null) {
for (File gpxFile : listFiles) {
if (gpxFile.isDirectory()) {
String sub = gpxSubfolder.length() == 0 ? gpxFile.getName() : gpxSubfolder + "/"
+ gpxFile.getName();
loadGPXFolder(gpxFile, result, loadTask, progress, sub);
} else if (gpxFile.isFile() && gpxFile.getName().toLowerCase().endsWith(IndexConstants.GPX_FILE_EXT)) {
GpxInfo info = new GpxInfo();
info.subfolder = gpxSubfolder;
info.file = gpxFile;
result.add(info);
progress.add(info);
if (progress.size() > 7) {
loadTask.loadFile(progress.toArray(new GpxInfo[0]));
progress.clear();
}
}
}
}
}
}
private static class GpxInfo {
public File file;
public String subfolder;
private String name = null;
private int sz = -1;
private String fileName = null;
public String getName() {
if (name == null) {
name = formatName(file.getName());
}
return name;
}
private String formatName(String name) {
int ext = name.lastIndexOf('.');
if (ext != -1) {
name = name.substring(0, ext);
}
return name.replace('_', ' ');
}
// Usage: AndroidUtils.formatSize(v.getContext(), getSize() * 1024l);
public int getSize() {
if (sz == -1) {
if (file == null) {
return -1;
}
sz = (int) ((file.length() + 512) >> 10);
}
return sz;
}
public long getFileDate() {
if (file == null) {
return 0;
}
return file.lastModified();
}
public String getFileName(boolean includeSubfolder) {
String result;
if (fileName != null) {
result = fileName;
} else {
if (file == null) {
result = "";
} else {
result = fileName = file.getName();
}
}
if (includeSubfolder && !Algorithms.isEmpty(subfolder)) {
result = subfolder + "/" + result;
}
return result;
}
}
}

View file

@ -18,8 +18,8 @@ import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.PluginsFragment; import net.osmand.plus.activities.PluginsFragment;
import net.osmand.plus.dashboard.DashboardOnMap.DashboardType; import net.osmand.plus.dashboard.DashboardOnMap.DashboardType;
import net.osmand.plus.mapmarkers.MapMarkersDialogFragment;
import net.osmand.plus.itinerary.ItineraryGroup; import net.osmand.plus.itinerary.ItineraryGroup;
import net.osmand.plus.mapmarkers.MapMarkersDialogFragment;
import net.osmand.plus.mapsource.EditMapSourceDialogFragment; import net.osmand.plus.mapsource.EditMapSourceDialogFragment;
import net.osmand.plus.openplacereviews.OPRConstants; import net.osmand.plus.openplacereviews.OPRConstants;
import net.osmand.plus.openplacereviews.OprAuthHelper.OprAuthorizationListener; import net.osmand.plus.openplacereviews.OprAuthHelper.OprAuthorizationListener;
@ -259,7 +259,7 @@ public class IntentHelper {
String path = intent.getStringExtra(TRACK_FILE_NAME); String path = intent.getStringExtra(TRACK_FILE_NAME);
String name = intent.getStringExtra(RETURN_SCREEN_NAME); String name = intent.getStringExtra(RETURN_SCREEN_NAME);
boolean currentRecording = intent.getBooleanExtra(CURRENT_RECORDING, false); boolean currentRecording = intent.getBooleanExtra(CURRENT_RECORDING, false);
TrackMenuFragment.showInstance(mapActivity, path, currentRecording, null, name, null); TrackMenuFragment.showInstance(mapActivity, path, currentRecording, name, null);
mapActivity.setIntent(null); mapActivity.setIntent(null);
} }
} }

View file

@ -153,9 +153,11 @@ public class SelectedGpxMenuBuilder extends MenuBuilder {
OsmAndFormatter.getFormattedSpeed((float) selectedPoint.speed, app), 0, null, OsmAndFormatter.getFormattedSpeed((float) selectedPoint.speed, app), 0, null,
false, null, false, 0, false, false, false, null, false); false, null, false, 0, false, false, false, null, false);
} }
buildRow(view, getThemedIcon(R.drawable.ic_action_relative_bearing), null, app.getString(R.string.shared_string_bearing), if (!Float.isNaN(selectedGpxPoint.getBearing())) {
OsmAndFormatter.getFormattedAzimuth(selectedGpxPoint.getBearing(), app), 0, null, buildRow(view, getThemedIcon(R.drawable.ic_action_relative_bearing), null, app.getString(R.string.shared_string_bearing),
false, null, false, 0, false, false, false, null, false); OsmAndFormatter.getFormattedAzimuth(selectedGpxPoint.getBearing(), app), 0, null,
false, null, false, 0, false, false, false, null, false);
}
} }
private void buildCategoryView(View view, String name) { private void buildCategoryView(View view, String name) {

View file

@ -43,11 +43,8 @@ public class SelectedGpxMenuController extends MenuController {
@Override @Override
public void buttonPressed() { public void buttonPressed() {
mapContextMenu.close(); mapContextMenu.close();
WptPt wptPt = selectedGpxPoint.selectedPoint;
LatLon latLon = new LatLon(wptPt.lat, wptPt.lon);
SelectedGpxFile selectedGpxFile = selectedGpxPoint.getSelectedGpxFile(); SelectedGpxFile selectedGpxFile = selectedGpxPoint.getSelectedGpxFile();
String path = selectedGpxFile.getGpxFile().path; TrackMenuFragment.showInstance(mapActivity, selectedGpxFile, selectedGpxPoint, null, null, false);
TrackMenuFragment.showInstance(mapActivity, path, selectedGpxFile.isShowCurrentTrack(), latLon, null, null);
} }
}; };
leftTitleButtonController.caption = mapActivity.getString(R.string.shared_string_open_track); leftTitleButtonController.caption = mapActivity.getString(R.string.shared_string_open_track);
@ -215,11 +212,15 @@ public class SelectedGpxMenuController extends MenuController {
public static class SelectedGpxPoint { public static class SelectedGpxPoint {
private final WptPt prevPoint;
private final WptPt nextPoint;
private final WptPt selectedPoint; private final WptPt selectedPoint;
private final SelectedGpxFile selectedGpxFile; private final SelectedGpxFile selectedGpxFile;
private final float bearing; private final float bearing;
public SelectedGpxPoint(SelectedGpxFile selectedGpxFile, WptPt selectedPoint, float bearing) { public SelectedGpxPoint(SelectedGpxFile selectedGpxFile, WptPt selectedPoint, WptPt prevPoint, WptPt nextPoint, float bearing) {
this.prevPoint = prevPoint;
this.nextPoint = nextPoint;
this.selectedPoint = selectedPoint; this.selectedPoint = selectedPoint;
this.selectedGpxFile = selectedGpxFile; this.selectedGpxFile = selectedGpxFile;
this.bearing = bearing; this.bearing = bearing;
@ -236,5 +237,13 @@ public class SelectedGpxMenuController extends MenuController {
public float getBearing() { public float getBearing() {
return bearing; return bearing;
} }
public WptPt getPrevPoint() {
return prevPoint;
}
public WptPt getNextPoint() {
return nextPoint;
}
} }
} }

View file

@ -17,6 +17,7 @@ import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.PointImageDrawable; import net.osmand.plus.base.PointImageDrawable;
import net.osmand.plus.mapcontextmenu.MenuBuilder; import net.osmand.plus.mapcontextmenu.MenuBuilder;
import net.osmand.plus.mapcontextmenu.MenuController; import net.osmand.plus.mapcontextmenu.MenuController;
import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.SelectedGpxPoint;
import net.osmand.plus.mapmarkers.MapMarker; import net.osmand.plus.mapmarkers.MapMarker;
import net.osmand.plus.mapmarkers.MapMarkersHelper; import net.osmand.plus.mapmarkers.MapMarkersHelper;
import net.osmand.plus.track.TrackMenuFragment; import net.osmand.plus.track.TrackMenuFragment;
@ -49,8 +50,8 @@ public class WptPtMenuController extends MenuController {
GpxSelectionHelper selectionHelper = mapActivity.getMyApplication().getSelectedGpxHelper(); GpxSelectionHelper selectionHelper = mapActivity.getMyApplication().getSelectedGpxHelper();
SelectedGpxFile selectedGpxFile = selectionHelper.getSelectedGPXFile(wpt); SelectedGpxFile selectedGpxFile = selectionHelper.getSelectedGPXFile(wpt);
if (selectedGpxFile != null) { if (selectedGpxFile != null) {
String path = selectedGpxFile.getGpxFile().path; SelectedGpxPoint gpxPoint = new SelectedGpxPoint(selectedGpxFile, wpt, null, null, Float.NaN);
TrackMenuFragment.showInstance(mapActivity, path, selectedGpxFile.isShowCurrentTrack(), new LatLon(wpt.lon, wpt.lat), null, null); TrackMenuFragment.showInstance(mapActivity, selectedGpxFile, gpxPoint, null, null, false);
} }
} }
} }

View file

@ -23,7 +23,6 @@ import com.github.mikephil.charting.listener.OnChartGestureListener;
import com.github.mikephil.charting.listener.OnChartValueSelectedListener; import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.GPXTrackAnalysis; import net.osmand.GPXUtilities.GPXTrackAnalysis;
import net.osmand.GPXUtilities.TrkSegment; import net.osmand.GPXUtilities.TrkSegment;
@ -43,6 +42,7 @@ import net.osmand.plus.helpers.GpxUiHelper;
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType; import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetAxisType;
import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType; import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType;
import net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet; import net.osmand.plus.helpers.GpxUiHelper.OrderedLineDataSet;
import net.osmand.plus.myplaces.GPXItemPagerAdapter;
import net.osmand.plus.views.layers.GPXLayer; import net.osmand.plus.views.layers.GPXLayer;
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory; import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory;
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController; import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController;
@ -299,18 +299,7 @@ public class TrackDetailsMenu {
List<ILineDataSet> ds = lineData != null ? lineData.getDataSets() : null; List<ILineDataSet> ds = lineData != null ? lineData.getDataSets() : null;
GpxDisplayItem gpxItem = getGpxItem(); GpxDisplayItem gpxItem = getGpxItem();
if (ds != null && ds.size() > 0 && gpxItem != null) { if (ds != null && ds.size() > 0 && gpxItem != null) {
for (GPXUtilities.Track t : gpxItem.group.getGpx().tracks) { this.segment = GPXItemPagerAdapter.getSegmentForAnalysis(gpxItem, gpxItem.analysis);
for (TrkSegment s : t.segments) {
if (s.points.size() > 0 && s.points.get(0).equals(gpxItem.analysis.locationStart)) {
segment = s;
break;
}
}
if (segment != null) {
break;
}
}
this.segment = segment;
} }
} }
return segment; return segment;
@ -755,21 +744,21 @@ public class TrackDetailsMenu {
final List<GPXDataSetType[]> availableTypes = new ArrayList<>(); final List<GPXDataSetType[]> availableTypes = new ArrayList<>();
boolean hasSlopeChart = false; boolean hasSlopeChart = false;
if (analysis.hasElevationData) { if (analysis.hasElevationData) {
availableTypes.add(new GPXDataSetType[]{GPXDataSetType.ALTITUDE}); availableTypes.add(new GPXDataSetType[] {GPXDataSetType.ALTITUDE});
if (gpxItem.chartAxisType != GPXDataSetAxisType.TIME if (gpxItem.chartAxisType != GPXDataSetAxisType.TIME
&& gpxItem.chartAxisType != GPXDataSetAxisType.TIMEOFDAY) { && gpxItem.chartAxisType != GPXDataSetAxisType.TIMEOFDAY) {
availableTypes.add(new GPXDataSetType[]{GPXDataSetType.SLOPE}); availableTypes.add(new GPXDataSetType[] {GPXDataSetType.SLOPE});
} }
} }
if (analysis.hasSpeedData) { if (analysis.hasSpeedData) {
availableTypes.add(new GPXDataSetType[]{GPXDataSetType.SPEED}); availableTypes.add(new GPXDataSetType[] {GPXDataSetType.SPEED});
} }
if (analysis.hasElevationData && gpxItem.chartAxisType != GPXDataSetAxisType.TIME if (analysis.hasElevationData && gpxItem.chartAxisType != GPXDataSetAxisType.TIME
&& gpxItem.chartAxisType != GPXDataSetAxisType.TIMEOFDAY) { && gpxItem.chartAxisType != GPXDataSetAxisType.TIMEOFDAY) {
availableTypes.add(new GPXDataSetType[]{GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE}); availableTypes.add(new GPXDataSetType[] {GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE});
} }
if (analysis.hasElevationData && analysis.hasSpeedData) { if (analysis.hasElevationData && analysis.hasSpeedData) {
availableTypes.add(new GPXDataSetType[]{GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED}); availableTypes.add(new GPXDataSetType[] {GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED});
} }
for (GPXDataSetType t : gpxItem.chartTypes) { for (GPXDataSetType t : gpxItem.chartTypes) {

View file

@ -6,6 +6,7 @@ import android.graphics.Canvas;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.PointF; import android.graphics.PointF;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Coordinate;
@ -316,7 +317,7 @@ class MapillaryVectorLayer extends MapTileLayer implements MapillaryLayer, ICont
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return false; return false;
} }
@ -346,6 +347,11 @@ class MapillaryVectorLayer extends MapTileLayer implements MapillaryLayer, ICont
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
private void getImagesFromPoint(RotatedTileBox tb, PointF point, List<? super MapillaryImage> images) { private void getImagesFromPoint(RotatedTileBox tb, PointF point, List<? super MapillaryImage> images) {
Map<QuadPointDouble, Map> points = this.visiblePoints; Map<QuadPointDouble, Map> points = this.visiblePoints;
if (points != null) { if (points != null) {

View file

@ -7,6 +7,7 @@ import android.graphics.Paint;
import android.graphics.Path; import android.graphics.Path;
import android.graphics.PointF; import android.graphics.PointF;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import net.osmand.GPXUtilities.TrkSegment; import net.osmand.GPXUtilities.TrkSegment;
@ -502,7 +503,7 @@ public class MeasurementToolLayer extends OsmandMapLayer implements ContextMenuL
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return isInMeasurementMode(); return isInMeasurementMode();
} }
@ -516,6 +517,11 @@ public class MeasurementToolLayer extends OsmandMapLayer implements ContextMenuL
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
private Location getLocationFromLL(double lat, double lon) { private Location getLocationFromLL(double lat, double lon) {
Location l = new Location(""); Location l = new Location("");
l.setLatitude(lat); l.setLatitude(lat);

View file

@ -26,7 +26,6 @@ import com.github.mikephil.charting.listener.OnChartGestureListener;
import com.github.mikephil.charting.listener.OnChartValueSelectedListener; import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.GPXTrackAnalysis; import net.osmand.GPXUtilities.GPXTrackAnalysis;
import net.osmand.GPXUtilities.Track; import net.osmand.GPXUtilities.Track;
@ -34,7 +33,6 @@ import net.osmand.GPXUtilities.TrkSegment;
import net.osmand.GPXUtilities.WptPt; import net.osmand.GPXUtilities.WptPt;
import net.osmand.plus.GPXDatabase.GpxDataItem; import net.osmand.plus.GPXDatabase.GpxDataItem;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem; import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
@ -52,7 +50,6 @@ import net.osmand.plus.views.controls.WrapContentHeightViewPager.ViewAtPositionI
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils; import net.osmand.util.MapUtils;
import java.io.File;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
@ -181,17 +178,7 @@ public class GPXItemPagerAdapter extends PagerAdapter implements CustomTabProvid
LineData lineData = chart.getLineData(); LineData lineData = chart.getLineData();
List<ILineDataSet> ds = lineData != null ? lineData.getDataSets() : null; List<ILineDataSet> ds = lineData != null ? lineData.getDataSets() : null;
if (ds != null && ds.size() > 0) { if (ds != null && ds.size() > 0) {
for (GPXUtilities.Track t : gpxItem.group.getGpx().tracks) { segment = getSegmentForAnalysis(gpxItem, analysis);
for (TrkSegment s : t.segments) {
if (s.points.size() > 0 && s.points.get(0).equals(analysis.locationStart)) {
segment = s;
break;
}
}
if (segment != null) {
break;
}
}
} }
} }
return segment; return segment;
@ -741,6 +728,14 @@ public class GPXItemPagerAdapter extends PagerAdapter implements CustomTabProvid
} }
if (gpxItem.chartHighlightPos != -1) { if (gpxItem.chartHighlightPos != -1) {
chart.highlightValue(gpxItem.chartHighlightPos, 0); chart.highlightValue(gpxItem.chartHighlightPos, 0);
} else if (gpxItem.locationOnMap != null) {
LineData lineData = chart.getLineData();
List<ILineDataSet> ds = lineData != null ? lineData.getDataSets() : null;
if (ds != null && ds.size() > 0) {
OrderedLineDataSet dataSet = (OrderedLineDataSet) ds.get(0);
gpxItem.chartHighlightPos = (float) (gpxItem.locationOnMap.distance / dataSet.getDivX());
chart.highlightValue(gpxItem.chartHighlightPos, 0);
}
} }
} else { } else {
chart.highlightValue(null); chart.highlightValue(null);
@ -818,18 +813,7 @@ public class GPXItemPagerAdapter extends PagerAdapter implements CustomTabProvid
gpxItem.chartTypes[i] = orderedDataSet.getDataSetType(); gpxItem.chartTypes[i] = orderedDataSet.getDataSetType();
} }
if (gpxItem.chartHighlightPos != -1) { if (gpxItem.chartHighlightPos != -1) {
TrkSegment segment = null; TrkSegment segment = getSegmentForAnalysis(gpxItem, gpxItem.analysis);
for (Track t : gpxItem.group.getGpx().tracks) {
for (TrkSegment s : t.segments) {
if (s.points.size() > 0 && s.points.get(0).equals(gpxItem.analysis.locationStart)) {
segment = s;
break;
}
}
if (segment != null) {
break;
}
}
if (segment != null) { if (segment != null) {
OrderedLineDataSet dataSet = (OrderedLineDataSet) dataSets.get(0); OrderedLineDataSet dataSet = (OrderedLineDataSet) dataSets.get(0);
float distance = gpxItem.chartHighlightPos * dataSet.getDivX(); float distance = gpxItem.chartHighlightPos * dataSet.getDivX();
@ -849,7 +833,16 @@ public class GPXItemPagerAdapter extends PagerAdapter implements CustomTabProvid
} }
} }
private void openSplitIntervalScreen() { public static TrkSegment getSegmentForAnalysis(GpxDisplayItem gpxItem, GPXTrackAnalysis analysis) {
actionsListener.openSplitInterval(gpxItem, getTrkSegment()); for (Track track : gpxItem.group.getGpx().tracks) {
for (TrkSegment segment : track.segments) {
int size = segment.points.size();
if (size > 0 && segment.points.get(0).equals(analysis.locationStart)
&& segment.points.get(size - 1).equals(analysis.locationEnd)) {
return segment;
}
}
}
return null;
} }
} }

View file

@ -7,6 +7,7 @@ import android.view.View;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
@ -453,7 +454,7 @@ public class OsmBugsLayer extends OsmandMapLayer implements IContextMenuProvider
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return false; return false;
} }
@ -467,6 +468,11 @@ public class OsmBugsLayer extends OsmandMapLayer implements IContextMenuProvider
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
@Override @Override
public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> res, boolean unknownLocation) { public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> res, boolean unknownLocation) {
if (tileBox.getZoom() >= startZoom) { if (tileBox.getZoom() >= startZoom) {

View file

@ -180,7 +180,7 @@ public class OsmEditsLayer extends OsmandMapLayer implements ContextMenuLayer.IC
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return false; return false;
} }
@ -194,6 +194,11 @@ public class OsmEditsLayer extends OsmandMapLayer implements ContextMenuLayer.IC
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
@Override @Override
public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> o, boolean unknownLocation) { public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> o, boolean unknownLocation) {
if (tileBox.getZoom() >= startZoom) { if (tileBox.getZoom() >= startZoom) {

View file

@ -13,7 +13,6 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.ColorInt; import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes; import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import androidx.appcompat.widget.SwitchCompat; import androidx.appcompat.widget.SwitchCompat;
@ -32,10 +31,12 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import static net.osmand.AndroidUtils.isLayoutRtl;
public abstract class SwitchableAction<T> extends QuickAction { public abstract class SwitchableAction<T> extends QuickAction {
public static final String KEY_ID = "id"; public static final String KEY_ID = "id";
protected static final String KEY_DIALOG = "dialog"; protected static final String KEY_DIALOG = "dialog";
private transient EditText title; private transient EditText title;
@ -62,7 +63,7 @@ public abstract class SwitchableAction<T> extends QuickAction {
View view = LayoutInflater.from(parent.getContext()) View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.quick_action_switchable_action, parent, false); .inflate(R.layout.quick_action_switchable_action, parent, false);
final SwitchCompat showDialog = (SwitchCompat) view.findViewById(R.id.saveButton); final SwitchCompat showDialog = view.findViewById(R.id.saveButton);
if (!getParams().isEmpty()) { if (!getParams().isEmpty()) {
showDialog.setChecked(Boolean.valueOf(getParams().get(KEY_DIALOG))); showDialog.setChecked(Boolean.valueOf(getParams().get(KEY_DIALOG)));
} }
@ -74,7 +75,7 @@ public abstract class SwitchableAction<T> extends QuickAction {
} }
}); });
RecyclerView list = (RecyclerView) view.findViewById(R.id.list); RecyclerView list = view.findViewById(R.id.list);
adapter = new Adapter(activity, new QuickActionListFragment.OnStartDragListener() { adapter = new Adapter(activity, new QuickActionListFragment.OnStartDragListener() {
@Override @Override
public void onStartDrag(RecyclerView.ViewHolder viewHolder) { public void onStartDrag(RecyclerView.ViewHolder viewHolder) {
@ -92,9 +93,9 @@ public abstract class SwitchableAction<T> extends QuickAction {
list.setAdapter(adapter); list.setAdapter(adapter);
TextView dscrTitle = (TextView) view.findViewById(R.id.textDscrTitle); TextView dscrTitle = view.findViewById(R.id.textDscrTitle);
TextView dscrHint = (TextView) view.findViewById(R.id.textDscrHint); TextView dscrHint = view.findViewById(R.id.textDscrHint);
Button addBtn = (Button) view.findViewById(R.id.btnAdd); Button addBtn = view.findViewById(R.id.btnAdd);
dscrTitle.setText(parent.getContext().getString(getDiscrTitle()) + ":"); dscrTitle.setText(parent.getContext().getString(getDiscrTitle()) + ":");
dscrHint.setText(getDiscrHint()); dscrHint.setText(getDiscrHint());
@ -104,10 +105,18 @@ public abstract class SwitchableAction<T> extends QuickAction {
parent.addView(view); parent.addView(view);
} }
@Override
public String getActionText(OsmandApplication application) {
String item = getSelectedItem(application);
String arrowDirection = isLayoutRtl(application) ? "\u25c0" : "\u25b6";
return application.getString(R.string.ltr_or_rtl_combine_via_space, getTranslatedItemName(application, item), arrowDirection + "\u2026");
}
@Override @Override
public boolean fillParams(View root, MapActivity activity) { public boolean fillParams(View root, MapActivity activity) {
final RecyclerView list = (RecyclerView) root.findViewById(R.id.list); final RecyclerView list = root.findViewById(R.id.list);
final Adapter adapter = (Adapter) list.getAdapter(); final Adapter adapter = (Adapter) list.getAdapter();
boolean hasParams = adapter.itemsList != null && !adapter.itemsList.isEmpty(); boolean hasParams = adapter.itemsList != null && !adapter.itemsList.isEmpty();
@ -124,7 +133,7 @@ public abstract class SwitchableAction<T> extends QuickAction {
public abstract List<T> loadListFromParams(); public abstract List<T> loadListFromParams();
public abstract void executeWithParams(MapActivity activity, String params); public abstract void executeWithParams(MapActivity activity, String params);
public abstract String getTranslatedItemName(Context context, String item); public abstract String getTranslatedItemName(Context context, String item);
protected void showChooseDialog(FragmentManager fm) { protected void showChooseDialog(FragmentManager fm) {
@ -143,7 +152,7 @@ public abstract class SwitchableAction<T> extends QuickAction {
private List<T> itemsList = new ArrayList<>(); private List<T> itemsList = new ArrayList<>();
private final QuickActionListFragment.OnStartDragListener onStartDragListener; private final QuickActionListFragment.OnStartDragListener onStartDragListener;
private Context context; private final Context context;
public Adapter(Context context, QuickActionListFragment.OnStartDragListener onStartDragListener) { public Adapter(Context context, QuickActionListFragment.OnStartDragListener onStartDragListener) {
this.context = context; this.context = context;
@ -293,10 +302,10 @@ public abstract class SwitchableAction<T> extends QuickAction {
public ItemHolder(View itemView) { public ItemHolder(View itemView) {
super(itemView); super(itemView);
title = (TextView) itemView.findViewById(R.id.title); title = itemView.findViewById(R.id.title);
handleView = (ImageView) itemView.findViewById(R.id.handle_view); handleView = itemView.findViewById(R.id.handle_view);
closeBtn = (ImageView) itemView.findViewById(R.id.closeImageButton); closeBtn = itemView.findViewById(R.id.closeImageButton);
icon = (ImageView) itemView.findViewById(R.id.imageView); icon = itemView.findViewById(R.id.imageView);
} }
} }
} }

View file

@ -54,7 +54,7 @@ public class MapStyleAction extends SwitchableAction<String> {
if (current != null) { if (current != null) {
return current.getName(); return current.getName();
} else { } else {
return RendererRegistry.DEFAULT_RENDER; return RendererRegistry.DEFAULT_RENDER;
} }
} }
@ -77,7 +77,7 @@ public class MapStyleAction extends SwitchableAction<String> {
executeWithParams(activity, nextStyle); executeWithParams(activity, nextStyle);
} else { } else {
Toast.makeText(activity, R.string.quick_action_need_to_add_item_to_list, Toast.makeText(activity, R.string.quick_action_need_to_add_item_to_list,
Toast.LENGTH_LONG).show(); Toast.LENGTH_LONG).show();
} }
} }
@ -246,10 +246,4 @@ public class MapStyleAction extends SwitchableAction<String> {
: filters.get(0); : filters.get(0);
} }
@Override
public String getActionText(OsmandApplication application) {
String currentSource = application.getSettings().RENDERER.get();
return application.getString(R.string.map_quick_action_pattern, getTranslatedItemName(application, currentSource));
}
} }

View file

@ -27,6 +27,8 @@ import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import static net.osmand.AndroidUtils.isLayoutRtl;
public class SwitchProfileAction extends SwitchableAction<String> { public class SwitchProfileAction extends SwitchableAction<String> {
private final static String KEY_PROFILES = "profiles"; private final static String KEY_PROFILES = "profiles";
@ -230,4 +232,9 @@ public class SwitchProfileAction extends SwitchableAction<String> {
} }
} }
} }
@Override
public String getActionText(OsmandApplication application) {
return getName(application);
}
} }

View file

@ -15,13 +15,13 @@ import com.google.gson.reflect.TypeToken;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin; import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.UiUtilities; import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.quickaction.QuickAction; import net.osmand.plus.quickaction.QuickAction;
import net.osmand.plus.quickaction.QuickActionType; import net.osmand.plus.quickaction.QuickActionType;
import net.osmand.plus.quickaction.SwitchableAction; import net.osmand.plus.quickaction.SwitchableAction;
import net.osmand.plus.settings.backend.OsmandSettings;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
@ -59,7 +59,7 @@ public class MapOverlayAction extends SwitchableAction<Pair<String, String>> {
@Override @Override
public String getSelectedItem(OsmandApplication app) { public String getSelectedItem(OsmandApplication app) {
return app.getSettings().MAP_OVERLAY.get(); return app.getSettings().MAP_OVERLAY.get() != null ? app.getSettings().MAP_OVERLAY.get() : KEY_NO_OVERLAY;
} }
@Override @Override
@ -224,12 +224,4 @@ public class MapOverlayAction extends SwitchableAction<Pair<String, String>> {
getParams().put(KEY_DIALOG, Boolean.toString(((SwitchCompat) root.findViewById(R.id.saveButton)).isChecked())); getParams().put(KEY_DIALOG, Boolean.toString(((SwitchCompat) root.findViewById(R.id.saveButton)).isChecked()));
return super.fillParams(root, activity); return super.fillParams(root, activity);
} }
@Override
public String getActionText(OsmandApplication application) {
String currentSource = application.getSettings().MAP_OVERLAY.get() == null ? KEY_NO_OVERLAY
: application.getSettings().MAP_OVERLAY.get();
return application.getString(R.string.map_quick_action_pattern, getTranslatedItemName(application, currentSource));
}
} }

View file

@ -15,13 +15,13 @@ import com.google.gson.reflect.TypeToken;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin; import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.UiUtilities; import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.quickaction.QuickAction; import net.osmand.plus.quickaction.QuickAction;
import net.osmand.plus.quickaction.QuickActionType; import net.osmand.plus.quickaction.QuickActionType;
import net.osmand.plus.quickaction.SwitchableAction; import net.osmand.plus.quickaction.SwitchableAction;
import net.osmand.plus.settings.backend.OsmandSettings;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
@ -98,8 +98,8 @@ public class MapSourceAction extends SwitchableAction<Pair<String, String>> {
} }
Pair<String, String> currentSource = settings.MAP_ONLINE_DATA.get() Pair<String, String> currentSource = settings.MAP_ONLINE_DATA.get()
? new Pair<>(settings.MAP_TILE_SOURCES.get(), settings.MAP_TILE_SOURCES.get()) ? new Pair<>(settings.MAP_TILE_SOURCES.get(), settings.MAP_TILE_SOURCES.get())
: new Pair<>(LAYER_OSM_VECTOR, activity.getString(R.string.vector_data)); : new Pair<>(LAYER_OSM_VECTOR, activity.getString(R.string.vector_data));
Pair<String, String> nextSource = sources.get(0); Pair<String, String> nextSource = sources.get(0);
int index = sources.indexOf(currentSource); int index = sources.indexOf(currentSource);
@ -135,7 +135,7 @@ public class MapSourceAction extends SwitchableAction<Pair<String, String>> {
return item; return item;
} }
} }
@Override @Override
protected int getAddBtnText() { protected int getAddBtnText() {
return R.string.quick_action_map_source_action; return R.string.quick_action_map_source_action;
@ -214,13 +214,4 @@ public class MapSourceAction extends SwitchableAction<Pair<String, String>> {
getParams().put(KEY_DIALOG, Boolean.toString(((SwitchCompat) root.findViewById(R.id.saveButton)).isChecked())); getParams().put(KEY_DIALOG, Boolean.toString(((SwitchCompat) root.findViewById(R.id.saveButton)).isChecked()));
return super.fillParams(root, activity); return super.fillParams(root, activity);
} }
@Override
public String getActionText(OsmandApplication application) {
String currentSource = application.getSettings().MAP_ONLINE_DATA.get()
? application.getSettings().MAP_TILE_SOURCES.get()
: application.getString(R.string.vector_data);
return application.getString(R.string.map_quick_action_pattern, getTranslatedItemName(application, currentSource));
}
} }

View file

@ -59,7 +59,7 @@ public class MapUnderlayAction extends SwitchableAction<Pair<String, String>> {
@Override @Override
public String getSelectedItem(OsmandApplication app) { public String getSelectedItem(OsmandApplication app) {
return app.getSettings().MAP_UNDERLAY.get(); return app.getSettings().MAP_UNDERLAY.get() != null ? app.getSettings().MAP_UNDERLAY.get() : KEY_NO_UNDERLAY;
} }
@Override @Override
@ -103,7 +103,7 @@ public class MapUnderlayAction extends SwitchableAction<Pair<String, String>> {
int index = -1; int index = -1;
final String currentSource = settings.MAP_UNDERLAY.get() == null ? KEY_NO_UNDERLAY final String currentSource = settings.MAP_UNDERLAY.get() == null ? KEY_NO_UNDERLAY
: settings.MAP_UNDERLAY.get(); : settings.MAP_UNDERLAY.get();
for (int idx = 0; idx < sources.size(); idx++) { for (int idx = 0; idx < sources.size(); idx++) {
if (sources.get(idx).first.equals(currentSource)) { if (sources.get(idx).first.equals(currentSource)) {
@ -157,7 +157,7 @@ public class MapUnderlayAction extends SwitchableAction<Pair<String, String>> {
return item; return item;
} }
} }
@Override @Override
protected int getAddBtnText() { protected int getAddBtnText() {
return R.string.quick_action_map_underlay_action; return R.string.quick_action_map_underlay_action;
@ -226,12 +226,4 @@ public class MapUnderlayAction extends SwitchableAction<Pair<String, String>> {
getParams().put(KEY_DIALOG, Boolean.toString(((SwitchCompat) root.findViewById(R.id.saveButton)).isChecked())); getParams().put(KEY_DIALOG, Boolean.toString(((SwitchCompat) root.findViewById(R.id.saveButton)).isChecked()));
return super.fillParams(root, activity); return super.fillParams(root, activity);
} }
@Override
public String getActionText(OsmandApplication application) {
String currentSource = application.getSettings().MAP_UNDERLAY.get() == null ? KEY_NO_UNDERLAY
: application.getSettings().MAP_UNDERLAY.get();
return application.getString(R.string.map_quick_action_pattern, getTranslatedItemName(application, currentSource));
}
} }

View file

@ -306,7 +306,7 @@ public abstract class QuickSearchListFragment extends OsmAndListFragment {
SearchHistoryHelper.getInstance(app).addNewItemToHistory(gpxInfo); SearchHistoryHelper.getInstance(app).addNewItemToHistory(gpxInfo);
File file = new File(app.getAppPath(IndexConstants.GPX_INDEX_DIR), gpxInfo.getFileName()); File file = new File(app.getAppPath(IndexConstants.GPX_INDEX_DIR), gpxInfo.getFileName());
String path = file.getAbsolutePath(); String path = file.getAbsolutePath();
TrackMenuFragment.showInstance(mapActivity, path, false, null, null, QuickSearchDialogFragment.TAG); TrackMenuFragment.showInstance(mapActivity, path, false, null, QuickSearchDialogFragment.TAG);
dialogFragment.dismiss(); dialogFragment.dismiss();
} }

View file

@ -1165,6 +1165,13 @@ public class OsmandSettings {
public final OsmandPreference<Integer> DISCOUNT_TOTAL_SHOW = new IntPreference(this, "discount_total_show", 0).makeGlobal(); public final OsmandPreference<Integer> DISCOUNT_TOTAL_SHOW = new IntPreference(this, "discount_total_show", 0).makeGlobal();
public final OsmandPreference<Long> DISCOUNT_SHOW_DATETIME_MS = new LongPreference(this, "show_discount_datetime_ms", 0).makeGlobal(); public final OsmandPreference<Long> DISCOUNT_SHOW_DATETIME_MS = new LongPreference(this, "show_discount_datetime_ms", 0).makeGlobal();
public final OsmandPreference<String> BACKUP_USER_EMAIL = new StringPreference(this, "backup_user_email", "").makeGlobal();
public final OsmandPreference<String> BACKUP_USER_ID = new StringPreference(this, "backup_user_id", "").makeGlobal();
public final OsmandPreference<String> BACKUP_DEVICE_ID = new StringPreference(this, "backup_device_id", "").makeGlobal();
public final OsmandPreference<String> BACKUP_NATIVE_DEVICE_ID = new StringPreference(this, "backup_native_device_id", "").makeGlobal();
public final OsmandPreference<String> BACKUP_ACCESS_TOKEN = new StringPreference(this, "backup_access_token", "").makeGlobal();
public final OsmandPreference<String> BACKUP_ACCESS_TOKEN_UPDATE_TIME = new StringPreference(this, "backup_access_token_update_time", "").makeGlobal();
// this value string is synchronized with settings_pref.xml preference name // this value string is synchronized with settings_pref.xml preference name
public final OsmandPreference<String> USER_OSM_BUG_NAME = public final OsmandPreference<String> USER_OSM_BUG_NAME =
new StringPreference(this, "user_osm_bug_name", "NoName/OsmAnd").makeGlobal().makeShared(); new StringPreference(this, "user_osm_bug_name", "NoName/OsmAnd").makeGlobal().makeShared();

View file

@ -4,11 +4,14 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import net.osmand.GPXUtilities.TrkSegment;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem; import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType; import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.SelectedGpxPoint;
import net.osmand.plus.myplaces.GPXItemPagerAdapter; import net.osmand.plus.myplaces.GPXItemPagerAdapter;
import net.osmand.plus.myplaces.SegmentActionsListener; import net.osmand.plus.myplaces.SegmentActionsListener;
import net.osmand.plus.myplaces.SegmentGPXAdapter; import net.osmand.plus.myplaces.SegmentGPXAdapter;
@ -23,12 +26,14 @@ public class SegmentsCard extends BaseCard {
private TrackDisplayHelper displayHelper; private TrackDisplayHelper displayHelper;
private GpxDisplayItemType[] filterTypes = new GpxDisplayItemType[] {GpxDisplayItemType.TRACK_SEGMENT}; private GpxDisplayItemType[] filterTypes = new GpxDisplayItemType[] {GpxDisplayItemType.TRACK_SEGMENT};
private SegmentActionsListener listener; private SegmentActionsListener listener;
private SelectedGpxPoint gpxPoint;
public SegmentsCard(@NonNull MapActivity mapActivity, @NonNull TrackDisplayHelper displayHelper, public SegmentsCard(@NonNull MapActivity mapActivity, @NonNull TrackDisplayHelper displayHelper,
@NonNull SegmentActionsListener listener) { @Nullable SelectedGpxPoint gpxPoint, @NonNull SegmentActionsListener listener) {
super(mapActivity); super(mapActivity);
this.displayHelper = displayHelper;
this.listener = listener; this.listener = listener;
this.displayHelper = displayHelper;
this.gpxPoint = gpxPoint;
} }
@Override @Override
@ -42,6 +47,8 @@ public class SegmentsCard extends BaseCard {
container.removeAllViews(); container.removeAllViews();
List<GpxDisplayItem> items = TrackDisplayHelper.flatten(displayHelper.getOriginalGroups(filterTypes)); List<GpxDisplayItem> items = TrackDisplayHelper.flatten(displayHelper.getOriginalGroups(filterTypes));
for (GpxDisplayItem displayItem : items) { for (GpxDisplayItem displayItem : items) {
updateLocationOnMap(displayItem);
View segmentView = SegmentGPXAdapter.createGpxTabsView(displayHelper, container, listener, nightMode); View segmentView = SegmentGPXAdapter.createGpxTabsView(displayHelper, container, listener, nightMode);
WrapContentHeightViewPager pager = segmentView.findViewById(R.id.pager); WrapContentHeightViewPager pager = segmentView.findViewById(R.id.pager);
@ -53,4 +60,16 @@ public class SegmentsCard extends BaseCard {
container.addView(segmentView); container.addView(segmentView);
} }
} }
private void updateLocationOnMap(GpxDisplayItem item) {
if (gpxPoint != null) {
TrkSegment segment = GPXItemPagerAdapter.getSegmentForAnalysis(item, item.analysis);
if (segment != null && (segment.points.contains(gpxPoint.getSelectedPoint())
|| segment.points.contains(gpxPoint.getPrevPoint())
&& segment.points.contains(gpxPoint.getNextPoint()))) {
item.locationOnMap = gpxPoint.getSelectedPoint();
listener.onPointSelected(segment, item.locationOnMap.lat, item.locationOnMap.lon);
}
}
}
} }

View file

@ -39,6 +39,7 @@ import net.osmand.FileUtils;
import net.osmand.FileUtils.RenameCallback; import net.osmand.FileUtils.RenameCallback;
import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.TrkSegment; import net.osmand.GPXUtilities.TrkSegment;
import net.osmand.GPXUtilities.WptPt;
import net.osmand.Location; import net.osmand.Location;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
@ -66,6 +67,7 @@ import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.GpxUiHelper;
import net.osmand.plus.mapcontextmenu.MapContextMenu; import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.OpenGpxDetailsTask; import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.OpenGpxDetailsTask;
import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.SelectedGpxPoint;
import net.osmand.plus.mapcontextmenu.other.TrackChartPoints; import net.osmand.plus.mapcontextmenu.other.TrackChartPoints;
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu; import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu;
import net.osmand.plus.measurementtool.GpxData; import net.osmand.plus.measurementtool.GpxData;
@ -154,6 +156,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
private String gpxTitle; private String gpxTitle;
private String returnScreenName; private String returnScreenName;
private String callingFragmentTag; private String callingFragmentTag;
private SelectedGpxPoint gpxPoint;
private TrackChartPoints trackChartPoints; private TrackChartPoints trackChartPoints;
private Float heading; private Float heading;
@ -165,7 +168,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
private int menuTitleHeight; private int menuTitleHeight;
private int menuHeaderHeight; private int menuHeaderHeight;
private int toolbarHeightPx; private int toolbarHeightPx;
private boolean mapPositionAdjusted; private boolean adjustMapPosition = true;
public enum TrackMenuType { public enum TrackMenuType {
@ -320,6 +323,14 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
this.callingFragmentTag = callingFragmentTag; this.callingFragmentTag = callingFragmentTag;
} }
public void setGpxPoint(SelectedGpxPoint point) {
this.gpxPoint = point;
}
public void setAdjustMapPosition(boolean adjustMapPosition) {
this.adjustMapPosition = adjustMapPosition;
}
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState); View view = super.onCreateView(inflater, container, savedInstanceState);
@ -506,7 +517,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
} }
cardsContainer.addView(segmentsCard.getView()); cardsContainer.addView(segmentsCard.getView());
} else { } else {
segmentsCard = new SegmentsCard(mapActivity, displayHelper, this); segmentsCard = new SegmentsCard(mapActivity, displayHelper, gpxPoint, this);
segmentsCard.setListener(this); segmentsCard.setListener(this);
cardsContainer.addView(segmentsCard.build(mapActivity)); cardsContainer.addView(segmentsCard.build(mapActivity));
} }
@ -596,7 +607,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
boolean backButtonVisible = !Algorithms.isEmpty(returnScreenName) && currentMenuState == MenuState.HALF_SCREEN; boolean backButtonVisible = !Algorithms.isEmpty(returnScreenName) && currentMenuState == MenuState.HALF_SCREEN;
AndroidUiHelper.updateVisibility(backButtonContainer, backButtonVisible); AndroidUiHelper.updateVisibility(backButtonContainer, backButtonVisible);
} }
if (currentMenuState != MenuState.FULL_SCREEN && (changed || !mapPositionAdjusted)) { if (currentMenuState != MenuState.FULL_SCREEN && (changed || adjustMapPosition)) {
adjustMapPosition(getMenuStatePosY(currentMenuState)); adjustMapPosition(getMenuStatePosY(currentMenuState));
} }
} }
@ -750,7 +761,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
@Override @Override
public int getStatusBarColorId() { public int getStatusBarColorId() {
if (getViewY() <= getFullScreenTopPosY() || !isPortrait()) { if (getView() != null && getViewY() <= getFullScreenTopPosY() || !isPortrait()) {
return isNightMode() ? R.color.status_bar_color_dark : R.color.status_bar_color_light; return isNightMode() ? R.color.status_bar_color_dark : R.color.status_bar_color_light;
} }
return -1; return -1;
@ -841,9 +852,9 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
osmEditingPlugin.sendGPXFiles(mapActivity, this, gpxInfo); osmEditingPlugin.sendGPXFiles(mapActivity, this, gpxInfo);
} }
} else if (buttonIndex == EDIT_BUTTON_INDEX) { } else if (buttonIndex == EDIT_BUTTON_INDEX) {
dismiss();
String fileName = Algorithms.getFileWithoutDirs(gpxFile.path); String fileName = Algorithms.getFileWithoutDirs(gpxFile.path);
MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(), fileName); MeasurementToolFragment.showInstance(mapActivity.getSupportFragmentManager(), fileName);
dismiss();
} else if (buttonIndex == RENAME_BUTTON_INDEX) { } else if (buttonIndex == RENAME_BUTTON_INDEX) {
FileUtils.renameFile(mapActivity, new File(gpxFile.path), this, true); FileUtils.renameFile(mapActivity, new File(gpxFile.path), this, true);
} else if (buttonIndex == CHANGE_FOLDER_BUTTON_INDEX) { } else if (buttonIndex == CHANGE_FOLDER_BUTTON_INDEX) {
@ -971,7 +982,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
if (r.left != 0 && r.right != 0) { if (r.left != 0 && r.right != 0) {
mapActivity.getMapView().fitRectToMap(r.left, r.right, r.top, r.bottom, tileBoxWidthPx, tileBoxHeightPx, 0); mapActivity.getMapView().fitRectToMap(r.left, r.right, r.top, r.bottom, tileBoxWidthPx, tileBoxHeightPx, 0);
} }
mapPositionAdjusted = true; adjustMapPosition = false;
} }
} }
@ -1258,7 +1269,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
boolean currentRecording = file == null; boolean currentRecording = file == null;
String path = file != null ? file.getAbsolutePath() : null; String path = file != null ? file.getAbsolutePath() : null;
if (context instanceof MapActivity) { if (context instanceof MapActivity) {
TrackMenuFragment.showInstance((MapActivity) context, path, currentRecording, null, null, null); TrackMenuFragment.showInstance((MapActivity) context, path, currentRecording, null, null);
} else { } else {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putString(TRACK_FILE_NAME, path); bundle.putString(TRACK_FILE_NAME, path);
@ -1309,7 +1320,6 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
public static void showInstance(@NonNull MapActivity mapActivity, public static void showInstance(@NonNull MapActivity mapActivity,
@Nullable String path, @Nullable String path,
boolean showCurrentTrack, boolean showCurrentTrack,
@Nullable final LatLon latLon,
@Nullable final String returnScreenName, @Nullable final String returnScreenName,
@Nullable final String callingFragmentTag) { @Nullable final String callingFragmentTag) {
final WeakReference<MapActivity> mapActivityRef = new WeakReference<>(mapActivity); final WeakReference<MapActivity> mapActivityRef = new WeakReference<>(mapActivity);
@ -1318,7 +1328,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
public boolean processResult(SelectedGpxFile selectedGpxFile) { public boolean processResult(SelectedGpxFile selectedGpxFile) {
MapActivity mapActivity = mapActivityRef.get(); MapActivity mapActivity = mapActivityRef.get();
if (mapActivity != null && selectedGpxFile != null) { if (mapActivity != null && selectedGpxFile != null) {
showInstance(mapActivity, selectedGpxFile, latLon, returnScreenName, callingFragmentTag); showInstance(mapActivity, selectedGpxFile, null, returnScreenName, callingFragmentTag, true);
} }
return true; return true;
} }
@ -1327,9 +1337,10 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
public static boolean showInstance(@NonNull MapActivity mapActivity, public static boolean showInstance(@NonNull MapActivity mapActivity,
@NonNull SelectedGpxFile selectedGpxFile, @NonNull SelectedGpxFile selectedGpxFile,
@Nullable LatLon latLon, @Nullable SelectedGpxPoint gpxPoint,
@Nullable String returnScreenName, @Nullable String returnScreenName,
@Nullable String callingFragmentTag) { @Nullable String callingFragmentTag,
boolean adjustMapPosition) {
try { try {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putInt(ContextMenuFragment.MENU_STATE_KEY, MenuState.HEADER_ONLY); args.putInt(ContextMenuFragment.MENU_STATE_KEY, MenuState.HEADER_ONLY);
@ -1340,9 +1351,12 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card
fragment.setSelectedGpxFile(selectedGpxFile); fragment.setSelectedGpxFile(selectedGpxFile);
fragment.setReturnScreenName(returnScreenName); fragment.setReturnScreenName(returnScreenName);
fragment.setCallingFragmentTag(callingFragmentTag); fragment.setCallingFragmentTag(callingFragmentTag);
fragment.setAdjustMapPosition(adjustMapPosition);
if (latLon != null) { if (gpxPoint != null) {
fragment.setLatLon(latLon); WptPt wptPt = gpxPoint.getSelectedPoint();
fragment.setLatLon(new LatLon(wptPt.lat, wptPt.lon));
fragment.setGpxPoint(gpxPoint);
} else { } else {
QuadRect rect = selectedGpxFile.getGpxFile().getRect(); QuadRect rect = selectedGpxFile.getGpxFile().getRect();
LatLon latLonRect = new LatLon(rect.centerY(), rect.centerX()); LatLon latLonRect = new LatLon(rect.centerY(), rect.centerX());

View file

@ -24,13 +24,14 @@ import net.osmand.data.LatLon;
import net.osmand.data.PointDescription; import net.osmand.data.PointDescription;
import net.osmand.data.RotatedTileBox; import net.osmand.data.RotatedTileBox;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapcontextmenu.MapContextMenu; import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.views.OsmandMapLayer; import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.layers.ContextMenuLayer.IContextMenuProvider; import net.osmand.plus.views.layers.ContextMenuLayer.IContextMenuProvider;
import net.osmand.plus.views.layers.MapTextLayer.MapTextProvider;
import net.osmand.plus.widgets.tools.CropCircleTransformation; import net.osmand.plus.widgets.tools.CropCircleTransformation;
import java.io.IOException; import java.io.IOException;
@ -46,7 +47,7 @@ import java.util.concurrent.ConcurrentHashMap;
import static net.osmand.aidl.ConnectedApp.AIDL_LAYERS_PREFIX; import static net.osmand.aidl.ConnectedApp.AIDL_LAYERS_PREFIX;
public class AidlMapLayer extends OsmandMapLayer implements IContextMenuProvider, MapTextLayer.MapTextProvider<AidlMapPointWrapper> { public class AidlMapLayer extends OsmandMapLayer implements IContextMenuProvider, MapTextProvider<AidlMapPointWrapper> {
private static final float POINT_IMAGE_VERTICAL_OFFSET = 0.91f; private static final float POINT_IMAGE_VERTICAL_OFFSET = 0.91f;
@ -267,7 +268,7 @@ public class AidlMapLayer extends OsmandMapLayer implements IContextMenuProvider
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return false; return false;
} }
@ -281,6 +282,11 @@ public class AidlMapLayer extends OsmandMapLayer implements IContextMenuProvider
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
@Override @Override
public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> o, boolean unknownLocation) { public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> o, boolean unknownLocation) {
if (isLayerEnabled()) { if (isLayerEnabled()) {

View file

@ -320,7 +320,7 @@ public class ContextMenuLayer extends OsmandMapLayer {
@Override @Override
@RequiresPermission(Manifest.permission.VIBRATE) @RequiresPermission(Manifest.permission.VIBRATE)
public boolean onLongPressEvent(PointF point, RotatedTileBox tileBox) { public boolean onLongPressEvent(PointF point, RotatedTileBox tileBox) {
if (disableLongPressOnMap()) { if (disableLongPressOnMap(point, tileBox)) {
return false; return false;
} }
if (pressedContextMarker(tileBox, point.x, point.y)) { if (pressedContextMarker(tileBox, point.x, point.y)) {
@ -609,7 +609,7 @@ public class ContextMenuLayer extends OsmandMapLayer {
String title = pointDescription == null ? "" : pointDescription.getName(); String title = pointDescription == null ? "" : pointDescription.getName();
mAddGpxPointBottomSheetHelper.setTitle(title); mAddGpxPointBottomSheetHelper.setTitle(title);
view.getAnimatedDraggingThread().startMoving(latLon.getLatitude(), latLon.getLongitude(), view.getZoom(), true); view.getAnimatedDraggingThread().startMoving(latLon.getLatitude(), latLon.getLongitude(), view.getZoom(), true);
} else { } else if (provider == null || !provider.showMenuAction(object)) {
selectedObjectContextMenuProvider = provider; selectedObjectContextMenuProvider = provider;
hideVisibleMenues(); hideVisibleMenues();
activity.getMapViewTrackingUtilities().setMapLinkedToLocation(false); activity.getMapViewTrackingUtilities().setMapLinkedToLocation(false);
@ -877,7 +877,7 @@ public class ContextMenuLayer extends OsmandMapLayer {
return res; return res;
} }
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
if (mInChangeMarkerPositionMode || mInGpxDetailsMode || mInAddGpxPointMode || if (mInChangeMarkerPositionMode || mInGpxDetailsMode || mInAddGpxPointMode ||
activity.getMapRouteInfoMenu().isVisible() || MapRouteInfoMenu.waypointsVisible activity.getMapRouteInfoMenu().isVisible() || MapRouteInfoMenu.waypointsVisible
|| MapRouteInfoMenu.followTrackVisible) { || MapRouteInfoMenu.followTrackVisible) {
@ -886,7 +886,7 @@ public class ContextMenuLayer extends OsmandMapLayer {
boolean res = false; boolean res = false;
for (OsmandMapLayer lt : view.getLayers()) { for (OsmandMapLayer lt : view.getLayers()) {
if (lt instanceof IContextMenuProvider) { if (lt instanceof IContextMenuProvider) {
if (((IContextMenuProvider) lt).disableLongPressOnMap()) { if (((IContextMenuProvider) lt).disableLongPressOnMap(point, tileBox)) {
res = true; res = true;
break; break;
} }
@ -1101,11 +1101,13 @@ public class ContextMenuLayer extends OsmandMapLayer {
boolean disableSingleTap(); boolean disableSingleTap();
boolean disableLongPressOnMap(); boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox);
boolean isObjectClickable(Object o); boolean isObjectClickable(Object o);
boolean runExclusiveAction(@Nullable Object o, boolean unknownLocation); boolean runExclusiveAction(@Nullable Object o, boolean unknownLocation);
boolean showMenuAction(@Nullable Object o);
} }
public interface IMoveObjectProvider { public interface IMoveObjectProvider {

View file

@ -13,6 +13,7 @@ import android.util.DisplayMetrics;
import android.view.WindowManager; import android.view.WindowManager;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import net.osmand.IndexConstants; import net.osmand.IndexConstants;
import net.osmand.binary.BinaryMapDataObject; import net.osmand.binary.BinaryMapDataObject;
@ -566,7 +567,7 @@ public class DownloadedRegionsLayer extends OsmandMapLayer implements IContextMe
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return false; return false;
} }
@ -580,6 +581,11 @@ public class DownloadedRegionsLayer extends OsmandMapLayer implements IContextMe
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
private void getWorldRegionFromPoint(RotatedTileBox tb, PointF point, List<? super DownloadMapObject> dataObjects) { private void getWorldRegionFromPoint(RotatedTileBox tb, PointF point, List<? super DownloadMapObject> dataObjects) {
int zoom = tb.getZoom(); int zoom = tb.getZoom();
if (zoom >= ZOOM_TO_SHOW_SELECTION_ST && zoom < ZOOM_TO_SHOW_SELECTION if (zoom >= ZOOM_TO_SHOW_SELECTION_ST && zoom < ZOOM_TO_SHOW_SELECTION

View file

@ -213,7 +213,7 @@ public class FavouritesLayer extends OsmandMapLayer implements IContextMenuProvi
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return false; return false;
} }
@ -227,6 +227,11 @@ public class FavouritesLayer extends OsmandMapLayer implements IContextMenuProvi
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
@Override @Override
public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> res, boolean unknownLocation) { public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> res, boolean unknownLocation) {
if (this.settings.SHOW_FAVORITES.get() && tileBox.getZoom() >= startZoom) { if (this.settings.SHOW_FAVORITES.get() && tileBox.getZoom() >= startZoom) {

View file

@ -44,10 +44,10 @@ import net.osmand.plus.R;
import net.osmand.plus.UiUtilities; import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.PointImageDrawable; import net.osmand.plus.base.PointImageDrawable;
import net.osmand.plus.itinerary.ItineraryGroup;
import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.SelectedGpxPoint; import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.SelectedGpxPoint;
import net.osmand.plus.mapcontextmenu.other.TrackChartPoints; import net.osmand.plus.mapcontextmenu.other.TrackChartPoints;
import net.osmand.plus.mapmarkers.MapMarker; import net.osmand.plus.mapmarkers.MapMarker;
import net.osmand.plus.itinerary.ItineraryGroup;
import net.osmand.plus.mapmarkers.MapMarkersHelper; import net.osmand.plus.mapmarkers.MapMarkersHelper;
import net.osmand.plus.render.OsmandRenderer; import net.osmand.plus.render.OsmandRenderer;
import net.osmand.plus.render.OsmandRenderer.RenderingContext; import net.osmand.plus.render.OsmandRenderer.RenderingContext;
@ -56,6 +56,7 @@ import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.track.GradientScaleType; import net.osmand.plus.track.GradientScaleType;
import net.osmand.plus.track.SaveGpxAsyncTask; import net.osmand.plus.track.SaveGpxAsyncTask;
import net.osmand.plus.track.TrackDrawInfo; import net.osmand.plus.track.TrackDrawInfo;
import net.osmand.plus.track.TrackMenuFragment;
import net.osmand.plus.views.OsmandMapLayer; import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.Renderable; import net.osmand.plus.views.Renderable;
@ -1024,7 +1025,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
float bearing = prevPointLocation.bearingTo(nextPointLocation); float bearing = prevPointLocation.bearingTo(nextPointLocation);
return new SelectedGpxPoint(selectedGpxFile, projectionPoint, bearing); return new SelectedGpxPoint(selectedGpxFile, projectionPoint, prevPoint, nextPoint, bearing);
} }
public static WptPt createProjectionPoint(WptPt prevPoint, WptPt nextPoint, LatLon latLon) { public static WptPt createProjectionPoint(WptPt prevPoint, WptPt nextPoint, LatLon latLon) {
@ -1088,8 +1089,16 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return isInTrackAppearanceMode(); if (isInTrackAppearanceMode()) {
return true;
}
if (tileBox.getZoom() >= START_ZOOM) {
List<Object> res = new ArrayList<>();
getTracksFromPoint(tileBox, point, res);
return !Algorithms.isEmpty(res);
}
return false;
} }
@Override @Override
@ -1098,7 +1107,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
} }
@Override @Override
public boolean runExclusiveAction(Object o, boolean unknownLocation) { public boolean runExclusiveAction(Object object, boolean unknownLocation) {
return false; return false;
} }
@ -1134,9 +1143,33 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
@Override @Override
public boolean onLongPressEvent(PointF point, RotatedTileBox tileBox) { public boolean onLongPressEvent(PointF point, RotatedTileBox tileBox) {
if (tileBox.getZoom() >= START_ZOOM) {
List<Object> trackPoints = new ArrayList<>();
getTracksFromPoint(tileBox, point, trackPoints);
if (!Algorithms.isEmpty(trackPoints)) {
MapActivity mapActivity = (MapActivity) view.getContext();
SelectedGpxPoint selectedGpxPoint = (SelectedGpxPoint) trackPoints.get(0);
WptPt wptPt = selectedGpxPoint.getSelectedPoint();
PointDescription description = getObjectName(selectedGpxPoint);
mapActivity.getContextMenu().show(new LatLon(wptPt.lat, wptPt.lon), description, selectedGpxPoint);
return true;
}
}
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object object) {
if (!(object instanceof SelectedGpxPoint)) {
return false;
}
MapActivity mapActivity = (MapActivity) view.getContext();
SelectedGpxPoint point = (SelectedGpxPoint) object;
TrackMenuFragment.showInstance(mapActivity, point.getSelectedGpxFile(), point, null, null, false);
return true;
}
@Override @Override
public LatLon getTextLocation(WptPt o) { public LatLon getTextLocation(WptPt o) {
return new LatLon(o.lat, o.lon); return new LatLon(o.lat, o.lon);

View file

@ -128,7 +128,7 @@ public class ImpassableRoadsLayer extends OsmandMapLayer implements
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return false; return false;
} }
@ -142,6 +142,11 @@ public class ImpassableRoadsLayer extends OsmandMapLayer implements
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
@Override @Override
public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> o, boolean unknownLocation) { public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> o, boolean unknownLocation) {
if (tileBox.getZoom() >= START_ZOOM) { if (tileBox.getZoom() >= START_ZOOM) {

View file

@ -497,7 +497,7 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return inPlanRouteMode; return inPlanRouteMode;
} }
@ -531,6 +531,11 @@ public class MapMarkersLayer extends OsmandMapLayer implements IContextMenuProvi
return true; return true;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
@Override @Override
public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> o, boolean unknownLocation) { public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> o, boolean unknownLocation) {
if (tileBox.getZoom() < 3 || !map.getMyApplication().getSettings().SHOW_MAP_MARKERS.get()) { if (tileBox.getZoom() < 3 || !map.getMyApplication().getSettings().SHOW_MAP_MARKERS.get()) {

View file

@ -16,6 +16,7 @@ import android.widget.LinearLayout.LayoutParams;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
@ -379,7 +380,7 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return false; return false;
} }
@ -408,6 +409,11 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
@Override @Override
public LatLon getTextLocation(Amenity o) { public LatLon getTextLocation(Amenity o) {
return o.getLocation(); return o.getLocation();

View file

@ -13,6 +13,7 @@ import android.graphics.RectF;
import android.graphics.drawable.LayerDrawable; import android.graphics.drawable.LayerDrawable;
import androidx.annotation.ColorInt; import androidx.annotation.ColorInt;
import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.content.res.AppCompatResources;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat; import androidx.core.graphics.drawable.DrawableCompat;
@ -22,14 +23,15 @@ import net.osmand.PlatformUtil;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.data.PointDescription; import net.osmand.data.PointDescription;
import net.osmand.data.RotatedTileBox; import net.osmand.data.RotatedTileBox;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.OsmAndLocationProvider; import net.osmand.plus.OsmAndLocationProvider;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.UiUtilities; import net.osmand.plus.UiUtilities;
import net.osmand.plus.base.MapViewTrackingUtilities; import net.osmand.plus.base.MapViewTrackingUtilities;
import net.osmand.plus.profiles.ProfileIconColors; import net.osmand.plus.profiles.ProfileIconColors;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.views.OsmandMapLayer; import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.layers.ContextMenuLayer.IContextMenuProvider;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -38,7 +40,7 @@ import java.util.List;
import static android.graphics.Paint.ANTI_ALIAS_FLAG; import static android.graphics.Paint.ANTI_ALIAS_FLAG;
import static android.graphics.Paint.FILTER_BITMAP_FLAG; import static android.graphics.Paint.FILTER_BITMAP_FLAG;
public class PointLocationLayer extends OsmandMapLayer implements ContextMenuLayer.IContextMenuProvider { public class PointLocationLayer extends OsmandMapLayer implements IContextMenuProvider {
private static final Log LOG = PlatformUtil.getLog(PointLocationLayer.class); private static final Log LOG = PlatformUtil.getLog(PointLocationLayer.class);
protected final static int RADIUS = 7; protected final static int RADIUS = 7;
@ -226,7 +228,7 @@ public class PointLocationLayer extends OsmandMapLayer implements ContextMenuLay
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return false; return false;
} }
@ -240,6 +242,11 @@ public class PointLocationLayer extends OsmandMapLayer implements ContextMenuLay
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
private LatLon getMyLocation() { private LatLon getMyLocation() {
Location location = locationProvider.getLastKnownLocation(); Location location = locationProvider.getLastKnownLocation();
if (location != null) { if (location != null) {

View file

@ -23,11 +23,13 @@ import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.views.OsmandMapLayer; import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.layers.ContextMenuLayer.IContextMenuProvider; import net.osmand.plus.views.layers.ContextMenuLayer.IContextMenuProvider;
import net.osmand.plus.views.layers.ContextMenuLayer.IMoveObjectProvider;
import java.util.List; import java.util.List;
public class PointNavigationLayer extends OsmandMapLayer implements public class PointNavigationLayer extends OsmandMapLayer implements
IContextMenuProvider, ContextMenuLayer.IMoveObjectProvider { IContextMenuProvider, IMoveObjectProvider {
protected final static int DIST_TO_SHOW = 80; protected final static int DIST_TO_SHOW = 80;
private Paint mPoint; private Paint mPoint;
@ -172,7 +174,7 @@ public class PointNavigationLayer extends OsmandMapLayer implements
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return false; return false;
} }
@ -186,6 +188,11 @@ public class PointNavigationLayer extends OsmandMapLayer implements
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
@Override @Override
public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> o, boolean unknownLocation) { public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> o, boolean unknownLocation) {
if (tileBox.getZoom() >= 3) { if (tileBox.getZoom() >= 3) {

View file

@ -46,6 +46,7 @@ import net.osmand.plus.routing.TransportRoutingHelper;
import net.osmand.plus.settings.backend.CommonPreference; import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.views.OsmandMapLayer; import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.layers.ContextMenuLayer.IContextMenuProvider;
import net.osmand.plus.views.layers.geometry.PublicTransportGeometryWay; import net.osmand.plus.views.layers.geometry.PublicTransportGeometryWay;
import net.osmand.plus.views.layers.geometry.PublicTransportGeometryWayContext; import net.osmand.plus.views.layers.geometry.PublicTransportGeometryWayContext;
import net.osmand.plus.views.layers.geometry.RouteGeometryWay; import net.osmand.plus.views.layers.geometry.RouteGeometryWay;
@ -67,7 +68,7 @@ import java.util.Map;
import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR; import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR;
public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.IContextMenuProvider { public class RouteLayer extends OsmandMapLayer implements IContextMenuProvider {
private static final Log log = PlatformUtil.getLog(RouteLayer.class); private static final Log log = PlatformUtil.getLog(RouteLayer.class);
@ -802,7 +803,7 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return isInRouteLineAppearanceMode(); return isInRouteLineAppearanceMode();
} }
@ -815,4 +816,9 @@ public class RouteLayer extends OsmandMapLayer implements ContextMenuLayer.ICont
public boolean runExclusiveAction(@Nullable Object o, boolean unknownLocation) { public boolean runExclusiveAction(@Nullable Object o, boolean unknownLocation) {
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
} }

View file

@ -8,6 +8,7 @@ import android.util.DisplayMetrics;
import android.view.WindowManager; import android.view.WindowManager;
import androidx.annotation.DrawableRes; import androidx.annotation.DrawableRes;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import net.osmand.ResultMatcher; import net.osmand.ResultMatcher;
@ -21,16 +22,17 @@ import net.osmand.data.TransportStop;
import net.osmand.osm.edit.Node; import net.osmand.osm.edit.Node;
import net.osmand.osm.edit.Way; import net.osmand.osm.edit.Way;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.base.PointImageDrawable;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.PointImageDrawable;
import net.osmand.plus.render.RenderingIcons; import net.osmand.plus.render.RenderingIcons;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.transport.TransportStopRoute; import net.osmand.plus.transport.TransportStopRoute;
import net.osmand.plus.transport.TransportStopType; import net.osmand.plus.transport.TransportStopType;
import net.osmand.plus.views.OsmandMapLayer; import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.layers.ContextMenuLayer.IContextMenuProvider;
import net.osmand.plus.views.layers.geometry.GeometryWay; import net.osmand.plus.views.layers.geometry.GeometryWay;
import java.io.IOException; import java.io.IOException;
@ -40,7 +42,7 @@ import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.TreeSet; import java.util.TreeSet;
public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLayer.IContextMenuProvider { public class TransportStopsLayer extends OsmandMapLayer implements IContextMenuProvider {
public static final String TRANSPORT_STOPS_OVER_MAP = "transportStops"; public static final String TRANSPORT_STOPS_OVER_MAP = "transportStops";
@ -294,7 +296,7 @@ public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLa
} }
@Override @Override
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap(PointF point, RotatedTileBox tileBox) {
return false; return false;
} }
@ -308,6 +310,11 @@ public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLa
return false; return false;
} }
@Override
public boolean showMenuAction(@Nullable Object o) {
return false;
}
@Override @Override
public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> res, boolean unknownLocation) { public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> res, boolean unknownLocation) {
if(tileBox.getZoom() >= startZoomRoute && stopRoute != null) { if(tileBox.getZoom() >= startZoomRoute && stopRoute != null) {

View file

@ -21,10 +21,10 @@ import java.lang.ref.WeakReference;
public class WidgetsVisibilityHelper { public class WidgetsVisibilityHelper {
private MapActivity mapActivity; private final MapActivity mapActivity;
private OsmandSettings settings; private final OsmandSettings settings;
private RoutingHelper routingHelper; private final RoutingHelper routingHelper;
private MapActivityLayers mapLayers; private final MapActivityLayers mapLayers;
public WidgetsVisibilityHelper(@NonNull MapActivity mapActivity) { public WidgetsVisibilityHelper(@NonNull MapActivity mapActivity) {
this.mapActivity = mapActivity; this.mapActivity = mapActivity;
@ -104,7 +104,6 @@ public class WidgetsVisibilityHelper {
public boolean shouldHideCompass() { public boolean shouldHideCompass() {
return mapActivity.shouldHideTopControls() return mapActivity.shouldHideTopControls()
|| isTrackDetailsMenuOpened() || isTrackDetailsMenuOpened()
|| isInMeasurementToolMode()
|| isInPlanRouteMode() || isInPlanRouteMode()
|| isInChoosingRoutesMode() || isInChoosingRoutesMode()
|| isInTrackAppearanceMode() || isInTrackAppearanceMode()
@ -116,7 +115,6 @@ public class WidgetsVisibilityHelper {
public boolean shouldShowTopButtons() { public boolean shouldShowTopButtons() {
return !mapActivity.shouldHideTopControls() return !mapActivity.shouldHideTopControls()
&& !isTrackDetailsMenuOpened() && !isTrackDetailsMenuOpened()
&& !isInMeasurementToolMode()
&& !isInPlanRouteMode() && !isInPlanRouteMode()
&& !isInChoosingRoutesMode() && !isInChoosingRoutesMode()
&& !isInTrackAppearanceMode() && !isInTrackAppearanceMode()

View file

@ -10,7 +10,7 @@ buildscript {
} }
dependencies { dependencies {
//classpath 'com.android.tools.build:gradle:2.+' //classpath 'com.android.tools.build:gradle:2.+'
classpath 'com.android.tools.build:gradle:4.1.2' classpath 'com.android.tools.build:gradle:4.1.3'
classpath 'com.google.gms:google-services:3.0.0' classpath 'com.google.gms:google-services:3.0.0'
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"