Merge branch 'master' of ssh://github.com/osmandapp/Osmand into HEAD

This commit is contained in:
PaulStets 2018-07-27 16:31:10 +03:00
commit 4fc066944f
170 changed files with 3045 additions and 1809 deletions

View file

@ -1,8 +1,8 @@
OsmAnd OSM Automated Navigation Directions navigation software based on OpenStreetMap.
Copyright © 20102017 OsmAnd BV (Amstelveen, Netherlands - KvK 62066714, BTW 854627704B01).
Copyright © 20102018 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):

View file

@ -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

View file

@ -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;

View file

@ -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);

View file

@ -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,10 +398,23 @@ 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) {
return restrictions[i] >> RESTRICTION_SHIFT;
}
@ -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;
}
}

View file

@ -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,8 +641,10 @@ public class BinaryRoutePlanner {
if (!reverseWay) {
for (int i = 0; i < road.getRestrictionLength(); i++) {
if (road.getRestrictionId(i) == next.road.id) {
type = road.getRestrictionType(i);
break;
if(!via || road.getRestrictionVia(i) == viaId) {
type = road.getRestrictionType(i);
break;
}
}
}
} else {
@ -649,8 +652,10 @@ public class BinaryRoutePlanner {
int rt = next.road.getRestrictionType(i);
long restrictedTo = next.road.getRestrictionId(i);
if (restrictedTo == road.id) {
type = rt;
break;
if(!via || next.road.getRestrictionVia(i) == viaId) {
type = rt;
break;
}
}
// Check if there is restriction only to the other than current road

View file

@ -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);

View file

@ -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);
}

View file

@ -133,6 +133,11 @@ public class SearchCoreFactory {
public int getMinimalSearchRadius(SearchPhrase phrase) {
return 0;
}
@Override
public int getNextSearchRadius(SearchPhrase phrase) {
return 0;
}
protected void subSearchApiOrPublish(SearchPhrase phrase,
SearchResultMatcher resultMatcher, SearchResult res, SearchBaseAPI api)
@ -267,6 +272,11 @@ public class SearchCoreFactory {
public int getMinimalSearchRadius(SearchPhrase phrase) {
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 {
@ -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);
}
}
@ -735,6 +750,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);
}
private Map<PoiCategory, LinkedHashSet<String>> acceptedTypes = new LinkedHashMap<PoiCategory,
LinkedHashSet<String>>();

View file

@ -662,6 +662,10 @@ public class SearchPhrase {
public int getRadiusSearch(int meters) {
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);

View file

@ -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>

View file

@ -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"

View file

@ -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">

View file

@ -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>

View file

@ -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() {

View file

@ -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)
}
}

View file

@ -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()
}
}
}

View file

@ -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()

View file

@ -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()
}

View file

@ -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}")
}
}

View file

@ -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)
}
incomingMessagesListeners.forEach {
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) {
val msgId = chatLiveMessages[chatId]
if (msgId != null) {
if (msgId != 0L) {
client?.send(TdApi.EditMessageLiveLocation(chatId, msgId, null, location), liveLocationMessageUpdatesHandler)
}
} else {
chatLiveMessages[chatId] = 0L
client?.send(TdApi.SendMessage(chatId, 0, false, true, null, content), liveLocationMessageUpdatesHandler)
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
)
}
} else {
chatLiveMessages[chatId] = 0L
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)
}
incomingMessagesListeners.forEach {
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)
}
incomingMessagesListeners.forEach {
it.onReceiveChatLocationMessages(message.chatId, message)
}
}
}

View file

@ -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

View file

@ -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)
}
}

View file

@ -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
}
}

View file

@ -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,27 +355,44 @@ 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
holder.checkBox?.apply {
visibility = View.VISIBLE
setOnCheckedChangeListener(null)
isChecked = selectedChats.contains(chat.id)
setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
selectedChats.add(chat.id)
} else {
selectedChats.remove(chat.id)
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)
isChecked = selectedChats.contains(chat.id)
setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
selectedChats.add(chat.id)
} else {
selectedChats.remove(chat.id)
}
actionButtonsListener?.switchButtonsVisibility(selectedChats.isNotEmpty())
}
actionButtonsListener?.switchButtonsVisibility(selectedChats.isNotEmpty())
}
}
holder.bottomShadow?.visibility = if (lastItem) View.VISIBLE else View.GONE
holder.itemView.setOnClickListener {
holder.checkBox?.apply {
isChecked = !isChecked
if (live) {
app.settings.shareLocationToChat(chat.id, false)
if (!app.settings.hasAnyChatToShareLocation()) {
app.shareLocationHelper.stopSharingLocation()
}
notifyItemChanged(position)
} else {
holder.checkBox?.apply {
isChecked = !isChecked
}
}
}
}
@ -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)
}

View file

@ -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

View file

@ -19,6 +19,8 @@ import android.view.inputmethod.InputMethodManager
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))

View file

@ -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

View file

@ -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

View file

@ -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
# 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 :=
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
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

View file

@ -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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View 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>

View 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>

View file

@ -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>

View file

@ -1,36 +1,35 @@
<?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="@dimen/grid_menu_item_width"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:orientation="vertical"
android:paddingLeft="@dimen/bottom_sheet_content_padding_small"
android:paddingRight="@dimen/bottom_sheet_content_padding_small"
tools:background="#17171A"
tools:layout_gravity="center">
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:background="?attr/selectableItemBackgroundBorderless"
android:orientation="vertical"
android:paddingLeft="@dimen/bottom_sheet_content_padding_small"
android:paddingRight="@dimen/bottom_sheet_content_padding_small"
tools:background="#17171A"
tools:layout_gravity="center">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
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"/>
<ImageView
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_marginTop="@dimen/grid_menu_item_bottom_top_margin"
tools:src="@drawable/ic_action_delete_dark"
tools:tint="#808080"/>
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_horizontal"
android:lines="2"
android:maxLines="2"
android:textColor="@color/searchbar_text_hint_light"
tools:text="Remove POI"/>
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_horizontal"
android:lines="2"
android:maxLines="2"
android:textColor="@color/searchbar_text_hint_light"
tools:text="Remove POI"/>
</LinearLayout>

View file

@ -1,33 +1,46 @@
<?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:paddingTop="@dimen/bottom_sheet_content_padding_small">
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/bottom_sheet_content_padding_small">
<FrameLayout
android:id="@+id/first_item_container"
android:layout_width="@dimen/grid_menu_item_width"
android:layout_height="wrap_content"/>
<Space
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.25"/>
<Space
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<FrameLayout
android:id="@+id/first_item_container"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"/>
<FrameLayout
android:id="@+id/second_item_container"
android:layout_width="@dimen/grid_menu_item_width"
android:layout_height="wrap_content"/>
<Space
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.5"/>
<Space
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<FrameLayout
android:id="@+id/second_item_container"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"/>
<FrameLayout
android:id="@+id/third_item_container"
android:layout_width="@dimen/grid_menu_item_width"
android:layout_height="wrap_content"/>
<Space
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.5"/>
<FrameLayout
android:id="@+id/third_item_container"
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>

View file

@ -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"

View file

@ -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>

View 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>

View file

@ -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>

View 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" />

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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°MMSS″</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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>
</resources>
<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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

Some files were not shown because too many files have changed in this diff Show more