diff --git a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java
index d00bf9ffb2..d720dc51ec 100644
--- a/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java
+++ b/OsmAnd-java/src/main/java/net/osmand/search/core/SearchCoreFactory.java
@@ -1317,7 +1317,13 @@ public class SearchCoreFactory {
|| !phrase.isSearchTypeAllowed(ObjectType.HOUSE)) {
continue;
}
- res.localeName = b.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate());
+ if(interpolation) {
+ res.localeName = lw;
+ res.location = b.getLocation(b.interpolation(lw));
+ } else {
+ res.localeName = b.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate());
+ res.location = b.getLocation();
+ }
res.otherNames = b.getAllNames(true);
res.object = b;
res.file = file;
@@ -1328,12 +1334,6 @@ public class SearchCoreFactory {
res.relatedObject = s;
res.localeRelatedObjectName = s.getName(phrase.getSettings().getLang(), phrase.getSettings().isTransliterate());
res.objectType = ObjectType.HOUSE;
- if(interpolation) {
- res.location = b.getLocation(b.interpolation(lw));
- res.localeName = lw;
- } else {
- res.location = b.getLocation();
- }
res.preferredZoom = 17;
resultMatcher.publish(res);
diff --git a/OsmAnd/res/values-es-rAR/strings.xml b/OsmAnd/res/values-es-rAR/strings.xml
index 193189aa46..a994d3f430 100644
--- a/OsmAnd/res/values-es-rAR/strings.xml
+++ b/OsmAnd/res/values-es-rAR/strings.xml
@@ -3126,7 +3126,7 @@
Cancelar suscripción
%1$s • Ahorra %2$s
Ajustes para el perfil:
- OsmAnd utiliza el formato UTM Estándar, similar pero no idéntico al formato UTM NATO.
+ OsmAnd usa el formato UTM Estándar, similar pero no idéntico al formato UTM de la OTAN.
Ejemplo
UTM Estándar
Código de Ubicación Abierto
diff --git a/OsmAnd/res/values-es-rUS/strings.xml b/OsmAnd/res/values-es-rUS/strings.xml
index 80780e72e8..3fb411ea12 100644
--- a/OsmAnd/res/values-es-rUS/strings.xml
+++ b/OsmAnd/res/values-es-rUS/strings.xml
@@ -3125,7 +3125,7 @@
Cancelar suscripción
%1$s • Ahorra %2$s
Ajustes para el perfil:
- OsmAnd utiliza el formato UTM Estándar, similar pero no idéntico al formato UTM NATO.
+ OsmAnd usa el formato UTM Estándar, similar pero no idéntico al formato UTM de la OTAN.
Ejemplo
UTM Estándar
Código de Ubicación Abierto
diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml
index 22ec8f53c2..d0249d93b8 100644
--- a/OsmAnd/res/values-fr/strings.xml
+++ b/OsmAnd/res/values-fr/strings.xml
@@ -301,8 +301,8 @@
Impossible de lire les données GPX.
Cartes vectorielles OSM
Recherche de transport pour cet arrêt
- Modifier point d\'intérêt
- Supprimer point d\'intérêt
+ Modifier le point d\'intérêt
+ Supprimer le point d\'intérêt
D\'après la boussole
Dans la direction du déplacement
Aucune rotation (nord toujours en haut)
diff --git a/OsmAnd/res/values-pt/phrases.xml b/OsmAnd/res/values-pt/phrases.xml
index 0d47393185..ed7298f704 100644
--- a/OsmAnd/res/values-pt/phrases.xml
+++ b/OsmAnd/res/values-pt/phrases.xml
@@ -49,7 +49,7 @@
Queijaria
Loja de chocolates
Loja de cafés
- Loja de conveniência
+ Loja de conveniência/minimercado
Centro comercial
Loja de bebidas
Talho
@@ -247,7 +247,7 @@
Tipo
Tipo
Tipo
- Posição
+ Localização
Fonte de água
Forma de pagamento
Som
@@ -284,9 +284,9 @@
Pago
Fumar
Entrega ao domicílio
- Serviço ao volante
- Serviço ao volante
- Serviço de take-away
+ Serviço no carro parado
+ Serviço a conduzir
+ Comida para levar
Cocktails
Microcervejaria
Serviço
@@ -967,7 +967,7 @@
Montagem de computadores
Salão de beleza
Manicura
- Cabeleireiro
+ Cabeleireiro/a
Salão de massagens
Estúdio de tatuagem
Limpeza de roupa a seco
@@ -1257,7 +1257,7 @@
Outono
Inverno
Com semáforos
- Não controlado (sem semáforo e barreira)
+ Não controlado (sem semáforo nem barreira)
Não sinalizado (sem marcas nem semáforo)
Data de início/inauguração
Acesso de cadeiras de rodas
@@ -1389,7 +1389,7 @@
Painel
Mapa
Posto de turismo
- Sinalização de rota
+ Baliza de caminho
Terminal eletrónico de informação
Sinalização de rota
Mapa de caminhadas
@@ -1555,7 +1555,7 @@
Não aceita cheque
PIKEPASS
Não aceita PIKEPASS
- PIKEPASS (designado)
+ PIKEPASS (assinalado)
Cartão Visa Débito
Não aceita cartão Visa Débito
Não aceita criptomoedas
@@ -1663,11 +1663,11 @@
Apenas livre de glúten
Livre de glúten
Dieta livre de glúten: não
- Kosher
+ Kosher (judaica)
Apenas kosher
Kosher
Dieta kosher: não
- Halal
+ Halal (árabe)
Apenas halal
Halal
Dieta halal: não
@@ -1675,11 +1675,11 @@
Apenas livre de lactose
Livre de lactose
Dieta livre de lactose: não
- Piscitariana
+ Piscitariana (peixes e vegetais)
Sim
- Serviço ao volante: não
+ Serviço a conduzir: não
Sim
- Serviço ao volante: não
+ Serviço a conduzir: não
Nome da cervejaria
Sim
Sem microcervejaria
@@ -1704,7 +1704,7 @@
Produtos usados: não
Produtos usados: unicamente
Peças
- Representante
+ Representante de marca
Reparação
Sem reparação
Reparação de veículos elétricos
@@ -2022,7 +2022,7 @@
Formação: ioga
Formação: arte marcial
Formação: aviação
- Formação: cabeleireiro
+ Formação: cabeleireiro/a
Estrutura monumental
Tipo: indústria petrolífera
Tipo: poço
@@ -2439,7 +2439,7 @@
Cirurgia maxilofacial
Radiologia diagnóstica
Gastroenterologia
- Odontologia
+ Medicina dentária (odontologia)
Nefrologia (doenças renais)
Neurocirurgia
Neuropsiquiatria
@@ -2460,7 +2460,7 @@
Toxicologia clínica
Optometria
Patologia clínica
- Fonoaudiologia
+ Fonoaudiologia (terapia da fala)
Terapia manual
Medicina do desporto
Podologia
@@ -2764,7 +2764,7 @@
Profundidade
Sal
Sal: não
- Designado
+ Assinalado
Rejeito de mineração
Acampamento de verão
Centro de recreativo
@@ -2908,28 +2908,28 @@
Hambúrguer
Café
Sanduíches
- Kebab
- Döner kebab (shawarma)
+ Kebab (Médio Oriente)
+ Döner kebab (turco)
Frango
Gelados
Sushi
Peixe e batatas fritas
- Frutos do mar
+ Marisco
Churrascos
- Noodles
+ Noodles (asiático)
Donuts
- Ramen
+ Ramen (japonês)
Crepes
Café da manhã
- Gyudon
+ Gyudon (japonês)
Bifes
Tapas
- Gastropub
- Heuriger
+ Gastropub (inglês)
+ Heuriger (austríaco e alemão)
Caril
- Buschenschank
+ Buschenschank (austríaco e alemão)
Grelhados
- Bagel
+ Bagel (polaco)
Café-restaurante
Linguiças
Bolos
@@ -2949,26 +2949,26 @@
Iogurtes gelados
Comida frita
Panquecas salgadas
- Bistrô
+ Bistrô (francês)
Padaria
Cuscuz
Frango frito
Sobremesas
Cantina
- Tacos
- Piadina
- Falafel
+ Tacos (mexicano)
+ Piadina (italiano)
+ Falafel (Médio Oriente)
Batidos de frutas
- Souvlaki
+ Souvlaki (grego)
Salgados
Iogurtes
- Gyros
+ Gyros (grego)
Empanadas
Crepes
- Yakiniku
+ Yakiniku (japonês)
Suki tailandês
Udon (japonês)
- Brasserie
+ Brasserie (francês)
Chá de bolhas
Yakitori (japonês)
Sagardotegia (basco)
@@ -2978,11 +2978,11 @@
Chocolates
Vinhos
Batatas
- Brunch
+ Brunch (inglês e norte-americano)
Sandes
- Pita
- Fondue
- Baguetes
+ Pita (judaico)
+ Fondue (suíço)
+ Baguetes (francês)
Pastéis
Burritos
Teriyaki (japonês)
@@ -3040,7 +3040,7 @@
Latino-americana
Nepalesa
Mongol
- Oriente Médio
+ Médio Oriente
Ucraniana
Afegã
Belga
@@ -3181,7 +3181,7 @@
Lanchas: não
Casas-barco: sim
Casas-barco: não
- Gaivota: sim
+ Gaivotas a pedais: sim
Gaivota: não
Motas de água: sim
Motas de água: não
@@ -3249,69 +3249,69 @@
Comunidade
Família
Várias famílias
- Tomada: CEE azul
- Tomada: CEE azul: corrente
- Tomada: CEE azul: saída
- Tomada: CEE vermelha 16A
- Tomada: CEE vermelha 16A: corrente
- Tomada: CEE vermelha 16A: saída
- Tomada: CEE vermelha 32A
- Tomada: CEE vermelha 32A: corrente
- Tomada: CEE vermelha 32A: saída
- Tomada: CEE vermelha 64A
- Tomada: CEE vermelha 64A: corrente
- Tomada: CEE vermelha 64A: saída
- Tomada: CEE vermelha 125A
- Tomada: CEE vermelha 125A: corrente
- Tomada: CEE vermelha 125A: saída
- Tomada: Tipo 1
- Tomada: Tipo 1: corrente
- Tomada: Tipo 1: saída
- Tomada: Tipo 1 combo
- Tomada: Tipo 1 combo: corrente
- Tomada: Tipo 1 combo: saída
- Tomada: Tipo 2
- Tomada: Tipo 2: corrente
- Tomada: Tipo 2: saída
- Tomada: Tipo 2 combo
- Tomada: Tipo 2 combo: corrente
- Tomada: Tipo 2 combo: saída
- Tomada: Tipo 3
- Tomada: Tipo 3: corrente
- Tomada: Tipo 3: saída
- Tomada: CHAdeMO
- Tomada: CHAdeMO: corrente
- Tomada: CHAdeMO: saída
- Tomada: Padrão Tesla
- Tomada: Padrão Tesla: corrente
- Tomada: Padrão Tesla: saída
- Tomada: Tesla Supercharger
- Tomada: Tesla Supercharger: corrente
- Tomada: Tesla Supercharger: saída
- Tomada: Tesla Roadster
- Tomada: Tesla Roadster: corrente
- Tomada: Tesla Roadster: saída
- Tomada: NEMA 5-15R
- Tomada: NEMA 5-15R: corrente
- Tomada: NEMA 5-15R: saída
- Tomada: NEMA 5-20
- Tomada: NEMA 5-20: corrente
- Tomada: NEMA 5-20: saída
- Tomada: NEMA 14-30
- Tomada: NEMA 14-30: corrente
- Tomada: NEMA 14-30: saída
- Tomada: NEMA 14-50
- Tomada: NEMA 14-50: corrente
- Tomada: NEMA 14-50: saída
- Tomada: Schuko
- Tomada: Schuko: corrente
- Tomada: Schuko: saída
- Tomada: BS 1363
- Tomada: BS 1363: corrente
- Tomada: BS 1363: saída
- Tomada: AS/NZS 3112
- Tomada: AS/NZS 3112: corrente
- Tomada: AS/NZS 3112: saída
+ Tomadas: CEE azul
+ Tomadas: CEE azul: amperes
+ Tomadas: CEE azul: watts
+ Tomadas: CEE vermelha 16A
+ Tomadas: CEE vermelha 16A: amperes
+ Tomadas: CEE vermelha 16A: watts
+ Tomadas: CEE vermelha 32A
+ Tomadas: CEE vermelha 32A: amperes
+ Tomadas: CEE vermelha 32A: watts
+ Tomadas: CEE vermelha 64A
+ Tomadas: CEE vermelha 64A: amperes
+ Tomadas: CEE vermelha 64A: watts
+ Tomadas: CEE vermelha 125A
+ Tomadas: CEE vermelha 125A: amperes
+ Tomadas: CEE vermelha 125A: watts
+ Tomadas: Tipo 1
+ Tomadas: Tipo 1: amperes
+ Tomadas: Tipo 1: watts
+ Tomadas: Tipo 1 combo
+ Tomadas: Tipo 1 combo: amperes
+ Tomadas: Tipo 1 combo: watts
+ Tomadas: Tipo 2
+ Tomadas: Tipo 2: amperes
+ Tomadas: Tipo 2: watts
+ Tomadas: Tipo 2 combo
+ Tomadas: Tipo 2 combo: amperes
+ Tomadas: Tipo 2 combo: watts
+ Tomadas: Tipo 3
+ Tomadas: Tipo 3: amperes
+ Tomadas: Tipo 3: watts
+ Tomadas: CHAdeMO
+ Tomadas: CHAdeMO: amperes
+ Tomadas: CHAdeMO: watts
+ Tomadas: Padrão Tesla
+ Tomadas: Padrão Tesla: amperes
+ Tomadas: Padrão Tesla: watts
+ Tomadas: Tesla Supercharger
+ Tomadas: Tesla Supercharger: amperes
+ Tomadas: Tesla Supercharger: watts
+ Tomadas: Tesla Roadster
+ Tomadas: Tesla Roadster: amperes
+ Tomadas: Tesla Roadster: watts
+ Tomadas: NEMA 5-15R
+ Tomadas: NEMA 5-15R: amperes
+ Tomadas: NEMA 5-15R: watts
+ Tomadas: NEMA 5-20
+ Tomadas: NEMA 5-20: amperes
+ Tomadas: NEMA 5-20: watts
+ Tomadas: NEMA 14-30
+ Tomads: NEMA 14-30: amperes
+ Tomadas: NEMA 14-30: watts
+ Tomadas: NEMA 14-50
+ Tomadas: NEMA 14-50: amperes
+ Tomadas: NEMA 14-50: watts
+ Tomadas: Schuko
+ Tomadas: Schuko: amperes
+ Tomadas: Schuko: watts
+ Tomadas: BS 1363
+ Tomadas: BS 1363: amperes
+ Tomadas: BS 1363: watts
+ Tomadas: AS/NZS 3112
+ Tomadas: AS/NZS 3112: amperes
+ Tomadas: AS/NZS 3112: watts
Carro: sim
Carro: não
Bicicleta: sim
@@ -3539,7 +3539,7 @@
Comboio
Autocarro
Metropolitano
- Via para veículos com alta ocupação
+ Veículos com alta ocupação
Elétrico
Balsa/ferry
sem categoria
@@ -3650,11 +3650,11 @@
Acesso a autocaravanas: não
Acesso a reboques: não
Acesso a transportes públicos: sim
- Acesso a transportes públicos: designado
+ Acesso a transportes públicos: assinalado
Acesso a transportes públicos: não
Acesso a autocarros: não
Acesso a autocarros turísticos: sim
- Acesso a autocarros turísticos: designado
+ Acesso a autocarros turísticos: assinalado
Acesso a autocarros turísticos: não
Acesso a autocarros de longa distância: sim
Acesso a autocarros de longa distância: não
@@ -3665,37 +3665,37 @@
Acesso a veículos agrícolas: sim
Acesso a veículos agrícolas: não
Acesso a táxis: sim
- Acesso a táxis: designado
+ Acesso a táxis: assinalado
Acesso a táxis: não
Acesso a deficientes: não
Sim
- Designado
+ Assinalado
Tolerado
Sim
- Designado
+ Assinalado
Sim
- Designado
+ Assinalado
Sim
- Designado
+ Assinalado
Sim
- Designado
+ Assinalado
Sim
Tolerado
Destino
- Designado
+ Assinalado
Sim
- Designado
+ Assinalado
Sim
- Designado
+ Assinalado
Sim
Destino
Tolerado
- Designado
+ Assinalado
Entregas
Sim
- Designado
+ Assinalado
Sim
- Designado
+ Assinalado
Entrada da adega
Alimentação saudável
Construtor
@@ -3779,7 +3779,7 @@
Incorreto
Primitivo
Contrastado
- Apenas quando é permitido caminhar
+ Apenas quando é permitido atravessar
Acesso à Internet: só clientes
Não
Sim
@@ -3813,8 +3813,8 @@
Caixa livre;Caixa de donativos;Give-box
Seta: não
Elevador
- Calendário
- Tempo real
+ Horário
+ Atualizado em tempo real
Atraso
Sim
Quadro de partidas: não
@@ -3922,7 +3922,7 @@
Nome da pista
Salto com esqui
Passagem de vida selvagem
- Lavadoiro público
+ Lavadouro público
Poço
Gabinete diplomático
Tipo de baía
diff --git a/OsmAnd/res/values-pt/strings.xml b/OsmAnd/res/values-pt/strings.xml
index eaa5dd4833..dbdfdef7bf 100644
--- a/OsmAnd/res/values-pt/strings.xml
+++ b/OsmAnd/res/values-pt/strings.xml
@@ -20,11 +20,11 @@
Desporto
Alimentação
Turismo
- Transporte
- Indexando endereço…
- Indexando mapa…
- Indexando POI…
- Indexando transporte…
+ Transportes públicos
+ A indexar endereços…
+ A indexar o mapa…
+ A indexar POI…
+ A indexar transportes…
Erro de entrada/saída
km
km/h
@@ -96,7 +96,7 @@
Não foi possível ler os dados de GPX.
Mapas vetoriais offline
Procurar transporte na paragem
- Alterar POI
+ Alterar POI OSM
Eliminar POI
Direção da bússola
Direção do movimento
@@ -120,7 +120,7 @@
Favoritos
Notas OSM (online)
Camada superior de POI…
- Origem dos mapas…
+ Repositório de mapas…
Camada de mapa
Busca por POI
Utilizar um dispositivo trackball para mover o mapa.
@@ -160,10 +160,10 @@
A descomprimir o ficheiro…
Vire à direita e continue em
Vire fortemente à direita e continue em
- Vire levemente à direita e continue em
+ Vire ligeiramente à direita e continue em
Vire à esquerda e continue em
Vire fortemente à esquerda e continue em
- Vire levemente à esquerda e continue em
+ Vire ligeiramente à esquerda e continue em
Inverta o sentido da marcha e continue em
Comece em
Continuar
@@ -264,7 +264,7 @@
A carregar dados…
A ler dados locais…
O OsmAnd foi interrompido inesperadamente. O ficheiro de registo encontra-se em {0}. Por favor, relate o problema e inclua o ficheiro de registo.
- A gravar o ficheiro GPX…
+ A guardar o ficheiro GPX…
Concluído
Utilizar a Internet para calcular uma rota.
Utilizar navegação online
@@ -341,7 +341,7 @@
Edifício
Rua transversal
Atualizar mapa
- Criar POI OSM
+ Criar POI
Sim
Cancelar
Aplicar
@@ -646,7 +646,7 @@
Pesquisa por localização geográfica
Sistema
Idioma de visualização da aplicação (após reinicialização do OsmAnd).
- Linguagem
+ Idioma
Seguinte
Anterior
Alterar a unidade de medida de distância.
@@ -689,9 +689,9 @@
Mostrar curvas de nível
Aumentar o nível de detalhe do mapa.
Ver mais detalhes no mapa
- Rotunda: saia na saída %1$d para
- Mantenha-se à esquerda e continue
- Mantenha-se à direita e continue
+ Rotunda: saia na %1$dª saída para
+ Mantenha-se à esquerda e continue em
+ Mantenha-se à direita e continue em
Assim que possível
Público
Identificável
@@ -706,7 +706,7 @@
Selecione o tipo de estacionamento
Tempo limitado
Sem limite de tempo
- Adicionar uma notificação à aplicação Calendário
+ Adicionar notificação ao Calendário
Estacionamento com limite de tempo
Estacionamento sem limite de tempo
A localização do seu veículo estacionado. %1$s
@@ -717,7 +717,7 @@
Permite gravar onde o seu carro foi estacionado e quanto tempo de estacionamento resta (se houver um limite de tempo).
\nA localização e o tempo ficam visíveis no painel de controlo do OsmAnd e num widget no ecrã do mapa. Um alarme pode ser adicionado ao calendário Android como lembrete.
Local de estacionamento
- Marcar como local de estacionamento
+ Marcar local de estacionamento
Eliminar um marcador de estacionamento
Ponto de partida demasiado distante da estrada mais próxima.
Local partilhado
@@ -866,7 +866,7 @@
Eliminar este item\?
Gravar nota de áudio
Gravar nota de vídeo
- Camada de gravação
+ Camada trilhos gravados
Não foi possível reproduzir a gravação.
Eliminar a gravação
Reproduzir
@@ -985,7 +985,7 @@
Lat. %1$.3f, Lon. %2$.3f
Para:
Via:
- Desde:
+ De:
Destino %1$s
Definir como destino
Selecione primeiro a cidade ou rua
@@ -1226,7 +1226,7 @@
\n
\nToque longo para ver no mapa"
Iniciar a orientação passo a passo automaticamente
- selecionado
+ selecionado(s)
Intervalo de divisão
Ponto de rota: %1$s
Distância: %1$s (%2$s pontos )
@@ -1287,9 +1287,9 @@
Descarregar novo mapa
Idioma do mapa
Zona
- Todos os descarregamentos
+ Disponíveis
Atualizações
- Local
+ Descarregados
Não é possível descarregar. Verifique se tem ligação à Internet.
Todos os ficheiros foram atualizados
Usar o renderizador OpenGL
@@ -1324,7 +1324,7 @@
Copiar
Filtrar por nome
Digite para pesquisar tudo
- Abrir
+ Aberto agora
Assistente de mapeador OSM
Informação A-GPS
Gerir
@@ -1348,7 +1348,7 @@
Descarregar compilações noturnas.
Especifique um servidor proxy.
Gerir
- Transporte
+ Transportes públicos
Rotas de elétricos e comboios
Iluminação pública
Predefinido
@@ -1385,7 +1385,7 @@
Desativar
Ativado
Desativado
- Selecionado
+ Selecionado(s)
Desmarcar
Desmarcar tudo
Exportar
@@ -1493,7 +1493,7 @@
Taxa de bits do áudio
Escolha a taxa de bits do áudio.
POI do OSM eliminado
- Abrir nota OSM
+ Criar nota OSM
Reabrir nota OSM
Nota do OSM comentada
Nota do OSM adicionada
@@ -1523,7 +1523,7 @@
Mostrar mapa
Define o sinalizador que indica a primeira inicialização da aplicação, mantém todas as outras configurações inalteradas.
Simular arranque inicial da aplicação
- geo:
+ Outras aplicações de mapas
Partilhar localização
Enviar
Executar em segundo plano
@@ -1626,7 +1626,7 @@
\n- Sincronizar grupos e dispositivos com o servidor;
\n- Gerir grupos e dispositivos num painel de controlo pessoal no site web.
Utilizador anónimo
- Conectado como %1$s
+ Sessão iniciada como %1$s
Não selecionado
Mês e país:
Tamanho das atualizações
@@ -1675,7 +1675,7 @@
Número de destinatários
Edições %1$s, posição %2$s, total de edições %3$s
Classificação de editores do OSM
- Assinatura do OsmAnd Live
+ Subscrição do OsmAnd Live
Subscrever
Necessário para o informar sobre as suas contribuições.
Nome público
@@ -1706,7 +1706,7 @@
Inserir nome do país
Nova versão
Primeiros passos com o OsmAnd
- Escolha onde pretende guardar os ficheiros de mapas e de outros dados.
+ Escolha onde pretende guardar os ficheiros de mapas e outros dados.
Outros
Ativar a navegação para mudanças do OsmAnd Live.
Navegação OsmAnd Live
@@ -1725,10 +1725,10 @@
Obrigado por apoiar o OsmAnd!
\nPara ativar todos os novos recursos tem que reiniciar o OsmAnd.
Parte da sua doação será enviada aos utilizadores OSM que submetem alterações ao mapa nessa região.
- Configurações da assinatura
- Por favor primeiro compre a assinatura do OsmAnd Live
- Esta assinatura permite atualizações hora a hora de todos os mapas à volta do mundo.
-\nParte da renda regressa à comunidade do OpenStreetMap e paga-se para cada contribuição no OpenStreetMap.
+ Configurações da subscrição
+ Por favor primeiro compre a subscrição do OsmAnd Live
+ Esta subscrição permite atualizações hora a hora de todos os mapas à volta do mundo.
+\nParte da renda regressa à comunidade do OpenStreetMap e é paga para cada contribuição no OpenStreetMap.
\nSe gosta do OsmAnd e do OpenStreetMap e quer apoiar e ser apoiado por eles, esta é a maneira perfeita para o fazer.
Selecione o marcador do mapa
Outros marcadores
@@ -1751,7 +1751,7 @@
Remover todos os marcadores ativos\?
Limpar o histórico dos marcadores de mapa\?
Marcadores ativos
- Marcadores de mapa
+ Marcadores
Marcador de mapa
É recomendável desativar a renderização de polígono.
Mostrar trilhos de bicicletas de montanha
@@ -1764,7 +1764,7 @@
Remover
Ler mais
Remover atualizações descarregadas e voltar à edição do mapa original
- Adicionar intervalo de tempo
+ Adicionar intervalo de tempo adicional
Estrada bloqueada
Selecionar
Inverter ponto de partida e destino
@@ -1802,9 +1802,9 @@
Siga-nos
Ignorar o descarregamento de mapas
- Obter direções e descobrir novos lugares sem ligação à Internet
+ Obtenha direções e descubra novos lugares sem ser necessário estar ligado à Internet
Ignorar
- Selecione outra região
+ Selecionar outra região
Alterar
Cartão de memória
Não tem nenhum mapa off-line instalado. Pode escolher um mapa na lista ou descarregar mapas mais tarde através do \'menu - %1$s\'.
@@ -1884,7 +1884,7 @@
Ficheiros temporários dos mosaicos
Nome de utilizador errado
Para
- A partir de
+ De
Ver apenas imagens adicionadas
Data
Introduza nome de utilizador
@@ -1903,7 +1903,7 @@
Fotos on-line
Adicionar fotos
Não há fotos aqui.
- Partilhe a sua vista ao nível da rua através do Mapillary.
+ Partilhe as suas imagens ao nível do solo no Mapillary.
Widget Mapillary
Permite contribuir rapidamente para o Mapillary.
Fotos on-line ao nível da rua para todos. Descubra locais, colabore, capture o mundo.
@@ -1925,7 +1925,7 @@
Compre e instale a extensão \'Curvas de nível\' para mostrar as áreas verticais graduadas.
Esquema de cores
Mostrar a partir do nível de ampliação
- Permitir acesso privado
+ Ativar acesso a vias privadas
Permitir acesso a áreas privadas.
Mostrar nível de zoom: %1$s
Nome do grupo
@@ -2031,7 +2031,7 @@
Permitir autoestradas.
Artigos da Wikipédia próximos
Cidade ou região
- Use a saída %1$d e continue
+ Saia na %1$d saída para
Enviar pontos de interesse (POI)
Cálculo da rota
Ainda não tem nenhuns ficheiros de trilhos
@@ -2076,10 +2076,10 @@
Eliminar filtro
Novo filtro
Por favor introduza o nome do novo filtro, este vai ser adicionado ao separador \'Categorias\'.
- A assinatura é cobrada no período selecionado. Cancele a assinatura no Google Play a qualquer altura.
+ A subscrição é debitada no período selecionado. Cancele a subscrição no Google Play a qualquer altura.
Doação para a comunidade OpenStreetMap
- Parte da sua doação é enviada aos colaboradores do OSM. O custo da assinatura permanece o mesmo.
- A subscrição permite atualizações a cada hora, diárias, semanais e descarregamentos ilimitados de todos os mapas globalmente.
+ Parte do seu donativo é enviado aos colaboradores do OpenStreetMap. O custo da subscrição permanece o mesmo.
+ A subscrição permite atualizações a cada hora, dia ou semana e descarregamentos ilimitados de todos os mapas globalmente.
Obter
Comprar por %1$s
Obter descarregamentos ilimitados de mapas, adicionando atualizações semanais, diárias e a cada hora.
@@ -2102,7 +2102,7 @@
Tem a certeza que quer substituir o favorito %1$s\?
Objetos à superfície
Começar
- %1$s paragens antes
+ %1$s paragens anteriores
Pesquisa de coordenadas
Pesquisa avançada de coordenadas
Retroceder para pesquisa
@@ -2126,7 +2126,7 @@
Editar ações
Adquira o OsmAnd Live para desbloquear todas as funcionalidades: atualizações diárias de mapas com descarregamentos ilimitados, todas as extensões pagas e gratuitas, Wikipédia, Wikivoyage e muito mais.
Alteração do estilo padrão para aumentar o contraste de caminhos pedestres e ciclovias. Usa cores clássicas do Mapnik.
- Marcador
+ Favorito
Esconder descrição completa
Mostrar a descrição completa
Obrigado pelos seus comentários
@@ -2139,7 +2139,7 @@
Eliminar o marcador de mapa \'%s\'\?
Editar marcador de mapa
Aplicação de terceiros
- Primeiro especificar cidade/sítio/localidade
+ Pesquisa progressiva cidade>vila>aldeia
Planos e preços
Mensalmente
A cada três meses
@@ -2147,7 +2147,7 @@
%1$s / mês
%1$.2f %2$s / mês
Poupe %1$s
- Assinatura atual
+ Subscrição atual
Renova mensalmente
Renova trimestralmente
Renova anualmente
@@ -2164,15 +2164,15 @@
Estilo de propósito geral. Renderização simplificada e limpa em cidades densamente povoadas. Características principais: curvas de nível, rotas, qualidade de superfície, restrições de acesso, escudos rodoviários, caminhos de renderização de acordo com a escala SAC, características desportivas Whitewater.
Abrir página da Wikipédia na Internet
A hiperligação será aberta no navegador de Internet.
- Obtenha uma assinatura do OsmAnd Live para ler artigos da Wikipédia e da Wikivoyage desligado da Internet.
+ Obtenha uma subscrição do OsmAnd Live para ler artigos da Wikipédia e da Wikivoyage desligado da Internet.
Como abrir a hiperligação\?
Ler a Wikipédia desligado da Internet
Descarregar tudo
Reiniciar a aplicação
Mostrar imagens
- Cancelou a sua assinatura do OsmAnd Live
- Renovar assinatura para continuar a utilizar todas as funcionalidades:
- Com base nos artigos que marcou, sugerimos que descarregue os seguintes mapas:
+ Cancelou a sua subscrição do OsmAnd Live
+ Renovar a subscrição para continuar a utilizar todas as funcionalidades:
+ Com base nos artigos que marcou como favoritos, sugerimos que descarregue os seguintes mapas:
Mapas que precisa
Equipa do OsmAnd
Destinos populares
@@ -2187,7 +2187,7 @@
Pode e deve editar qualquer artigo no Wikivoyage. Partilhe saber, experiência, talento e a sua atenção.
Começar a editar
Obter acesso ilimitado
- Bem-vindo ao beta aberto
+ Bem-vindo à versão beta aberta
Guias de viagem
Guias para os lugares mais interessantes do mundo dentro do OsmAnd, sem uma conexão com a Internet.
Atualizações de mapas mensais
@@ -2209,7 +2209,7 @@
Apenas em Wi-Fi
Descarregar imagens
As imagens do artigo podem ser descarregadas para uso offline.
-\nSempre disponível em \'Explorar\' → \' Opções \'.
+\nConfigure em \'Explorar\' → \' Opções \'.
Apenas em Wi-Fi
Selecione um livro de viagem
Livro de viagens
@@ -2222,7 +2222,7 @@
Artigo removido
Pesquisar por país, cidade ou província
Ler
- Artigos marcados
+ Artigos favoritos
Explorar
Conteúdo
Resultado
@@ -2250,7 +2250,7 @@
S
N
Nome do ponto (opcional)
- Rotas próximas dentro de
+ Rotas próximas a menos de
A menos de
Digite o nome do ficheiro.
Erro ao importar mapa
@@ -2280,8 +2280,8 @@
Ler o artigo completo
Ler o artigo
Todos os pontos do grupo
- Aberto desde as
- Aberto até às
+ Abre às
+ Fecha às
Fecha às
Abre às
Abre às
@@ -2292,7 +2292,7 @@
Ações
Marcador
Criar ou alterar objetos OSM
- Criar ou alterar POIs do OSM, abrir ou comentar notas do OSM e contribuir com ficheiros de GPX gravados.
+ Criar ou alterar POIs do OSM, criar ou comentar notas do OSM e contribuir com ficheiros de GPX gravados.
Eliminado
Editado
Adicionado
@@ -2350,8 +2350,8 @@
Ida e volta
Tem de adicionar pelo menos um marcador para usar esta função.
Não foi possível alterar a nota.
- Alterar nota
- Alterar nota do OSM
+ Alterar nota do OpenStreetMap
+ Alterar nota
Adicionar cópia do ponto de partida como destino.
Fazer viagem de ida e volta
Artigos Wikivoyage mundiais
@@ -2363,7 +2363,7 @@
Distrito
Bairro
Procurar
- Aberto 24/7
+ Sempre aberto (24/7)
Formato de coordenadas
Formato para as coordenadas geográficas.
Autocarro
@@ -2391,13 +2391,13 @@
Laociano
Osseta
Espanhol (americano)
- Espanhol (Argentina)
+ Espanhol (argentino)
Norueguês Bokmål
Volapuque
Tailandês
Telugu
- Norueguês (Nynorsk)
- Neuari / Nepalbhasa
+ Novo norueguês
+ Neuari
Malásio
Haitiano
Galego
@@ -2406,7 +2406,7 @@
Asturiano
Alto sorábio
Cabila
- Berberes
+ Berber
Impedir a gravação autónoma
Esta extensão enriquece o mapa do OsmAnd para também produzir mapas náuticos para passeios de barco, vela e outros tipos de desportos aquáticos.
\n
@@ -2424,7 +2424,7 @@
\nRepresenta área: %1$s x %2$s
Tolerância do limite de velocidade
Selecione a margem de tolerância de limite de velocidade, acima do qual receberá um aviso de voz.
- O nome do favorito foi alterado para %1$s para facilitar guardar corretamente a cadeia de caracteres com emoticons num ficheiro.
+ O nome do favorito foi alterado para %1$s para poder guardar corretamente o texto com emoticons num ficheiro.
Imprimir rota
Nome de favorito duplicado
O nome do favorito especificado já está a ser utilizado, foi alterado para %1$s para evitar a duplicação.
@@ -2661,7 +2661,7 @@
Enviar POI
Básico
Avançado
- Número de edifício
+ Número de porta
Próximo
Abre às
Fecha às
@@ -2791,7 +2791,7 @@
Toque num botão e ouça a mensagem de voz dele correspondente para ouvir se está ausente ou avariado
Por OsmAnd
Código de localização aberto (OLC)
- Assinaturas
+ Subscrições
Mostrar apenas imagens de 360°
Lançar
Guarani
@@ -2842,7 +2842,7 @@
Não pavimentado
Areia
Relva
- Blocos cimento perfurados
+ Blocos de cimento perfurados
Terra
Terra (lodosa)
Lama
@@ -2931,23 +2931,23 @@
Tente alterar a configuração.
Calcular a rota pedestre
Tipo de transporte
- Procurando GPS
+ A procurar GPS
Widget de coordenadas
Por favor envie os seus comentários e avalie o nosso trabalho no Google Play.
Política de privacidade
Ajude-nos a melhorar o OsmAnd
- Permitir que OsmAnd recolha e processe dados anónimos de utilização da aplicação. Nenhuns dados sobre a sua posição, nem sobre as localizações que visualiza no mapa são recolhidos.
+ Permitir que OsmAnd recolha e processe dados anónimos de utilização da aplicação. Não são recolhidos nenhuns dados sobre a sua posição, nem sobre as localizações que visualiza no mapa.
\n
-\nConfigure a qualquer momento em \'Configurações\' → \'Privacidade e Segurança\'.
+\nConfigure a qualquer momento em \'Configurações\' → \'Privacidade e segurança\'.
Escolha o tipo de dados que pretende partilhar:
Mapas descarregados
- Ecrãs vistos
- Define quais os dados que permite que OsmAnd partilhe.
- Ajuda-nos a compreender a popularidade de mapas de países e regiões.
- Ajuda-nos a entender a popularidade dos recursos no OsmAnd.
+ Ecrãs visualizados
+ Define que dados que permite o OsmAnd partilhar.
+ Permite-nos compreender a popularidade dos mapas de países e regiões.
+ Permite-nos entender a popularidade dos recursos no OsmAnd.
Toque em \"Permitir\" se concordar com %1$s
Privacidade e segurança
- Escolha que dados partilha
+ Escolha os dados que quer partilhar
Não, obrigado
Permitir
Nome do perfil
@@ -2986,8 +2986,8 @@
Bicicleta de montanha, ciclomotor, cavalo
Andar, caminhar, correr
Categorias de transportes públicos
- Navio, remar, navegar
- Avião, asa-delta
+ Barco, remo, vela
+ Avião, parapente
Geocodificação
Linha reta
BRouter (offline)
@@ -3028,7 +3028,7 @@
Velocidade mínima
Velocidade máxima
Velocidade predefinida
- Alterar as predefinições de velocidade
+ Alterar as velocidades predefinidas
Definir a velocidade mínima/máxima
Novo perfil
Encravou
@@ -3066,8 +3066,8 @@
Selecione as opções de mapa para o perfil
Selecionar opções de ecrã para o perfil
Selecione as configurações de navegação para o perfil
- Especificar o limite máximo de alterações
- Quantidade de transferências
+ Especificar o limite máximo de transbordos
+ Número de transbordos
Despertar na curva
Ajuste por quanto tempo o ecrã deve ficar ligado.
Utilizar sensor de proximidade
@@ -3097,7 +3097,7 @@
Abrir trilho
O trilho %s está guardado
Mostrar zonas de baixas emissões (proibida circulação de veículos poluentes) no mapa. Não afeta o roteamento.
- Mostrar zonas de baixas emissões
+ Mostrar zonas de baixas emissões poluentes
Considerar limitações temporárias
Padrão
Rota: distância %1$s, tempo do roteador %2$s \nCálculo: %3$.1f seg, %4$d estradas, %5$d telhas)
@@ -3118,7 +3118,7 @@
Anos
Três meses
Grátis
- Obter %1$d %2$s com %3$s de desconto.
+ Obtenha %1$d %2$s com %3$s de desconto.
depois %1$s
Cancelar subscrição
%1$s - Poupe %2$s
@@ -3137,7 +3137,7 @@
Aplicar só a \"%1$s\"
Aplicar a todos os perfis
Mensagem de inicialização
- Análises
+ Enviar dados anónimos
Mostrar mapa no ecrã de bloqueio durante a navegação.
Configurações de roteamento no perfil selecionado \"%1$s\".
Tempo limite após despertar
@@ -3180,7 +3180,7 @@
\n%1$s > %2$s
Insira o caminho para a pasta
Pasta…
- Colar caminho para a pasta com dados OsmAnd
+ Colar caminho para a pasta com dados do OsmAnd
Alterar a pasta de dados OsmAnd\?
Mover para o novo destino
Armazenamento interno para OsmAnd (oculto aos utilizadores e outras aplicações).
@@ -3250,7 +3250,7 @@
\n - Outras correções de erros
\n
\n
- Pode aplicar esta alteração a todos ou apenas ao perfil atualmente selecionado.
+ Pode aplicar esta alteração a todos os perfis ou apenas ao atualmente selecionado.
Partilhado
Preferir estradas não pavimentadas
Preferir estradas não pavimentadas sobre as pavimentadas para o roteamento.
@@ -3262,7 +3262,7 @@
%1$s • %2$s
%1$s, %2$s
Pessoal
- Descarregando %s
+ A descarregar %s
Grosso
Para desertos e outras áreas pouco povoadas. Mais detalhado.
Ícone de posição durante a movimentação
@@ -3284,7 +3284,7 @@
O perfil \'%1$s\' já existe. Substituir\?
Não foi possível exportar o perfil.
Importar perfil
- Adicione um perfil abrindo o seu ficheiro com OsmAnd.
+ Adicione um perfil abrindo o seu ficheiro com o OsmAnd.
%1$s erro de importação: %2$s
%1$s importado(s).
Trocar %1$s por %2$s
@@ -3352,8 +3352,8 @@
A importar dados de %1$s
Tem a certeza que quer limpar os dados gravados\?
Não foi possível fazer a cópia de segurança do perfil.
- Gravando novo perfil
- Restaurar todas as configurações de perfil\?
+ A guardar o novo perfil
+ Restaurar todas as configurações do perfil\?
Todas as configurações do perfil serão restauradas para o seu estado original após a criação/importação deste perfil.
Importar ficheiro de renderização
Estilo de renderização
@@ -3372,8 +3372,8 @@
Nada selecionado
Tipos de POI
A preparar
- Ângulo mínimo entre minha localização e rota
- Segmento reto adicional entre a minha localização e a rota calculada será mostrada até que a rota seja recalculada
+ Ângulo mínimo entre a minha localização e a rota
+ Será mostrado o segmento reto adicional entre a minha localização e a rota calculada até que a rota seja recalculada
Ângulo
Ângulo: %s°
Perfil personalizado
@@ -3393,7 +3393,7 @@
\nA extensão permanecerá no dispositivo após remover o OsmAnd.
Extensão desativada
Abrir configurações
- Forneça um nome para o perfil
+ Atribua um nome ao perfil
Classificar por categoria
Direto ao ponto
Copiar coordenadas
@@ -3435,9 +3435,9 @@
Todas as configurações da extensão foram repostas para os valores de origem.
Adicionar categoria personalizada
Disponível
- \'Restaurar valores predefinidos\' redefinirá a ordem de ordenação para os valores de origem.
+ \'Restaurar valores predefinidos\' irá repor a ordenação de origem.
Pode adicionar uma nova categoria personalizada selecionando uma ou mais categorias.
- Altere a ordem de ordenação da lista, oculte categorias. Pode importar ou exportar todas as alterações com perfis.
+ Altere a ordenação da lista e oculte categorias. Pode importar ou exportar todas as alterações com perfis.
Reorganizar categorias
Autorização bem sucedida
Som do obturador da câmara
@@ -3453,8 +3453,8 @@
Intervalo de rastreamento
Memória intermédia
Recomendação: uma configuração de 5 metros pode funcionar bem se não precisar capturar detalhes mais refinados do que isso e não quer capturar dados explicitamente enquanto estiver parado.
- Efeitos colaterais: os períodos em que está parado não são registados em absoluto ou em apenas um ponto cada. Pequenos movimentos (do mundo real) (por exemplo, de lado, para marcar um possível desvio na sua viagem) podem ser filtrados. O seu ficheiro contém menos informações para pós-processamento e possui estatísticas piores ao filtrar pontos obviamente redundantes no tempo de gravação, mantendo potencialmente artefactos causados por má receção ou efeitos de chipset GPS.
- Este filtro evita que pontos duplicados sejam gravados onde muito pouco movimento real possa ter ocorrido, cria uma aparência espacial mais agradável dos trilhos que não são processados posteriormente.
+ Efeitos colaterais: os períodos em que está parado não são registados em absoluto ou em apenas um ponto cada. Pequenos movimentos (no mundo real, por exemplo de lado, para marcar um possível desvio na sua viagem) podem ser filtrados. O seu ficheiro contém menos informações para pós-processamento e possui estatísticas piores ao filtrar pontos obviamente redundantes no tempo de gravação, mantendo potencialmente os artefactos causados por má receção ou efeitos do chipset GPS.
+ Este filtro evita que sejam gravados pontos duplicados onde ocorrer muito pouco movimento real, cria uma aparência espacial mais agradável dos trilhos que não são processados posteriormente.
Observação: se o GPS estava desligado imediatamente antes de uma gravação, o primeiro ponto medido pode ter uma precisão diminuída; portanto, no nosso código, podemos esperar um segundo antes da gravação de um ponto (ou gravar o melhor de três pontos consecutivos, etc.), mas isso ainda não foi implementado.
Recomendação: é difícil prever o que será gravado e o que não será, talvez seja melhor desativar este filtro.
Efeito colateral: como resultado da filtragem por precisão, os pontos podem estar totalmente ausentes por ex. debaixo de pontes, sob árvores, entre prédios altos ou com certas condições climáticas.
@@ -3468,7 +3468,7 @@
Verifique e partilhe registos detalhados da aplicação
Ícone mostrado quando parado.
Ícone mostrado ao navegar ou mover.
- Veja todas as suas edições ainda não enviadas ou bugs OSM em %1$s. Os pontos enviados não vão aparecer no OsmAnd.
+ Veja todas as suas edições ainda não enviadas ou notas do OpenStreetMap em %1$s. Os pontos enviados deixarão de aparecer nessa lista.
Edição OSM
Estas configurações da extensão são globais e aplicam-se a todos os perfis
Utilizador e palavra-passe
@@ -3476,12 +3476,12 @@
Recálculo da rota
Notas fotográficas
Notas de vídeo
- Pode encontrar todas as suas notas em %1$s.
+ Pode encontrar todas as suas notas OSM em %1$s.
Pode encontrar todos os seus trilhos gravados em %1$s ou na pasta OsmAnd.
Precisão de registo
Rastreamento online
Permite partilhar a localização atual usando a gravação de viagem.
- Escolha ícone, cor e nome
+ Escolha o ícone, cor e nome
Utilizador, palavra-passe, edição offline
Tamanho da imagem, qualidade de áudio e vídeo
Navegação, precisão de registo
@@ -3529,9 +3529,9 @@
Régua radial
Medir distância
Viagem (Wikivoyage e Wikipédia)
- Marcadores de mapa
+ Marcadores
Favoritos
- Assinatura - OsmAnd Live
+ Subscrição - OsmAnd Live
Compras de OsmAnd
O guia para a simbologia de um mapa.
Perfis de navegação
@@ -3539,9 +3539,9 @@
%1$s / %2$s
O pagamento será debitado na sua conta Google Play na confirmação da compra.
\n
-\n A assinatura é renovada automaticamente, a menos que seja cancelada antes da data de renovação. A sua conta será cobrada pelo período de renovação (mês/três meses/ano) apenas na data de renovação.
+\nA subscrição é renovada automaticamente, a não ser que seja cancelada antes da data de renovação. A sua conta será cobrada pelo período de renovação (mês/três meses/ano) apenas na data de renovação.
\n
-\n Pode gerir e cancelar as suas subscrições, indo às suas definições do Google Play.
+\nPode gerir e cancelar as suas subscrições, indo às suas definições do Google Play.
Ação %1$s não suportada
Mapas adicionais
Alguns artigos da Wikipédia podem não estar disponíveis no seu idioma.
@@ -3566,7 +3566,7 @@
Cazaque
Javanês
Guzerate
- Tchuvache
+ Chuvache
Checheno
Bávaro
Basquires
@@ -3605,7 +3605,7 @@
Um ficheiro de imagem por mosaico
Ficheiro SQLiteDB
Forneça um nome para a origem do mapa on-line.
- Insira ou cole a URL para a origem on-line.
+ Introduza ou cole o URL para a origem on-line.
Editar origem on-line
Tempo de validade
Projeção de Mercator
@@ -3638,7 +3638,7 @@
Kart
Os alertas de radares de velocidade em alguns países são proibidos por lei.
Manter ativo
- Forneça um nome para o ponto
+ Atribua um nome ao ponto
A aplicação dessas alterações limpará os dados temporários desta origem de mosaicos
Este dispositivo não tem instalado o recurso de câmaras de velocidade.
Em alguns países ou regiões, o uso de aplicações com avisos de radares é proibido por lei.
@@ -3647,7 +3647,7 @@
\n
\nSelecione %1$s e receberá alertas e avisos sobre radares de velocidade.
\n
-\nSelecione %2$s. Todos os dados relacionados a radares de velocidade: alertas, notificações, POIs serão apagados até que o OsmAnd seja completamente reinstalado.
+\nSelecione %2$s e yodos os dados relacionados a radares de velocidade: alertas, notificações, POIs serão eliminados até que o OsmAnd seja completamente reinstalado.
Obter informações sobre pontos de interesse da Wikipédia. Um guia de bolso off-line para ver artigos sobre locais e destinos.
Scooter
Eliminar o ponto de destino mais próximo
@@ -3655,10 +3655,10 @@
Pode aceder a essas ações tocando no botão “%1$s”.
Desinstalar
Forneça o comprimento do seu veículo, podem ser aplicadas algumas restrições de rota a veículos longos.
- Botões de volume como zoom
+ Botões de volume mudam o zoom
Reinicie a aplicação para eliminar os dados da câmara de velocidade.
%1$s eliminado
- Se tocar neste botão de ação, mostra ou oculta a camada Mapillary no mapa.
+ Um botão que alterna entre mostrar ou ocultar a camada Mapillary no mapa.
Definir altura da embarcação
Motorizada de enduro
Patins em linha
@@ -3701,7 +3701,7 @@
Defina dias úteis para continuar
Rota entre pontos
Planear uma rota
- Adicionar ao trilho
+ Adicionar a um trilho
O ponto adicionado não será visível no mapa, já que o grupo selecionado está escondido, pode encontrá-lo em \"%s\".
Mostrar ícones de início e fim
Selecionar a largura
@@ -3740,8 +3740,8 @@
Eliminar endereço
Adicionar endereço
Insira o endereço
- Aparecer antes
- Aparecer depois
+ Recortar antes
+ Recortar depois
Alterar o tipo de rota antes
Alterar o tipo de rota após
Imagens ao nível das ruas
@@ -3770,7 +3770,7 @@
Todos os segmentos anteriores
Apenas o segmento selecionado será recalculado a usar o perfil selecionado.
Todos os segmentos subsequentes serão recalculados a utilizar o perfil selecionado.
- Todos os segmentos anteriores serão recalculados a usar o perfil selecionado.
+ Todos os segmentos anteriores serão recalculados usando o perfil selecionado.
Abrir trilho guardado
está guardado
Adicione pelo menos dois pontos.
@@ -3800,14 +3800,14 @@
Nome: A – Z
Ícones de início e fim
Obrigado por comprar \'Curvas de nível\'
- A assinatura é cobrada pelo período selecionado. Cancele-a na sua AppGallery a qualquer momento.
+ A subscrição é cobrada pelo período selecionado. Cancele-a na sua AppGallery a qualquer momento.
Ao confirmar a sua subscrição, será debitado na sua conta AppGallery.
\n
-\nA assinatura é renovada automaticamente, a não ser que seja cancelada antes da data de renovação. A sua conta será cobrada pelo período de renovação (mês/três meses/ano) apenas na data de renovação.
+\nA subscrição é renovada automaticamente, a não ser que seja cancelada antes da data de renovação. A sua conta será cobrada pelo período de renovação (mês/três meses/ano) apenas na data de renovação.
\n
-\nPode gerir e cancelar as suas subscrições a ir às definições da sua AppGallery.
- Evitar passeios
- Evitar passeios
+\nPode gerir e cancelar as suas subscrições nas definições da sua AppGallery.
+ Evitar vias pedonais
+ Evitar vias pedonais
Novidades
Desenvolvimento
Dados do OsmAnd Live
@@ -3818,12 +3818,12 @@
Inicie sessão com o OAuth para usar os recursos de edição OpenStreetMap
Iniciar sessão com OAuth
Limpar token do OpenStreetMap OAuth
- Saiu
+ Sessão terminada
O ficheiro já foi importado para o OsmAnd
Usar algoritmo de roteamento de 2 fases A*
Para a condução de motos de neve com estradas e pistas dedicadas.
Gráfico
- Dados de %1$s disponíveis apenas em estradas, calcule uma rota a usar \"Rota entre pontos\" para ver os gráficos.
+ Dados de %1$s disponíveis apenas em estradas, calcule uma rota usando \"Rota entre pontos\" para ver os gráficos.
Por favor aguarde.
\nO gráfico estará disponível após o recálculo da rota.
%1$s — %2$s
@@ -3841,34 +3841,34 @@
Emergência
Viagem
Adicione pelo menos dois pontos
- Gerir a assinatura
- Toque no botão para ir às definições de assinatura do Google Play para corrigir a sua assinatura.
- A assinatura do OsmAnd Live expirou
- A assinatura do OsmAnd Live foi pausada
- A assinatura do OsmAnd Live está em espera
+ Gerir a subscrição
+ Toque no botão para ir às definições de assinatura do Google Play para corrigir a sua subscrição.
+ A subscrição do OsmAnd Live expirou
+ A subscrição do OsmAnd Live foi pausada
+ A subscrição do OsmAnd Live está em espera
Tem de iniciar sessão para enviar alterações.
\n
\nPode iniciar sessão usando o método seguro OAuth ou usar o seu nome de utilizador e a sua palavra-passe.
Iniciar sessão no OpenStreetMap
Iniciar sessão no OpenStreetMap.org
- Entrar com OpenStreetMap
+ Iniciar sessão com OpenStreetMap
Usar o nome do utilizador e palavra-passe
Conta
Utilizador
Histórico de marcadores
Enviar ficheiro de GPX para o OpenStreetMap
Introduza etiquetas separadas por vírgula.
- \"Público\" significa que o rastreamento é mostrado publicamente em Seus traços de GPS e em listas públicas de rastreamento de GPS, e na lista pública de rastreamento com carimbos de data e hora na forma bruta. Os dados servidos através da API não fazem referência à sua página de rastreamento. Os marcadores de ponto de rastreamento não estão disponíveis através da API de GPS pública, e os pontos de rastreamento não estão ordenados cronologicamente.
+ \"Público\" significa que o rastreamento é mostrado publicamente nos seus traços de GPS, em listas públicas de rastreamento de GPS e na lista pública de rastreamento com carimbos de data e hora na forma bruta. Os dados servidos através da API não fazem referência à sua página de rastreamento. Os marcadores de ponto de rastreamento não estão disponíveis através da API de GPS pública, e os pontos de rastreamento não estão ordenados cronologicamente.
\"Privado\" significa que o rastreamento não aparece em nenhuma listagem pública, mas os pontos de rastreamento dela em ordem não cronológica estão disponíveis através da API pública do GPS sem carimbos de tempo.
\"Identificável\" significa que o rastreamento será mostrado publicamente nos seus traços de GPS e nas listas públicas de rastreamento de GPS, ou seja, outros utilizadores serão capazes de descarregar o rastreamento bruto e associá-lo ao seu nome de utilizador. Os dados públicos de pontos de rastreamento marcados com a hora da API do GPS servidos através da API de pontos de rastreamento farão referência à sua página de rastreamento original.
- \"Rastreável\" significa que o rastreamento não aparece em nenhuma listagem pública, mas pontos de rastreamento processados com carimbos de tempo a partir dele (que não podem ser associados diretamente a si) fazem através de descarregadas da API pública do GPS.
+ \"Rastreável\" significa que o rastreamento não aparece em nenhuma listagem pública, mas pontos de rastreamento processados com carimbos de tempo a partir dele (que não podem ser associados diretamente a si) estarão disponíveis através da API pública de GPS.
Fechar nota do OSM
Comentário de nota do OSM
Pode iniciar sessão pelo método seguro OAuth ou use o seu nome de utilizador e a palavra-passe.
- Adicionar fotos
- Cadastre-se em
+ Adicionar foto
+ Crie uma conta em
\nOpenPlaceReviews.org
- As fotos são fornecidas pelo projeto de dados abertos OpenPlaceReviews.org. Para enviar as suas fotos precisa cadastrar-se no site.
+ As fotos são fornecidas pelo projeto de dados abertos OpenPlaceReviews.org. Para enviar as suas fotos tem de criar uma conta no site.
Criar uma conta
Já tenho uma conta
Histórico de pesquisa
@@ -3878,14 +3878,14 @@
Tamanho aproximado do ficheiro
Selecione os dados a serem exportados para o ficheiro.
Necessário para a importação
- O seu dispositivo só tem %1$s livres. Por favor, liberte algum espaço ou desmarque alguns itens para exportar.
+ O seu dispositivo só tem disponível %1$s. Liberte algum espaço ou desmarque alguns itens para exportar.
Não há espaço suficiente
Adicionar ao Mapillary
Adicionar ao OpenPlaceReviews
- OsmAnd mostra fotos de várias origens:
-\nOpenPlaceReviews - fotos de POI;
-\nMapillary - imagens ao nível da rua;
-\nWeb / Wikimedia - fotos de POI como nos dados do OpenStreetMap.
+ OsmAnd mostra fotografias de várias origens:
+\nOpenPlaceReviews - fotografias de POI;
+\nMapillary - fotografias ao nível do solo;
+\nWeb / Wikimedia - fotografias de POI definidas no OpenStreetMap.
Selecionar os grupos que serão importados.
Selecionar os objetos que serão importados.
Utilizar dev.openstreetmap.org
@@ -3894,7 +3894,7 @@
Mude para usar dev.openstreetmap.org ao invés de openstreetmap.org para testar enviar uma OSM Nota / POI / GPX.
%1$s * %2$s
Alemão (casual)
- Aeronaves ligeiras
+ Aeronave ligeira
Unir segmentos
Dividir antes
Dividir após
@@ -3915,10 +3915,10 @@
URL do servidor
Digite o parâmetro
Mantenha-o vazio se não
- O URL com todos os parâmetros parecerá-se assim:
- Cálculo da rota de teste
+ O URL com todos os parâmetros será assim:
+ Testar cálculo de rota
Condução
- Pé
+ A pé
Bicicleta
Carro
Erro, verifique novamente os parâmetros
@@ -4021,7 +4021,7 @@
Última verificação: %s
Frequência da atualização
Necessário reiniciar a aplicação para aplicar algumas configurações.
- Período de tempo do intervalo de registo em que o OsmAnd perguntará pelos dados da posição atual.
+ Frequência em que o OsmAnd irá registar a localização caso o sinal GPS esteja disponível.
Não tem compras
Se tiver alguma dúvida, contacte-nos em %1$s.
Intervalos de tempo e distância
@@ -4039,7 +4039,7 @@
Permitir ribeiros e valas
Perfil OsmAnd
Perfil do utilizador
- Permitir vias aquáticas intermitentes
+ Permitir cursos de água intermitentes
Bicicleta de corrida
BTT
Segmento %1$d
@@ -4075,15 +4075,15 @@
Especificar cor para o modo mapa: %1$s.
Novo dispositivo / nova conta
Resolução de problemas
- Assinatura anual
- Assinatura mensal
- Assinatura de 3 meses
+ Subscrição anual
+ Subscrição mensal
+ Subscrição de 3 meses
Próxima faturação: %1$s
Em período experimental
Em espera
- Permitir hidrovias sazonais
+ Permitir cursos de água sazonais
Cancelada
- Renovar assinatura
+ Renovar subscrição
Expirou
Número da saída
Anunciar quando ultrapassado
diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml
index dc63a9788a..dd9c8f6526 100644
--- a/OsmAnd/res/values-ru/strings.xml
+++ b/OsmAnd/res/values-ru/strings.xml
@@ -4073,7 +4073,7 @@
Обновить все карты, добавленные в %1$s\?
Настройка линии маршрута
Линия маршрута
- Линия маршрута будет использовать %1$s, указанный в выбранном стиле карты: %2$s.
+ Линия маршрута будет использовать %1$s из выбранного стиля карты: %2$s.
Укажите цвет для режима карты: %1$s.
У вас нет покупок
Новое устройство / новый аккаунт
diff --git a/OsmAnd/res/values-sc/phrases.xml b/OsmAnd/res/values-sc/phrases.xml
index ce6674505d..7d9420b4f3 100644
--- a/OsmAnd/res/values-sc/phrases.xml
+++ b/OsmAnd/res/values-sc/phrases.xml
@@ -3894,4 +3894,36 @@
Riferimentu locale
Geodesista
Tzentru pro cunferèntzias
+ Wakeboard
+ Ultimate
+ Pista pro mototziclismu
+ Tiru de ferros de caddu
+ Polo in bitzicleta
+ Curling
+ Crossfit
+ Lutas de puddos
+ Imbèrghidas dae sos iscameddos
+ Bob
+ Biathlon
+ Iscì de abba
+ Polo de abba
+ Zurkhaneh
+ Luta
+ Artziada de pesos
+ Ufìtziu diplomàticu
+ Kickboxing
+ Ischerma
+ Corrida
+ Aikido
+ Taekwondo
+ Biliardinu
+ Sumo
+ Snooker
+ Tiru de su pesu
+ Pilates
+ Jiu-jitsu
+ Karatè
+ Canisteddos
+ Pratzola de acampamentu
+ Casta de baia
\ No newline at end of file
diff --git a/OsmAnd/res/values-sc/strings.xml b/OsmAnd/res/values-sc/strings.xml
index c11864da5a..d5eef9a6b6 100644
--- a/OsmAnd/res/values-sc/strings.xml
+++ b/OsmAnd/res/values-sc/strings.xml
@@ -1769,7 +1769,7 @@
Imbia
PDI OSM modificadu
PDI OSM iscantzelladu
- Copiadu in sos apuntos
+ Copiadu in punta de billete
Sarva in sa memòria (impreu chene lìnia)
Colore GPX
Largària GPX
@@ -4046,4 +4046,41 @@
Totu sos datos non sarvados s\'ant a pèrdere.
Ammustra su diàlogu de incumintzu
Dislinda unu colore pro sa modalidade pro sa mapa: %1$s.
+ • Agiornamentos de OsmAnd Live (OSmAnd in direta) tramudados cara a \"Iscarrigamentos > Agiornamentos\"
+\n
+\n • Sas rastas como si podent colorizare pro artària, lestresa, o pendèntzia.
+\n
+\n • Annanghidura de s\'optzione pro mudare s\'aparèntzia de sa lìnia de navigatzione de s\'àndala
+\n
+\n • Agiornamentu de sa ventanedda de diàlogu \"Registratzione de su biàgiu\"
+\n
+\n
+ In perìodu de gràtzia
+ OsmAnd in direta
+ Divàriu
+ S\'intervallu de registratzione impostat sa frecuèntzia cun sa cale OsmAnd at a pedire sos datos de sa positzione atuale.
+ Si est disabilitadu sa registratzione at a incumintzare a pustis de su tocu in subra de su widget o de s\'elementu de su menù, brinchende sa ventanedda de diàlogu de cunfirma.
+ Personaliza sa lìnia de s\'àndala
+ Lìnia de s\'àndala
+ Pro sa lìnia de s\'àndala s\'at a impreare su %1$s dislindadu in s\'istile de sa mapa ischertadu: %2$s.
+ Non tenes còmpora peruna
+ Dispositivu nou / contu nou
+ Si tenes preguntas cuntata·nos a su %1$s.
+ Si sa còmpora tua non benit ammustrada inoghe toca in “%1$s” o cuntata su grupu de suportu nostru.
+ Cuntata su suportu
+ Risolutzione de problemas
+ Si tenes problemas cun sa còmpora sighi custu ligàmene, pro praghere.
+ Abbonamentu annuale
+ Abbonamentu mensile
+ Abbonamentu trimestrale
+ Data de addèbitu imbeniente: %1$s
+ Annulladu
+ Rinnova s\'abbonamentu
+ In isetu
+ Iscadidu
+ Agiornare totu sas mapas annànghidas a %1$s\?
+ Nùmeru de essida
+ Avisa in casu de barigamentu
+ Puntos de s\'impreadore
+ Essida
\ No newline at end of file
diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml
index b644da49d4..995426c282 100644
--- a/OsmAnd/res/values-sk/strings.xml
+++ b/OsmAnd/res/values-sk/strings.xml
@@ -1494,7 +1494,7 @@
Naozaj chcete odoslať %1$d zmien do OSM\?
Vymazať históriu?
prekročený čas
- Vo viacerých krajinách (ako Nemecko, Francúzsko, Taliansko) je použitie varovaní pred rýchlostnými radarmi/kamerami zakázané zákonom (nelegálne). OsmAnd nepreberá žiadnu zodpovednosť ak porušíte zákon. Stlačte \"Áno\" len ak ste na to oprávnený použiť túto funkciu.
+ Vo viacerých krajinách (ako Nemecko, Francúzsko, Taliansko) je použitie varovaní pred rýchlostnými radarmi/kamerami zakázané zákonom. OsmAnd nepreberá žiadnu zodpovednosť ak porušíte zákon. Stlačte \"Áno\" len ak ste oprávnený použiť túto funkciu.
Stiahnuť mapy
Vyberte svoj región, aby bolo možné správne nastaviť dopravné predpisy:
OsmAnd poskytuje celosvetové offline mapy a offline navigáciu.
@@ -2729,7 +2729,7 @@
Wikipédia offline
Vrstevnice & tieňované svahy
Odomknite všetky funkcie OsmAnd
- Stiahnite články Wikipédie pre %1$s pre ich čítanie offline.
+ Stiahnite články Wikipédie pre %1$s na ich čítanie offline.
Stiahnuť údaje Wikipédie
Otvoriť článok online
Zobraziť článok vo webovom prehliadači.
diff --git a/OsmAnd/res/values/phrases.xml b/OsmAnd/res/values/phrases.xml
index 2089642add..ba5a5dfe4b 100644
--- a/OsmAnd/res/values/phrases.xml
+++ b/OsmAnd/res/values/phrases.xml
@@ -4381,4 +4381,8 @@
Diplomatic office
+ Plateau
+
+ Social club
+
diff --git a/OsmAnd/src-google/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java b/OsmAnd/src-google/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java
index df05570f57..32597863d1 100644
--- a/OsmAnd/src-google/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java
+++ b/OsmAnd/src-google/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java
@@ -18,11 +18,12 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.inapp.InAppPurchases.InAppPurchase;
+import net.osmand.plus.inapp.InAppPurchases.InAppPurchase.PurchaseState;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscription;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscription.SubscriptionState;
+import net.osmand.plus.inapp.InAppPurchases.PurchaseInfo;
import net.osmand.plus.inapp.InAppPurchasesImpl.InAppPurchaseLiveUpdatesOldSubscription;
import net.osmand.plus.inapp.util.BillingManager;
-import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.srtmplugin.SRTMPlugin;
import net.osmand.util.Algorithms;
@@ -174,7 +175,8 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
});
}
for (Purchase purchase : purchases) {
- if (!purchase.isAcknowledged()) {
+ InAppSubscription subscription = getLiveUpdates().getSubscriptionBySku(purchase.getSku());
+ if (!purchase.isAcknowledged() || (subscription != null && !subscription.isPurchased())) {
onPurchaseFinished(purchase);
}
}
@@ -310,8 +312,8 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
}
}
}
- for (Entry entry : subscriptionStateMap.entrySet()) {
- SubscriptionState state = entry.getValue();
+ for (Entry entry : subscriptionStateMap.entrySet()) {
+ SubscriptionState state = entry.getValue().state;
if (state == SubscriptionState.PAUSED || state == SubscriptionState.ON_HOLD) {
String sku = entry.getKey();
if (!result.contains(sku)) {
@@ -492,15 +494,17 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
}
private PurchaseInfo getPurchaseInfo(Purchase purchase) {
- return new PurchaseInfo(purchase.getSku(), purchase.getOrderId(), purchase.getPurchaseToken());
+ return new PurchaseInfo(purchase.getSku(), purchase.getOrderId(), purchase.getPurchaseToken(),
+ purchase.getPurchaseTime(), purchase.getPurchaseState(), purchase.isAcknowledged(), purchase.isAutoRenewing());
}
private void fetchInAppPurchase(@NonNull InAppPurchase inAppPurchase, @NonNull SkuDetails skuDetails, @Nullable Purchase purchase) {
if (purchase != null) {
- inAppPurchase.setPurchaseState(InAppPurchase.PurchaseState.PURCHASED);
- inAppPurchase.setPurchaseTime(purchase.getPurchaseTime());
+ inAppPurchase.setPurchaseState(PurchaseState.PURCHASED);
+ inAppPurchase.setPurchaseInfo(ctx, getPurchaseInfo(purchase));
} else {
- inAppPurchase.setPurchaseState(InAppPurchase.PurchaseState.NOT_PURCHASED);
+ inAppPurchase.setPurchaseState(PurchaseState.NOT_PURCHASED);
+ inAppPurchase.restorePurchaseInfo(ctx);
}
inAppPurchase.setPrice(skuDetails.getPrice());
inAppPurchase.setPriceCurrencyCode(skuDetails.getPriceCurrencyCode());
@@ -519,18 +523,17 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
}
if (inAppPurchase instanceof InAppSubscription) {
InAppSubscription s = (InAppSubscription) inAppPurchase;
-
- SubscriptionState state = subscriptionStateMap.get(inAppPurchase.getSku());
- s.setState(state == null ? SubscriptionState.UNDEFINED : state);
- CommonPreference statePref = ctx.getSettings().registerStringPreference(
- s.getSku() + "_state", SubscriptionState.UNDEFINED.getStateStr()).makeGlobal();
- s.setPrevState(SubscriptionState.getByStateStr(statePref.get()));
- statePref.set(s.getState().getStateStr());
+ s.restoreState(ctx);
+ s.restoreExpireTime(ctx);
+ SubscriptionStateHolder stateHolder = subscriptionStateMap.get(s.getSku());
+ if (stateHolder != null) {
+ s.setState(ctx, stateHolder.state);
+ s.setExpireTime(ctx, stateHolder.expireTime);
+ }
if (s.getState().isGone() && s.hasStateChanged()) {
ctx.getSettings().LIVE_UPDATES_EXPIRED_FIRST_DLG_SHOWN_TIME.set(0L);
ctx.getSettings().LIVE_UPDATES_EXPIRED_SECOND_DLG_SHOWN_TIME.set(0L);
}
-
String introductoryPrice = skuDetails.getIntroductoryPrice();
String introductoryPricePeriod = skuDetails.getIntroductoryPricePeriod();
int introductoryPriceCycles = skuDetails.getIntroductoryPriceCycles();
diff --git a/OsmAnd/src-huawei/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java b/OsmAnd/src-huawei/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java
index 6f930fec1d..704c086f47 100644
--- a/OsmAnd/src-huawei/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java
+++ b/OsmAnd/src-huawei/net/osmand/plus/inapp/InAppPurchaseHelperImpl.java
@@ -29,6 +29,7 @@ import net.osmand.plus.OsmandApplication;
import net.osmand.plus.inapp.InAppPurchases.InAppPurchase;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscription;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscriptionIntroductoryInfo;
+import net.osmand.plus.inapp.InAppPurchases.PurchaseInfo;
import net.osmand.plus.inapp.InAppPurchasesImpl.InAppPurchaseLiveUpdatesOldSubscription;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.util.Algorithms;
@@ -48,7 +49,7 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
private List productInfos;
private OwnedPurchasesResult ownedSubscriptions;
- private List ownedInApps = new ArrayList<>();
+ private final List ownedInApps = new ArrayList<>();
public InAppPurchaseHelperImpl(OsmandApplication ctx) {
super(ctx);
@@ -233,15 +234,18 @@ public class InAppPurchaseHelperImpl extends InAppPurchaseHelper {
}
private PurchaseInfo getPurchaseInfo(InAppPurchaseData purchase) {
- return new PurchaseInfo(purchase.getProductId(), purchase.getSubscriptionId(), purchase.getPurchaseToken());
+ return new PurchaseInfo(purchase.getProductId(), purchase.getSubscriptionId(), purchase.getPurchaseToken(),
+ purchase.getPurchaseTime(), purchase.getPurchaseState(), true, purchase.isAutoRenewing());
}
private void fetchInAppPurchase(@NonNull InAppPurchase inAppPurchase, @NonNull ProductInfo productInfo, @Nullable InAppPurchaseData purchaseData) {
if (purchaseData != null) {
inAppPurchase.setPurchaseState(InAppPurchase.PurchaseState.PURCHASED);
inAppPurchase.setPurchaseTime(purchaseData.getPurchaseTime());
+ inAppPurchase.setPurchaseInfo(ctx, getPurchaseInfo(purchaseData));
} else {
inAppPurchase.setPurchaseState(InAppPurchase.PurchaseState.NOT_PURCHASED);
+ inAppPurchase.restorePurchaseInfo(ctx);
}
inAppPurchase.setPrice(productInfo.getPrice());
inAppPurchase.setPriceCurrencyCode(productInfo.getCurrency());
diff --git a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java
index 5136cd1f73..1a36558b87 100644
--- a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java
+++ b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchaseHelper.java
@@ -21,6 +21,7 @@ import net.osmand.plus.inapp.InAppPurchases.InAppPurchase.PurchaseState;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscription;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscription.SubscriptionState;
import net.osmand.plus.inapp.InAppPurchases.InAppSubscriptionList;
+import net.osmand.plus.inapp.InAppPurchases.PurchaseInfo;
import net.osmand.plus.liveupdates.CountrySelectionFragment;
import net.osmand.plus.liveupdates.CountrySelectionFragment.CountryItem;
import net.osmand.plus.settings.backend.OsmandSettings;
@@ -52,7 +53,7 @@ public abstract class InAppPurchaseHelper {
protected InAppPurchases purchases;
protected long lastValidationCheckTime;
protected boolean inventoryRequested;
- protected Map subscriptionStateMap = new HashMap<>();
+ protected Map subscriptionStateMap = new HashMap<>();
private static final long PURCHASE_VALIDATION_PERIOD_MSEC = 1000 * 60 * 60 * 24; // daily
@@ -85,6 +86,11 @@ public abstract class InAppPurchaseHelper {
void onFail();
}
+ static class SubscriptionStateHolder {
+ SubscriptionState state = SubscriptionState.UNDEFINED;
+ long expireTime = 0;
+ }
+
public enum InAppPurchaseTaskType {
REQUEST_INVENTORY,
PURCHASE_FULL_VERSION,
@@ -112,30 +118,6 @@ public abstract class InAppPurchaseHelper {
void onCommandDone(@NonNull InAppCommand command);
}
- public static class PurchaseInfo {
- private String sku;
- private String orderId;
- private String purchaseToken;
-
- public PurchaseInfo(String sku, String orderId, String purchaseToken) {
- this.sku = sku;
- this.orderId = orderId;
- this.purchaseToken = purchaseToken;
- }
-
- public String getSku() {
- return sku;
- }
-
- public String getOrderId() {
- return orderId;
- }
-
- public String getPurchaseToken() {
- return purchaseToken;
- }
- }
-
public String getToken() {
return token;
}
@@ -193,6 +175,11 @@ public abstract class InAppPurchaseHelper {
return purchases.getPurchasedMonthlyLiveUpdates();
}
+ @Nullable
+ public InAppSubscription getAnyPurchasedSubscription() {
+ return purchases.getAnyPurchasedSubscription();
+ }
+
public InAppPurchaseHelper(OsmandApplication ctx) {
this.ctx = ctx;
isDeveloperVersion = Version.isDeveloperVersion(ctx);
@@ -202,8 +189,7 @@ public abstract class InAppPurchaseHelper {
public List getEverMadeSubscriptions() {
List subscriptions = new ArrayList<>();
for (InAppSubscription subscription : getLiveUpdates().getVisibleSubscriptions()) {
- SubscriptionState state = subscription.getState();
- if (state != SubscriptionState.UNDEFINED) {
+ if (subscription.isPurchased() || subscription.getState() != SubscriptionState.UNDEFINED) {
subscriptions.add(subscription);
}
}
@@ -448,15 +434,22 @@ public abstract class InAppPurchaseHelper {
}
if (subscriptionsStateJson != null) {
inventoryRequested = true;
- Map subscriptionStateMap = new HashMap<>();
+ Map subscriptionStateMap = new HashMap<>();
try {
JSONArray subArrJson = new JSONArray(subscriptionsStateJson);
for (int i = 0; i < subArrJson.length(); i++) {
JSONObject subObj = subArrJson.getJSONObject(i);
String sku = subObj.getString("sku");
String state = subObj.getString("state");
+ long expireTime = 0;
+ if (subObj.has("expire_time")) {
+ expireTime = subObj.getLong("expire_time");
+ }
if (!Algorithms.isEmpty(sku) && !Algorithms.isEmpty(state)) {
- subscriptionStateMap.put(sku, SubscriptionState.getByStateStr(state));
+ SubscriptionStateHolder stateHolder = new SubscriptionStateHolder();
+ stateHolder.state = SubscriptionState.getByStateStr(state);
+ stateHolder.expireTime = expireTime;
+ subscriptionStateMap.put(sku, stateHolder);
}
}
} catch (JSONException e) {
@@ -500,12 +493,14 @@ public abstract class InAppPurchaseHelper {
protected void onPurchaseDone(PurchaseInfo info) {
logDebug("Purchase successful.");
- InAppPurchase liveUpdatesPurchase = getLiveUpdates().getSubscriptionBySku(info.getSku());
+ InAppSubscription liveUpdatesPurchase = getLiveUpdates().getSubscriptionBySku(info.getSku());
if (liveUpdatesPurchase != null) {
// bought live updates
logDebug("Live updates subscription purchased.");
final String sku = liveUpdatesPurchase.getSku();
liveUpdatesPurchase.setPurchaseState(PurchaseState.PURCHASED);
+ liveUpdatesPurchase.setPurchaseInfo(ctx, info);
+ liveUpdatesPurchase.setState(ctx, SubscriptionState.UNDEFINED);
sendTokens(Collections.singletonList(info), new OnRequestResultListener() {
@Override
public void onResult(String result) {
@@ -525,6 +520,7 @@ public abstract class InAppPurchaseHelper {
} else if (info.getSku().equals(getFullVersion().getSku())) {
// bought full version
getFullVersion().setPurchaseState(PurchaseState.PURCHASED);
+ getFullVersion().setPurchaseInfo(ctx, info);
logDebug("Full version purchased.");
showToast(ctx.getString(R.string.full_version_thanks));
ctx.getSettings().FULL_VERSION_PURCHASED.set(true);
@@ -536,6 +532,7 @@ public abstract class InAppPurchaseHelper {
} else if (info.getSku().equals(getDepthContours().getSku())) {
// bought sea depth contours
getDepthContours().setPurchaseState(PurchaseState.PURCHASED);
+ getDepthContours().setPurchaseInfo(ctx, info);
logDebug("Sea depth contours purchased.");
showToast(ctx.getString(R.string.sea_depth_thanks));
ctx.getSettings().DEPTH_CONTOURS_PURCHASED.set(true);
@@ -548,6 +545,7 @@ public abstract class InAppPurchaseHelper {
} else if (info.getSku().equals(getContourLines().getSku())) {
// bought contour lines
getContourLines().setPurchaseState(PurchaseState.PURCHASED);
+ getContourLines().setPurchaseInfo(ctx, info);
logDebug("Contours lines purchased.");
showToast(ctx.getString(R.string.contour_lines_thanks));
ctx.getSettings().CONTOUR_LINES_PURCHASED.set(true);
diff --git a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchases.java b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchases.java
index 27d359630e..61dae8f0e8 100644
--- a/OsmAnd/src/net/osmand/plus/inapp/InAppPurchases.java
+++ b/OsmAnd/src/net/osmand/plus/inapp/InAppPurchases.java
@@ -7,33 +7,41 @@ import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+
import net.osmand.AndroidUtils;
import net.osmand.Period;
import net.osmand.Period.PeriodUnit;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.helpers.FontCache;
+import net.osmand.plus.settings.backend.CommonPreference;
+import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.widgets.style.CustomTypefaceSpan;
import net.osmand.util.Algorithms;
+import org.json.JSONException;
+import org.json.JSONObject;
+
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Currency;
+import java.util.Date;
+import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
-import androidx.annotation.ColorInt;
-import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.StringRes;
-
public abstract class InAppPurchases {
protected InAppPurchase fullVersion;
@@ -47,6 +55,10 @@ public abstract class InAppPurchases {
protected InAppPurchases(OsmandApplication ctx) {
}
+ private static OsmandSettings getSettings(@NonNull Context ctx) {
+ return ((OsmandApplication) ctx.getApplicationContext()).getSettings();
+ }
+
public InAppPurchase getFullVersion() {
return fullVersion;
}
@@ -83,6 +95,17 @@ public abstract class InAppPurchases {
return null;
}
+ @Nullable
+ public InAppSubscription getAnyPurchasedSubscription() {
+ List allSubscriptions = liveUpdates.getAllSubscriptions();
+ for (InAppSubscription subscription : allSubscriptions) {
+ if (subscription.isAnyPurchased()) {
+ return subscription;
+ }
+ }
+ return null;
+ }
+
public InAppSubscriptionList getLiveUpdates() {
return liveUpdates;
}
@@ -231,7 +254,7 @@ public abstract class InAppPurchases {
private double priceValue;
private String priceCurrencyCode;
private PurchaseState purchaseState = PurchaseState.UNKNOWN;
- private long purchaseTime;
+ private PurchaseInfo purchaseInfo;
double monthlyPriceValue;
boolean donationSupported = false;
@@ -253,6 +276,37 @@ public abstract class InAppPurchases {
return sku;
}
+ @Nullable
+ public String getOrderId() {
+ return purchaseInfo != null ? purchaseInfo.getOrderId() : null;
+ }
+
+ private CommonPreference getPurchaseInfoPref(@NonNull Context ctx) {
+ return getSettings(ctx).registerStringPreference(sku + "_purchase_info", "").makeGlobal();
+ }
+
+ public boolean storePurchaseInfo(@NonNull Context ctx) {
+ PurchaseInfo purchaseInfo = this.purchaseInfo;
+ if (purchaseInfo != null) {
+ getPurchaseInfoPref(ctx).set(purchaseInfo.toJson());
+ return true;
+ }
+ return false;
+ }
+
+ public boolean restorePurchaseInfo(@NonNull Context ctx) {
+ String json = getPurchaseInfoPref(ctx).get();
+ if (!Algorithms.isEmpty(json)) {
+ try {
+ purchaseInfo = new PurchaseInfo(json);
+ } catch (JSONException e) {
+ // ignore
+ }
+ return true;
+ }
+ return false;
+ }
+
public String getPrice(Context ctx) {
if (!Algorithms.isEmpty(price)) {
return price;
@@ -266,11 +320,16 @@ public abstract class InAppPurchases {
}
public long getPurchaseTime() {
- return purchaseTime;
+ return purchaseInfo != null ? purchaseInfo.getPurchaseTime() : 0;
}
- public void setPurchaseTime(long purchaseTime) {
- this.purchaseTime = purchaseTime;
+ public PurchaseInfo getPurchaseInfo() {
+ return purchaseInfo;
+ }
+
+ void setPurchaseInfo(@NonNull Context ctx, PurchaseInfo purchaseInfo) {
+ this.purchaseInfo = purchaseInfo;
+ storePurchaseInfo(ctx);
}
public String getDefaultPrice(Context ctx) {
@@ -571,35 +630,33 @@ public abstract class InAppPurchases {
public static abstract class InAppSubscription extends InAppPurchase {
- private Map upgrades = new ConcurrentHashMap<>();
- private String skuNoVersion;
+ private final Map upgrades = new ConcurrentHashMap<>();
+ private final String skuNoVersion;
private String subscriptionPeriodString;
private Period subscriptionPeriod;
private boolean upgrade = false;
private SubscriptionState state = SubscriptionState.UNDEFINED;
- private SubscriptionState prevState = SubscriptionState.UNDEFINED;
+ private SubscriptionState previousState = SubscriptionState.UNDEFINED;
+ private long expireTime = 0;
private InAppSubscriptionIntroductoryInfo introductoryInfo;
public enum SubscriptionState {
- UNDEFINED("undefined", 0, 0),
- ACTIVE("active", R.string.osm_live_active, R.drawable.bg_osmand_live_active),
- CANCELLED("cancelled", R.string.osmand_live_cancelled, R.drawable.bg_osmand_live_cancelled),
- IN_GRACE_PERIOD("in_grace_period", R.string.in_grace_period, R.drawable.bg_osmand_live_active),
- ON_HOLD("on_hold", R.string.on_hold, R.drawable.bg_osmand_live_cancelled),
- PAUSED("paused", R.string.shared_string_paused, R.drawable.bg_osmand_live_cancelled),
- EXPIRED("expired", R.string.expired, R.drawable.bg_osmand_live_cancelled);
+ UNDEFINED("undefined", R.string.shared_string_undefined),
+ ACTIVE("active", R.string.osm_live_active),
+ CANCELLED("cancelled", R.string.osmand_live_cancelled),
+ IN_GRACE_PERIOD("in_grace_period", R.string.in_grace_period),
+ ON_HOLD("on_hold", R.string.on_hold),
+ PAUSED("paused", R.string.shared_string_paused),
+ EXPIRED("expired", R.string.expired);
private final String stateStr;
@StringRes
private final int stringRes;
- @DrawableRes
- private final int backgroundRes;
- SubscriptionState(@NonNull String stateStr, @StringRes int stringRes, @DrawableRes int backgroundRes) {
+ SubscriptionState(@NonNull String stateStr, @StringRes int stringRes) {
this.stateStr = stateStr;
this.stringRes = stringRes;
- this.backgroundRes = backgroundRes;
}
public String getStateStr() {
@@ -611,11 +668,6 @@ public abstract class InAppPurchases {
return stringRes;
}
- @DrawableRes
- public int getBackgroundRes() {
- return backgroundRes;
- }
-
@NonNull
public static SubscriptionState getByStateStr(@NonNull String stateStr) {
for (SubscriptionState state : SubscriptionState.values()) {
@@ -678,21 +730,76 @@ public abstract class InAppPurchases {
return state;
}
- public void setState(@NonNull SubscriptionState state) {
+ public void setState(@NonNull Context ctx, @NonNull SubscriptionState state) {
this.state = state;
+ storeState(ctx, state);
}
@NonNull
- public SubscriptionState getPrevState() {
- return prevState;
- }
-
- public void setPrevState(@NonNull SubscriptionState prevState) {
- this.prevState = prevState;
+ public SubscriptionState getPreviousState() {
+ return previousState;
}
public boolean hasStateChanged() {
- return state != prevState;
+ return state != previousState;
+ }
+
+ private CommonPreference getStatePref(@NonNull Context ctx) {
+ return getSettings(ctx).registerStringPreference(getSku() + "_state", "").makeGlobal();
+ }
+
+ void storeState(@NonNull Context ctx, @NonNull SubscriptionState state) {
+ getStatePref(ctx).set(state.getStateStr());
+ }
+
+ boolean restoreState(@NonNull Context ctx) {
+ String stateStr = getStatePref(ctx).get();
+ if (!Algorithms.isEmpty(stateStr)) {
+ SubscriptionState state = SubscriptionState.getByStateStr(stateStr);
+ this.previousState = state;
+ this.state = state;
+ return true;
+ }
+ return false;
+ }
+
+ public long getCalculatedExpiredTime() {
+ long purchaseTime = getPurchaseTime();
+ Period period = getSubscriptionPeriod();
+ if (purchaseTime == 0 || period == null || period.getUnit() == null) {
+ return 0;
+ }
+ Date date = new Date(purchaseTime);
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ calendar.add(period.getUnit().getCalendarIdx(), period.getNumberOfUnits());
+ return calendar.getTimeInMillis();
+ }
+
+ public long getExpireTime() {
+ return expireTime;
+ }
+
+ public void setExpireTime(@NonNull Context ctx, long expireTime) {
+ this.expireTime = expireTime;
+ storeExpireTime(ctx, expireTime);
+ }
+
+ private CommonPreference getExpireTimePref(@NonNull Context ctx) {
+ return getSettings(ctx).registerLongPreference(getSku() + "_expire_time", 0L).makeGlobal();
+ }
+
+ boolean restoreExpireTime(@NonNull Context ctx) {
+ Long expireTime = getExpireTimePref(ctx).get();
+ if (expireTime != null) {
+ this.expireTime = expireTime;
+ return true;
+ }
+ return false;
+ }
+
+ void storeExpireTime(@NonNull Context ctx, long expireTime) {
+ getExpireTimePref(ctx).set(expireTime);
}
public boolean isAnyPurchased() {
@@ -999,5 +1106,95 @@ public abstract class InAppPurchases {
return null;
}
}
+
+ public static class PurchaseInfo {
+ private String sku;
+ private String orderId;
+ private String purchaseToken;
+ private long purchaseTime;
+ private int purchaseState;
+ private boolean acknowledged;
+ private boolean autoRenewing;
+
+ PurchaseInfo(String sku, String orderId, String purchaseToken, long purchaseTime,
+ int purchaseState, boolean acknowledged, boolean autoRenewing) {
+ this.sku = sku;
+ this.orderId = orderId;
+ this.purchaseToken = purchaseToken;
+ this.purchaseTime = purchaseTime;
+ this.purchaseState = purchaseState;
+ this.acknowledged = acknowledged;
+ this.autoRenewing = autoRenewing;
+ }
+
+ PurchaseInfo(@NonNull String json) throws JSONException {
+ parseJson(json);
+ }
+
+ public String getSku() {
+ return sku;
+ }
+
+ public String getOrderId() {
+ return orderId;
+ }
+
+ public String getPurchaseToken() {
+ return purchaseToken;
+ }
+
+ public long getPurchaseTime() {
+ return purchaseTime;
+ }
+
+ public int getPurchaseState() {
+ return purchaseState;
+ }
+
+ public boolean isAcknowledged() {
+ return acknowledged;
+ }
+
+ public boolean isAutoRenewing() {
+ return autoRenewing;
+ }
+
+ public String toJson() {
+ Map jsonMap = new HashMap<>();
+ jsonMap.put("sku", sku);
+ jsonMap.put("orderId", orderId);
+ jsonMap.put("purchaseToken", purchaseToken);
+ jsonMap.put("purchaseTime", purchaseTime);
+ jsonMap.put("purchaseState", purchaseState);
+ jsonMap.put("acknowledged", acknowledged);
+ jsonMap.put("autoRenewing", autoRenewing);
+ return new JSONObject(jsonMap).toString();
+ }
+
+ public void parseJson(@NonNull String json) throws JSONException {
+ JSONObject jsonObj = new JSONObject(json);
+ if (jsonObj.has("sku")) {
+ this.sku = jsonObj.getString("sku");
+ }
+ if (jsonObj.has("orderId")) {
+ this.orderId = jsonObj.getString("orderId");
+ }
+ if (jsonObj.has("purchaseToken")) {
+ this.purchaseToken = jsonObj.getString("purchaseToken");
+ }
+ if (jsonObj.has("purchaseTime")) {
+ this.purchaseTime = jsonObj.getLong("purchaseTime");
+ }
+ if (jsonObj.has("purchaseState")) {
+ this.purchaseState = jsonObj.getInt("purchaseState");
+ }
+ if (jsonObj.has("acknowledged")) {
+ this.acknowledged = jsonObj.getBoolean("acknowledged");
+ }
+ if (jsonObj.has("autoRenewing")) {
+ this.autoRenewing = jsonObj.getBoolean("autoRenewing");
+ }
+ }
+ }
}
diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/SubscriptionsListCard.java b/OsmAnd/src/net/osmand/plus/settings/fragments/SubscriptionsListCard.java
index 645a68b037..d4f56cdc76 100644
--- a/OsmAnd/src/net/osmand/plus/settings/fragments/SubscriptionsListCard.java
+++ b/OsmAnd/src/net/osmand/plus/settings/fragments/SubscriptionsListCard.java
@@ -7,7 +7,6 @@ import android.view.ViewGroup;
import android.widget.TextView;
import net.osmand.AndroidUtils;
-import net.osmand.Period;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity;
@@ -20,11 +19,10 @@ import net.osmand.plus.routepreparationmenu.cards.BaseCard;
import net.osmand.util.Algorithms;
import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
import java.util.List;
import java.util.Locale;
+import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
public class SubscriptionsListCard extends BaseCard {
@@ -60,7 +58,13 @@ public class SubscriptionsListCard extends BaseCard {
for (int i = 0; i < subscriptions.size(); i++) {
InAppSubscription subscription = subscriptions.get(i);
SubscriptionState state = subscription.getState();
- boolean autoRenewed = state == SubscriptionState.ACTIVE || state == SubscriptionState.IN_GRACE_PERIOD;
+ boolean autoRenewing = false;
+ if (subscription.isPurchased() && subscription.getPurchaseInfo() != null) {
+ autoRenewing = subscription.getPurchaseInfo().isAutoRenewing();
+ state = SubscriptionState.ACTIVE;
+ } else if (state != SubscriptionState.UNDEFINED) {
+ autoRenewing = state == SubscriptionState.ACTIVE || state == SubscriptionState.IN_GRACE_PERIOD;
+ }
View card = inflater.inflate(R.layout.subscription_layout, null, false);
((ViewGroup) view).addView(card);
@@ -72,11 +76,18 @@ public class SubscriptionsListCard extends BaseCard {
AndroidUiHelper.updateVisibility(subscriptionPeriod, true);
}
- if (autoRenewed) {
+ if (autoRenewing) {
TextView nextBillingDate = card.findViewById(R.id.next_billing_date);
- String date = getHumanDate(subscription.getPurchaseTime(), subscription.getSubscriptionPeriod());
- if (!Algorithms.isEmpty(date)) {
- nextBillingDate.setText(app.getString(R.string.next_billing_date, date));
+ String expiredTimeStr = null;
+ long expiredTime = subscription.getExpireTime();
+ if (expiredTime == 0) {
+ expiredTime = subscription.getCalculatedExpiredTime();
+ }
+ if (expiredTime > 0) {
+ expiredTimeStr = dateFormat.format(expiredTime);
+ }
+ if (!Algorithms.isEmpty(expiredTimeStr)) {
+ nextBillingDate.setText(app.getString(R.string.next_billing_date, expiredTimeStr));
AndroidUiHelper.updateVisibility(nextBillingDate, true);
}
} else {
@@ -102,7 +113,7 @@ public class SubscriptionsListCard extends BaseCard {
TextView status = card.findViewById(R.id.status);
status.setText(app.getString(state.getStringRes()));
- AndroidUtils.setBackground(status, app.getUIUtilities().getIcon(state.getBackgroundRes()));
+ AndroidUtils.setBackground(status, app.getUIUtilities().getIcon(getBackgroundRes(state)));
int dividerLayout = i + 1 == subscriptions.size() ? R.layout.simple_divider_item : R.layout.divider_half_item;
View divider = inflater.inflate(dividerLayout, (ViewGroup) view, false);
@@ -110,15 +121,9 @@ public class SubscriptionsListCard extends BaseCard {
}
}
- private String getHumanDate(long time, Period period) {
- if (period == null || period.getUnit() == null) {
- return "";
- }
- Date date = new Date(time);
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(date);
- calendar.add(period.getUnit().getCalendarIdx(), period.getNumberOfUnits());
- date = calendar.getTime();
- return dateFormat.format(date);
+ @DrawableRes
+ private int getBackgroundRes(@NonNull SubscriptionState state) {
+ return state == SubscriptionState.ACTIVE || state == SubscriptionState.IN_GRACE_PERIOD
+ ? R.drawable.bg_osmand_live_active : R.drawable.bg_osmand_live_cancelled;
}
}
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/wikipedia/WikiArticleHelper.java b/OsmAnd/src/net/osmand/plus/wikipedia/WikiArticleHelper.java
index 02f31efe8e..b21ca8527b 100644
--- a/OsmAnd/src/net/osmand/plus/wikipedia/WikiArticleHelper.java
+++ b/OsmAnd/src/net/osmand/plus/wikipedia/WikiArticleHelper.java
@@ -142,7 +142,7 @@ public class WikiArticleHelper {
public boolean publish(Amenity amenity) {
List allNames = amenity.getAllNames(false);
for (String amenityName : allNames) {
- if (name.equalsIgnoreCase(amenityName)) {
+ if (name.equals(amenityName)) {
results.add(amenity);
break;
}