Merge remote-tracking branch 'origin/Fix_8079_ask_loc_permission' into Fix_8079_ask_loc_permission

This commit is contained in:
Dima-1 2020-01-31 14:47:12 +02:00
commit e80f9f83e8
83 changed files with 1211 additions and 611 deletions

View file

@ -19,6 +19,8 @@ public class BinaryMapDataObject {
protected int[] types = null;
protected int[] additionalTypes = null;
protected int objectType = RenderingRulesStorage.POINT_RULES;
protected int labelX;
protected int labelY;
protected TIntObjectHashMap<String> objectNames = null;
protected TIntArrayList namesOrder = null;
@ -33,7 +35,7 @@ public class BinaryMapDataObject {
public BinaryMapDataObject(long id, int[] coordinates, int[][] polygonInnerCoordinates, int objectType, boolean area,
int[] types, int[] additionalTypes){
int[] types, int[] additionalTypes, int labelX, int labelY){
this.polygonInnerCoordinates = polygonInnerCoordinates;
this.coordinates = coordinates;
this.additionalTypes = additionalTypes;
@ -41,6 +43,8 @@ public class BinaryMapDataObject {
this.id = id;
this.objectType = objectType;
this.area = area;
this.labelX = labelX;
this.labelY = labelY;
}
protected void setCoordinates(int[] coordinates) {
@ -202,79 +206,80 @@ public class BinaryMapDataObject {
&& this.id == thatObj.id
&& this.area == thatObj.area
&& compareCoordinates(this.coordinates, thatObj.coordinates, coordinatesPrecision) ) {
if(mapIndex == null) {
if (mapIndex == null) {
throw new IllegalStateException("Illegal binary object: " + id);
}
if(thatObj.mapIndex == null) {
if (thatObj.mapIndex == null) {
throw new IllegalStateException("Illegal binary object: " + thatObj.id);
}
boolean equals = true;
if(equals) {
if(polygonInnerCoordinates == null || thatObj.polygonInnerCoordinates == null) {
equals = polygonInnerCoordinates == thatObj.polygonInnerCoordinates;
} else if(polygonInnerCoordinates.length != thatObj.polygonInnerCoordinates.length){
if (equals) {
if (polygonInnerCoordinates == null || thatObj.polygonInnerCoordinates == null) {
equals = polygonInnerCoordinates == thatObj.polygonInnerCoordinates;
} else if (polygonInnerCoordinates.length != thatObj.polygonInnerCoordinates.length) {
equals = false;
} else {
for(int i = 0; i < polygonInnerCoordinates.length && equals; i++) {
if(polygonInnerCoordinates[i] == null || thatObj.polygonInnerCoordinates[i] == null) {
equals = polygonInnerCoordinates[i] == thatObj.polygonInnerCoordinates[i];
} else if(polygonInnerCoordinates[i].length != thatObj.polygonInnerCoordinates[i].length){
for (int i = 0; i < polygonInnerCoordinates.length && equals; i++) {
if (polygonInnerCoordinates[i] == null || thatObj.polygonInnerCoordinates[i] == null) {
equals = polygonInnerCoordinates[i] == thatObj.polygonInnerCoordinates[i];
} else if (polygonInnerCoordinates[i].length != thatObj.polygonInnerCoordinates[i].length) {
equals = false;
} else {
equals = compareCoordinates(polygonInnerCoordinates[i], thatObj.polygonInnerCoordinates[i], coordinatesPrecision);
equals = compareCoordinates(polygonInnerCoordinates[i], thatObj.polygonInnerCoordinates[i],
coordinatesPrecision);
}
}
}
}
if(equals) {
if(types == null || thatObj.types == null) {
equals = types == thatObj.types;
} else if(types.length != thatObj.types.length){
if (equals) {
if (types == null || thatObj.types == null) {
equals = types == thatObj.types;
} else if (types.length != thatObj.types.length) {
equals = false;
} else {
for(int i = 0; i < types.length && equals; i++) {
for (int i = 0; i < types.length && equals; i++) {
TagValuePair o = mapIndex.decodeType(types[i]);
TagValuePair s = thatObj.mapIndex.decodeType(thatObj.types[i]);
equals = o.equals(s) && equals;
}
}
}
if(equals) {
if(additionalTypes == null || thatObj.additionalTypes == null) {
equals = additionalTypes == thatObj.additionalTypes;
} else if(additionalTypes.length != thatObj.additionalTypes.length){
if (equals) {
if (additionalTypes == null || thatObj.additionalTypes == null) {
equals = additionalTypes == thatObj.additionalTypes;
} else if (additionalTypes.length != thatObj.additionalTypes.length) {
equals = false;
} else {
for(int i = 0; i < additionalTypes.length && equals; i++) {
for (int i = 0; i < additionalTypes.length && equals; i++) {
TagValuePair o = mapIndex.decodeType(additionalTypes[i]);
TagValuePair s = thatObj.mapIndex.decodeType(thatObj.additionalTypes[i]);
equals = o.equals(s);
}
}
}
if(equals) {
if(namesOrder == null || thatObj.namesOrder == null) {
equals = namesOrder == thatObj.namesOrder;
} else if(namesOrder.size() != thatObj.namesOrder.size()){
if (equals) {
if (namesOrder == null || thatObj.namesOrder == null) {
equals = namesOrder == thatObj.namesOrder;
} else if (namesOrder.size() != thatObj.namesOrder.size()) {
equals = false;
} else {
for(int i = 0; i < namesOrder.size() && equals; i++) {
for (int i = 0; i < namesOrder.size() && equals; i++) {
TagValuePair o = mapIndex.decodeType(namesOrder.get(i));
TagValuePair s = thatObj.mapIndex.decodeType(thatObj.namesOrder.get(i));
equals = o.equals(s);
}
}
}
if(equals) {
if (equals) {
// here we know that name indexes are equal & it is enough to check the value sets
if(objectNames == null || thatObj.objectNames == null) {
equals = objectNames == thatObj.objectNames;
} else if(objectNames.size() != thatObj.objectNames.size()){
if (objectNames == null || thatObj.objectNames == null) {
equals = objectNames == thatObj.objectNames;
} else if (objectNames.size() != thatObj.objectNames.size()) {
equals = false;
} else {
for(int i = 0; i < namesOrder.size() && equals; i++) {
for (int i = 0; i < namesOrder.size() && equals; i++) {
String o = objectNames.get(namesOrder.get(i));
String s = thatObj.objectNames.get(thatObj.namesOrder.get(i));
equals = Algorithms.objectEquals(o, s);
@ -357,14 +362,41 @@ public class BinaryMapDataObject {
}
public boolean isLabelSpecified() {
return (labelX != 0 || labelY != 0) && coordinates.length > 0;
}
public int getLabelX() {
long sum = 0;
int LABEL_SHIFT = 31 - BinaryMapIndexReader.LABEL_ZOOM_ENCODE;
int len = coordinates.length / 2;
for(int i = 0; i < len; i++) {
sum += coordinates[2 * i];
}
int average = ((int) (sum >> BinaryMapIndexReader.SHIFT_COORDINATES)/ len)
<< (BinaryMapIndexReader.SHIFT_COORDINATES - LABEL_SHIFT);
int label31X = (average + this.labelX) << LABEL_SHIFT;
return label31X;
}
public int getLabelY() {
long sum = 0;
int LABEL_SHIFT = 31 - BinaryMapIndexReader.LABEL_ZOOM_ENCODE;
int len = coordinates.length / 2;
for(int i = 0; i < len; i++) {
sum += coordinates[2 * i + 1];
}
int average = ((int) (sum >> BinaryMapIndexReader.SHIFT_COORDINATES)/ len)
<< (BinaryMapIndexReader.SHIFT_COORDINATES - LABEL_SHIFT);
int label31Y = (average + this.labelY) << LABEL_SHIFT;
return label31Y;
}
public int[] getCoordinates() {
return coordinates;
}
public int getObjectType() {
return objectType;
}
}
}

View file

@ -76,12 +76,12 @@ import gnu.trove.map.TIntObjectMap;
import gnu.trove.map.hash.TIntObjectHashMap;
import gnu.trove.map.hash.TLongObjectHashMap;
import gnu.trove.set.hash.TIntHashSet;
import gnu.trove.set.hash.TLongHashSet;
public class BinaryMapIndexReader {
public final static int TRANSPORT_STOP_ZOOM = 24;
public static final int SHIFT_COORDINATES = 5;
public static final int LABEL_ZOOM_ENCODE = 26;
private final static Log log = PlatformUtil.getLog(BinaryMapIndexReader.class);
public static boolean READ_STATS = false;
public static final SearchPoiTypeFilter ACCEPT_ALL_POI_TYPE_FILTER = new SearchPoiTypeFilter() {
@ -1136,6 +1136,7 @@ public class BinaryMapIndexReader {
TIntObjectHashMap<String> stringNames = null;
TIntArrayList stringOrder = null;
long id = 0;
int labelX = 0, labelY = 0;
boolean loop = true;
while (loop) {
@ -1232,6 +1233,26 @@ public class BinaryMapIndexReader {
req.stat.lastStringNamesSize += sizeL;
}
break;
case OsmandOdb.MapData.LABELCOORDINATES_FIELD_NUMBER:
sizeL = codedIS.readRawVarint32();
old = codedIS.pushLimit(sizeL);
int i = 0;
while (codedIS.getBytesUntilLimit() > 0) {
if (i == 0) {
labelX = codedIS.readSInt32();
} else if (i == 1) {
labelY = codedIS.readSInt32();
} else {
codedIS.readRawVarint32();
}
i++;
}
codedIS.popLimit(old);
if (READ_STATS) {
req.stat.addTagHeader(OsmandOdb.MapData.LABELCOORDINATES_FIELD_NUMBER, sizeL);
req.stat.lastObjectLabelCoordinates += sizeL;
}
break;
default:
skipUnknownField(t);
break;
@ -1259,6 +1280,9 @@ public class BinaryMapIndexReader {
dataObject.id = id;
dataObject.area = area;
dataObject.mapIndex = root;
dataObject.labelX = labelX;
dataObject.labelY = labelY;
return dataObject;
}
@ -1562,6 +1586,7 @@ public class BinaryMapIndexReader {
public int lastObjectAdditionalTypes;
public int lastObjectTypes;
public int lastObjectCoordinates;
public int lastObjectLabelCoordinates;
public int lastObjectSize;
public int lastBlockStringTableSize;
@ -1586,6 +1611,7 @@ public class BinaryMapIndexReader {
lastObjectAdditionalTypes = 0;
lastObjectTypes = 0;
lastObjectCoordinates = 0;
lastObjectLabelCoordinates = 0;
}
}
@ -1917,7 +1943,8 @@ public class BinaryMapIndexReader {
BinaryMapDataObject bm =
new BinaryMapDataObject(o.id, o.coordinates, o.polygonInnerCoordinates, o.objectType, o.area,
types.toArray(), additionalTypes.isEmpty() ? null : additionalTypes.toArray());
types.toArray(), additionalTypes.isEmpty() ? null : additionalTypes.toArray(),
o.labelX, o.labelY);
if (o.namesOrder != null) {
bm.objectNames = new TIntObjectHashMap<>();
bm.namesOrder = new TIntArrayList();
@ -2093,7 +2120,7 @@ public class BinaryMapIndexReader {
public static void main(String[] args) throws IOException {
File fl = new File(System.getProperty("maps") + "/Synthetic_test_rendering.obf");
fl = new File(System.getProperty("maps") + "/Belarus_europe_2.obf");
fl = new File("/home/madwasp79/OsmAnd-maps/Poly_center2.obf");
RandomAccessFile raf = new RandomAccessFile(fl, "r");
@ -2201,7 +2228,6 @@ public class BinaryMapIndexReader {
private static List<Location> readGPX(File f) {
List<Location> res = new ArrayList<Location>();
try {
StringBuilder content = new StringBuilder();
BufferedReader reader = new BufferedReader(getUTF8Reader(new FileInputStream(f)));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder dom = factory.newDocumentBuilder();
@ -2218,7 +2244,6 @@ public class BinaryMapIndexReader {
// Document doc = dom.parse(new InputSource(new StringReader(content.toString())));
Document doc = dom.parse(new InputSource(reader));
NodeList list = doc.getElementsByTagName("trkpt");
Way w = new Way(-1);
for (int i = 0; i < list.getLength(); i++) {
Element item = (Element) list.item(i);
try {

File diff suppressed because it is too large Load diff

View file

@ -691,31 +691,21 @@ public class OsmandRegions {
}
}
public List<WorldRegion> getWoldRegionsAt(LatLon latLon) throws IOException {
List<WorldRegion> result = new ArrayList<>();
List<BinaryMapDataObject> mapDataObjects = getBinaryMapDataObjectsAt(latLon);
for (BinaryMapDataObject obj : mapDataObjects) {
String fullName = getFullName(obj);
if (fullName != null) {
WorldRegion reg = getRegionData(fullName);
if (reg != null) {
result.add(reg);
}
}
}
return result;
public List<WorldRegion> getWorldRegionsAt(LatLon latLon) throws IOException {
Map<WorldRegion, BinaryMapDataObject> mapDataObjects = getBinaryMapDataObjectsWithRegionsAt(latLon);
return new ArrayList<>(mapDataObjects.keySet());
}
public BinaryMapDataObject getSmallestBinaryMapDataObjectAt(LatLon latLon) throws IOException {
List<BinaryMapDataObject> mapDataObjects = getBinaryMapDataObjectsAt(latLon);
return getSmallestBinaryMapDataObjectAt(mapDataObjects);
public Map.Entry<WorldRegion, BinaryMapDataObject> getSmallestBinaryMapDataObjectAt(LatLon latLon) throws IOException {
Map<WorldRegion, BinaryMapDataObject> mapDataObjectsWithRegions = getBinaryMapDataObjectsWithRegionsAt(latLon);
return getSmallestBinaryMapDataObjectAt(mapDataObjectsWithRegions);
}
public BinaryMapDataObject getSmallestBinaryMapDataObjectAt(List<BinaryMapDataObject> mapDataObjects) {
BinaryMapDataObject res = null;
public Map.Entry<WorldRegion, BinaryMapDataObject> getSmallestBinaryMapDataObjectAt(Map<WorldRegion, BinaryMapDataObject> mapDataObjectsWithRegions) {
Map.Entry<WorldRegion, BinaryMapDataObject> res = null;
double smallestArea = -1;
for (BinaryMapDataObject o : mapDataObjects) {
double area = OsmandRegions.getArea(o);
for (Map.Entry<WorldRegion, BinaryMapDataObject> o : mapDataObjectsWithRegions.entrySet()) {
double area = OsmandRegions.getArea(o.getValue());
if (smallestArea == -1) {
smallestArea = area;
res = o;
@ -727,10 +717,10 @@ public class OsmandRegions {
return res;
}
private List<BinaryMapDataObject> getBinaryMapDataObjectsAt(LatLon latLon) throws IOException {
private Map<WorldRegion, BinaryMapDataObject> getBinaryMapDataObjectsWithRegionsAt(LatLon latLon) throws IOException {
int point31x = MapUtils.get31TileNumberX(latLon.getLongitude());
int point31y = MapUtils.get31TileNumberY(latLon.getLatitude());
Map<WorldRegion, BinaryMapDataObject> foundObjects = new LinkedHashMap<>();
List<BinaryMapDataObject> mapDataObjects;
try {
mapDataObjects = queryBboxNoInit(point31x, point31x, point31y, point31y, true);
@ -743,25 +733,18 @@ public class OsmandRegions {
while (it.hasNext()) {
BinaryMapDataObject o = it.next();
if (o.getTypes() != null) {
boolean isRegion = true;
for (int i = 0; i < o.getTypes().length; i++) {
TagValuePair tp = o.getMapIndex().decodeType(o.getTypes()[i]);
if ("boundary".equals(tp.value)) {
isRegion = false;
break;
}
}
WorldRegion downloadRegion = getRegionData(getFullName(o));
if (!isRegion
|| downloadRegion == null
if ( downloadRegion == null
|| !downloadRegion.isRegionMapDownload()
|| !contain(o, point31x, point31y)) {
it.remove();
} else {
foundObjects.put(downloadRegion, o);
}
}
}
}
return mapDataObjects;
return foundObjects;
}

View file

@ -5,6 +5,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
import net.osmand.data.LatLon;
import net.osmand.osm.edit.Relation.RelationMember;
@ -46,6 +47,18 @@ public class OsmMapUtils {
}
return null;
}
public static LatLon getComplexPolyCenter(Collection<Node> nodes) {
double precision = 1e-5; //where to set precision constant?
final List<List<LatLon>> rings = new ArrayList<>();
List<LatLon> outerRing = new ArrayList<>();
for (Node n : nodes) {
outerRing.add(new LatLon(n.getLatitude(), n.getLongitude()));
}
rings.add(outerRing);
return getPolylabelPoint(rings, precision);
}
public static LatLon getWeightCenter(Collection<LatLon> nodes) {
if (nodes.isEmpty()) {
@ -86,7 +99,7 @@ public class OsmMapUtils {
return null;
}
boolean area = w.getFirstNodeId() == w.getLastNodeId();
LatLon ll = area ? getMathWeightCenterForNodes(nodes) : getWeightCenterForNodes(nodes);
LatLon ll = area ? getComplexPolyCenter(nodes) : getWeightCenterForNodes(nodes);
if(ll == null) {
return null;
}
@ -107,6 +120,7 @@ public class OsmMapUtils {
}
return new LatLon(flat, flon);
}
@ -436,6 +450,177 @@ public class OsmMapUtils {
return Math.abs(area) / 2;
}
/**
* Calculate "visual" center point of polygons (based on Mapbox' polylabel algorithm)
* @param rings - list of lists of nodes
* @param precision - precision of calculation, should be small, like 1e-4 or less.
* @return coordinates of calculated center
*/
private static LatLon getPolylabelPoint(List<List<LatLon>> rings, double precision) {
// find the bounding box of the outer ring
double minX = Double.MAX_VALUE;
double minY = Double.MAX_VALUE;
double maxX = -Double.MAX_VALUE;
double maxY = -Double.MAX_VALUE;
List<LatLon> outerRingCoordinates = rings.get(0);
for (LatLon p: outerRingCoordinates) {
double lat = p.getLatitude();
double lon = p.getLongitude();
minX = StrictMath.min(minX, lon);
minY = StrictMath.min(minY, lat);
maxX = StrictMath.max(maxX, lon);
maxY = StrictMath.max(maxY, lat);
}
double width = maxX - minX;
double height = maxY - minY;
double cellSize = Math.min(width, height);
double h = cellSize / 2;
if (cellSize == 0) return new LatLon(minX, minY);
// a priority queue of cells in order of their "potential" (max distance to polygon)
PriorityQueue<Cell> cellQueue = new PriorityQueue<>(new CellComparator());
// cover polygon with initial cells
for (double x = minX; x < maxX; x += cellSize) {
for (double y = minY; y < maxY; y += cellSize) {
cellQueue.add(new Cell(x + h, y + h, h, rings));
}
}
// take centroid as the first best guess
Cell bestCell = getCentroidCell(rings);
// special case for rectangular polygons
Cell bboxCell = new Cell(minX + width / 2, minY + height / 2, 0, rings);
if (bboxCell.d > bestCell.d) bestCell = bboxCell;
while (!cellQueue.isEmpty()) {
// pick the most promising cell from the queue
Cell cell = cellQueue.poll();
// update the best cell if we found a better one
if (cell.d > bestCell.d) {
bestCell = cell;
}
// do not drill down further if there's no chance of a better solution
// System.out.println(String.format("check for precision: cell.max - bestCell.d = %f Precision: %f", cell.max, precision));
if (cell.max - bestCell.d <= precision) continue;
// split the cell into four cells
h = cell.h / 2;
cellQueue.add(new Cell(cell.x - h, cell.y - h, h, rings));
cellQueue.add(new Cell(cell.x + h, cell.y - h, h, rings));
cellQueue.add(new Cell(cell.x - h, cell.y + h, h, rings));
cellQueue.add(new Cell(cell.x + h, cell.y + h, h, rings));
}
// System.out.println(String.format("Best lat/lon: %f, %f", bestCell.y, bestCell.x));
return new LatLon(bestCell.y, bestCell.x);
}
// get polygon centroid
private static Cell getCentroidCell(List<List<LatLon>> rings) {
double area = 0;
double x = 0;
double y = 0;
List<LatLon> points = rings.get(0);
for (int i = 0, len = points.size(), j = len - 1; i < len; j = i++) {
LatLon a = points.get(i);
LatLon b = points.get(j);
double aLon = a.getLongitude();
double aLat = a.getLatitude();
double bLon = b.getLongitude();
double bLat = b.getLatitude();
double f = aLon * bLat - bLon * aLat;
x += (aLon + bLon) * f;
y += (aLat + bLat) * f;
area += f * 3;
}
if (area == 0) {
LatLon p = points.get(0);
return new Cell(p.getLatitude(), p.getLongitude(), 0, rings);
}
return new Cell(x / area, y / area, 0, rings);
}
private static class CellComparator implements Comparator<Cell> {
@Override
public int compare(Cell o1, Cell o2) {
return Double.compare(o2.max, o1.max);
}
}
private static class Cell {
private final double x; // cell center x (lon)
private final double y; // cell center y (lat)
private final double h; // half the cell size
private final double d; // distance from cell center to polygon
private final double max; // max distance to polygon within a cell
private Cell(double x, double y, double h, List<List<LatLon>> rings) {
this.x = x;
this.y = y;
this.h = h;
this.d = pointToPolygonDist(x, y, rings);
this.max = this.d + this.h * Math.sqrt(2);
}
// signed distance from point to polygon outline (negative if point is outside)
private double pointToPolygonDist(double x, double y, List<List<LatLon>> rings) {
boolean inside = false;
double minDistSq = Double.MAX_VALUE;
for (List<LatLon> ring: rings) {
for (int i = 0, len = ring.size(), j = len - 1; i < len; j = i++) {
LatLon a = ring.get(i);
LatLon b = ring.get(j);
double aLon = a.getLongitude();
double aLat = a.getLatitude();
double bLon = b.getLongitude();
double bLat = b.getLatitude();
if ((aLat > y != bLat > y) && (x < (bLon - aLon) * (y - aLat) / (bLat - aLat) + aLon)) {
inside = !inside;
}
minDistSq = Math.min(minDistSq, getSegmentDistanceSqared(x, y, a, b));
}
}
return (inside ? 1 : -1) * Math.sqrt(minDistSq);
}
// get squared distance from a point to a segment of polygon
private double getSegmentDistanceSqared(double px, double py, LatLon a, LatLon b) {
double x = a.getLongitude();
double y = a.getLatitude();
double dx = b.getLongitude() - x;
double dy = b.getLatitude() - y;
if (dx != 0 || dy != 0) {
double t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy);
if (t > 1) {
x = b.getLongitude();
y = b.getLatitude();
} else if (t > 0) {
x += dx * t;
y += dy * t;
}
}
dx = px - x;
dy = py - y;
return dx * dx + dy * dy;
}
}
}

View file

@ -15,7 +15,7 @@
android:name="net.osmand.telegram.TelegramApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:label="@string/app_name_short"
android:launchMode="singleTask"
android:screenOrientation="unspecified"
android:supportsRtl="true"

View file

@ -262,4 +262,9 @@
<string name="shared_string_suggested">Cunsigiadu</string>
<string name="status_widget_title">Istadu de s\'arrastadore de OsmAnd</string>
<string name="back_to_osmand">Torra a OsmAnd</string>
<string name="last_update_from_telegram_date">Ùrtimu agiornamentu dae Telegram: %1$s</string>
<string name="last_response_date">Ùrtima risposta: %1$s</string>
<string name="last_update_from_telegram_duration">Ùrtimu agiornamentu dae Telegram: %1$s a como</string>
<string name="last_response_duration">Ùrtima risposta: %1$s a como</string>
<string name="duration_ago">%1$s a como</string>
</resources>

View file

@ -7,6 +7,11 @@ import android.content.Intent
class InitAppBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// do nothing, TelegramApplication already initialized
// check if aidl connection was lost
val app = context.applicationContext as TelegramApplication
val aidlHelper = app.osmandAidlHelper
if (aidlHelper.isOsmandBound() && !aidlHelper.isOsmandConnected()) {
aidlHelper.connectOsmand()
}
}
}
}

View file

@ -42,7 +42,7 @@ class TelegramApplication : Application() {
telegramHelper.messageActiveTimeSec = settings.locHistoryTime
uiUtils = UiUtils(this)
osmandAidlHelper = OsmandAidlHelper(this)
osmandAidlHelper.listener = object : OsmandHelperListener {
osmandAidlHelper.addConnectionListener(object : OsmandHelperListener {
override fun onOsmandConnectionStateChanged(connected: Boolean) {
if (connected) {
osmandAidlHelper.clearNavDrawerItems("net.osmand.telegram")
@ -60,7 +60,7 @@ class TelegramApplication : Application() {
showLocationHelper.addOrUpdateStatusWidget(-1, false)
}
}
}
})
osmandAidlHelper.setUpdatesListener(object : UpdatesListener {
override fun update() {
if (settings.hasAnyChatToShowOnMap()) {

View file

@ -109,10 +109,11 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
sendLocationInterval = intent.getLongExtra(SEND_LOCATION_INTERVAL, 0)
setupServiceErrorInterval()
app.telegramService = this
app.telegramHelper.addIncomingMessagesListener(this)
app.telegramHelper.addOutgoingMessagesListener(this)
app.telegramService = this
if (isUsedByMyLocation(usedBy)) {
initLocationUpdates()
startShareInfoUpdates()
@ -122,6 +123,7 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
app.telegramHelper.startLiveMessagesUpdates(app.settings.sendMyLocInterval)
startTracksUpdates()
}
app.shareLocationHelper.checkAndSendBufferMessages()
val locationNotification = app.notificationHelper.locationNotification
val notification = app.notificationHelper.buildNotification(locationNotification)

View file

@ -58,6 +58,8 @@ class OsmandAidlHelper(private val app: TelegramApplication) {
const val OSMAND_NIGHTLY_PACKAGE_NAME = "net.osmand.dev"
const val UPDATE_TIME_MS = 5000L
private const val CALLBACK_INVALID_ID = -1L
}
private var mIOsmAndAidlInterface: IOsmAndAidlInterface? = null
@ -68,7 +70,7 @@ class OsmandAidlHelper(private val app: TelegramApplication) {
private var osmandUpdatesCallbackId: Long = -1
private var osmandContextMenuCallbackId: Long = -1
var listener: OsmandHelperListener? = null
private val connectionListeners = HashSet<OsmandHelperListener>()
interface OsmandHelperListener {
fun onOsmandConnectionStateChanged(connected: Boolean)
@ -133,6 +135,14 @@ class OsmandAidlHelper(private val app: TelegramApplication) {
}
}
fun addConnectionListener(listener: OsmandHelperListener) {
connectionListeners.add(listener)
}
fun removeConnectionListener(listener: OsmandHelperListener) {
connectionListeners.remove(listener)
}
fun setSearchCompleteListener(mSearchCompleteListener: SearchCompleteListener) {
this.mSearchCompleteListener = mSearchCompleteListener
}
@ -155,7 +165,7 @@ class OsmandAidlHelper(private val app: TelegramApplication) {
this.mUpdatesListener = mUpdatesListener
}
fun updatesCallbackRegistered() = osmandUpdatesCallbackId > 0
fun updatesCallbackRegistered() = osmandUpdatesCallbackId > CALLBACK_INVALID_ID
/**
* Class for interacting with the main interface of the service.
*/
@ -169,16 +179,18 @@ class OsmandAidlHelper(private val app: TelegramApplication) {
// representation of that from the raw service object.
mIOsmAndAidlInterface = IOsmAndAidlInterface.Stub.asInterface(service)
initialized = true
//Toast.makeText(app, "OsmAnd connected", Toast.LENGTH_SHORT).show()
listener?.onOsmandConnectionStateChanged(true)
connectionListeners.forEach {
it.onOsmandConnectionStateChanged(true)
}
}
override fun onServiceDisconnected(className: ComponentName) {
// This is called when the connection with the service has been
// unexpectedly disconnected -- that is, its process crashed.
mIOsmAndAidlInterface = null
//Toast.makeText(app, "OsmAnd disconnected", Toast.LENGTH_SHORT).show()
listener?.onOsmandConnectionStateChanged(false)
connectionListeners.forEach {
it.onOsmandConnectionStateChanged(false)
}
}
}
@ -193,7 +205,7 @@ class OsmandAidlHelper(private val app: TelegramApplication) {
fun isOsmandConnected(): Boolean {
return mIOsmAndAidlInterface != null
}
/**
* Get list of active GPX files.
*
@ -1162,20 +1174,20 @@ class OsmandAidlHelper(private val app: TelegramApplication) {
if (mIOsmAndAidlInterface != null) {
try {
osmandUpdatesCallbackId = mIOsmAndAidlInterface!!.registerForUpdates(UPDATE_TIME_MS, mIOsmAndAidlCallback)
return osmandUpdatesCallbackId > 0
return osmandUpdatesCallbackId > CALLBACK_INVALID_ID
} catch (e: RemoteException) {
e.printStackTrace()
}
}
return false
}
fun unregisterFromUpdates(): Boolean {
if (mIOsmAndAidlInterface != null) {
try {
val unregistered = mIOsmAndAidlInterface!!.unregisterFromUpdates(osmandUpdatesCallbackId)
if (unregistered) {
osmandUpdatesCallbackId = 0
osmandUpdatesCallbackId = CALLBACK_INVALID_ID
}
return unregistered
} catch (e: RemoteException) {
@ -1222,7 +1234,7 @@ class OsmandAidlHelper(private val app: TelegramApplication) {
val params = RemoveContextMenuButtonsParams(paramsId, osmandContextMenuCallbackId)
val removed = mIOsmAndAidlInterface!!.removeContextMenuButtons(params)
if (removed) {
osmandContextMenuCallbackId = -1
osmandContextMenuCallbackId = CALLBACK_INVALID_ID
}
return removed
} catch (e: RemoteException) {

View file

@ -1,5 +1,7 @@
package net.osmand.telegram.helpers
import android.os.Handler
import android.os.Message
import net.osmand.Location
import net.osmand.PlatformUtil
import net.osmand.telegram.*
@ -16,7 +18,9 @@ import org.json.JSONObject
private const val USER_SET_LIVE_PERIOD_DELAY_MS = 5000 // 5 sec
private const val MIN_MESSAGE_SENDING_INTERVAL_MS = 1000 // 1 sec
private const val MIN_MESSAGES_BUFFER_CHECK_INTERVAL_MS = 800 // 0.8 sec
private const val MIN_MESSAGES_BUFFER_CHECK_INTERVAL_MS = 300 // 0.3 sec
private const val SEND_MESSAGES_BUFFER_MS_MSG_ID = 5000
class ShareLocationHelper(private val app: TelegramApplication) {
@ -52,6 +56,9 @@ class ShareLocationHelper(private val app: TelegramApplication) {
private var lastTimeInMillis: Long = 0L
private var sendBufferMessagesHandler = Handler()
private var sendBufferMessagesRunnable = Runnable { app.shareLocationHelper.checkAndSendBufferMessages(false) }
fun updateLocation(location: Location?) {
val lastPoint = lastLocation
var record = true
@ -120,7 +127,7 @@ class ShareLocationHelper(private val app: TelegramApplication) {
}
}
fun checkAndSendBufferMessages() {
fun checkAndSendBufferMessages(checkNetworkTypeAllowed: Boolean = true) {
log.debug("checkAndSendBufferMessages")
var pendingMessagesLimitReached = false
app.settings.getChatsShareInfo().forEach { (chatId, shareInfo) ->
@ -129,18 +136,30 @@ class ShareLocationHelper(private val app: TelegramApplication) {
pendingMessagesLimitReached = true
}
}
if (pendingMessagesLimitReached) {
if (pendingMessagesLimitReached && checkNetworkTypeAllowed) {
checkNetworkType()
}
}
fun checkAndSendBufferMessagesDelayed() {
if (!sendBufferMessagesHandler.hasMessages(SEND_MESSAGES_BUFFER_MS_MSG_ID)) {
val msg = Message.obtain(sendBufferMessagesHandler, sendBufferMessagesRunnable)
msg.what = SEND_MESSAGES_BUFFER_MS_MSG_ID
sendBufferMessagesHandler.sendMessageDelayed(msg, MIN_MESSAGES_BUFFER_CHECK_INTERVAL_MS.toLong() + 1L)
}
}
fun checkAndSendBufferMessagesToChat(chatId: Long, forced: Boolean = false): Int {
val shareChatsInfo = app.settings.getChatsShareInfo()
val shareInfo = shareChatsInfo[chatId]
if (shareInfo != null) {
val bufferedMessagesCount = app.locationMessages.getBufferedMessagesCountForChat(chatId)
if (bufferedMessagesCount > 0) {
checkAndSendBufferMessagesDelayed()
}
val currentTime = System.currentTimeMillis()
if (currentTime - shareInfo.lastBufferCheckTime < MIN_MESSAGES_BUFFER_CHECK_INTERVAL_MS && !forced) {
return app.locationMessages.getBufferedMessagesCountForChat(chatId)
return bufferedMessagesCount
}
shareInfo.lastBufferCheckTime = currentTime
@ -182,7 +201,9 @@ class ShareLocationHelper(private val app: TelegramApplication) {
refreshNotification()
checkAndSendBufferMessages()
if (app.telegramService != null) {
checkAndSendBufferMessages()
}
} else {
app.forceUpdateMyLocation()
}

View file

@ -77,6 +77,15 @@ class ShowLocationHelper(private val app: TelegramApplication) {
private var forcedStop: Boolean = false
init {
app.osmandAidlHelper.addConnectionListener(object : OsmandAidlHelper.OsmandHelperListener {
override fun onOsmandConnectionStateChanged(connected: Boolean) {
if (!connected && showingLocation && !app.settings.monitoringEnabled) {
if (isUseOsmandCallback() && app.osmandAidlHelper.updatesCallbackRegistered()) {
showingLocation = false
}
}
}
})
app.osmandAidlHelper.setContextMenuButtonsListener(object : ContextMenuButtonsListener {
override fun onContextMenuButtonClicked(buttonId: Int, pointId: String, layerId: String) {
@ -137,7 +146,7 @@ class ShowLocationHelper(private val app: TelegramApplication) {
osmandAidlHelper.showMapPoint(MAP_LAYER_ID, pointId, name, name, item.chatTitle, Color.WHITE, aLatLon, details, params)
}
}
fun updateLocationsOnMap() {
osmandAidlHelper.execOsmandApi {
val messages = telegramHelper.getMessages()
@ -427,7 +436,7 @@ class ShowLocationHelper(private val app: TelegramApplication) {
forcedStop = force
if (showingLocation) {
showingLocation = false
if (isUseOsmandCallback() && app.osmandAidlHelper.updatesCallbackRegistered()) {
if (isUseOsmandCallback() && osmandAidlHelper.updatesCallbackRegistered()) {
osmandAidlHelper.unregisterFromUpdates()
} else if (!app.settings.monitoringEnabled) {
app.stopUserLocationService()

View file

@ -30,22 +30,27 @@
android:orientation="horizontal"
android:paddingLeft="@dimen/list_content_padding">
<CheckBox
android:id="@+id/toggle_item"
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginRight="@dimen/list_content_padding"
android:focusable="false"
android:visibility="gone"
tools:visibility="visible"/>
android:layout_height="match_parent">
<ImageView
android:id="@+id/favourite_icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
android:layout_gravity="center_vertical"
android:layout_marginRight="@dimen/list_content_padding"/>
<CheckBox
android:id="@+id/toggle_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginRight="@dimen/list_content_padding"
android:focusable="false"
android:visibility="gone"
tools:visibility="visible" />
<ImageView
android:id="@+id/favourite_icon"
android:layout_width="34dp"
android:layout_height="34dp"
android:layout_gravity="center_vertical"
android:layout_marginRight="@dimen/guide_line_vertical_offset" />
</FrameLayout>
<LinearLayout
android:layout_width="0dp"

View file

@ -51,8 +51,8 @@
<ImageView
android:id="@+id/context_menu_icon_view"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
android:layout_width="@dimen/dialog_button_height"
android:layout_height="@dimen/dialog_button_height"
android:src="@drawable/ic_action_building_number"/>
</LinearLayout>

View file

@ -3308,7 +3308,7 @@
<string name="routing_attr_width_description">حدد الحد المسموح به لعرض السيارة على الطرق.</string>
<string name="simulate_your_location_gpx_descr">محاكاة موقعك باستخدام مسار GPX مسجل.</string>
<string name="quick_action_directions_from_desc">زر لجعل الشاشة مركز نقطة الانطلاق وحساب الطريق إلى الوجهة أو فتح مربع حوار لتحديد الوجهة إذا لم تكن علامة الوجهة علي الخريطة.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">شخصي</string>
<string name="shared_string_downloading_formatted">تنزيل %s</string>

View file

@ -3360,7 +3360,7 @@
<string name="add_new_profile_q">Дадаць новы профіль \"%1$s\"\?</string>
<string name="save_heading">Захоўваць кірунак</string>
<string name="save_heading_descr">Падчас запісу захоўваць кірунак для кожнага пункта маршруту.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Асабісты</string>
<string name="shared_string_downloading_formatted">Спампоўванне %s</string>

View file

@ -3394,7 +3394,7 @@ Abasta l\'àrea: %1$s x %2$s</string>
<string name="dialogs_and_notifications_descr">Emergents de control, diàlegs i notificacions que surten a OsmAnd mentre s\'utilitza.</string>
<string name="join_segments">Uneix segments</string>
<string name="add_new_profile_q">Voleu afegir el perfil nou \'%1$s\'\?</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Personal</string>
<string name="shared_string_downloading_formatted">S\'està baixant %s</string>

View file

@ -3785,7 +3785,7 @@
<string name="poi_volcano_type_maar">Maar</string>
<string name="poi_volcano_type_caldera">Caldera</string>
<string name="poi_volcano_type_lava_dome">Lavadome</string>
<string name="poi_volcano_type_dirt">J́ord</string>
<string name="poi_volcano_type_mud">J́ord</string>
<string name="poi_volcano_last_eruption">Sidste udbrud</string>
<string name="poi_volcano_status_extinct">Uddød</string>
<string name="poi_volcano_status_dormant">Sovende</string>

View file

@ -3406,7 +3406,7 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="add_new_profile_q">Tilføj ny profil \'%1$s\'\?</string>
<string name="save_heading">Medtag overskrift</string>
<string name="save_heading_descr">Gem overskrift til hvert TrackPoint under optagelsen.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Personlig</string>
<string name="shared_string_downloading_formatted">Henter %s</string>

View file

@ -3780,7 +3780,7 @@
<string name="poi_volcano_type_maar">Maar</string>
<string name="poi_volcano_type_caldera">Caldera</string>
<string name="poi_volcano_type_lava_dome">Lavadom</string>
<string name="poi_volcano_type_dirt">Erde</string>
<string name="poi_volcano_type_mud">Erde</string>
<string name="poi_volcano_last_eruption">Letzter Ausbruch</string>
<string name="poi_volcano_status_extinct">Erloschen</string>
<string name="poi_volcano_status_dormant">Ruhend</string>

View file

@ -3403,7 +3403,7 @@ Lon %2$s</string>
<string name="add_new_profile_q">Neues Profil \'%1$s\' hinzufügen\?</string>
<string name="save_heading">Richtung einbeziehen</string>
<string name="save_heading_descr">Richtung zu jedem Trackpunkt während der Aufnahme speichern.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Persönlich</string>
<string name="shared_string_downloading_formatted">%s herunterladen</string>

View file

@ -3399,7 +3399,7 @@
<string name="add_new_profile_q">Προσθήκη νέας κατατομής (προφίλ) \'%1$s\';</string>
<string name="save_heading">Συμπερίληψη κατεύθυνσης</string>
<string name="save_heading_descr">Αποθήκευση κατεύθυνσης για κάθε σημείο ίχνους κατά την εγγραφή.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Προσωπικό</string>
<string name="shared_string_downloading_formatted">Λήψη %s</string>

View file

@ -3770,7 +3770,7 @@
<string name="poi_volcano_type_maar">malprofundkratera (maaro)</string>
<string name="poi_volcano_type_caldera">kaldero</string>
<string name="poi_volcano_type_lava_dome">lafkupolo</string>
<string name="poi_volcano_type_dirt">ŝlimvulkano</string>
<string name="poi_volcano_type_mud">ŝlimvulkano</string>
<string name="poi_volcano_last_eruption">Antaŭa erupcio</string>
<string name="poi_volcano_status_extinct">neaktiva</string>
<string name="poi_volcano_status_dormant">dormanta</string>

View file

@ -3378,7 +3378,7 @@ Indikas lokon: %1$s x %2$s"</string>
<string name="add_new_profile_q">Ĉu aldoni novan profilon “%1$s”\?</string>
<string name="save_heading">Inkluzivi direkton</string>
<string name="save_heading_descr">Konservi direkton al ĉiu punkto de kurso dum registri.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Personaj</string>
<string name="shared_string_downloading_formatted">Elŝutado de %s</string>
@ -3401,8 +3401,8 @@ Indikas lokon: %1$s x %2$s"</string>
<string name="reset_all_profile_settings">Ĉu rekomencigi ĉiujn agordojn pri profiloj\?</string>
<string name="ltr_or_rtl_combine_via_colon">%1$s: %2$s</string>
<string name="ltr_or_rtl_combine_via_space">%1$s %2$s</string>
<string name="file_does_not_contain_routing_rules">La dosiero “%1$s” ne enhavas regulojn pri kursdifinado, bonvolu elekti alian dosieron.</string>
<string name="not_support_file_type_with_ext">Nesubtenata tipo de dosiero. Elektu dosieron kun la finaĵo %1$s.</string>
<string name="file_does_not_contain_routing_rules">Neniuj reguloj pri kursdifinado en “%1$s”. Bonvolu elekti alian dosieron.</string>
<string name="not_support_file_type_with_ext">Bonvolu elekti dosieron kun la subtenata finaĵo %1$s.</string>
<string name="import_from_file">Enporti el dosiero</string>
<string name="import_routing_file">Enporti dosieron de kursdifinado</string>
<string name="import_profile">Enporti profilon</string>
@ -3427,5 +3427,7 @@ Indikas lokon: %1$s x %2$s"</string>
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">La emblemo montriĝos nur dum navigi aŭ dum moviĝi.</string>
<string name="select_map_icon_descr">Mapemblemo montriĝas nur dum foliumi mapon kaj ŝanĝiĝas dum navigi al la emblemo de navigo.</string>
<string name="logcat_buffer_descr">Tie ĉi vi povas legi kaj kunhavigi protokolojn de la aplikaĵo</string>
<string name="logcat_buffer_descr">Legi kaj kunhavigi detalajn protokolojn de la aplikaĵo</string>
<string name="permission_is_required">Permeso estas necesa por uzi tiun ĉi eblaĵon.</string>
<string name="monitoring_min_speed_descr">Tiu ĉi filtrilo preventas registri punktojn sub difinita rapidlimo. Tiel registritaj spuroj aspektos pli glate dum vidiĝi sur la mapo.</string>
</resources>

View file

@ -3784,11 +3784,12 @@
<string name="poi_volcano_type_maar">Maar</string>
<string name="poi_volcano_type_caldera">Caldera</string>
<string name="poi_volcano_type_lava_dome">Cúpula de lava</string>
<string name="poi_volcano_type_dirt">Tierra (lodosa)</string>
<string name="poi_volcano_type_mud">Tierra (lodosa)</string>
<string name="poi_volcano_last_eruption">Última erupción</string>
<string name="poi_volcano_status_extinct">Extinto</string>
<string name="poi_volcano_status_dormant">Latente o dormido</string>
<string name="poi_volcano_status_active">Activo</string>
<string name="poi_volcano_status_inactive">Inactivo</string>
<string name="poi_volcano_number_of_eruptions">Número de erupciones</string>
<string name="poi_memorial_ghost_bike">Bicicleta fantasma</string>
</resources>

View file

@ -2299,23 +2299,11 @@ Lon %2$s</string>
\n ¡Más países alrededor del globo están disponibles para descargar!
\n Obtén un navegador confiable en tu país - ya sea Francia, Alemania, México, Reino Unido, España, Países bajos, Estados Unidos, Rusia, Brasil o cualquier otro.</string>
<string name="osmand_plus_extended_description_part2">"Navegación GPS
\n
\n
\n • Funciona en línea (rápido) o sin conexión (sin cargos de roaming al viajar al extranjero)
\n
\n
\n • Guía por voz giro-a-giro (voces grabadas y sintetizadas)
\n
\n
\n • (Opcional) Guía de carriles, nombres de calles y tiempo estimado al destino
\n
\n
\n • Admite puntos intermedios en el itinerario
\n
\n
\n • La ruta se recalcula al salirse de la misma
\n
\n
\n • Busca destinos por dirección, por tipo (por ejemplo: Restaurantes, hoteles, estaciones de servicio, museos), o por coordenada geográfica "</string>
<string name="osmand_plus_extended_description_part3">Vista del mapa
\n • Muestra tu ubicación y orientación
@ -3347,8 +3335,8 @@ Lon %2$s</string>
<string name="shared_string_memory_used_mb_desc">Usado %1$s MB</string>
<string name="shared_string_memory_used_kb_desc">Usado %1$s kB</string>
<string name="contour_lines_and_hillshade">Curvas de nivel y sombreado</string>
<string name="routing_attr_prefer_unpaved_name">Preferir ruta sin pavimentar</string>
<string name="routing_attr_prefer_unpaved_description">Prefiere rutas sin pavimentar.</string>
<string name="routing_attr_prefer_unpaved_name">Preferir caminos sin pavimentar</string>
<string name="routing_attr_prefer_unpaved_description">Prefiere caminos sin pavimentar.</string>
<string name="update_all_maps">Actualizar todos los mapas</string>
<string name="update_all_maps_q">¿Actualizar todos los mapas (%1$d)\?</string>
<string name="release_3_5">• Ajustes de la aplicación y del perfil actualizados. Cómoda distribución de los ajustes por tipo y posibilidad de personalizar cada perfil
@ -3370,8 +3358,8 @@ Lon %2$s</string>
\n</string>
<string name="apply_preference_to_all_profiles">Puedes aplicar este cambio a todos los perfiles o sólo al marcado.</string>
<string name="shared_preference">Compartido</string>
<string name="routing_attr_driving_style_prefer_unpaved_name">Preferir rutas sin pavimentar</string>
<string name="routing_attr_driving_style_prefer_unpaved_description">Ruta por terreno sin pavimento.</string>
<string name="routing_attr_driving_style_prefer_unpaved_name">Preferir caminos sin pavimentar</string>
<string name="routing_attr_driving_style_prefer_unpaved_description">Prefiere los caminos sin pavimentar a los pavimentados para el trazado de rutas.</string>
<string name="layer_osm_edits">Ediciones de OSM</string>
<string name="quick_action_contour_lines_descr">Un botón que muestra u oculta las curvas de nivel en el mapa.</string>
<string name="quick_action_contour_lines_show">Mostrar curvas de nivel</string>
@ -3388,13 +3376,13 @@ Lon %2$s</string>
<string name="overwrite_profile_q">El perfil «%1$s» ya existe. ¿Sobrescribir\?</string>
<string name="export_profile_failed">No se pudo exportar el perfil.</string>
<string name="profile_import">Importar perfil</string>
<string name="profile_import_descr">Añade un perfil abriendo el archivo en OsmAnd.</string>
<string name="profile_import_descr">Añade un perfil abriendo este archivo con OsmAnd.</string>
<string name="file_import_error">Error de importación de %1$s: %2$s</string>
<string name="file_imported_successfully">%1$s importado.</string>
<string name="rendering_value_white_name">Blanco</string>
<string name="swap_two_places">Alternar %1$s y %2$s</string>
<string name="route_start_point">Punto de partida</string>
<string name="default_speed_dialog_msg">Estima el tiempo de llegada para los tipos de caminos desconocidos, y limita la velocidad para todos los caminos (puede desviarse)</string>
<string name="default_speed_dialog_msg">Estima el tiempo de llegada para los tipos de caminos desconocidos, y limita la velocidad para todos los caminos (puede afectar a la ruta)</string>
<string name="track_saved">Traza guardada</string>
<string name="empty_filename">Nombre del archivo vacío</string>
<string name="shared_string_revert">Revertir</string>
@ -3414,27 +3402,27 @@ Lon %2$s</string>
<string name="join_segments">Unir segmentos</string>
<string name="add_new_profile_q">¿Añadir el nuevo perfil «%1$s»\?</string>
<string name="save_heading">Incluir rumbo</string>
<string name="save_heading_descr">Guarda el rumbo para cada punto de la traza durante el seguimiento.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="save_heading_descr">Guarda el rumbo para cada punto de la traza durante la grabación.</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Personal</string>
<string name="shared_string_downloading_formatted">Descargando %s</string>
<string name="rendering_value_thick_name">Espesor</string>
<string name="desert_render_descr">Para desiertos y otras zonas escasamente pobladas. Más detallado.</string>
<string name="select_navigation_icon">Icono de navegación</string>
<string name="select_map_icon">Icono del mapa</string>
<string name="delete_profiles_descr">Al pulsar en «Aplicar», todos los perfiles serán borrados completamente.</string>
<string name="select_navigation_icon">Icono de la ubicación mientras se mueve</string>
<string name="select_map_icon">Icono de la ubicación en reposo</string>
<string name="delete_profiles_descr">Al pulsar en «Aplicar», los perfiles borrados se perderán completamente.</string>
<string name="master_profile">Perfil principal</string>
<string name="select_color">Elegir el color</string>
<string name="edit_profiles_descr">Los perfiles de OsmAnd se pueden mover a la parte inferior, pero no se pueden borrar. Vuelve para quitarlos.</string>
<string name="edit_profiles_descr">Los perfiles predefinidos de OsmAnd no se pueden borrar, sino desactivar (en la pantalla anterior) u ordenarse en la parte inferior.</string>
<string name="edit_profiles">Editar perfiles</string>
<string name="select_nav_profile_dialog_message">El «Tipo de navegación» afecta a las reglas para los cálculos de la ruta.</string>
<string name="select_nav_profile_dialog_message">El «Tipo de navegación» rige la forma en que se calculan las rutas.</string>
<string name="profile_appearance">Aspecto del perfil</string>
<string name="choose_icon_color_name">Icono, color y nombre</string>
<string name="reorder_profiles">Editar la lista de perfiles</string>
<string name="selected_profile">Perfil marcado</string>
<string name="reset_confirmation_descr">Al pulsar en «%1$s», se perderán todos los cambios.</string>
<string name="reset_all_profile_settings_descr">Todos los ajustes del perfil volverán a los valores predefinidos de la instalación.</string>
<string name="reset_confirmation_descr">Al pulsar en «%1$s», serán descartados todos los cambios.</string>
<string name="reset_all_profile_settings_descr">Restablecer todos los ajustes del perfil a los valores predefinidos de la instalación.</string>
<string name="reset_all_profile_settings">¿Restablecer todos los ajustes del perfil\?</string>
<string name="ltr_or_rtl_combine_via_space">%1$s %2$s</string>
<string name="ltr_or_rtl_combine_via_colon">%1$s: %2$s</string>
@ -3452,7 +3440,7 @@ Lon %2$s</string>
<string name="live_monitoring">Seguimiento en línea</string>
<string name="save_track_logging_accuracy">Precisión de registro</string>
<string name="tracks_view_descr">Puedes encontrar todas tus trazas grabadas en «%1$s» o en la carpeta OsmAnd usando el administrador de archivos.</string>
<string name="multimedia_notes_view_descr">Puedes encontrar todas tus notas en «%1$s»</string>
<string name="multimedia_notes_view_descr">Puedes encontrar todas tus notas en «%1$s».</string>
<string name="video_notes">Notas de video</string>
<string name="photo_notes">Notas fotográficas</string>
<string name="route_recalculation">Recálculo de la ruta</string>
@ -3462,8 +3450,36 @@ Lon %2$s</string>
<string name="osm_editing">Edición de OSM</string>
<string name="osm_edits_view_descr">Puedes ver todas tus ediciones no subidas o errores de OSM en «%1$s». Los puntos subidos no se muestran en OsmAnd.</string>
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">El icono sólo se muestra mientras se navega o se mueve.</string>
<string name="select_map_icon_descr">El icono del mapa sólo se muestra en el mapa.</string>
<string name="select_nav_icon_descr">El icono se muestra mientras se navega o se mueve.</string>
<string name="select_map_icon_descr">El icono se muestra en reposo.</string>
<string name="logcat_buffer_descr">Comprueba y comparte los registros detallados de la aplicación</string>
<string name="search_offline_geo_error">No se puede analizar la geointención «%s».</string>
<string name="permission_is_required">Se necesita permiso para usar esta opción.</string>
<string name="monitoring_min_speed_descr">Se trata de un filtro de corte de baja velocidad para no grabar puntos por debajo de una cierta velocidad. Esto puede hacer que las trazas grabadas se vean más suaves cuando se muestran en el mapa.</string>
<string name="monitoring_min_speed_descr_side_effect">Efecto secundario: En la traza faltarán todos los tramos en los que no se haya cumplido el criterio de velocidad mínima (por ejemplo, cuando se empuja la bicicleta por una colina empinada). Además, no habrá información sobre los períodos de descanso, como las pausas. Esto tiene efectos en cualquier análisis o post-proceso, como cuando se trata de determinar la duración total del viaje, el tiempo en movimiento, o la velocidad promedio.</string>
<string name="monitoring_min_speed_descr_recommendation">Recomendación: Prueba primero a utilizar la detección de movimiento mediante el filtro de desplazamiento mínimo de registro (B), puede producir mejores resultados y perderá menos datos. Si las trazas siguen siendo ruidosas a bajas velocidades, prueba aquí con valores distintos de cero. Tenga en cuenta que algunas mediciones pueden no informar ningún valor de velocidad (algunos métodos basados en la red), en cuyo caso no se registraría nada.</string>
<string name="monitoring_min_speed_descr_remark">Observación: comprobar velocidad &gt; 0: La mayoría de los chipsets de GPS informan un valor de velocidad sólo si el algoritmo determina que está en movimiento. Por lo tanto, el uso del ajuste &gt; 0 en este filtro, en cierto sentido utiliza la detección de movimiento del conjunto de chips del GPS. Pero incluso si no se filtra aquí en el momento de la grabación, seguimos utilizando esta función en nuestro análisis GPX para determinar la distancia corregida, es decir, el valor que se muestra en ese campo es la distancia grabada en movimiento.</string>
<string name="monitoring_min_accuracy_descr">Esto registrará solo los puntos medidos con una indicación de precisión mínima (en metros o pies, según lo informado por Android para su conjunto de chips). La precisión se refiere a la dispersión de mediciones repetidas, y no está directamente relacionada con la precisión, que define qué tan cerca están sus mediciones de su posición real.</string>
<string name="monitoring_min_accuracy_descr_side_effect">Efecto secundario: Como resultado del filtrado por precisión, pueden faltar puntos por ejemplo debajo de puentes, bajo árboles, entre edificios altos o con ciertas condiciones climáticas.</string>
<string name="monitoring_min_accuracy_descr_recommendation">Recomendación: Es difícil predecir lo que se grabará y lo que no, puede ser mejor apagar este filtro.</string>
<string name="monitoring_min_accuracy_descr_remark">Observación: Si el GPS se hubiera apagado inmediatamente antes de una grabación, el primer punto medido podría tener una precisión disminuida, por lo que en nuestro código puede que queramos esperar un segundo más o menos antes de grabar un punto (o grabar el mejor de 3 puntos consecutivos, etc.), pero esto todavía no se ha implementado.</string>
<string name="monitoring_min_distance_descr">Este filtro evita que se registren puntos duplicados en los que puede haber muy poco movimiento real, y da un aspecto espacial más agradable a las pistas que no se procesan posteriormente.</string>
<string name="monitoring_min_distance_descr_side_effect">Efectos secundarios: Los períodos de descanso no se registran en absoluto o sólo en un punto cada uno. Los pequeños movimientos (del mundo real) (por ejemplo, hacia los lados, para marcar un posible desvío en su viaje) pueden ser filtrados. Su archivo contiene menos información para el post-procesamiento, y tiene peores estadísticas al filtrar los puntos obviamente redundantes en el tiempo de grabación, mientras que potencialmente mantiene los artefactos causados por la mala recepción o los efectos del chipset del GPS.</string>
<string name="monitoring_min_distance_descr_recommendation">Recomendación: Un ajuste de 5 metros puede funcionar bien si no necesitas capturar detalles más finos que eso, y no deseas capturar explícitamente los datos mientras está en reposo.</string>
<string name="live_monitoring_time_buffer">Memoria intermedia</string>
<string name="live_monitoring_tracking_interval">Intervalo de seguimiento</string>
<string name="live_monitoring_adress">Dirección web</string>
<string name="live_monitoring_adress_descr">Indica la dirección web con sintaxis de parámetros : lat={0}, lon={1}, timestamp={2}, hdop={3}, altitude={4}, speed={5}, bearing={6}.</string>
<string name="monitoring_notification">Notificación</string>
<string name="monitoring_min_speed">Velocidad mínima</string>
<string name="monitoring_min_accuracy">Precisión mínima</string>
<string name="monitoring_min_distance">Desplazamiento mínimo</string>
<string name="tracks_view_path">Menú — Mis sitios — Trazas</string>
<string name="multimedia_notes_view_path">Menú — Mis sitios — Notas</string>
<string name="osm_edits_view_path">Menú — Mis sitios — Ediciones de OSM</string>
<string name="reset_plugin_to_default">Restablecer ajustes del complemento a valores predefinidos</string>
<string name="multimedia_rec_split_title">División de grabación</string>
<string name="multimedia_use_system_camera">Usar la aplicación del sistema</string>
<string name="multimedia_photo_play_sound">Reproducir sonido al fotografiar</string>
<string name="osm_authorization_success">Autorización exitosa</string>
</resources>

View file

@ -3784,7 +3784,7 @@
<string name="poi_volcano_type_maar">Maar</string>
<string name="poi_volcano_type_caldera">Caldera</string>
<string name="poi_volcano_type_lava_dome">Cúpula de lava</string>
<string name="poi_volcano_type_dirt">Tierra (lodosa)</string>
<string name="poi_volcano_type_mud">Tierra (lodosa)</string>
<string name="poi_volcano_last_eruption">Última erupción</string>
<string name="poi_volcano_status_extinct">Extinto</string>
<string name="poi_volcano_status_dormant">Latente o dormido</string>

View file

@ -3403,7 +3403,7 @@ Lon %2$s</string>
<string name="add_new_profile_q">¿Añadir el nuevo perfil «%1$s»\?</string>
<string name="save_heading">Incluir rumbo</string>
<string name="save_heading_descr">Guarda el rumbo para cada punto de la traza durante la grabación.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Personal</string>
<string name="shared_string_downloading_formatted">Descargando %s</string>

View file

@ -3778,7 +3778,7 @@
<string name="poi_volcano_type_maar">Maar</string>
<string name="poi_volcano_type_caldera">Caldera</string>
<string name="poi_volcano_type_lava_dome">Cúpula de lava</string>
<string name="poi_volcano_type_dirt">Tierra</string>
<string name="poi_volcano_type_mud">Tierra</string>
<string name="poi_volcano_last_eruption">Última erupción</string>
<string name="poi_volcano_status_extinct">Extinto</string>
<string name="poi_volcano_status_dormant">Latente</string>

View file

@ -3394,7 +3394,7 @@
<string name="add_new_profile_q">¿Añadir el nuevo perfil «%1$s»\?</string>
<string name="save_heading">Incluir rumbo</string>
<string name="save_heading_descr">Guarda el rumbo para cada punto de la traza durante la grabación.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Personal</string>
<string name="shared_string_downloading_formatted">Descargando %s</string>

View file

@ -3759,7 +3759,7 @@
<string name="poi_volcano_type_maar">Maar</string>
<string name="poi_volcano_type_caldera">Kaldeera</string>
<string name="poi_volcano_type_lava_dome">Laava kuppel</string>
<string name="poi_volcano_type_dirt">Muld</string>
<string name="poi_volcano_type_mud">Muld</string>
<string name="poi_volcano_last_eruption">Viimane purse</string>
<string name="poi_volcano_status_extinct">Kustunud</string>
<string name="poi_volcano_status_dormant">Tegevusetu</string>

View file

@ -1032,7 +1032,7 @@
<string name="add_new_profile_q">Lisada uus profiil \'%1$s\'\?</string>
<string name="save_heading">Kaasa pealkiri</string>
<string name="save_heading_descr">Salvestamise ajal salvesta kurss igasse teekonnapunkti.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Isiklik</string>
<string name="shared_string_downloading_formatted">Allalaadimine %s</string>

View file

@ -3400,7 +3400,7 @@ Area honi dagokio: %1$s x %2$s</string>
<string name="add_new_profile_q">Gehitu \'%1$s\' profil berria\?</string>
<string name="save_heading">Sartu norabidea</string>
<string name="save_heading_descr">Gorde lorratzeko puntu bakoitzerako norabidea grabatzean.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Pertsonala</string>
<string name="shared_string_downloading_formatted">%s deskargatzen</string>

View file

@ -2,7 +2,7 @@
<resources>
<string name="local_osm_changes_backup_failed">پشتیبان‌گیری از تغییرات OSM ناموفق بود.</string>
<string name="plugin_distance_point_time">زمان</string>
<string name="plugin_distance_point_hdop">دقت</string>
<string name="plugin_distance_point_hdop">صحت</string>
<string name="plugin_distance_point_speed">سرعت</string>
<string name="plugin_distance_point_ele">ارتفاع</string>
<string name="plugin_distance_point">نقطه</string>
@ -162,7 +162,7 @@
<string name="map_online_plugin_is_not_installed">افزونهٔ «نقشه‌های آنلاین» را فعال کنید تا منابع مختلفی را برای نقشه انتخاب کنید</string>
<string name="local_osm_changes_backup">پشتیبان‌گیری در قالب تغییر OSM</string>
<string name="delete_point">حذف نقطه</string>
<string name="use_kalman_filter_compass">استفاده از فیلتر کالمن</string>
<string name="use_kalman_filter_compass">استفاده از پالایهٔ Kalman</string>
<string name="cancel_route">حذف مسیر</string>
<string name="max_speed_none">هیچ‌کدام</string>
<string name="dropbox_plugin_name">افزونهٔ دراپ‌باکس</string>
@ -192,12 +192,12 @@
<string name="destination_point">مقصد %1$s</string>
<string name="context_menu_item_destination_point">تنظیم به عنوان مقصد</string>
<string name="email">ایمیل</string>
<string name="edit_filter_save_as_menu_item">ذخیره‌کردن با نام</string>
<string name="edit_filter_delete_dialog_title">این فیلتر حذف شود؟</string>
<string name="edit_filter_delete_message">فیلتر «{0}» حذف شد</string>
<string name="edit_filter_create_message">فیلتر «{0}» ایجاد شد</string>
<string name="edit_filter_save_as_menu_item">ذخیره با نام</string>
<string name="edit_filter_delete_dialog_title">این پالایه حذف شود؟</string>
<string name="edit_filter_delete_message">پالایهٔ «{0}» حذف شد</string>
<string name="edit_filter_create_message">پالایهٔ «{0}» ایجاد شد</string>
<string name="shared_string_clear">پاک‌کردن</string>
<string name="filter_current_poiButton">فیلتر</string>
<string name="filter_current_poiButton">پالایش</string>
<string name="poi_dialog_other_tags_message">همهٔ برچسب‌های دیگر حفظ شد</string>
<string name="poi_dialog_opening_hours">باز است</string>
<string name="poi_dialog_comment">توضیح</string>
@ -374,7 +374,7 @@
<string name="front_left">چپ-جلو</string>
<string name="oclock">ساعت</string>
<string name="towards">به‌طرف</string>
<string name="accuracy">دقت</string>
<string name="accuracy">صحت</string>
<string name="altitude">ارتفاع</string>
<string name="i_am_here">من اینجا هستم</string>
<string name="local_openstreetmap_uploadall">آپلود همه</string>
@ -790,7 +790,7 @@
<string name="incremental_search_building">جست‌وجوی حرف‌به‌حرف نام ساختمان‌ها</string>
<string name="incremental_search_street">جست‌وجوی حرف‌به‌حرف نام خیابان‌ها</string>
<string name="reload_tile">بارکردن مجدد کاشی</string>
<string name="save_track_to_gpx">ضبط خودکار رد هنگام ناوبری</string>
<string name="save_track_to_gpx">ردنگاری خودکار در هنگام ناوبری</string>
<string name="loading_postcodes">در حال بارکردن کدهای پستی…</string>
<string name="converting_names">در حال تبدیل اسامی محلی/انگلیسی…</string>
<string name="failed_op">ناموفق</string>
@ -850,9 +850,9 @@
<string name="background_router_service_descr">زمانی که صفحه خاموش است موقعیت شما را ردگیری می‌کند.</string>
<string name="background_router_service">اجرای OsmAnd در پس‌زمینه</string>
<string name="off_router_service_no_gps_available">برای استفاده از خدمات ناوبری موقعیت مکانی را روشن کنید.</string>
<string name="hide_poi_filter">مخفی‌کردن فیلتر</string>
<string name="show_poi_filter">نمایش فیلتر</string>
<string name="search_poi_filter">فیلتر</string>
<string name="hide_poi_filter">مخفی‌کردن پالایه</string>
<string name="show_poi_filter">نمایش پالایه</string>
<string name="search_poi_filter">پالایه</string>
<string name="layer_map">منبع نقشه…</string>
<string name="context_menu_item_search_poi">جست‌وجوی POI</string>
<string name="use_trackball_descr">استفاده از گوی چرخان (توپک) برای جابه‌جاکردن نقشه.</string>
@ -1036,7 +1036,7 @@
<string name="renderer_load_exception">بارکردن رندرکننده ناموفق بود.</string>
<string name="renderers">رندرکنندهٔ بُرداری</string>
<string name="renderers_descr">شکل‌وشمایل رندرگیری را انتخاب نمایید</string>
<string name="download_type_to_filter">فیلتر</string>
<string name="download_type_to_filter">بنویسید تا پالایش شود</string>
<string name="transport_context_menu">جست‌وجوی حمل‌ونقل در ایستگاه</string>
<string name="rotate_map_to_bearing_descr">نحوهٔ چرخش نقشه:</string>
<string name="layer_poi">لایهٔ POI…</string>
@ -1483,7 +1483,7 @@
<string name="storage_directory_default">حافظهٔ داخلی</string>
<string name="storage_directory">محل ذخیره‌سازی نقشه</string>
<string name="shared_string_copy">کپی</string>
<string name="filter_poi_hint">فیلتر بر اساس نام</string>
<string name="filter_poi_hint">پالایش بر اساس نام</string>
<string name="search_poi_category_hint">جست‌وجوی همه</string>
<string name="shared_string_is_open">باز است</string>
<string name="agps_info">اطلاعات A-GPS</string>
@ -1860,8 +1860,8 @@
<string name="shared_string_record">ضبط‌کردن</string>
<string name="gpx_logging_no_data">اطلاعاتی وجود ندارد</string>
<string name="rendering_attr_contourColorScheme_description">رنگ‌بندی منحنی‌های میزان</string>
<string name="save_track_min_speed">کمترین سرعت برای ورود به سیستم</string>
<string name="save_track_precision">کمترین دقت برای ثبت</string>
<string name="save_track_min_speed">کمترین سرعت برای ثبت</string>
<string name="save_track_precision">کمترین صحت برای ثبت</string>
<string name="christmas_poi">POI کریسمس</string>
<string name="christmas_desc">در آستانهٔ کریسمس و تعطیلات سال نو، می‌توانید نقاط توجه در کریسمس، مانند درخت‌های کریسمس، فروشگاه‌ها و غیره را ببینید.</string>
<string name="christmas_desc_q">نقاط توجه تعطیلات کریسمس نمایش داده شود؟</string>
@ -1873,14 +1873,14 @@
<string name="edit_filter">ویرایش دسته‌ها</string>
<string name="subcategories">زیردسته‌ها</string>
<string name="selected_categories">دسته‌های انتخاب‌شده</string>
<string name="create_custom_poi">ایجاد فیلتر سفارشی</string>
<string name="create_custom_poi">ایجاد پالایهٔ سفارشی</string>
<string name="custom_search">جست‌وجوی سفارشی</string>
<string name="shared_string_filters">فیلترها</string>
<string name="apply_filters">به‌کارگیری فیلترها</string>
<string name="save_filter">ذخیره‌ فیلتر</string>
<string name="delete_filter">حذف فیلتر</string>
<string name="new_filter">فیلتر جدید</string>
<string name="new_filter_desc">لطفاً برای فیلتر جدید نامی وارد کنید. این نام به «دسته‌ها» اضافه می‌شود.</string>
<string name="shared_string_filters">پالایه‌ها</string>
<string name="apply_filters">به‌کارگیری پالایه‌ها</string>
<string name="save_filter">ذخیره‌ٔ پالایه</string>
<string name="delete_filter">حذف پالایه</string>
<string name="new_filter">پالایهٔ جدید</string>
<string name="new_filter_desc">لطفاً برای این پالایه نامی بنویسید. این نام به «دسته‌ها» اضافه می‌شود.</string>
<string name="enter_gpx_name">نام فایل GPX:</string>
<string name="show_on_map_after_saving">مشاهده بر روی نقشه پس از ذخیره</string>
<string name="measurement_tool_action_bar">نقشه را بپیمایید و نقاط را اضافه کنید</string>
@ -2053,7 +2053,7 @@
\nپهنهٔ متناظر: %1$s × %2$s</string>
<string name="increase_search_radius">محدودهٔ جست‌وجو را بزرگ‌تر کن</string>
<string name="nothing_found_descr">جست‌وجو را تغییر دهید یا شعاع آن را بزرگ‌تر کنید.</string>
<string name="save_track_to_gpx_globally_headline">ثبت رد درصورت تقاضا</string>
<string name="save_track_to_gpx_globally_headline">ردنگاری بر اساس تقاضا</string>
<string name="average">میانگین</string>
<string name="of">%1$d از %2$d</string>
<string name="ascent_descent">صعود/نزول</string>
@ -2293,7 +2293,7 @@
<string name="mapillary_menu_edit_text_hint">نام کاربری را بنویسید</string>
<string name="mapillary_menu_descr_username">فقط تصاویری که کاربر زیر اضافه کرده است</string>
<string name="mapillary_menu_title_username">نام کاربری</string>
<string name="mapillary_menu_filter_description">فیلتر تصاویر بر اساس ارسال‌کننده، تاریخ یا نوع. فقط در زوم نزدیک کار می‌کند.</string>
<string name="mapillary_menu_filter_description">پالایش تصاویر بر اساس ارسال‌کننده، تاریخ یا نوع. فقط در زوم نزدیک کار می‌کند.</string>
<string name="map_widget_ruler_control">خط‌کش شعاعی</string>
<string name="shared_string_permissions">مجوزها</string>
<string name="import_gpx_failed_descr">درون‌برد فایل ناموفق بود. لطفاً بررسی کنید OsmAnd اجازهٔ خواندن آن را داشته باشد.</string>
@ -2350,9 +2350,9 @@
<string name="upload_osm_note_description">یادداشت‌های OSM خود را به‌صورت ناشناس یا با نام کاربری‌تان در سایت OpenStreetMap.org، آپلود کنید.</string>
<string name="route_roundabout_short">خروجی %1$d را بگیرید و بروید</string>
<string name="trip_rec_notification_settings_desc">در نوار اعلان دستگاه یک اعلان برای ضبط سفر نشان می‌دهد.</string>
<string name="save_track_min_speed_descr">فیلتر: هیچ نقطه‌ای ثبت نمی‌شود مگر به این سرعت برسد.</string>
<string name="save_track_min_distance_descr">فیلتر: کمترین مسافتی که یک نقطه باید از موقعیت قبلی داشته باشد تا ثبت شود.</string>
<string name="save_track_precision_descr">فیلتر: هیچ نقطه‌ای ثبت نمی‌شود مگر به این دقت برسد.</string>
<string name="save_track_min_speed_descr">پالایه: هیچ نقطه‌ای ثبت نمی‌شود مگر به این سرعت برسد.</string>
<string name="save_track_min_distance_descr">پالایه: کمترین مسافتی که یک نقطه باید از موقعیت قبلی داشته باشد تا ثبت شود.</string>
<string name="save_track_precision_descr">پالایه: ضبط انجام نمی‌شود مگر با رسیدن به این میزان صحت.</string>
<string name="find_parking">پیداکردن پارکینگ</string>
<string name="add_time_span">افزودن بازهٔ زمانی</string>
<string name="shared_string_undo_all">خنثی‌کردن همه</string>
@ -3315,8 +3315,8 @@
<string name="paste_Osmand_data_folder_path">مسیر پوشهٔ داده‌های OsmAnd را درج کنید</string>
<string name="change_osmand_data_folder_question">پوشهٔ داده‌های OsmAnd تغییر کند؟</string>
<string name="move_maps_to_new_destination">انتقال به مقصد جدید</string>
<string name="internal_app_storage_description">ذخیره‌گاه داخلی از کاربر و سایر برنامک‌ها پنهان است، منحصراً OsmAnd به آن دسترسی دارد</string>
<string name="change_data_storage_folder">تغییر پوشهٔ ذخیره‌سازی داده‌ها</string>
<string name="internal_app_storage_description">ذخیره‌گاه داخلی OsmAnd (از دید کاربران و سایر برنامه‌ها پنهان است).</string>
<string name="change_data_storage_folder">تغییر پوشهٔ ذخیره‌سازی</string>
<string name="rendering_attr_piste_type_snow_park_name">پارک برفی</string>
<string name="rendering_attr_piste_type_sleigh_name">سورتمه کالسکه‌ای</string>
<string name="rendering_attr_piste_type_sled_name">سورتمه</string>
@ -3364,26 +3364,26 @@
<string name="update_all_maps">به‌روزرسانی همهٔ نقشه‌ها</string>
<string name="update_all_maps_q">آیا همهٔ نقشه‌ها (%1$d) را به‌روز می‌کنید؟</string>
<string name="release_3_5">• تنظیمات برنامه و پروفایل‌ها به‌روز شد: تنظیمات بر اساس نوع مرتب شده‌اند و امکان شخصی‌سازی هر پروفایل اضافه شده است.
\n
\n
\n• کادر جدیدی برای دانلود نقشه اضافه شده که هنگام مرور، نقشه‌ها را پیشنهاد می‌کند.
\n
\n• اصلاحاتی در پوستهٔ شب انجام شد.
\n
\n
\n• اصلاحاتی در پوستهٔ تیره انجام شد.
\n
\n• چند ایراد مسیریابی در سراسر جهان رفع شد.
\n
\n
\n• نقشهٔ پایه با جزئیات بیشتر از شبکهٔ راه‌ها به‌روز شد.
\n
\n
\n• مناطق آب‌گرفته در سراسر جهان اصلاح شد.
\n
\n
\n• مسیریابی اسکی: پروفایل ارتفاعی و دشواری مسیر به جزئیات مسیرها افزوده شد.
\n
\n
\n• اصلاح سایر باگ‌ها
\n
\n</string>
<string name="apply_preference_to_all_profiles">این تنظیم را می‌توانید بر همهٔ پروفایل‌ها یا فقط بر پروفایل جاری به کار ببندید.</string>
<string name="shared_preference">مشترک</string>
<string name="routing_attr_driving_style_prefer_unpaved_name">ترجیح جاده‌های روسازی‌نشده</string>
<string name="routing_attr_driving_style_prefer_unpaved_description">جاده‌های روسازی‌نشده را ترجیح می‌دهم.</string>
<string name="routing_attr_driving_style_prefer_unpaved_description">جاده‌های روسازی‌نشده را به روسازی‌شده ترجیح می‌دهم.</string>
<string name="layer_osm_edits">ویرایش‌های OSM</string>
<string name="quick_action_contour_lines_descr">دکمه‌ای برای آشکار/پنهان کردن منحنی‌های میزان روی نقشه.</string>
<string name="quick_action_contour_lines_show">نشان‌دادن منحنی‌های میزان</string>
@ -3431,15 +3431,15 @@
<string name="join_segments">پیوند پاره‌ها</string>
<string name="save_heading">ثبت جهت</string>
<string name="save_heading_descr">هنگام ضبط، جهت را برای هر یک از نقطه‌های رد ثبت کن.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s، %2$s</string>
<string name="personal_category_name">شخصی</string>
<string name="shared_string_downloading_formatted">در حال بارگیری %s</string>
<string name="rendering_value_thick_name">ضخیم</string>
<string name="desert_render_descr">برای بیابان‌ها و سایر نواحی با جمعیت پراکنده. جزئیات بیشتری دارد.</string>
<string name="add_new_profile_q">پروفایل تازهٔ «%1$s» اضافه شود؟</string>
<string name="select_navigation_icon">نماد ناوبری</string>
<string name="select_map_icon">نماد نقشه</string>
<string name="select_navigation_icon">نماد موقعیت هنگام حرکت</string>
<string name="select_map_icon">نماد موقعیت هنگام توقف</string>
<string name="delete_profiles_descr">با لمس «به‌کارگیری»، پروفایل‌های حذف‌شده برای همیشه از بین می‌روند.</string>
<string name="master_profile">پروفایل اصلی</string>
<string name="select_color">انتخاب رنگ</string>
@ -3461,4 +3461,21 @@
<string name="import_from_file">درون‌برد از فایل</string>
<string name="import_routing_file">درون‌برد فایل مسیریابی</string>
<string name="import_profile">درون‌برد پروفایل</string>
<string name="permission_is_required"></string>
<string name="monitoring_min_speed_descr">این یک پالایهٔ قطع‌کننده برای سرعت‌های پایین است تا نقاطی که سرعتشان از حدی پایین‌تر است ضبط نشوند. می‌تواند سبب شود که ردهای ضبط‌شده به‌شکل هموارتری روی نقشه دیده شوند.</string>
<string name="monitoring_min_speed_descr_side_effect">اثر جانبی: همهٔ قطعه‌هایی که در آن‌ها به حداقل سرعت معیار نرسید از رد حذف خواهد شد (مثلاً هنگامی که دوچرخه‌تان را بالای یک تپه با شیب تند می‌برید). همچنین هیچ اطلاعاتی دربارهٔ بازه‌های توقف، مانند استراحت‌ها، ضبط نمی‌شود. این مسئله بر همهٔ تحلیل‌ها یا پس‌پردازش‌ها تأثیر می‌گذارد، مانند زمانی که بخواهید مسافت کلی سفر، مدت حرکت یا سرعت متوسط خود را بدانید.</string>
<string name="monitoring_min_speed_descr_recommendation">توصیه: ابتدا از پالایهٔ «کمترین جابه‌جایی» به‌منظور تشخیص حرکت استفاده کنید (B). این‌گونه شاید نتایج بهتری بگیرید و همچنین دادهٔ کمتری از دست می‌دهید. اگر ردها در سرعت‌های پایین نویز دارد، برای اینجا از مقدارهای غیرصفر استفاده کنید. لطفاً توجه نمایید که برخی اندازه‌گیری‌ها ممکن است اصلاً هیچ سرعتی را گزارش نکنند (برخی روش‌های مبتنی بر شبکه)، که در این صورت هیچ چیزی ضبط نخواهد شد.</string>
<string name="monitoring_min_speed_descr_remark">توجه: بررسی «سرعت&gt;۰»: بیشتر چیپست‌های GPS فقط در صورتی مقدار سرعت را گزارش می‌کنند که الگوریتم، شما را در حال حرکت تشخیص دهد و اگر در حال حرکت نباشید چیزی گزارش نمی‌کنند. بنابراین استفاده از تنظیم «&gt;۰» در این پالایه، به تشخیص حرکت توسط چیپست GPS وابسته است. البته حتی اگر این پالایش در زمان ضبط انجام نشود، ما از این ویژگی در تحلیل‌های GPX خود استفاده می‌کنیم تا مسافت اصلاح‌شده را محاسبه کنیم؛ یعنی مقداری که برای «مسافت اصلاح‌شده» گزارش می‌کنیم میزان مسافتی است که در هنگام حرکت ضبط شده.</string>
<string name="monitoring_min_accuracy_descr">این مورد فقط نقاطی را ضبط می‌کند که با شاخص کمترین صحت (به متر/فوت، مطابق گزارش اندروید از چیپست) اندازه‌گیری شده‌اند. منظور از صحت، نمودار نقطه‌ای اندازه‌گیری‌های تکراری است و مستقیماً مربوط به دقت نمی‌شود (دقت: میزان نزدیکی اندازه‌گیری‌ها به موقعیت واقعی).</string>
<string name="monitoring_min_accuracy_descr_side_effect">اثر جانبی: درنتیجهٔ پالایش بر اساس صحت، ممکن است مثلاً زیر پل‌ها، زیر درختان، میان ساختمان‌های بلند یا در شرایط جوّی بخصوص، نقاط تماماً از دست بروند.</string>
<string name="monitoring_min_accuracy_descr_recommendation">توصیه: سخت است آنچه ثبت می‌شود یا آنچه ثبت نمی‌شود را پیشبینی کنیم. شاید بهتر باشد این پالایه را خاموش کنید.</string>
<string name="monitoring_min_accuracy_descr_remark">توجه: اگر بلافاصله پیش از ضبط، GPS خاموش بوده، ممکن است نخستین نقطه صحت کمتری داشته باشد؛ بنابراین ممکن است بخواهیم طوری کدنویسی کنیم که یک نقطه با یک یا چند ثانیه تأخیر ضبط شود (یا از سه نقطهٔ پی‌درپی بهترینشان را ضبط کنیم و...)، البته این هنوز انجام نشده.</string>
<string name="monitoring_notification">اعلان</string>
<string name="monitoring_min_speed">کمترین سرعت</string>
<string name="monitoring_min_accuracy">کمترین صحت</string>
<string name="monitoring_min_distance">کمترین جابجایی</string>
<string name="tracks_view_path">منو — مکان‌های من — ردها</string>
<string name="multimedia_notes_view_path">منو — مکان‌های من — یادداشت‌ها</string>
<string name="osm_edits_view_path">منو — مکان‌های من — ویرایش‌های OSM</string>
<string name="reset_plugin_to_default">بازنشانی تنظیمات افزونه به پیشفرض</string>
</resources>

View file

@ -596,18 +596,18 @@
<string name="map_online_data_descr">Utiliser les cartes en ligne (télécharge et conserve en cache les tuiles sur la carte mémoire).</string>
<string name="shared_string_online_maps">Cartes en ligne</string>
<string name="online_map_settings_descr">Sélectionnez la source de la carte : en ligne ou tuile en cache.</string>
<string name="osmand_rastermaps_plugin_description">Ce greffon permet d\'accéder à une grand nombre de cartes en ligne (aussi appelées tuiles ou cartes raster) qui vont de cartes OpenStreetMap (comme Mapnik) jusqu\'aux images satellites en passant par des cartes spécialisées comme des cartes météo, des cartes de climat, des cartes géologiques, des couches de relief, etc.
<string name="osmand_rastermaps_plugin_description">Accédez à une grand nombre de cartes en ligne (aussi appelées tuiles ou cartes raster) qui vont de cartes OpenStreetMap (comme Mapnik) jusqu\'aux images satellites en passant par des cartes spécialisées comme des cartes météo, des cartes de climat, des cartes géologiques, les couches de relief, etc.
\n
\nChacune de ces cartes est utilisable, comme carte principale, sur-couche ou sous-couche d\'une autre carte. Afin de gérer au mieux la superposition des cartes, vous pouvez masquer certains éléments des cartes vectorielles hors ligne depuis le menu \"Paramétrer la carte\".
\nChacune de ces cartes est utilisable, comme carte principale, sur-couche ou sous-couche d\'une autre carte. Afin de gérer au mieux la superposition des cartes et améliorer la lisibilité, vous pouvez masquer certains éléments des cartes vectorielles hors ligne depuis le menu \"Paramétrer la carte\".
\n
\nLes cartes tuiles peuvent être obtenues directement en ligne ou peuvent être préparées pour un usage hors ligne grâce à des outils tiers puis copiées dans le dossier de données d\'OsmAnd sous forme de base de données SQLite.</string>
<string name="osmand_background_plugin_description">Affiche les préférences afin d\'activer le suivi et la navigation en arrière-plan (écran éteint) en réveillant périodiquement le GPS.</string>
<string name="osmand_accessibility_description">Ce greffon active dans OsmAnd les options d\'accessibilité de votre appareil (réglage de la vitesse des voix de synthèse vocale, utilisation du trackball pour zoomer ou annonces vocales de votre position).</string>
<string name="osmand_development_plugin_description">Ce greffon permet de gérer les paramètres de développement et de débogage tels que la simulation de navigation ou l\'affichage des performances du rendu. Ces paramètres sont conçus pour les développeurs et peuvent être ignorés par les autres utilisateurs.</string>
<string name="osmand_accessibility_description">Activez, dans OsmAnd, les options d\'accessibilité de votre appareil (régler la vitesse des voix de synthèse vocale, utiliser le trackball pour zoomer ou activer les annonces vocales de votre position).</string>
<string name="osmand_development_plugin_description">Gérez les paramètres de développement et de débogage tels que la simulation de navigation, l\'affichage des performances ou le guidage vocal. Ces paramètres sont conçus pour les développeurs et peuvent être ignorés par les autres utilisateurs.</string>
<string name="plugins_screen">Gestionnaire de greffons</string>
<string name="prefs_plugins_descr">Les greffons ajoutent à l\'application des fonctionnalités supplémentaires et des paramètres avancés.</string>
<string name="prefs_plugins">Gestionnaire de greffons</string>
<string name="osm_editing_plugin_description">Grâce à ce greffon vous pouvez gérer vos contributions à OpenStreetMap (OSM) directement depuis l\'application OsmAnd. Par exemple : créer ou modifier les points d\'intérêt OSM, déclarer ou commenter les notes OSM et envoyer vos traces GPX (nécessite un compte OSM). OpenStreetMap est une communauté ouverte de cartographie publique. Pour plus de détails, consultez https://openstreetmap.org.</string>
<string name="osm_editing_plugin_description">Contribuez à OpenStreetMap (OSM) directement depuis l\'application OsmAnd. Par exemple : créez ou modifiez les points d\'intérêt OSM, créez ou modifiez les notes OSM et envoyez vos traces GPX (nécessite un compte OSM). OpenStreetMap est une communauté ouverte et mondiale de cartographie publique.</string>
<string name="vector_maps_may_display_faster_on_some_devices">Cartes vectorielles (hors-ligne) peuvent s\'afficher plus rapidement. Peut ne pas fonctionner sur certains appareils.</string>
<string name="play_commands_of_currently_selected_voice">Sélectionnez une voix et testez les annonces vocales :</string>
<string name="debugging_and_development">Débogage et développement OsmAnd</string>
@ -720,9 +720,8 @@
<string name="osmand_parking_pm">PM</string>
<string name="osmand_parking_am">AM</string>
<string name="osmand_parking_position_name">Lieu de stationnement</string>
<string name="osmand_parking_plugin_description">Ce greffon permet d\'enregistrer l\'emplacement de stationnement de votre véhicule et, si besoin, de mesurer la durée de stationnement restante.
Ces informations sont visibles sur le Tableau de bord comme sur la carte. Un rappel peut même être ajouté à votre calendrier.</string>
<string name="osmand_parking_plugin_description">Enregistrez l\'emplacement de stationnement de votre véhicule et, si besoin, mesurez la durée de stationnement restante.
\nCes informations sont visibles sur le Tableau de bord comme sur la carte. Un rappel peut même être ajouté à votre calendrier.</string>
<string name="osmand_parking_plugin_name">Stationnement</string>
<string name="context_menu_item_add_parking_point">Marquer comme stationnement</string>
<string name="context_menu_item_delete_parking_point">Supprimer l\'emplacement de stationnement</string>
@ -892,7 +891,7 @@ Ces informations sont visibles sur le Tableau de bord comme sur la carte. Un rap
<string name="index_srtm_parts">parties</string>
<string name="audionotes_location_not_defined">Appuyez sur \"Utiliser la position...\" pour ajouter une note sur le point.</string>
<string name="map_widget_audionotes">Notes audio</string>
<string name="audionotes_plugin_description">Ce greffon permet de prendre des notes (photos, audios ou vidéos) sur un itinéraire soit en utilisant un bouton affiché sur la carte, soit directement depuis le menu contextuel de n\'importe quel point sur la carte.</string>
<string name="audionotes_plugin_description">Prenez des notes (photos, audios ou vidéos) pendant votre itinéraire soit en utilisant un bouton, soit depuis le menu contextuel de n\'importe quel point.</string>
<string name="audionotes_plugin_name">Notes audio/vidéo</string>
<string name="osmand_srtm_short_description_80_chars">Greffon OsmAnd pour les courbes de niveau hors-ligne</string>
<string name="osmand_srtm_long_description_1000_chars">Ce greffon permet l\'affichage de courbes de niveau ainsi que du relief (ombres) qui s\'ajoutent au-dessus des cartes standard d\'OsmAnd. Ces informations sont particulièrement utiles pour les sportifs, les randonneurs, les cyclistes et d\'une manière générale par toutes les personnes qui souhaitent connaitre le relief.
@ -993,7 +992,7 @@ Ces informations sont visibles sur le Tableau de bord comme sur la carte. Un rap
<string name="plugin_distance_point_ele">altitude</string>
<string name="gpx_file_name">Nom du fichier GPX</string>
<string name="gpx_saved_sucessfully">Fichier GPX {0} enregistré</string>
<string name="osmand_distance_planning_plugin_description">Ce greffon permet, depuis la carte, de créer un itinéraire soit un cliquant sur la carte, soit en ouvrant ou en modifiant un fichier GPX existant ainsi que de mesurer la distance entre des points. L\'itinéraire créé peut être enregistré dans un fichier GPX qui peut lui-même être utilisé ensuite pour une navigation.</string>
<string name="osmand_distance_planning_plugin_description">Créez un itinéraire (soit en appuyant sur la carte soit en ouvrant un fichier GPX existant) et mesurez la distance entre points. Enregistrez ces itinéraires comme fichiers GPX et plus tard charger les pour vous faire guider.</string>
<string name="osmand_distance_planning_plugin_name">Mesure de distance et Outil de planification</string>
<string name="shared_string_do_not_show_again">Ne plus afficher</string>
<string name="local_osm_changes_backup_successful">Fichier de modifications OSM %1$s généré avec succès</string>
@ -1202,7 +1201,7 @@ Ces informations sont visibles sur le Tableau de bord comme sur la carte. Un rap
<string name="gpx_file_is_empty">Fichier GPX vide</string>
<string name="shared_string_tracks">Traces</string>
<string name="shared_string_my_favorites">Favoris</string>
<string name="shared_string_my_places">Favoris</string>
<string name="shared_string_my_places">Mes lieux favoris</string>
<string name="selected_gpx_info_show">\n\nAppui long pour afficher sur la carte</string>
<string name="delay_navigation_start">Démarrer la navigation pas à pas automatiquement</string>
<string name="shared_string_selected_lowercase">sélectionné(s)</string>
@ -1434,7 +1433,7 @@ Ces informations sont visibles sur le Tableau de bord comme sur la carte. Un rap
<string name="rendering_attr_pisteGrooming_name">Damage des pistes</string>
<string name="free">%1$s libre</string>
<string name="device_memory">Mémoire de l\'appareil</string>
<string name="notes">Notes OSM</string>
<string name="notes">Notes audio / vidéo</string>
<string name="online_map">Carte en ligne</string>
<string name="roads_only">Routes uniquement</string>
<string name="rendering_attr_pisteRoutes_name">Pistes de ski</string>
@ -1648,7 +1647,7 @@ Ces informations sont visibles sur le Tableau de bord comme sur la carte. Un rap
<string name="contact_info">Contact</string>
<string name="please_specify_poi_type">Merci d\'indiquer un type de point d\'intérêt.</string>
<string name="working_days">Jours travaillés</string>
<string name="recent_places">Emplacements récents</string>
<string name="recent_places">Lieux récents</string>
<string name="favourites">Favoris</string>
<string name="show_on_start">Afficher au démarrage</string>
<string name="show_gpx">Afficher les données GPX</string>
@ -1804,7 +1803,7 @@ Ces informations sont visibles sur le Tableau de bord comme sur la carte. Un rap
<string name="av_audio_bitrate_descr">Sélectionnez le bitrate audio</string>
<string name="no_address_found">Impossible de déterminer l\'adresse</string>
<string name="looking_up_address">Recherche de l\'adresse</string>
<string name="update">Fréquence de mise à jour</string>
<string name="update">Mise à jour</string>
<string name="only_download_over_wifi">Télécharger uniquement en WiFi</string>
<string name="live_update">Mise à jour en temps réel</string>
<string name="rendering_attr_horseRoutes_name">Randonnée à cheval</string>
@ -3376,7 +3375,7 @@ représentant la zone : %1$s x %2$s</string>
<string name="rendering_attr_showCycleNodeNetworkRoutes_name">Afficher les pistes cyclables</string>
<string name="rendering_value_walkingRoutesOSMCNodes_name">Réseaux</string>
<string name="personal_category_name">Personnel</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="shared_string_downloading_formatted">Téléchargement %s</string>
<string name="rendering_value_thick_name">Épais</string>
@ -3441,4 +3440,15 @@ représentant la zone : %1$s x %2$s</string>
<string name="monitoring_min_speed_descr">Filtre interrompant l\'enregistrement en dessous d\'une certaines vitesse. Rend les traces enregistrées plus régulières lorsqu\'elles sont affichées sur la carte.</string>
<string name="live_monitoring_time_buffer">Durée de la mémoire tampon</string>
<string name="live_monitoring_adress_descr">Indiquez l\'adresse web avec la syntaxe suivante pour les paramètres : lat = {0}, lon = {1}, horodatage = {2}, hdop = {3}, altitude = {4}, vitesse = {5}, direction = {6}.</string>
<string name="monitoring_min_accuracy_descr_recommendation">Recommandation : il est difficile de prédire ce qui sera enregistré et ce qui ne le sera pas, il peut être préférable de désactiver ce filtre.</string>
<string name="monitoring_min_distance_descr">Ce filtre limite l\'enregistrement de points en double lorsque les déplacements sont très lents donnant une apparence plus régulière aux traces.</string>
<string name="monitoring_min_distance_descr_recommendation">Recommandation : un paramètre de 5 mètres est adapté si vous n\'avez pas besoin de détails et ne souhaitez pas enregistrer des points au repos.</string>
<string name="monitoring_min_speed_descr_side_effect">Effet secondaire : votre trace ne contiendra pas les parties où la vitesse minimale n\'a pas été atteinte (par exemple lorsque vous poussez votre vélo en montée ou pendant une pause). De ce fait certaines informations de votre trace seront faussées comme la durée de déplacement ou la vitesse moyenne.</string>
<string name="monitoring_min_speed_descr_recommendation">Recommandation : commencez par utiliser la détection de mouvement via le filtre de déplacement minimum (B) vous pourriez obtenir de meilleurs résultats en perdant moins de données. Si vos traces restent bruyantes à basse vitesse, essayez ici des valeurs non nulles. Veuillez noter que certaines mesures peuvent retourner une vitesse nulle (en raison de méthodes basées sur le réseau), dans ce cas rien ne sera enregistré.</string>
<string name="monitoring_min_accuracy_descr">Seuls les points mesurés avec un minimum de précision en mètres/pieds (information communiquée par votre puce GPS) seront enregistrés. La précision fait référence à la dispersion de plusieurs mesures successives et n\'est pas directement liée à la distance entre ces mesures et votre position réelle.</string>
<string name="monitoring_min_accuracy_descr_side_effect">Effet secondaire : avec le filtrage par précision certains points peuvent manquer ; par exemple : sous un pont, en forêt, entre de hauts bâtiments ou dans certaines conditions météorologiques.</string>
<string name="monitoring_min_accuracy_descr_remark">Remarque : si la localisation GPS est activée juste avant le début d\'enregistrement, la première position peut être imprécise. L\'application pourrait attendre quelques secondes avant d\'enregistrer un point (ou enregistrer le meilleur de 3 points successifs, etc), mais ces évolutions ne sont pas encore disponibles.</string>
<string name="tracks_view_path">Menu &gt; Mes lieux favoris &gt; Traces</string>
<string name="multimedia_notes_view_path">Menu &gt; Mes lieux favoris &gt; Notes</string>
<string name="osm_edits_view_path">Menu &gt; Mes lieux favoris &gt; Modifications OSM</string>
</resources>

View file

@ -3770,7 +3770,7 @@
<string name="poi_volcano_type_maar">Maar</string>
<string name="poi_volcano_type_caldera">Caldeira</string>
<string name="poi_volcano_type_lava_dome">Cúpula de lava</string>
<string name="poi_volcano_type_dirt">Terra</string>
<string name="poi_volcano_type_mud">Terra</string>
<string name="poi_volcano_last_eruption">Última erupción</string>
<string name="poi_volcano_status_extinct">Extinguido</string>
<string name="poi_volcano_status_dormant">Dormente</string>

View file

@ -3430,7 +3430,7 @@ Lon %2$s</string>
<string name="add_new_profile_q">Engadir novo perfil \'%1$s\'\?</string>
<string name="save_heading">Incluír encabezamento</string>
<string name="save_heading_descr">Gardar encabezamento en cada punto da pista (trackpoint) mentres se grava.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Persoal</string>
<string name="shared_string_downloading_formatted">Baixando %s</string>

View file

@ -3386,7 +3386,7 @@
<string name="add_new_profile_q">להוסיף פרופיל חדש %1&amp;s\?</string>
<string name="save_heading">כולל הכותרת</string>
<string name="save_heading_descr">לשמור את הכותרת של כל נקודת דרך בזמן ההקלטה.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">אישי</string>
<string name="shared_string_downloading_formatted">%s בהורדה</string>

View file

@ -3770,7 +3770,7 @@
<string name="poi_volcano_type_maar">Maar-vulkán</string>
<string name="poi_volcano_type_caldera">Kaldera</string>
<string name="poi_volcano_type_lava_dome">Lávakupola</string>
<string name="poi_volcano_type_dirt">Sárvulkán</string>
<string name="poi_volcano_type_mud">Sárvulkán</string>
<string name="poi_volcano_last_eruption">Utolsó kitörés</string>
<string name="poi_volcano_status_extinct">Kialudt</string>
<string name="poi_volcano_status_dormant">Szunnyadó</string>

View file

@ -2388,7 +2388,7 @@ Ha szereted az OsmAndot és az OSM-et, és szeretnéd támogatni a fejlődésük
<string name="ascendingly">AZ</string>
<string name="date_added">Hozzáadva</string>
<string name="order_by">Rendezés alapja:</string>
<string name="marker_show_distance_descr">"Válassza ki, hogyan jelenjék meg a térképen a térképjelölők távolsága és iránya:"</string>
<string name="marker_show_distance_descr">Válassza ki, hogyan jelenjék meg a térképen a térképjelölők távolsága és iránya:</string>
<string name="map_orientation_change_in_accordance_with_speed_descr">Válaszd ki, mekkora sebesség alatt váltson a térkép forgatása „Haladási irány”-ról „Iránytű”-re.</string>
<string name="all_markers_moved_to_history">Minden térképjelölő áthelyezve az előzményekbe</string>
<string name="marker_moved_to_history">Térképjelölő áthelyezve az előzményekhez</string>
@ -3232,7 +3232,7 @@ Ha szereted az OsmAndot és az OSM-et, és szeretnéd támogatni a fejlődésük
<string name="dialogs_and_notifications_descr">Felugró üzenetek, párbeszédablakok és értesítések beállításai.</string>
<string name="suggested_maps">Javasolt térképek</string>
<string name="add_new_profile_q">Hozzáadja az új „%1$s” profilt\?</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Személyes</string>
<string name="shared_string_downloading_formatted">%s letöltése</string>

View file

@ -3407,7 +3407,7 @@ Stendur fyrir svæði: %1$s x %2$s</string>
<string name="add_new_profile_q">Bæta við nýja sniðinu \'%1$s\'\?</string>
<string name="save_heading">Hafa með stefnu</string>
<string name="save_heading_descr">Vista stefnu í hvern ferilpunkt á meðan upptöku stendur.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Persónulegt</string>
<string name="shared_string_downloading_formatted">Sæki %s</string>

View file

@ -3394,7 +3394,7 @@ Rappresenta l\'area: %1$s x %2$s</string>
<string name="add_new_profile_q">Aggiungere il nuovo profilo \'%1$s\'\?</string>
<string name="save_heading">Salva orientamento</string>
<string name="save_heading_descr">Durante la registrazione salva l\'orientamento per ogni punto della traccia</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Personale</string>
<string name="shared_string_downloading_formatted">Scaricamento %s</string>

View file

@ -3402,7 +3402,7 @@ POIの更新は利用できません</string>
<string name="shared_string_downloading_formatted">をダウンロード中</string>
<string name="rendering_value_thick_name">濃い</string>
<string name="desert_render_descr">砂漠などの過疎地に向いたマップスタイルです。</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="select_navigation_icon">ナビゲーションアイコンの選択</string>
<string name="select_map_icon">マップアイコンの選択</string>

View file

@ -361,7 +361,7 @@
<string name="add_new_profile_q">ಹೊಸ ಪ್ರೊಫೈಲ್ ಸೇರಿಸುವುದೇ \'%1$s\'\?</string>
<string name="save_heading">ಶೀರ್ಷಿಕೆಯನ್ನು ಸೇರಿಸಿ</string>
<string name="save_heading_descr">ರೆಕಾರ್ಡಿಂಗ್ ಮಾಡುವಾಗ ಪ್ರತಿ ಟ್ರ್ಯಾಕ್ ಪಾಯಿಂಟ್‌ಗೆ ಶೀರ್ಷಿಕೆ ಉಳಿಸಿ.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">ವೈಯಕ್ತಿಕ</string>
<string name="shared_string_downloading_formatted">ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ%s</string>

View file

@ -3405,7 +3405,7 @@
<string name="added_profiles_descr">Programtillegg legger til ny profil i OsmAnd</string>
<string name="shared_string_turn_off">Skru av</string>
<string name="new_plugin_added">Nytt programtillegg lagt til</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Personlig</string>
<string name="shared_string_downloading_formatted">Laster ned %s</string>

View file

@ -3276,7 +3276,7 @@ voor Gebied: %1$s x %2$s</string>
<string name="save_heading_descr">Sla koers naar elk trackpunt op tijdens het opnemen.</string>
<string name="save_heading">Richting toevoegen</string>
<string name="personal_category_name">Persoonlijk</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="shared_string_downloading_formatted">Downloaden %s</string>
<string name="desert_render_descr">Voor woestijnen en andere dunbevolkte gebieden. Toont meer details op schaal.</string>

View file

@ -3396,7 +3396,7 @@ Reprezentuje obszar: %1$s x %2$s</string>
<string name="add_new_profile_q">Dodać nowy profil \'%1$s\'\?</string>
<string name="save_heading">Dołącz kierunek</string>
<string name="save_heading_descr">Zapisz podczas nagrywania kierunek do każdego punktu trasy.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Osobiste</string>
<string name="shared_string_downloading_formatted">Pobieranie %s</string>

View file

@ -3777,7 +3777,7 @@
<string name="poi_volcano_type_maar">Maar</string>
<string name="poi_volcano_type_caldera">Caldeira</string>
<string name="poi_volcano_type_lava_dome">Domo de lava</string>
<string name="poi_volcano_type_dirt">Terra (lamacenta)</string>
<string name="poi_volcano_type_mud">Terra (lamacenta)</string>
<string name="poi_volcano_last_eruption">Última erupção</string>
<string name="poi_volcano_status_extinct">Extinto</string>
<string name="poi_volcano_status_dormant">Dormente</string>

View file

@ -344,7 +344,7 @@
<string name="copying_osmand_files">Copiando arquivos de dados…</string>
<string name="calculate_osmand_route_gpx">"Calcular rota off-line "</string>
<string name="app_mode_truck">Caminhão</string>
<string name="auto_zoom_far">Visão intermediária</string>
<string name="auto_zoom_far">Para nível intermediário</string>
<string name="local_index_tile_data_minzoom">Zoom mínimo: %1$s</string>
<string name="edit_tilesource_successfully">A fonte da quadrícula %1$s foi salva</string>
<string name="speak_traffic_warnings">Moderadores de tráfego</string>
@ -537,8 +537,8 @@
<string name="animate_routing_route">"Simular usando a rota calculada "</string>
<string name="animate_routing_gpx">Simular usando trilha GPX</string>
<string name="auto_zoom_none">Sem zoom automático</string>
<string name="auto_zoom_close">Aproximar</string>
<string name="auto_zoom_farthest">Afastar</string>
<string name="auto_zoom_close">Para nível aproximado</string>
<string name="auto_zoom_farthest">Para nível afastado</string>
<string name="map_magnifier">Lupa</string>
<string name="base_world_map">Mapa base mundial</string>
<string name="about_version">Versão:</string>
@ -3391,7 +3391,7 @@ Pôr do Sol: %2$s</string>
<string name="add_new_profile_q">Adicionar novo perfil \'%1$s\'\?</string>
<string name="save_heading">Incluir direção</string>
<string name="save_heading_descr">Salve o cabeçalho em cada ponto da trilha durante a gravação.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Pessoal</string>
<string name="shared_string_downloading_formatted">Baixando %s</string>

View file

@ -3762,7 +3762,7 @@
<string name="poi_volcano_type_maar">Maar</string>
<string name="poi_volcano_type_caldera">Caldera</string>
<string name="poi_volcano_type_lava_dome">Cúpula de lava</string>
<string name="poi_volcano_type_dirt">Sujeira</string>
<string name="poi_volcano_type_mud">Sujeira</string>
<string name="poi_volcano_last_eruption">Última erupção</string>
<string name="poi_volcano_status_extinct">Extinto</string>
<string name="poi_volcano_status_dormant">Dormente</string>

View file

@ -3376,7 +3376,7 @@
<string name="add_new_profile_q">Adicionar novo perfil \'%1$s\'\?</string>
<string name="save_heading">Incluir a direção</string>
<string name="save_heading_descr">Gravar direção para cada ponto de pista durante a gravação.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Pessoal</string>
<string name="shared_string_downloading_formatted">Descarregando %s</string>

View file

@ -2653,7 +2653,7 @@
<string name="add_new_profile_q">Adăugați un profil nou \'%1$s\'\?</string>
<string name="save_heading">Includeți titlu</string>
<string name="save_heading_descr">Salvați poziția fiecarui punct al traseului în timpul înregistrării.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Personal</string>
<string name="shared_string_downloading_formatted">Descarcarea</string>

View file

@ -3650,7 +3650,7 @@
<string name="poi_volcano_type_maar">Маар</string>
<string name="poi_volcano_type_caldera">Калдера</string>
<string name="poi_volcano_type_lava_dome">Лавовый купол</string>
<string name="poi_volcano_type_dirt">Грязевой</string>
<string name="poi_volcano_type_mud">Грязевой</string>
<string name="poi_volcano_last_eruption">Последнее извержение</string>
<string name="poi_volcano_status_extinct">Потухший</string>
<string name="poi_volcano_status_dormant">Спящий</string>

View file

@ -3347,7 +3347,7 @@
<string name="rendering_value_walkingRoutesOSMCNodes_name">Узловые сети</string>
<string name="suggested_maps">Предлагаемые карты</string>
<string name="join_segments">Объединить сегменты</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="desert_render_descr">Для пустынь и других малонаселенных районов. Отображает больше деталей на шкале просмотра.</string>
<string name="select_navigation_icon">Выберите значок навигации</string>

View file

@ -3775,7 +3775,7 @@
<string name="poi_volcano_type_maar">Maar</string>
<string name="poi_volcano_type_caldera">Caldera</string>
<string name="poi_volcano_type_lava_dome">Cùpola de lava</string>
<string name="poi_volcano_type_dirt">Terra</string>
<string name="poi_volcano_type_mud">Terra</string>
<string name="poi_volcano_last_eruption">Ùrtima erutzione</string>
<string name="poi_volcano_status_extinct">Istudadu</string>
<string name="poi_volcano_status_dormant">Durmende</string>

View file

@ -3398,7 +3398,7 @@ Pro praghere iscrie su còdighe intreu</string>
<string name="add_new_profile_q">Annanghere su profilu nou \'%1$s\'\?</string>
<string name="save_heading">Inclue sa diretzione</string>
<string name="save_heading_descr">Sarva sa diretzione pro cada puntu cando ses registrende.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Personale</string>
<string name="shared_string_downloading_formatted">Iscarrighende %s</string>
@ -3448,4 +3448,25 @@ Pro praghere iscrie su còdighe intreu</string>
<string name="select_nav_icon_descr">As a bìdere s\'icona petzi durante sa navigatzione o su movimentu.</string>
<string name="select_map_icon_descr">S\'icona de sa mapa aparit in sa mapa ebbia, e divenit s\'icona de navigatzione durante sa navigatzione.</string>
<string name="logcat_buffer_descr">Inoghe podes pompiare e cumpartzire sos registros de s\'aplicatzione</string>
<string name="search_offline_geo_error">Anàlisi de su geo intent \'%s\' fallida.</string>
<string name="permission_is_required">Pro impreare custa optzione b\'at bisòngiu de unu permissu.</string>
<string name="monitoring_min_speed_descr">Custu est unu filtru pro non registrare puntos in suta de una lestresa isseberada. Faghet in modu chi sas rastas registradas pàrgiant prus regulares cando benint pompiadas in sa mapa.</string>
<string name="monitoring_min_speed_descr_side_effect">Efetu segundàriu: in sa rasta tua ant a mancare totu sas setziones in ue no as rispetadu su critèriu de sa lestresa mìnima (es. cando ispinghes sa bitzicleta tua cara a artu in unu montigru). Annotamala, non b\'ant a èssere informatziones a pitzu de sos perìodos de pasu, che a sas pàusas. Custu at a influentzare totu sas anàlisis o sos post-protzessamentos, a es. cando ses chirchende de determinare sa longària totale de su biàgiu tuo, su tempus in movimentu, o sa lestresa mèdia tua.</string>
<string name="live_monitoring_tracking_interval">Intervallu de arrastamentu</string>
<string name="live_monitoring_adress">Indiritzu web</string>
<string name="live_monitoring_adress_descr">Dislinda s\'indiritzu web cun sa sintassi de paràmetros: lat={0}, lon={1}, marcadesutempus={2}, hdop={3}, artària={4}, lestresa={5}, diretzione={6}.</string>
<string name="monitoring_notification">Notìfica</string>
<string name="monitoring_min_speed">Lestresa mìnima</string>
<string name="monitoring_min_accuracy">Acuradesa mìnima</string>
<string name="monitoring_min_distance">Movimentu mìnimu</string>
<string name="tracks_view_path">Menù — Logos meos — Rastas</string>
<string name="multimedia_notes_view_path">Menù — Logos meos — Notas</string>
<string name="osm_edits_view_path">Menù — Logos meos — Modìficas de OSM</string>
<string name="reset_plugin_to_default">Riprìstina sas impostatziones predefinidas de s\'estensione</string>
<string name="multimedia_use_system_camera">Imprea s\'aplicatzione de sistema</string>
<string name="multimedia_photo_play_sound">Sonu de s\'oturadore de sa fotocàmera</string>
<string name="osm_authorization_success">S\'autorizatzione est resèssida</string>
<string name="monitoring_min_speed_descr_recommendation">Impòsitu: Proa a impreare, in antis, su rilevamentu de movimentu pro mèdiu de sul filtru de movimentu mìnimu (B). Diat pòdere produire risultados mègius, e tue dias pòdere pèrdere datos de mancu. Si sas rastas tuas abarrant burdellosas a lestresas bassas, proa a impreare inoghe valores diferentes dae zero. Pro praghere ammenta·ti chi carchi mèdida diat pòdere non rilevare perunu valore de lestresa (unas àteras maneras basadas in subra de sa retza), e chi in custu casu non dias registrare nudda.</string>
<string name="monitoring_min_accuracy_descr_recommendation">Impòsitu: est prus difìtzile a intzertare ite at a èssere registradu e ite nono. Diat èssere mègius a istudare custu filtru.</string>
<string name="live_monitoring_time_buffer">Intervallu tampone (buffer)</string>
</resources>

View file

@ -3382,7 +3382,7 @@ Zodpovedá oblasti: %1$s x %2$s</string>
<string name="add_new_profile_q">Pridať nový profil \'%1$s\'\?</string>
<string name="save_heading">Pridať nadpis</string>
<string name="save_heading_descr">Pridať nadpis ku každému bodu trasy pri zázname.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Osobné</string>
<string name="shared_string_downloading_formatted">Sťahujem %s</string>

View file

@ -3274,7 +3274,7 @@ Koda predstavlja območje: %1$s x %2$s</string>
<string name="rendering_value_walkingRoutesOSMCNodes_name">Omrežja vozlišč</string>
<string name="save_heading">Vključi glavo</string>
<string name="save_heading_descr">Shrani glavo k vsaki točki sledi med beleženjem.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Osebno</string>
<string name="shared_string_downloading_formatted">Poteka prejemanje %s</string>

View file

@ -3394,7 +3394,7 @@
<string name="add_new_profile_q">Додај нови профил %1$s\?</string>
<string name="save_heading">Укључи заглавље</string>
<string name="save_heading_descr">Сачувај заглавље свакој тачки праћења приликом снимања.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Лични</string>
<string name="shared_string_downloading_formatted">Преузимам %s</string>

View file

@ -3359,7 +3359,7 @@
<string name="add_new_profile_q">\'%1$s\' yeni profil eklensin mi\?</string>
<string name="save_heading">Başlığı dahil et</string>
<string name="save_heading_descr">Kayıt sırasında her izleme noktasına başlığı kaydet.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Kişisel</string>
<string name="shared_string_downloading_formatted">%s indiriliyor</string>

View file

@ -3765,7 +3765,7 @@
<string name="poi_volcano_type_maar">Маар</string>
<string name="poi_volcano_type_caldera">Кальдера</string>
<string name="poi_volcano_type_lava_dome">Лавовий купол</string>
<string name="poi_volcano_type_dirt">Брудовий</string>
<string name="poi_volcano_type_mud">Брудовий</string>
<string name="poi_volcano_last_eruption">Останнє виверження</string>
<string name="poi_volcano_status_extinct">Вимерлий</string>
<string name="poi_volcano_status_dormant">Сплячий</string>

View file

@ -1380,7 +1380,7 @@
<string name="shared_string_dismiss">Відхилити</string>
<string name="shared_string_audio">Аудіо</string>
<string name="share_note">Поділитись нотаткою</string>
<string name="notes">OSM примітки</string>
<string name="notes">A/V примітки</string>
<string name="online_map">Мережева мапа</string>
<string name="roads_only">Тільки дороги</string>
<string name="free">Вільно %1$s</string>
@ -3394,7 +3394,7 @@
<string name="add_new_profile_q">Додати новий профіль \'%1$s\'\?</string>
<string name="save_heading">Зберегти заголовок</string>
<string name="save_heading_descr">Зберегти заголовок для кожної точки треку під час запису.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Особистий</string>
<string name="shared_string_downloading_formatted">Завантажується %s</string>

View file

@ -2798,7 +2798,7 @@
<string name="download_map_dialog">下载地图对话框</string>
<string name="suggested_maps">建议的地图</string>
<string name="shared_string_turn_off">关闭</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="select_navigation_icon">选择导航图标</string>
<string name="select_map_icon">选择地图图标</string>
<string name="delete_profiles_descr">在您点击“应用”后,已删除的配置将永久丢失。</string>

View file

@ -3776,7 +3776,7 @@
<string name="poi_volcano_type_maar">低平火山口</string>
<string name="poi_volcano_type_caldera">破火山口</string>
<string name="poi_volcano_type_lava_dome">火山穹丘</string>
<string name="poi_volcano_type_dirt">火山灰</string>
<string name="poi_volcano_type_mud">火山灰</string>
<string name="poi_volcano_last_eruption">最後一次噴發</string>
<string name="poi_volcano_status_extinct">死火山</string>
<string name="poi_volcano_status_dormant">休眠火山</string>

View file

@ -3394,7 +3394,7 @@
<string name="add_new_profile_q">新增新的設定檔「%1$s」</string>
<string name="save_heading">包含標題</string>
<string name="save_heading_descr">在記錄時將標題儲存到每個追蹤點。</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">個人</string>
<string name="shared_string_downloading_formatted">正在下載 %s</string>

View file

@ -4169,7 +4169,7 @@
<string name="poi_volcano_type_maar">Maar</string>
<string name="poi_volcano_type_caldera">Caldera</string>
<string name="poi_volcano_type_lava_dome">Lava dome</string>
<string name="poi_volcano_type_dirt">Dirt</string>
<string name="poi_volcano_type_mud">Mud</string>
<string name="poi_volcano_last_eruption">Last eruption</string>
<string name="poi_volcano_status_extinct">Extinct</string>
<string name="poi_volcano_status_dormant">Dormant</string>
@ -4179,4 +4179,11 @@
<string name="poi_memorial_ghost_bike">Ghost bike</string>
<string name="poi_paintball">Paintball</string>
<string name="poi_mountain_rescue">Mountain rescue</string>
<string name="poi_shop_security">Security store</string>
<string name="poi_bowling_alley">Bowling center</string>
</resources>

View file

@ -11,6 +11,9 @@
Thx - Hardy
-->
<string name="ltr_or_rtl_combine_via_slash">%1$s/%2$s</string>
<string name="sunset_at">Sunset at %1$s</string>
<string name="sunrise_at">Sunrise at %1$s</string>
<string name="permission_is_required">Permission is required to use this option.</string>
<string name="logcat_buffer_descr">Check and share detailed logs of the application</string>
<string name="file_does_not_contain_routing_rules">No routing rules in \'%1$s\'. Please choose another file.</string>
@ -81,7 +84,7 @@
<string name="edit_profiles_descr">OsmAnd default profiles cannot be deleted, but disabled (on the previous screen), or be sorted to the bottom.</string>
<string name="edit_profiles">Edit profiles</string>
<string name="select_nav_profile_dialog_message">The \'Navigation type\' governs how routes are calculated.</string>
<string name="distance_and_address">%1$s • %2$s</string>
<string name="ltr_or_rtl_combine_via_bold_point">%1$s • %2$s</string>
<string name="street_city">%1$s, %2$s</string>
<string name="personal_category_name">Personal</string>
<string name="add_new_profile_q">Add the new profile \'%1$s\'?</string>

View file

@ -3,7 +3,6 @@ package net.osmand.data;
import java.io.Serializable;
import android.content.Context;
import android.content.res.Resources;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
@ -19,7 +18,6 @@ public class FavouritePoint implements Serializable, LocationPoint {
private static final String HIDDEN = "hidden";
private static final String ADDRESS_EXTENSION = "address";
private static final String DEFAULT_ICON_NAME = "special_star";
protected String name = "";
protected String description;
@ -139,6 +137,8 @@ public class FavouritePoint implements Serializable, LocationPoint {
public int getOverlayIconId() {
if (isSpecialPoint()) {
return specialPointType.getIconId();
} else if (iconId == 0) {
return R.drawable.mx_special_star;
}
return iconId;
}
@ -202,7 +202,6 @@ public class FavouritePoint implements Serializable, LocationPoint {
return "Favourite " + getName(); //$NON-NLS-1$
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
@ -253,7 +252,6 @@ public class FavouritePoint implements Serializable, LocationPoint {
return result;
}
public enum SpecialPointType {
HOME("home", R.string.home_button, R.drawable.mx_special_house),
WORK("work", R.string.work_button, R.drawable.mx_special_building),
@ -286,7 +284,6 @@ public class FavouritePoint implements Serializable, LocationPoint {
}
}
public static FavouritePoint fromWpt(@NonNull WptPt pt, @NonNull Context ctx) {
String name = pt.name;
String categoryName = pt.category != null ? pt.category : "";

View file

@ -1,6 +1,8 @@
package net.osmand.plus;
import android.app.Activity;
import android.location.GnssNavigationMessage;
import android.location.GnssStatus;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import java.util.ArrayList;
@ -127,7 +129,7 @@ public class OsmAndLocationProvider implements SensorEventListener {
private List<OsmAndLocationListener> locationListeners = new ArrayList<OsmAndLocationProvider.OsmAndLocationListener>();
private List<OsmAndCompassListener> compassListeners = new ArrayList<OsmAndLocationProvider.OsmAndCompassListener>();
private Listener gpsStatusListener;
private Object gpsStatusListener;
private float[] mRotationM = new float[9];
@ -249,7 +251,7 @@ public class OsmAndLocationProvider implements SensorEventListener {
}
}
if (isLocationPermissionAvailable(app)) {
service.addGpsStatusListener(getGpsStatusListener(service));
registerGpsStatusListener(service);
try {
service.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_TIMEOUT_REQUEST, GPS_DIST_REQUEST, gpsListener);
} catch (IllegalArgumentException e) {
@ -291,17 +293,55 @@ public class OsmAndLocationProvider implements SensorEventListener {
}
}
private Listener getGpsStatusListener(final LocationManager service) {
gpsStatusListener = new Listener() {
private GpsStatus gpsStatus;
@Override
public void onGpsStatusChanged(int event) {
gpsStatus = service.getGpsStatus(gpsStatus);
updateGPSInfo(gpsStatus);
updateLocation(location);
}
};
return gpsStatusListener;
private void registerGpsStatusListener(final LocationManager service) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
gpsStatusListener = new GnssStatus.Callback() {
@Override
public void onStarted() {
}
@Override
public void onStopped() {
}
@Override
public void onFirstFix(int ttffMillis) {
}
@Override
public void onSatelliteStatusChanged(GnssStatus status) {
int satCount = 0;
boolean fixed = false;
int u = 0;
if(status != null) {
satCount = status.getSatelliteCount();
for (int i = 0; i < satCount; i++) {
if (status.usedInFix(i)) {
u++;
fixed = true;
}
}
}
gpsInfo.fixed = fixed;
gpsInfo.foundSatellites = satCount;
gpsInfo.usedSatellites = u;
updateLocation(location);
}
};
service.registerGnssStatusCallback((GnssStatus.Callback) gpsStatusListener);
} else {
gpsStatusListener = new Listener() {
private GpsStatus gpsStatus;
@Override
public void onGpsStatusChanged(int event) {
gpsStatus = service.getGpsStatus(gpsStatus);
updateGPSInfo(gpsStatus);
updateLocation(location);
}
};
service.addGpsStatusListener((Listener) gpsStatusListener);
}
}
private void updateGPSInfo(GpsStatus s) {
@ -642,7 +682,13 @@ public class OsmAndLocationProvider implements SensorEventListener {
private void stopLocationRequests() {
LocationManager service = (LocationManager) app.getSystemService(Context.LOCATION_SERVICE);
service.removeGpsStatusListener(gpsStatusListener);
if(gpsStatusListener != null) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
service.unregisterGnssStatusCallback((GnssStatus.Callback) gpsStatusListener);
} else {
service.removeGpsStatusListener((Listener) gpsStatusListener);
}
}
service.removeUpdates(gpsListener);
while(!networkListeners.isEmpty()) {
service.removeUpdates(networkListeners.poll());

View file

@ -1349,9 +1349,8 @@ public class OsmandSettings {
return DrivingRegion.JAPAN;
} else if (df.getCountry().equalsIgnoreCase("au")) {
return DrivingRegion.AUSTRALIA;
// potentially wrong in Europe
// } else if(df.getCountry().equalsIgnoreCase(Locale.UK.getCountry())) {
// return DrivingRegion.UK_AND_OTHERS;
} else if(df.getCountry().equalsIgnoreCase(Locale.UK.getCountry())) {
return DrivingRegion.UK_AND_OTHERS;
}
return DrivingRegion.EUROPE_ASIA;
}
@ -1373,6 +1372,29 @@ public class OsmandSettings {
public final OsmandPreference<AngularConstants> ANGULAR_UNITS = new EnumIntPreference<AngularConstants>(
"angular_measurement", AngularConstants.DEGREES, AngularConstants.values()).makeProfile();
public static final String LAST_START_LAT = "last_searched_lat"; //$NON-NLS-1$
public static final String LAST_START_LON = "last_searched_lon"; //$NON-NLS-1$
public LatLon getLastStartPoint() {
if (settingsAPI.contains(globalPreferences, LAST_START_LAT) && settingsAPI.contains(globalPreferences, LAST_START_LON)) {
return new LatLon(settingsAPI.getFloat(globalPreferences, LAST_START_LAT, 0),
settingsAPI.getFloat(globalPreferences, LAST_START_LON, 0));
}
return null;
}
public boolean setLastStartPoint(LatLon l) {
if (l == null) {
return settingsAPI.edit(globalPreferences).remove(LAST_START_LAT).remove(LAST_START_LON).commit();
} else {
return setLastStartPoint(l.getLatitude(), l.getLongitude());
}
}
public boolean setLastStartPoint(double lat, double lon) {
return settingsAPI.edit(globalPreferences).putFloat(LAST_START_LAT, (float) lat).
putFloat(LAST_START_LON, (float) lon).commit();
}
public final OsmandPreference<SpeedConstants> SPEED_SYSTEM = new EnumIntPreference<SpeedConstants>(
"default_speed_system", SpeedConstants.KILOMETERS_PER_HOUR, SpeedConstants.values()) {

View file

@ -445,6 +445,7 @@ public class TargetPointsHelper {
Location lastKnownLocation = ctx.getLocationProvider().getLastKnownLocation();
LatLon latLon = lastKnownLocation != null ?
new LatLon(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude()) : null;
routingHelper.checkAndUpdateStartLocation(latLon);
setMyLocationPoint(latLon, false, null);
}
}

View file

@ -954,7 +954,7 @@ public class FavoritesTreeFragment extends OsmandExpandableListFragment implemen
name.setTextColor(getResources().getColor(visible ? enabledColor : disabledColor));
distanceText.setText(distance);
if (model.isAddressSpecified()) {
distanceText.setText(String.format(getString(R.string.distance_and_address), distance.trim(), model.getAddress()));
distanceText.setText(String.format(getString(R.string.ltr_or_rtl_combine_via_bold_point), distance.trim(), model.getAddress()));
}
icon.setImageDrawable(FavoriteImageDrawable.getOrCreate(getActivity(),
visible ? model.getColor() : getResources().getColor(disabledIconColor), false, model));

View file

@ -7,7 +7,6 @@ import android.view.WindowManager;
import net.osmand.Location;
import net.osmand.StateChangedListener;
import net.osmand.binary.BinaryMapDataObject;
import net.osmand.data.LatLon;
import net.osmand.data.RotatedTileBox;
import net.osmand.map.IMapLocationListener;
@ -28,6 +27,7 @@ import net.osmand.plus.views.AnimateDraggingMapThread;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.util.MapUtils;
import java.io.IOException;
import java.text.SimpleDateFormat;
@ -155,7 +155,7 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
return movingToMyLocation;
}
private void detectDrivingRegion(final LatLon latLon) {
public void detectDrivingRegion(final LatLon latLon) {
new DetectDrivingRegionTask(app).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, latLon);
}
@ -167,7 +167,7 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
locationProvider = location.getProvider();
if (settings.DRIVING_REGION_AUTOMATIC.get() && !drivingRegionUpdated && !app.isApplicationInitializing()) {
drivingRegionUpdated = true;
detectDrivingRegion(new LatLon(location.getLatitude(), location.getLongitude()));
app.getRoutingHelper().checkAndUpdateStartLocation(location);
}
}
if (mapView != null) {
@ -444,7 +444,7 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
isUserZoomed = true;
}
private static class DetectDrivingRegionTask extends AsyncTask<LatLon, Void, BinaryMapDataObject> {
private static class DetectDrivingRegionTask extends AsyncTask<LatLon, Void, WorldRegion> {
private OsmandApplication app;
@ -453,10 +453,10 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
}
@Override
protected BinaryMapDataObject doInBackground(LatLon... latLons) {
protected WorldRegion doInBackground(LatLon... latLons) {
try {
if (latLons != null && latLons.length > 0) {
return app.getRegions().getSmallestBinaryMapDataObjectAt(latLons[0]);
return app.getRegions().getSmallestBinaryMapDataObjectAt(latLons[0]).getKey();
}
} catch (IOException e) {
// ignore
@ -465,13 +465,9 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
}
@Override
protected void onPostExecute(BinaryMapDataObject o) {
if (o != null) {
String fullName = app.getRegions().getFullName(o);
WorldRegion worldRegion = app.getRegions().getRegionData(fullName);
if (worldRegion != null) {
app.setupDrivingRegion(worldRegion);
}
protected void onPostExecute(WorldRegion worldRegion) {
if (worldRegion != null) {
app.setupDrivingRegion(worldRegion);
}
}
}

View file

@ -583,9 +583,29 @@ public class ConfigureMapMenu {
}
}).createItem());
String description = "";
SunriseSunset sunriseSunset = activity.getMyApplication().getDaynightHelper().getSunriseSunset();
if (sunriseSunset != null) {
DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);
String sunriseTime = dateFormat.format(sunriseSunset.getSunrise());
String sunsetTime = dateFormat.format(sunriseSunset.getSunset());
OsmandSettings.DayNightMode dayNightMode = activity.getMyApplication().getSettings().DAYNIGHT_MODE.get();
if (dayNightMode.isDay() || dayNightMode.isNight()) {
if (sunriseSunset.isDaytime()) {
description = String.format(app.getString(R.string.sunset_at), sunsetTime);
} else {
description = String.format(app.getString(R.string.sunrise_at), sunriseTime);
}
} else if (dayNightMode.isAuto() || dayNightMode.isSensor()) {
description = String.format(app.getString(R.string.ltr_or_rtl_combine_via_slash), sunriseTime, sunsetTime);
}
description = String.format(app.getString(R.string.ltr_or_rtl_combine_via_bold_point), getDayNightDescr(activity), description);
} else {
description = getDayNightDescr(activity);
}
adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.map_mode, activity)
.setId(MAP_MODE_ID)
.setDescription(getDayNightDescr(activity)).setLayout(R.layout.list_item_single_line_descrition_narrow)
.setDescription(description)
.setIcon(getDayNightIcon(activity)).setListener(new ItemClickListener() {
@Override
public boolean onContextMenuClick(final ArrayAdapter<ContextMenuItem> ad, int itemId,
@ -595,18 +615,7 @@ public class ConfigureMapMenu {
bld.setTitle(R.string.daynight);
final String[] items = new String[OsmandSettings.DayNightMode.values().length];
for (int i = 0; i < items.length; i++) {
items[i] = OsmandSettings.DayNightMode.values()[i].toHumanString(activity
.getMyApplication());
}
SunriseSunset sunriseSunset = activity.getMyApplication().getDaynightHelper().getSunriseSunset();
if (sunriseSunset != null) {
DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);
String sunriseSunsetTime = "\n" + dateFormat.format(activity.getMyApplication()
.getDaynightHelper().getSunriseSunset().getSunrise()) + "/" +
dateFormat.format(activity.getMyApplication()
.getDaynightHelper().getSunriseSunset().getSunset());
items[0] += sunriseSunsetTime;
items[i] = OsmandSettings.DayNightMode.values()[i].toHumanString(app);
}
int i = view.getSettings().DAYNIGHT_MODE.get().ordinal();
bld.setNegativeButton(R.string.shared_string_dismiss, null);

View file

@ -468,7 +468,7 @@ public class DownloadResources extends DownloadResourceGroup {
List<IndexItem> res = new ArrayList<>();
OsmandRegions regions = app.getRegions();
DownloadIndexesThread downloadThread = app.getDownloadThread();
List<WorldRegion> downloadRegions = regions.getWoldRegionsAt(latLon);
List<WorldRegion> downloadRegions = regions.getWorldRegionsAt(latLon);
for (WorldRegion downloadRegion : downloadRegions) {
if (includeDownloaded || !isIndexItemDownloaded(downloadThread, type, downloadRegion, res)) {
addIndexItem(downloadThread, type, downloadRegion, res);

View file

@ -1,7 +1,6 @@
package net.osmand.plus.download.ui;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
@ -32,7 +31,6 @@ import net.osmand.Collator;
import net.osmand.CollatorStringMatcher;
import net.osmand.OsmAndCollator;
import net.osmand.ResultMatcher;
import net.osmand.binary.BinaryMapDataObject;
import net.osmand.binary.BinaryMapIndexReader;
import net.osmand.binary.BinaryMapIndexReader.SearchRequest;
import net.osmand.data.Amenity;
@ -416,15 +414,13 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven
@Override
protected IndexItem doInBackground(Void... params) {
Amenity amenity = cityItem.getAmenity();
BinaryMapDataObject o = null;
WorldRegion downloadRegion = null;
try {
o = osmandRegions.getSmallestBinaryMapDataObjectAt(amenity.getLocation());
downloadRegion = osmandRegions.getSmallestBinaryMapDataObjectAt(amenity.getLocation()).getKey();
} catch (IOException e) {
// ignore
}
if (o != null) {
String selectedFullName = osmandRegions.getFullName(o);
WorldRegion downloadRegion = osmandRegions.getRegionData(selectedFullName);
if (downloadRegion != null) {
List<IndexItem> indexItems = ctx.getDownloadThread().getIndexes().getIndexItems(downloadRegion);
for (IndexItem item : indexItems) {
if (item.getType() == DownloadActivityType.NORMAL_FILE) {

View file

@ -1281,7 +1281,7 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo
Drawable icon = menu.getRightIcon();
int iconId = menu.getRightIconId();
int sizeId = menu.isBigRightIcon() ? R.dimen.context_menu_big_icon_size : R.dimen.map_widget_icon;
int sizeId = menu.isBigRightIcon() ? R.dimen.context_menu_big_icon_size : R.dimen.dialog_button_height;
int iconViewSize = getResources().getDimensionPixelSize(sizeId);
ViewGroup.LayoutParams params = iconView.getLayoutParams();
params.width = iconViewSize;

View file

@ -366,7 +366,7 @@ public class MapRenderRepositories {
coordinantes[2 * k + 1] = r.getPoint31YTile(k);
}
BinaryMapDataObject mo = new BinaryMapDataObject( r.getId(), coordinantes, new int[0][],
RenderingRulesStorage.LINE_RULES, true, roTypes, null);
RenderingRulesStorage.LINE_RULES, true, roTypes, null, 0,0);
TIntObjectHashMap<String> names = r.getNames();
if(names != null) {
TIntObjectIterator<String> it = names.iterator();
@ -472,7 +472,7 @@ public class MapRenderRepositories {
topY};
BinaryMapDataObject o = new BinaryMapDataObject(-1, coordinates, new int[0][],
RenderingRulesStorage.POLYGON_RULES, true,
new int[]{ocean[0] && !land[0] ? mi.coastlineEncodingType : (mi.landEncodingType)}, null);
new int[]{ocean[0] && !land[0] ? mi.coastlineEncodingType : (mi.landEncodingType)}, null, 0, 0);
o.setMapIndex(mi);
tempResult.add(o);
}
@ -982,7 +982,7 @@ public class MapRenderRepositories {
coordinates[j * 2 + 1] = (int) (ring.get(j) & mask);
}
BinaryMapDataObject o = new BinaryMapDataObject(dbId, coordinates,
new int[0][], RenderingRulesStorage.POLYGON_RULES, true, new int[] { mapIndex.coastlineBrokenEncodingType }, null);
new int[0][], RenderingRulesStorage.POLYGON_RULES, true, new int[] { mapIndex.coastlineBrokenEncodingType }, null, 0,0);
o.setMapIndex(mapIndex);
result.add(o);
}
@ -1002,7 +1002,7 @@ public class MapRenderRepositories {
clockwiseFound = clockwiseFound || clockwise;
BinaryMapDataObject o = new BinaryMapDataObject(dbId, coordinates,
new int[0][], RenderingRulesStorage.POLYGON_RULES, true, new int[] { clockwise ? mapIndex.coastlineEncodingType
: mapIndex.landEncodingType }, null);
: mapIndex.landEncodingType }, null, 0,0);
o.setMapIndex(mapIndex);
o.setArea(true);
result.add(o);
@ -1012,7 +1012,7 @@ public class MapRenderRepositories {
// add complete water tile
BinaryMapDataObject o = new BinaryMapDataObject(dbId,
new int[] { leftX, topY, rightX, topY, rightX, bottomY, leftX, bottomY, leftX, topY },
new int[0][], RenderingRulesStorage.POLYGON_RULES, true, new int[] { mapIndex.coastlineEncodingType }, null);
new int[0][], RenderingRulesStorage.POLYGON_RULES, true, new int[] { mapIndex.coastlineEncodingType }, null, 0,0);
o.setMapIndex(mapIndex);
log.info("!!! Isolated islands !!!"); //$NON-NLS-1$
result.add(o);

View file

@ -39,6 +39,7 @@ public class RoutingHelper {
private static final org.apache.commons.logging.Log log = PlatformUtil.getLog(RoutingHelper.class);
private static final float POSITION_TOLERANCE = 60;
private static final int CACHE_RADIUS = 100000;
private List<WeakReference<IRouteInformationListener>> listeners = new LinkedList<>();
private List<WeakReference<IRoutingDataUpdateListener>> updateListeners = new LinkedList<>();
@ -173,6 +174,7 @@ public class RoutingHelper {
}
public synchronized void setFinalAndCurrentLocation(LatLon finalLocation, List<LatLon> intermediatePoints, Location currentLocation){
checkAndUpdateStartLocation(currentLocation);
RouteCalculationResult previousRoute = route;
clearCurrentRoute(finalLocation, intermediatePoints);
// to update route
@ -259,6 +261,21 @@ public class RoutingHelper {
public LatLon getFinalLocation() {
return finalLocation;
}
public void checkAndUpdateStartLocation(Location nextStartLocation) {
if (nextStartLocation != null) {
checkAndUpdateStartLocation(new LatLon(nextStartLocation.getLatitude(), nextStartLocation.getLongitude()));
}
}
public void checkAndUpdateStartLocation(LatLon newStartLocation) {
if (newStartLocation != null) {
LatLon lastStartLocation = app.getSettings().getLastStartPoint();
if (lastStartLocation == null || MapUtils.getDistance(newStartLocation, lastStartLocation) > CACHE_RADIUS) {
app.getMapViewTrackingUtilities().detectDrivingRegion(newStartLocation);
app.getSettings().setLastStartPoint(newStartLocation);
}
}
}
public List<LatLon> getIntermediatePoints() {
return intermediatePoints;

View file

@ -113,6 +113,7 @@ public class ProfileAppearanceFragment extends BaseSettingsFragment {
profile.routeService = baseModeForNewProfile.getRouteService();
profile.locationIcon = baseModeForNewProfile.getLocationIcon();
profile.navigationIcon = baseModeForNewProfile.getNavigationIcon();
onAppModeChanged(ApplicationMode.valueOfStringKey(baseModeForNewProfile.getStringKey(), null));
} else {
profile.stringKey = getSelectedAppMode().getStringKey();
profile.parent = getSelectedAppMode().getParent();

View file

@ -45,8 +45,10 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
@ -250,7 +252,7 @@ public class DownloadedRegionsLayer extends OsmandMapLayer implements IContextMe
&& zoom >= ZOOM_MIN_TO_SHOW_DOWNLOAD_DIALOG && zoom <= ZOOM_MAX_TO_SHOW_DOWNLOAD_DIALOG
&& currentObjects != null) {
WorldRegion regionData;
List<BinaryMapDataObject> selectedObjects = new ArrayList<>();
Map<WorldRegion, BinaryMapDataObject> selectedObjects = new LinkedHashMap<>();
for (int i = 0; i < currentObjects.size(); i++) {
final BinaryMapDataObject o = currentObjects.get(i);
String fullName = osmandRegions.getFullName(o);
@ -262,7 +264,7 @@ public class DownloadedRegionsLayer extends OsmandMapLayer implements IContextMe
hideDownloadMapToolbar();
return;
} else {
selectedObjects.add(o);
selectedObjects.put(regionData, o);
}
}
}
@ -270,11 +272,8 @@ public class DownloadedRegionsLayer extends OsmandMapLayer implements IContextMe
IndexItem indexItem = null;
String name = null;
BinaryMapDataObject smallestRegion = app.getRegions().getSmallestBinaryMapDataObjectAt(selectedObjects);
if (smallestRegion != null) {
String fullName = osmandRegions.getFullName(smallestRegion);
regionData = osmandRegions.getRegionData(fullName);
regionData = app.getRegions().getSmallestBinaryMapDataObjectAt(selectedObjects).getKey();
if (regionData != null) {
DownloadIndexesThread downloadThread = app.getDownloadThread();
List<IndexItem> indexItems = downloadThread.getIndexes().getIndexItems(regionData);
if (indexItems.size() == 0) {

View file

@ -107,7 +107,7 @@ public class WikiArticleHelper {
List<WorldRegion> regions = null;
if (articleLatLon != null) {
try {
regions = application.getRegions().getWoldRegionsAt(articleLatLon);
regions = application.getRegions().getWorldRegionsAt(articleLatLon);
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
}