Merge branch 'master' into follow_track

This commit is contained in:
Vitaliy 2020-08-20 12:27:52 +03:00
commit fde90d40d4
37 changed files with 462 additions and 267 deletions

View file

@ -39,6 +39,7 @@ public class Amenity extends MapObject {
public static final String CONTENT = "content"; public static final String CONTENT = "content";
public static final String CUISINE = "cuisine"; public static final String CUISINE = "cuisine";
public static final String WIKIDATA = "wikidata"; public static final String WIKIDATA = "wikidata";
public static final String WIKIMEDIA_COMMONS = "wikimedia_commons";
public static final String DISH = "dish"; public static final String DISH = "dish";
public static final String REF = "ref"; public static final String REF = "ref";
public static final String OSM_DELETE_VALUE = "delete"; public static final String OSM_DELETE_VALUE = "delete";

View file

@ -32,6 +32,8 @@ public interface ITileSource {
public String getReferer(); public String getReferer();
public String getUserAgent();
public void deleteTiles(String path); public void deleteTiles(String path);
public int getAvgSize(); public int getAvgSize();

View file

@ -90,6 +90,7 @@ public class MapTileDownloader {
public final int yTile; public final int yTile;
public String url; public String url;
public String referer = null; public String referer = null;
public String userAgent = null;
public boolean error; public boolean error;
public DownloadRequest(String url, File fileToSave, int xTile, int yTile, int zoom) { public DownloadRequest(String url, File fileToSave, int xTile, int yTile, int zoom) {
@ -266,7 +267,7 @@ public class MapTileDownloader {
request.setError(false); request.setError(false);
try { try {
URLConnection connection = NetworkUtils.getHttpURLConnection(request.url); URLConnection connection = NetworkUtils.getHttpURLConnection(request.url);
connection.setRequestProperty("User-Agent", USER_AGENT); //$NON-NLS-1$ connection.setRequestProperty("User-Agent", Algorithms.isEmpty(request.userAgent) ? USER_AGENT : request.userAgent); //$NON-NLS-1$
if (request.referer != null) if (request.referer != null)
connection.setRequestProperty("Referer", request.referer); //$NON-NLS-1$ connection.setRequestProperty("Referer", request.referer); //$NON-NLS-1$
connection.setConnectTimeout(CONNECTION_TIMEOUT); connection.setConnectTimeout(CONNECTION_TIMEOUT);

View file

@ -68,6 +68,7 @@ public class TileSourceManager {
private String[] randomsArray; private String[] randomsArray;
private String rule; private String rule;
private String referer; private String referer;
private String userAgent;
private boolean hidden; // if hidden in configure map settings, for example mapillary sources private boolean hidden; // if hidden in configure map settings, for example mapillary sources
private boolean isRuleAcceptable = true; private boolean isRuleAcceptable = true;
@ -261,6 +262,14 @@ public class TileSourceManager {
this.referer = referer; this.referer = referer;
} }
public String getUserAgent() {
return userAgent;
}
public void setUserAgent(String userAgent) {
this.userAgent = userAgent;
}
@Override @Override
public int getTileSize() { public int getTileSize() {
return tileSize; return tileSize;
@ -484,6 +493,9 @@ public class TileSourceManager {
if (!Algorithms.isEmpty(tm.getReferer())) { if (!Algorithms.isEmpty(tm.getReferer())) {
properties.put("referer", tm.getReferer()); properties.put("referer", tm.getReferer());
} }
if (!Algorithms.isEmpty(tm.getUserAgent())) {
properties.put("user_agent", tm.getUserAgent());
}
properties.put("ext", tm.getTileFormat()); properties.put("ext", tm.getTileFormat());
properties.put("min_zoom", tm.getMinimumZoomSupported() + ""); properties.put("min_zoom", tm.getMinimumZoomSupported() + "");
@ -708,6 +720,12 @@ public class TileSourceManager {
} }
String randoms = attributes.get("randoms"); String randoms = attributes.get("randoms");
TileSourceTemplate templ = new TileSourceTemplate(name, urlTemplate, ext, maxZoom, minZoom, tileSize, bitDensity, avgTileSize); TileSourceTemplate templ = new TileSourceTemplate(name, urlTemplate, ext, maxZoom, minZoom, tileSize, bitDensity, avgTileSize);
if (attributes.get("referer") != null) {
templ.setReferer(attributes.get("referer"));
}
if (attributes.get("user_agent") != null) {
templ.setUserAgent(attributes.get("user_agent"));
}
if(expirationTime >= 0) { if(expirationTime >= 0) {
templ.setExpirationTimeMinutes(expirationTime); templ.setExpirationTimeMinutes(expirationTime);
} }

View file

@ -221,8 +221,8 @@
<string name="yard">ヤード</string> <string name="yard">ヤード</string>
<string name="foot">フィート</string> <string name="foot">フィート</string>
<string name="mile">マイル</string> <string name="mile">マイル</string>
<string name="km">キロメートル</string> <string name="km">km</string>
<string name="m">メートル</string> <string name="m">m</string>
<string name="nm">海里</string> <string name="nm">海里</string>
<string name="min_mile">min/m</string> <string name="min_mile">min/m</string>
<string name="min_km">min/km</string> <string name="min_km">min/km</string>

View file

@ -2,7 +2,7 @@
<resources> <resources>
<string name="searching_for_gps">Posicionando…</string> <string name="searching_for_gps">Posicionando…</string>
<string name="si_nm_h">Milhas náuticas por hora (nó)</string> <string name="si_nm_h">Milhas náuticas por hora (nó)</string>
<string name="install_osmand_dialog_message">Você 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>
<string name="shared_string_telegram">Telegram</string> <string name="shared_string_telegram">Telegram</string>
<string name="shared_string_login">Entrar</string> <string name="shared_string_login">Entrar</string>
<string name="start_end_date">Data de início - fim</string> <string name="start_end_date">Data de início - fim</string>
@ -10,7 +10,7 @@
<string name="gps_not_available">Por favor, ligue \"Localização\" nas configurações do sistema</string> <string name="gps_not_available">Por favor, ligue \"Localização\" nas configurações do sistema</string>
<string name="timeline_no_data">Sem dados</string> <string name="timeline_no_data">Sem dados</string>
<string name="sending_location_messages">enviando localização</string> <string name="sending_location_messages">enviando localização</string>
<string name="location_sharing_description">Selecione os contatos e grupos com os quais você deseja compartilhar sua localização.</string> <string name="location_sharing_description">Selecione os contactos e grupos com os quais deseja compartilhar sua localização.</string>
<string name="waiting_for_response_from_telegram">Aguardando resposta do Telegram</string> <string name="waiting_for_response_from_telegram">Aguardando resposta do Telegram</string>
<string name="connected_account">Conta conectada</string> <string name="connected_account">Conta conectada</string>
<string name="osmand_privacy_policy">Política de privacidade do OsmAnd</string> <string name="osmand_privacy_policy">Política de privacidade do OsmAnd</string>
@ -33,7 +33,7 @@
<string name="last_updated_location">Última localização atualizada:</string> <string name="last_updated_location">Última localização atualizada:</string>
<string name="stale_location">Parado</string> <string name="stale_location">Parado</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 coletados e enviados.</string>
<string name="already_registered_in_telegram">Você precisa de uma conta e número de telefone registrados no Telegram</string> <string name="already_registered_in_telegram">Precisa de uma conta e número de telefone registados no Telegram</string>
<string name="min_logging_speed_descr">Filtro: sem registro abaixo da velocidade selecionada</string> <string name="min_logging_speed_descr">Filtro: sem registro abaixo da velocidade selecionada</string>
<string name="shared_string_sort_by">Ordenar por</string> <string name="shared_string_sort_by">Ordenar por</string>
<string name="shared_string_sent">Enviado</string> <string name="shared_string_sent">Enviado</string>
@ -42,7 +42,7 @@
<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="send_location_as_descr">Escolha como as mensagens com sua localização serão exibidas.</string> <string name="send_location_as_descr">Escolha como as mensagens com sua localização serão exibidas.</string>
<string name="shared_string_connection">Conexão</string> <string name="shared_string_connection">Conexão</string>
<string name="share_location_as_description">Se você deseja conectar vários aparelhos a uma conta de telegrama, é necessário usar um aparelho diferente para compartilhar sua localização.</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="proxy_password">Palavra-passe</string> <string name="proxy_password">Palavra-passe</string>
<string name="shared_string_authorization">Autorização</string> <string name="shared_string_authorization">Autorização</string>
<string name="shared_string_select">Selecionar</string> <string name="shared_string_select">Selecionar</string>
@ -51,7 +51,7 @@
<string name="shared_string_bot">Robô</string> <string name="shared_string_bot">Robô</string>
<string name="average_altitude">Altitude média</string> <string name="average_altitude">Altitude média</string>
<string name="start_date">Data de início</string> <string name="start_date">Data de início</string>
<string name="live_now_description">Contatos e grupos compartilhando o local para você.</string> <string name="live_now_description">Contatos e grupos compartilhando o local consigo.</string>
<string name="shared_string_all">Todos</string> <string name="shared_string_all">Todos</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="shared_string_appearance">Aparência</string> <string name="shared_string_appearance">Aparência</string>
@ -59,7 +59,7 @@
<string name="by_distance">Pela distância</string> <string name="by_distance">Pela distância</string>
<string name="turn_off_location_sharing">Desativar o compartilhamento de local</string> <string name="turn_off_location_sharing">Desativar o compartilhamento de local</string>
<string name="shared_string_collected">Coletado</string> <string name="shared_string_collected">Coletado</string>
<string name="enter_another_device_name">Escolha um nome que você ainda não usou</string> <string name="enter_another_device_name">Escolha um nome que ainda não usou</string>
<string name="shared_string_add">Adicionar</string> <string name="shared_string_add">Adicionar</string>
<string name="show_users_on_map">Mostrar utilitadoes no mapa</string> <string name="show_users_on_map">Mostrar utilitadoes no mapa</string>
<string name="enter_authentication_code">Digite o código de autenticação</string> <string name="enter_authentication_code">Digite o código de autenticação</string>
@ -81,8 +81,8 @@
<string name="proxy_connected">Conectado</string> <string name="proxy_connected">Conectado</string>
<string name="m">m</string> <string name="m">m</string>
<string name="stop_sharing_all">O compartilhamento está ativado (desativado)</string> <string name="stop_sharing_all">O compartilhamento está ativado (desativado)</string>
<string name="do_not_have_telegram">Eu não tenho conta Telegram</string> <string name="do_not_have_telegram">Não tenho uma conta do Telegram</string>
<string name="get_telegram_account_first">Você 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 o compartilhamento de local.</string>
<string name="disable_all_sharing">Desativar todo o compartilhamento</string> <string name="disable_all_sharing">Desativar todo o compartilhamento</string>
<string name="sharing_status">Status de compartilhamento</string> <string name="sharing_status">Status de compartilhamento</string>
<string name="shared_string_end">Fim</string> <string name="shared_string_end">Fim</string>
@ -92,11 +92,11 @@
<string name="shared_string_later">Mais tarde</string> <string name="shared_string_later">Mais tarde</string>
<string name="my_location">Minha localização</string> <string name="my_location">Minha localização</string>
<string name="install_osmand">Instalar OsmAnd</string> <string name="install_osmand">Instalar OsmAnd</string>
<string name="privacy_policy_use_telegram">Telegrama (a app de mensagens) é usado para conectar e se comunicar com as pessoas.</string> <string name="privacy_policy_use_telegram">Telegram (a app de mensagens) é usado para conectar e comunicar com as pessoas.</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="not_sent_yet">Ainda não enviado</string> <string name="not_sent_yet">Ainda não enviado</string>
<string name="points_size">%1$d pontos</string> <string name="points_size">%1$d pontos</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 você 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/>O app usa a API Telegram e precisa de uma conta do Telegram.</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 registrar um novo ponto</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 aparelho não pode estar vazio</string>
<string name="yard">yd</string> <string name="yard">yd</string>
@ -152,7 +152,7 @@
<string name="hours_and_minutes_format">%1$d h %2$d m</string> <string name="hours_and_minutes_format">%1$d h %2$d m</string>
<string name="device_name_is_too_long">Nome do aparelho muito longo</string> <string name="device_name_is_too_long">Nome do aparelho muito longo</string>
<string name="gps_points">Pontos de GPS</string> <string name="gps_points">Pontos de GPS</string>
<string name="timeline_description">Ative o monitoramento para salvar todos os locais no histórico.</string> <string name="timeline_description">Ative o monitoramento para gravar todos os locais no histórico.</string>
<string name="show_on_map">Mostrar no mapa</string> <string name="show_on_map">Mostrar no mapa</string>
<string name="send_my_location">Enviar minha localização</string> <string name="send_my_location">Enviar minha localização</string>
<string name="share_location_as">Compartilhar localização como</string> <string name="share_location_as">Compartilhar localização como</string>
@ -160,7 +160,7 @@
<string name="mile_per_hour">mph</string> <string name="mile_per_hour">mph</string>
<string name="si_min_m">Minutos por milha</string> <string name="si_min_m">Minutos por milha</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="logout_from_osmand_telegram_descr">Tem certeza de que deseja sair do OsmAnd Tracker para que você não possa compartilhar o local ou ver a localização de outras pessoas\?</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="proxy_server">Servidor</string> <string name="proxy_server">Servidor</string>
<string name="si_m_s">Metros por segundo</string> <string name="si_m_s">Metros por segundo</string>
<string name="location_sharing_status">Compartilhamento: %1$s</string> <string name="location_sharing_status">Compartilhamento: %1$s</string>
@ -199,7 +199,7 @@
<string name="shared_string_authorization_descr">Por favor, insira o número de telefone do seu Telegram em formato internacional</string> <string name="shared_string_authorization_descr">Por favor, insira o número de telefone do seu Telegram em formato internacional</string>
<string name="set_visible_time_for_all">Definir tempo visível para todos</string> <string name="set_visible_time_for_all">Definir tempo visível para todos</string>
<string name="phone_number_title">Número de telefone</string> <string name="phone_number_title">Número de telefone</string>
<string name="privacy_policy_agree">Ao clicar em \"Continuar\" você 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="si_mi_feet">Milhas/pés</string> <string name="si_mi_feet">Milhas/pés</string>
<string name="monitoring_is_enabled">Monitoramento está ativado</string> <string name="monitoring_is_enabled">Monitoramento está ativado</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 exibir posições.</string>

View file

@ -57,10 +57,10 @@
<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 monitoramento</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 salvar todos os locais no histórico.</string> <string name="timeline_description">Ative o monitoramento para gravar todos os locais no histórico.</string>
<string name="privacy_policy_use_telegram">Telegrama (a app de mensagens) é usado para conectar e se comunicar com as pessoas.</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_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 . Seus contatos podem usar qualquer outro cliente Telegram.</string>
<string name="privacy_policy_agree">Ao clicar em \"Continuar\" você 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>
<string name="osmand_privacy_policy">Política de privacidade do OsmAnd</string> <string name="osmand_privacy_policy">Política de privacidade do OsmAnd</string>
@ -82,7 +82,7 @@
<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 como as mensagens com sua localização serão exibidas.</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 você 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 novo aparelho</string>
<string name="enter_device_name_description">Nomeie seu novo aparelho no máximo 200 símbolos.</string> <string name="enter_device_name_description">Nomeie seu novo aparelho no máximo 200 símbolos.</string>
@ -90,7 +90,7 @@
<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 aparelho não pode estar vazio</string>
<string name="device_name">Nome do aparelho</string> <string name="device_name">Nome do aparelho</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 aparelho no cliente de telegrama usando o bot de bate-papo %1$s. %2$s</string>
<string name="share_location_as_description">Se você deseja conectar vários aparelhos a uma conta de telegrama, é necessário usar um aparelho diferente para compartilhar sua localização.</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="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>
@ -117,8 +117,8 @@
<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 aparelho</string>
<string name="share_location_as">Compartilhar localização como</string> <string name="share_location_as">Compartilhar localização como</string>
<string name="live_now_description">Contatos e grupos compartilhando o local para você.</string> <string name="live_now_description">Contatos e grupos compartilhando o local consigo.</string>
<string name="logout_from_osmand_telegram_descr">Tem certeza de que deseja sair do OsmAnd Tracker para que você não possa compartilhar o local ou ver a localização de outras pessoas\?</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">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>
@ -159,13 +159,13 @@
<string name="shared_string_live">Vivo</string> <string name="shared_string_live">Vivo</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">Registro no Telegram</string>
<string name="get_telegram_account_first">Você 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 o compartilhamento de local.</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">Então pode usar esta app.</string>
<string name="shared_string_all">Todos</string> <string name="shared_string_all">Todos</string>
<string name="shared_string_off">Desligado</string> <string name="shared_string_off">Desativado</string>
<string name="already_registered_in_telegram">Você precisa de uma conta e número de telefone registrados 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">Eu não tenho conta 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>
<string name="enter_authentication_code">Digite o código de autenticação</string> <string name="enter_authentication_code">Digite o código de autenticação</string>
<string name="set_visible_time_for_all">Definir tempo visível para todos</string> <string name="set_visible_time_for_all">Definir tempo visível para todos</string>
@ -173,12 +173,12 @@
<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">Partilhar</string> <string name="shared_string_share">Compartilhar</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 seus contatos e grupos selecionados verão sua localização em tempo real.</string>
<string name="set_time">Definir tempo</string> <string name="set_time">Definir tempo</string>
<string name="location_sharing_description">Selecione os contatos e grupos com os quais você deseja compartilhar sua localização.</string> <string name="location_sharing_description">Selecione os contactos e grupos com os quais deseja compartilhar sua localização.</string>
<string name="my_location_search_hint">Pesquisa: Grupo ou contato</string> <string name="my_location_search_hint">Pesquisa: Grupo ou contato</string>
<string name="start_location_sharing">Compartilhar localização</string> <string name="start_location_sharing">Compartilhar localização</string>
<string name="show_on_map">Mostrar no mapa</string> <string name="show_on_map">Mostrar no mapa</string>
@ -190,7 +190,7 @@
<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">Uma faixa GPX é salva automaticamente durante a navegação.</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 Telegram</string> <string name="password_descr">Palavra-passe do telegrama</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">Iniciando</string>
@ -204,14 +204,14 @@
<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 app não tem permissão para acessar os 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, ligue \"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 provedores de localização para compartilhar sua localização.</string>
<string name="osmand_service">Modo de fundo</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">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">Compartilhar localização</string>
<string name="sharing_location">Compartilhando localização</string> <string name="sharing_location">Compartilhando 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">Você 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>
<string name="install_osmand">Instalar OsmAnd</string> <string name="install_osmand">Instalar OsmAnd</string>
<string name="show_users_on_map">Mostrar utilitadoes no mapa</string> <string name="show_users_on_map">Mostrar utilitadoes no mapa</string>
<string name="active_chats">Bate-papos ativos</string> <string name="active_chats">Bate-papos ativos</string>
@ -230,30 +230,29 @@
<string name="m_s">m/s</string> <string name="m_s">m/s</string>
<string name="km_h">km/h</string> <string name="km_h">km/h</string>
<string name="mile_per_hour">mph</string> <string name="mile_per_hour">mph</string>
<string name="si_kmh">Quilómetros por hora</string> <string name="si_kmh">Quilômetros por hora</string>
<string name="si_mph">Milhas por hora</string> <string name="si_mph">Milhas por hora</string>
<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ó)</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>
<string name="si_nm">Milhas náuticas</string> <string name="si_nm">Milhas náuticas</string>
<string name="si_mi_meters">Milhas/metros</string> <string name="si_mi_meters">Milhas/metros</string>
<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">O <b>OsmAnd Tracker</b> permite que partilhe sua localização e veja a dos outros no OsmAnd.<br/> <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>
<br/>O app usa a API Telegram e você precisa de uma conta da Telegram.</string>
<string name="my_location">Minha localização</string> <string name="my_location">Minha localizaçã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>
<string name="time_zone_descr">Selecione o fuso horário para mostrar nas suas mensagens de localização.</string> <string name="time_zone_descr">Selecione o fuso horário a mostrar nas suas mensagens de localização.</string>
<string name="time_zone">Fuso horário</string> <string name="time_zone">Fuso horário</string>
<string name="units_and_formats">Unidades e formatos</string> <string name="units_and_formats">Unidades e formatos</string>
<string name="unit_of_length_descr">Alterar unidade de medida de distância.</string> <string name="unit_of_length_descr">Alterar unidade de distância.</string>
<string name="unit_of_length">Unidades de comprimento</string> <string name="unit_of_length">Unidades de comprimento</string>
<string name="unit_of_speed_system_descr">Definir unidade de velocidade.</string> <string name="unit_of_speed_system_descr">Definir unidade de velocidade.</string>
<string name="unit_of_speed_system">Unidade de velocidade</string> <string name="unit_of_speed_system">Unidade de velocidade</string>

View file

@ -122,7 +122,7 @@
<string name="osmand_connect_desc">Выберите версию OsmAnd которую OsmAnd Tracker использует для отображения положений на карте.</string> <string name="osmand_connect_desc">Выберите версию OsmAnd которую OsmAnd Tracker использует для отображения положений на карте.</string>
<string name="osmand_connect">OsmAnd подключение</string> <string name="osmand_connect">OsmAnd подключение</string>
<string name="connected_account">Связанная учетная запись</string> <string name="connected_account">Связанная учетная запись</string>
<string name="shared_string_account">Учетная запись</string> <string name="shared_string_account">Учётная запись</string>
<string name="start_location_sharing">Начать отправку локации</string> <string name="start_location_sharing">Начать отправку локации</string>
<string name="install_osmand_dialog_message">Вам необходимо сначала установить бесплатную или платную версию OsmAnd</string> <string name="install_osmand_dialog_message">Вам необходимо сначала установить бесплатную или платную версию OsmAnd</string>
<string name="disconnect_from_telegram">Как отключить OsmAnd Tracker от Telegram</string> <string name="disconnect_from_telegram">Как отключить OsmAnd Tracker от Telegram</string>

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:minHeight="@dimen/bottom_sheet_selected_item_title_height"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingTop="@dimen/measurement_tool_menu_title_padding_top"
android:orientation="vertical"
android:paddingEnd="@dimen/content_padding"
android:paddingStart="@dimen/content_padding">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:paddingBottom="@dimen/measurement_tool_menu_title_padding_bottom"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:text="Some title" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="@dimen/bottom_sheet_text_spacing_multiplier"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular"
tools:text="Some description" />
</LinearLayout>

View file

@ -14,8 +14,8 @@
android:paddingLeft="@dimen/content_padding" android:paddingLeft="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding" android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding" android:paddingRight="@dimen/content_padding"
android:paddingTop="@dimen/multi_selection_menu_padding_top" android:paddingTop="@dimen/measurement_tool_menu_title_padding_top"
android:paddingBottom="@dimen/bottom_sheet_title_padding_bottom" android:paddingBottom="@dimen/measurement_tool_menu_title_padding_bottom"
android:text="@string/plan_route_open_existing_track" android:text="@string/plan_route_open_existing_track"
android:textAppearance="@style/TextAppearance.ListItemTitle" android:textAppearance="@style/TextAppearance.ListItemTitle"
osmand:typeface="@string/font_roboto_medium" /> osmand:typeface="@string/font_roboto_medium" />

View file

@ -304,7 +304,7 @@
android:paddingLeft="@dimen/measurement_tool_button_padding" android:paddingLeft="@dimen/measurement_tool_button_padding"
android:paddingRight="@dimen/measurement_tool_button_padding" android:paddingRight="@dimen/measurement_tool_button_padding"
android:text="@string/shared_string_apply" android:text="@string/shared_string_apply"
android:textColor="?attr/color_dialog_buttons" android:textColor="@color/color_white"
android:textAllCaps="false" android:textAllCaps="false"
android:paddingEnd="@dimen/measurement_tool_button_padding" android:paddingEnd="@dimen/measurement_tool_button_padding"
android:paddingStart="@dimen/measurement_tool_button_padding" /> android:paddingStart="@dimen/measurement_tool_button_padding" />

View file

@ -20,8 +20,10 @@
<net.osmand.plus.widgets.TextViewEx <net.osmand.plus.widgets.TextViewEx
android:id="@+id/choose_navigation_title" android:id="@+id/choose_navigation_title"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/bottom_sheet_title_height" android:layout_height="wrap_content"
android:gravity="center_vertical" android:gravity="center_vertical"
android:paddingTop="@dimen/measurement_tool_menu_title_padding_top"
android:paddingBottom="@dimen/measurement_tool_menu_title_padding_bottom"
android:paddingEnd="@dimen/content_padding" android:paddingEnd="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding" android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding" android:paddingRight="@dimen/content_padding"
@ -42,7 +44,6 @@
android:textColor="?android:textColorPrimary" android:textColor="?android:textColorPrimary"
android:lineSpacingMultiplier="@dimen/bottom_sheet_text_spacing_multiplier" android:lineSpacingMultiplier="@dimen/bottom_sheet_text_spacing_multiplier"
osmand:typeface="@string/font_roboto_regular" osmand:typeface="@string/font_roboto_regular"
android:letterSpacing="@dimen/description_letter_spacing"
android:textSize="@dimen/default_desc_text_size" /> android:textSize="@dimen/default_desc_text_size" />
<include layout="@layout/custom_radio_buttons" /> <include layout="@layout/custom_radio_buttons" />
@ -61,7 +62,6 @@
android:textColor="?android:textColorPrimary" android:textColor="?android:textColorPrimary"
android:lineSpacingMultiplier="@dimen/bottom_sheet_text_spacing_multiplier" android:lineSpacingMultiplier="@dimen/bottom_sheet_text_spacing_multiplier"
osmand:typeface="@string/font_roboto_regular" osmand:typeface="@string/font_roboto_regular"
android:letterSpacing="@dimen/description_letter_spacing"
android:textSize="@dimen/default_desc_text_size" /> android:textSize="@dimen/default_desc_text_size" />
</LinearLayout> </LinearLayout>

View file

@ -3480,4 +3480,22 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="tiles_storage_descr">Zvolte způsob uložení stažených dlaždic.</string> <string name="tiles_storage_descr">Zvolte způsob uložení stažených dlaždic.</string>
<string name="export_import_quick_actions_with_profiles_promo">Rychlé akce můžete importovat nebo exportovat prostřednictvím profilů.</string> <string name="export_import_quick_actions_with_profiles_promo">Rychlé akce můžete importovat nebo exportovat prostřednictvím profilů.</string>
<string name="shared_string_delete_all_q">Odstranit vše\?</string> <string name="shared_string_delete_all_q">Odstranit vše\?</string>
<string name="app_mode_go_cart">Motokára</string>
<string name="osm_edit_closed_note">Uzavřená OSM poznámka</string>
<string name="set_working_days_to_continue">Pro pokračování je potřeba nastavit pracovní dny</string>
<string name="route_between_points">Trasa mezi body</string>
<string name="plan_a_route">Naplánovat trasu</string>
<string name="add_to_a_track">Přidat k trase</string>
<string name="track_show_start_finish_icons">Zobrazit ikony startu a cíle</string>
<string name="select_track_width">Zvolte šířku</string>
<string name="gpx_split_interval_descr">Vyberte interval pro zobrazování značek na trase se vzdáleností nebo časem.</string>
<string name="gpx_split_interval_none_descr">Vyberte požadované dělení: podle času nebo podle vzdálenosti.</string>
<string name="shared_string_custom">Vlastní</string>
<string name="gpx_direction_arrows">Směrové šipky</string>
<string name="plan_route_last_edited">Naposledy upraveno</string>
<string name="plan_route_import_track">Importovat trasu</string>
<string name="plan_route_open_existing_track">Otevřít existující trasu</string>
<string name="plan_route_create_new_route">Vytvořit novou trasu</string>
<string name="plan_route_select_track_file_for_open">Vyberte trasu k otevření.</string>
<string name="shared_string_done">Hotovo</string>
</resources> </resources>

View file

@ -1117,7 +1117,7 @@
<string name="routing_attr_weight_description">Indiquez le poids du véhicule à respecter sur les routes.</string> <string name="routing_attr_weight_description">Indiquez le poids du véhicule à respecter sur les routes.</string>
<string name="select_gpx">Sélectionner GPX…</string> <string name="select_gpx">Sélectionner GPX…</string>
<string name="route_descr_select_destination">Définissez l\'arrivée</string> <string name="route_descr_select_destination">Définissez l\'arrivée</string>
<string name="shared_string_select_on_map">Sélectionner sur la carte</string> <string name="shared_string_select_on_map">Sélectionnez sur la carte</string>
<string name="shared_string_favorite">Favori</string> <string name="shared_string_favorite">Favori</string>
<string name="route_preferences">Préférences d\'itinéraire</string> <string name="route_preferences">Préférences d\'itinéraire</string>
<string name="route_info">Informations sur l\'itinéraire</string> <string name="route_info">Informations sur l\'itinéraire</string>

View file

@ -88,9 +88,9 @@
<string name="indexing_poi">POIを索引中…</string> <string name="indexing_poi">POIを索引中…</string>
<string name="indexing_transport">交通機関を索引化…</string> <string name="indexing_transport">交通機関を索引化…</string>
<string name="shared_string_io_error">I/Oエラーです</string> <string name="shared_string_io_error">I/Oエラーです</string>
<string name="km">キロメートル</string> <string name="km">km</string>
<string name="km_h">km/h</string> <string name="km_h">km/h</string>
<string name="m">メートル</string> <string name="m">m</string>
<string name="old_map_index_is_not_supported">重複したマップ <string name="old_map_index_is_not_supported">重複したマップ
データ形式 \'\'{0}\'\' はサポートされていません</string> データ形式 \'\'{0}\'\' はサポートされていません</string>
<string name="poi_filter_car_aid">自動車用施設</string> <string name="poi_filter_car_aid">自動車用施設</string>
@ -3737,4 +3737,41 @@ POIの更新は利用できません</string>
<string name="turn_screen_on_power_button">電源ボタン</string> <string name="turn_screen_on_power_button">電源ボタン</string>
<string name="use_volume_buttons_as_zoom_descr">端末の音量ボタンでマップのズームレベルを変更できるようにします。</string> <string name="use_volume_buttons_as_zoom_descr">端末の音量ボタンでマップのズームレベルを変更できるようにします。</string>
<string name="use_volume_buttons_as_zoom">音量ボタンでズーム</string> <string name="use_volume_buttons_as_zoom">音量ボタンでズーム</string>
<string name="track_show_start_finish_icons">出発・目的地アイコンを表示</string>
<string name="select_track_width">幅の選択</string>
<string name="gpx_split_interval_descr">距離または時間のマーカーが経路に表示される間隔を選択します。</string>
<string name="gpx_split_interval_none_descr">時間または距離で、必要な分割オプションを選択します。</string>
<string name="shared_string_custom">カスタム</string>
<string name="gpx_direction_arrows">方向矢印</string>
<string name="plan_route_last_edited">最終編集日時</string>
<string name="plan_route_import_track">経路のインポート</string>
<string name="plan_route_open_existing_track">既存の経路を開く</string>
<string name="plan_route_create_new_route">新しいルートの作成</string>
<string name="plan_route_select_track_file_for_open">開きたい経路ファイルを選択します。</string>
<string name="shared_string_done">完了</string>
<string name="overwrite_track">経路を上書き</string>
<string name="save_as_new_track">新しい経路として保存</string>
<string name="reverse_route">ルート反転</string>
<string name="rourte_between_points_next_segment_button_desc">選択したプロファイルを使用して、次のセグメントのみ再計算します。</string>
<string name="rourte_between_points_whole_track_button_desc">選択したプロファイルを使用して、経路全体が再計算されます。</string>
<string name="rourte_between_points_desc">直線で地点間をつなげる方法をとるか、選択したプロファイルで地点間のルートを計算します。</string>
<string name="whole_track">全経路</string>
<string name="next_segment">次のセグメント</string>
<string name="rourte_between_points_warning_desc">このオプションを使用するには、OsmAndで経路をマップ上の道路にスナップする必要があります。
\n
\n次にナビゲーションプロファイルを選択して、利用予定の道路(一般道、高速道路)と、道路を追跡するおおよその距離を検出する必要があります。</string>
<string name="threshold_distance">限界距離</string>
<string name="navigation_profile">ナビゲーションプロファイル</string>
<string name="rourte_between_points_add_track_desc">新しいセグメントを追加するための経路ファイルを選択します。</string>
<string name="street_level_imagery">ストリート画像</string>
<string name="plan_route_exit_dialog_descr">保存せずにルート計画を終了した場合すべての変更が失われます。よろしいですか?</string>
<string name="app_mode_enduro_motorcycle">エンデューロバイク</string>
<string name="app_mode_motor_scooter">電動スクーター</string>
<string name="app_mode_wheelchair">車椅子</string>
<string name="app_mode_go_cart">ゴーカート</string>
<string name="osm_edit_closed_note">OSMのメモを閉じました</string>
<string name="set_working_days_to_continue">続けるには営業日を設定する必要があります</string>
<string name="route_between_points">地点間のルート</string>
<string name="plan_a_route">ルートを計画</string>
<string name="add_to_a_track">経路に追加</string>
</resources> </resources>

View file

@ -304,7 +304,7 @@
<string name="poi_city_gate">Brama miasta</string> <string name="poi_city_gate">Brama miasta</string>
<string name="poi_fort">Fort</string> <string name="poi_fort">Fort</string>
<string name="poi_fountain">Fontanna</string> <string name="poi_fountain">Fontanna</string>
<string name="poi_historic_ruins">Zabytkowe ruiny</string> <string name="poi_historic_ruins">Ruiny o znaczeniu historycznym</string>
<string name="poi_rune_stone">Kamień runiczny</string> <string name="poi_rune_stone">Kamień runiczny</string>
<string name="poi_wreck">Wrak statku</string> <string name="poi_wreck">Wrak statku</string>
<string name="poi_historic_ship">Zabytkowy statek</string> <string name="poi_historic_ship">Zabytkowy statek</string>

View file

@ -62,9 +62,8 @@
<string name="waypoint_visit_before">Passar antes</string> <string name="waypoint_visit_before">Passar antes</string>
<string name="simulate_your_location">Simular rota</string> <string name="simulate_your_location">Simular rota</string>
<string name="drawer">Lista simples</string> <string name="drawer">Lista simples</string>
<string name="short_location_on_map">Lat %1$s <string name="short_location_on_map">Latitude %1$s
\n \nLongitude %2$s</string>
\nLon %2$s</string>
<string name="tips_and_tricks_descr">Respostas às perguntas frequentes, mudanças recentes e outras.</string> <string name="tips_and_tricks_descr">Respostas às perguntas frequentes, mudanças recentes e outras.</string>
<string name="routing_settings_2">Configurações de navegação</string> <string name="routing_settings_2">Configurações de navegação</string>
<string name="general_settings_2">Configurações gerais</string> <string name="general_settings_2">Configurações gerais</string>
@ -780,7 +779,7 @@
<string name="osmand_parking_minutes">Minutos</string> <string name="osmand_parking_minutes">Minutos</string>
<string name="osmand_parking_position_description_add_time">O carro foi estacionado em</string> <string name="osmand_parking_position_description_add_time">O carro foi estacionado em</string>
<string name="index_settings">Gerenciar mapas</string> <string name="index_settings">Gerenciar mapas</string>
<string name="context_menu_item_search">Pesquise nas proximidades</string> <string name="context_menu_item_search">Pesquise por perto</string>
<string name="local_index_descr_title">Gerenciar mapas.</string> <string name="local_index_descr_title">Gerenciar mapas.</string>
<string name="show_point_options">Usar posição…</string> <string name="show_point_options">Usar posição…</string>
<string name="only_show">Exibir rota</string> <string name="only_show">Exibir rota</string>
@ -1364,7 +1363,7 @@
<string name="route_tsll">Vire levemente à esquerda e siga</string> <string name="route_tsll">Vire levemente à esquerda e siga</string>
<string name="search_poi_location">Aguardando sinal…</string> <string name="search_poi_location">Aguardando sinal…</string>
<string name="search_near_map">Pesquisar próximo ao centro do mapa</string> <string name="search_near_map">Pesquisar próximo ao centro do mapa</string>
<string name="search_nearby">Pesquise nas proximidades</string> <string name="search_nearby">Pesquise por perto</string>
<string name="map_orientation_default">Mesma do aparelho</string> <string name="map_orientation_default">Mesma do aparelho</string>
<string name="map_orientation_portrait">Vertical</string> <string name="map_orientation_portrait">Vertical</string>
<string name="map_orientation_landscape">Horizontal</string> <string name="map_orientation_landscape">Horizontal</string>
@ -1812,7 +1811,7 @@
<string name="update">Atualizar</string> <string name="update">Atualizar</string>
<string name="only_download_over_wifi">Somente baixar via Wi-Fi</string> <string name="only_download_over_wifi">Somente baixar via Wi-Fi</string>
<string name="live_update">Atualização ao vivo</string> <string name="live_update">Atualização ao vivo</string>
<string name="update_now">Atualizar agora</string> <string name="update_now">Atualizar</string>
<string name="route_distance">Distância:</string> <string name="route_distance">Distância:</string>
<string name="route_duration">Tempo:</string> <string name="route_duration">Tempo:</string>
<string name="missing_write_external_storage_permission">OsmAnd não tem permissão para usar o cartão de memória</string> <string name="missing_write_external_storage_permission">OsmAnd não tem permissão para usar o cartão de memória</string>
@ -1835,7 +1834,7 @@
<string name="rec_split_clip_length_desc">Limite de tempo máximo para clipes gravados.</string> <string name="rec_split_clip_length_desc">Limite de tempo máximo para clipes gravados.</string>
<string name="rec_split_storage_size">Limite de armazenamento</string> <string name="rec_split_storage_size">Limite de armazenamento</string>
<string name="rec_split_storage_size_desc">Quantidade de espaço que pode ser ocupado por todos os clipes gravados.</string> <string name="rec_split_storage_size_desc">Quantidade de espaço que pode ser ocupado por todos os clipes gravados.</string>
<string name="last_map_change">Última alteração no mapa: %s</string> <string name="last_map_change">Última alteração: %s</string>
<string name="hourly">A cada hora</string> <string name="hourly">A cada hora</string>
<string name="daily">Diariamente</string> <string name="daily">Diariamente</string>
<string name="weekly">Semanalmente</string> <string name="weekly">Semanalmente</string>
@ -2087,7 +2086,7 @@
<string name="routing_attr_avoid_ice_roads_fords_name">Sem estradas de gelo ou vaus</string> <string name="routing_attr_avoid_ice_roads_fords_name">Sem estradas de gelo ou vaus</string>
<string name="routing_attr_avoid_ice_roads_fords_description">Evitar estradas de gelo e vaus.</string> <string name="routing_attr_avoid_ice_roads_fords_description">Evitar estradas de gelo e vaus.</string>
<string name="map_orientation_change_in_accordance_with_speed">Limite para orientação do mapa</string> <string name="map_orientation_change_in_accordance_with_speed">Limite para orientação do mapa</string>
<string name="quick_action_show_navigation_finish_dialog">Exibir notificação \'Navegação finalizada\'</string> <string name="quick_action_show_navigation_finish_dialog">Exibir notif. \'Navegação finalizada\'</string>
<string name="mapillary_menu_title_tile_cache">Cache de quadrícula</string> <string name="mapillary_menu_title_tile_cache">Cache de quadrícula</string>
<string name="map_widget_ruler_control">Régua de raio</string> <string name="map_widget_ruler_control">Régua de raio</string>
<string name="show_from_zoom_level">Exibir a partir do nível de zoom</string> <string name="show_from_zoom_level">Exibir a partir do nível de zoom</string>
@ -2463,34 +2462,22 @@
\n • Opção de gravação GPX permite-lhe gravar a sua viagem e compartilhá-la \n • Opção de gravação GPX permite-lhe gravar a sua viagem e compartilhá-la
\n • Através de plugin adicionais, você pode ativar curvas de nível e sombreamento de relevo</string> \n • Através de plugin adicionais, você pode ativar curvas de nível e sombreamento de relevo</string>
<string name="osmand_extended_description_part6">Passeio, caminhada, turismo pela cidade <string name="osmand_extended_description_part6">Passeio, caminhada, turismo pela cidade
\n \n • O mapa mostra caminhos para passeios e caminhadas
\n• O mapa mostra caminhos para passeios e caminhadas \n • A Wikipédia no seu idioma preferido pode dizer muito durante um turismo pela cidade
\n \n • Paradas de transportes públicos (ônibus, troleibus, trem) incluindo nomes de linha, ajuda a navegar em uma nova cidade
\n• A Wikipédia no seu idioma preferido pode dizer muito durante um turismo pela cidade \n • Navegação GPS em modo pedestre constrói a sua rota usando caminhos para pedestres
\n \n • Fazer upload e seguir uma rota GPX ou gravar e compartilhar a sua própria rota
\n• Paradas de transportes públicos (ônibus, troleibus, trem) incluindo nomes de linha, ajuda a navegar em uma nova cidade
\n
\n• Navegação GPS em modo pedestre constrói a sua rota usando caminhos para pedestres
\n
\n• Fazer upload e seguir uma rota GPX ou gravar e compartilhar a sua própria rota
\n</string> \n</string>
<string name="osmand_extended_description_part7">Contribua para o OSM <string name="osmand_extended_description_part7">Contribua para o OSM
\n \n • Comunique falha de dados
\n• Comunique falha de dados \n • Carregue trilhas GPX diretamente do app
\n \n • Adicione POIs e carregue-os diretamente ao OSM (ou mais tarde se off-line)
\n• Carregue trilhas GPX diretamente do app
\n
\n• Adicione POIs e carregue-os diretamente ao OSM (ou mais tarde se off-line)
\n</string> \n</string>
<string name="osmand_plus_extended_description_part5">Recursos de segurança <string name="osmand_plus_extended_description_part5">Recursos de segurança
\n \n • Alternância de exibição dia/noite automatizada opcional
\n• Alternância de exibição dia/noite automatizada opcional \n • Exibição de limite de velocidade opcional, com lembrete se você ultrapassá-lo
\n \n • Zoom dependente da velocidade opcional
\n• Exibição de limite de velocidade opcional, com lembrete se você ultrapassá-lo \n • Compartilhe sua localização para que seus amigos possam encontrar você
\n
\n• Zoom dependente da velocidade opcional
\n
\n• Compartilhe sua localização para que seus amigos possam encontrar você
\n</string> \n</string>
<string name="live_monitoring_max_interval_to_send_desrc">Especificar um buffer de tempo para manter locais para enviar sem conexão</string> <string name="live_monitoring_max_interval_to_send_desrc">Especificar um buffer de tempo para manter locais para enviar sem conexão</string>
<string name="quick_action_take_audio_note_descr">Um botão para adicionar uma nota de áudio no meio da tela.</string> <string name="quick_action_take_audio_note_descr">Um botão para adicionar uma nota de áudio no meio da tela.</string>
@ -2559,18 +2546,12 @@
<string name="move_point">Mover Ponto</string> <string name="move_point">Mover Ponto</string>
<string name="osm_recipients_label">Destinatários OSM</string> <string name="osm_recipients_label">Destinatários OSM</string>
<string name="osmand_plus_extended_description_part6">Recursos de Ciclismo e Pedestre <string name="osmand_plus_extended_description_part6">Recursos de Ciclismo e Pedestre
\n \n • Visualização de caminhos a pé, pistas de caminhadas e ciclovias, ideal para atividades ao ar livre
\n• Visualização de caminhos a pé, pistas de caminhadas e ciclovias, ideal para atividades ao ar livre \n • Roteamento e modos de exibição especiais para bicicleta e pedestres
\n \n • Paradas de transporte público opcionais (ônibus, troleibus, trem) incluindo nomes de linhas
\n• Roteamento e modos de exibição especiais para bicicleta e pedestres \n • Gravação opcional de viagem para arquivo GPX local ou serviço on-line
\n \n • Exibição opcional de velocidade e altitudes
\n• Paradas de transporte público opcionais (ônibus, troleibus, trem) incluindo nomes de linhas \n • Exibição de curvas de nível e sombreamento de relevo (via plugin adicional)</string>
\n
\n• Gravação opcional de viagem para arquivo GPX local ou serviço on-line
\n
\n• Exibição opcional de velocidade e altitudes
\n
\n• Exibição de curvas de nível e sombreamento de relevo (via plugin adicional)</string>
<string name="shared_string_without_name">Sem nome</string> <string name="shared_string_without_name">Sem nome</string>
<string name="osmand_plus_extended_description_part8">Cobertura de mapa e qualidade aproximada: <string name="osmand_plus_extended_description_part8">Cobertura de mapa e qualidade aproximada:
\n• Europa Ocidental: **** \n• Europa Ocidental: ****
@ -2646,18 +2627,12 @@
<string name="waypoints_removed_from_map_markers">Pontos de passagem removidos dos marcadores de mapa</string> <string name="waypoints_removed_from_map_markers">Pontos de passagem removidos dos marcadores de mapa</string>
<string name="shared_string_result">Resultado</string> <string name="shared_string_result">Resultado</string>
<string name="osmand_plus_extended_description_part2">Navegação <string name="osmand_plus_extended_description_part2">Navegação
\n \n • Funciona on-line (rápido) ou offline (sem custo de roaming quando estiver no exterior)
\n• Funciona on-line (rápido) ou offline (sem custo de roaming quando estiver no exterior) \n • Orientação por voz passo-a-passo (vozes gravadas e sintetizadas)
\n \n • Orientação de faixas opcional, exibição do nome da rua e tempo estimado de chegada
\n• Orientação por voz passo-a-passo (vozes gravadas e sintetizadas) \n • Suporta pontos intermediários do seu itinerário
\n \n • Correção de rota automático sempre que você sair da rota
\n• Orientação de faixas opcional, exibição do nome da rua e tempo estimado de chegada \n • Busque lugares por endereço, pelo tipo (ex.: restaurante, hotel, posto de gasolina, museu), ou por coordenadas geográficas
\n
\n• Suporta pontos intermediários do seu itinerário
\n
\n• Correção de rota automático sempre que você sair da rota
\n
\n• Busque lugares por endereço, pelo tipo (ex.: restaurante, hotel, posto de gasolina, museu), ou por coordenadas geográficas
\n</string> \n</string>
<string name="osmand_plus_extended_description_part3">Visualização de mapa <string name="osmand_plus_extended_description_part3">Visualização de mapa
\n• Exiba sua posição e orientação \n• Exiba sua posição e orientação
@ -2668,19 +2643,13 @@
\n• Opcionalmente exiba nomes de lugares em inglês, língua local ou fonético \n• Opcionalmente exiba nomes de lugares em inglês, língua local ou fonético
\n</string> \n</string>
<string name="osmand_plus_extended_description_part4">Use dados OSM e da Wikipédia <string name="osmand_plus_extended_description_part4">Use dados OSM e da Wikipédia
\n • Informações de alta qualidade dos melhores projetos colaborativos do mundo
\n • Dados OSM disponíveis por país ou região
\n • POIs da Wikipédia, ótimo para visitas turísticas
\n • Downloads grátis ilimitados, diretamente do aplicativo
\n • Mapas vetoriais offline compactos e atualizados mensalmente
\n \n
\n• Informações de alta qualidade dos melhores projetos colaborativos do mundo \n • Escolha entre região completa ou apenas rede rodoviária (Exemplo: Japão inteiro tem 700 MB ou apenas 200 MB para rede rodoviária)</string>
\n
\n• Dados OSM disponíveis por país ou região
\n
\n• POIs da Wikipédia, ótimo para visitas turísticas
\n
\n• Downloads grátis ilimitados, diretamente do aplicativo
\n
\n• Mapas vetoriais offline compactos e atualizados mensalmente
\n
\n
\n• Escolha entre região completa ou apenas rede rodoviária (Exemplo: Japão inteiro tem 700 MB ou apenas 200 MB para rede rodoviária)</string>
<string name="online_webpage_warning">Página disponível só online. Abrir num navegador web?</string> <string name="online_webpage_warning">Página disponível só online. Abrir num navegador web?</string>
<string name="images_cache">Cache de imagens</string> <string name="images_cache">Cache de imagens</string>
<string name="delete_search_history">Apagar histórico de pesquisa</string> <string name="delete_search_history">Apagar histórico de pesquisa</string>
@ -2817,16 +2786,11 @@
\n \n
\nAlgumas das principais características:</string> \nAlgumas das principais características:</string>
<string name="osmand_plus_extended_description_part7">Contribua diretamente para o OSM <string name="osmand_plus_extended_description_part7">Contribua diretamente para o OSM
\n \n • Avisar erros de dados
\n• Avisar erros de dados \n • Fazer upload de trilhas GPX para o OSM diretamente do app
\n \n • Adicionar POIs e fazer o upload diretamente para OSM (ou mais tarde se offline)
\n• Fazer upload de trilhas GPX para o OSM diretamente do app \n • Gravação de viagem opcional também em modo background (enquanto o dispositivo está no modo sleep)
\n \n OsmAnd é um software de código aberto desenvolvido ativamente. Todos podem contribuir para o app, reportando bugs, melhorando as traduções ou programando novas funcionalidades. Além disso, o projeto conta com as contribuições financeiras para financiar o desenvolvimento e testes de novas funcionalidades.
\n• Adicionar POIs e fazer o upload diretamente para OSM (ou mais tarde se offline)
\n
\n• Gravação de viagem opcional também em modo background (enquanto o dispositivo está no modo sleep)
\n
\nOsmAnd é um software de código aberto desenvolvido ativamente. Todos podem contribuir para o app, reportando bugs, melhorando as traduções ou programando novas funcionalidades. Além disso, o projeto conta com as contribuições financeiras para financiar o desenvolvimento e testes de novas funcionalidades.
\n</string> \n</string>
<string name="point_deleted">Ponto %1$s foi excluído</string> <string name="point_deleted">Ponto %1$s foi excluído</string>
<string name="shared_string_world">Mundo</string> <string name="shared_string_world">Mundo</string>

View file

@ -326,7 +326,7 @@
<string name="poi_pharmacy">Аптека</string> <string name="poi_pharmacy">Аптека</string>
<string name="poi_hospital">Больница</string> <string name="poi_hospital">Больница</string>
<string name="poi_doctors">Врач;Доктор</string> <string name="poi_doctors">Врач;Доктор</string>
<string name="poi_clinic">Поликлиника, клиника</string> <string name="poi_clinic">Поликлиника;Клиника</string>
<string name="poi_first_aid">Первая помощь</string> <string name="poi_first_aid">Первая помощь</string>
<string name="poi_dentist">Стоматология;Лечение зубов;Зубной врач</string> <string name="poi_dentist">Стоматология;Лечение зубов;Зубной врач</string>
<string name="poi_nursing_home">Дом престарелых</string> <string name="poi_nursing_home">Дом престарелых</string>
@ -1937,7 +1937,7 @@
<string name="poi_clothes_leather">Кожаная</string> <string name="poi_clothes_leather">Кожаная</string>
<string name="poi_clothes_costumes">Карнавальные костюмы</string> <string name="poi_clothes_costumes">Карнавальные костюмы</string>
<string name="poi_clothes_traditional">Традиционная</string> <string name="poi_clothes_traditional">Традиционная</string>
<string name="poi_clothes_suits">Костюмы, смокинги</string> <string name="poi_clothes_suits">Костюмы;Смокинги</string>
<string name="poi_clothes_maternity">Для беременных</string> <string name="poi_clothes_maternity">Для беременных</string>
<string name="poi_clothes_vintage">Старинная</string> <string name="poi_clothes_vintage">Старинная</string>
<string name="poi_clothes_oversize">Для больших людей</string> <string name="poi_clothes_oversize">Для больших людей</string>
@ -3308,8 +3308,8 @@
<string name="poi_climbing_rock_quartzite">Тип камня: кварцит</string> <string name="poi_climbing_rock_quartzite">Тип камня: кварцит</string>
<string name="poi_climbing_rock_gneiss">Тип камня: гнейс</string> <string name="poi_climbing_rock_gneiss">Тип камня: гнейс</string>
<string name="poi_climbing_rock_porphyry">Тип камня: порфир</string> <string name="poi_climbing_rock_porphyry">Тип камня: порфир</string>
<string name="poi_climbing_quality_solid">Надежность камней: прочно</string> <string name="poi_climbing_quality_solid">Надёжность камней: надёжно</string>
<string name="poi_climbing_quality_fragile">Надежность камней: ненадёжно</string> <string name="poi_climbing_quality_fragile">Надёжность камней: ненадёжно</string>
<string name="poi_climbing_bolted_yes">Фиксированные зацепы: есть</string> <string name="poi_climbing_bolted_yes">Фиксированные зацепы: есть</string>
<string name="poi_climbing_bolted_no">Фиксированные зацепы: нет</string> <string name="poi_climbing_bolted_no">Фиксированные зацепы: нет</string>
<string name="poi_climbing_orientation_n">Ориентация стены: С</string> <string name="poi_climbing_orientation_n">Ориентация стены: С</string>

View file

@ -297,7 +297,7 @@
<string name="lang_fy">Западнофризский</string> <string name="lang_fy">Западнофризский</string>
<string name="lang_als">Албанский (тоскский)</string> <string name="lang_als">Албанский (тоскский)</string>
<string name="rendering_attr_hideProposed_name">Планируемые объекты</string> <string name="rendering_attr_hideProposed_name">Планируемые объекты</string>
<string name="srtm_plugin_description">Этот плагин обеспечивает как наложение контурных линий, так и отображения затеняющего слоя рельефа поверх стандартных карт OsmAnd. Эта функция высоко оценится спортсменами, туристами, путешественниками и всеми, кто заинтересован в рельефной структуре ландшафта. <string name="srtm_plugin_description">Обеспечивает как наложение контурных линий, так и отображения затеняющего слоя рельефа поверх стандартных карт OsmAnd. Эта функция высоко оценится спортсменами, туристами, путешественниками и всеми, кто заинтересован в рельефной структуре ландшафта.
\n \n
\nГлобальные данные (между 70° на севере и 70° на юге) основываются на измерениях SRTM (Shuttle Radar Topography Mission) и ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer) — инструментом визуализации Terra, флагманского спутника Системы Наблюдения Земли NASA. ASTER является результатом совместных усилий NASA, министерства экономики Японии, торговли и промышленности (METI), а также Космических Систем Японии (J-spacesystems).</string> \nГлобальные данные (между 70° на севере и 70° на юге) основываются на измерениях SRTM (Shuttle Radar Topography Mission) и ASTER (Advanced Spaceborne Thermal Emission and Reflection Radiometer) — инструментом визуализации Terra, флагманского спутника Системы Наблюдения Земли NASA. ASTER является результатом совместных усилий NASA, министерства экономики Японии, торговли и промышленности (METI), а также Космических Систем Японии (J-spacesystems).</string>
<string name="srtm_paid_version_msg">Рассмотрите возможность покупки плагина «Линии высот» в Google Play, чтобы поддержать последующую разработку.</string> <string name="srtm_paid_version_msg">Рассмотрите возможность покупки плагина «Линии высот» в Google Play, чтобы поддержать последующую разработку.</string>
@ -327,7 +327,7 @@
<string name="recording_description">Запись %1$s %3$s %2$s</string> <string name="recording_description">Запись %1$s %3$s %2$s</string>
<string name="recording_default_name">Запись</string> <string name="recording_default_name">Запись</string>
<string name="map_widget_av_notes">Аудиозаметки</string> <string name="map_widget_av_notes">Аудиозаметки</string>
<string name="osmand_srtm_short_description_80_chars">OsmAnd плагин для линий высот</string> <string name="osmand_srtm_short_description_80_chars">OsmAnd-плагин для линий высот</string>
<string name="map_widget_distancemeasurement">Измерение расстояний</string> <string name="map_widget_distancemeasurement">Измерение расстояний</string>
<string name="audionotes_location_not_defined">Нажмите «Использовать местоположение…» чтобы добавить заметку к данному местоположению.</string> <string name="audionotes_location_not_defined">Нажмите «Использовать местоположение…» чтобы добавить заметку к данному местоположению.</string>
<string name="map_widget_audionotes">Аудиозаметки</string> <string name="map_widget_audionotes">Аудиозаметки</string>
@ -346,11 +346,11 @@
<string name="download_roads_only_item">Только дороги</string> <string name="download_roads_only_item">Только дороги</string>
<string name="download_regular_maps">Стандартная карта</string> <string name="download_regular_maps">Стандартная карта</string>
<string name="download_roads_only_maps">Карта дорог</string> <string name="download_roads_only_maps">Карта дорог</string>
<string name="safe_mode_description">Запустить приложение в безопасном режиме (замедляет работу приложения, используя только Android функции).</string> <string name="safe_mode_description">Запустить приложение в безопасном режиме (замедляет работу приложения, используя только функции Android).</string>
<string name="safe_mode">Безопасный режим</string> <string name="safe_mode">Безопасный режим</string>
<string name="native_library_not_running">Приложение работает в безопасном режиме (отключите его в разделе «Настройки»).</string> <string name="native_library_not_running">Приложение работает в безопасном режиме (отключите его в разделе «Настройки»).</string>
<string name="background_service_is_enabled_question">Фоновая служба OsmAnd всё ещё работает. Остановите её тоже\?</string> <string name="background_service_is_enabled_question">Фоновая служба OsmAnd всё ещё работает. Остановите её тоже\?</string>
<string name="close_changeset">Закрыть changeset</string> <string name="close_changeset">Закрыть пакет правок</string>
<string name="zxing_barcode_scanner_not_found">Приложение ZXing Barcode Scanner не найдено. Искать в Google Play?</string> <string name="zxing_barcode_scanner_not_found">Приложение ZXing Barcode Scanner не найдено. Искать в Google Play?</string>
<string name="non_optimal_route_calculation">Быстрое построение маршрута (возможно неоптимально)</string> <string name="non_optimal_route_calculation">Быстрое построение маршрута (возможно неоптимально)</string>
<string name="oclock">ч.</string> <string name="oclock">ч.</string>
@ -413,7 +413,7 @@
<string name="live_monitoring_interval">Интервал онлайн-слежения</string> <string name="live_monitoring_interval">Интервал онлайн-слежения</string>
<string name="live_monitoring_url_descr">Укажите веб-адрес со следующими параметрами: lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}.</string> <string name="live_monitoring_url_descr">Укажите веб-адрес со следующими параметрами: lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}.</string>
<string name="live_monitoring_url">Web адрес онлайн-слежения</string> <string name="live_monitoring_url">Web адрес онлайн-слежения</string>
<string name="gpx_monitoring_disabled_warn">Записать трек можно с помощью виджета GPX или выбрав «Запись поездки» в Настройках.</string> <string name="gpx_monitoring_disabled_warn">Записать трек можно с помощью виджета GPX или выбрав «Запись поездки» в настройках.</string>
<string name="show_current_gpx_title">Показывать текущий путь</string> <string name="show_current_gpx_title">Показывать текущий путь</string>
<string name="free_version_message">Вы можете скачать или обновить карты %1$s.</string> <string name="free_version_message">Вы можете скачать или обновить карты %1$s.</string>
<string name="free_version_title">Бесплатная версия</string> <string name="free_version_title">Бесплатная версия</string>
@ -748,7 +748,7 @@
<string name="map_orientation_landscape">Ландшафт</string> <string name="map_orientation_landscape">Ландшафт</string>
<string name="map_screen_orientation">Ориентация экрана</string> <string name="map_screen_orientation">Ориентация экрана</string>
<string name="map_screen_orientation_descr">Выберите ориентацию экрана.</string> <string name="map_screen_orientation_descr">Выберите ориентацию экрана.</string>
<string name="opening_hours_not_supported">Не могу изменить формат часов работы.</string> <string name="opening_hours_not_supported">Невозможно изменить формат часов работы.</string>
<string name="add_new_rule">Новое правило</string> <string name="add_new_rule">Новое правило</string>
<string name="transport_Routes">Маршруты</string> <string name="transport_Routes">Маршруты</string>
<string name="transport_Stop">Остановка</string> <string name="transport_Stop">Остановка</string>
@ -1104,7 +1104,7 @@
<string name="avoid_unpaved">Без грунтовых дорог</string> <string name="avoid_unpaved">Без грунтовых дорог</string>
<string name="avoid_ferries">Без паромов</string> <string name="avoid_ferries">Без паромов</string>
<string name="avoid_in_routing_title">Избегать…</string> <string name="avoid_in_routing_title">Избегать…</string>
<string name="show_warnings_descr">Установка оповещений дорожного движения (ограничения скорости, вынужденные остановки, искусственные неровности, тоннели), камер скорости, информации о полосах.</string> <string name="show_warnings_descr">Установка оповещений дорожного движения (ограничения скорости, вынужденные остановки, искусственные неровности, туннели), камер скорости, информации о полосах.</string>
<string name="map_widget_fluorescent">Флуоресцентные маршруты</string> <string name="map_widget_fluorescent">Флуоресцентные маршруты</string>
<string name="show_warnings_title">Показывать сигналы…</string> <string name="show_warnings_title">Показывать сигналы…</string>
<string name="map_widget_show_ruler">Линейка</string> <string name="map_widget_show_ruler">Линейка</string>
@ -1184,7 +1184,7 @@
<string name="context_menu_item_last_intermediate_point">Добавить последним промежуточным пунктом</string> <string name="context_menu_item_last_intermediate_point">Добавить последним промежуточным пунктом</string>
<string name="context_menu_item_first_intermediate_point">Добавить первым промежуточным пунктом</string> <string name="context_menu_item_first_intermediate_point">Добавить первым промежуточным пунктом</string>
<string name="add_as_last_destination_point">Добавить последним промежуточным пунктом</string> <string name="add_as_last_destination_point">Добавить последним промежуточным пунктом</string>
<string name="add_as_first_destination_point">Добавить как первый промежуточный пункт</string> <string name="add_as_first_destination_point">Добавить первым промежуточным пунктом</string>
<string name="replace_destination_point">Заменить пункт назначения</string> <string name="replace_destination_point">Заменить пункт назначения</string>
<string name="new_destination_point_dialog">Пункт назначения уже установлен:</string> <string name="new_destination_point_dialog">Пункт назначения уже установлен:</string>
<string name="target_point">Пункт %1$s</string> <string name="target_point">Пункт %1$s</string>
@ -1379,7 +1379,7 @@
<string name="app_modes_choose_descr">Выберите отображаемые профили.</string> <string name="app_modes_choose_descr">Выберите отображаемые профили.</string>
<string name="app_modes_choose">Профили приложения</string> <string name="app_modes_choose">Профили приложения</string>
<string name="edit_tilesource_choose_existing">Выберите существующий…</string> <string name="edit_tilesource_choose_existing">Выберите существующий…</string>
<string name="maps_define_edit">Задать/отредактировать </string> <string name="maps_define_edit">Задать/редактировать…</string>
<string name="android_19_location_disabled">В Android 4.4 (KitKat) и выше прежнее хранилище (%s) объявлено устаревшим. Скопировать все файлы OsmAnd в новое хранилище\? <string name="android_19_location_disabled">В Android 4.4 (KitKat) и выше прежнее хранилище (%s) объявлено устаревшим. Скопировать все файлы OsmAnd в новое хранилище\?
\n Примечание 1: ваши старые файлы останутся нетронутыми (но могут быть удалены вручную). \n Примечание 1: ваши старые файлы останутся нетронутыми (но могут быть удалены вручную).
\n Примечание 2: в новом хранилище совместное использование файлов OsmAnd и OsmAnd+ невозможно.</string> \n Примечание 2: в новом хранилище совместное использование файлов OsmAnd и OsmAnd+ невозможно.</string>
@ -1422,7 +1422,7 @@
<string name="lang_lv">Латышский</string> <string name="lang_lv">Латышский</string>
<string name="lang_lt">Литовский</string> <string name="lang_lt">Литовский</string>
<string name="lang_mr">Маратхи</string> <string name="lang_mr">Маратхи</string>
<string name="lang_no">Норвежский Букмол</string> <string name="lang_no">Норвежский букмол</string>
<string name="lang_pl">Польский</string> <string name="lang_pl">Польский</string>
<string name="lang_pt">Португальский</string> <string name="lang_pt">Португальский</string>
<string name="lang_ro">Румынский</string> <string name="lang_ro">Румынский</string>
@ -1577,7 +1577,7 @@
<string name="save_track_to_gpx_globally">Запись трека в файл GPX</string> <string name="save_track_to_gpx_globally">Запись трека в файл GPX</string>
<string name="save_track_interval_globally">Интервал записи</string> <string name="save_track_interval_globally">Интервал записи</string>
<string name="save_track_to_gpx_globally_descr">Ведение записи местоположений в файл GPX можно включить или выключить с помощью виджета записи GPX на карте.</string> <string name="save_track_to_gpx_globally_descr">Ведение записи местоположений в файл GPX можно включить или выключить с помощью виджета записи GPX на карте.</string>
<string name="record_plugin_description">Плагин активирует функции для записи и сохранения ваших треков вручную нажатием на виджет записи GPX на карте, или также автоматически записывает все ваши маршруты навигации в файл GPX. <string name="record_plugin_description">Активирует функции для записи и сохранения ваших треков вручную нажатием на виджет записи GPX на карте, или также автоматически записывает все ваши маршруты навигации в файл GPX.
\n \n
\nЗаписанными треками можно поделиться с вашими друзьями или использовать их для вклада в OSM. Спортсмены могут использовать записанные треки для контроля за тренировками. Некоторый базовый анализ треков может быть выполнен непосредственно в OsmAnd, например, время прохождения круга, средняя скорость и т.д., треки, конечно, позднее также могут быть проанализированы в специальных инструментах анализа сторонних производителей.</string> \nЗаписанными треками можно поделиться с вашими друзьями или использовать их для вклада в OSM. Спортсмены могут использовать записанные треки для контроля за тренировками. Некоторый базовый анализ треков может быть выполнен непосредственно в OsmAnd, например, время прохождения круга, средняя скорость и т.д., треки, конечно, позднее также могут быть проанализированы в специальных инструментах анализа сторонних производителей.</string>
<string name="create_poi_link_to_osm_doc"><u>Онлайн OSM</u> классификация карт с изображениями.</string> <string name="create_poi_link_to_osm_doc"><u>Онлайн OSM</u> классификация карт с изображениями.</string>
@ -1767,7 +1767,7 @@
<string name="action_delete">Удалить действие</string> <string name="action_delete">Удалить действие</string>
<string name="action_modify">Изменить действие</string> <string name="action_modify">Изменить действие</string>
<string name="action_create">Создать действие</string> <string name="action_create">Создать действие</string>
<string name="osm_edits">OSM правки</string> <string name="osm_edits">Правки OSM</string>
<string name="osmand_parking_hour">ч.</string> <string name="osmand_parking_hour">ч.</string>
<string name="osmand_parking_minute">м.</string> <string name="osmand_parking_minute">м.</string>
<string name="osmand_parking_time_left">осталось</string> <string name="osmand_parking_time_left">осталось</string>
@ -1780,14 +1780,14 @@
<string name="delay_to_start_navigation_descr">Укажите время задержки на экране планирования маршрута.</string> <string name="delay_to_start_navigation_descr">Укажите время задержки на экране планирования маршрута.</string>
<string name="delay_to_start_navigation">Начать пошаговое ведение через…</string> <string name="delay_to_start_navigation">Начать пошаговое ведение через…</string>
<string name="shared_string_go">Поехали</string> <string name="shared_string_go">Поехали</string>
<string name="plugin_nautical_descr">Плагин расширяет возможности OsmAnd, делая доступными морские карты для катания на лодках, парусного спорта и других видов спорта. <string name="plugin_nautical_descr">Расширяет возможности OsmAnd, делая доступными морские карты для катания на лодках, парусного спорта и других видов спорта.
\n \n
\nСпециальная дополнительная карта для OsmAnd добавляет морские навигационные и условные знаки как для внутренней, так и для прибрежной навигации. Описание навигационных отметок содержит информацию, необходимую для их идентификации, а также их характеристики (категория, форма, цвет, последовательность мерцания огней и т.д.). \nСпециальная дополнительная карта для OsmAnd добавляет морские навигационные и условные знаки как для внутренней, так и для прибрежной навигации. Описание навигационных отметок содержит информацию, необходимую для их идентификации, а также их характеристики (категория, форма, цвет, последовательность мерцания огней и т.д.).
\n \n
\nЧтобы вернуться к одному из традиционных стилей карт в OsmAnd, просто деактивируйте этот плагин или измените на желаемый «Стиль карты» в разделе «Настройки карты».</string> \nЧтобы вернуться к одному из традиционных стилей карт в OsmAnd, просто деактивируйте этот плагин или измените на желаемый «Стиль карты» в разделе «Настройки карты».</string>
<string name="local_osm_changes_upload_all_confirm">Вы уверены, что хотите отправить %1$d изменений в OSM\?</string> <string name="local_osm_changes_upload_all_confirm">Вы уверены, что хотите отправить %1$d изменений в OSM\?</string>
<string name="confirmation_to_clear_history">Очистить историю?</string> <string name="confirmation_to_clear_history">Очистить историю?</string>
<string name="plugin_ski_descr">Плагин обеспечивает вам доступ к данным о горнолыжных трассах, маршрутах для беговых лыж, альпийских спусках, фуникулёрах и горнолыжных подъёмниках. Маршруты и спуски отмечены разными цветами в зависимости от их сложности и изображены с использованием специального «зимнего» стиля карты, который заключается в том, что используются «снежные» цвета зимнего пейзажа. <string name="plugin_ski_descr">Обеспечивает вам доступ к данным о горнолыжных трассах, маршрутах для беговых лыж, альпийских спусках, фуникулёрах и горнолыжных подъёмниках. Маршруты и спуски отмечены разными цветами в зависимости от их сложности и изображены с использованием специального «зимнего» стиля карты, который заключается в том, что используются «снежные» цвета зимнего пейзажа.
\n \n
\nВ случае активации этого вида, стиль карты меняется на «Зимний/лыжный», показывая все детали пейзажа так, как они выглядят зимой. Такой (зимний) вид может быть отменён либо путём деактивации здесь, либо если вы поменяете «Стиль карты» в меню «Настройки карты» на желаемый вид.</string> \nВ случае активации этого вида, стиль карты меняется на «Зимний/лыжный», показывая все детали пейзажа так, как они выглядят зимой. Такой (зимний) вид может быть отменён либо путём деактивации здесь, либо если вы поменяете «Стиль карты» в меню «Настройки карты» на желаемый вид.</string>
<string name="current_route">Текущий маршрут</string> <string name="current_route">Текущий маршрут</string>
@ -1999,7 +1999,7 @@
<string name="application_dir_description">Выберите, где вы хотите хранить файлы карт и другие данные.</string> <string name="application_dir_description">Выберите, где вы хотите хранить файлы карт и другие данные.</string>
<string name="show_on_start_description">При выключении сразу открывается карта.</string> <string name="show_on_start_description">При выключении сразу открывается карта.</string>
<string name="map_downloaded">Карта загружена</string> <string name="map_downloaded">Карта загружена</string>
<string name="shared_string_qr_code">QR код</string> <string name="shared_string_qr_code">QR-код</string>
<string name="go_to_map">Показать карту</string> <string name="go_to_map">Показать карту</string>
<string name="world_map_download_descr">Мировая обзорная карта (охватывающая весь мир при низком уровне масштабирования) отсутствует или устарела. Пожалуйста, загрузите её для глобального обзора.</string> <string name="world_map_download_descr">Мировая обзорная карта (охватывающая весь мир при низком уровне масштабирования) отсутствует или устарела. Пожалуйста, загрузите её для глобального обзора.</string>
<string name="map_downloaded_descr">Карта %1$s готова к использованию.</string> <string name="map_downloaded_descr">Карта %1$s готова к использованию.</string>
@ -2066,7 +2066,7 @@
<string name="impassable_road_desc">Выберите дороги, которых следует избегать при навигации.</string> <string name="impassable_road_desc">Выберите дороги, которых следует избегать при навигации.</string>
<string name="shared_string_undo_all">Отменить все</string> <string name="shared_string_undo_all">Отменить все</string>
<string name="shared_string_type">Тип</string> <string name="shared_string_type">Тип</string>
<string name="share_osm_edits_subject">OSM правки отправлены через OsmAnd</string> <string name="share_osm_edits_subject">Правки OSM отправлены через OsmAnd</string>
<string name="update_time">Время обновления</string> <string name="update_time">Время обновления</string>
<string name="number_of_contributors">Количество участников</string> <string name="number_of_contributors">Количество участников</string>
<string name="number_of_edits">Количество правок</string> <string name="number_of_edits">Количество правок</string>
@ -2135,7 +2135,7 @@
\nНеобходимо {3} МБ временного хранилища и {1} МБ постоянного. \nНеобходимо {3} МБ временного хранилища и {1} МБ постоянного.
\n(Доступно только {2} МБ)</string> \n(Доступно только {2} МБ)</string>
<string name="upload_osm_note_description">Отправьте свою заметку OSM анонимно или используя свой профиль OpenStreetMap.org.</string> <string name="upload_osm_note_description">Отправьте свою заметку OSM анонимно или используя свой профиль OpenStreetMap.org.</string>
<string name="upload_osm_note">Отправить OSM заметку</string> <string name="upload_osm_note">Отправить заметку OSM</string>
<string name="use_drawer_btn">Использовать меню</string> <string name="use_drawer_btn">Использовать меню</string>
<string name="use_dashboard_btn">Использовать панель управления</string> <string name="use_dashboard_btn">Использовать панель управления</string>
<string name="dashboard_or_drawer_title">Панель управления или меню</string> <string name="dashboard_or_drawer_title">Панель управления или меню</string>
@ -2247,7 +2247,7 @@
<string name="get_for">Получить за %1$s</string> <string name="get_for">Получить за %1$s</string>
<string name="get_it">Получить</string> <string name="get_it">Получить</string>
<string name="osm_live_banner_desc">Получайте неограниченное количество загрузок карт, вдобавок к еженедельным, ежедневным и даже почасовым обновлениям.</string> <string name="osm_live_banner_desc">Получайте неограниченное количество загрузок карт, вдобавок к еженедельным, ежедневным и даже почасовым обновлениям.</string>
<string name="osmand_plus_banner_desc">Неограниченный доступ к картам, обновлениям и плагину Wikipedia.</string> <string name="osmand_plus_banner_desc">Неограниченный доступ к картам, обновлениям и плагину «Википедия».</string>
<string name="select_voice_provider">Выберите голосовое сопровождение</string> <string name="select_voice_provider">Выберите голосовое сопровождение</string>
<string name="osm_live_payment_desc">Абонентская плата взимается за выбранный период. Отменить подписку можно в Google Play в любой момент.</string> <string name="osm_live_payment_desc">Абонентская плата взимается за выбранный период. Отменить подписку можно в Google Play в любой момент.</string>
<string name="donation_to_osm">Пожертвование для сообщества OSM</string> <string name="donation_to_osm">Пожертвование для сообщества OSM</string>
@ -2308,7 +2308,7 @@
<string name="mapillary_widget">Виджет Mapillary</string> <string name="mapillary_widget">Виджет Mapillary</string>
<string name="mapillary_widget_descr">Позволяет быстро внести свой вклад в Mapillary.</string> <string name="mapillary_widget_descr">Позволяет быстро внести свой вклад в Mapillary.</string>
<string name="mapillary_descr">Фото с улиц онлайн для каждого. Открывайте для себя места, сотрудничайте, снимайте мир.</string> <string name="mapillary_descr">Фото с улиц онлайн для каждого. Открывайте для себя места, сотрудничайте, снимайте мир.</string>
<string name="mapillary">Mapillary</string> <string name="mapillary">Изображения на уровне улиц</string>
<string name="plugin_mapillary_descr">Уличные фотографии для всех. Открывайте для себя места, сотрудничайте, снимайте мир.</string> <string name="plugin_mapillary_descr">Уличные фотографии для всех. Открывайте для себя места, сотрудничайте, снимайте мир.</string>
<string name="save_poi_too_many_uppercase">Название содержит слишком много заглавных букв. Вы хотите продолжить?</string> <string name="save_poi_too_many_uppercase">Название содержит слишком много заглавных букв. Вы хотите продолжить?</string>
<string name="quick_action_resume_pause_navigation_descr">Переключатель, чтобы приостановить или возобновить навигацию.</string> <string name="quick_action_resume_pause_navigation_descr">Переключатель, чтобы приостановить или возобновить навигацию.</string>
@ -2545,7 +2545,7 @@
\n• Отображает специальные онлайн-тайлы, спутниковые снимки (с Bing), различные метки, как туристические/навигационные треки GPX и дополнительные слои с настраиваемой прозрачностью \n• Отображает специальные онлайн-тайлы, спутниковые снимки (с Bing), различные метки, как туристические/навигационные треки GPX и дополнительные слои с настраиваемой прозрачностью
\n</string> \n</string>
<string name="osmand_extended_description_part4">Катание на лыжах <string name="osmand_extended_description_part4">Катание на лыжах
\n• OsmAnd плагин лыжные карты позволяет видеть лыжные трассы с уровнем сложности и некоторой дополнительной информацией, как расположение подъёмников и других объектов.</string> \n• OsmAnd-плагин лыжные карты позволяет видеть лыжные трассы с уровнем сложности и некоторой дополнительной информацией, как расположение подъёмников и других объектов.</string>
<string name="osmand_extended_description_part5">Езда на велосипеде <string name="osmand_extended_description_part5">Езда на велосипеде
\n• Поиск велосипедных дорожек на карте \n• Поиск велосипедных дорожек на карте
\n• GPS навигация в велосипедном режиме строит маршрут используя велосипедные дорожки \n• GPS навигация в велосипедном режиме строит маршрут используя велосипедные дорожки
@ -2633,7 +2633,7 @@
\n • Возможность записи путешествие в фоновом режиме (в то время, как устройство находится в спящем режиме) \n • Возможность записи путешествие в фоновом режиме (в то время, как устройство находится в спящем режиме)
\n OsmAnd это активно развивающееся программное обеспечение с открытым исходным кодом. Каждый может внести свой вклад в приложение, сообщая об ошибках, улучшая переводы или кодируя новые функции. Кроме того, проект опирается на финансовые взносы для финансирования разработки и тестирования новых функциональных возможностей. \n OsmAnd это активно развивающееся программное обеспечение с открытым исходным кодом. Каждый может внести свой вклад в приложение, сообщая об ошибках, улучшая переводы или кодируя новые функции. Кроме того, проект опирается на финансовые взносы для финансирования разработки и тестирования новых функциональных возможностей.
\n</string> \n</string>
<string name="empty_state_osm_edits">Создать или изменить OSM объекты</string> <string name="empty_state_osm_edits">Создать или изменить объекты OSM</string>
<string name="empty_state_osm_edits_descr">Создавайте или изменяйте OSM POI, открывайте или комментируйте заметки OSM, а также отправляйте записанные файлы GPX.</string> <string name="empty_state_osm_edits_descr">Создавайте или изменяйте OSM POI, открывайте или комментируйте заметки OSM, а также отправляйте записанные файлы GPX.</string>
<string name="shared_string_deleted">Удалено</string> <string name="shared_string_deleted">Удалено</string>
<string name="shared_string_edited">Отредактировано</string> <string name="shared_string_edited">Отредактировано</string>
@ -2699,7 +2699,7 @@
<string name="osm_edits_export_desc">Экспортировать как: заметки OSM, POI или оба.</string> <string name="osm_edits_export_desc">Экспортировать как: заметки OSM, POI или оба.</string>
<string name="all_data">Все данные</string> <string name="all_data">Все данные</string>
<string name="osm_notes">Заметки OSM</string> <string name="osm_notes">Заметки OSM</string>
<string name="tunnel_warning">Впереди тоннель</string> <string name="tunnel_warning">Впереди туннель</string>
<string name="show_tunnels">Туннели</string> <string name="show_tunnels">Туннели</string>
<string name="make_as_start_point">Сделать отправной точкой</string> <string name="make_as_start_point">Сделать отправной точкой</string>
<string name="enter_the_file_name">Введите имя файла.</string> <string name="enter_the_file_name">Введите имя файла.</string>
@ -3236,7 +3236,7 @@
<string name="manage_profiles">Управление профилями приложения…</string> <string name="manage_profiles">Управление профилями приложения…</string>
<string name="utm_format_descr">OsmAnd использует формат UTM Standard, который похож, но не идентичен формату UTM NATO.</string> <string name="utm_format_descr">OsmAnd использует формат UTM Standard, который похож, но не идентичен формату UTM NATO.</string>
<string name="navigate_point_format_utm">UTM Стандарт</string> <string name="navigate_point_format_utm">UTM Стандарт</string>
<string name="navigate_point_format_olc">Open Location Code</string> <string name="navigate_point_format_olc">Открытый код местоположения (OLC)</string>
<string name="coordinates_format_info">Выбранный формат будет применён во всём приложении.</string> <string name="coordinates_format_info">Выбранный формат будет применён во всём приложении.</string>
<string name="pref_selected_by_default_for_profiles">Параметр выбран по умолчанию для профилей: %s</string> <string name="pref_selected_by_default_for_profiles">Параметр выбран по умолчанию для профилей: %s</string>
<string name="route_parameters_info">Настройки для маршрутизации в выбранном профиле «%1$s».</string> <string name="route_parameters_info">Настройки для маршрутизации в выбранном профиле «%1$s».</string>
@ -3847,10 +3847,11 @@
<string name="rourte_between_points_next_segment_button_desc">Только следующий сегмент будет перестроен с использованием выбранного профиля.</string> <string name="rourte_between_points_next_segment_button_desc">Только следующий сегмент будет перестроен с использованием выбранного профиля.</string>
<string name="next_segment">Следующий сегмент</string> <string name="next_segment">Следующий сегмент</string>
<string name="whole_track">Весь трек</string> <string name="whole_track">Весь трек</string>
<string name="rourte_between_points_warning_desc">Для использования данной опции OsmAnd проложет ваш трек по дорогам. <string name="rourte_between_points_warning_desc">Для использования данной возможности OsmAnd проложит ваш трек по дорогам.
\n \n
\nДалее вам следует выбрать профиль для построения маршрута с учётом ограничений этого профиля.</string> \nДалее вам следует выбрать профиль для построения маршрута с учётом ограничений этого профиля.</string>
<string name="rourte_between_points_desc">Выберите как соединять точки: по прямой линии или построением маршрута.</string> <string name="rourte_between_points_desc">Выберите как соединять точки: по прямой линии или построением маршрута.</string>
<string name="in_case_of_reverse_direction">В случае обратного направления</string> <string name="in_case_of_reverse_direction">В случае обратного направления</string>
<string name="plan_route_exit_dialog_descr">Закрыть план маршрута без сохранения\? Все изменения будут потеряны.</string> <string name="plan_route_exit_dialog_descr">Закрыть план маршрута без сохранения\? Все изменения будут потеряны.</string>
<string name="street_level_imagery">Изображения на уровне улиц</string>
</resources> </resources>

View file

@ -3556,4 +3556,15 @@
<string name="poi_sms">SMS</string> <string name="poi_sms">SMS</string>
<string name="poi_climbing_crag_filter">Lezecká stena</string> <string name="poi_climbing_crag_filter">Lezecká stena</string>
<string name="poi_cellar_entrance">Vstup do pivnice</string> <string name="poi_cellar_entrance">Vstup do pivnice</string>
<string name="poi_surface_artificial_turf">Umelý trávnik</string>
<string name="poi_atm_yes">Bankomat: áno</string>
<string name="poi_health_specialty_naturopathy_yes">Prírodná medicína</string>
<string name="poi_health_specialty_manual_therapy_yes">Manuálna terapia</string>
<string name="poi_health_specialty_optometry_yes">Optometria</string>
<string name="poi_health_specialty_obstetrics_caesarean_section_yes">Pôrodníctvo (cisársky rez)</string>
<string name="poi_cooperative">Družstevná kancelária</string>
<string name="poi_wetland_bog">Močiar</string>
<string name="poi_traffic_signals_arrow">Šípka</string>
<string name="poi_traffic_signals_vibration">Vibrácie</string>
<string name="poi_fire_hydrant_pressure_filter">Tlak</string>
</resources> </resources>

View file

@ -248,6 +248,8 @@
<dimen name="content_padding_small">12dp</dimen> <dimen name="content_padding_small">12dp</dimen>
<dimen name="content_padding_half">8dp</dimen> <dimen name="content_padding_half">8dp</dimen>
<dimen name="bottom_sheet_content_padding_small">8dp</dimen> <dimen name="bottom_sheet_content_padding_small">8dp</dimen>
<dimen name="measurement_tool_menu_title_padding_top">13dp</dimen>
<dimen name="measurement_tool_menu_title_padding_bottom">5dp</dimen>
<dimen name="measurement_tool_divider_margin">8dp</dimen> <dimen name="measurement_tool_divider_margin">8dp</dimen>
<dimen name="measurement_tool_content_padding_medium">12dp</dimen> <dimen name="measurement_tool_content_padding_medium">12dp</dimen>
<dimen name="text_margin_small">4dp</dimen> <dimen name="text_margin_small">4dp</dimen>

View file

@ -39,6 +39,7 @@ public class SQLiteTileSource implements ITileSource {
private static final String ELLIPSOID = "ellipsoid"; private static final String ELLIPSOID = "ellipsoid";
private static final String INVERTED_Y = "inverted_y"; private static final String INVERTED_Y = "inverted_y";
private static final String REFERER = "referer"; private static final String REFERER = "referer";
private static final String USER_AGENT = "useragent";
private static final String TIME_COLUMN = "timecolumn"; private static final String TIME_COLUMN = "timecolumn";
private static final String EXPIRE_MINUTES = "expireminutes"; private static final String EXPIRE_MINUTES = "expireminutes";
private static final String RULE = "rule"; private static final String RULE = "rule";
@ -62,6 +63,7 @@ public class SQLiteTileSource implements ITileSource {
private String[] randomsArray; private String[] randomsArray;
private String rule = null; private String rule = null;
private String referer = null; private String referer = null;
private String userAgent = null;
int tileSize = 256; int tileSize = 256;
boolean tileSizeSpecified = false; boolean tileSizeSpecified = false;
@ -93,7 +95,7 @@ public class SQLiteTileSource implements ITileSource {
} }
public SQLiteTileSource(OsmandApplication ctx, String name, int minZoom, int maxZoom, String urlTemplate, public SQLiteTileSource(OsmandApplication ctx, String name, int minZoom, int maxZoom, String urlTemplate,
String randoms, boolean isEllipsoid, boolean invertedY, String referer, String randoms, boolean isEllipsoid, boolean invertedY, String referer, String userAgent,
boolean timeSupported, long expirationTimeMillis, boolean inversiveZoom, String rule) { boolean timeSupported, long expirationTimeMillis, boolean inversiveZoom, String rule) {
this.ctx = ctx; this.ctx = ctx;
this.name = name; this.name = name;
@ -104,6 +106,7 @@ public class SQLiteTileSource implements ITileSource {
this.expirationTimeMillis = expirationTimeMillis; this.expirationTimeMillis = expirationTimeMillis;
this.randoms = randoms; this.randoms = randoms;
this.referer = referer; this.referer = referer;
this.userAgent = userAgent;
this.rule = rule; this.rule = rule;
this.invertedY = invertedY; this.invertedY = invertedY;
this.timeSupported = timeSupported; this.timeSupported = timeSupported;
@ -120,6 +123,7 @@ public class SQLiteTileSource implements ITileSource {
this.expirationTimeMillis = tileSource.getExpirationTimeMillis(); this.expirationTimeMillis = tileSource.getExpirationTimeMillis();
this.randoms = tileSource.getRandoms(); this.randoms = tileSource.getRandoms();
this.referer = tileSource.getReferer(); this.referer = tileSource.getReferer();
this.userAgent = tileSource.getUserAgent();
this.invertedY = tileSource.isInvertedYTile(); this.invertedY = tileSource.isInvertedYTile();
this.timeSupported = tileSource.isTimeSupported(); this.timeSupported = tileSource.isTimeSupported();
this.inversiveZoom = tileSource.getInversiveZoom(); this.inversiveZoom = tileSource.getInversiveZoom();
@ -139,6 +143,7 @@ public class SQLiteTileSource implements ITileSource {
addInfoColumn(db, ELLIPSOID, isEllipsoid ? "1" : "0"); addInfoColumn(db, ELLIPSOID, isEllipsoid ? "1" : "0");
addInfoColumn(db, INVERTED_Y, invertedY ? "1" : "0"); addInfoColumn(db, INVERTED_Y, invertedY ? "1" : "0");
addInfoColumn(db, REFERER, referer); addInfoColumn(db, REFERER, referer);
addInfoColumn(db, USER_AGENT, userAgent);
addInfoColumn(db, TIME_COLUMN, timeSupported ? "yes" : "no"); addInfoColumn(db, TIME_COLUMN, timeSupported ? "yes" : "no");
addInfoColumn(db, EXPIRE_MINUTES, String.valueOf(getExpirationTimeMinutes())); addInfoColumn(db, EXPIRE_MINUTES, String.valueOf(getExpirationTimeMinutes()));
@ -264,6 +269,10 @@ public class SQLiteTileSource implements ITileSource {
if(refererId != -1) { if(refererId != -1) {
referer = cursor.getString(refererId); referer = cursor.getString(refererId);
} }
int userAgentId = list.indexOf(USER_AGENT);
if(userAgentId != -1) {
userAgent = cursor.getString(userAgentId);
}
int tnumbering = list.indexOf(TILENUMBERING); int tnumbering = list.indexOf(TILENUMBERING);
if(tnumbering != -1) { if(tnumbering != -1) {
inversiveZoom = BIG_PLANET_TILE_NUMBERING.equalsIgnoreCase(cursor.getString(tnumbering)); inversiveZoom = BIG_PLANET_TILE_NUMBERING.equalsIgnoreCase(cursor.getString(tnumbering));
@ -673,4 +682,8 @@ public class SQLiteTileSource implements ITileSource {
return referer; return referer;
} }
public String getUserAgent() {
return userAgent;
}
} }

View file

@ -343,7 +343,7 @@ public class MapActivityActions implements DialogProvider {
final double longitude, final double longitude,
final ContextMenuAdapter adapter, final ContextMenuAdapter adapter,
Object selectedObj, Object selectedObj,
boolean all) { boolean configureMenu) {
ItemBuilder itemBuilder = new ItemBuilder(); ItemBuilder itemBuilder = new ItemBuilder();
adapter.addItem(itemBuilder adapter.addItem(itemBuilder
@ -400,7 +400,7 @@ public class MapActivityActions implements DialogProvider {
ContextMenuItem editGpxItem = new ItemBuilder() ContextMenuItem editGpxItem = new ItemBuilder()
.setTitleId(R.string.context_menu_item_edit_waypoint, mapActivity) .setTitleId(R.string.context_menu_item_edit_waypoint, mapActivity)
.setId(MAP_CONTEXT_MENU_EDIT_GPX_WP) .setId(MAP_CONTEXT_MENU_ADD_GPX_WAYPOINT)
.setIcon(R.drawable.ic_action_edit_dark) .setIcon(R.drawable.ic_action_edit_dark)
.setOrder(EDIT_GPX_WAYPOINT_ITEM_ORDER) .setOrder(EDIT_GPX_WAYPOINT_ITEM_ORDER)
.setListener(listener).createItem(); .setListener(listener).createItem();
@ -411,8 +411,7 @@ public class MapActivityActions implements DialogProvider {
.setOrder(ADD_GPX_WAYPOINT_ITEM_ORDER) .setOrder(ADD_GPX_WAYPOINT_ITEM_ORDER)
.setListener(listener).createItem(); .setListener(listener).createItem();
if (all) { if (configureMenu) {
adapter.addItem(editGpxItem);
adapter.addItem(addGpxItem); adapter.addItem(addGpxItem);
} else if (selectedObj instanceof WptPt } else if (selectedObj instanceof WptPt
&& getMyApplication().getSelectedGpxHelper().getSelectedGPXFile((WptPt) selectedObj) != null) { && getMyApplication().getSelectedGpxHelper().getSelectedGPXFile((WptPt) selectedObj) != null) {

View file

@ -1062,7 +1062,7 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
} }
} }
public ContextMenuAdapter getActionsContextMenuAdapter(boolean all) { public ContextMenuAdapter getActionsContextMenuAdapter(boolean configure) {
MapActivity mapActivity = getMapActivity(); MapActivity mapActivity = getMapActivity();
final ContextMenuAdapter menuAdapter = new ContextMenuAdapter(getMyApplication()); final ContextMenuAdapter menuAdapter = new ContextMenuAdapter(getMyApplication());
if (mapActivity != null) { if (mapActivity != null) {
@ -1070,7 +1070,7 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
for (OsmandMapLayer layer : mapActivity.getMapView().getLayers()) { for (OsmandMapLayer layer : mapActivity.getMapView().getLayers()) {
layer.populateObjectContextMenu(latLon, getObject(), menuAdapter, mapActivity); layer.populateObjectContextMenu(latLon, getObject(), menuAdapter, mapActivity);
} }
mapActivity.getMapActions().addActionsToAdapter(all ? 0 : latLon.getLatitude(), all ? 0 : latLon.getLongitude(), menuAdapter, getObject(), all); mapActivity.getMapActions().addActionsToAdapter(configure ? 0 : latLon.getLatitude(), configure ? 0 : latLon.getLongitude(), menuAdapter, getObject(), configure);
} }
return menuAdapter; return menuAdapter;
} }

View file

@ -471,7 +471,9 @@ public class AmenityMenuBuilder extends MenuBuilder {
} }
textPrefix = app.getString(R.string.poi_cuisine); textPrefix = app.getString(R.string.poi_cuisine);
vl = sb.toString(); vl = sb.toString();
} else if (key.contains(Amenity.ROUTE) || key.equals(Amenity.WIKIDATA)) { } else if (key.contains(Amenity.ROUTE)
|| key.equals(Amenity.WIKIDATA)
|| key.equals(Amenity.WIKIMEDIA_COMMONS)) {
continue; continue;
} else { } else {
if (key.contains(Amenity.DESCRIPTION)) { if (key.contains(Amenity.DESCRIPTION)) {
@ -784,7 +786,8 @@ public class AmenityMenuBuilder extends MenuBuilder {
Map<String, String> additionalInfo = amenity.getAdditionalInfo(); Map<String, String> additionalInfo = amenity.getAdditionalInfo();
String imageValue = additionalInfo.get("image"); String imageValue = additionalInfo.get("image");
String mapillaryValue = additionalInfo.get("mapillary"); String mapillaryValue = additionalInfo.get("mapillary");
String wikidataValue = additionalInfo.get("wikidata"); String wikidataValue = additionalInfo.get(Amenity.WIKIDATA);
String wikimediaValue = additionalInfo.get(Amenity.WIKIMEDIA_COMMONS);
if (!Algorithms.isEmpty(imageValue)) { if (!Algorithms.isEmpty(imageValue)) {
params.put("osm_image", imageValue); params.put("osm_image", imageValue);
} }
@ -792,7 +795,10 @@ public class AmenityMenuBuilder extends MenuBuilder {
params.put("osm_mapillary_key", mapillaryValue); params.put("osm_mapillary_key", mapillaryValue);
} }
if (!Algorithms.isEmpty(wikidataValue)) { if (!Algorithms.isEmpty(wikidataValue)) {
params.put("wikidata_id", wikidataValue); params.put(Amenity.WIKIDATA, wikidataValue);
}
if (!Algorithms.isEmpty(wikimediaValue)) {
params.put(Amenity.WIKIMEDIA_COMMONS, wikimediaValue);
} }
return params; return params;
} }

View file

@ -17,6 +17,7 @@ import androidx.appcompat.widget.AppCompatButton;
import net.osmand.AndroidNetworkUtils; import net.osmand.AndroidNetworkUtils;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.Location; import net.osmand.Location;
import net.osmand.data.Amenity;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
@ -438,10 +439,15 @@ public abstract class ImageCard extends AbstractCard {
pms.put("lang", preferredLang); pms.put("lang", preferredLang);
} }
if (this.params != null) { if (this.params != null) {
String wikidataId = this.params.get("wikidata_id"); String wikidataId = this.params.get(Amenity.WIKIDATA);
if (wikidataId != null) { if (wikidataId != null) {
this.params.remove("wikidata_id"); this.params.remove(Amenity.WIKIDATA);
WikiImageHelper.fillWikiMediaCards(mapActivity, wikidataId, result); WikiImageHelper.addWikidataImageCards(mapActivity, wikidataId, result);
}
String wikimediaContent = this.params.get(Amenity.WIKIMEDIA_COMMONS);
if (wikimediaContent != null) {
this.params.remove(Amenity.WIKIMEDIA_COMMONS);
WikiImageHelper.addWikimediaImageCards(mapActivity, wikimediaContent, result);
} }
pms.putAll(this.params); pms.putAll(this.params);
} }

View file

@ -392,7 +392,7 @@ public class EditMapSourceDialogFragment extends BaseOsmAndDialogFragment
SQLiteTileSource sqLiteTileSource = SQLiteTileSource sqLiteTileSource =
new SQLiteTileSource(app, newName, minZoom, new SQLiteTileSource(app, newName, minZoom,
maxZoom, urlToLoad, "", maxZoom, urlToLoad, "",
elliptic, false, "", expireTimeMinutes > 0, elliptic, false, "", "", expireTimeMinutes > 0,
expireTimeMinutes * 60 * 1000L, false, "" expireTimeMinutes * 60 * 1000L, false, ""
); );
sqLiteTileSource.createDataBase(); sqLiteTileSource.createDataBase();

View file

@ -14,7 +14,6 @@ import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemButton; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemButton;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.ShortDescriptionItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.ShortDescriptionItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
public class ExitBottomSheetDialogFragment extends MenuBottomSheetDialogFragment { public class ExitBottomSheetDialogFragment extends MenuBottomSheetDialogFragment {
@ -27,12 +26,10 @@ public class ExitBottomSheetDialogFragment extends MenuBottomSheetDialogFragment
@Override @Override
public void createMenuItems(Bundle savedInstanceState) { public void createMenuItems(Bundle savedInstanceState) {
items.add(new TitleItem(getString(R.string.exit_without_saving)));
items.add(new ShortDescriptionItem.Builder() items.add(new ShortDescriptionItem.Builder()
.setDescription(getString(R.string.plan_route_exit_dialog_descr)) .setDescription(getString(R.string.plan_route_exit_dialog_descr))
.setDescriptionColorId(nightMode ? R.color.text_color_primary_dark : R.color.text_color_primary_light) .setTitle(getString(R.string.exit_without_saving))
.setLayoutId(R.layout.bottom_sheet_item_description_long) .setLayoutId(R.layout.bottom_sheet_item_list_title_with_descr)
.create()); .create());
items.add(new DividerSpaceItem(getContext(), items.add(new DividerSpaceItem(getContext(),
@ -75,7 +72,7 @@ public class ExitBottomSheetDialogFragment extends MenuBottomSheetDialogFragment
@Override @Override
protected int getDismissButtonTextId() { protected int getDismissButtonTextId() {
return R.string.shared_string_close; return R.string.shared_string_cancel;
} }
public static void showInstance(@NonNull FragmentManager fragmentManager, @Nullable Fragment targetFragment) { public static void showInstance(@NonNull FragmentManager fragmentManager, @Nullable Fragment targetFragment) {

View file

@ -37,6 +37,7 @@ import java.util.List;
import static net.osmand.plus.UiUtilities.CustomRadioButtonType.*; import static net.osmand.plus.UiUtilities.CustomRadioButtonType.*;
import static net.osmand.plus.measurementtool.MeasurementEditingContext.CalculationMode.NEXT_SEGMENT; import static net.osmand.plus.measurementtool.MeasurementEditingContext.CalculationMode.NEXT_SEGMENT;
import static net.osmand.plus.measurementtool.MeasurementEditingContext.CalculationMode.WHOLE_TRACK; import static net.osmand.plus.measurementtool.MeasurementEditingContext.CalculationMode.WHOLE_TRACK;
import static net.osmand.plus.measurementtool.MeasurementEditingContext.DEFAULT_APP_MODE;
public class RouteBetweenPointsBottomSheetDialogFragment extends BottomSheetDialogFragment { public class RouteBetweenPointsBottomSheetDialogFragment extends BottomSheetDialogFragment {
@ -70,8 +71,9 @@ public class RouteBetweenPointsBottomSheetDialogFragment extends BottomSheetDial
nightMode = app.getDaynightHelper().isNightModeForMapControls(); nightMode = app.getDaynightHelper().isNightModeForMapControls();
FragmentActivity activity = requireActivity(); FragmentActivity activity = requireActivity();
portrait = AndroidUiHelper.isOrientationPortrait(activity); portrait = AndroidUiHelper.isOrientationPortrait(activity);
final View mainView = inflater.inflate(R.layout.fragment_route_between_points_bottom_sheet_dialog, final View mainView = UiUtilities.getInflater(getContext(), nightMode)
container, false); .inflate(R.layout.fragment_route_between_points_bottom_sheet_dialog,
container, false);
AndroidUtils.setBackground(activity, mainView, nightMode, AndroidUtils.setBackground(activity, mainView, nightMode,
portrait ? R.drawable.bg_bottom_menu_light : R.drawable.bg_bottom_sheet_topsides_landscape_light, portrait ? R.drawable.bg_bottom_menu_light : R.drawable.bg_bottom_sheet_topsides_landscape_light,
portrait ? R.drawable.bg_bottom_menu_dark : R.drawable.bg_bottom_sheet_topsides_landscape_dark); portrait ? R.drawable.bg_bottom_menu_dark : R.drawable.bg_bottom_sheet_topsides_landscape_dark);
@ -101,7 +103,7 @@ public class RouteBetweenPointsBottomSheetDialogFragment extends BottomSheetDial
@Override @Override
public void onClick(View view) { public void onClick(View view) {
snapToRoadEnabled = false; snapToRoadEnabled = false;
ApplicationMode mode = null; ApplicationMode mode = DEFAULT_APP_MODE;
if ((int) view.getTag() != STRAIGHT_LINE_TAG) { if ((int) view.getTag() != STRAIGHT_LINE_TAG) {
mode = modes.get((int) view.getTag()); mode = modes.get((int) view.getTag());
snapToRoadEnabled = true; snapToRoadEnabled = true;
@ -116,7 +118,7 @@ public class RouteBetweenPointsBottomSheetDialogFragment extends BottomSheetDial
Drawable icon = app.getUIUtilities().getIcon(R.drawable.ic_action_split_interval, nightMode); Drawable icon = app.getUIUtilities().getIcon(R.drawable.ic_action_split_interval, nightMode);
addProfileView(navigationType, onClickListener, STRAIGHT_LINE_TAG, icon, addProfileView(navigationType, onClickListener, STRAIGHT_LINE_TAG, icon,
app.getText(R.string.routing_profile_straightline), snapToRoadAppMode == null); app.getText(R.string.routing_profile_straightline), snapToRoadAppMode == DEFAULT_APP_MODE);
addDelimiterView(navigationType); addDelimiterView(navigationType);
for (int i = 0; i < modes.size(); i++) { for (int i = 0; i < modes.size(); i++) {

View file

@ -8,14 +8,12 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.base.MenuBottomSheetDialogFragment; import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription; import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem; import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
import net.osmand.plus.helpers.GpxTrackAdapter; import net.osmand.plus.helpers.GpxTrackAdapter;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -38,15 +36,13 @@ public class SnapTrackWarningBottomSheet extends MenuBottomSheetDialogFragment {
if (activity instanceof MapActivity) { if (activity instanceof MapActivity) {
activity.findViewById(R.id.snap_to_road_image_button).setVisibility(View.GONE); activity.findViewById(R.id.snap_to_road_image_button).setVisibility(View.GONE);
} }
OsmandApplication app = requiredMyApplication();
items.add(new TitleItem(getString(R.string.route_between_points)));
BaseBottomSheetItem description = new BottomSheetItemWithDescription.Builder() BaseBottomSheetItem description = new BottomSheetItemWithDescription.Builder()
.setDescription(app.getString(R.string.rourte_between_points_warning_desc)) .setDescription(getString(R.string.rourte_between_points_warning_desc))
.setDescriptionColorId(R.color.text_color_primary_light) .setTitle(getString(R.string.route_between_points))
.setLayoutId(R.layout.bottom_sheet_item_description_long) .setLayoutId(R.layout.bottom_sheet_item_list_title_with_descr)
.create(); .create();
items.add(description); items.add(description);
items.add(new DividerSpaceItem(app, app.getResources().getDimensionPixelSize(R.dimen.content_padding_half))); items.add(new DividerSpaceItem(getContext(), getResources().getDimensionPixelSize(R.dimen.content_padding_half)));
} }
@Override @Override

View file

@ -265,14 +265,14 @@ public class OsmEditingPlugin extends OsmandPlugin {
} }
if (isEditable) { if (isEditable) {
adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.poi_context_menu_modify, mapActivity) adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.poi_context_menu_modify, mapActivity)
.setId(MAP_CONTEXT_MENU_MODIFY_POI) .setId(MAP_CONTEXT_MENU_CREATE_POI)
.setIcon(R.drawable.ic_action_edit_dark) .setIcon(R.drawable.ic_action_edit_dark)
.setOrder(MODIFY_POI_ITEM_ORDER) .setOrder(MODIFY_POI_ITEM_ORDER)
.setListener(listener) .setListener(listener)
.createItem()); .createItem());
} else if (selectedObj instanceof OpenstreetmapPoint && ((OpenstreetmapPoint) selectedObj).getAction() != Action.DELETE) { } else if (selectedObj instanceof OpenstreetmapPoint && ((OpenstreetmapPoint) selectedObj).getAction() != Action.DELETE) {
adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.poi_context_menu_modify_osm_change, mapActivity) adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.poi_context_menu_modify_osm_change, mapActivity)
.setId(MAP_CONTEXT_MENU_MODIFY_OSM_CHANGE) .setId(MAP_CONTEXT_MENU_CREATE_POI)
.setIcon(R.drawable.ic_action_edit_dark) .setIcon(R.drawable.ic_action_edit_dark)
.setOrder(MODIFY_OSM_CHANGE_ITEM_ORDER) .setOrder(MODIFY_OSM_CHANGE_ITEM_ORDER)
.setListener(listener) .setListener(listener)
@ -287,7 +287,7 @@ public class OsmEditingPlugin extends OsmandPlugin {
} }
if (selectedObj instanceof OsmNotesPoint) { if (selectedObj instanceof OsmNotesPoint) {
adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.context_menu_item_modify_note, mapActivity) adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.context_menu_item_modify_note, mapActivity)
.setId(MAP_CONTEXT_MENU_MODIFY_OSM_NOTE) .setId(MAP_CONTEXT_MENU_OPEN_OSM_NOTE)
.setIcon(R.drawable.ic_action_edit_dark) .setIcon(R.drawable.ic_action_edit_dark)
.setOrder(MODIFY_OSM_NOTE_ITEM_ORDER) .setOrder(MODIFY_OSM_NOTE_ITEM_ORDER)
.setListener(listener) .setListener(listener)

View file

@ -105,12 +105,13 @@ public class AsyncLoadingThread extends Thread {
} }
public TileLoadDownloadRequest(File dirWithTiles, String url, File fileToSave, String tileId, ITileSource source, int tileX, public TileLoadDownloadRequest(File dirWithTiles, String url, File fileToSave, String tileId, ITileSource source, int tileX,
int tileY, int zoom, String referer) { int tileY, int zoom, String referer, String userAgent) {
super(url, fileToSave, tileX, tileY, zoom); super(url, fileToSave, tileX, tileY, zoom);
this.dirWithTiles = dirWithTiles; this.dirWithTiles = dirWithTiles;
this.tileSource = source; this.tileSource = source;
this.tileId = tileId; this.tileId = tileId;
this.referer = referer; this.referer = referer;
this.userAgent = userAgent;
} }
public void saveTile(InputStream inputStream) throws IOException { public void saveTile(InputStream inputStream) throws IOException {

View file

@ -144,7 +144,7 @@ public abstract class TilesCache<T> {
} }
} }
TileLoadDownloadRequest req = new TileLoadDownloadRequest(dirWithTiles, url, toSave, TileLoadDownloadRequest req = new TileLoadDownloadRequest(dirWithTiles, url, toSave,
tileId, map, x, y, zoom, map.getReferer()); tileId, map, x, y, zoom, map.getReferer(), map.getUserAgent());
if (sync) { if (sync) {
return getRequestedTile(req); return getRequestedTile(req);
} else { } else {

View file

@ -2035,6 +2035,7 @@ public class SettingsHelper {
boolean ellipsoid = object.optBoolean("ellipsoid", false); boolean ellipsoid = object.optBoolean("ellipsoid", false);
boolean invertedY = object.optBoolean("inverted_y", false); boolean invertedY = object.optBoolean("inverted_y", false);
String referer = object.optString("referer"); String referer = object.optString("referer");
String userAgent = object.optString("userAgent");
boolean timeSupported = object.optBoolean("timesupported", false); boolean timeSupported = object.optBoolean("timesupported", false);
long expire = object.optLong("expire", -1); long expire = object.optLong("expire", -1);
boolean inversiveZoom = object.optBoolean("inversiveZoom", false); boolean inversiveZoom = object.optBoolean("inversiveZoom", false);
@ -2054,13 +2055,14 @@ public class SettingsHelper {
tileSourceTemplate.setRule(rule); tileSourceTemplate.setRule(rule);
tileSourceTemplate.setRandoms(randoms); tileSourceTemplate.setRandoms(randoms);
tileSourceTemplate.setReferer(referer); tileSourceTemplate.setReferer(referer);
tileSourceTemplate.setUserAgent(userAgent);
tileSourceTemplate.setEllipticYTile(ellipsoid); tileSourceTemplate.setEllipticYTile(ellipsoid);
tileSourceTemplate.setInvertedYTile(invertedY); tileSourceTemplate.setInvertedYTile(invertedY);
tileSourceTemplate.setExpirationTimeMillis(timeSupported ? expire : -1); tileSourceTemplate.setExpirationTimeMillis(timeSupported ? expire : -1);
template = tileSourceTemplate; template = tileSourceTemplate;
} else { } else {
template = new SQLiteTileSource(app, name, minZoom, maxZoom, url, randoms, ellipsoid, invertedY, referer, timeSupported, expire, inversiveZoom, rule); template = new SQLiteTileSource(app, name, minZoom, maxZoom, url, randoms, ellipsoid, invertedY, referer, userAgent, timeSupported, expire, inversiveZoom, rule);
} }
items.add(template); items.add(template);
} }
@ -2087,6 +2089,7 @@ public class SettingsHelper {
jsonObject.put("ellipsoid", template.isEllipticYTile()); jsonObject.put("ellipsoid", template.isEllipticYTile());
jsonObject.put("inverted_y", template.isInvertedYTile()); jsonObject.put("inverted_y", template.isInvertedYTile());
jsonObject.put("referer", template.getReferer()); jsonObject.put("referer", template.getReferer());
jsonObject.put("userAgent", template.getUserAgent());
jsonObject.put("timesupported", template.isTimeSupported()); jsonObject.put("timesupported", template.isTimeSupported());
jsonObject.put("expire", template.getExpirationTimeMinutes()); jsonObject.put("expire", template.getExpirationTimeMinutes());
jsonObject.put("inversiveZoom", template.getInversiveZoom()); jsonObject.put("inversiveZoom", template.getInversiveZoom());

View file

@ -574,11 +574,21 @@ public class ContextMenuLayer extends OsmandMapLayer {
applyingMarkerLatLon = null; applyingMarkerLatLon = null;
} }
public boolean showContextMenuForMyLocation() {
PointLocationLayer provider = view.getLayerByClass(PointLocationLayer.class);
if (provider != null) {
LatLon ll = provider.getObjectLocation(null);
if (ll != null) {
PointDescription pointDescription = provider.getObjectName(null);
return showContextMenu(ll, pointDescription, ll, provider);
}
}
return false;
}
public boolean showContextMenu(double latitude, double longitude, boolean showUnknownLocation) { public boolean showContextMenu(double latitude, double longitude, boolean showUnknownLocation) {
RotatedTileBox cp = activity.getMapView().getCurrentRotatedTileBox(); return showContextMenu(getPointFromLatLon(latitude, longitude),
float x = cp.getPixXFromLatLon(latitude, longitude); activity.getMapView().getCurrentRotatedTileBox(), showUnknownLocation);
float y = cp.getPixYFromLatLon(latitude, longitude);
return showContextMenu(new PointF(x, y), activity.getMapView().getCurrentRotatedTileBox(), showUnknownLocation);
} }
public boolean showContextMenu(@NonNull LatLon latLon, public boolean showContextMenu(@NonNull LatLon latLon,
@ -803,6 +813,13 @@ public class ContextMenuLayer extends OsmandMapLayer {
return false; return false;
} }
private PointF getPointFromLatLon(double latitude, double longitude) {
RotatedTileBox cp = activity.getMapView().getCurrentRotatedTileBox();
float x = cp.getPixXFromLatLon(latitude, longitude);
float y = cp.getPixYFromLatLon(latitude, longitude);
return new PointF(x, y);
}
private List<String> getValues(@Nullable QStringStringHash set) { private List<String> getValues(@Nullable QStringStringHash set) {
List<String> res = new ArrayList<>(); List<String> res = new ArrayList<>();
if (set != null) { if (set != null) {

View file

@ -439,15 +439,9 @@ public class MapControlsLayer extends OsmandMapLayer {
} }
private void showContextMenuForMyLocation() { private void showContextMenuForMyLocation() {
OsmAndLocationProvider lp = app.getLocationProvider(); ContextMenuLayer cml = mapActivity.getMapView().getLayerByClass(ContextMenuLayer.class);
Location lastKnownLocation = lp.getLastKnownLocation(); if (cml != null) {
Location lastStaleKnownLocation = lp.getLastStaleKnownLocation(); cml.showContextMenuForMyLocation();
Location location = lastKnownLocation != null ? lastKnownLocation : lastStaleKnownLocation;
if (location != null) {
ContextMenuLayer cml = mapActivity.getMapView().getLayerByClass(ContextMenuLayer.class);
if (cml != null) {
cml.showContextMenu(location.getLatitude(), location.getLongitude(), true);
}
} }
} }

View file

@ -23,63 +23,111 @@ import java.util.List;
public class WikiImageHelper { public class WikiImageHelper {
private static final String WIKIDATA_API_ENDPOINT = "https://www.wikidata.org/w/api.php"; private static final String WIKIDATA_API_ENDPOINT = "https://www.wikidata.org/w/api.php";
private static final String ACTION = "?action=wbgetclaims&property=P18&entity="; private static final String WIKIMEDIA_API_ENDPOINT = "https://commons.wikimedia.org/w/api.php";
private static final String WIKIDATA_ACTION = "?action=wbgetclaims&property=P18&entity=";
private static final String WIKIMEDIA_ACTION = "?action=query&list=categorymembers&cmtitle=";
private static final String CM_LIMIT = "&cmlimit=500";
private static final String FORMAT_JSON = "&format=json"; private static final String FORMAT_JSON = "&format=json";
private static final String IMAGE_BASE_URL = "https://upload.wikimedia.org/wikipedia/commons/"; private static final String IMAGE_BASE_URL = "https://upload.wikimedia.org/wikipedia/commons/";
private static final String WIKIDATA_PREFIX = "Q"; private static final String WIKIDATA_PREFIX = "Q";
private static final String WIKIMEDIA_FILE = "File:";
private static final String WIKIMEDIA_CATEGORY = "Category:";
private static final int THUMB_SIZE = 500; private static final int THUMB_SIZE = 500;
private static final Log LOG = PlatformUtil.getLog(WikiImageHelper.class); private static final Log LOG = PlatformUtil.getLog(WikiImageHelper.class);
public static void fillWikiMediaCards(@NonNull MapActivity mapActivity, @NonNull String wikidata, public static void addWikidataImageCards(@NonNull MapActivity mapActivity, @NonNull String wikidataId,
List<ImageCard> images) { @NonNull List<ImageCard> imageCards) {
if (wikidata.startsWith(WIKIDATA_PREFIX)) { if (wikidataId.startsWith(WIKIDATA_PREFIX)) {
StringBuilder rawResponse = new StringBuilder(); String url = WIKIDATA_API_ENDPOINT + WIKIDATA_ACTION + wikidataId + FORMAT_JSON;
String url = WIKIDATA_API_ENDPOINT + ACTION + wikidata + FORMAT_JSON; WikidataResponse response = sendWikipediaApiRequest(url, WikidataResponse.class);
String error = NetworkUtils.sendGetRequest(url, null, rawResponse); if (response != null) {
if (error == null) { for (P18 p18 : response.claims.p18) {
try { String imageFileName = p18.mainsnak.datavalue.value;
Gson gson = new Gson(); if (imageFileName != null) {
WikipediaResponse response = gson.fromJson(rawResponse.toString(), WikipediaResponse.class); addImageCard(mapActivity, imageCards, imageFileName);
for (WikiImage img : getImageData(response)) {
images.add(new WikiImageCard(mapActivity, img));
} }
return;
} catch (JsonSyntaxException e) {
error = e.getLocalizedMessage();
} }
} }
LOG.error(error);
} else { } else {
LOG.error("Wrong WikiMedia ID"); LOG.error("Wrong Wikidata ID");
} }
} }
private static List<WikiImage> getImageData(WikipediaResponse response) { public static void addWikimediaImageCards(@NonNull MapActivity mapActivity, @NonNull String wikiMediaTagContent,
List<WikiImage> images = new ArrayList<>(); @NonNull List<ImageCard> imageCards) {
for (P18 p18 : response.claims.p18) { if (wikiMediaTagContent.startsWith(WIKIMEDIA_FILE)) {
String imageFileName = p18.mainsnak.datavalue.value; String fileName = wikiMediaTagContent.substring(WIKIMEDIA_FILE.length());
if (imageFileName != null) { addImageCard(mapActivity, imageCards, fileName);
try { } else if (wikiMediaTagContent.startsWith(WIKIMEDIA_CATEGORY)) {
String imageName = URLDecoder.decode(imageFileName, "UTF-8"); String url = WIKIMEDIA_API_ENDPOINT + WIKIMEDIA_ACTION + wikiMediaTagContent + CM_LIMIT + FORMAT_JSON;
imageFileName = imageName.replace(" ", "_"); WikimediaResponse response = sendWikipediaApiRequest(url, WikimediaResponse.class);
imageName = imageName.substring(0, imageName.lastIndexOf(".")); if (response != null) {
String[] urlHashParts = getHash(imageFileName); List<String> subCategories = new ArrayList<>();
for (Categorymember cm : response.query.categorymembers) {
String imageHiResUrl = IMAGE_BASE_URL + String memberTitle = cm.title;
urlHashParts[0] + "/" + urlHashParts[1] + "/" + if (memberTitle != null) {
imageFileName; if (memberTitle.startsWith(WIKIMEDIA_CATEGORY)) {
String imageStubUrl = IMAGE_BASE_URL + "thumb/" + subCategories.add(memberTitle);
urlHashParts[0] + "/" + urlHashParts[1] + "/" + } else {
imageFileName + "/" + THUMB_SIZE + "px-" + addWikimediaImageCards(mapActivity, memberTitle, imageCards);
imageFileName; }
images.add(new WikiImage(imageName, imageStubUrl, imageHiResUrl)); }
}
} catch (UnsupportedEncodingException e) { for (String subCategory : subCategories) {
LOG.error(e.getLocalizedMessage()); addWikimediaImageCards(mapActivity, subCategory, imageCards);
} }
} }
} else {
LOG.error("Wrong Wikimedia category member");
} }
return images; }
private static <T> T sendWikipediaApiRequest(@NonNull String url, @NonNull Class<T> responseClass) {
StringBuilder rawResponse = new StringBuilder();
String errorMessage = NetworkUtils.sendGetRequest(url, null, rawResponse);
if (errorMessage == null) {
try {
return new Gson().fromJson(rawResponse.toString(), responseClass);
} catch (JsonSyntaxException e) {
errorMessage = e.getLocalizedMessage();
}
}
LOG.error(errorMessage);
return null;
}
private static void addImageCard(@NonNull MapActivity mapActivity, @NonNull List<ImageCard> images,
@NonNull String fileName) {
WikiImage img = getImageData(fileName);
if (img != null) {
images.add(new WikiImageCard(mapActivity, img));
}
}
private static WikiImage getImageData(@NonNull String imageFileName) {
try {
String imageName = URLDecoder.decode(imageFileName, "UTF-8");
imageFileName = imageName.replace(" ", "_");
imageName = imageName.substring(0, imageName.lastIndexOf("."));
String[] urlHashParts = getHash(imageFileName);
String imageHiResUrl = IMAGE_BASE_URL +
urlHashParts[0] + "/" + urlHashParts[1] + "/" +
imageFileName;
String imageStubUrl = IMAGE_BASE_URL + "thumb/" +
urlHashParts[0] + "/" + urlHashParts[1] + "/" +
imageFileName + "/" + THUMB_SIZE + "px-" +
imageFileName;
return new WikiImage(imageName, imageStubUrl, imageHiResUrl);
} catch (UnsupportedEncodingException e) {
LOG.error(e.getLocalizedMessage());
}
return null;
} }
@NonNull @NonNull
@ -88,19 +136,23 @@ public class WikiImageHelper {
return new String[]{md5.substring(0, 1), md5.substring(0, 2)}; return new String[]{md5.substring(0, 1), md5.substring(0, 2)};
} }
// Wikidata response classes
private static class WikidataResponse {
@SerializedName("claims")
@Expose
private Claims claims;
}
private static class Claims { private static class Claims {
@SerializedName("P18") @SerializedName("P18")
@Expose @Expose
private List<P18> p18 = null; private List<P18> p18 = null;
} }
private static class Datavalue { private static class P18 {
@SerializedName("value") @SerializedName("mainsnak")
@Expose @Expose
private String value; private Mainsnak mainsnak;
@SerializedName("type")
@Expose
private String type;
} }
private static class Mainsnak { private static class Mainsnak {
@ -112,15 +164,31 @@ public class WikiImageHelper {
private String datatype; private String datatype;
} }
private static class P18 { private static class Datavalue {
@SerializedName("mainsnak") @SerializedName("value")
@Expose @Expose
private Mainsnak mainsnak; private String value;
@SerializedName("type")
@Expose
private String type;
} }
private static class WikipediaResponse { // Wikimedia response classes
@SerializedName("claims") private static class WikimediaResponse {
@SerializedName("query")
@Expose @Expose
private Claims claims; private Query query;
}
private static class Query {
@SerializedName("categorymembers")
@Expose
private List<Categorymember> categorymembers;
}
private static class Categorymember {
@SerializedName("title")
@Expose
private String title;
} }
} }