Merge branch 'master' of ssh://github.com/osmandapp/Osmand into HEAD
4
LICENSE
|
@ -1,8 +1,8 @@
|
|||
|
||||
OsmAnd – OSM Automated Navigation Directions – navigation software based on OpenStreetMap.
|
||||
Copyright © 2010–2017 OsmAnd BV (Amstelveen, Netherlands - KvK 62066714, BTW 854627704B01).
|
||||
Copyright © 2010–2018 OsmAnd BV (Amstelveen, Netherlands - KvK 62066714, BTW 854627704B01).
|
||||
|
||||
The code in that repository is mainly covered by *GPLv3* (for code) and [ CC-BY-NC-ND 4.0 ](https://creativecommons.org/licenses/by-nc-nd/4.0/) (for artwork with restriction), except some 3rd party libs and resources.
|
||||
The code in this repository is covered by *GPLv3* (for code) and the artwork is covered by [ CC-BY-NC-ND 4.0 ](https://creativecommons.org/licenses/by-nc-nd/4.0/) (for artwork), except some 3rd party libs and resources.
|
||||
ATTENTION: please be aware that some artwork has proprietary license.
|
||||
|
||||
Main AUTHORS (more detailed list in AUTHORS):
|
||||
|
|
|
@ -21,12 +21,15 @@ function copyLibs {
|
|||
|
||||
function compile {
|
||||
"$CORE_LOC/externals/configure.sh"
|
||||
if [ ! -d "$CORE_LOC/targets/amd64-linux-gcc-amd64-linux-gcc-release.baked" ]; then
|
||||
"$CORE_LOC/targets/amd64-linux-gcc.sh" release
|
||||
ARCH=$1
|
||||
if [ ! -d "$CORE_LOC/targets/$ARCH-linux-gcc-$ARCH-linux-gcc-release.baked" ]; then
|
||||
"$CORE_LOC/targets/$ARCH-linux-gcc.sh" release
|
||||
fi
|
||||
(cd "$CORE_LOC/targets/amd64-linux-gcc-amd64-linux-gcc-release.baked" && make -j$OSMAND_BUILD_CPU_CORES_NUM)
|
||||
(cd "$CORE_LOC/targets/$ARCH-linux-gcc-$ARCH-linux-gcc-release.baked" && make -j$OSMAND_BUILD_CPU_CORES_NUM)
|
||||
|
||||
}
|
||||
|
||||
compile
|
||||
compile amd64
|
||||
#compile i686
|
||||
copyLibs linux amd64 amd64 so
|
||||
# copyLibs linux i686 x86 so
|
||||
#copyLibs linux i686 x86 so
|
||||
|
|
|
@ -238,7 +238,7 @@ public class NativeLibrary {
|
|||
|
||||
public static boolean load(String libBaseName, String path) {
|
||||
// look for a pre-installed library
|
||||
if (path != null) {
|
||||
if (path != null && path.length() > 0) {
|
||||
try {
|
||||
System.load(path + "/" + System.mapLibraryName(libBaseName));
|
||||
return true;
|
||||
|
|
|
@ -24,6 +24,7 @@ import net.osmand.binary.OsmandOdb.OsmAndRoutingIndex.RouteDataBox;
|
|||
import net.osmand.binary.OsmandOdb.OsmAndRoutingIndex.RouteEncodingRule;
|
||||
import net.osmand.binary.OsmandOdb.RestrictionData;
|
||||
import net.osmand.binary.OsmandOdb.RouteData;
|
||||
import net.osmand.binary.RouteDataObject.RestrictionInfo;
|
||||
import net.osmand.util.MapUtils;
|
||||
import net.osmand.util.OpeningHoursParser;
|
||||
|
||||
|
@ -329,6 +330,7 @@ public class BinaryMapRouteReaderAdapter {
|
|||
rdo.pointsY = o.pointsY;
|
||||
rdo.id = o.id;
|
||||
rdo.restrictions = o.restrictions;
|
||||
rdo.restrictionsVia = o.restrictionsVia;
|
||||
|
||||
if (o.types != null) {
|
||||
rdo.types = new int[o.types.length];
|
||||
|
@ -649,7 +651,7 @@ public class BinaryMapRouteReaderAdapter {
|
|||
}
|
||||
}
|
||||
private void readRouteTreeData(RouteSubregion routeTree, TLongArrayList idTables,
|
||||
TLongObjectHashMap<TLongArrayList> restrictions) throws IOException {
|
||||
TLongObjectHashMap<RestrictionInfo> restrictions) throws IOException {
|
||||
routeTree.dataObjects = new ArrayList<RouteDataObject>();
|
||||
idTables.clear();
|
||||
restrictions.clear();
|
||||
|
@ -659,17 +661,24 @@ public class BinaryMapRouteReaderAdapter {
|
|||
int tag = WireFormat.getTagFieldNumber(t);
|
||||
switch (tag) {
|
||||
case 0:
|
||||
TLongObjectIterator<TLongArrayList> it = restrictions.iterator();
|
||||
TLongObjectIterator<RestrictionInfo> it = restrictions.iterator();
|
||||
while (it.hasNext()) {
|
||||
it.advance();
|
||||
int from = (int) it.key();
|
||||
RouteDataObject fromr = routeTree.dataObjects.get(from);
|
||||
fromr.restrictions = new long[it.value().size()];
|
||||
fromr.restrictions = new long[it.value().length()];
|
||||
RestrictionInfo val = it.value();
|
||||
for (int k = 0; k < fromr.restrictions.length; k++) {
|
||||
int to = (int) (it.value().get(k) >> RouteDataObject.RESTRICTION_SHIFT);
|
||||
long valto = (idTables.get(to) << RouteDataObject.RESTRICTION_SHIFT) | ((long) it.value().get(k) & RouteDataObject.RESTRICTION_MASK);
|
||||
fromr.restrictions[k] = valto;
|
||||
if(val != null) {
|
||||
long via = 0;
|
||||
if(val.viaWay != 0) {
|
||||
via = idTables.get((int)val.viaWay);
|
||||
}
|
||||
fromr.setRestriction(k, idTables.get((int)val.toWay), val.type, via);
|
||||
}
|
||||
val = val.next;
|
||||
}
|
||||
// fromr.restrictionsVia = new
|
||||
}
|
||||
for (RouteDataObject o : routeTree.dataObjects) {
|
||||
if (o != null) {
|
||||
|
@ -728,33 +737,37 @@ public class BinaryMapRouteReaderAdapter {
|
|||
case RouteDataBlock.RESTRICTIONS_FIELD_NUMBER :
|
||||
length = codedIS.readRawVarint32();
|
||||
oldLimit = codedIS.pushLimit(length);
|
||||
RestrictionInfo ri = new RestrictionInfo();
|
||||
long from = 0;
|
||||
long to = 0;
|
||||
long type = 0;
|
||||
idLoop : while(true){
|
||||
int ts = codedIS.readTag();
|
||||
int tags = WireFormat.getTagFieldNumber(ts);
|
||||
switch (tags) {
|
||||
case 0:
|
||||
break idLoop;
|
||||
case RestrictionData.FROM_FIELD_NUMBER :
|
||||
case RestrictionData.FROM_FIELD_NUMBER:
|
||||
from = codedIS.readInt32();
|
||||
break;
|
||||
case RestrictionData.TO_FIELD_NUMBER :
|
||||
to = codedIS.readInt32();
|
||||
case RestrictionData.TO_FIELD_NUMBER:
|
||||
ri.toWay = codedIS.readInt32();
|
||||
break;
|
||||
case RestrictionData.TYPE_FIELD_NUMBER :
|
||||
type = codedIS.readInt32();
|
||||
case RestrictionData.TYPE_FIELD_NUMBER:
|
||||
ri.type = codedIS.readInt32();
|
||||
break;
|
||||
case RestrictionData.VIA_FIELD_NUMBER:
|
||||
ri.viaWay = codedIS.readInt32();
|
||||
break;
|
||||
default:
|
||||
skipUnknownField(ts);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!restrictions.containsKey(from)) {
|
||||
restrictions.put(from, new TLongArrayList());
|
||||
RestrictionInfo prev = restrictions.get(from);
|
||||
if(prev != null) {
|
||||
prev.next = ri;
|
||||
} else {
|
||||
restrictions.put(from, ri);
|
||||
}
|
||||
restrictions.get(from).add((to << RouteDataObject.RESTRICTION_SHIFT) + type);
|
||||
codedIS.popLimit(oldLimit);
|
||||
break;
|
||||
case RouteDataBlock.STRINGTABLE_FIELD_NUMBER :
|
||||
|
@ -886,7 +899,7 @@ public class BinaryMapRouteReaderAdapter {
|
|||
|
||||
public List<RouteDataObject> loadRouteRegionData(RouteSubregion rs) throws IOException {
|
||||
TLongArrayList idMap = new TLongArrayList();
|
||||
TLongObjectHashMap<TLongArrayList> restrictionMap = new TLongObjectHashMap<TLongArrayList>();
|
||||
TLongObjectHashMap<RestrictionInfo> restrictionMap = new TLongObjectHashMap<RestrictionInfo>();
|
||||
if (rs.dataObjects == null) {
|
||||
codedIS.seek(rs.filePointer + rs.shiftToData);
|
||||
int limit = codedIS.readRawVarint32();
|
||||
|
@ -909,7 +922,7 @@ public class BinaryMapRouteReaderAdapter {
|
|||
}
|
||||
});
|
||||
TLongArrayList idMap = new TLongArrayList();
|
||||
TLongObjectHashMap<TLongArrayList> restrictionMap = new TLongObjectHashMap<TLongArrayList>();
|
||||
TLongObjectHashMap<RestrictionInfo> restrictionMap = new TLongObjectHashMap<RestrictionInfo>();
|
||||
for (RouteSubregion rs : toLoad) {
|
||||
if (rs.dataObjects == null) {
|
||||
codedIS.seek(rs.filePointer + rs.shiftToData);
|
||||
|
|
|
@ -6,11 +6,11 @@ import gnu.trove.map.hash.TIntObjectHashMap;
|
|||
import java.text.MessageFormat;
|
||||
import java.util.Arrays;
|
||||
|
||||
import net.osmand.Location;
|
||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
|
||||
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteTypeRule;
|
||||
import net.osmand.util.Algorithms;
|
||||
import net.osmand.util.MapUtils;
|
||||
import net.osmand.Location;
|
||||
import net.sf.junidecode.Junidecode;
|
||||
|
||||
|
||||
|
@ -26,6 +26,7 @@ public class RouteDataObject {
|
|||
public int[] pointsX;
|
||||
public int[] pointsY;
|
||||
public long[] restrictions;
|
||||
public long[] restrictionsVia;
|
||||
public int[][] pointTypes;
|
||||
public String[][] pointNames;
|
||||
public int[][] pointNameTypes;
|
||||
|
@ -58,6 +59,7 @@ public class RouteDataObject {
|
|||
this.types = copy.types;
|
||||
this.names = copy.names;
|
||||
this.restrictions = copy.restrictions;
|
||||
this.restrictionsVia = copy.restrictionsVia;
|
||||
this.pointTypes = copy.pointTypes;
|
||||
this.pointNames = copy.pointNames;
|
||||
this.pointNameTypes = copy.pointNameTypes;
|
||||
|
@ -77,6 +79,7 @@ public class RouteDataObject {
|
|||
|
||||
boolean equals = true;
|
||||
equals = equals && Arrays.equals(this.restrictions, thatObj.restrictions);
|
||||
equals = equals && Arrays.equals(this.restrictionsVia, thatObj.restrictionsVia);
|
||||
|
||||
if (equals) {
|
||||
if (this.types == null || thatObj.types == null) {
|
||||
|
@ -395,8 +398,21 @@ public class RouteDataObject {
|
|||
return (int) (restrictions[i] & RESTRICTION_MASK);
|
||||
}
|
||||
|
||||
public long getRawRestriction(int i) {
|
||||
return restrictions[i];
|
||||
public RestrictionInfo getRestrictionInfo(int k) {
|
||||
RestrictionInfo ri = new RestrictionInfo();
|
||||
ri.toWay = getRestrictionId(k);
|
||||
ri.type = getRestrictionType(k);
|
||||
if(restrictionsVia != null && k < restrictionsVia.length) {
|
||||
ri.viaWay = restrictionsVia[k];
|
||||
}
|
||||
return ri;
|
||||
}
|
||||
|
||||
public long getRestrictionVia(int i) {
|
||||
if(restrictionsVia != null && restrictionsVia.length > i) {
|
||||
return restrictionsVia[i];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public long getRestrictionId(int i) {
|
||||
|
@ -832,4 +848,40 @@ public class RouteDataObject {
|
|||
return MessageFormat.format("Road id {0} name {1} ref {2}", (getId() / 64) + "", name == null ? "" : name,
|
||||
rf == null ? "" : rf);
|
||||
}
|
||||
|
||||
public static class RestrictionInfo {
|
||||
public int type;
|
||||
public long toWay;
|
||||
public long viaWay;
|
||||
|
||||
public RestrictionInfo next; // optional to simulate linked list
|
||||
|
||||
public int length() {
|
||||
if(next == null) {
|
||||
return 1;
|
||||
}
|
||||
return next.length() + 1;
|
||||
}
|
||||
}
|
||||
|
||||
public void setRestriction(int k, long to, int type, long viaWay) {
|
||||
long valto = (to << RouteDataObject.RESTRICTION_SHIFT) | ((long) type & RouteDataObject.RESTRICTION_MASK);
|
||||
restrictions[k] = valto;
|
||||
if(viaWay != 0) {
|
||||
setRestrictionVia(k, viaWay);
|
||||
}
|
||||
}
|
||||
|
||||
public void setRestrictionVia(int k, long viaWay) {
|
||||
if(restrictionsVia != null) {
|
||||
long[] nrestrictionsVia = new long[Math.max(k + 1, restrictions.length)];
|
||||
System.arraycopy(restrictions, 0, nrestrictionsVia, 0, restrictions.length);
|
||||
restrictionsVia = nrestrictionsVia;
|
||||
} else {
|
||||
restrictionsVia = new long[k + 1];
|
||||
}
|
||||
restrictionsVia[k] = viaWay;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -623,16 +623,17 @@ public class BinaryRoutePlanner {
|
|||
}
|
||||
ctx.segmentsToVisitPrescripted.clear();
|
||||
ctx.segmentsToVisitNotForbidden.clear();
|
||||
processRestriction(ctx, inputNext, reverseWay, false, road);
|
||||
processRestriction(ctx, inputNext, reverseWay, 0, road);
|
||||
if (parent != null) {
|
||||
processRestriction(ctx, inputNext, reverseWay, true, parent.getRoad());
|
||||
processRestriction(ctx, inputNext, reverseWay, road.id, parent.getRoad());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
protected void processRestriction(RoutingContext ctx, RouteSegment inputNext, boolean reverseWay, boolean via,
|
||||
protected void processRestriction(RoutingContext ctx, RouteSegment inputNext, boolean reverseWay, long viaId,
|
||||
RouteDataObject road) {
|
||||
boolean via = viaId != 0;
|
||||
RouteSegment next = inputNext;
|
||||
boolean exclusiveRestriction = false;
|
||||
while (next != null) {
|
||||
|
@ -640,18 +641,22 @@ public class BinaryRoutePlanner {
|
|||
if (!reverseWay) {
|
||||
for (int i = 0; i < road.getRestrictionLength(); i++) {
|
||||
if (road.getRestrictionId(i) == next.road.id) {
|
||||
if(!via || road.getRestrictionVia(i) == viaId) {
|
||||
type = road.getRestrictionType(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < next.road.getRestrictionLength(); i++) {
|
||||
int rt = next.road.getRestrictionType(i);
|
||||
long restrictedTo = next.road.getRestrictionId(i);
|
||||
if (restrictedTo == road.id) {
|
||||
if(!via || next.road.getRestrictionVia(i) == viaId) {
|
||||
type = rt;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if there is restriction only to the other than current road
|
||||
if (rt == MapRenderingTypes.RESTRICTION_ONLY_RIGHT_TURN || rt == MapRenderingTypes.RESTRICTION_ONLY_LEFT_TURN
|
||||
|
|
|
@ -527,6 +527,17 @@ public class SearchUICore {
|
|||
return radius;
|
||||
}
|
||||
|
||||
public int getNextSearchRadius(SearchPhrase phrase) {
|
||||
int radius = Integer.MAX_VALUE;
|
||||
for (SearchCoreAPI api : apis) {
|
||||
int apiNextSearchRadius = api.getNextSearchRadius(phrase);
|
||||
if (apiNextSearchRadius > 0 && apiNextSearchRadius < radius) {
|
||||
radius = apiNextSearchRadius;
|
||||
}
|
||||
}
|
||||
return radius;
|
||||
}
|
||||
|
||||
private void searchInBackground(final SearchPhrase phrase, SearchResultMatcher matcher) {
|
||||
preparePhrase(phrase);
|
||||
ArrayList<SearchCoreAPI> lst = new ArrayList<>(apis);
|
||||
|
|
|
@ -27,4 +27,10 @@ public interface SearchCoreAPI {
|
|||
* @return minimal search radius in meters
|
||||
*/
|
||||
int getMinimalSearchRadius(SearchPhrase phrase);
|
||||
|
||||
/**
|
||||
* @param phrase
|
||||
* @return next search radius in meters
|
||||
*/
|
||||
int getNextSearchRadius(SearchPhrase phrase);
|
||||
}
|
||||
|
|
|
@ -134,6 +134,11 @@ public class SearchCoreFactory {
|
|||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getNextSearchRadius(SearchPhrase phrase) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
protected void subSearchApiOrPublish(SearchPhrase phrase,
|
||||
SearchResultMatcher resultMatcher, SearchResult res, SearchBaseAPI api)
|
||||
throws IOException {
|
||||
|
@ -268,6 +273,11 @@ public class SearchCoreFactory {
|
|||
return phrase.getRadiusSearch(DEFAULT_ADDRESS_BBOX_RADIUS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getNextSearchRadius(SearchPhrase phrase) {
|
||||
return phrase.getNextRadiusSearch(DEFAULT_ADDRESS_BBOX_RADIUS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean search(final SearchPhrase phrase, final SearchResultMatcher resultMatcher) throws IOException {
|
||||
if (!phrase.isUnknownSearchWordPresent() && !phrase.isEmptyQueryAllowed()) {
|
||||
|
@ -592,6 +602,11 @@ public class SearchCoreFactory {
|
|||
public int getMinimalSearchRadius(SearchPhrase phrase) {
|
||||
return phrase.getRadiusSearch(BBOX_RADIUS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getNextSearchRadius(SearchPhrase phrase) {
|
||||
return phrase.getNextRadiusSearch(BBOX_RADIUS);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -736,6 +751,11 @@ public class SearchCoreFactory {
|
|||
return phrase.getRadiusSearch(BBOX_RADIUS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getNextSearchRadius(SearchPhrase phrase) {
|
||||
return phrase.getNextRadiusSearch(BBOX_RADIUS);
|
||||
}
|
||||
|
||||
private Map<PoiCategory, LinkedHashSet<String>> acceptedTypes = new LinkedHashMap<PoiCategory,
|
||||
LinkedHashSet<String>>();
|
||||
private Map<String, PoiType> poiAdditionals = new HashMap<String, PoiType>();
|
||||
|
|
|
@ -663,6 +663,10 @@ public class SearchPhrase {
|
|||
return (1 << (getRadiusLevel() - 1)) * meters;
|
||||
}
|
||||
|
||||
public int getNextRadiusSearch(int meters) {
|
||||
return (1 << (getRadiusLevel())) * meters;
|
||||
}
|
||||
|
||||
public static int icompare(int x, int y) {
|
||||
return (x < y) ? -1 : ((x == y) ? 0 : 1);
|
||||
}
|
||||
|
|
|
@ -1,60 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:descendantFocusability="blocksDescendants"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/card_bg_color"
|
||||
android:minHeight="@dimen/list_item_height_min"
|
||||
android:orientation="horizontal"
|
||||
android:paddingBottom="@dimen/content_padding_half"
|
||||
android:paddingLeft="@dimen/content_padding_standard"
|
||||
android:paddingStart="@dimen/content_padding_standard"
|
||||
android:paddingTop="@dimen/content_padding_half">
|
||||
|
||||
<android.support.v7.widget.AppCompatImageView
|
||||
android:id="@+id/icon"
|
||||
android:layout_width="40dp"
|
||||
android:layout_height="40dp"
|
||||
android:scaleType="centerInside"
|
||||
android:src="@drawable/img_group_picture"
|
||||
android:visibility="visible" />
|
||||
|
||||
<android.support.v7.widget.AppCompatTextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginLeft="@dimen/content_padding_half"
|
||||
android:layout_marginStart="@dimen/content_padding_half"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_vertical"
|
||||
tools:text="Group name" />
|
||||
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/share_location_switch"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginEnd="@dimen/content_padding_half"
|
||||
android:layout_marginLeft="@dimen/content_padding_standard"
|
||||
android:layout_marginRight="@dimen/content_padding_half"
|
||||
android:layout_marginStart="@dimen/content_padding_standard"
|
||||
android:focusableInTouchMode="true" />
|
||||
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/show_on_map_switch"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginEnd="@dimen/content_padding_standard"
|
||||
android:layout_marginLeft="@dimen/content_padding_half"
|
||||
android:layout_marginRight="@dimen/content_padding_standard"
|
||||
android:layout_marginStart="@dimen/content_padding_half"
|
||||
android:focusableInTouchMode="true" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
|
@ -12,12 +12,26 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:background="?attr/card_bg_color">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/my_location_image"
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/my_location_image_height"
|
||||
android:background="@android:color/holo_green_light"
|
||||
app:layout_scrollFlags="scroll"/>
|
||||
app:layout_scrollFlags="scroll">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="center"
|
||||
android:src="@drawable/img_my_location_roadbg"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/my_location_user_image"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:paddingTop="@dimen/content_padding_standard"
|
||||
tools:src="@drawable/img_my_location_user"/>
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/text_container"
|
||||
|
@ -28,22 +42,39 @@
|
|||
android:paddingLeft="@dimen/my_location_text_sides_margin"
|
||||
android:paddingRight="@dimen/my_location_text_sides_margin">
|
||||
|
||||
<FrameLayout
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/action_bar_height">
|
||||
|
||||
<net.osmand.telegram.ui.views.TextViewEx
|
||||
android:id="@+id/title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_weight="1"
|
||||
android:ellipsize="end"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:text="@string/start_location_sharing"
|
||||
android:textColor="?attr/ctrl_active_color"
|
||||
android:textSize="@dimen/title_text_size"
|
||||
app:typeface="@string/font_roboto_mono_bold"/>
|
||||
|
||||
</FrameLayout>
|
||||
<ImageView
|
||||
android:id="@+id/options"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginLeft="@dimen/content_padding_standard"
|
||||
android:layout_marginStart="@dimen/content_padding_standard"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:paddingLeft="@dimen/content_padding_half"
|
||||
android:paddingRight="@dimen/content_padding_half"
|
||||
android:visibility="gone"
|
||||
tools:src="@drawable/ic_action_other_menu"
|
||||
tools:tint="@color/icon_light"
|
||||
tools:visibility="visible"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/description"
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true"
|
||||
android:background="?attr/card_bg_color"
|
||||
android:orientation="vertical">
|
||||
|
||||
|
|
|
@ -25,7 +25,9 @@
|
|||
<item name="primary_btn_bg">@drawable/primary_btn_bg_light</item>
|
||||
<item name="primary_btn_text_color">@color/primary_btn_text_light</item>
|
||||
<item name="secondary_btn_bg">@drawable/secondary_btn_bg_light</item>
|
||||
|
||||
<item name="android:windowTranslucentStatus">true</item>
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
<item name="bottom_nav_shadow">@drawable/bg_bottom_bar_shadow_with_line_day</item>
|
||||
</style>
|
||||
|
||||
|
|
|
@ -16,6 +16,14 @@ public class AMapLayer implements Parcelable {
|
|||
private float zOrder = 5.5f;
|
||||
private Map<String, AMapPoint> points = new ConcurrentHashMap<>();
|
||||
|
||||
private boolean imagePoints = false;
|
||||
private int circlePointMinZoom = 0;
|
||||
private int circlePointMaxZoom = 6;
|
||||
private int smallPointMinZoom = 7;
|
||||
private int smallPointMaxZoom = 13;
|
||||
private int bigPointMinZoom = 14;
|
||||
private int bigPointMaxZoom = 22;
|
||||
|
||||
public AMapLayer(String id, String name, float zOrder, List<AMapPoint> pointList) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
|
@ -70,11 +78,74 @@ public class AMapLayer implements Parcelable {
|
|||
points.remove(pointId);
|
||||
}
|
||||
|
||||
public boolean isImagePoints() {
|
||||
return imagePoints;
|
||||
}
|
||||
|
||||
public void setImagePoints(boolean imagePoints) {
|
||||
this.imagePoints = imagePoints;
|
||||
}
|
||||
|
||||
public void copyZoomBounds(AMapLayer layer) {
|
||||
circlePointMinZoom = layer.circlePointMinZoom;
|
||||
circlePointMaxZoom = layer.circlePointMaxZoom;
|
||||
smallPointMinZoom = layer.smallPointMinZoom;
|
||||
smallPointMaxZoom = layer.smallPointMaxZoom;
|
||||
bigPointMinZoom = layer.bigPointMinZoom;
|
||||
bigPointMaxZoom = layer.bigPointMaxZoom;
|
||||
}
|
||||
|
||||
public void setCirclePointZoomBounds(int min, int max) {
|
||||
circlePointMinZoom = min;
|
||||
circlePointMaxZoom = max;
|
||||
}
|
||||
|
||||
public void setSmallPointZoomBounds(int min, int max) {
|
||||
smallPointMinZoom = min;
|
||||
smallPointMaxZoom = max;
|
||||
}
|
||||
|
||||
public void setBigPointZoomBounds(int min, int max) {
|
||||
bigPointMinZoom = min;
|
||||
bigPointMaxZoom = max;
|
||||
}
|
||||
|
||||
public int getCirclePointMinZoom() {
|
||||
return circlePointMinZoom;
|
||||
}
|
||||
|
||||
public int getCirclePointMaxZoom() {
|
||||
return circlePointMaxZoom;
|
||||
}
|
||||
|
||||
public int getSmallPointMinZoom() {
|
||||
return smallPointMinZoom;
|
||||
}
|
||||
|
||||
public int getSmallPointMaxZoom() {
|
||||
return smallPointMaxZoom;
|
||||
}
|
||||
|
||||
public int getBigPointMinZoom() {
|
||||
return bigPointMinZoom;
|
||||
}
|
||||
|
||||
public int getBigPointMaxZoom() {
|
||||
return bigPointMaxZoom;
|
||||
}
|
||||
|
||||
public void writeToParcel(Parcel out, int flags) {
|
||||
out.writeString(id);
|
||||
out.writeString(name);
|
||||
out.writeFloat(zOrder);
|
||||
out.writeTypedList(new ArrayList<>(points.values()));
|
||||
out.writeByte((byte) (imagePoints ? 1 : 0));
|
||||
out.writeInt(circlePointMinZoom);
|
||||
out.writeInt(circlePointMaxZoom);
|
||||
out.writeInt(smallPointMinZoom);
|
||||
out.writeInt(smallPointMaxZoom);
|
||||
out.writeInt(bigPointMinZoom);
|
||||
out.writeInt(bigPointMaxZoom);
|
||||
}
|
||||
|
||||
private void readFromParcel(Parcel in) {
|
||||
|
@ -86,6 +157,13 @@ public class AMapLayer implements Parcelable {
|
|||
for (AMapPoint p : pointList) {
|
||||
this.points.put(p.getId(), p);
|
||||
}
|
||||
imagePoints = in.readByte() == 1;
|
||||
circlePointMinZoom = in.readInt();
|
||||
circlePointMaxZoom = in.readInt();
|
||||
smallPointMinZoom = in.readInt();
|
||||
smallPointMaxZoom = in.readInt();
|
||||
bigPointMinZoom = in.readInt();
|
||||
bigPointMaxZoom = in.readInt();
|
||||
}
|
||||
|
||||
public int describeContents() {
|
||||
|
|
|
@ -246,9 +246,9 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
|
|||
}
|
||||
}
|
||||
|
||||
override fun onReceiveChatLocationMessages(chatTitle: String, vararg messages: TdApi.Message) {
|
||||
override fun onReceiveChatLocationMessages(chatId: Long, vararg messages: TdApi.Message) {
|
||||
val app = app()
|
||||
if (app.settings.isShowingChatOnMap(chatTitle)) {
|
||||
if (app.settings.isShowingChatOnMap(chatId)) {
|
||||
ShowMessagesTask(app).executeOnExecutor(executor, *messages)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package net.osmand.telegram
|
||||
|
||||
import android.content.Context
|
||||
import net.osmand.telegram.helpers.TelegramHelper
|
||||
import net.osmand.telegram.utils.OsmandFormatter.MetricsConstants
|
||||
import net.osmand.telegram.utils.OsmandFormatter.SpeedConstants
|
||||
|
||||
|
@ -18,10 +19,16 @@ private const val SEND_MY_LOCATION_INTERVAL_DEFAULT = 5L * 1000 // 5 seconds
|
|||
private const val USER_LOCATION_EXPIRE_TIME_KEY = "user_location_expire_time"
|
||||
private const val USER_LOCATION_EXPIRE_TIME_DEFAULT = 15L * 60 * 1000 // 15 minutes
|
||||
|
||||
private const val DEFAULT_VISIBLE_TIME_SECONDS = 60 * 60L // 1 hour
|
||||
|
||||
private const val TITLES_REPLACED_WITH_IDS = "changed_to_chat_id"
|
||||
|
||||
class TelegramSettings(private val app: TelegramApplication) {
|
||||
|
||||
private var shareLocationChats: Set<String> = emptySet()
|
||||
private var showOnMapChats: Set<String> = emptySet()
|
||||
var chatLivePeriods = mutableMapOf<Long, Long>()
|
||||
|
||||
private var shareLocationChats: Set<Long> = emptySet()
|
||||
private var showOnMapChats: Set<Long> = emptySet()
|
||||
|
||||
var metricsConstants = MetricsConstants.KILOMETERS_AND_METERS
|
||||
var speedConstants = SpeedConstants.KILOMETERS_PER_HOUR
|
||||
|
@ -30,47 +37,62 @@ class TelegramSettings(private val app: TelegramApplication) {
|
|||
var userLocationExpireTime = USER_LOCATION_EXPIRE_TIME_DEFAULT
|
||||
|
||||
init {
|
||||
updatePrefs()
|
||||
read()
|
||||
}
|
||||
|
||||
fun hasAnyChatToShareLocation() = shareLocationChats.isNotEmpty()
|
||||
|
||||
fun isSharingLocationToChat(chatTitle: String) = shareLocationChats.contains(chatTitle)
|
||||
fun isSharingLocationToChat(chatId: Long) = shareLocationChats.contains(chatId)
|
||||
|
||||
fun hasAnyChatToShowOnMap() = showOnMapChats.isNotEmpty()
|
||||
|
||||
fun isShowingChatOnMap(chatTitle: String) = showOnMapChats.contains(chatTitle)
|
||||
fun isShowingChatOnMap(chatId: Long) = showOnMapChats.contains(chatId)
|
||||
|
||||
fun removeNonexistingChats(presentChatTitles: List<String>) {
|
||||
fun removeNonexistingChats(presentChatIds: List<Long>) {
|
||||
val shareLocationChats = shareLocationChats.toMutableList()
|
||||
shareLocationChats.intersect(presentChatTitles)
|
||||
shareLocationChats.intersect(presentChatIds)
|
||||
this.shareLocationChats = shareLocationChats.toHashSet()
|
||||
|
||||
val showOnMapChats = showOnMapChats.toMutableList()
|
||||
showOnMapChats.intersect(presentChatTitles)
|
||||
showOnMapChats.intersect(presentChatIds)
|
||||
this.showOnMapChats = showOnMapChats.toHashSet()
|
||||
|
||||
chatLivePeriods = chatLivePeriods.filter { (key, _) ->
|
||||
presentChatIds.contains(key)
|
||||
}.toMutableMap()
|
||||
}
|
||||
|
||||
fun shareLocationToChat(chatTitle: String, share: Boolean) {
|
||||
fun shareLocationToChat(chatId: Long, share: Boolean, livePeriod: Long = DEFAULT_VISIBLE_TIME_SECONDS) {
|
||||
val shareLocationChats = shareLocationChats.toMutableList()
|
||||
if (share) {
|
||||
shareLocationChats.add(chatTitle)
|
||||
val lp: Long = when {
|
||||
livePeriod < TelegramHelper.MIN_LOCATION_MESSAGE_LIVE_PERIOD_SEC -> TelegramHelper.MIN_LOCATION_MESSAGE_LIVE_PERIOD_SEC.toLong()
|
||||
livePeriod > TelegramHelper.MAX_LOCATION_MESSAGE_LIVE_PERIOD_SEC -> TelegramHelper.MAX_LOCATION_MESSAGE_LIVE_PERIOD_SEC.toLong()
|
||||
else -> livePeriod
|
||||
}
|
||||
chatLivePeriods[chatId] = lp
|
||||
shareLocationChats.add(chatId)
|
||||
} else {
|
||||
shareLocationChats.remove(chatTitle)
|
||||
shareLocationChats.remove(chatId)
|
||||
chatLivePeriods.remove(chatId)
|
||||
}
|
||||
this.shareLocationChats = shareLocationChats.toHashSet()
|
||||
}
|
||||
|
||||
fun getChatLivePeriod(chatId: Long) = chatLivePeriods[chatId]
|
||||
|
||||
fun stopSharingLocationToChats() {
|
||||
this.shareLocationChats = emptySet()
|
||||
this.chatLivePeriods.clear()
|
||||
}
|
||||
|
||||
fun showChatOnMap(chatTitle: String, show: Boolean) {
|
||||
fun showChatOnMap(chatId: Long, show: Boolean) {
|
||||
val showOnMapChats = showOnMapChats.toMutableList()
|
||||
if (show) {
|
||||
showOnMapChats.add(chatTitle)
|
||||
showOnMapChats.add(chatId)
|
||||
} else {
|
||||
showOnMapChats.remove(chatTitle)
|
||||
showOnMapChats.remove(chatId)
|
||||
}
|
||||
this.showOnMapChats = showOnMapChats.toHashSet()
|
||||
}
|
||||
|
@ -87,15 +109,15 @@ class TelegramSettings(private val app: TelegramApplication) {
|
|||
|
||||
val shareLocationChatsSet = mutableSetOf<String>()
|
||||
val shareLocationChats = ArrayList(shareLocationChats)
|
||||
for (chatTitle in shareLocationChats) {
|
||||
shareLocationChatsSet.add(chatTitle)
|
||||
for (chatId in shareLocationChats) {
|
||||
shareLocationChatsSet.add(chatId.toString())
|
||||
}
|
||||
edit.putStringSet(SHARE_LOCATION_CHATS_KEY, shareLocationChatsSet)
|
||||
|
||||
val showOnMapChatsSet = mutableSetOf<String>()
|
||||
val showOnMapChats = ArrayList(showOnMapChats)
|
||||
for (chatTitle in showOnMapChats) {
|
||||
showOnMapChatsSet.add(chatTitle)
|
||||
for (chatId in showOnMapChats) {
|
||||
showOnMapChatsSet.add(chatId.toString())
|
||||
}
|
||||
edit.putStringSet(SHOW_ON_MAP_CHATS_KEY, showOnMapChatsSet)
|
||||
|
||||
|
@ -110,17 +132,17 @@ class TelegramSettings(private val app: TelegramApplication) {
|
|||
fun read() {
|
||||
val prefs = app.getSharedPreferences(SETTINGS_NAME, Context.MODE_PRIVATE)
|
||||
|
||||
val shareLocationChats = mutableSetOf<String>()
|
||||
val shareLocationChats = mutableSetOf<Long>()
|
||||
val shareLocationChatsSet = prefs.getStringSet(SHARE_LOCATION_CHATS_KEY, mutableSetOf())
|
||||
for (chatTitle in shareLocationChatsSet) {
|
||||
shareLocationChats.add(chatTitle)
|
||||
for (chatId in shareLocationChatsSet) {
|
||||
shareLocationChats.add(chatId.toLong())
|
||||
}
|
||||
this.shareLocationChats = shareLocationChats
|
||||
|
||||
val showOnMapChats = mutableSetOf<String>()
|
||||
val showOnMapChats = mutableSetOf<Long>()
|
||||
val showOnMapChatsSet = prefs.getStringSet(SHOW_ON_MAP_CHATS_KEY, mutableSetOf())
|
||||
for (chatTitle in showOnMapChatsSet) {
|
||||
showOnMapChats.add(chatTitle)
|
||||
for (chatId in showOnMapChatsSet) {
|
||||
showOnMapChats.add(chatId.toLong())
|
||||
}
|
||||
this.showOnMapChats = showOnMapChats
|
||||
|
||||
|
@ -136,4 +158,18 @@ class TelegramSettings(private val app: TelegramApplication) {
|
|||
userLocationExpireTime =
|
||||
prefs.getLong(USER_LOCATION_EXPIRE_TIME_KEY, USER_LOCATION_EXPIRE_TIME_DEFAULT)
|
||||
}
|
||||
|
||||
private fun updatePrefs() {
|
||||
val prefs = app.getSharedPreferences(SETTINGS_NAME, Context.MODE_PRIVATE)
|
||||
val idsInUse = prefs.getBoolean(TITLES_REPLACED_WITH_IDS, false)
|
||||
if (!idsInUse) {
|
||||
val edit = prefs.edit()
|
||||
|
||||
edit.putStringSet(SHARE_LOCATION_CHATS_KEY, emptySet())
|
||||
edit.putStringSet(SHOW_ON_MAP_CHATS_KEY, emptySet())
|
||||
edit.putBoolean(TITLES_REPLACED_WITH_IDS, true)
|
||||
|
||||
edit.apply()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -474,6 +474,7 @@ class OsmandAidlHelper(private val app: Application) {
|
|||
if (mIOsmAndAidlInterface != null) {
|
||||
try {
|
||||
val layer = AMapLayer(id, name, zOrder, points)
|
||||
layer.isImagePoints = true
|
||||
return mIOsmAndAidlInterface!!.addMapLayer(AddMapLayerParams(layer))
|
||||
} catch (e: RemoteException) {
|
||||
e.printStackTrace()
|
||||
|
@ -495,6 +496,7 @@ class OsmandAidlHelper(private val app: Application) {
|
|||
if (mIOsmAndAidlInterface != null) {
|
||||
try {
|
||||
val layer = AMapLayer(id, name, zOrder, points)
|
||||
layer.isImagePoints = true
|
||||
return mIOsmAndAidlInterface!!.updateMapLayer(UpdateMapLayerParams(layer))
|
||||
} catch (e: RemoteException) {
|
||||
e.printStackTrace()
|
||||
|
|
|
@ -38,9 +38,9 @@ class ShareLocationHelper(private val app: TelegramApplication) {
|
|||
lastLocation = location
|
||||
|
||||
if (location != null && app.isInternetConnectionAvailable) {
|
||||
val shareLocationChats = app.settings.getShareLocationChats()
|
||||
if (shareLocationChats.isNotEmpty()) {
|
||||
app.telegramHelper.sendLiveLocationMessage(shareLocationChats, MAX_LOCATION_MESSAGE_LIVE_PERIOD_SEC, location.latitude, location.longitude)
|
||||
val chatLivePeriods = app.settings.chatLivePeriods
|
||||
if (chatLivePeriods.isNotEmpty()) {
|
||||
app.telegramHelper.sendLiveLocationMessage(chatLivePeriods, location.latitude, location.longitude)
|
||||
}
|
||||
lastLocationMessageSentTime = System.currentTimeMillis()
|
||||
}
|
||||
|
|
|
@ -53,11 +53,10 @@ class ShowLocationHelper(private val app: TelegramApplication) {
|
|||
execOsmandApi {
|
||||
val messages = telegramHelper.getMessages()
|
||||
for (message in messages) {
|
||||
val chatTitle = telegramHelper.getChat(message.chatId)?.title
|
||||
val date = Math.max(message.date, message.editDate) * 1000L
|
||||
val expired = System.currentTimeMillis() - date > app.settings.userLocationExpireTime
|
||||
if (chatTitle != null && expired) {
|
||||
removeMapPoint(chatTitle, message)
|
||||
if (expired) {
|
||||
removeMapPoint(message.chatId, message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -65,6 +64,7 @@ class ShowLocationHelper(private val app: TelegramApplication) {
|
|||
|
||||
fun addLocationToMap(message: TdApi.Message) {
|
||||
execOsmandApi {
|
||||
val chatId = message.chatId
|
||||
val chatTitle = telegramHelper.getChat(message.chatId)?.title
|
||||
val content = message.content
|
||||
if (chatTitle != null && content is TdApi.MessageLocation) {
|
||||
|
@ -86,33 +86,33 @@ class ShowLocationHelper(private val app: TelegramApplication) {
|
|||
}
|
||||
setupMapLayer()
|
||||
val params = generatePhotoParams(photoPath)
|
||||
osmandAidlHelper.addMapPoint(MAP_LAYER_ID, "${chatTitle}_${message.senderUserId}", userName, userName,
|
||||
osmandAidlHelper.addMapPoint(MAP_LAYER_ID, "${chatId}_${message.senderUserId}", userName, userName,
|
||||
chatTitle, Color.RED, ALatLon(content.location.latitude, content.location.longitude), null, params)
|
||||
} else if (chatTitle != null && content is MessageOsmAndBotLocation && content.isValid()) {
|
||||
val name = content.name
|
||||
setupMapLayer()
|
||||
osmandAidlHelper.addMapPoint(MAP_LAYER_ID, "${chatTitle}_$name", name, name,
|
||||
osmandAidlHelper.addMapPoint(MAP_LAYER_ID, "${chatId}_$name", name, name,
|
||||
chatTitle, Color.RED, ALatLon(content.lat, content.lon), null, null)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun showChatMessages(chatTitle: String) {
|
||||
fun showChatMessages(chatId: Long) {
|
||||
execOsmandApi {
|
||||
val messages = telegramHelper.getChatMessages(chatTitle)
|
||||
val messages = telegramHelper.getChatMessages(chatId)
|
||||
for (message in messages) {
|
||||
addLocationToMap(message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun hideChatMessages(chatTitle: String) {
|
||||
fun hideChatMessages(chatId: Long) {
|
||||
execOsmandApi {
|
||||
val messages = telegramHelper.getChatMessages(chatTitle)
|
||||
val messages = telegramHelper.getChatMessages(chatId)
|
||||
for (message in messages) {
|
||||
val user = telegramHelper.getUser(message.senderUserId)
|
||||
if (user != null) {
|
||||
removeMapPoint(chatTitle, message)
|
||||
removeMapPoint(chatId, message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -145,12 +145,12 @@ class ShowLocationHelper(private val app: TelegramApplication) {
|
|||
return mapOf(AMapPoint.POINT_IMAGE_URI_PARAM to photoUri.toString())
|
||||
}
|
||||
|
||||
private fun removeMapPoint(chatTitle: String, message: TdApi.Message) {
|
||||
private fun removeMapPoint(chatId: Long, message: TdApi.Message) {
|
||||
val content = message.content
|
||||
if (content is TdApi.MessageLocation) {
|
||||
osmandAidlHelper.removeMapPoint(MAP_LAYER_ID, "${chatTitle}_${message.senderUserId}")
|
||||
osmandAidlHelper.removeMapPoint(MAP_LAYER_ID, "${chatId}_${message.senderUserId}")
|
||||
} else if (content is MessageOsmAndBotLocation) {
|
||||
osmandAidlHelper.removeMapPoint(MAP_LAYER_ID, "${chatTitle}_${content.name}")
|
||||
osmandAidlHelper.removeMapPoint(MAP_LAYER_ID, "${chatId}_${content.name}")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -49,7 +49,6 @@ class TelegramHelper private constructor() {
|
|||
private val secretChats = ConcurrentHashMap<Int, TdApi.SecretChat>()
|
||||
|
||||
private val chats = ConcurrentHashMap<Long, TdApi.Chat>()
|
||||
private val chatTitles = ConcurrentHashMap<String, Long>()
|
||||
private val chatList = TreeSet<OrderedChat>()
|
||||
private val chatLiveMessages = ConcurrentHashMap<Long, Long>()
|
||||
|
||||
|
@ -98,7 +97,7 @@ class TelegramHelper private constructor() {
|
|||
}
|
||||
}
|
||||
|
||||
fun getChatTitles() = chatTitles.keys().toList()
|
||||
fun getChatIds() = chats.keys().toList()
|
||||
|
||||
fun getChat(id: Long) = chats[id]
|
||||
|
||||
|
@ -107,8 +106,8 @@ class TelegramHelper private constructor() {
|
|||
fun getUserMessage(user: TdApi.User) =
|
||||
usersLocationMessages.values.firstOrNull { it.senderUserId == user.id }
|
||||
|
||||
fun getChatMessages(chatTitle: String) =
|
||||
usersLocationMessages.values.filter { chats[it.chatId]?.title == chatTitle }
|
||||
fun getChatMessages(chatId: Long) =
|
||||
usersLocationMessages.values.filter { it.chatId == chatId }
|
||||
|
||||
fun getMessages() = usersLocationMessages.values.toList()
|
||||
|
||||
|
@ -130,11 +129,8 @@ class TelegramHelper private constructor() {
|
|||
|
||||
fun getSupergroupFullInfo(id: Int) = supergroupsFullInfo[id]
|
||||
|
||||
private fun updateChatTitles() {
|
||||
chatTitles.clear()
|
||||
for (chatEntry in chats.entries) {
|
||||
chatTitles[chatEntry.value.title] = chatEntry.key
|
||||
}
|
||||
fun isGroup(chat: TdApi.Chat): Boolean {
|
||||
return chat.type is TdApi.ChatTypeSupergroup || chat.type is TdApi.ChatTypeBasicGroup
|
||||
}
|
||||
|
||||
private fun isChannel(chat: TdApi.Chat): Boolean {
|
||||
|
@ -172,7 +168,7 @@ class TelegramHelper private constructor() {
|
|||
}
|
||||
|
||||
interface TelegramIncomingMessagesListener {
|
||||
fun onReceiveChatLocationMessages(chatTitle: String, vararg messages: TdApi.Message)
|
||||
fun onReceiveChatLocationMessages(chatId: Long, vararg messages: TdApi.Message)
|
||||
fun updateLocationMessages()
|
||||
}
|
||||
|
||||
|
@ -346,7 +342,6 @@ class TelegramHelper private constructor() {
|
|||
return
|
||||
}
|
||||
}
|
||||
updateChatTitles()
|
||||
listener?.onTelegramChatsRead()
|
||||
}
|
||||
|
||||
|
@ -372,11 +367,8 @@ class TelegramHelper private constructor() {
|
|||
}
|
||||
removeOldMessages(message.senderUserId, message.chatId)
|
||||
usersLocationMessages[message.id] = message
|
||||
val chatTitle = chats[message.chatId]?.title
|
||||
if (chatTitle != null) {
|
||||
incomingMessagesListeners.forEach {
|
||||
it.onReceiveChatLocationMessages(chatTitle, message)
|
||||
}
|
||||
it.onReceiveChatLocationMessages(message.chatId, message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -397,15 +389,15 @@ class TelegramHelper private constructor() {
|
|||
* @latitude Latitude of the location
|
||||
* @longitude Longitude of the location
|
||||
*/
|
||||
fun sendLiveLocationMessage(chatTitles: List<String>, livePeriod: Int, latitude: Double, longitude: Double): Boolean {
|
||||
fun sendLiveLocationMessage(chatLivePeriods: Map<Long, Long>, latitude: Double, longitude: Double): Boolean {
|
||||
if (!requestingActiveLiveLocationMessages && haveAuthorization) {
|
||||
if (needRefreshActiveLiveLocationMessages) {
|
||||
getActiveLiveLocationMessages {
|
||||
sendLiveLocationImpl(chatTitles, livePeriod, latitude, longitude)
|
||||
sendLiveLocationImpl(chatLivePeriods, latitude, longitude)
|
||||
}
|
||||
needRefreshActiveLiveLocationMessages = false
|
||||
} else {
|
||||
sendLiveLocationImpl(chatTitles, livePeriod, latitude, longitude)
|
||||
sendLiveLocationImpl(chatLivePeriods, latitude, longitude)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
@ -440,27 +432,24 @@ class TelegramHelper private constructor() {
|
|||
}
|
||||
}
|
||||
|
||||
private fun sendLiveLocationImpl(chatTitles: List<String>, livePeriod: Int, latitude: Double, longitude: Double) {
|
||||
val lp = when {
|
||||
livePeriod < MIN_LOCATION_MESSAGE_LIVE_PERIOD_SEC -> MIN_LOCATION_MESSAGE_LIVE_PERIOD_SEC
|
||||
livePeriod > MAX_LOCATION_MESSAGE_LIVE_PERIOD_SEC -> MAX_LOCATION_MESSAGE_LIVE_PERIOD_SEC
|
||||
else -> livePeriod
|
||||
}
|
||||
private fun sendLiveLocationImpl(chatLivePeriods: Map<Long, Long>, latitude: Double, longitude: Double) {
|
||||
val location = TdApi.Location(latitude, longitude)
|
||||
val content = TdApi.InputMessageLocation(location, lp)
|
||||
|
||||
for (chatTitle in chatTitles) {
|
||||
val chatId = this.chatTitles[chatTitle]
|
||||
if (chatId != null) {
|
||||
chatLivePeriods.forEach { chatId, livePeriod ->
|
||||
val content = TdApi.InputMessageLocation(location, livePeriod.toInt())
|
||||
val msgId = chatLiveMessages[chatId]
|
||||
if (msgId != null) {
|
||||
if (msgId != 0L) {
|
||||
client?.send(TdApi.EditMessageLiveLocation(chatId, msgId, null, location), liveLocationMessageUpdatesHandler)
|
||||
client?.send(
|
||||
TdApi.EditMessageLiveLocation(chatId, msgId, null, location),
|
||||
liveLocationMessageUpdatesHandler
|
||||
)
|
||||
}
|
||||
} else {
|
||||
chatLiveMessages[chatId] = 0L
|
||||
client?.send(TdApi.SendMessage(chatId, 0, false, true, null, content), liveLocationMessageUpdatesHandler)
|
||||
}
|
||||
client?.send(
|
||||
TdApi.SendMessage(chatId, 0, false, true, null, content),
|
||||
liveLocationMessageUpdatesHandler
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -761,7 +750,6 @@ class TelegramHelper private constructor() {
|
|||
chat.order = 0
|
||||
setChatOrder(chat, order)
|
||||
}
|
||||
updateChatTitles()
|
||||
listener?.onTelegramChatsChanged()
|
||||
}
|
||||
TdApi.UpdateChatTitle.CONSTRUCTOR -> {
|
||||
|
@ -771,7 +759,6 @@ class TelegramHelper private constructor() {
|
|||
synchronized(chat) {
|
||||
chat.title = updateChat.title
|
||||
}
|
||||
updateChatTitles()
|
||||
listener?.onTelegramChatChanged(chat)
|
||||
}
|
||||
}
|
||||
|
@ -856,11 +843,8 @@ class TelegramHelper private constructor() {
|
|||
synchronized(message) {
|
||||
message.editDate = updateMessageEdited.editDate
|
||||
}
|
||||
val chatTitle = chats[message.chatId]?.title
|
||||
if (chatTitle != null) {
|
||||
incomingMessagesListeners.forEach {
|
||||
it.onReceiveChatLocationMessages(chatTitle, message)
|
||||
}
|
||||
it.onReceiveChatLocationMessages(message.chatId, message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -880,11 +864,8 @@ class TelegramHelper private constructor() {
|
|||
newContent
|
||||
}
|
||||
}
|
||||
val chatTitle = chats[message.chatId]?.title
|
||||
if (chatTitle != null) {
|
||||
incomingMessagesListeners.forEach {
|
||||
it.onReceiveChatLocationMessages(chatTitle, message)
|
||||
}
|
||||
it.onReceiveChatLocationMessages(message.chatId, message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,7 +15,8 @@ object TelegramUiHelper {
|
|||
app: TelegramApplication,
|
||||
iv: ImageView?,
|
||||
photoPath: String?,
|
||||
placeholderId: Int = R.drawable.ic_group
|
||||
placeholderId: Int,
|
||||
useThemedIcon: Boolean
|
||||
) {
|
||||
if (iv == null) {
|
||||
return
|
||||
|
@ -26,7 +27,11 @@ object TelegramUiHelper {
|
|||
bitmap = app.uiUtils.getCircleBitmap(photoPath)
|
||||
}
|
||||
if (bitmap == null) {
|
||||
drawable = app.uiUtils.getThemedIcon(placeholderId)
|
||||
drawable = if (useThemedIcon) {
|
||||
app.uiUtils.getThemedIcon(placeholderId)
|
||||
} else {
|
||||
app.uiUtils.getIcon(placeholderId)
|
||||
}
|
||||
}
|
||||
if (bitmap != null) {
|
||||
iv.setImageBitmap(bitmap)
|
||||
|
@ -41,9 +46,10 @@ object TelegramUiHelper {
|
|||
messages: List<TdApi.Message>
|
||||
): ChatItem {
|
||||
val res = ChatItem().apply {
|
||||
chatId = chat.id
|
||||
chatTitle = chat.title
|
||||
photoPath = chat.photo?.small?.local?.path
|
||||
placeholderId = R.drawable.ic_group
|
||||
placeholderId = R.drawable.img_user_picture
|
||||
}
|
||||
val type = chat.type
|
||||
if (type is TdApi.ChatTypePrivate || type is TdApi.ChatTypeSecret) {
|
||||
|
@ -59,8 +65,10 @@ object TelegramUiHelper {
|
|||
}
|
||||
}
|
||||
} else if (type is TdApi.ChatTypeBasicGroup) {
|
||||
res.placeholderId = R.drawable.img_group_picture
|
||||
res.membersCount = helper.getBasicGroupFullInfo(type.basicGroupId)?.members?.size ?: 0
|
||||
} else if (type is TdApi.ChatTypeSupergroup) {
|
||||
res.placeholderId = R.drawable.img_group_picture
|
||||
res.membersCount = helper.getSupergroupFullInfo(type.supergroupId)?.memberCount ?: 0
|
||||
}
|
||||
if (!res.privateChat) {
|
||||
|
@ -95,10 +103,11 @@ object TelegramUiHelper {
|
|||
): LocationItem? {
|
||||
return if (content.isValid()) {
|
||||
LocationItem().apply {
|
||||
chatId = chat.id
|
||||
chatTitle = chat.title
|
||||
name = content.name
|
||||
latLon = LatLon(content.lat, content.lon)
|
||||
placeholderId = R.drawable.ic_group
|
||||
placeholderId = R.drawable.img_user_picture
|
||||
}
|
||||
} else {
|
||||
null
|
||||
|
@ -113,6 +122,7 @@ object TelegramUiHelper {
|
|||
val user = helper.getUser(message.senderUserId) ?: return null
|
||||
val content = message.content as TdApi.MessageLocation
|
||||
return LocationItem().apply {
|
||||
chatId = chat.id
|
||||
chatTitle = chat.title
|
||||
name = "${user.firstName} ${user.lastName}".trim()
|
||||
if (name.isEmpty()) {
|
||||
|
@ -123,13 +133,15 @@ object TelegramUiHelper {
|
|||
}
|
||||
latLon = LatLon(content.location.latitude, content.location.longitude)
|
||||
photoPath = helper.getUserPhotoPath(user)
|
||||
placeholderId = R.drawable.ic_group
|
||||
placeholderId = R.drawable.img_user_picture
|
||||
userId = message.senderUserId
|
||||
}
|
||||
}
|
||||
|
||||
abstract class ListItem {
|
||||
|
||||
var chatId: Long = 0
|
||||
internal set
|
||||
var chatTitle: String = ""
|
||||
internal set
|
||||
var latLon: LatLon? = null
|
||||
|
@ -161,7 +173,7 @@ object TelegramUiHelper {
|
|||
|
||||
override fun canBeOpenedOnMap() = latLon != null && !chatWithBot
|
||||
|
||||
override fun getMapPointId() = "${chatTitle}_$userId"
|
||||
override fun getMapPointId() = "${chatId}_$userId"
|
||||
|
||||
override fun getVisibleName() = chatTitle
|
||||
}
|
||||
|
@ -175,7 +187,7 @@ object TelegramUiHelper {
|
|||
|
||||
override fun getMapPointId(): String {
|
||||
val id = if (userId != 0) userId.toString() else name
|
||||
return "${chatTitle}_$id"
|
||||
return "${chatId}_$id"
|
||||
}
|
||||
|
||||
override fun getVisibleName() = name
|
||||
|
|
|
@ -55,6 +55,7 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage
|
|||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
val mainView = inflater.inflate(R.layout.fragment_live_now_tab, container, false)
|
||||
AndroidUtils.addStatusBarPadding19v(context!!, mainView)
|
||||
adapter = LiveNowListAdapter()
|
||||
mainView.findViewById<RecyclerView>(R.id.recycler_view).apply {
|
||||
layoutManager = LinearLayoutManager(context)
|
||||
|
@ -119,7 +120,7 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage
|
|||
|
||||
override fun onSendLiveLocationError(code: Int, message: String) {}
|
||||
|
||||
override fun onReceiveChatLocationMessages(chatTitle: String, vararg messages: TdApi.Message) {
|
||||
override fun onReceiveChatLocationMessages(chatId: Long, vararg messages: TdApi.Message) {
|
||||
app.runInUIThread { updateList() }
|
||||
}
|
||||
|
||||
|
@ -243,7 +244,7 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage
|
|||
val canBeOpenedOnMap = item.canBeOpenedOnMap()
|
||||
val openOnMapView = holder.getOpenOnMapClickView()
|
||||
|
||||
TelegramUiHelper.setupPhoto(app, holder.icon, item.photoPath, item.placeholderId)
|
||||
TelegramUiHelper.setupPhoto(app, holder.icon, item.photoPath, item.placeholderId, false)
|
||||
holder.title?.text = item.getVisibleName()
|
||||
openOnMapView?.isEnabled = canBeOpenedOnMap
|
||||
if (canBeOpenedOnMap) {
|
||||
|
@ -273,12 +274,12 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage
|
|||
|
||||
if (item is ChatItem && holder is ChatViewHolder) {
|
||||
val nextIsLocation = !lastItem && items[position + 1] is LocationItem
|
||||
val chatTitle = item.chatTitle
|
||||
val stateTextInd = if (settings.isShowingChatOnMap(chatTitle)) 1 else 0
|
||||
val chatId = item.chatId
|
||||
val stateTextInd = if (settings.isShowingChatOnMap(chatId)) 1 else 0
|
||||
|
||||
holder.description?.text = getChatItemDescription(item)
|
||||
holder.imageButton?.visibility = View.GONE
|
||||
holder.showOnMapRow?.setOnClickListener { showPopupMenu(holder, chatTitle) }
|
||||
holder.showOnMapRow?.setOnClickListener { showPopupMenu(holder, chatId) }
|
||||
holder.showOnMapState?.text = menuList[stateTextInd]
|
||||
holder.bottomDivider?.visibility = if (nextIsLocation) View.VISIBLE else View.GONE
|
||||
} else if (item is LocationItem && holder is ContactViewHolder) {
|
||||
|
@ -300,7 +301,7 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage
|
|||
}
|
||||
}
|
||||
|
||||
private fun showPopupMenu(holder: ChatViewHolder, chatTitle: String) {
|
||||
private fun showPopupMenu(holder: ChatViewHolder, chatId: Long) {
|
||||
val ctx = holder.itemView.context
|
||||
|
||||
val paint = Paint()
|
||||
|
@ -319,7 +320,7 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage
|
|||
setOnItemClickListener { _, _, position, _ ->
|
||||
val allSelected = position == 1
|
||||
|
||||
settings.showChatOnMap(chatTitle, allSelected)
|
||||
settings.showChatOnMap(chatId, allSelected)
|
||||
if (settings.hasAnyChatToShowOnMap()) {
|
||||
if (osmandAidlHelper.isOsmandNotInstalled()) {
|
||||
if (allSelected) {
|
||||
|
@ -327,16 +328,16 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage
|
|||
}
|
||||
} else {
|
||||
if (allSelected) {
|
||||
app.showLocationHelper.showChatMessages(chatTitle)
|
||||
app.showLocationHelper.showChatMessages(chatId)
|
||||
} else {
|
||||
app.showLocationHelper.hideChatMessages(chatTitle)
|
||||
app.showLocationHelper.hideChatMessages(chatId)
|
||||
}
|
||||
app.showLocationHelper.startShowingLocation()
|
||||
}
|
||||
} else {
|
||||
app.showLocationHelper.stopShowingLocation()
|
||||
if (!allSelected) {
|
||||
app.showLocationHelper.hideChatMessages(chatTitle)
|
||||
app.showLocationHelper.hideChatMessages(chatId)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,22 +1,18 @@
|
|||
package net.osmand.telegram.ui
|
||||
|
||||
import android.Manifest
|
||||
import android.app.Dialog
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.drawable.Drawable
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.support.design.widget.BottomNavigationView
|
||||
import android.support.v4.app.*
|
||||
import android.support.v4.app.DialogFragment
|
||||
import android.support.v4.app.Fragment
|
||||
import android.support.v4.app.FragmentManager
|
||||
import android.support.v4.app.FragmentPagerAdapter
|
||||
import android.support.v7.app.AlertDialog
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import android.support.v7.widget.AppCompatImageView
|
||||
import android.support.v7.widget.AppCompatTextView
|
||||
import android.support.v7.widget.RecyclerView
|
||||
import android.support.v7.widget.SwitchCompat
|
||||
import android.view.*
|
||||
import android.view.View
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import android.widget.Toast
|
||||
|
@ -34,10 +30,6 @@ import java.lang.ref.WeakReference
|
|||
|
||||
private const val PERMISSION_REQUEST_LOCATION = 1
|
||||
|
||||
private const val LOGIN_MENU_ID = 0
|
||||
private const val LOGOUT_MENU_ID = 1
|
||||
private const val PROGRESS_MENU_ID = 2
|
||||
|
||||
private const val MY_LOCATION_TAB_POS = 0
|
||||
private const val LIVE_NOW_TAB_POS = 1
|
||||
|
||||
|
@ -151,15 +143,12 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene
|
|||
super.onResume()
|
||||
paused = false
|
||||
|
||||
invalidateOptionsMenu()
|
||||
updateTitle()
|
||||
|
||||
app.locationProvider.checkIfLastKnownLocationIsValid()
|
||||
|
||||
if (AndroidUtils.isLocationPermissionAvailable(this)) {
|
||||
app.locationProvider.resumeAllUpdates()
|
||||
} else {
|
||||
requestLocationPermission()
|
||||
AndroidUtils.requestLocationPermission(this)
|
||||
}
|
||||
if (settings.hasAnyChatToShowOnMap() && osmandAidlHelper.isOsmandNotInstalled()) {
|
||||
showOsmandMissingDialog()
|
||||
|
@ -196,8 +185,6 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene
|
|||
TelegramAuthorizationState.READY -> LoginDialogFragment.dismiss(fm)
|
||||
else -> Unit
|
||||
}
|
||||
invalidateOptionsMenu()
|
||||
updateTitle()
|
||||
|
||||
listeners.forEach {
|
||||
it.get()?.onTelegramStatusChanged(prevTelegramAuthorizationState, newTelegramAuthorizationState)
|
||||
|
@ -258,7 +245,7 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene
|
|||
}
|
||||
|
||||
private fun removeNonexistingChatsFromSettings() {
|
||||
val presentChatTitles = telegramHelper.getChatTitles()
|
||||
val presentChatTitles = telegramHelper.getChatIds()
|
||||
settings.removeNonexistingChats(presentChatTitles)
|
||||
}
|
||||
|
||||
|
@ -269,18 +256,6 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene
|
|||
telegramHelper.init()
|
||||
}
|
||||
|
||||
fun logoutTelegram(silent: Boolean = false) {
|
||||
if (telegramHelper.getTelegramAuthorizationState() == TelegramAuthorizationState.READY) {
|
||||
telegramHelper.logout()
|
||||
} else {
|
||||
invalidateOptionsMenu()
|
||||
updateTitle()
|
||||
if (!silent) {
|
||||
Toast.makeText(this, R.string.not_logged_in, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun closeTelegram() {
|
||||
telegramHelper.close()
|
||||
}
|
||||
|
@ -291,71 +266,6 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene
|
|||
}
|
||||
}
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
|
||||
return when (item?.itemId) {
|
||||
LOGIN_MENU_ID -> {
|
||||
loginTelegram()
|
||||
true
|
||||
}
|
||||
LOGOUT_MENU_ID -> {
|
||||
logoutTelegram()
|
||||
true
|
||||
}
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
|
||||
if (menu != null) {
|
||||
menu.clear()
|
||||
when (telegramHelper.getTelegramAuthorizationState()) {
|
||||
TelegramAuthorizationState.UNKNOWN,
|
||||
TelegramAuthorizationState.WAIT_PARAMETERS,
|
||||
TelegramAuthorizationState.WAIT_PHONE_NUMBER,
|
||||
TelegramAuthorizationState.WAIT_CODE,
|
||||
TelegramAuthorizationState.WAIT_PASSWORD,
|
||||
TelegramAuthorizationState.LOGGING_OUT,
|
||||
TelegramAuthorizationState.CLOSING -> createProgressMenuItem(menu)
|
||||
TelegramAuthorizationState.READY -> createMenuItem(menu, LOGOUT_MENU_ID, R.string.shared_string_logout,
|
||||
MenuItem.SHOW_AS_ACTION_WITH_TEXT or MenuItem.SHOW_AS_ACTION_ALWAYS)
|
||||
TelegramAuthorizationState.CLOSED -> createMenuItem(menu, LOGIN_MENU_ID, R.string.shared_string_login,
|
||||
MenuItem.SHOW_AS_ACTION_WITH_TEXT or MenuItem.SHOW_AS_ACTION_ALWAYS)
|
||||
}
|
||||
}
|
||||
return super.onCreateOptionsMenu(menu)
|
||||
}
|
||||
|
||||
private fun createMenuItem(m: Menu, id: Int, titleRes: Int, menuItemType: Int): MenuItem {
|
||||
val menuItem = m.add(0, id, 0, titleRes)
|
||||
menuItem.setOnMenuItemClickListener { item -> onOptionsItemSelected(item) }
|
||||
menuItem.setShowAsAction(menuItemType)
|
||||
return menuItem
|
||||
}
|
||||
|
||||
private fun createProgressMenuItem(m: Menu): MenuItem {
|
||||
|
||||
val menuItem = m.add(0, PROGRESS_MENU_ID, 0, "")
|
||||
menuItem.actionView = layoutInflater.inflate(R.layout.action_progress_bar, null)
|
||||
menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
|
||||
return menuItem
|
||||
}
|
||||
|
||||
private fun updateTitle() {
|
||||
title = when (telegramHelper.getTelegramAuthorizationState()) {
|
||||
|
||||
TelegramAuthorizationState.UNKNOWN,
|
||||
TelegramAuthorizationState.WAIT_PHONE_NUMBER,
|
||||
TelegramAuthorizationState.WAIT_CODE,
|
||||
TelegramAuthorizationState.WAIT_PASSWORD,
|
||||
TelegramAuthorizationState.READY,
|
||||
TelegramAuthorizationState.CLOSED -> getString(R.string.app_name)
|
||||
|
||||
TelegramAuthorizationState.WAIT_PARAMETERS -> getString(R.string.initialization) + "..."
|
||||
TelegramAuthorizationState.LOGGING_OUT -> getString(R.string.logging_out) + "..."
|
||||
TelegramAuthorizationState.CLOSING -> getString(R.string.closing) + "..."
|
||||
}
|
||||
}
|
||||
|
||||
private fun showLoginDialog(telegramAuthenticationParameterType: TelegramAuthenticationParameterType) {
|
||||
when (telegramAuthenticationParameterType) {
|
||||
TelegramAuthenticationParameterType.PHONE_NUMBER -> LoginDialogFragment.showDialog(supportFragmentManager, LoginDialogType.ENTER_PHONE_NUMBER)
|
||||
|
@ -373,10 +283,6 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene
|
|||
}
|
||||
}
|
||||
|
||||
private fun requestLocationPermission() {
|
||||
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), PERMISSION_REQUEST_LOCATION)
|
||||
}
|
||||
|
||||
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
|
||||
if (grantResults.isEmpty()) {
|
||||
|
@ -400,7 +306,7 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene
|
|||
}
|
||||
}
|
||||
|
||||
fun showOsmandMissingDialog() {
|
||||
private fun showOsmandMissingDialog() {
|
||||
OsmandMissingDialogFragment().show(supportFragmentManager, null)
|
||||
}
|
||||
|
||||
|
@ -427,90 +333,4 @@ class MainActivity : AppCompatActivity(), TelegramListener, ActionButtonsListene
|
|||
|
||||
override fun getCount() = fragments.size
|
||||
}
|
||||
|
||||
inner class ChatsAdapter :
|
||||
RecyclerView.Adapter<ChatsAdapter.ViewHolder>() {
|
||||
|
||||
var chats: List<TdApi.Chat> = emptyList()
|
||||
set(value) {
|
||||
field = value
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
inner class ViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
|
||||
val icon: AppCompatImageView? = view.findViewById(R.id.icon)
|
||||
val groupName: AppCompatTextView? = view.findViewById(R.id.name)
|
||||
val shareLocationSwitch: SwitchCompat? = view.findViewById(R.id.share_location_switch)
|
||||
val showOnMapSwitch: SwitchCompat? = view.findViewById(R.id.show_on_map_switch)
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
val view = LayoutInflater.from(parent.context).inflate(R.layout.chat_list_item, parent, false)
|
||||
return ViewHolder(view)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||
val chat = chats[position]
|
||||
val chatTitle = chat.title
|
||||
holder.groupName?.text = chatTitle
|
||||
|
||||
var drawable: Drawable? = null
|
||||
var bitmap: Bitmap? = null
|
||||
val chatPhoto = chat.photo?.small
|
||||
if (chatPhoto != null && chatPhoto.local.path.isNotEmpty()) {
|
||||
bitmap = app.uiUtils.getCircleBitmap(chatPhoto.local.path)
|
||||
}
|
||||
if (bitmap == null) {
|
||||
drawable = app.uiUtils.getThemedIcon(R.drawable.ic_group)
|
||||
}
|
||||
if (bitmap != null) {
|
||||
holder.icon?.setImageBitmap(bitmap)
|
||||
} else {
|
||||
holder.icon?.setImageDrawable(drawable)
|
||||
}
|
||||
holder.shareLocationSwitch?.setOnCheckedChangeListener(null)
|
||||
holder.shareLocationSwitch?.isChecked = settings.isSharingLocationToChat(chatTitle)
|
||||
holder.shareLocationSwitch?.setOnCheckedChangeListener { view, isChecked ->
|
||||
settings.shareLocationToChat(chatTitle, isChecked)
|
||||
if (settings.hasAnyChatToShareLocation()) {
|
||||
if (!AndroidUtils.isLocationPermissionAvailable(view.context)) {
|
||||
if (isChecked) {
|
||||
requestLocationPermission()
|
||||
}
|
||||
} else {
|
||||
app.shareLocationHelper.startSharingLocation()
|
||||
}
|
||||
} else {
|
||||
app.shareLocationHelper.stopSharingLocation()
|
||||
}
|
||||
}
|
||||
|
||||
holder.showOnMapSwitch?.setOnCheckedChangeListener(null)
|
||||
holder.showOnMapSwitch?.isChecked = settings.isShowingChatOnMap(chatTitle)
|
||||
holder.showOnMapSwitch?.setOnCheckedChangeListener { _, isChecked ->
|
||||
settings.showChatOnMap(chatTitle, isChecked)
|
||||
if (settings.hasAnyChatToShowOnMap()) {
|
||||
if (osmandAidlHelper.isOsmandNotInstalled()) {
|
||||
if (isChecked) {
|
||||
showOsmandMissingDialog()
|
||||
}
|
||||
} else {
|
||||
if (isChecked) {
|
||||
app.showLocationHelper.showChatMessages(chatTitle)
|
||||
} else {
|
||||
app.showLocationHelper.hideChatMessages(chatTitle)
|
||||
}
|
||||
app.showLocationHelper.startShowingLocation()
|
||||
}
|
||||
} else {
|
||||
app.showLocationHelper.stopShowingLocation()
|
||||
if (!isChecked) {
|
||||
app.showLocationHelper.hideChatMessages(chatTitle)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount() = chats.size
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package net.osmand.telegram.ui
|
||||
|
||||
import android.animation.*
|
||||
import android.content.Intent
|
||||
import android.graphics.Paint
|
||||
import android.graphics.drawable.GradientDrawable
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
|
@ -8,6 +10,7 @@ import android.support.design.widget.AppBarLayout
|
|||
import android.support.v4.app.Fragment
|
||||
import android.support.v4.content.ContextCompat
|
||||
import android.support.v7.widget.LinearLayoutManager
|
||||
import android.support.v7.widget.ListPopupWindow
|
||||
import android.support.v7.widget.RecyclerView
|
||||
import android.view.*
|
||||
import android.widget.*
|
||||
|
@ -17,6 +20,7 @@ import net.osmand.telegram.helpers.TelegramHelper
|
|||
import net.osmand.telegram.helpers.TelegramHelper.TelegramListener
|
||||
import net.osmand.telegram.helpers.TelegramUiHelper
|
||||
import net.osmand.telegram.ui.MyLocationTabFragment.MyLocationListAdapter.ChatViewHolder
|
||||
import net.osmand.telegram.utils.AndroidUtils
|
||||
import org.drinkless.td.libcore.telegram.TdApi
|
||||
|
||||
private const val SELECTED_CHATS_KEY = "selected_chats"
|
||||
|
@ -28,12 +32,16 @@ class MyLocationTabFragment : Fragment(), TelegramListener {
|
|||
private var searchBoxHeight: Int = 0
|
||||
private var searchBoxSidesMargin: Int = 0
|
||||
|
||||
private var appBarScrollRange: Int = -1
|
||||
|
||||
private val app: TelegramApplication
|
||||
get() = activity?.application as TelegramApplication
|
||||
|
||||
private val telegramHelper get() = app.telegramHelper
|
||||
|
||||
private lateinit var appBarLayout: AppBarLayout
|
||||
private lateinit var userImage: ImageView
|
||||
private lateinit var optionsBtn: ImageView
|
||||
private lateinit var textContainer: LinearLayout
|
||||
private lateinit var title: TextView
|
||||
private lateinit var description: TextView
|
||||
|
@ -80,19 +88,33 @@ class MyLocationTabFragment : Fragment(), TelegramListener {
|
|||
outlineProvider = null
|
||||
}
|
||||
addOnOffsetChangedListener { appBar, offset ->
|
||||
val collapsed = Math.abs(offset) == appBar.totalScrollRange
|
||||
if (appBarScrollRange == -1) {
|
||||
appBarScrollRange = appBar.totalScrollRange
|
||||
}
|
||||
val collapsed = Math.abs(offset) == appBarScrollRange
|
||||
if (collapsed != appBarCollapsed) {
|
||||
appBarCollapsed = collapsed
|
||||
adjustText()
|
||||
adjustSearchBox()
|
||||
optionsBtn.visibility = if (collapsed) View.VISIBLE else View.GONE
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
userImage = mainView.findViewById<ImageView>(R.id.my_location_user_image).apply {
|
||||
setImageResource(R.drawable.img_my_location_user)
|
||||
}
|
||||
|
||||
optionsBtn = mainView.findViewById<ImageView>(R.id.options).apply {
|
||||
setImageDrawable(app.uiUtils.getThemedIcon(R.drawable.ic_action_other_menu))
|
||||
setOnClickListener { showPopupMenu() }
|
||||
}
|
||||
|
||||
textContainer = mainView.findViewById<LinearLayout>(R.id.text_container).apply {
|
||||
if (Build.VERSION.SDK_INT >= 16) {
|
||||
layoutTransition.enableTransitionType(LayoutTransition.CHANGING)
|
||||
}
|
||||
AndroidUtils.addStatusBarPadding19v(context!!, this)
|
||||
title = findViewById(R.id.title)
|
||||
description = findViewById(R.id.description)
|
||||
}
|
||||
|
@ -135,6 +157,13 @@ class MyLocationTabFragment : Fragment(), TelegramListener {
|
|||
outState.putLongArray(SELECTED_CHATS_KEY, selectedChats.toLongArray())
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, data)
|
||||
if (requestCode == SetTimeDialogFragment.LOCATION_SHARED_REQUEST_CODE) {
|
||||
clearSelection()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onTelegramStatusChanged(
|
||||
prevTelegramAuthorizationState: TelegramHelper.TelegramAuthorizationState,
|
||||
newTelegramAuthorizationState: TelegramHelper.TelegramAuthorizationState
|
||||
|
@ -174,17 +203,72 @@ class MyLocationTabFragment : Fragment(), TelegramListener {
|
|||
}
|
||||
|
||||
fun onPrimaryBtnClick() {
|
||||
activity?.supportFragmentManager?.also {
|
||||
SetTimeDialogFragment.showInstance(it, selectedChats)
|
||||
}
|
||||
val fm = fragmentManager ?: return
|
||||
SetTimeDialogFragment.showInstance(fm, selectedChats, this)
|
||||
}
|
||||
|
||||
fun onSecondaryBtnClick() {
|
||||
clearSelection()
|
||||
}
|
||||
|
||||
private fun clearSelection() {
|
||||
selectedChats.clear()
|
||||
adapter.notifyDataSetChanged()
|
||||
actionButtonsListener?.switchButtonsVisibility(false)
|
||||
}
|
||||
|
||||
private fun showPopupMenu() {
|
||||
val ctx = context ?: return
|
||||
|
||||
val menuList = ArrayList<String>()
|
||||
val logout = getString(R.string.shared_string_logout)
|
||||
val login = getString(R.string.shared_string_login)
|
||||
|
||||
when (telegramHelper.getTelegramAuthorizationState()) {
|
||||
TelegramHelper.TelegramAuthorizationState.READY -> menuList.add(logout)
|
||||
TelegramHelper.TelegramAuthorizationState.CLOSED -> menuList.add(login)
|
||||
else -> return
|
||||
}
|
||||
|
||||
val paint = Paint()
|
||||
paint.textSize =
|
||||
resources.getDimensionPixelSize(R.dimen.list_item_title_text_size).toFloat()
|
||||
val textWidth = paint.measureText(menuList[0])
|
||||
val itemWidth = textWidth.toInt() + AndroidUtils.dpToPx(ctx, 32F)
|
||||
val minWidth = AndroidUtils.dpToPx(ctx, 100F)
|
||||
|
||||
ListPopupWindow(ctx).apply {
|
||||
isModal = true
|
||||
anchorView = optionsBtn
|
||||
setContentWidth(Math.max(minWidth, itemWidth))
|
||||
setDropDownGravity(Gravity.END or Gravity.TOP)
|
||||
setAdapter(ArrayAdapter(ctx, R.layout.popup_list_text_item, menuList))
|
||||
setOnItemClickListener { _, _, position, _ ->
|
||||
when (position) {
|
||||
menuList.indexOf(logout) -> logoutTelegram()
|
||||
menuList.indexOf(login) -> loginTelegram()
|
||||
}
|
||||
dismiss()
|
||||
}
|
||||
show()
|
||||
}
|
||||
}
|
||||
|
||||
private fun logoutTelegram(silent: Boolean = false) {
|
||||
if (telegramHelper.getTelegramAuthorizationState() == TelegramHelper.TelegramAuthorizationState.READY) {
|
||||
telegramHelper.logout()
|
||||
} else if (!silent) {
|
||||
Toast.makeText(context, R.string.not_logged_in, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
|
||||
private fun loginTelegram() {
|
||||
if (telegramHelper.getTelegramAuthorizationState() != TelegramHelper.TelegramAuthorizationState.CLOSED) {
|
||||
telegramHelper.logout()
|
||||
}
|
||||
telegramHelper.init()
|
||||
}
|
||||
|
||||
private fun adjustText() {
|
||||
val gravity = if (appBarCollapsed) Gravity.START else Gravity.CENTER
|
||||
val padding = if (appBarCollapsed) textMarginSmall else textMarginBig
|
||||
|
@ -271,10 +355,18 @@ class MyLocationTabFragment : Fragment(), TelegramListener {
|
|||
override fun onBindViewHolder(holder: ChatViewHolder, position: Int) {
|
||||
val chat = chats[position]
|
||||
val lastItem = position == itemCount - 1
|
||||
val placeholderId = if (telegramHelper.isGroup(chat)) R.drawable.img_group_picture else R.drawable.img_user_picture
|
||||
val live = app.settings.isSharingLocationToChat(chat.id)
|
||||
|
||||
TelegramUiHelper.setupPhoto(app, holder.icon, chat.photo?.small?.local?.path)
|
||||
TelegramUiHelper.setupPhoto(app, holder.icon, chat.photo?.small?.local?.path, placeholderId, false)
|
||||
holder.title?.text = chat.title
|
||||
holder.description?.text = "Some description" // FIXME
|
||||
if (live) {
|
||||
holder.checkBox?.visibility = View.GONE
|
||||
holder.textInArea?.visibility = View.VISIBLE
|
||||
holder.textInArea?.text = getString(R.string.shared_string_live)
|
||||
} else {
|
||||
holder.textInArea?.visibility = View.GONE
|
||||
holder.checkBox?.apply {
|
||||
visibility = View.VISIBLE
|
||||
setOnCheckedChangeListener(null)
|
||||
|
@ -288,13 +380,22 @@ class MyLocationTabFragment : Fragment(), TelegramListener {
|
|||
actionButtonsListener?.switchButtonsVisibility(selectedChats.isNotEmpty())
|
||||
}
|
||||
}
|
||||
}
|
||||
holder.bottomShadow?.visibility = if (lastItem) View.VISIBLE else View.GONE
|
||||
holder.itemView.setOnClickListener {
|
||||
if (live) {
|
||||
app.settings.shareLocationToChat(chat.id, false)
|
||||
if (!app.settings.hasAnyChatToShareLocation()) {
|
||||
app.shareLocationHelper.stopSharingLocation()
|
||||
}
|
||||
notifyItemChanged(position)
|
||||
} else {
|
||||
holder.checkBox?.apply {
|
||||
isChecked = !isChecked
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount() = chats.size
|
||||
|
||||
|
@ -302,6 +403,7 @@ class MyLocationTabFragment : Fragment(), TelegramListener {
|
|||
val icon: ImageView? = view.findViewById(R.id.icon)
|
||||
val title: TextView? = view.findViewById(R.id.title)
|
||||
val description: TextView? = view.findViewById(R.id.description)
|
||||
val textInArea: TextView? = view.findViewById(R.id.text_in_area)
|
||||
val checkBox: CheckBox? = view.findViewById(R.id.check_box)
|
||||
val bottomShadow: View? = view.findViewById(R.id.bottom_shadow)
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ package net.osmand.telegram.ui
|
|||
import android.app.TimePickerDialog
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.DialogFragment
|
||||
import android.support.v4.app.Fragment
|
||||
import android.support.v4.app.FragmentManager
|
||||
import android.support.v7.widget.LinearLayoutManager
|
||||
import android.support.v7.widget.RecyclerView
|
||||
|
@ -11,12 +12,12 @@ import android.view.View
|
|||
import android.view.ViewGroup
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import android.widget.Toast
|
||||
import net.osmand.telegram.R
|
||||
import net.osmand.telegram.TelegramApplication
|
||||
import net.osmand.telegram.helpers.ShareLocationHelper
|
||||
import net.osmand.telegram.helpers.TelegramUiHelper
|
||||
import net.osmand.telegram.ui.SetTimeDialogFragment.SetTimeListAdapter.ChatViewHolder
|
||||
import net.osmand.telegram.utils.AndroidUtils
|
||||
import org.drinkless.td.libcore.telegram.TdApi
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
|
@ -26,13 +27,14 @@ class SetTimeDialogFragment : DialogFragment() {
|
|||
get() = activity?.application as TelegramApplication
|
||||
|
||||
private val telegramHelper get() = app.telegramHelper
|
||||
private val settings get() = app.settings
|
||||
|
||||
private val adapter = SetTimeListAdapter()
|
||||
|
||||
private lateinit var timeForAllTitle: TextView
|
||||
private lateinit var timeForAllValue: TextView
|
||||
|
||||
private val chatIdsToDuration = HashMap<Long, Long>()
|
||||
private val chatLivePeriods = HashMap<Long, Long>()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
@ -76,7 +78,18 @@ class SetTimeDialogFragment : DialogFragment() {
|
|||
view.findViewById<TextView>(R.id.primary_btn).apply {
|
||||
text = getString(R.string.shared_string_share)
|
||||
setOnClickListener {
|
||||
Toast.makeText(context, "Share", Toast.LENGTH_SHORT).show()
|
||||
if (!AndroidUtils.isLocationPermissionAvailable(view.context)) {
|
||||
AndroidUtils.requestLocationPermission(activity!!)
|
||||
} else {
|
||||
chatLivePeriods.forEach { chatId, livePeriod ->
|
||||
settings.shareLocationToChat(chatId, true, livePeriod)
|
||||
}
|
||||
app.shareLocationHelper.startSharingLocation()
|
||||
targetFragment?.also {
|
||||
it.onActivityResult(targetRequestCode, LOCATION_SHARED_REQUEST_CODE, null)
|
||||
}
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -91,25 +104,26 @@ class SetTimeDialogFragment : DialogFragment() {
|
|||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
super.onSaveInstanceState(outState)
|
||||
val chats = mutableListOf<Long>()
|
||||
for ((id, duration) in chatIdsToDuration) {
|
||||
for ((id, livePeriod) in chatLivePeriods) {
|
||||
chats.add(id)
|
||||
chats.add(duration)
|
||||
chats.add(livePeriod)
|
||||
}
|
||||
outState.putLongArray(CHATS_KEY, chats.toLongArray())
|
||||
}
|
||||
|
||||
private fun readFromBundle(bundle: Bundle?) {
|
||||
chatIdsToDuration.clear()
|
||||
chatLivePeriods.clear()
|
||||
bundle?.getLongArray(CHATS_KEY)?.also {
|
||||
for (i in 0 until it.size step 2) {
|
||||
chatIdsToDuration[it[i]] = it[i + 1]
|
||||
val livePeriod = settings.getChatLivePeriod(it[i])
|
||||
chatLivePeriods[it[i]] = livePeriod ?: it[i + 1]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun getTimeForAll(useDefValue: Boolean = false): Long {
|
||||
val returnVal = if (useDefValue) DEFAULT_VISIBLE_TIME_SECONDS else NO_VALUE
|
||||
val iterator = chatIdsToDuration.values.iterator()
|
||||
val iterator = chatLivePeriods.values.iterator()
|
||||
if (!iterator.hasNext()) {
|
||||
return returnVal
|
||||
}
|
||||
|
@ -127,7 +141,7 @@ class SetTimeDialogFragment : DialogFragment() {
|
|||
if (timeForAll != NO_VALUE) {
|
||||
timeForAllTitle.text = getString(R.string.visible_time_for_all)
|
||||
timeForAllValue.visibility = View.VISIBLE
|
||||
timeForAllValue.text = formatDuration(timeForAll)
|
||||
timeForAllValue.text = formatLivePeriod(timeForAll)
|
||||
} else {
|
||||
timeForAllTitle.text = getString(R.string.set_visible_time_for_all)
|
||||
timeForAllValue.visibility = View.GONE
|
||||
|
@ -136,7 +150,7 @@ class SetTimeDialogFragment : DialogFragment() {
|
|||
|
||||
private fun selectDuration(id: Long? = null) {
|
||||
val timeForAll = getTimeForAll(true)
|
||||
val defSeconds = if (id == null) timeForAll else chatIdsToDuration[id] ?: timeForAll
|
||||
val defSeconds = if (id == null) timeForAll else chatLivePeriods[id] ?: timeForAll
|
||||
val (defHours, defMinutes) = secondsToHoursAndMinutes(defSeconds)
|
||||
TimePickerDialog(
|
||||
context,
|
||||
|
@ -145,10 +159,10 @@ class SetTimeDialogFragment : DialogFragment() {
|
|||
TimeUnit.MINUTES.toSeconds(minutes.toLong())
|
||||
if (seconds >= ShareLocationHelper.MIN_LOCATION_MESSAGE_LIVE_PERIOD_SEC) {
|
||||
if (id != null) {
|
||||
chatIdsToDuration[id] = seconds
|
||||
chatLivePeriods[id] = seconds
|
||||
} else {
|
||||
chatIdsToDuration.keys.forEach {
|
||||
chatIdsToDuration[it] = seconds
|
||||
chatLivePeriods.keys.forEach {
|
||||
chatLivePeriods[it] = seconds
|
||||
}
|
||||
}
|
||||
updateTimeForAllRow()
|
||||
|
@ -164,7 +178,7 @@ class SetTimeDialogFragment : DialogFragment() {
|
|||
return Pair(hours.toInt(), minutes.toInt())
|
||||
}
|
||||
|
||||
private fun formatDuration(seconds: Long): String {
|
||||
private fun formatLivePeriod(seconds: Long): String {
|
||||
val (hours, minutes) = secondsToHoursAndMinutes(seconds)
|
||||
return when {
|
||||
hours != 0 && minutes == 0 -> getString(R.string.hours_format, hours)
|
||||
|
@ -175,7 +189,7 @@ class SetTimeDialogFragment : DialogFragment() {
|
|||
|
||||
private fun updateList() {
|
||||
val chats: MutableList<TdApi.Chat> = mutableListOf()
|
||||
telegramHelper.getChatList().filter { chatIdsToDuration.keys.contains(it.chatId) }
|
||||
telegramHelper.getChatList().filter { chatLivePeriods.keys.contains(it.chatId) }
|
||||
.forEach { orderedChat ->
|
||||
telegramHelper.getChat(orderedChat.chatId)?.also { chats.add(it) }
|
||||
}
|
||||
|
@ -198,13 +212,14 @@ class SetTimeDialogFragment : DialogFragment() {
|
|||
|
||||
override fun onBindViewHolder(holder: ChatViewHolder, position: Int) {
|
||||
val chat = chats[position]
|
||||
val placeholderId = if (telegramHelper.isGroup(chat)) R.drawable.img_group_picture else R.drawable.img_user_picture
|
||||
|
||||
TelegramUiHelper.setupPhoto(app, holder.icon, chat.photo?.small?.local?.path)
|
||||
TelegramUiHelper.setupPhoto(app, holder.icon, chat.photo?.small?.local?.path, placeholderId, false)
|
||||
holder.title?.text = chat.title
|
||||
holder.description?.text = "Some description" // FIXME
|
||||
holder.textInArea?.apply {
|
||||
visibility = View.VISIBLE
|
||||
chatIdsToDuration[chat.id]?.also { text = formatDuration(it) }
|
||||
chatLivePeriods[chat.id]?.also { text = formatLivePeriod(it) }
|
||||
}
|
||||
holder.bottomShadow?.visibility = View.GONE
|
||||
holder.itemView.setOnClickListener {
|
||||
|
@ -225,12 +240,14 @@ class SetTimeDialogFragment : DialogFragment() {
|
|||
|
||||
companion object {
|
||||
|
||||
const val LOCATION_SHARED_REQUEST_CODE = 0
|
||||
|
||||
private const val TAG = "SetTimeDialogFragment"
|
||||
private const val CHATS_KEY = "chats_key"
|
||||
private const val DEFAULT_VISIBLE_TIME_SECONDS = 60 * 60L // 1 hour
|
||||
private const val NO_VALUE = -1L
|
||||
|
||||
fun showInstance(fm: FragmentManager, chatIds: Set<Long>): Boolean {
|
||||
fun showInstance(fm: FragmentManager, chatIds: Set<Long>, target: Fragment): Boolean {
|
||||
return try {
|
||||
val chats = mutableListOf<Long>()
|
||||
for (id in chatIds) {
|
||||
|
@ -239,6 +256,7 @@ class SetTimeDialogFragment : DialogFragment() {
|
|||
}
|
||||
SetTimeDialogFragment().apply {
|
||||
arguments = Bundle().apply { putLongArray(CHATS_KEY, chats.toLongArray()) }
|
||||
setTargetFragment(target, LOCATION_SHARED_REQUEST_CODE)
|
||||
show(fm, TAG)
|
||||
}
|
||||
true
|
||||
|
|
|
@ -20,6 +20,8 @@ import java.io.File
|
|||
|
||||
object AndroidUtils {
|
||||
|
||||
private const val PERMISSION_REQUEST_LOCATION = 1
|
||||
|
||||
private fun isHardwareKeyboardAvailable(context: Context): Boolean {
|
||||
return context.resources.configuration.keyboard != Configuration.KEYBOARD_NOKEYS
|
||||
}
|
||||
|
@ -50,6 +52,11 @@ object AndroidUtils {
|
|||
return ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
|
||||
}
|
||||
|
||||
|
||||
fun requestLocationPermission(activity: Activity) {
|
||||
ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), PERMISSION_REQUEST_LOCATION)
|
||||
}
|
||||
|
||||
fun dpToPx(ctx: Context, dp: Float): Int {
|
||||
val r = ctx.resources
|
||||
return TypedValue.applyDimension(
|
||||
|
@ -59,6 +66,23 @@ object AndroidUtils {
|
|||
).toInt()
|
||||
}
|
||||
|
||||
fun getStatusBarHeight(ctx: Context): Int {
|
||||
var result = 0
|
||||
val resourceId = ctx.resources.getIdentifier("status_bar_height", "dimen", "android")
|
||||
if (resourceId > 0) {
|
||||
result = ctx.resources.getDimensionPixelSize(resourceId)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
fun addStatusBarPadding19v(ctx: Context, view: View) {
|
||||
if (Build.VERSION.SDK_INT >= 19) {
|
||||
view.apply {
|
||||
setPadding(paddingLeft, paddingTop + getStatusBarHeight(ctx), paddingRight, paddingBottom)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ColorInt
|
||||
fun getAttrColor(ctx: Context, @AttrRes attrId: Int, @ColorInt defaultColor: Int = 0): Int {
|
||||
val ta = ctx.theme.obtainStyledAttributes(intArrayOf(attrId))
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'com.github.ksoichiro.eclipse.aar'
|
||||
|
||||
// Global Parameters accepted
|
||||
// TARGET_APP_NAME - app name
|
||||
|
@ -23,14 +22,7 @@ def analytics = (!System.getenv("APP_FEATURES") || System.getenv("APP_FEATURES")
|
|||
getGradle().getStartParameter().getTaskRequests().toString().contains("Free")
|
||||
|
||||
|
||||
eclipseAar {
|
||||
// See "Configurations" for details
|
||||
androidTarget = 'android-27'
|
||||
aarDependenciesDir = 'aarDependencies'
|
||||
targetConfigurations = ['compile']
|
||||
|
||||
// cleanLibsDirectoryEnabled = true
|
||||
}
|
||||
|
||||
task printc {
|
||||
configurations.each { if(it.isCanBeResolved()) println it.name }
|
||||
|
@ -121,29 +113,26 @@ android {
|
|||
armv7 {
|
||||
dimension "abi"
|
||||
ndk {
|
||||
abiFilter "armeabi-v7a"
|
||||
abiFilter 'armeabi-v7a'
|
||||
}
|
||||
}
|
||||
armv5 {
|
||||
arm64 {
|
||||
dimension "abi"
|
||||
ndk {
|
||||
abiFilter "armeabi"
|
||||
abiFilter 'arm64-v8a'
|
||||
}
|
||||
}
|
||||
x86 {
|
||||
dimension "abi"
|
||||
ndk {
|
||||
abiFilter "x86"
|
||||
}
|
||||
}
|
||||
mips {
|
||||
dimension "abi"
|
||||
ndk {
|
||||
abiFilter "mips"
|
||||
abiFilter 'x86'
|
||||
}
|
||||
}
|
||||
fat {
|
||||
dimension "abi"
|
||||
ndk {
|
||||
abiFilters 'arm64-v8a', 'x86', 'armeabi-v7a'
|
||||
}
|
||||
}
|
||||
|
||||
// Version
|
||||
|
|
|
@ -2,19 +2,16 @@ LOCAL_PATH := $(call my-dir)
|
|||
ROOT_PATH := $(LOCAL_PATH)/../../..
|
||||
$(info OsmAnd root: $(ROOT_PATH))
|
||||
|
||||
# LEGACY {
|
||||
ifdef BUILD_ONLY_OLD_LIB
|
||||
OSMAND_MAKEFILES := \
|
||||
$(all-subdir-makefiles) \
|
||||
$(call all-makefiles-under,$(ROOT_PATH)/core-legacy/targets/android)
|
||||
else
|
||||
# } LEGACY
|
||||
OSMAND_MAKEFILES := \
|
||||
$(all-subdir-makefiles) \
|
||||
$(call all-makefiles-under,$(ROOT_PATH)/core/wrappers/android)
|
||||
# LEGACY {
|
||||
endif
|
||||
# } LEGACY
|
||||
|
||||
$(info OsmAnd makefiles: $(OSMAND_MAKEFILES))
|
||||
|
||||
# By default, include makefiles only once
|
||||
|
|
|
@ -1,35 +1,23 @@
|
|||
APP_STL := gnustl_shared
|
||||
# APP_STL := c++_shared
|
||||
APP_CPPFLAGS := -std=c++11 -fexceptions -frtti
|
||||
APP_SHORT_COMMANDS := true
|
||||
|
||||
# Specify least supported Android platform version
|
||||
APP_PLATFORM := android-9
|
||||
APP_PLATFORM := android-14
|
||||
|
||||
ifeq ($(wildcard $(ANDROID_NDK)/toolchains/*-4.7),)
|
||||
ifeq ($(wildcard $(ANDROID_NDK)/toolchains/*-4.8),)
|
||||
NDK_TOOLCHAIN_VERSION := 4.9
|
||||
else
|
||||
NDK_TOOLCHAIN_VERSION := 4.8
|
||||
endif
|
||||
else
|
||||
NDK_TOOLCHAIN_VERSION := 4.7
|
||||
endif
|
||||
|
||||
APP_ABI :=
|
||||
ifneq ($(filter x86,$(OSMAND_ARCHITECTURES_SET)),)
|
||||
APP_ABI += x86
|
||||
endif
|
||||
ifneq ($(filter mips,$(OSMAND_ARCHITECTURES_SET)),)
|
||||
APP_ABI += mips
|
||||
endif
|
||||
ifneq ($(filter arm,$(OSMAND_ARCHITECTURES_SET)),)
|
||||
APP_ABI += armeabi armeabi-v7a
|
||||
else
|
||||
ifneq ($(filter armv7,$(OSMAND_ARCHITECTURES_SET)),)
|
||||
APP_ABI += armeabi-v7a
|
||||
endif
|
||||
endif
|
||||
# ifeq ($(wildcard $(ANDROID_NDK)/toolchains/*-4.7),)
|
||||
# ifeq ($(wildcard $(ANDROID_NDK)/toolchains/*-4.8),)
|
||||
# NDK_TOOLCHAIN_VERSION := 4.9
|
||||
# else
|
||||
# NDK_TOOLCHAIN_VERSION := 4.8
|
||||
# endif
|
||||
# else
|
||||
# NDK_TOOLCHAIN_VERSION := 4.7
|
||||
# endif
|
||||
NDK_TOOLCHAIN_VERSION := clang
|
||||
|
||||
APP_ABI := x86 armeabi-v7a arm64-v8a
|
||||
ifndef OSMAND_DEBUG_NATIVE
|
||||
# Force release compilation in release optimizations, even if application is debuggable by manifest
|
||||
APP_OPTIM := release
|
||||
|
|
|
@ -22,12 +22,7 @@ if [ ! -d "$ANDROID_NDK" ]; then
|
|||
fi
|
||||
export ANDROID_SDK_ROOT=$ANDROID_HOME
|
||||
export ANDROID_NDK_ROOT=$ANDROID_NDK
|
||||
export ANDROID_NDK_TOOLCHAIN_VERSION=4.7
|
||||
|
||||
if [ -z "$OSMAND_X86_ONLY" ] && [ -z "$OSMAND_ARM_ONLY" ] && [ -z "$OSMAND_ARMv5_ONLY" ] && [ -z "$OSMAND_ARMv7a_ONLY" ] && [ -z "$OSMAND_MIPS_ONLY" ]; then
|
||||
export OSMAND_ARCHITECTURES_SET='arm x86 mips'
|
||||
echo "BUILD_ALL set to true"
|
||||
fi
|
||||
#export ANDROID_NDK_TOOLCHAIN_VERSION=4.7
|
||||
export BUILD_ONLY_OLD_LIB=1
|
||||
"$SCRIPT_LOC/../../core-legacy/externals/configure.sh"
|
||||
(cd "$SCRIPT_LOC" && "$ANDROID_NDK/ndk-build" -j2)
|
||||
|
|
BIN
OsmAnd/res/drawable-hdpi/img_user_picture.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
OsmAnd/res/drawable-hdpi/map_pin_user_location_day.png
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
OsmAnd/res/drawable-hdpi/map_pin_user_location_night.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
OsmAnd/res/drawable-hdpi/map_pin_user_location_small_day.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
OsmAnd/res/drawable-hdpi/map_pin_user_location_small_night.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
OsmAnd/res/drawable-mdpi/img_user_picture.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
OsmAnd/res/drawable-mdpi/map_pin_user_location_day.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
OsmAnd/res/drawable-mdpi/map_pin_user_location_night.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
OsmAnd/res/drawable-mdpi/map_pin_user_location_small_day.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
OsmAnd/res/drawable-mdpi/map_pin_user_location_small_night.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
OsmAnd/res/drawable-xhdpi/img_user_picture.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
OsmAnd/res/drawable-xhdpi/map_pin_user_location_day.png
Normal file
After Width: | Height: | Size: 7.4 KiB |
BIN
OsmAnd/res/drawable-xhdpi/map_pin_user_location_night.png
Normal file
After Width: | Height: | Size: 7 KiB |
BIN
OsmAnd/res/drawable-xhdpi/map_pin_user_location_small_day.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
OsmAnd/res/drawable-xhdpi/map_pin_user_location_small_night.png
Normal file
After Width: | Height: | Size: 3 KiB |
BIN
OsmAnd/res/drawable-xxhdpi/img_user_picture.png
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
OsmAnd/res/drawable-xxhdpi/map_pin_user_location_day.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
OsmAnd/res/drawable-xxhdpi/map_pin_user_location_night.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
OsmAnd/res/drawable-xxhdpi/map_pin_user_location_small_day.png
Normal file
After Width: | Height: | Size: 4.6 KiB |
BIN
OsmAnd/res/drawable-xxhdpi/map_pin_user_location_small_night.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
8
OsmAnd/res/drawable/btn_border_bg_dark.xml
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<corners android:radius="3dp" />
|
||||
<stroke
|
||||
android:width="1dp"
|
||||
android:color="@color/ctx_menu_info_divider_dark" />
|
||||
</shape>
|
8
OsmAnd/res/drawable/btn_border_bg_light.xml
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<corners android:radius="3dp" />
|
||||
<stroke
|
||||
android:width="1dp"
|
||||
android:color="@color/ctx_menu_info_divider_light" />
|
||||
</shape>
|
|
@ -1,35 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="top|center"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<View
|
||||
android:id="@+id/map_route_land_left_margin_external"
|
||||
android:layout_width="@dimen/dashboard_land_width"
|
||||
android:layout_height="0dp"
|
||||
android:layout_gravity="top|left"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="top|center"
|
||||
android:layout_marginTop="@dimen/map_button_margin"
|
||||
android:background="@drawable/btn_round"
|
||||
android:orientation="vertical">
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/map_horizontal_progress_external"
|
||||
style="?android:attr/progressBarStyleHorizontal"
|
||||
android:layout_width="@dimen/map_routing_progress_width"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="@dimen/map_button_margin"
|
||||
android:layout_marginRight="@dimen/map_button_margin"
|
||||
android:max="100"
|
||||
android:progress="60"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
|
@ -2,9 +2,9 @@
|
|||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="@dimen/grid_menu_item_width"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:orientation="vertical"
|
||||
android:paddingLeft="@dimen/bottom_sheet_content_padding_small"
|
||||
android:paddingRight="@dimen/bottom_sheet_content_padding_small"
|
||||
|
@ -15,9 +15,8 @@
|
|||
android:id="@+id/icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginBottom="@dimen/grid_menu_item_bottom_top_margin"
|
||||
android:layout_marginLeft="@dimen/grid_menu_item_sides_margin"
|
||||
android:layout_marginRight="@dimen/grid_menu_item_sides_margin"
|
||||
android:layout_marginTop="@dimen/grid_menu_item_bottom_top_margin"
|
||||
tools:src="@drawable/ic_action_delete_dark"
|
||||
tools:tint="#808080"/>
|
||||
|
|
|
@ -5,29 +5,42 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:paddingTop="@dimen/bottom_sheet_content_padding_small">
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.25"/>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/first_item_container"
|
||||
android:layout_width="@dimen/grid_menu_item_width"
|
||||
android:layout_height="wrap_content"/>
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="3"/>
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"/>
|
||||
android:layout_weight="0.5"/>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/second_item_container"
|
||||
android:layout_width="@dimen/grid_menu_item_width"
|
||||
android:layout_height="wrap_content"/>
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="3"/>
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"/>
|
||||
android:layout_weight="0.5"/>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/third_item_container"
|
||||
android:layout_width="@dimen/grid_menu_item_width"
|
||||
android:layout_height="wrap_content"/>
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="3"/>
|
||||
|
||||
<Space
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="0.25"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
|
|
@ -56,16 +56,6 @@
|
|||
android:id="@+id/MapHudButtonsOverlayQuickActions"/>
|
||||
</FrameLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/progress_layout_external"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone">
|
||||
|
||||
<include layout="@layout/map_progress_top"/>
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
|
|
@ -1,36 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="50dp"
|
||||
android:gravity="top|center"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<View
|
||||
android:id="@+id/map_route_land_left_margin_external"
|
||||
android:layout_width="@dimen/map_route_planning_land_width_minus_shadow"
|
||||
android:layout_height="0dp"
|
||||
android:layout_gravity="top|left"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="top|center"
|
||||
android:layout_marginTop="@dimen/map_button_margin"
|
||||
android:background="@drawable/btn_round"
|
||||
android:orientation="vertical">
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/map_horizontal_progress_external"
|
||||
style="?android:attr/progressBarStyleHorizontal"
|
||||
android:layout_width="@dimen/map_routing_progress_width"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="@dimen/map_button_margin"
|
||||
android:layout_marginRight="@dimen/map_button_margin"
|
||||
android:max="100"
|
||||
android:progress="60"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
18
OsmAnd/res/layout/plan_route_progress_bar.xml
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/progress_bar"
|
||||
style="?android:attr/progressBarStyleHorizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="4dp"
|
||||
android:max="100"
|
||||
android:visibility="gone"
|
||||
tools:progress="60"
|
||||
tools:visibility="visible"/>
|
||||
|
||||
</FrameLayout>
|
|
@ -2,6 +2,7 @@
|
|||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
xmlns:osmand="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
@ -201,4 +202,77 @@
|
|||
android:clickable="true"
|
||||
android:src="@drawable/ic_action_save"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/no_search_results_bottom_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:background="?attr/ctx_menu_info_view_bg"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible">
|
||||
|
||||
<View
|
||||
android:id="@+id/keyboard_divider"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:background="?attr/ctx_menu_info_divider" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/no_search_results_description"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_weight="1"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:drawablePadding="@dimen/bottom_sheet_content_padding_small"
|
||||
android:gravity="center_vertical"
|
||||
android:letterSpacing="@dimen/text_button_letter_spacing"
|
||||
android:paddingBottom="@dimen/context_menu_padding_margin_tiny"
|
||||
android:paddingLeft="@dimen/bottom_sheet_content_margin"
|
||||
android:paddingRight="@dimen/bottom_sheet_content_margin"
|
||||
android:paddingTop="@dimen/context_menu_padding_margin_tiny"
|
||||
android:text="@string/search_no_results_description"
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
osmand:typeface="@string/font_roboto_medium" />
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/send_empty_search_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/content_padding_small"
|
||||
android:layout_marginLeft="@dimen/context_menu_padding_margin_small"
|
||||
android:layout_marginRight="@dimen/context_menu_padding_margin_small"
|
||||
android:layout_marginTop="@dimen/content_padding_small"
|
||||
android:background="?attr/btn_border_bg">
|
||||
|
||||
<net.osmand.plus.widgets.TextViewEx
|
||||
android:id="@+id/send_empty_search_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:background="?attr/selectableItemBackground"
|
||||
android:gravity="center"
|
||||
android:letterSpacing="@dimen/text_button_letter_spacing"
|
||||
android:maxLines="1"
|
||||
android:paddingBottom="@dimen/context_menu_padding_margin_small"
|
||||
android:paddingLeft="@dimen/context_menu_padding_margin_small"
|
||||
android:paddingRight="@dimen/context_menu_padding_margin_small"
|
||||
android:paddingTop="@dimen/context_menu_padding_margin_small"
|
||||
android:text="Отправить"
|
||||
android:textColor="?attr/wikivoyage_active_color"
|
||||
android:textSize="@dimen/default_desc_text_size"
|
||||
osmand:typeface="@string/font_roboto_medium" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</FrameLayout>
|
12
OsmAnd/res/layout/send_missing_search_query_tv.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<net.osmand.plus.widgets.TextViewEx xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical"
|
||||
android:minHeight="@dimen/bottom_sheet_title_height"
|
||||
android:paddingLeft="@dimen/content_padding"
|
||||
android:paddingRight="@dimen/content_padding"
|
||||
android:textAppearance="@style/TextAppearance.ListItemTitle"
|
||||
tools:text="Some Title" />
|
|
@ -1,4 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><resources>
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="nothing_found">Heç nə tapılmadı</string>
|
||||
<string name="restart_search">Axtarışı yenidən başlat</string>
|
||||
<string name="change_color">Rəngi dəyiş</string>
|
||||
|
@ -2141,4 +2142,11 @@
|
|||
<string name="download_wiki_region_placeholder">bu region</string>
|
||||
<string name="wiki_article_not_found">Məqalə tapılmadı</string>
|
||||
<string name="how_to_open_wiki_title">Vikipediya məqalələri necə açılır?</string>
|
||||
</resources>
|
||||
<string name="point_deleted">Nöqtə %1$s silindi</string>
|
||||
<string name="coord_input_edit_point">Nöqtəyə düzəliş et</string>
|
||||
<string name="coord_input_add_point">Nöqtə əlavə et</string>
|
||||
<string name="coord_input_save_as_track">İz kimi saxla</string>
|
||||
<string name="coord_input_save_as_track_descr">%1$s nöqtə əlavə etdiniz. Fayl adını yazıb “Saxla” düyməsinə toxunun.</string>
|
||||
<string name="error_notification_desc">Bu bildirişin ekran şəklini support@osmand.net ünvanına göndərin</string>
|
||||
<string name="get_osmand_live">Bütün xüsusiyyətləri açmaq üçün OsmAnd Live əldə edin: Limitsiz endirmələr ilə günlük xəritəsi yeniləmələri, bütün pullu və pulsuz qoşmalar, Vikipediya, Vikisəyahət və daha çoxu.</string>
|
||||
</resources>
|
||||
|
|
|
@ -275,7 +275,7 @@
|
|||
<string name="rendering_attr_moreDetailed_name">Wjace detailow</string>
|
||||
<string name="rendering_attr_lessDetailed_name">Mjenje detailow</string>
|
||||
|
||||
<string name="sort_by_name">Po mjenje sortować</string>
|
||||
<string name="sort_by_name">Po mjenje sortěrować</string>
|
||||
<string name="gpx_info_average_speed">Přerězna spěšnosć: %1$s</string>
|
||||
<string name="gpx_info_maximum_speed">Maksimalna spěšnosć: %1$s</string>
|
||||
<string name="gpx_info_avg_altitude">Přerězna wysokosć: %1$s</string>
|
||||
|
@ -290,56 +290,56 @@
|
|||
<string name="misc_pref_title">Wšelake</string>
|
||||
<string name="localization_pref_title">Nastajenje rěčow a krajow</string>
|
||||
<string name="index_item_world_basemap">Zakładna karta swěta</string>
|
||||
<string name="lang_zh">Chinšćina</string>
|
||||
<string name="lang_pt_br">Portugalšćina (Brazilska)</string>
|
||||
<string name="lang_en">Jendźelšćina</string>
|
||||
<string name="lang_af">Afrikaans</string>
|
||||
<string name="lang_al">Albanšćina</string>
|
||||
<string name="lang_ar">Arabšćina</string>
|
||||
<string name="lang_hy">Armenšćina</string>
|
||||
<string name="lang_eu">Baskišćina</string>
|
||||
<string name="lang_be">Běłorušćina</string>
|
||||
<string name="lang_bs">Bosnišćina</string>
|
||||
<string name="lang_bg">Bołharšćina</string>
|
||||
<string name="lang_ca">Katalanšćina</string>
|
||||
<string name="lang_hr">Chorwatšćina</string>
|
||||
<string name="lang_cs">Čěšćina</string>
|
||||
<string name="lang_da">Danšćina</string>
|
||||
<string name="lang_nl">Nižozemšćina</string>
|
||||
<string name="lang_fi">Finšćina</string>
|
||||
<string name="lang_fr">Francošćina</string>
|
||||
<string name="lang_ka">Georgišćina</string>
|
||||
<string name="lang_de">Němčina</string>
|
||||
<string name="lang_el">Grjekšćina</string>
|
||||
<string name="lang_iw">Hebrejšćina</string>
|
||||
<string name="lang_hi">Hindišćina</string>
|
||||
<string name="lang_hu">Madźaršćina</string>
|
||||
<string name="lang_hu_formal">Madźaršćina (formalna)</string>
|
||||
<string name="lang_id">Indonešćina</string>
|
||||
<string name="lang_it">Italšćina</string>
|
||||
<string name="lang_ja">Japanšćina</string>
|
||||
<string name="lang_ko">Korejšćina</string>
|
||||
<string name="lang_lv">Letišćina</string>
|
||||
<string name="lang_lt">Litawšćina</string>
|
||||
<string name="lang_mr">Marathišćina</string>
|
||||
<string name="lang_zh">chinšćina</string>
|
||||
<string name="lang_pt_br">portugalšćina (Brazilska)</string>
|
||||
<string name="lang_en">jendźelšćina</string>
|
||||
<string name="lang_af">afrikaans</string>
|
||||
<string name="lang_al">albanšćina</string>
|
||||
<string name="lang_ar">arabšćina</string>
|
||||
<string name="lang_hy">armenšćina</string>
|
||||
<string name="lang_eu">baskišćina</string>
|
||||
<string name="lang_be">běłorušćina</string>
|
||||
<string name="lang_bs">bosnišćina</string>
|
||||
<string name="lang_bg">bołharšćina</string>
|
||||
<string name="lang_ca">katalanšćina</string>
|
||||
<string name="lang_hr">chorwatšćina</string>
|
||||
<string name="lang_cs">čěšćina</string>
|
||||
<string name="lang_da">danšćina</string>
|
||||
<string name="lang_nl">nižozemšćina</string>
|
||||
<string name="lang_fi">finšćina</string>
|
||||
<string name="lang_fr">francošćina</string>
|
||||
<string name="lang_ka">georgišćina</string>
|
||||
<string name="lang_de">němčina</string>
|
||||
<string name="lang_el">grjekšćina</string>
|
||||
<string name="lang_iw">hebrejšćina</string>
|
||||
<string name="lang_hi">hindišćina</string>
|
||||
<string name="lang_hu">madźaršćina</string>
|
||||
<string name="lang_hu_formal">madźaršćina (formalna)</string>
|
||||
<string name="lang_id">indonešćina</string>
|
||||
<string name="lang_it">italšćina</string>
|
||||
<string name="lang_ja">japanšćina</string>
|
||||
<string name="lang_ko">korejšćina</string>
|
||||
<string name="lang_lv">letišćina</string>
|
||||
<string name="lang_lt">litawšćina</string>
|
||||
<string name="lang_mr">marathišćina</string>
|
||||
<string name="lang_no">norwegšćina (Bokmål)</string>
|
||||
<string name="lang_fa">Perzišćina</string>
|
||||
<string name="lang_pl">Pólšćina</string>
|
||||
<string name="lang_pt">Portugalšćina</string>
|
||||
<string name="lang_ro">Rumunšćina</string>
|
||||
<string name="lang_ru">Rušćina</string>
|
||||
<string name="lang_sc">Sardinšćina</string>
|
||||
<string name="lang_sr">Serbišćina</string>
|
||||
<string name="lang_zh_cn">Chinšćina (zjednorjena)</string>
|
||||
<string name="lang_sk">Słowakšćina</string>
|
||||
<string name="lang_sl">Słowjenšćina</string>
|
||||
<string name="lang_es">Španišćina</string>
|
||||
<string name="lang_sv">Šwedšćina</string>
|
||||
<string name="lang_zh_tw">Chinšćina (tradicionelna)</string>
|
||||
<string name="lang_tr">Turkowšćina</string>
|
||||
<string name="lang_uk">Ukrainšćina</string>
|
||||
<string name="lang_vi">Vietnamšćina</string>
|
||||
<string name="lang_cy">Walizišćina</string>
|
||||
<string name="lang_fa">perzišćina</string>
|
||||
<string name="lang_pl">pólšćina</string>
|
||||
<string name="lang_pt">portugalšćina</string>
|
||||
<string name="lang_ro">rumunšćina</string>
|
||||
<string name="lang_ru">rušćina</string>
|
||||
<string name="lang_sc">sardinšćina</string>
|
||||
<string name="lang_sr">serbišćina</string>
|
||||
<string name="lang_zh_cn">chinšćina (zjednorjena)</string>
|
||||
<string name="lang_sk">słowakšćina</string>
|
||||
<string name="lang_sl">słowjenšćina</string>
|
||||
<string name="lang_es">španišćina</string>
|
||||
<string name="lang_sv">šwedšćina</string>
|
||||
<string name="lang_zh_tw">chinšćina (tradicionelna)</string>
|
||||
<string name="lang_tr">turkowšćina</string>
|
||||
<string name="lang_uk">ukrainšćina</string>
|
||||
<string name="lang_vi">vietnamšćina</string>
|
||||
<string name="lang_cy">walizišćina</string>
|
||||
<string name="index_name_canada">Sewjerna Amerika - Kanada</string>
|
||||
<string name="index_name_italy">Europa - Italska</string>
|
||||
<string name="index_name_gb">Europa - Wulka Britaniska</string>
|
||||
|
@ -898,9 +898,9 @@
|
|||
<string name="change_markers_position">Poziciju chorhojčki změnić</string>
|
||||
<string name="lang_es_us">španišćina (Amerika)</string>
|
||||
<string name="lang_ast">asturišćina</string>
|
||||
<string name="lang_en_gb">Jendźelšćina (Zjednoćene kralestwo)</string>
|
||||
<string name="lang_be_by">Běłorušćina (łaćonsce)</string>
|
||||
<string name="lang_kn">Kannadašćina</string>
|
||||
<string name="lang_en_gb">jendźelšćina (Zjednoćene kralestwo)</string>
|
||||
<string name="lang_be_by">běłorušćina (łaćonsce)</string>
|
||||
<string name="lang_kn">kannadašćina</string>
|
||||
<string name="shared_string_is_open_24_7">Bjez přestawki wočinjene</string>
|
||||
<string name="storage_directory_card">Składowanska karta</string>
|
||||
<string name="coords_format">Format koordinatow</string>
|
||||
|
@ -1486,8 +1486,35 @@
|
|||
<string name="free">Swobodne %1$s</string>
|
||||
<string name="device_memory">Skład nastroje</string>
|
||||
<string name="free_downloads_used_description">Pokaza ličbu zbywacych bjezpłatnych sćehnjenjow.</string>
|
||||
<string name="show_passed"></string>
|
||||
<string name="show_passed"/>
|
||||
<string name="online_webpage_warning">Strona steji jenož online k dispoziciji. Chceš ju w browseru wočinić?</string>
|
||||
<string name="gpx_no_tracks_title_folder">Móžeš tež GPX-dataje dodać</string>
|
||||
<string name="empty_state_my_tracks">GPX-dataje dodać</string>
|
||||
<string name="sort_by_distance">Po zdalenosći sortěrować</string>
|
||||
<string name="save_as_favorites_points">Jako skupinu faworitow składować</string>
|
||||
<string name="select_destination_and_intermediate_points">Cile wubrać</string>
|
||||
<string name="shared_string_waypoint">Čarowy dypk</string>
|
||||
<string name="gpx_info_subtracks">Podčary: %1$s</string>
|
||||
<string name="gpx_info_waypoints">Čarowe dypki: %1$s</string>
|
||||
<string name="gpx_info_distance">Zdalenosć: %1$s (%2$s dypk/ow)</string>
|
||||
<string name="gpx_info_start_time">Startowanski čas: %1$tF, %1$tT</string>
|
||||
<string name="gpx_info_end_time">Čas přijězda: %1$tF, %1$tT</string>
|
||||
<string name="gpx_info_asc_altitude">Postup/zestup: %1$s</string>
|
||||
<string name="gpx_selection_segment_title">Wotrězk</string>
|
||||
<string name="gpx_selection_number_of_points">%1$s dypk(ow)</string>
|
||||
<string name="gpx_selection_point">Dypk %1$s</string>
|
||||
<string name="gpx_selection_points">%1$s
|
||||
\ndypk(ow)</string>
|
||||
<string name="gpx_file_is_empty">Prózdna GPX-dataja</string>
|
||||
<string name="osmo_connect_menu">Zwjazać</string>
|
||||
<string name="int_days">dnjow</string>
|
||||
<string name="use_points_as_intermediates">Čaru mjez dypkami wobličić</string>
|
||||
<string name="lang_sr_latn">serbišćina (łaćonsce)</string>
|
||||
<string name="lang_zh_hk">chinšćina (Hongkong)</string>
|
||||
<string name="keep_and_add_destination_point">Jako slědowacy cil dodać</string>
|
||||
<string name="select_gpx">GPX wubrać…</string>
|
||||
<string name="route_preferences">Přeće za čaru</string>
|
||||
<string name="route_info">Informacije wo čarje</string>
|
||||
<string name="routing_attr_prefer_motorway_name">Awtodróhi preferować</string>
|
||||
<string name="routing_attr_prefer_motorway_description">Awtodróhi preferować</string>
|
||||
</resources>
|
||||
|
|
|
@ -3098,4 +3098,9 @@ Praparcyjnaj pamiacі %4$s MB (Abmiežavańnie Android %5$s MB, Dalvik %6$s MB).
|
|||
<string name="coord_input_save_as_track">Zachavać jak slied</string>
|
||||
<string name="coord_input_save_as_track_descr">Vy dadali %1$s kropak. Uviadzicie nazvu fajla i nacisnicie «zachavać».</string>
|
||||
<string name="point_deleted">Kropka %1$s vydalienaja</string>
|
||||
<string name="shared_string_world">Sviet</string>
|
||||
<string name="send_search_query_description">Vy adpravim vaš pašukovy zapyt <b>«%1$s»</b>, a taksama vaša miescaznachodžannie. <br/><br/> My nie zbirajem asabistyja zviestki, nam patrebnyja toĺki danyja pošuku, kab paliepšyć alharytm.<br/></string>
|
||||
<string name="search_no_results_description">Niama vynikaŭ?
|
||||
\nRaspaviadzicie nam ab hetym.</string>
|
||||
<string name="send_search_query">Adpravić pašukovy zapyt?</string>
|
||||
</resources>
|
||||
|
|
|
@ -3905,4 +3905,12 @@
|
|||
<string name="poi_payment_contactless_yes">Безкантактная</string>
|
||||
<string name="poi_payment_contactless_no">Безкантактная аплата не прымаецца</string>
|
||||
|
||||
<string name="poi_hazard_nuclear">Ядзерная небяспека</string>
|
||||
<string name="poi_hazard_erosion">Небяспека эрозіі</string>
|
||||
<string name="poi_hazard_avalanche">Небяспека лавіны</string>
|
||||
<string name="poi_hazard_slippery_road">Слізкая дарога</string>
|
||||
<string name="poi_hazard_flood">Небяспека паводкі</string>
|
||||
<string name="poi_hazard_minefield">Міннае поле</string>
|
||||
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -3149,4 +3149,9 @@
|
|||
<string name="coord_input_save_as_track">Захаваць як след</string>
|
||||
<string name="coord_input_save_as_track_descr">Вы дадалі %1$s кропак. Увядзіце назву файла і націсніце «захаваць».</string>
|
||||
<string name="point_deleted">Кропка %1$s выдаленая</string>
|
||||
<string name="shared_string_world">Свет</string>
|
||||
<string name="send_search_query_description">Вы адправім ваш пашуковы запыт <b>«%1$s»</b>, а таксама ваша месцазнаходжанне. <br/><br/> Мы не збіраем асабістыя звесткі, нам патрэбныя толькі даныя пошуку, каб палепшыць алгарытм.<br/></string>
|
||||
<string name="search_no_results_description">Няма вынікаў?
|
||||
\nРаспавядзіце нам аб гэтым.</string>
|
||||
<string name="send_search_query">Адправіць пашуковы запыт?</string>
|
||||
</resources>
|
||||
|
|
|
@ -2984,4 +2984,23 @@ Abasta l\'àrea: %1$s x %2$s</string>
|
|||
<string name="coord_input_save_as_track">Desa com una traça</string>
|
||||
<string name="coord_input_save_as_track_descr">Heu afegit %1$s punts. Introduïu un nom de fitxer i premeu \"Desa\".</string>
|
||||
<string name="point_deleted">El punt %1$s s\'ha esborrat</string>
|
||||
<string name="shared_string_world">Mundial</string>
|
||||
<string name="send_search_query_description">Enviarem la vostra consulta de cerca: <b>\"%1$s\"</b>, així com la vostra ubicació.<br/><br/> No desem cap informació personal, només volem les dades de la cerca per millorar-ne l\'algorisme.<br/></string>
|
||||
<string name="search_no_results_description">Cap resultat?
|
||||
\nParleu-nos-en al respecte.</string>
|
||||
<string name="send_search_query">Voleu enviar la consulta de cerca?</string>
|
||||
<string name="release_3_1">• Navegació: Correcció en la barra de progrés, intercanvi ràpid del punt inicial i final de la ruta
|
||||
\n
|
||||
\n• Marcadors de mapa: Correcció de l\'activació/desactivació de grups, possibilitat d\'amagar marcadors del mapa
|
||||
\n
|
||||
\n• Edició OSM: Capacitat per editar les etiquetes per objectes no puntuals, correcció de la pèrdua de comentaris a les notes, còpia de seguretat de les edicions
|
||||
\n
|
||||
\n• Millora la anàlisi de Viquipèdia i Wikiviatge, els fitxers actualitzats ja estan disponibles
|
||||
\n
|
||||
\n• Menú contextual: Arregla el color dels indicadors de nom de via en el mode nocturn, correcció de la mida del menú addicional
|
||||
\n
|
||||
\n• Altres correccions d\'errors
|
||||
\n
|
||||
\n</string>
|
||||
<string name="increase_search_radius_to">Augmenta el radi de cerca fins %1s</string>
|
||||
</resources>
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
<string name="poi_service_tyres">Pneuservis</string>
|
||||
<string name="poi_car_wash">Myčka</string>
|
||||
<string name="poi_fuel">Čerpací stanice;Benzínová pumpa</string>
|
||||
<string name="poi_electricity_combined_charging">Dobíjecí stanice</string>
|
||||
<string name="poi_electricity_combined_charging">Nabíjecí stanice</string>
|
||||
<string name="poi_parking">Parkoviště</string>
|
||||
<string name="poi_garages">Garáže</string>
|
||||
|
||||
|
@ -217,8 +217,8 @@
|
|||
<string name="poi_lift_gate">Zvedací brána</string>
|
||||
<string name="poi_traffic_calming_bump">Retardér</string>
|
||||
<string name="poi_traffic_calming_hump">Dlouhý retardér</string>
|
||||
<string name="poi_vehicle_inspection">Kontrola vozidel</string>
|
||||
<string name="poi_parking_entrance">Vjezd parkoviště</string>
|
||||
<string name="poi_vehicle_inspection">Stanice STK a měření emisí</string>
|
||||
<string name="poi_parking_entrance">Vjezd na parkoviště</string>
|
||||
<string name="poi_tram_stop">Tramvajová zastávka</string>
|
||||
<string name="poi_historic_mine">Historický důl</string>
|
||||
<string name="poi_education">Vzdělání</string>
|
||||
|
@ -323,7 +323,7 @@
|
|||
<string name="poi_traffic_calming_choker">Zůžení</string>
|
||||
<string name="poi_fuel_diesel">Nafta</string>
|
||||
<string name="poi_fuel_gtl_diesel">Vysoce kvalitní nafta</string>
|
||||
<string name="poi_fuel_hgv_diesel">Nafta (tlakový přívod)</string>
|
||||
<string name="poi_fuel_hgv_diesel">Nafta s pistolí pro nákladní vozidla</string>
|
||||
<string name="poi_fuel_biodiesel">Bionafta</string>
|
||||
<string name="poi_fuel_lpg">LPG</string>
|
||||
<string name="poi_fuel_octane_80">80 oktanů</string>
|
||||
|
@ -3603,10 +3603,10 @@
|
|||
<string name="poi_water_supply_water_trucking">Dovážení autem</string>
|
||||
<string name="poi_water_place_access_multifamilies">Pro více rodin</string>
|
||||
|
||||
<string name="poi_socket_cee_blue">Konektor: CEE modrý (karavanový)</string>
|
||||
<string name="poi_socket_cee_blue_current">Konektor: CEE Modrý (karavanový): Maximální proud</string>
|
||||
<string name="poi_socket_cee_blue_output">Konektor: CEE Modrý (karavanový): Maximální výkon</string>
|
||||
<string name="poi_socket_cee_red_16a">Konektor: CEE Červený 16A (pětikolík malý)</string>
|
||||
<string name="poi_socket_cee_blue">Počet zásuvek typu CEE modrá (kulatá karavanová)</string>
|
||||
<string name="poi_socket_cee_blue_current">Maximální proud zásuvky CEE Modrá (tzv. karavanová) [A]</string>
|
||||
<string name="poi_socket_cee_blue_output">Maximální výkon zásuvky CEE Modrá (tzv. karavanová) [kW]</string>
|
||||
<string name="poi_socket_cee_red_16a">Počet zásuvek typu CEE červená 16A (pětikolík malý)</string>
|
||||
<string name="poi_socket_cee_red_16a_current">Konektor: CEE Červený 16A (pětikolík malý): Maximální proud</string>
|
||||
<string name="poi_socket_cee_red_16a_output">Konektor: CEE Červený 16A (pětikolík malý): Maximální výkon</string>
|
||||
<string name="poi_socket_cee_red_32a">Konektor: CEE Červený 32A (pětikolík velký)</string>
|
||||
|
@ -3668,4 +3668,77 @@
|
|||
<string name="poi_payment_contactless_yes">Lze platit bezkontaktně</string>
|
||||
<string name="poi_payment_contactless_no">Nelze platit bezkontaktně</string>
|
||||
|
||||
<string name="poi_socket_type1">Počet konektorů typu 1 (tzv. Yazaki, SAE J1772)</string>
|
||||
<string name="poi_socket_type1_current">Maximální proud konektoru Typu 1 (tzv. Yazaki, SAE J1772) [A]</string>
|
||||
<string name="poi_socket_type1_output">Maximální výkon konektoru Typu 1 (tzv. Yazaki, SAE J1772) [kW]</string>
|
||||
<string name="poi_socket_type2">Počet konektorů typu 2 (tzv.Mennekes)</string>
|
||||
<string name="poi_socket_type2_current">Maximální proud konektoru typu 2 (tzv. Mennekes) [A]</string>
|
||||
<string name="poi_socket_type2_output">Maximální výkon konektoru typu 2 (tzv. Mennekes) [kW]</string>
|
||||
<string name="poi_socket_type1_combo">"Počet konektorů typu 1 combo "</string>
|
||||
<string name="poi_socket_type1_combo_current">Maximální proud konektoru 1 combo [A]</string>
|
||||
<string name="poi_socket_type1_combo_output">Maximální výkon konektoru typu 1 combo [kW]</string>
|
||||
<string name="poi_socket_type2_combo">Počet konektorů typu CCS (Typ 2 kombinovaný)</string>
|
||||
<string name="poi_socket_type2_combo_current">Maximální proud konektoru CCS (Typ 2 kombinovaný) [A]</string>
|
||||
<string name="poi_socket_type2_combo_output">Maximální výkon konektoru CCS (Typ 2 kombinovaný) [kW]</string>
|
||||
<string name="poi_socket_chademo">Počet konektorů CHAdeMO</string>
|
||||
<string name="poi_socket_chademo_current">Maximální proud konektoru CHAdeMO [A]</string>
|
||||
<string name="poi_socket_chademo_output">Maximální výkon konektoru CHAdeMO [kW]</string>
|
||||
<string name="poi_socket_tesla_supercharger">Počet stanic Tesla Supercharger</string>
|
||||
<string name="poi_socket_tesla_supercharger_current">Maximální proud stanice Tesla Supercharger [A]</string>
|
||||
<string name="poi_socket_tesla_supercharger_output">Maximální výkon stanice Tesla Supercharger [kW]</string>
|
||||
<string name="poi_socket_nema_5_15">Počet zásuvek amerického typu NEMA 5-15R</string>
|
||||
<string name="poi_socket_nema_5_20">Počet zásuvek amerického typu NEMA 5-20</string>
|
||||
<string name="poi_socket_nema_14_30">Počet zásuvek amerického typu NEMA 14-30</string>
|
||||
<string name="poi_socket_nema_14_50">Počet zásuvek amerického typu NEMA 14-50</string>
|
||||
<string name="poi_socket_schuko">Počet zásuvek typu Schuko</string>
|
||||
<string name="poi_socket_schuko_current">Maximální proud zásuvky Schuko [A]</string>
|
||||
<string name="poi_socket_schuko_output">Maximální výkon zásuvky Schuko [kW]</string>
|
||||
<string name="poi_socket_bs1363">Počet zásuvek britského typu BS 1363</string>
|
||||
<string name="poi_socket_bs1363_current">Maximální proud zásuvky britského typu BS 1363 [A]</string>
|
||||
<string name="poi_socket_bs1363_output">Maximální výkon zásuvky britského typu BS 1363 [kW]</string>
|
||||
<string name="poi_socket_as3112">Počet zásuvek australského typu AS 3112</string>
|
||||
<string name="poi_socket_as3112_current">Maximální proud zásuvky australského typu AS 3112 [A]</string>
|
||||
<string name="poi_socket_as3112_output">Maximální výkon zásuvky australského typu AS 3112 [kW]</string>
|
||||
|
||||
<string name="poi_car_yes">Vjezd autem povolen</string>
|
||||
<string name="poi_car_no">Vjezd autem zakázán</string>
|
||||
<string name="poi_bicycle_yes">Vjezd na kole povolen</string>
|
||||
<string name="poi_bicycle_no">Vjezd na kole zakázán</string>
|
||||
<string name="poi_scooter_yes">Vjezd na skútru povolen</string>
|
||||
<string name="poi_scooter_no">Vjezd na skútru zakázán</string>
|
||||
<string name="poi_truck_yes">Vjezd nákladním autem povolen</string>
|
||||
<string name="poi_truck_no">Vjezd nákladním autem zakázán</string>
|
||||
|
||||
<string name="poi_parking_fee_yes">Parkoviště s poplatkem</string>
|
||||
<string name="poi_parking_fee_no">Parkoviště bez poplatku</string>
|
||||
<string name="poi_parking_fee">Poplatek za parkování</string>
|
||||
|
||||
<string name="poi_amperage">Maximální proud [A]</string>
|
||||
<string name="poi_charging_station_output">Maximální výkon nabíjecí stanice [kW]</string>
|
||||
|
||||
<string name="poi_map_type_topo">Topografická mapa</string>
|
||||
<string name="poi_map_type_street">Podrobná mapa okolí</string>
|
||||
<string name="poi_map_type_scheme">Schematická mapa</string>
|
||||
<string name="poi_map_type_toposcope">Toposkop (tabulka s významnými body nadohled)</string>
|
||||
<string name="poi_map_size_site">Zobrazuje jen nejbližší okolí</string>
|
||||
<string name="poi_map_size_city">Zobrazuje celou obec</string>
|
||||
<string name="poi_map_size_region">Zobrazuje okolní region</string>
|
||||
|
||||
<string name="poi_charging_station_filter">Nabíjecí stanice</string>
|
||||
|
||||
<string name="poi_depot">Depo</string>
|
||||
|
||||
<string name="poi_letter_box">Poštovní schránka</string>
|
||||
<string name="poi_post_street">Ulice</string>
|
||||
<string name="poi_post_housenumber">Číslo popisné</string>
|
||||
<string name="poi_ref_post">PSČ</string>
|
||||
|
||||
<string name="poi_hazard_nuclear">Nebezpečná radioaktivita</string>
|
||||
<string name="poi_hazard_erosion">Nebezpečí eroze</string>
|
||||
<string name="poi_hazard_avalanche">Lavinové nebezpečí</string>
|
||||
<string name="poi_hazard_slippery_road">Kluzká cesta</string>
|
||||
<string name="poi_hazard_flood">Nebezpečí záplavy</string>
|
||||
<string name="poi_hazard_minefield">Minové pole</string>
|
||||
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -3949,4 +3949,12 @@
|
|||
<string name="poi_payment_contactless_yes">Kontaktløs</string>
|
||||
<string name="poi_payment_contactless_no">Kontaktløs ikke accepteret</string>
|
||||
|
||||
<string name="poi_hazard_nuclear">Nuklear fare</string>
|
||||
<string name="poi_hazard_erosion">Erosionsfare</string>
|
||||
<string name="poi_hazard_avalanche">Lavinefare</string>
|
||||
<string name="poi_hazard_slippery_road">Glat vejbane</string>
|
||||
<string name="poi_hazard_flood">Oversvømmelse fare</string>
|
||||
<string name="poi_hazard_minefield">Minefelt</string>
|
||||
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -3169,4 +3169,23 @@ Repræsenterer område: %1$s x %2$s</string>
|
|||
<string name="coord_input_save_as_track">Gem som spor</string>
|
||||
<string name="coord_input_save_as_track_descr">%1$s punkter tilføjet. Indtast et filnavn og tryk på “Gem“.</string>
|
||||
<string name="point_deleted">Punkt %1$s er blevet slettet</string>
|
||||
<string name="shared_string_world">Verden</string>
|
||||
<string name="send_search_query_description">Send søgestrengen: <b>\"%1$s\"</b> samt lokationen.<br/><br/>" Der indsamles ikke personlige oplysninger, data bruges kun til at forbedre søgealgoritmen."<br/></string>
|
||||
<string name="search_no_results_description">Ingen resultater?
|
||||
\nRapporter det.</string>
|
||||
<string name="send_search_query">Send søgeforespørgsel?</string>
|
||||
<string name="release_3_1">• Navigation: Fix statuslinjen, hurtigt ombytning af start-og slutpunkt på ruten
|
||||
\n
|
||||
\n• Kort markører: fastgør tænd/sluk-grupper, evne til at skjule markører på kortet
|
||||
\n
|
||||
\n• OSM redigering: mulighed for at redigere tags for ikke-punkt objekter, løs manglende kommentarer til noter, backup af redigeringer
|
||||
\n
|
||||
\n• Forbedre Wikipedia og Wikivoyage parsing, opdaterede filer findes allerede
|
||||
\n
|
||||
\n• Context menu: fix transport shields farve i nat-tilstand, fastsætte yderligere menu størrelser
|
||||
\n
|
||||
\n• Andre fejlrettelser
|
||||
\n
|
||||
\n</string>
|
||||
<string name="increase_search_radius_to">Forøg søgeradius til %1$s</string>
|
||||
</resources>
|
||||
|
|
|
@ -1523,7 +1523,7 @@
|
|||
<string name="poi_microbrewery_yes">Minibrauerei</string>
|
||||
<string name="poi_microbrewery_no">Keine Minibrauerei</string>
|
||||
|
||||
<string name="poi_takeaway_yes">Zum mitnehmen</string>
|
||||
<string name="poi_takeaway_yes">Zum Mitnehmen</string>
|
||||
<string name="poi_takeaway_no">Nicht zum Mitnehmen</string>
|
||||
<string name="poi_takeaway_only">nur zum Mitnehmen</string>
|
||||
|
||||
|
@ -3867,4 +3867,12 @@
|
|||
<string name="poi_payment_contactless_yes">Kontaktlos</string>
|
||||
<string name="poi_payment_contactless_no">Kontaktlos nicht akzeptiert</string>
|
||||
|
||||
<string name="poi_hazard_nuclear">nukleare Gefahr</string>
|
||||
<string name="poi_hazard_erosion">Erosionsgefahr</string>
|
||||
<string name="poi_hazard_avalanche">Lawinengefahr</string>
|
||||
<string name="poi_hazard_slippery_road">Rutschgefahr</string>
|
||||
<string name="poi_hazard_flood">Überschwemmungsgefahr</string>
|
||||
<string name="poi_hazard_minefield">Minenfeld</string>
|
||||
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -3067,4 +3067,10 @@ Abgedeckte Fläche: %1$s x %2$s</string>
|
|||
<string name="coord_input_save_as_track">Als Track speichern</string>
|
||||
<string name="coord_input_save_as_track_descr">Sie haben %1$s Punkte hinzugefügt. Geben Sie den Dateinamen ein und klicken Sie auf \"Speichern\".</string>
|
||||
<string name="point_deleted">Punkt %1$s gelöscht</string>
|
||||
<string name="send_search_query_description">Es wird Ihre Suchanfrage: <b>\"%1$s\"</b>, sowie Ihr Standort gesendet.<br/><br/> Wir sammeln keine persönlichen Daten, die Informationen dienen nur der Verbesserung des Suchalgorithmus.<br/></string>
|
||||
<string name="search_no_results_description">Keine Ergebnisse?
|
||||
\nNehmen Sie Kontakt mit uns auf.</string>
|
||||
<string name="send_search_query">Suchanfrage senden?</string>
|
||||
<string name="shared_string_world">Welt</string>
|
||||
<string name="increase_search_radius_to">Vergrößerung des Suchradius auf %1$s</string>
|
||||
</resources>
|
||||
|
|
|
@ -3589,4 +3589,251 @@
|
|||
<string name="poi_water_place_durability_durable">Διατηρησιμότητα νερόλακκου: σταθερή</string>
|
||||
<string name="poi_water_place_durability_emergency">Διατηρησιμότητα νερόλακκου: επείγουσα</string>
|
||||
|
||||
</resources>
|
||||
<string name="poi_socket_tesla_supercharger_current">Ρευματοδότης: Υπερφορτιστής Τέσλα: ρεύμα</string>
|
||||
<string name="poi_socket_tesla_supercharger_output">Ρευματοδότης: Υπερφορτιστής Τέσλα: έξοδος</string>
|
||||
<string name="poi_socket_tesla_roadster">Ρευματοδότης: Ρόντστερ Τέσλα</string>
|
||||
<string name="poi_socket_tesla_roadster_current">Ρευματοδότης: Ρόντστερ Τέσλα: ρεύμα</string>
|
||||
<string name="poi_socket_tesla_roadster_output">Ρευματοδότης: Ρόντστερ Τέσλα: έξοδος</string>
|
||||
<string name="poi_socket_nema_5_15">Ρευματοδότης: NEMA 5-15R</string>
|
||||
<string name="poi_socket_nema_5_15_current">Ρευματοδότης: NEMA 5-15R: ρεύμα</string>
|
||||
<string name="poi_socket_nema_5_15_output">Ρευματοδότης: NEMA 5-15R: έξοδος</string>
|
||||
<string name="poi_socket_nema_5_20">Ρευματοδότης: NEMA 5-20</string>
|
||||
<string name="poi_socket_nema_5_20_current">Ρευματοδότης: NEMA 5-20: ρεύμα</string>
|
||||
<string name="poi_socket_nema_5_20_output">Ρευματοδότης: NEMA 5-20: έξοδος</string>
|
||||
<string name="poi_socket_nema_14_30">Ρευματοδότης: NEMA 14-30</string>
|
||||
<string name="poi_socket_nema_14_30_current">Ρευματοδότης: NEMA 14-30: ρεύμα</string>
|
||||
<string name="poi_socket_nema_14_30_output">Ρευματοδότης: NEMA 14-30: έξοδος</string>
|
||||
<string name="poi_socket_nema_14_50">Ρευματοδότης: NEMA 14-50</string>
|
||||
<string name="poi_socket_nema_14_50_current">Ρευματοδότης: NEMA 14-50: ρεύμα</string>
|
||||
<string name="poi_socket_nema_14_50_output">Ρευματοδότης: NEMA 14-50: έξοδος</string>
|
||||
<string name="poi_socket_schuko">Ρευματοδότης: Σούκο</string>
|
||||
<string name="poi_socket_schuko_current">Ρευματοδότης: Σούκο: ρεύμα</string>
|
||||
<string name="poi_socket_schuko_output">Ρευματοδότης: σούκο: έξοδος</string>
|
||||
<string name="poi_socket_bs1363">Ρευματοδότης: BS 1363</string>
|
||||
<string name="poi_socket_bs1363_current">Ρευματοδότης: BS 1363: ρεύμα</string>
|
||||
<string name="poi_socket_bs1363_output">Ρευματοδότης: BS 1363: έξοδος</string>
|
||||
<string name="poi_socket_as3112">Ρευματοδότης: AS/NZS 3112</string>
|
||||
<string name="poi_socket_as3112_current">Ρευματοδότης: AS/NZS 3112: ρεύμα</string>
|
||||
<string name="poi_socket_as3112_output">Ρευματοδότης: AS/NZS 3112: έξοδος</string>
|
||||
|
||||
<string name="poi_car_yes">Αυτοκίνητο: ναι</string>
|
||||
<string name="poi_car_no">Αυτοκίνητο: όχι</string>
|
||||
<string name="poi_bicycle_yes">Ποδήλατο: ναι</string>
|
||||
<string name="poi_bicycle_no">Ποδήλατο: όχι</string>
|
||||
<string name="poi_scooter_yes">Σκούτερ: ναι</string>
|
||||
<string name="poi_scooter_no">Σκούτερ: όχι</string>
|
||||
<string name="poi_truck_yes">Φορτηγό: ναι</string>
|
||||
<string name="poi_truck_no">Φορτηγό: όχι</string>
|
||||
|
||||
<string name="poi_parking_fee_yes">Τέλος στάθμευσης: ναι</string>
|
||||
<string name="poi_parking_fee_no">Τέλος στάθμευσης: όχι</string>
|
||||
<string name="poi_parking_fee">Τέλος στάθμευσης</string>
|
||||
|
||||
<string name="poi_amperage">Αμπέρ</string>
|
||||
<string name="poi_charging_station_output">Έξοδος σταθμού φόρτισης</string>
|
||||
|
||||
<string name="poi_map_type_topo">Τύπος χάρτη: τοπογραφικός</string>
|
||||
<string name="poi_map_type_street">Τύπος χάρτη: δρόμος</string>
|
||||
<string name="poi_map_type_scheme">Τύπος χάρτη: σχήμα</string>
|
||||
<string name="poi_map_type_toposcope">Τύπος χάρτη: τοποσκοπικός</string>
|
||||
<string name="poi_map_size_site">Μέγεθος χάρτη: τόπος</string>
|
||||
<string name="poi_map_size_city">Μέγεθος χάρτη: πόλη</string>
|
||||
<string name="poi_map_size_region">Μέγεθος χάρτη: περιοχή</string>
|
||||
|
||||
<string name="poi_charging_station_filter">Σταθμός φόρτισης</string>
|
||||
|
||||
<string name="poi_depot">Αμαξοστάσιο</string>
|
||||
|
||||
<string name="poi_letter_box">Γραμματοκιβώτιο</string>
|
||||
<string name="poi_post_street">Δρόμος</string>
|
||||
<string name="poi_post_housenumber">Αριθμός σπιτιού</string>
|
||||
<string name="poi_post_flats">Διαμέρισμα</string>
|
||||
|
||||
<string name="poi_payment_centre">Κέντρο πληρωμών</string>
|
||||
<string name="poi_money_transfer">Μεταφορά χρημάτων</string>
|
||||
|
||||
<string name="poi_ref_post">Ταχυδρομικός κώδικας</string>
|
||||
|
||||
<string name="poi_climbing_sport_yes">Αθλητισμός: ναι</string>
|
||||
<string name="poi_climbing_sport_no">Αθλητισμός: όχι</string>
|
||||
<string name="poi_climbing_boulder_yes">Μπούλντερινγκ: ναι</string>
|
||||
<string name="poi_climbing_boulder_no">Μπούλντερινγκ: όχι</string>
|
||||
<string name="poi_climbing_toprope_yes">Αναρρίχηση με σχοινί από πάνω: ναι</string>
|
||||
<string name="poi_climbing_toprope_no">Αναρρίχηση με σχοινί από πάνω: όχι</string>
|
||||
<string name="poi_climbing_trad_yes">Παραδοσιακά: ναι</string>
|
||||
<string name="poi_climbing_trad_no">Παραδοσιακά: όχι</string>
|
||||
<string name="poi_climbing_multipitch_yes">Διαδρομές πολλαπλών σχοινιών: ναι</string>
|
||||
<string name="poi_climbing_multipitch_no">Διαδρομές πολλαπλών σχοινιών: ναι</string>
|
||||
<string name="poi_climbing_ice_yes">Πάγος: ναι</string>
|
||||
<string name="poi_climbing_ice_no">Πάγος: όχι</string>
|
||||
<string name="poi_climbing_mixed_yes">Ανάμεικτο: ναι</string>
|
||||
<string name="poi_climbing_mixed_no">Ανάμεικτο: όχι</string>
|
||||
<string name="poi_climbing_deepwater_yes">Μόνος σε βαθιά νερά: ναι</string>
|
||||
<string name="poi_climbing_deepwater_no">Μόνος σε βαθιά νερά: όχι</string>
|
||||
|
||||
<string name="poi_climbing_length">Μήκος αναρρίχησης</string>
|
||||
<string name="poi_climbing_length_min">Ελάχιστο μήκος αναρρίχησης</string>
|
||||
<string name="poi_climbing_length_max">Μέγιστο μήκος αναρρίχησης</string>
|
||||
<string name="poi_climbing_rock_limestone">Πέτρωμα αναρρίχησης: ασβεστόλιθος</string>
|
||||
<string name="poi_climbing_rock_granite">Πέτρωμα αναρρίχησης: γρανίτης</string>
|
||||
<string name="poi_climbing_rock_sandstone">Πέτρωμα αναρρίχησης: ψαμμίτης</string>
|
||||
<string name="poi_climbing_rock_quartzite">Πέτρωμα αναρρίχησης: χαλαζίτης</string>
|
||||
<string name="poi_climbing_rock_gneiss">Πέτρωμα αναρρίχησης: γνεύσιος</string>
|
||||
<string name="poi_climbing_rock_porphyry">Πέτρωμα αναρρίχησης: πορφυρίτης</string>
|
||||
<string name="poi_climbing_quality_solid">Πέτρωμα αναρρίχησης: στερεό</string>
|
||||
<string name="poi_climbing_quality_fragile">Πέτρωμα αναρρίχησης: εύθριπτο</string>
|
||||
<string name="poi_climbing_bolted_yes">Σταθερά σημεία: ναι</string>
|
||||
<string name="poi_climbing_bolted_no">Σταθερά σημεία: όχι</string>
|
||||
<string name="poi_climbing_orientation_n">Προσανατολισμός του τοίχου: Β</string>
|
||||
<string name="poi_climbing_orientation_ne">Προσανατολισμός του τοίχου: ΒΑ</string>
|
||||
<string name="poi_climbing_orientation_e">Προσανατολισμός του τοίχου: Α</string>
|
||||
<string name="poi_climbing_orientation_se">Προσανατολισμός του τοίχου: ΝΑ</string>
|
||||
<string name="poi_climbing_orientation_s">Προσανατολισμός του τοίχου: Ν</string>
|
||||
<string name="poi_climbing_orientation_sw">Προσανατολισμός του τοίχου: ΝΔ</string>
|
||||
<string name="poi_climbing_orientation_w">Προσανατολισμός του τοίχου: Δ</string>
|
||||
<string name="poi_climbing_orientation_nw">Προσανατολισμός του τοίχου: ΒΔ</string>
|
||||
<string name="poi_climbing_summit_log_yes">Καταγραφή κορυφής αναρρίχησης: ναι</string>
|
||||
<string name="poi_climbing_summit_log_no">Καταγραφή κορυφής αναρρίχησης: όχι</string>
|
||||
<string name="poi_climbing_routes">Διαδρομές αναρρίχησης</string>
|
||||
|
||||
<string name="poi_circumference">Περίμετρος</string>
|
||||
<string name="poi_diameter_crown">Διάμετρος κορυφής</string>
|
||||
|
||||
<string name="poi_meadow_agricultural">Τύπος: αγροτικός</string>
|
||||
<string name="poi_meadow_perpetual">Τύπος: συνεχής</string>
|
||||
<string name="poi_meadow_transitional">Τύπος: μεταβατικός</string>
|
||||
<string name="poi_meadow_pasture">Τύπος: βοσκότοπος</string>
|
||||
|
||||
<string name="poi_frozen_food">Παγωμένη τροφή</string>
|
||||
|
||||
<string name="poi_agrarian">Αγροτικό κατάστημα</string>
|
||||
|
||||
<string name="poi_shop_fireplace">Κατάστημα τζακιών</string>
|
||||
|
||||
<string name="poi_shop_boat">Κατάστημα σκαφών</string>
|
||||
|
||||
<string name="poi_cannabis">Κατάστημα κάνναβις</string>
|
||||
|
||||
<string name="poi_socket_cee_blue_yes">Γαλάζιος CEE</string>
|
||||
<string name="poi_socket_cee_red_16a_yes">CEE κόκκινο 16A</string>
|
||||
<string name="poi_socket_cee_red_32a_yes">CEE κόκκινο 32A</string>
|
||||
<string name="poi_socket_cee_red_64a_yes">CEE κόκκινο 64A</string>
|
||||
<string name="poi_socket_cee_red_125a_yes">CEE κόκκινο 125A</string>
|
||||
<string name="poi_socket_type1_yes">Τύπος 1</string>
|
||||
<string name="poi_socket_type1_combo_yes">Τύπος 1 σύνθετος</string>
|
||||
<string name="poi_socket_type2_yes">Τύπος 2</string>
|
||||
<string name="poi_socket_type2_combo_yes">Τύπος 2 σύνθετος</string>
|
||||
<string name="poi_socket_type3_yes">Τύπος 3</string>
|
||||
<string name="poi_socket_chademo_yes">CHAdeMO</string>
|
||||
<string name="poi_socket_tesla_standard_yes">Πρότυπο Τέσλα</string>
|
||||
<string name="poi_socket_tesla_supercharger_yes">Υπερφορτιστής Τέσλα</string>
|
||||
<string name="poi_socket_tesla_roadster_yes">Ρόουντστερ Τέσλα</string>
|
||||
<string name="poi_socket_nema_5_15_yes">NEMA 5-15R</string>
|
||||
<string name="poi_socket_nema_5_20_yes">NEMA 5-20</string>
|
||||
<string name="poi_socket_nema_14_30_yes">NEMA 14-30</string>
|
||||
<string name="poi_socket_nema_14_50_yes">NEMA 14-50</string>
|
||||
<string name="poi_socket_schuko_yes">Σούκο</string>
|
||||
<string name="poi_socket_bs1363_yes">BS 1363</string>
|
||||
<string name="poi_socket_as3112_yes">AS/NZS 3112</string>
|
||||
|
||||
<string name="poi_socket_chademo_output_high">Υψηλή</string>
|
||||
<string name="poi_socket_chademo_output_medium">Μεσαία</string>
|
||||
<string name="poi_socket_chademo_output_low">Χαμηλή</string>
|
||||
<string name="poi_socket_type2_output_high">Υψηλή</string>
|
||||
<string name="poi_socket_type2_output_medium">Μεσαία</string>
|
||||
<string name="poi_socket_type2_output_low">Χαμηλή</string>
|
||||
<string name="poi_socket_type2_combo_output_high">Υψηλή</string>
|
||||
<string name="poi_socket_type2_combo_output_medium">Μεσαία</string>
|
||||
<string name="poi_socket_type2_combo_output_low">Χαμηλή</string>
|
||||
<string name="poi_socket_type3_output_high">Υψηλή</string>
|
||||
<string name="poi_socket_type3_output_medium">Μεσαία</string>
|
||||
<string name="poi_socket_type3_output_low">Χαμηλή</string>
|
||||
<string name="poi_socket_cee_blue_output_high">Υψηλή</string>
|
||||
<string name="poi_socket_cee_blue_output_medium">Μεσαία</string>
|
||||
<string name="poi_socket_cee_blue_output_low">Χαμηλή</string>
|
||||
<string name="poi_socket_schuko_output_high">Υψηλή</string>
|
||||
<string name="poi_socket_schuko_output_medium">Μεσαία</string>
|
||||
<string name="poi_socket_schuko_output_low">Χαμηλή</string>
|
||||
|
||||
<string name="poi_flooring">Κατάστημα δαπέδων</string>
|
||||
<string name="poi_pottery">Κεραμικά</string>
|
||||
|
||||
<string name="poi_whitewater_rapid_name">Όνομα των γρήγορων ποταμιών</string>
|
||||
|
||||
<string name="poi_outpost">Σημείο παράδοσης καταστήματος</string>
|
||||
|
||||
<string name="poi_barbecue_grill">Σχάρα ψησταριάς: ναι</string>
|
||||
|
||||
<string name="poi_water_utility">Γραφείο υπηρεσίας νερού</string>
|
||||
|
||||
<string name="poi_amusement_arcade">Ηλεκτρονική διασκέδαση</string>
|
||||
<string name="poi_adult_gaming_centre">Κέντρο παιχνιδιών ενηλίκων</string>
|
||||
|
||||
<string name="poi_service_vehicle_car_repair_yes">Επισκευή αυτοκινήτου</string>
|
||||
<string name="poi_service_vehicle_oil_change_yes">Αλλαγή λαδιών</string>
|
||||
<string name="poi_service_vehicle_used_car_sales_yes">Πωλήσεις μεταχειρισμένων οχημάτων</string>
|
||||
<string name="poi_service_vehicle_brakes_yes">Φρένα</string>
|
||||
<string name="poi_service_vehicle_new_car_sales_yes">Πωλήσεις καινούργιων οχημάτων</string>
|
||||
<string name="poi_service_vehicle_diagnostics_yes">Διαγνωστικά</string>
|
||||
<string name="poi_service_vehicle_car_parts_yes">Ανταλλακτικά οχημάτων</string>
|
||||
<string name="poi_service_vehicle_batteries_yes">Μπαταρίες</string>
|
||||
<string name="poi_service_vehicle_air_conditioning_yes">Κλιματισμός</string>
|
||||
<string name="poi_service_vehicle_body_repair_yes">Επισκευή αμαξώματος</string>
|
||||
<string name="poi_service_vehicle_electrical_yes">Ηλεκτρικά</string>
|
||||
<string name="poi_service_vehicle_wheels_yes">Ελαστικά</string>
|
||||
<string name="poi_service_vehicle_glass_yes">Τζάμια</string>
|
||||
<string name="poi_service_vehicle_truck_repair_yes">Επισκευή φορτηγών</string>
|
||||
<string name="poi_service_vehicle_muffler_yes">Σιγαστήρες</string>
|
||||
<string name="poi_service_vehicle_alignment_yes">Ευθυγράμμιση</string>
|
||||
<string name="poi_service_vehicle_transmission_repair_yes">Επισκευή κιβωτίου ταχυτήτων</string>
|
||||
<string name="poi_service_vehicle_motor_yes">Κινητήρας</string>
|
||||
<string name="poi_service_vehicle_insurance_yes">Ασφάλεια</string>
|
||||
<string name="poi_service_vehicle_tyres_yes">Ελαστικά</string>
|
||||
|
||||
<string name="poi_aerialway_zip_line">Εναέρια τροχαλία</string>
|
||||
|
||||
<string name="poi_climbing_adventure">Περιπετειώδης αναρρίχηση</string>
|
||||
|
||||
<string name="poi_via_ferrata">Αναρρίχηση με καλώδιο (Via ferrata)</string>
|
||||
<string name="poi_cable_number">Αριθμός καλωδίου</string>
|
||||
<string name="poi_via_ferrata_scale">Δυσκολία</string>
|
||||
|
||||
<string name="poi_glacier_type_icecap">Παγοκάλυμμα</string>
|
||||
<string name="poi_glacier_type_icefield">Παγονησίδα</string>
|
||||
<string name="poi_glacier_type_plateau">Υψίπεδο</string>
|
||||
<string name="poi_glacier_type_valley">Πεδιάδα</string>
|
||||
<string name="poi_glacier_type_outlet">Στόμιο</string>
|
||||
<string name="poi_glacier_type_tidewater">Νερά παλίρροιας</string>
|
||||
<string name="poi_glacier_type_mountain">Βουνό</string>
|
||||
<string name="poi_glacier_type_hanging">Αιωρούμενος</string>
|
||||
<string name="poi_glacier_type_icefall">Παγοκαταρράκτης</string>
|
||||
<string name="poi_glacier_type_rock">Πέτρα</string>
|
||||
<string name="poi_glacier_type_shelf">Ράφι πάγου (Shelf)</string>
|
||||
<string name="poi_glacier_type_remnant">Υπόλοιπα</string>
|
||||
<string name="poi_glacier_type_ice_tongue">Γλώσσα πάγου</string>
|
||||
|
||||
<string name="poi_glacier_ele_top">Υψηλότερο σημείο</string>
|
||||
<string name="poi_glacier_ele_bottom">Χαμηλότερο σημείο</string>
|
||||
<string name="poi_glacier_slope">Μέση κλίση</string>
|
||||
|
||||
<string name="poi_checkpoint_hiking">Σημείο ελέγχου πεζοπορίας</string>
|
||||
<string name="poi_checkpoint_type_stamp">Σημείο επισήμανσης</string>
|
||||
<string name="poi_checkpoint_type_code">Κωδικός</string>
|
||||
<string name="poi_checkpoint_type_notebook">Σημειωματάριο</string>
|
||||
<string name="poi_checkpoint_type_needler">Ένεση</string>
|
||||
<string name="poi_checkpoint_type_quize">Εξέταση</string>
|
||||
<string name="poi_checkpoint_type_electronic">Ηλεκτρονικό</string>
|
||||
<string name="poi_course">Πορεία</string>
|
||||
|
||||
<string name="poi_rock">Πέτρα</string>
|
||||
|
||||
<string name="poi_end_date">Τελική ημερομηνία</string>
|
||||
|
||||
<string name="poi_appliance">Κατάστημα συσκευών</string>
|
||||
|
||||
<string name="poi_outcrop">Εμφάνιση</string>
|
||||
|
||||
<string name="poi_payment_contactless_yes">Ανέπαφα</string>
|
||||
<string name="poi_payment_contactless_no">Μη αποδεκτά ανέπαφα</string>
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -399,7 +399,7 @@
|
|||
<string name="poi_recycling_rubble">ŝtonrubo</string>
|
||||
<string name="poi_works">Fabriko</string>
|
||||
<string name="poi_driving_school">Stirlernejo</string>
|
||||
<string name="poi_college">Kolegio</string>
|
||||
<string name="poi_college">Postmezgrada lernejo</string>
|
||||
<string name="poi_waterway_turning_point">Marnavigada turniĝejo</string>
|
||||
<string name="poi_dam">Akvobaraĵo</string>
|
||||
<string name="poi_weir">Riversojlo</string>
|
||||
|
@ -2811,8 +2811,8 @@
|
|||
<string name="poi_support_suspended">Muntita sur: pendigita</string>
|
||||
<string name="poi_support_tower">Muntita sur: turo</string>
|
||||
|
||||
<string name="poi_passenger_information_display_yes">Vidigilo kun informoj por pasaĝeroj: jes</string>
|
||||
<string name="poi_passenger_information_display_no">Vidigilo kun informoj por pasaĝeroj: ne</string>
|
||||
<string name="poi_passenger_information_display_yes">Elektronika tabulo de forveturoj: jes</string>
|
||||
<string name="poi_passenger_information_display_no">Elektronika tabulo de forveturoj: ne</string>
|
||||
|
||||
<string name="poi_aquaculture">Akvokulturo</string>
|
||||
<string name="poi_aquaculture_shrimp">Akvokulturo: salikokoj</string>
|
||||
|
@ -3376,8 +3376,8 @@
|
|||
<string name="poi_zoo_wildlife_park">sovaĝ-besta parko</string>
|
||||
<string name="poi_zoo_enclosure">kaĝita</string>
|
||||
<string name="poi_zoo_safari_park">safari-parko</string>
|
||||
<string name="poi_zoo_birds">bird-kaĝoj</string>
|
||||
<string name="poi_zoo_aviary">birdejo</string>
|
||||
<string name="poi_zoo_birds">bird-parko</string>
|
||||
<string name="poi_zoo_aviary">birdarkaĝo</string>
|
||||
<string name="poi_zoo_falconry">rabbirda parko</string>
|
||||
<string name="poi_zoo_reptile">rampulejo</string>
|
||||
|
||||
|
@ -3874,4 +3874,12 @@
|
|||
<string name="poi_payment_contactless_yes">senkontakta (alproksima)</string>
|
||||
<string name="poi_payment_contactless_no">Senkontakta pagmaniero malakceptata</string>
|
||||
|
||||
<string name="poi_hazard_nuclear">Danĝero: radiado</string>
|
||||
<string name="poi_hazard_erosion">Danĝero: terglitejo</string>
|
||||
<string name="poi_hazard_avalanche">Danĝero: lavango</string>
|
||||
<string name="poi_hazard_slippery_road">Danĝero: glita vojo</string>
|
||||
<string name="poi_hazard_flood">Danĝero: superakvego</string>
|
||||
<string name="poi_hazard_minefield">Danĝero: minkampo</string>
|
||||
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -2938,4 +2938,22 @@ Indikas lokon: %1$s x %2$s"</string>
|
|||
<string name="coord_input_save_as_track">Konservi kiel spuron</string>
|
||||
<string name="coord_input_save_as_track_descr">Vi aldonis %1$s punktojn. Entajpu dosiernomon kaj frapetu “konservi”.</string>
|
||||
<string name="point_deleted">Forigis la punkton %1$s</string>
|
||||
<string name="shared_string_world">Mondo</string>
|
||||
<string name="send_search_query_description">Ni sendos vian serĉ-peton: <b>“%1$s”</b> kun via pozicio.<br/><br/>Ni ne kolektas personajn informojn, ni nur bezonas serĉajn datumojn por plibonigi la algoritmon.<br/></string>
|
||||
<string name="search_no_results_description">Neniuj rezultoj?
|
||||
\nSciigu nin pri tio.</string>
|
||||
<string name="send_search_query">Ĉu sendi serĉ-peton?</string>
|
||||
<string name="release_3_1">• navigado: riparita plenumbreto, eblo por rapide interŝanĝi komencan punkton de kurso por fino
|
||||
\n
|
||||
\n • map-markoj: riparita (mal)aktivigo de grupoj, eblo por kaŝi map-markojn sur la mapo
|
||||
\n
|
||||
\n • OSM-redaktilo: eblo por redakti etikedojn de nepunktoj, riparitaj mankaj komentoj en rimarkoj, sekurkopioj de redaktoj
|
||||
\n
|
||||
\n • plibonigita prilaborado de Vikipedio kaj Vikivojaĝo, aktualigitaj dosieroj jam elŝuteblaj
|
||||
\n
|
||||
\n • kunteksta menuo: riparita koloro de transportaj ŝirmejoj en nokta reĝimo, riparitaj grandoj de kroma menuo
|
||||
\n
|
||||
\n • aliaj erar-riparoj
|
||||
\n</string>
|
||||
<string name="increase_search_radius_to">Pliigi serĉan radiuson ĝis %1$s</string>
|
||||
</resources>
|
||||
|
|
|
@ -2387,7 +2387,7 @@
|
|||
<string name="poi_cross">Cruz</string>
|
||||
<string name="poi_summit_cross">Cumbre a la cruz: sí</string>
|
||||
|
||||
<string name="poi_prison_camp">Ex campo de prisioneros</string>
|
||||
<string name="poi_prison_camp">Ex campo de prisioneros;Ex centro clandestino de detención</string>
|
||||
<string name="poi_concentration_camp">Tipo: campo de concentración</string>
|
||||
<string name="poi_pow_camp">Tipo: prisioneros de guerra</string>
|
||||
<string name="poi_labor_camp">Tipo: trabajos forzados</string>
|
||||
|
@ -3921,4 +3921,12 @@
|
|||
<string name="poi_payment_contactless_yes">Pago sin contacto</string>
|
||||
<string name="poi_payment_contactless_no">No acepta Pagos sin contacto</string>
|
||||
|
||||
<string name="poi_hazard_nuclear">Peligro nuclear</string>
|
||||
<string name="poi_hazard_erosion">Peligro de erosión</string>
|
||||
<string name="poi_hazard_avalanche">Peligro de avalancha</string>
|
||||
<string name="poi_hazard_slippery_road">Camino resbaladizo</string>
|
||||
<string name="poi_hazard_flood">Peligro de inundación</string>
|
||||
<string name="poi_hazard_minefield">Campo minado</string>
|
||||
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -2975,4 +2975,22 @@ Lon %2$s</string>
|
|||
<string name="coord_input_save_as_track">Guardar como traza</string>
|
||||
<string name="coord_input_save_as_track_descr">Añadiste %1$s puntos. Escribe un nombre de archivo y pulsa en «Guardar».</string>
|
||||
<string name="point_deleted">Punto %1$s borrado</string>
|
||||
<string name="shared_string_world">Mundo</string>
|
||||
<string name="send_search_query_description">Enviaremos la consulta de búsqueda: <b>«%1$s»</b>, así como la ubicación.<br/><br/> No recopilamos información personal, sólo necesitamos datos de búsqueda para mejorar el algoritmo de búsqueda.<br/></string>
|
||||
<string name="search_no_results_description">¿Sin resultados?
|
||||
\nCuéntanos sobre esto.</string>
|
||||
<string name="send_search_query">¿Enviar consulta de búsqueda?</string>
|
||||
<string name="release_3_1">• Navegación: Corrección en la barra de progreso, intercambio rápido del punto inicial y final de la ruta
|
||||
\n
|
||||
\n • Marcadores del mapa: corregido el des/activar grupos, capacidad para ocultar marcadores del mapa
|
||||
\n
|
||||
\n • Edición de OSM: Capacidad para editar etiquetas en objetos sin puntos, corrección de los comentarios vacíos en las notas, copia de seguridad de ediciones
|
||||
\n
|
||||
\n • Mejor análisis de Wikipedia y Wikiviajes, los archivos actualizados ya están disponibles
|
||||
\n
|
||||
\n • Menú contextual: corregido el color de los escudos de transporte en el modo nocturno y los tamaños de menú adicionales
|
||||
\n
|
||||
\n • Otras correcciones de errores
|
||||
\n</string>
|
||||
<string name="increase_search_radius_to">Aumentar el radio de búsqueda a %1$s</string>
|
||||
</resources>
|
||||
|
|
|
@ -3680,4 +3680,12 @@
|
|||
<string name="poi_payment_contactless_yes">Pago sin contacto</string>
|
||||
<string name="poi_payment_contactless_no">"No acepta Pagos sin contacto "</string>
|
||||
|
||||
<string name="poi_hazard_nuclear">Peligro nuclear</string>
|
||||
<string name="poi_hazard_erosion">Peligro de erosión</string>
|
||||
<string name="poi_hazard_avalanche">Peligro de avalancha</string>
|
||||
<string name="poi_hazard_slippery_road">Camino resbaladizo</string>
|
||||
<string name="poi_hazard_flood">Peligro de inundación</string>
|
||||
<string name="poi_hazard_minefield">Campo minado</string>
|
||||
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -2975,4 +2975,22 @@ Lon %2$s</string>
|
|||
<string name="coord_input_save_as_track">Guardar como traza</string>
|
||||
<string name="coord_input_save_as_track_descr">Añadiste %1$s puntos. Escribe un nombre de archivo y pulsa en «Guardar».</string>
|
||||
<string name="point_deleted">Punto %1$s borrado</string>
|
||||
<string name="shared_string_world">Mundo</string>
|
||||
<string name="send_search_query_description">Enviaremos la consulta de búsqueda: <b>«%1$s»</b>, así como la ubicación.<br/><br/> No recopilamos información personal, sólo necesitamos datos de búsqueda para mejorar el algoritmo de búsqueda.<br/></string>
|
||||
<string name="search_no_results_description">¿Sin resultados?
|
||||
\nCuéntanos sobre esto.</string>
|
||||
<string name="send_search_query">¿Enviar consulta de búsqueda?</string>
|
||||
<string name="release_3_1">• Navegación: Corrección en la barra de progreso, intercambio rápido del punto inicial y final de la ruta
|
||||
\n
|
||||
\n • Marcadores del mapa: corregido el des/activar grupos, capacidad para ocultar marcadores del mapa
|
||||
\n
|
||||
\n • Edición de OSM: Capacidad para editar etiquetas en objetos sin puntos, corrección de los comentarios vacíos en las notas, copia de seguridad de ediciones
|
||||
\n
|
||||
\n • Mejor análisis de Wikipedia y Wikiviajes, los archivos actualizados ya están disponibles
|
||||
\n
|
||||
\n • Menú contextual: corregido el color de los escudos de transporte en el modo nocturno y los tamaños de menú adicionales
|
||||
\n
|
||||
\n • Otras correcciones de errores
|
||||
\n</string>
|
||||
<string name="increase_search_radius_to">Aumentar el radio de búsqueda a %1$s</string>
|
||||
</resources>
|
||||
|
|
|
@ -3062,7 +3062,7 @@
|
|||
<string name="poi_payment_fuel_type">Tarjetas de combustible</string>
|
||||
<string name="poi_additional_type">Adicional</string>
|
||||
<string name="poi_internet_access_type">Tipo de conexión a Internet</string>
|
||||
<string name="poi_vending_type">Tipo de expendio</string>
|
||||
<string name="poi_vending_type">Tipo de expendedora</string>
|
||||
<string name="poi_bicycle_service">Servicio para bicicletas</string>
|
||||
<string name="poi_clothes_type">Tipo</string>
|
||||
<string name="poi_shoes_type">Tipo</string>
|
||||
|
@ -3082,7 +3082,7 @@
|
|||
<string name="poi_subway_station_filter">Estación de metro</string>
|
||||
<string name="poi_ferry_terminal_cargo">Mercancías</string>
|
||||
<string name="poi_bicycle_parking_type">Tipo</string>
|
||||
<string name="poi_aerialway_bicycle">Transporte para bicicletas</string>
|
||||
<string name="poi_aerialway_bicycle">Transporte de bicicletas</string>
|
||||
<string name="poi_aerialway_heating">Calefacción</string>
|
||||
<string name="poi_pump">Bomba</string>
|
||||
<string name="poi_observatory_designation">Designación</string>
|
||||
|
@ -3093,7 +3093,7 @@
|
|||
<string name="poi_healthcare_alternative_types">Especialidad</string>
|
||||
<string name="poi_free_flying_characteristics">Característica</string>
|
||||
<string name="poi_archaeological_site_type">Tipo</string>
|
||||
<string name="poi_star_rating">Valoración de estrellas</string>
|
||||
<string name="poi_star_rating">Valoración por estrellas</string>
|
||||
<string name="poi_religion_type">Religión</string>
|
||||
<string name="poi_denomination">Denominación</string>
|
||||
<string name="poi_information_type">Tipo</string>
|
||||
|
@ -3900,4 +3900,15 @@
|
|||
|
||||
<string name="poi_outcrop">Afloramiento</string>
|
||||
|
||||
<string name="poi_payment_contactless_yes">Sin contacto</string>
|
||||
<string name="poi_payment_contactless_no">Sin contacto: no se acepta</string>
|
||||
|
||||
<string name="poi_hazard_nuclear">Peligro nuclear</string>
|
||||
<string name="poi_hazard_erosion">Peligro de erosión</string>
|
||||
<string name="poi_hazard_avalanche">Peligro de avalancha</string>
|
||||
<string name="poi_hazard_slippery_road">Carretera resbaladiza</string>
|
||||
<string name="poi_hazard_flood">Peligro de inundación</string>
|
||||
<string name="poi_hazard_minefield">Campo de minas</string>
|
||||
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -282,7 +282,7 @@
|
|||
<string name="select_build_to_install">Seleccione una compilación OsmAnd a instalar</string>
|
||||
<string name="contribution_activity">Instalar compilación</string>
|
||||
<string name="gps_status_app_not_found">La aplicación «GPS Status» no está instalada. ¿Buscar en la tienda de aplicaciones?</string>
|
||||
<string name="voice_is_not_available_msg">Las indicaciones por voz no están disponibles, vaya a «Ajustes» → «Ajustes de navegación» → «Indicaciones por voz» y elige o descarga un paquete de indicaciones por voz.</string>
|
||||
<string name="voice_is_not_available_msg">Las indicaciones por voz no están disponibles, ve a «Ajustes» → «Ajustes de navegación» → «Indicaciones por voz» y elige o descarga un paquete de indicaciones por voz.</string>
|
||||
<string name="voice_is_not_available_title">No se eligieron indicaciones por voz</string>
|
||||
<string name="daynight_mode_day">Día</string>
|
||||
<string name="daynight_mode_night">Noche</string>
|
||||
|
@ -1463,7 +1463,7 @@
|
|||
<string name="map_widget_left">Panel izquierdo</string>
|
||||
<string name="shared_string_show">Mostrar</string>
|
||||
<string name="configure_map">Configurar mapa</string>
|
||||
<string name="search_radius_proximity">En un radio de</string>
|
||||
<string name="search_radius_proximity">A menos de</string>
|
||||
<string name="rendering_category_routes">Rutas</string>
|
||||
<string name="impassable_road">Evitar caminos…</string>
|
||||
<string name="rendering_attr_tramTrainRoutes_name">Rutas de tranvía y tren</string>
|
||||
|
@ -2174,7 +2174,7 @@
|
|||
<string name="search_map_hint">Buscar ciudad o región</string>
|
||||
<string name="gpx_no_tracks_title">Aún no tienes archivos GPX</string>
|
||||
<string name="gpx_no_tracks_title_folder">También puedes añadir archivos GPX a la carpeta</string>
|
||||
<string name="gpx_add_track">Añadir archivo GPX</string>
|
||||
<string name="gpx_add_track">Añadir GPX</string>
|
||||
<string name="gpx_appearance">Aspecto</string>
|
||||
|
||||
|
||||
|
@ -2956,4 +2956,22 @@
|
|||
<string name="error_notification_desc">Por favor, envíe la captura de pantalla de esta notificación a support@osmand.net</string>
|
||||
<string name="quick_action_edit_actions">Editar acciones</string>
|
||||
<string name="point_deleted">Punto %1$s eliminado</string>
|
||||
<string name="shared_string_world">Mundo</string>
|
||||
<string name="send_search_query_description">Enviaremos tu consulta de búsqueda <b>\"%1$s\"</b>, así como tu ubicación.<br/><br/>No recopilamos información personal, solo necesitamos los daots de búsqueda para mejor el algoritmo de búsqueda.<br/></string>
|
||||
<string name="search_no_results_description">¿Sin resultados?
|
||||
\nCuéntanos sobre esto.</string>
|
||||
<string name="send_search_query">¿Enviar consulta de búsqueda?</string>
|
||||
<string name="release_3_1">• Navegación: Corrección en la barra de progreso, intercambio rápido del punto inicial y final de la ruta
|
||||
\n
|
||||
\n • Marcadores del mapa: corregido el des/activar grupos, capacidad para ocultar marcadores del mapa
|
||||
\n
|
||||
\n • Edición de OSM: Capacidad para editar etiquetas en objetos sin puntos, corrección de los comentarios vacíos en las notas, copia de seguridad de ediciones
|
||||
\n
|
||||
\n • Mejor análisis de Wikipedia y Wikiviajes, los archivos actualizados ya están disponibles
|
||||
\n
|
||||
\n • Menú contextual: corregido el color de los escudos de transporte en el modo nocturno y los tamaños de menú adicionales
|
||||
\n
|
||||
\n • Otras correcciones de errores
|
||||
\n</string>
|
||||
<string name="increase_search_radius_to">Aumentar el radio de búsqueda a %1$s</string>
|
||||
</resources>
|
||||
|
|
|
@ -3117,4 +3117,5 @@ Area honi dagokio: %1$s x %2$s</string>
|
|||
<string name="coord_input_save_as_track">Gorde lorratz gisa</string>
|
||||
<string name="coord_input_save_as_track_descr">%1$s puntu gehitu dituzu. Idatzi fitxategi-izena eta sakatu \"Gorde\".</string>
|
||||
<string name="point_deleted">%1$s puntua ezabatuta</string>
|
||||
<string name="shared_string_world">Mundua</string>
|
||||
</resources>
|
||||
|
|
|
@ -3165,4 +3165,10 @@
|
|||
<string name="coord_input_save_as_track">ذخیره بهعنوان مسیر</string>
|
||||
<string name="coord_input_save_as_track_descr">%1$s نقطه افزودید. نام فایل را بنویسید و روی «ذخیره» بزنید.</string>
|
||||
<string name="point_deleted">نقطهٔ %1$s پاک شد</string>
|
||||
<string name="shared_string_world">جهان</string>
|
||||
<string name="send_search_query_description">ما عبارت جستوجویتان: <b>«%1$s»</b> و نیز مکانتان را ارسال خواهیم کرد.<br/><br/> ما اطلاعات خصوصی را جمعآوری نمیکنیم و دادههای جستوجو را هم فقط به این خاطر نیاز داریم که الگوریتم جستوجو را بهتر کنیم.<br/></string>
|
||||
<string name="search_no_results_description">چیزی پیدا نشد؟
|
||||
\nدر این باره با ما صحبت کنید.</string>
|
||||
<string name="send_search_query">عبارت جستوجویتان ارسال شود؟</string>
|
||||
<string name="increase_search_radius_to">افزایش شعاع جستوجو به %1$s</string>
|
||||
</resources>
|
||||
|
|
|
@ -2434,4 +2434,14 @@ Jos pidät OsmAndista ja OSMsta ja haluat tukea niitä, on tämä täydellinen t
|
|||
<string name="quick_action_add_destination">Lisää määränpää</string>
|
||||
<string name="quick_action_replace_destination">Korvaa määränpää</string>
|
||||
<string name="quick_action_add_first_intermediate">Lisää ensimmäinen välietappi</string>
|
||||
</resources>
|
||||
<string name="quick_action_add_marker_descr">Näpäyttämällä tätä toimintonäppäintä lisäät karttamarkerin sijaintiin ruudun keskellä.</string>
|
||||
<string name="quick_action_add_gpx_descr">Näpäyttämällä tätä toimintonäppäintä lisäät GPX väyläpisteen ruudun keskelle.</string>
|
||||
<string name="quick_action_take_audio_note_descr">Näpäyttämällä tätä toimintonäppäintä lisää äänimerkinnän ruudun keskelle.</string>
|
||||
<string name="quick_action_take_video_note_descr">Näpäyttämällä tätä toimintonäppäintä lisäät videomerkinnän ruudun keskelle.</string>
|
||||
<string name="quick_action_take_photo_note_descr">Näpäyttämällä tätä toimintonäppäintä lisäät kuvamerkinnän ruudun keskelle.</string>
|
||||
<string name="quick_action_add_osm_bug_descr">Näpäyttämällä tätä toimintonäppäintä lisää OSM merkinnän ruudun keskelle.</string>
|
||||
<string name="quick_action_add_poi_descr">Näpäyttämällä tätä toimintonäppäintä lisää POIn ruudtun keskelle.</string>
|
||||
<string name="quick_action_navigation_voice_descr">Näpäyttämällä tätä toimintonäppäintä otat tai poistat ääniohjauksen käytöstä navigoinnin aikana.</string>
|
||||
<string name="open_in_browser_wiki_description">Näytä artikkeli selaimessa.</string>
|
||||
<string name="how_to_open_wiki_title">Kuinka avata Wikipedia artikkelit?</string>
|
||||
</resources>
|
||||
|
|
|
@ -3022,7 +3022,7 @@ représentant la zone : %1$s x %2$s</string>
|
|||
<string name="enter_the_file_name">Saisissez le nom du fichier.</string>
|
||||
<string name="dd_mm_ss_format">DD°MM′SS″</string>
|
||||
<string name="dd_dddddd_format">DD.DDDDDD°</string>
|
||||
<string name="transport_nearby_routes">Avec</string>
|
||||
<string name="transport_nearby_routes">Dans</string>
|
||||
<string name="dd_ddddd_format">DD.DDDDD°</string>
|
||||
<string name="dd_mm_mmmm_format">DD°MM.MMMM′</string>
|
||||
<string name="dd_mm_mmm_format">DD°MM.MMM′</string>
|
||||
|
@ -3031,7 +3031,7 @@ représentant la zone : %1$s x %2$s</string>
|
|||
<string name="south_abbreviation">S</string>
|
||||
<string name="north_abbreviation">N</string>
|
||||
<string name="optional_point_name">Nom optionnel du point</string>
|
||||
<string name="transport_nearby_routes_within">Itinéraires à proximité avec</string>
|
||||
<string name="transport_nearby_routes_within">Itinéraires à proximité dans</string>
|
||||
<string name="enter_lon">Saisissez la longitude</string>
|
||||
<string name="enter_lat">Saisissez la latitude</string>
|
||||
<string name="enter_lat_and_lon">Saisissez la latitude et la longitude</string>
|
||||
|
@ -3148,4 +3148,23 @@ représentant la zone : %1$s x %2$s</string>
|
|||
<string name="coord_input_save_as_track">Enregistrer comme trace</string>
|
||||
<string name="coord_input_save_as_track_descr">Vous avez ajouté %1$s points. Donnez un nom au fichier et cliquez sur Enregistrer.</string>
|
||||
<string name="point_deleted">Point %1$s supprimé</string>
|
||||
<string name="shared_string_world">Monde</string>
|
||||
<string name="send_search_query_description">Vous êtes sur le point d\'envoyer la recherche : <b>\"%1$s\"</b>, ainsi que votre position.<br/><br/>Nous ne collectons aucune donnée personnelle. Nous utiliserons ces informations seulement pour améliorer notre algorithme de recherche.<br/></string>
|
||||
<string name="search_no_results_description">Aucun résultat ?
|
||||
\nSignalez-le nous.</string>
|
||||
<string name="send_search_query">Envoyez votre recherche ?</string>
|
||||
<string name="release_3_1">• Navigation : correction de la barre de progression, permutation facile entre le point de départ et le point d\'arrivée
|
||||
\n
|
||||
\n• Marque : correction pour l\'activation / désactivation des groupes, possibilité de masquer les marques sur la carte
|
||||
\n
|
||||
\n• Modifications OSM : possibilité de modifier les objets autres que les points, correction de la perte des commentaires et des notes, copie de sauvegarde des modifications
|
||||
\n
|
||||
\n• Amélioration de Wikipedia et Wikivoyage, les fichiers à jour sont déjà disponibles
|
||||
\n
|
||||
\n• Menu contextuel : correction de la taille des menus, correction des couleurs en mode nuit
|
||||
\n
|
||||
\n• Autres corrections
|
||||
\n
|
||||
\n</string>
|
||||
<string name="increase_search_radius_to">Augmenter le rayon de recherche à %1$s</string>
|
||||
</resources>
|
||||
|
|
|
@ -1802,4 +1802,39 @@
|
|||
<string name="poi_health_specialty_osteopathy_yes">אוסטאופתיה</string>
|
||||
<string name="poi_health_specialty_anaesthetics_yes">תרופות הרדמה</string>
|
||||
<string name="poi_health_specialty_pulmonology_yes">רפואת דרכי הנשימה</string>
|
||||
<string name="poi_health_specialty_dental_oral_maxillo_facial_surgery_yes">כירורגיית פה, לסת ושיניים</string>
|
||||
<string name="poi_health_specialty_emergency_medicine_yes">רפואת חירום</string>
|
||||
<string name="poi_health_specialty_emergency_medicine_no">התמחות רפואית: רפואת חירום: לא</string>
|
||||
<string name="poi_health_specialty_plastic_surgery_yes">נתיחה פלסטית</string>
|
||||
<string name="poi_health_specialty_orthodontics_yes">אורתודנטיה</string>
|
||||
<string name="poi_health_specialty_physiotherapy_yes">פיזיותרפיה</string>
|
||||
<string name="poi_health_specialty_biochemistry_yes">ביוכימיה</string>
|
||||
<string name="poi_health_specialty_occupational_yes">ריפוי בעיסוק</string>
|
||||
<string name="poi_health_specialty_child_psychiatry_yes">פסיכיאטריית ילדים</string>
|
||||
<string name="poi_hazard_nuclear">סכנה גרעינית</string>
|
||||
<string name="poi_hazard_erosion">סכנת סחף</string>
|
||||
<string name="poi_hazard_avalanche">סכנת מפולת שלגים</string>
|
||||
<string name="poi_hazard_slippery_road">כביש חלק</string>
|
||||
<string name="poi_hazard_flood">סכנת הצפה</string>
|
||||
<string name="poi_hazard_minefield">שדה מוקשים</string>
|
||||
|
||||
|
||||
<string name="poi_memorial_cross">בצורת צלב</string>
|
||||
<string name="poi_memorial_vehicle">כלי רכב</string>
|
||||
<string name="poi_inscription">כתובת</string>
|
||||
<string name="poi_historic_quarry">מחצבה היסטורית</string>
|
||||
|
||||
<string name="poi_resource_aggregate">אגרגט</string>
|
||||
<string name="poi_resource_antimony">אנטימוניה</string>
|
||||
<string name="poi_resource_asbestos">אזבסט</string>
|
||||
<string name="poi_resource_barite">בריט</string>
|
||||
<string name="poi_resource_basalt">בזלת</string>
|
||||
<string name="poi_resource_bauxite">בוקסיט</string>
|
||||
<string name="poi_resource_beryl">בריל</string>
|
||||
<string name="poi_resource_bismuth">ביסמוט</string>
|
||||
<string name="poi_resource_chromite">כרומיט</string>
|
||||
<string name="poi_resource_clay">חימר</string>
|
||||
<string name="poi_resource_coal">פחם</string>
|
||||
<string name="poi_resource_copper">נחושת</string>
|
||||
<string name="poi_resource_diamond">יהלומים</string>
|
||||
</resources>
|
||||
|
|
|
@ -3061,4 +3061,10 @@
|
|||
<string name="coord_input_save_as_track">שמירה כמסלול</string>
|
||||
<string name="coord_input_save_as_track_descr">הוספת %1$s נקודות. נא להקליד שם קובץ וללחוץ על ‚שמירה’.</string>
|
||||
<string name="point_deleted">הנקודה %1$s נמחקה</string>
|
||||
<string name="shared_string_world">עולם</string>
|
||||
<string name="send_search_query_description">אנו נשלח את שאילתת החיפוש שלך: <b>\"%1$s\"</b>, לרבות המקום שלך.<br/><br/> איננו אוספים פרטים אישיים, אנחנו רק צריכים נתוני חיפושים כדי לשפר את אלגוריתם החיפוש.<br/></string>
|
||||
<string name="search_no_results_description">אין תוצאות?
|
||||
\nנשמח לקבל דיווח על כך.</string>
|
||||
<string name="send_search_query">לשלוח את שאילתת החיפוש?</string>
|
||||
<string name="increase_search_radius_to">הגדלת רדיוס החיפוש ל־%1$s</string>
|
||||
</resources>
|
||||
|
|
|
@ -176,7 +176,7 @@
|
|||
<string name="poi_community_centre">Közösségi ház</string>
|
||||
<string name="poi_theatre">Színház</string>
|
||||
<string name="poi_theatre_genre_circus">Cirkusz</string>
|
||||
<string name="poi_beach_resort">Vízparti üdülőhely</string>
|
||||
<string name="poi_beach_resort">Fürdőhely, vízparti strand</string>
|
||||
<string name="poi_hunting_stand">Magasles</string>
|
||||
<string name="poi_marina">Kishajókikötő</string>
|
||||
<string name="poi_miniature_golf">Minigolf</string>
|
||||
|
@ -225,7 +225,7 @@
|
|||
<string name="poi_waterfall">Vízesés</string>
|
||||
<string name="poi_river">Folyó</string>
|
||||
<string name="poi_stream">Patak</string>
|
||||
<string name="poi_beach">Strand</string>
|
||||
<string name="poi_beach">Természetes strand</string>
|
||||
<string name="poi_bay">Öböl</string>
|
||||
<string name="poi_fjord">Fjord</string>
|
||||
<string name="poi_reef">Zátony</string>
|
||||
|
@ -382,7 +382,7 @@
|
|||
|
||||
<string name="poi_industrial">Ipari terület</string>
|
||||
<string name="poi_allotments">Kiskertek</string>
|
||||
<string name="poi_forest">Kezelt erdő</string>
|
||||
<string name="poi_forest">Telepített erdő</string>
|
||||
<string name="poi_farmyard">Tanyaudvar</string>
|
||||
<string name="poi_meadow">Rét</string>
|
||||
<string name="poi_landuse_railway">Vasúti terület</string>
|
||||
|
@ -3874,4 +3874,6 @@
|
|||
<string name="poi_payment_contactless_yes">Érintés nélküli</string>
|
||||
<string name="poi_payment_contactless_no">Érintés nélkülit nem fogad el</string>
|
||||
|
||||
</resources>
|
||||
<string name="poi_outcrop">Alapkőzet-kibúvás</string>
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -1827,7 +1827,7 @@ Punktar</string>
|
|||
<string name="poi_filter_namefinder">Nettengd NafnaLeit</string>
|
||||
<string name="version_index_is_big_for_memory">Vísirinn \'\'{0}\'\' passaði ekki í minni</string>
|
||||
<string name="osmand_net_previously_installed">Öll ónettengd gögn verða studd af nýju útgáfunni. Hinsvegar ætti að flytja út eftirlætispunkta út úr eldri útgáfunni og flytja aftur inn í nýju útgáfunni.</string>
|
||||
<string name="voice_is_not_available_msg">Engin raddleiðsögn er tiltæk, farðu í \'Stillingar\' → \'Almennt\' → \'Raddleiðsögn\' og veldu eða náðu í pakka með raddskipunum.</string>
|
||||
<string name="voice_is_not_available_msg">Engin raddleiðsögn er tiltæk, farðu í \'Stillingar\' → \'Stillingar leiðsagnar\' → \'Raddleiðsögn\' og veldu eða náðu í pakka með raddskipunum.</string>
|
||||
<string name="renderer_load_sucess">Það tókst að hlaða myndgerðarforritinu inn</string>
|
||||
<string name="renderer_load_exception">Ekki tókst að hlaða myndgerðarforritinu inn</string>
|
||||
<string name="fav_file_to_load_not_found">GPX-skrá með eftirlætum fannst ekki í {0}</string>
|
||||
|
@ -2936,4 +2936,6 @@ Stendur fyrir svæði: %1$s x %2$s</string>
|
|||
<string name="coord_input_add_point">Bæta við punkti</string>
|
||||
<string name="coord_input_save_as_track">Vista sem feril</string>
|
||||
<string name="coord_input_save_as_track_descr">Þú bættir við %1$s punktum. Settu inn heitið á skránni og vistaðu.</string>
|
||||
<string name="shared_string_world">Veröld</string>
|
||||
<string name="point_deleted">Punkti %1$s eytt</string>
|
||||
</resources>
|
||||
|
|
|
@ -83,6 +83,7 @@
|
|||
<dimen name="context_menu_transport_grid_item_height">27dp</dimen>
|
||||
<dimen name="context_menu_transport_icon_size">24dp</dimen>
|
||||
<dimen name="context_menu_transport_padding_top">18dp</dimen>
|
||||
<dimen name="context_menu_big_icon_size">54dp</dimen>
|
||||
|
||||
<dimen name="fab_size_with_shadow">90dp</dimen>
|
||||
<dimen name="fab_margin_right">18dp</dimen>
|
||||
|
|
|
@ -1292,4 +1292,38 @@
|
|||
<string name="poi_video">Videobutikk</string>
|
||||
<string name="poi_window_blind">Solskjermingsbutikk</string>
|
||||
<string name="poi_atv">Firhjulingsbutikk</string>
|
||||
<string name="poi_backcountry">Utmark</string>
|
||||
<string name="poi_piste_difficulty">Løypevanskelighetsgrad</string>
|
||||
<string name="poi_piste_grooming">Løypevedlikehold</string>
|
||||
<string name="poi_drive_in">Drive-in</string>
|
||||
<string name="poi_drive_through">Drive-through</string>
|
||||
<string name="poi_takeaway">Avhenting</string>
|
||||
<string name="poi_recycling_accepted_waste">Akseptert avfall</string>
|
||||
<string name="poi_animal_shelter_type">Aksepterte dyr</string>
|
||||
<string name="poi_water_place_access">Tilgang til vannforsyning</string>
|
||||
<string name="poi_socket_chademo_output_filter">CHAdeMO-uttak</string>
|
||||
<string name="poi_socket_type2_output_filter">Type 2-uttak</string>
|
||||
<string name="poi_socket_type2_combo_output_filter">Type 2-kombinasjonsuttak</string>
|
||||
<string name="poi_socket_type3_output_filter">Type 3-uttak</string>
|
||||
<string name="poi_socket_cee_blue_output_filter">Blått CEE-uttak</string>
|
||||
<string name="poi_socket_schuko_output_filter">Schuko-uttak</string>
|
||||
<string name="poi_charity">Veldedighetsbutikk</string>
|
||||
<string name="poi_shop_yes">Landhandel</string>
|
||||
<string name="poi_medical_supply">Medisinsk utstyr</string>
|
||||
<string name="poi_stationery">Kontorrekvisita</string>
|
||||
<string name="poi_tobacco">Tobakksbutikk</string>
|
||||
<string name="poi_variety_store">Billigbutikk</string>
|
||||
<string name="poi_energy">Energibutikk</string>
|
||||
<string name="poi_ford_stepping_stones">Steinstegsbro</string>
|
||||
<string name="poi_lift_gate">Vippebom</string>
|
||||
<string name="poi_fuel_octane_91">81-oktan</string>
|
||||
<string name="poi_fuel_octane_92">92-oktan</string>
|
||||
<string name="poi_fuel_octane_95">95-oktan</string>
|
||||
<string name="poi_fuel_octane_98">98-oktan</string>
|
||||
<string name="poi_fuel_octane_100">100-oktan</string>
|
||||
<string name="poi_fuel_cng">Komprimert naturgass</string>
|
||||
<string name="poi_fuel_electricity">Elektisitet</string>
|
||||
<string name="poi_aeroway_fuel">Flybrenselstasjon</string>
|
||||
<string name="poi_waterway_fuel">Båtbensinstasjon</string>
|
||||
<string name="poi_helipad">Helikopterlandingsplass</string>
|
||||
</resources>
|
||||
|
|
|
@ -3029,4 +3029,5 @@
|
|||
<string name="coord_input_save_as_track">Lagre som spor</string>
|
||||
<string name="coord_input_save_as_track_descr">Du har lagt til %1$s punkter. Skriv inn navnet på filen og trykk \"Lagre\".</string>
|
||||
<string name="point_deleted">Punkt %1$s slettet</string>
|
||||
<string name="shared_string_world">Verden</string>
|
||||
</resources>
|
||||
|
|
|
@ -3063,4 +3063,9 @@ voor Gebied: %1$s x %2$s</string>
|
|||
<string name="how_to_open_wiki_title">Hoe Wikipedia-artikelen te openen?</string>
|
||||
<string name="quick_action_edit_actions">Wijzig acties</string>
|
||||
<string name="shared_string_bookmark">Bladwijzer</string>
|
||||
<string name="point_deleted">"Punt %1$s verwijderd"</string>
|
||||
<string name="coord_input_edit_point">Punt bewerken</string>
|
||||
<string name="coord_input_add_point">Punt toevoegen</string>
|
||||
<string name="coord_input_save_as_track_descr">Je hebt %1$s punten toegevoegd. Geef een bestandsnaam en tik op \"Opslaan\".</string>
|
||||
<string name="error_notification_desc">Stuur alsjeblieft een screenshot van deze melding naar support@osmand.net</string>
|
||||
</resources>
|
||||
|
|
|
@ -3082,4 +3082,23 @@ Reprezentuje obszar: %1$s x %2$s</string>
|
|||
<string name="coord_input_add_point">Dodaj punkt</string>
|
||||
<string name="coord_input_save_as_track_descr">Dodano %1$s punktów. Proszę wprowadzić nazwę pliku i nacisnąć „Zapisz”.</string>
|
||||
<string name="coord_input_save_as_track">Zapisz jako ślad</string>
|
||||
<string name="release_3_1">• Nawigacja: naprawiono pasek postępu, szybka zamiana punktu początkowego i końcowego trasy
|
||||
\n
|
||||
\n• Znaczniki mapy: naprawiono włączanie/wyłączanie grup, możliwość ukrycia znaczników na mapie
|
||||
\n
|
||||
\n• Edytowanie OSM: możliwość edycji tagów dla niepunktowych obiektów, naprawiono brakujące komentarze do uwag, kopia zapasowa edycji
|
||||
\n
|
||||
\n• Ulepszono analizowanie Wikipedii i Wikipodróży, zaktualizowane pliki są już dostępne
|
||||
\n
|
||||
\n• Menu kontekstowe: poprawiono kolor tarcz transportowych w trybie nocnym, naprawiono dodatkowe rozmiary menu
|
||||
\n
|
||||
\n• Inne poprawki błędów
|
||||
\n</string>
|
||||
<string name="increase_search_radius_to">Zwiększ promień wyszukiwania do %1$s</string>
|
||||
<string name="send_search_query_description">Wyślemy twoje zapytanie: <b>\"%1$s\"</b>, oraz twoje położenie.<br/><br/> Nie zbieramy informacji osobistych, potrzebujemy tylko danych wyszukiwania do poprawienia algorytmu wyszukiwania.<br/></string>
|
||||
<string name="search_no_results_description">Brak wyników?
|
||||
\nPowiedz nam o tym.</string>
|
||||
<string name="send_search_query">Wysłać zapytanie?</string>
|
||||
<string name="shared_string_world">Świat</string>
|
||||
<string name="point_deleted">Usunięto punkt %1$s</string>
|
||||
</resources>
|
||||
|
|
|
@ -734,7 +734,7 @@
|
|||
|
||||
<string name="poi_anchorage">Ancoragem</string>
|
||||
<string name="poi_anchor_berth">Ancoradouro</string>
|
||||
<string name="poi_beacon_cardinal">Baliza luminosa cardinal</string>
|
||||
<string name="poi_beacon_cardinal">Baliza cardinal</string>
|
||||
<string name="poi_beacon_lateral">Baliza luminosa lateral</string>
|
||||
<string name="poi_beacon_safe_water">Baliza luminosa de águas seguras</string>
|
||||
<string name="poi_beacon_special_purpose">Baliza luminosa de propósito especial</string>
|
||||
|
|
|
@ -132,8 +132,8 @@
|
|||
<string name="shared_string_add">Adicionar</string>
|
||||
<string name="shared_string_add_to_favorites">Adicionar aos \'Favoritos\'</string>
|
||||
<string name="shared_string_my_location">Minha posição</string>
|
||||
<string name="shared_string_my_favorites">Meus favoritos</string>
|
||||
<string name="shared_string_tracks">Minhas trilhas</string>
|
||||
<string name="shared_string_my_favorites">Favoritos</string>
|
||||
<string name="shared_string_tracks">Trilhas</string>
|
||||
<string name="shared_string_currently_recording_track">Gravando trilha</string>
|
||||
<string name="shared_string_audio">Áudio</string>
|
||||
<string name="shared_string_video">Vídeo</string>
|
||||
|
@ -265,7 +265,10 @@
|
|||
<string name="search_radius_proximity">Na proximidade de</string>
|
||||
|
||||
|
||||
<string name="anonymous_user_hint">Um usuário anônimo não pode:\n- criar grupos;\n- sincronizar aparelhos e grupos com o servidor;\n- gerenciar grupos e aparelhos no painel de controle do website.</string>
|
||||
<string name="anonymous_user_hint">Um usuário anônimo não pode:
|
||||
\n- Criar grupos;
|
||||
\n- Sincronizar aparelhos e grupos com o servidor;
|
||||
\n- Gerenciar grupos e aparelhos no painel de controle do website.</string>
|
||||
<string name="anonymous_user">Usuário anônimo</string>
|
||||
<string name="logged_as">Conectado como %1$s</string>
|
||||
<string name="speed_limit_exceed">Tolerância do limite de velocidade</string>
|
||||
|
@ -353,7 +356,7 @@
|
|||
<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 com sucesso</string>
|
||||
<string name="speak_traffic_warnings">Moderadores de tráfego</string>
|
||||
<string name="context_menu_item_directions_from">Direções de</string>
|
||||
<string name="context_menu_item_directions_from">Rota a partir daqui</string>
|
||||
<string name="app_mode_default">Explorar</string>
|
||||
<string name="local_indexes_cat_av">Dados de Áudio/Vídeo</string>
|
||||
<string name="stop_routing_confirm">Confirma que quer parar a navegação?</string>
|
||||
|
@ -2051,7 +2054,7 @@ Pôr do Sol: %2$s</string>
|
|||
<string name="osmand_plus_banner_desc">Download ilimitado de mapas, atualizações e plugin Wikipédia.</string>
|
||||
<string name="si_mi_meters">Milhas/metros</string>
|
||||
<string name="skip_map_downloading">Pular download de mapas</string>
|
||||
<string name="skip_map_downloading_desc">Você não possui mapas offlines. Você deve escolher um mapa da lista ou baixar mapas mais tarde pelo Menu - %1$s.</string>
|
||||
<string name="skip_map_downloading_desc">Você não possui mapas offlines. Você pode escolher um mapa da lista ou baixar mapas mais tarde pelo \'Menu - %1$s\'.</string>
|
||||
<string name="search_another_country">Selecione um outro local</string>
|
||||
<string name="search_map">Procurando mapas…</string>
|
||||
<string name="first_usage_wizard_desc">Deixe o OsmAnd determinar o seu local e sugerir mapas da região para baixar.</string>
|
||||
|
@ -2063,7 +2066,7 @@ Pôr do Sol: %2$s</string>
|
|||
<string name="give_permission">Dar permissão</string>
|
||||
<string name="allow_access_location">Permitir acesso à localização</string>
|
||||
<string name="search_my_location">Encontrar a minha posição</string>
|
||||
<string name="no_update_info_desc">Não verificar se há atualizações de versão ou descontos relacionados ao OsmAnd.</string>
|
||||
<string name="no_update_info_desc">Não verificar se há novas versões ou descontos relacionados ao OsmAnd.</string>
|
||||
<string name="no_update_info">Não mostrar novas versões</string>
|
||||
<string name="update_all_maps_now">Atualizar todos os mapas agora?</string>
|
||||
<string name="clear_tile_data">Limpar todos os títulos</string>
|
||||
|
@ -2440,16 +2443,16 @@ Pôr do Sol: %2$s</string>
|
|||
<string name="trip_rec_notification_settings_desc">Exiba uma notificação de sistema que permite iniciar a gravação de viagem.</string>
|
||||
<string name="christmas_desc">Antecipando os feriados de Natal e ano novo, você pode optar por exibir o POI associado com o Natal: árvores de Natal, mercados, etc.</string>
|
||||
<string name="osm_live_payment_desc">Assinatura cobrada mensalmente. Pode ser cancelada no Google Play a qualquer momento.</string>
|
||||
<string name="donation_to_osm_desc">Parte de sua doação será enviada aos usuários OSM que enviam alterações ao OpenStreetMap. O custo da assinatura permanece o mesmo.</string>
|
||||
<string name="donation_to_osm_desc">Parte de sua doação é enviada aos usuários do OSM que enviam alterações ao OpenStreetMap. O custo da assinatura permanece o mesmo.</string>
|
||||
<string name="osm_live_subscription_desc">A assinatura permite atualizações a cada hora, diariamente e semanais, e downloads ilimitados para todos os mapas globalmente.</string>
|
||||
<string name="get_it">Adquira já</string>
|
||||
<string name="get_for">Adquira por %1$s</string>
|
||||
<string name="get_for_month">Adquira por %1$s mês</string>
|
||||
<string name="osm_live_banner_desc">Obter downloads ilimitados de mapa e atualizações de mapas mais de uma vez por mês: por hora, diária ou semanal.</string>
|
||||
<string name="osm_live_banner_desc">Obtenha downloads ilimitados de mapa e atualizações de mapas mais de uma vez por mês: semanalmente, a cada dia ou hora.</string>
|
||||
<string name="quick_action_add_gpx_descr">Tocar no botão de ação adicionará um ponto de passagem GPX no local do centro da tela.</string>
|
||||
<string name="av_locations_all_desc">Arquivo GPX com coordenadas e dados de todas as notas.</string>
|
||||
<string name="storage_place_description">Armazenamento de dados do OsmAnd (para mapas, arquivos GPX, etc.): %1$s.</string>
|
||||
<string name="first_usage_greeting">Obtenha direções e descobra novos lugares sem precisar de conexão com Internet</string>
|
||||
<string name="first_usage_greeting">Obtenha direções e descobra novos lugares sem precisar de conexão com a Internet</string>
|
||||
<string name="rendering_attr_hideOverground_name">Objetos superficiais</string>
|
||||
<string name="get_started">Vamos começar</string>
|
||||
<string name="route_stops_before">%1$s paradas antes</string>
|
||||
|
@ -2470,8 +2473,8 @@ Pôr do Sol: %2$s</string>
|
|||
<string name="no_map_markers_found">Por favor, adicione marcadores de mapa pelo mapa</string>
|
||||
<string name="no_waypoints_found">Não há pontos de passagem encontrados</string>
|
||||
<string name="storage_permission_restart_is_required">O aplicativo agora pode gravar no armazenamento externo, mas precisa ser reiniciado para tal.</string>
|
||||
<string name="shared_string_move_up">Mover para cima</string>
|
||||
<string name="shared_string_move_down">Mover para baixo</string>
|
||||
<string name="shared_string_move_up">Mover ↑</string>
|
||||
<string name="shared_string_move_down">Mover ↓</string>
|
||||
<string name="finish_navigation">Finalizar a navegação</string>
|
||||
<string name="avoid_road">Evitar estrada</string>
|
||||
<string name="osm_live_subscription">Assinatura OsmAnd Live</string>
|
||||
|
@ -2932,4 +2935,5 @@ Pôr do Sol: %2$s</string>
|
|||
\n• Gravação de viagem opcional também em modo background (enquanto o dispositivo está no modo sleep)
|
||||
\nOsmAnd é um software de código aberto desenvolvido ativamente. Todos podem contribuir para o app, reportando bugs, melhorando as traduções ou programando novas funcionalidades. Além disso, o projeto conta com as contribuições financeiras para financiar o desenvolvimento e testes de novas funcionalidades.</string>
|
||||
<string name="point_deleted">Ponto %1$s foi excluído</string>
|
||||
<string name="shared_string_world">Mundo</string>
|
||||
</resources>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><resources><string name="background_service_is_enabled_question">Serviciul sleep încă rulează în background. Doriți să-l opriți?</string>
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources><string name="background_service_is_enabled_question">Serviciul sleep încă rulează în background. Doriți să-l opriți?</string>
|
||||
|
||||
|
||||
<string name="close_changeset">Închide setul de modificări</string>
|
||||
|
@ -2122,4 +2123,259 @@
|
|||
<string name="shared_string_time_moving">Trecerea timpului</string>
|
||||
<string name="shared_string_time_span">Interval de timp</string>
|
||||
<string name="points_delete_multiple">Urmează să ștegeți %1$d punct(e). Sunteți sigur(ă)?</string>
|
||||
<string name="coord_input_edit_point">Editează punctul</string>
|
||||
<string name="coord_input_add_point">Adaugă punct</string>
|
||||
<string name="quick_action_edit_actions">Editaţi acţiuni</string>
|
||||
<string name="shared_string_bookmark">Semn de carte</string>
|
||||
<string name="hide_full_description">Ascundeți descrierea completă</string>
|
||||
<string name="show_full_description">Arată descrierea completă</string>
|
||||
<string name="download_all">Descarcă-le pe toate</string>
|
||||
<string name="shared_string_restart">Repornire aplicație</string>
|
||||
<string name="show_images">Afișează imaginile</string>
|
||||
<string name="maps_you_need">Hărți de care ai nevoie</string>
|
||||
<string name="osmand_team">Echipa OsmAnd</string>
|
||||
<string name="popular_destinations">Destinații populare</string>
|
||||
<string name="paid_app">Aplicație plătită</string>
|
||||
<string name="paid_plugin">Plugin plătit</string>
|
||||
<string name="update_is_available">Actualizare disponibilă</string>
|
||||
<string name="download_file">Descarcă fișier</string>
|
||||
<string name="start_editing">Începe editarea</string>
|
||||
<string name="get_unlimited_access">Obține acces nelimitat</string>
|
||||
<string name="wikivoyage_travel_guide">Ghiduri de călătorie</string>
|
||||
<string name="purchase_unlim_title">Cumpără - %1$s</string>
|
||||
<string name="purchase_subscription_title">Abonează-te - %1$s</string>
|
||||
<string name="unlimited_downloads">Descărcări nelimitate</string>
|
||||
<string name="unlock_all_features">Deblochează toate funcționalitățile OsmAnd</string>
|
||||
<string name="purchase_dialog_title">Alege planul</string>
|
||||
<string name="shared_string_only_with_wifi">Numai pe Wi-Fi</string>
|
||||
<string name="wikivoyage_download_pics">Descarcă imagini</string>
|
||||
<string name="shared_string_wifi_only">Numai pe Wi-Fi</string>
|
||||
<string name="images_cache">Cache de imagine</string>
|
||||
<string name="delete_search_history">Șterge istoricul de căutare</string>
|
||||
<string name="download_images">Descarcă imagini</string>
|
||||
<string name="shared_string_read">Citește</string>
|
||||
<string name="shared_string_explore">Explorează</string>
|
||||
<string name="shared_string_contents">Conținut</string>
|
||||
<string name="shared_string_result">Rezultat</string>
|
||||
<string name="nautical_maps">Hărți maritime</string>
|
||||
<string name="route_altitude">Elevație rută</string>
|
||||
<string name="altitude_descent">Coborâre</string>
|
||||
<string name="altitude_ascent">Urcare</string>
|
||||
<string name="average_altitude">Altitudine medie</string>
|
||||
<string name="rendering_value_medium_w_name">Mediu</string>
|
||||
<string name="rendering_attr_hideWaterPolygons_description">Apă</string>
|
||||
<string name="rendering_attr_hideWaterPolygons_name">Ascunde apa</string>
|
||||
<string name="search_map_hint">Caută oraș sau regiune</string>
|
||||
<string name="upload_poi">Încarcă POI</string>
|
||||
<string name="route_calculation">Calcularea rutei</string>
|
||||
<string name="gpx_add_track">Adaugă mai multe…</string>
|
||||
<string name="shared_string_notifications">Notificări</string>
|
||||
<string name="shared_string_continue">Continuă</string>
|
||||
<string name="shared_string_pause">Pauză</string>
|
||||
<string name="shared_string_trip">Excursie</string>
|
||||
<string name="shared_string_recorded">Înregistrat</string>
|
||||
<string name="shared_string_record">Înregistrează</string>
|
||||
<string name="gpx_logging_no_data">Nu sunt date</string>
|
||||
<string name="rendering_value_light_brown_name">Maro deschis</string>
|
||||
<string name="rendering_value_dark_brown_name">Maro închis</string>
|
||||
<string name="edit_filter">Editează categoriile</string>
|
||||
<string name="subcategories">Subcategorii</string>
|
||||
<string name="selected_categories">Categoriile selectate</string>
|
||||
<string name="create_custom_poi">Crează filtru personalizat</string>
|
||||
<string name="custom_search">Căutare personalizată</string>
|
||||
<string name="shared_string_filters">Filtre</string>
|
||||
<string name="apply_filters">Aplică filtrele</string>
|
||||
<string name="save_filter">Salvează filtrul</string>
|
||||
<string name="delete_filter">Șterge filtrul</string>
|
||||
<string name="new_filter">Filtru nou</string>
|
||||
<string name="si_mi_meters">Mile/metrii</string>
|
||||
<string name="search_another_country">Alege altă regiune</string>
|
||||
<string name="search_map">Se caută hărți…</string>
|
||||
<string name="location_not_found">Locația nu a fost găsită</string>
|
||||
<string name="no_inet_connection">Nu există conexiune la internet</string>
|
||||
<string name="search_location">Se caută locația…</string>
|
||||
<string name="storage_free_space">Spațiu liber</string>
|
||||
<string name="give_permission">Oferă permisiunea</string>
|
||||
<string name="allow_access_location">Permite accesul la locație</string>
|
||||
<string name="search_my_location">Găsește-mi poziția</string>
|
||||
<string name="update_all_maps_now">Actualizez acum toate hărțiile?</string>
|
||||
<string name="routing_attr_short_way_name">Varianta eficientă de combustibil</string>
|
||||
<string name="shared_string_change">Schimbă</string>
|
||||
<string name="coords_search">Căutare coordonate</string>
|
||||
<string name="advanced_coords_search">Căutare avansată de coordonate</string>
|
||||
<string name="back_to_search">Înapoi la căutare</string>
|
||||
<string name="share_history_subject">distribuit prin OsmAnd</string>
|
||||
<string name="search_categories">Categorii</string>
|
||||
<string name="postcode">Cod poștal</string>
|
||||
<string name="shared_string_from">de la</string>
|
||||
<string name="city_type_district">District</string>
|
||||
<string name="map_widget_search">Caută</string>
|
||||
<string name="shared_string_is_open_24_7">Deschis 24/7</string>
|
||||
<string name="storage_directory_card">Card memorie</string>
|
||||
<string name="coords_format">Format coordonate</string>
|
||||
<string name="coords_format_descr">Formatul pentru coordonate geografice.</string>
|
||||
<string name="app_mode_bus">Autobuz</string>
|
||||
<string name="app_mode_train">Tren</string>
|
||||
<string name="current_track">Pista curentă</string>
|
||||
<string name="map_widget_battery">Nivel baterie</string>
|
||||
<string name="change_markers_position">Schimbă poziția marker-ului</string>
|
||||
<string name="access_direction_audio_feedback">Indicații audio</string>
|
||||
<string name="use_osm_live_routing">Navigație live OsmAnd</string>
|
||||
<string name="access_no_destination">Destinația nu este setată</string>
|
||||
<string name="access_default_color">Culoare implicită</string>
|
||||
<string name="access_category_choice">Alege categoria</string>
|
||||
<string name="access_hint_enter_name">Introduceți numele</string>
|
||||
<string name="access_hint_enter_category">Introduceți categoria</string>
|
||||
<string name="access_hint_enter_description">Introduceți descrierea.</string>
|
||||
<string name="access_collapsed_list">Listă colapsată</string>
|
||||
<string name="access_expanded_list">Listă expandată</string>
|
||||
<string name="access_empty_list">Listă goală</string>
|
||||
<string name="access_tree_list">Listă arborescentă</string>
|
||||
<string name="access_shared_string_not_installed">Nu este instalat</string>
|
||||
<string name="access_widget_expand">Expandează</string>
|
||||
<string name="access_shared_string_navigate_up">Navighează în sus</string>
|
||||
<string name="access_sort">Sortează</string>
|
||||
<string name="map_mode">Mod hartă</string>
|
||||
<string name="rendering_value_thin_name">Subțire</string>
|
||||
<string name="rendering_value_medium_name">Mediu</string>
|
||||
<string name="report">Raportează</string>
|
||||
|
||||
<string name="shared_string_move_down">Mută ↓</string>
|
||||
<string name="finish_navigation">Termină navigarea</string>
|
||||
<string name="avoid_road">Evită drumul</string>
|
||||
<string name="storage_directory_shared">Memorie partajată</string>
|
||||
<string name="full_report">Raport complet</string>
|
||||
<string name="recalculate_route">Recalculează ruta</string>
|
||||
<string name="open_street_map_login_and_pass">Nume utilizator și parola OpenStreetMap</string>
|
||||
<string name="rendering_value_darkyellow_name">Galben închis</string>
|
||||
<string name="rendering_value_translucent_pink_name">Roz translucent</string>
|
||||
<string name="lang_es_us">Spaniolă (America)</string>
|
||||
<string name="shared_string_gpx_files">Fișiere GPX</string>
|
||||
<string name="rename_failed">Redenumirea a eșuat.</string>
|
||||
<string name="days_behind">zile în urmă</string>
|
||||
<string name="back_to_map">Înapoi la hartă</string>
|
||||
<string name="share_note">Distribuie nota</string>
|
||||
<string name="location_on_map">Locație:
|
||||
\n Lat %1$s
|
||||
\n Lon %2$s</string>
|
||||
<string name="watch">Urmărește</string>
|
||||
<string name="notes">Note</string>
|
||||
<string name="online_map">Hartă online</string>
|
||||
<string name="roads_only">Doar drumurile</string>
|
||||
<string name="rendering_attr_pisteRoutes_name">Pârtii de ski</string>
|
||||
<string name="free">Gratis %1$s</string>
|
||||
<string name="device_memory">Memorie dispozitiv</string>
|
||||
<string name="edit_group">Editează grupul</string>
|
||||
<string name="parking_place">Loc de parcare</string>
|
||||
<string name="gps_status">Status GPS</string>
|
||||
<string name="rendering_attr_roadStyle_description">Stil drum</string>
|
||||
<string name="rendering_value__name">Implicit</string>
|
||||
<string name="average">Mediu</string>
|
||||
<string name="of">%1$d din %2$d</string>
|
||||
<string name="ascent_descent">Urcare/Coborâre</string>
|
||||
<string name="moving_time">Timp în mișcare</string>
|
||||
<string name="max_min">Max/Min</string>
|
||||
<string name="min_max">Min/Max</string>
|
||||
<string name="lang_en_gb">Engleză (Regatul Unit)</string>
|
||||
<string name="lang_af">Africană</string>
|
||||
<string name="lang_hy">Armeniană</string>
|
||||
<string name="lang_hu_formal">Maghiară (formal)</string>
|
||||
<string name="lang_zh_hk">Chineză (Hong Kong)</string>
|
||||
<string name="routing_attr_avoid_stairs_name">Evită treptele</string>
|
||||
<string name="routing_attr_avoid_stairs_description">Evită treptele</string>
|
||||
<string name="routing_attr_avoid_borders_name">Evită trecerea graniței</string>
|
||||
<string name="routing_attr_avoid_borders_description">Evită trecerea granițelor naționale</string>
|
||||
<string name="routing_attr_height_name">Limită înălțime</string>
|
||||
<string name="driving_region_australia">Australia</string>
|
||||
<string name="distance_measurement_start_editing">Începe editarea</string>
|
||||
<string name="distance_measurement_finish_editing">Termină editarea</string>
|
||||
<string name="distance_measurement_clear_route">Elimină toate punctele</string>
|
||||
<string name="favourites_list_activity">Selectează favoritul</string>
|
||||
<string name="download_wikipedia_maps">Wikipedia</string>
|
||||
<string name="av_use_external_camera_descr">Utilizează aplicația de sistem pentru poze.</string>
|
||||
<string name="av_use_external_camera">Utilizează aplicația Cameră</string>
|
||||
<string name="map_widget_intermediate_time">Timp intermediar</string>
|
||||
<string name="interrupt_music">Întrerupeți muzica</string>
|
||||
<string name="osmand_play_title_30_chars">OsmAnd Hărți și Navigație</string>
|
||||
<string name="osmand_plus_play_title_30_chars">OsmAnd+ Hărți și Navigație</string>
|
||||
<string name="share_route_as_gpx">Distribuie ruta ca și fișier GPX</string>
|
||||
<string name="share_route_subject">Traseu distribuit prin OsmAnd</string>
|
||||
<string name="support_new_features_descr"></string>
|
||||
<string name="arrival_distance_factor_early">Devreme</string>
|
||||
<string name="arrival_distance_factor_normally">Normal</string>
|
||||
<string name="arrival_distance_factor_late">Târziu</string>
|
||||
<string name="arrival_distance_factor_at_last">În ultimii metri</string>
|
||||
<string name="arrival_distance">Anunţ de sosire</string>
|
||||
<string name="index_name_netherlands">Europa - Olanda</string>
|
||||
<string name="keep_informing">Repetați instrucțiunile de navigare</string>
|
||||
<string name="shared_string_others">Altele</string>
|
||||
<string name="shared_string_release">Lansat</string>
|
||||
<string name="voices">Mesaje vocale</string>
|
||||
<string name="favourites_context_menu_add">Adauga Favorite</string>
|
||||
<string name="poi_action_delete">șterge</string>
|
||||
<string name="poi_dialog_reopen">Redeschide</string>
|
||||
<string name="plugin_description_title">Descriere</string>
|
||||
<string name="plugin_install_needs_network">Trebuie să vă conectați la Internet pentru a instala acest plugin.</string>
|
||||
<string name="get_plugin">Obțineți</string>
|
||||
<string name="use_fast_recalculation">Re-calcularea rutei inteligente</string>
|
||||
<string name="do_you_like_osmand">Îți place OsmAnd?</string>
|
||||
<string name="we_really_care_about_your_opinion">Ne pasa de opinia dumneavoastră şi feedback-ul dumneavoastră este important pentru noi.</string>
|
||||
<string name="rate_this_app">Evaluați această aplicație</string>
|
||||
<string name="rate_this_app_long">Vă rugăm acordați un scor pe Google Play pentru OsmAnd</string>
|
||||
<string name="user_hates_app_get_feedback">Spune-ne de ce.</string>
|
||||
<string name="failed_to_upload">Eșec la încărcare</string>
|
||||
<string name="delete_change">Ștergeți modificarea</string>
|
||||
<string name="successfully_uploaded_pattern">Încărcat {0}/{1}</string>
|
||||
<string name="try_again">Reîncercați</string>
|
||||
<string name="error_message_pattern">Eroare: {0}</string>
|
||||
<string name="shared_string_undo">Anulați</string>
|
||||
<string name="shared_string_skip">Omiteți</string>
|
||||
<string name="app_name_osmand">OsmAnd</string>
|
||||
<string name="commit_poi">Comite POI</string>
|
||||
<string name="tab_title_basic">De bază</string>
|
||||
<string name="tab_title_advanced">Avansat</string>
|
||||
<string name="building_number">Numarul cladirii</string>
|
||||
<string name="next_proceed">Următorul</string>
|
||||
<string name="opening_at">Deschide la</string>
|
||||
<string name="closing_at">Se închide la</string>
|
||||
<string name="contact_info">Informații de contact</string>
|
||||
<string name="description">Descriere</string>
|
||||
<string name="add_opening_hours">Adaugă orar</string>
|
||||
<string name="poi_dialog_poi_type">Tip POI</string>
|
||||
<string name="working_days">Zile lucrătoare</string>
|
||||
<string name="recent_places">Locuri recente</string>
|
||||
<string name="favourites">Favorite</string>
|
||||
<string name="count_of_lines">Numărul de linii</string>
|
||||
<string name="are_you_sure">Sunteţi sigur?</string>
|
||||
<string name="downloads_left_template">%1$s descărcări rămase</string>
|
||||
<string name="roads">Drumuri</string>
|
||||
<string name="downloading_number_of_files">Descărcare - %1$d fișier</string>
|
||||
<string name="buy">Cumpărați</string>
|
||||
<string name="later">Mai târziu</string>
|
||||
<string name="get_full_version">Versiune completă</string>
|
||||
<string name="downloads">Descărcări</string>
|
||||
<string name="free_downloads_used">Descărcări gratuite utilizate</string>
|
||||
<string name="enter_country_name">Introduceţi numele ţării</string>
|
||||
<string name="new_version">Versiune nouă</string>
|
||||
<string name="begin_with_osmand_menu_group">Primii paşi cu OsmAnd</string>
|
||||
<string name="features_menu_group">Funcționalități</string>
|
||||
<string name="help_us_to_improve_menu_group">Ajută la îmbunătăţirea OsmAnd</string>
|
||||
<string name="other_menu_group">Altele</string>
|
||||
<string name="plugins_menu_group">Pluginuri</string>
|
||||
<string name="first_usage_item">Prima utilizare</string>
|
||||
<string name="faq_item">Întrebări frecvente</string>
|
||||
<string name="faq_item_description">Întrebări frecvente</string>
|
||||
<string name="map_viewing_item">Vizualizare hartă</string>
|
||||
<string name="instalation_troubleshooting_item">Instalare şi depanare</string>
|
||||
<string name="techical_articles_item">Articole tehnice</string>
|
||||
<string name="versions_item">Versiuni</string>
|
||||
<string name="feedback">Feedback</string>
|
||||
<string name="contact_us">Contact</string>
|
||||
<string name="map_legend">Legendă hartă</string>
|
||||
<string name="update">Actualizare</string>
|
||||
<string name="only_download_over_wifi">Descărcare doar pe Wi-Fi</string>
|
||||
<string name="live_update">Actualizări in timp real</string>
|
||||
<string name="update_now">Actualizați acum</string>
|
||||
<string name="missing_write_external_storage_permission">OsmAnd nu are permisiunea de a utiliza cardul de memorie</string>
|
||||
<string name="last_update">Ultima actualizare: %s</string>
|
||||
</resources>
|
|
@ -3818,4 +3818,12 @@
|
|||
<string name="poi_payment_contactless_yes">Бесконтактная оплата</string>
|
||||
<string name="poi_payment_contactless_no">Бесконтактная оплата не принимается</string>
|
||||
|
||||
<string name="poi_hazard_nuclear">Радиационная опасность</string>
|
||||
<string name="poi_hazard_erosion">Эрозия</string>
|
||||
<string name="poi_hazard_avalanche">Опасность лавины</string>
|
||||
<string name="poi_hazard_slippery_road">Скользкая дорога</string>
|
||||
<string name="poi_hazard_flood">Опасность затопления</string>
|
||||
<string name="poi_hazard_minefield">Минное поле</string>
|
||||
|
||||
|
||||
</resources>
|
||||
|
|
|
@ -2939,7 +2939,7 @@
|
|||
<string name="how_to_open_link">Как открыть ссылку?</string>
|
||||
<string name="read_wikipedia_offline">Читать Википедию в автономном режиме</string>
|
||||
<string name="touring_view_render_descr">Высоко детализированный стиль для туристических целей. Включает все параметры конфигурации стиля по умолчанию, кроме того: отображает как можно больше деталей, в частности, все дороги, тропинки и другие способы перемещения. Четкое визуальное различие между всеми типами дорог, реминисценция многих туристических атласов. Высококонтрастная цветовая схема для уличного использования, дневной и ночной режим.</string>
|
||||
<string name="shared_string_bookmark">Закладка</string>
|
||||
<string name="shared_string_bookmark">Сохранить</string>
|
||||
<string name="off_road_render_descr">"Подходит для использования во время езды по бездорожью. Подходит для использования с зелеными спутниковыми изображениями в качестве подложки карты. Ключевые особенности: уменьшенная толщина основных дорог, увеличенная толщина дорожек, тропинок, велосипедных и других маршрутов. Основано на стиле \"Topo\"."</string>
|
||||
<string name="unirs_render_descr">Модификация стиля по умолчанию для увеличения контраста пешеходных и велосипедных дорог. Использует старые цвета Mapnik.</string>
|
||||
|
||||
|
@ -2954,4 +2954,9 @@
|
|||
<string name="coord_input_save_as_track">Сохранить как трек</string>
|
||||
<string name="coord_input_save_as_track_descr">Добавлено вами точек - %1$s. Введите имя файла и нажмите «Сохранить».</string>
|
||||
<string name="point_deleted">Точка %1$s удалена</string>
|
||||
<string name="shared_string_world">Мир</string>
|
||||
<string name="send_search_query_description">Мы отправим ваш поисковый запрос: <b>\"%1$s\"</b>, а также ваше местоположение. <br/><br/> Мы не собираем личную информацию, нам нужны только данные поиска, чтобы улучшить алгоритм поиска.<br/></string>
|
||||
<string name="search_no_results_description">Нет результатов?
|
||||
\nРасскажите нам об этом.</string>
|
||||
<string name="send_search_query">Отправить поисковый запрос?</string>
|
||||
</resources>
|
||||
|
|
|
@ -3883,4 +3883,12 @@
|
|||
<string name="poi_payment_contactless_yes">Chene cuntatu (Contactless)</string>
|
||||
<string name="poi_payment_contactless_no">Cartas chene cuntatu non atzetadas</string>
|
||||
|
||||
<string name="poi_hazard_nuclear">Perìgulu nucleare</string>
|
||||
<string name="poi_hazard_erosion">Perìgulu de erosione</string>
|
||||
<string name="poi_hazard_avalanche">Perìgulu de valanga</string>
|
||||
<string name="poi_hazard_slippery_road">Carrera lassinosa</string>
|
||||
<string name="poi_hazard_flood">Perìgulu de alluvione</string>
|
||||
<string name="poi_hazard_minefield">Campu minadu</string>
|
||||
|
||||
|
||||
</resources>
|
||||
|
|