Merge branch 'master' into markers_backup

This commit is contained in:
Vitaliy 2020-11-10 17:52:19 +02:00
commit e0b967c23b
67 changed files with 1199 additions and 470 deletions

157
GPX.md Normal file
View file

@ -0,0 +1,157 @@
The OsmAnd's GPX file format conforms to the GPX 1.1 specification with additional data written as extensions. There are several sections of such data:
## Track appearance
The following parameters are used to customize the appearance of a track on the map. They are used inside the "gpx" tag and apply to all tracks contained in the gpx.
#### Parameters
* **show_arrows** [*true, false*] - show / hide arrows along the path line.
* **width** [*thin, medium, bold, 1-24*] - width of the track line on the map. The thin, medium, and bold are style depended values (should be defined as currentTrackWidth attribute).
* **color** [*#AARRGGBB, #RRGGBB*] - color of a track line on the map. Hex value.
* **split_type** [*no_split, distance, time*] - split type for a track.
* **split_interval** [*double*] - split interval for a track. Distance (meters), time (seconds).
#### Example:
```xml
<gpx version="1.1" creator="OsmAndRouterV2" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
...
<extensions>
<show_arrows>true</show_arrows>
<color>#4e4eff</color>
<split_type>distance</split_type>
<split_interval>2000.0</split_interval>
<width>bold</width>
</extensions>
</gpx>
```
## Details of a track point (trkpt)
Written to a gpx file while recording a track.
* **speed** (meters per second)
* **heading** (0-359 degrees)
#### Example:
```xml
<trkpt lat="52.397799" lon="4.575998">
<ele>203</ele>
<time>2019-05-08T10:36:43Z</time>
<hdop>3</hdop>
<extensions>
<heading>273</heading>
<speed>5.02</speed>
</extensions>
</trkpt>
```
## Calculated route(s)
This data contains all details of a route built with **OsmAnd** (route segments, turns, road names, road types, restrictions, etc.). The route can be completely restored as if just built, even in the absence of the respective offline maps.
A gpx file may contain several routes. Each of them is contained in a specific segment under **trkseg** / **extensions**. A gpx file is saved in this form when exporting a constructed route or when saving a track that consists of several separate segments via the **Plan a route** functionality.
**Plan a route** also adds one (or several, in accordance with the number of contained separate segments / tracks) **rte** blocks to the gpx file, containing route key points (**rtept**).
#### Gpx structure:
```xml
<trk>
<trkseg>
<!-- List of segment points. The order of the points corresponds to the order and length of the route segments (<route><segment length="x" ... />). -->
<!-- The value of the "length" attribute corresponds to the number of points in this segment of the route. -->
<trkpt ... ></trkpt>
<extensions>
<!-- List of route segments -->
<route>
<segment ... />
</route>
<!-- Properties of segments included in the route. -->
<!-- This data is taken from offline maps during the initial construction of a route. -->
<types>
<type ... />
</types>
</extensions>
</trkseg>
</trk>
<!-- List of intermediate route points. If there are multiple routes, the order of the rte list matches the order of the route segments. -->
<rte>
<rtept ... />
<!-- For routes built with the "Plan route", the parameters of key points are saved. -->
<extensions>
<!-- Route profile type for next segment (car, bicycle, pedestrian, etc.). -->
<profile>...</profile>
<!-- The index of the point in the gpx segment that corresponds to the first point of the calculated route for this segment. -->
<trkpt_idx>...</trkpt_idx>
</extensions>
</rtept>
</rte>
```
#### Example:
```xml
<gpx version="1.1" creator="OsmAndRouterV2" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<metadata>
<name>Fri 06 Nov 2020</name>
</metadata>
<trk>
<name>Fri 06 Nov 2020</name>
<trkseg>
<trkpt lat="52.3639849" lon="4.8900533">
<ele>0.801</ele>
</trkpt>
<trkpt lat="52.3636917" lon="4.8922849">
<ele>0.998</ele>
</trkpt>
<trkpt lat="52.3636885" lon="4.892309">
<ele>1</ele>
</trkpt>
<trkpt lat="52.3636426" lon="4.8922902">
<ele>0.963</ele>
</trkpt>
<trkpt lat="52.363564" lon="4.8922607">
<ele>0.899</ele>
</trkpt>
....
<extensions>
<route>
<segment id="7372058" length="3" segmentTime="178.44" speed="1.11" turnType="C" types="0,1,2,3,4,5,6" names="57" />
<segment id="334164679" length="5" segmentTime="86.11" speed="1.11" turnType="TR" turnAngle="91.88" types="7,8,0,9,10,11,12,13,6" pointTypes=";;14,15;16,17,18;" names="58" />
<segment id="334603581" length="6" segmentTime="75.5" speed="1.11" types="19,20,21,7,8,0,22,9,10,11,12,13,23,6" pointTypes=";14;16,24;16,24;14;" names="58" />
<segment id="446707354" length="3" segmentTime="8.32" speed="1.11" turnType="TSLL" turnAngle="-25.44" types="19,25,21,7,8,22,9,1,11,12,13,6" names="58" />
...
</route>
<types>
<type t="lit" v="yes" />
<type t="oneway" v="yes" />
<type t="highway" v="unclassified" />
<type t="surface" v="paving_stones" />
<type t="maxspeed" v="30" />
...
</types>
</extensions>
</trkseg>
</trk>
<rte>
<rtept lat="52.3639945" lon="4.8900532">
<extensions>
<profile>pedestrian</profile>
<trkpt_idx>0</trkpt_idx>
</extensions>
</rtept>
<rtept lat="52.3612797" lon="4.8911677">
<extensions>
<profile>pedestrian</profile>
<trkpt_idx>24</trkpt_idx>
</extensions>
</rtept>
<rtept lat="52.356996" lon="4.8912071">
<extensions>
<profile>pedestrian</profile>
<trkpt_idx>89</trkpt_idx>
</extensions>
</rtept>
<rtept lat="52.3542374" lon="4.8947024">
<extensions>
<profile>pedestrian</profile>
<trkpt_idx>121</trkpt_idx>
</extensions>
</rtept>
</rte>
</gpx>
```

View file

@ -71,6 +71,7 @@ public class GPXUtilities {
WHITE(0xFFFFFFFF),
RED(0xFFFF0000),
GREEN(0xFF00FF00),
DARKGREEN(0xFF006400),
BLUE(0xFF0000FF),
YELLOW(0xFFFFFF00),
CYAN(0xFF00FFFF),

View file

@ -18,7 +18,6 @@ import net.osmand.telegram.helpers.TelegramHelper
import net.osmand.telegram.helpers.TelegramHelper.*
import net.osmand.telegram.notifications.TelegramNotification.NotificationType
import net.osmand.telegram.utils.AndroidUtils
import net.osmand.telegram.utils.OsmandLocationUtils
import org.drinkless.td.libcore.telegram.TdApi
import java.util.*
@ -377,7 +376,10 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
Log.d(PlatformUtil.TAG, "Send live location error: $code - $message")
when (messageType) {
TelegramHelper.MESSAGE_TYPE_TEXT -> shareInfo.pendingTdLibText--
TelegramHelper.MESSAGE_TYPE_MAP -> shareInfo.pendingTdLibMap--
TelegramHelper.MESSAGE_TYPE_MAP -> {
shareInfo.pendingTdLibMap--
shareInfo.currentMapMessageId = -1L
}
}
}

View file

@ -304,27 +304,18 @@ class TelegramSettings(private val app: TelegramApplication) {
fun prepareForSharingNewMessages() {
shareChatsInfo.forEach { (_, shareInfo) ->
prepareForSharingNewMessages(shareInfo)
shareInfo.resetMessagesInfo()
}
}
fun prepareForSharingNewMessages(chatsIds: List<Long>) {
chatsIds.forEach {
shareChatsInfo[it]?.also { shareInfo ->
prepareForSharingNewMessages(shareInfo)
shareInfo.resetMessagesInfo()
}
}
}
fun prepareForSharingNewMessages(shareInfo: ShareChatInfo) {
shareInfo.pendingTdLibText = 0
shareInfo.pendingTdLibMap = 0
shareInfo.currentTextMessageId = -1L
shareInfo.currentMapMessageId = -1L
shareInfo.pendingTextMessage = false
shareInfo.pendingMapMessage = false
}
fun getChatLivePeriod(chatId: Long) = shareChatsInfo[chatId]?.livePeriod
fun getChatsShareInfo() = shareChatsInfo
@ -1497,6 +1488,27 @@ class TelegramSettings(private val app: TelegramApplication) {
fun isPendingMapMessagesLimitReached() = pendingTdLibMap >= MAX_MESSAGES_IN_TDLIB_PER_CHAT
fun resetMessagesInfo() {
resetTextMessageInfo()
resetMapMessageInfo()
}
fun resetTextMessageInfo() {
pendingTdLibText = 0
currentTextMessageId = -1L
pendingTextMessage = false
}
fun resetMapMessageInfo() {
pendingTdLibMap = 0
currentMapMessageId = -1L
pendingMapMessage = false
}
fun isTextMessageIdPresent() = currentTextMessageId != -1L
fun isMapMessageIdPresent() = currentMapMessageId != -1L
companion object {
internal const val CHAT_ID_KEY = "chatId"

View file

@ -138,7 +138,7 @@ class ShareLocationHelper(private val app: TelegramApplication) {
}
}
if (pendingMessagesLimitReached && checkNetworkTypeAllowed) {
checkNetworkType()
updateNetworkType()
}
}
@ -167,7 +167,7 @@ class ShareLocationHelper(private val app: TelegramApplication) {
app.locationMessages.getBufferedTextMessagesForChat(chatId).take(MAX_MESSAGES_IN_TDLIB_PER_CHAT).forEach {
if (!shareInfo.isPendingTextMessagesLimitReached()) {
if (it.deviceName.isEmpty()) {
if (!shareInfo.pendingTextMessage && shareInfo.currentTextMessageId != -1L) {
if (!shareInfo.pendingTextMessage && shareInfo.isTextMessageIdPresent()) {
val content = OsmandLocationUtils.getTextMessageContent(shareInfo.updateTextMessageId, it, app)
app.telegramHelper.editTextLocation(shareInfo, content)
app.locationMessages.removeBufferedMessage(it)
@ -180,8 +180,12 @@ class ShareLocationHelper(private val app: TelegramApplication) {
app.locationMessages.getBufferedMapMessagesForChat(chatId).take(MAX_MESSAGES_IN_TDLIB_PER_CHAT).forEach {
if (!shareInfo.isPendingMapMessagesLimitReached()) {
if (it.deviceName.isEmpty()) {
if (!shareInfo.pendingMapMessage && shareInfo.currentMapMessageId != -1L) {
app.telegramHelper.editMapLocation(shareInfo, it)
if (!shareInfo.pendingMapMessage) {
if (shareInfo.isMapMessageIdPresent()) {
app.telegramHelper.editMapLocation(shareInfo, it)
} else {
app.telegramHelper.sendNewMapLocation(shareInfo, it)
}
app.locationMessages.removeBufferedMessage(it)
}
} else {
@ -279,7 +283,7 @@ class ShareLocationHelper(private val app: TelegramApplication) {
}
}
if (pendingMessagesLimitReached) {
checkNetworkType()
updateNetworkType()
}
}
@ -347,7 +351,7 @@ class ShareLocationHelper(private val app: TelegramApplication) {
}
}
fun checkNetworkType(){
fun updateNetworkType(){
if (app.isInternetConnectionAvailable) {
val networkType = when {
app.isWifiConnected -> TdApi.NetworkTypeWiFi()

View file

@ -840,7 +840,7 @@ class TelegramHelper private constructor() {
}
fun stopSendingLiveLocationToChat(shareInfo: ShareChatInfo) {
if (shareInfo.currentMapMessageId != -1L && shareInfo.chatId != -1L) {
if (!shareInfo.isMapMessageIdPresent() && shareInfo.chatId != -1L) {
shareInfo.lastSendMapMessageTime = (System.currentTimeMillis() / 1000).toInt()
client?.send(
TdApi.EditMessageLiveLocation(shareInfo.chatId, shareInfo.currentMapMessageId, null, null)) { obj ->

View file

@ -15,7 +15,6 @@ import android.widget.TextView
import androidx.appcompat.widget.ListPopupWindow
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import net.osmand.Location
import net.osmand.data.LatLon
import net.osmand.telegram.R
@ -99,7 +98,7 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage
mainView.findViewById<androidx.swiperefreshlayout.widget.SwipeRefreshLayout>(R.id.swipe_refresh).apply {
setOnRefreshListener {
app.shareLocationHelper.checkNetworkType()
app.shareLocationHelper.updateNetworkType()
app.telegramHelper.scanChatsHistory()
updateList()
isRefreshing = false

View file

@ -72,7 +72,7 @@ class SharingStatusBottomSheet : DialogFragment() {
if (sharingStatusType.canResendLocation) {
if (i == 0) {
setOnClickListener {
app.shareLocationHelper.checkNetworkType()
app.shareLocationHelper.updateNetworkType()
app.settings.prepareForSharingNewMessages(sharingStatus.chatsIds)
app.shareLocationHelper.checkAndSendBufferMessages()
app.forceUpdateMyLocation()

View file

@ -7,7 +7,7 @@
android:layout_height="@dimen/dialog_button_height"
android:layout_weight="1">
<LinearLayout
<FrameLayout
android:id="@+id/button_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -16,18 +16,20 @@
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/button_text"
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingLeft="@dimen/content_padding_small"
android:paddingRight="@dimen/content_padding_small"
android:gravity="center"
android:layout_gravity="center"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium"
android:duplicateParentState="true"
android:drawablePadding="@dimen/content_padding_half"
tools:text="Button"
android:paddingStart="@dimen/content_padding_small"
android:paddingEnd="@dimen/content_padding_small" />
</LinearLayout>
</FrameLayout>
</LinearLayout>

View file

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/bottom_sheet_selected_item_title_height"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingTop="@dimen/measurement_tool_menu_title_padding_top"
android:orientation="vertical"
android:paddingEnd="@dimen/content_padding"
android:paddingStart="@dimen/content_padding"
android:paddingBottom="@dimen/content_padding_half">
<ImageView
android:id="@+id/header"
osmand:srcCompat="@drawable/ic_action_openstreetmap_logo_colored"
android:gravity="center"
android:layout_width="@dimen/bottom_sheet_list_item_height"
android:layout_height="@dimen/bottom_sheet_list_item_height"
android:layout_gravity="center"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawablePadding="@dimen/content_padding_small"
android:ellipsize="end"
android:gravity="center"
android:maxLines="1"
android:layout_marginTop="@dimen/content_padding_small"
android:paddingBottom="@dimen/content_padding_small"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_medium"
android:text="@string/login_open_street_map_org" />
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="@dimen/bottom_sheet_text_spacing_multiplier"
android:textColor="?android:textColorPrimary"
android:paddingTop="@dimen/content_padding_small"
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_regular"
android:text="@string/open_street_map_login_mode" />
</LinearLayout>

View file

@ -4,67 +4,54 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingBottom="@dimen/dialog_button_height"
android:paddingTop="@dimen/bottom_sheet_content_margin"
android:paddingEnd="@dimen/content_padding"
android:paddingStart="@dimen/content_padding">
android:paddingRight="@dimen/content_padding"
android:paddingBottom="@dimen/bottom_sheet_content_margin">
<net.osmand.plus.widgets.TextViewEx
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/bottom_sheet_content_margin"
android:ellipsize="end"
android:gravity="center_vertical"
android:letterSpacing="@dimen/text_button_letter_spacing"
android:maxLines="1"
android:minHeight="@dimen/bottom_sheet_title_height"
android:text="@string/login_and_pass"
android:textAppearance="@style/TextAppearance.ListItemTitle"
android:minHeight="@dimen/bottom_sheet_icon_margin"
android:text="@string/login_open_street_map"
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_medium" />
<net.osmand.plus.widgets.TextViewEx
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_vertical"
android:letterSpacing="@dimen/text_button_letter_spacing"
android:maxLines="1"
android:paddingBottom="@dimen/content_padding"
android:text="@string/open_street_map_login_descr"
android:textAppearance="@style/TextAppearance.ListItemTitle"
osmand:typeface="@string/font_roboto_regular" />
<net.osmand.plus.widgets.OsmandTextFieldBoxes
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/name_text_box"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/content_padding"
osmand:labelText="@string/user_name">
android:layout_marginBottom="@dimen/bottom_sheet_content_margin"
android:hint="@string/user_login">
<studio.carbonylgroup.textfieldboxes.ExtendedEditText
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/name_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="actionDone"
android:inputType="text"
android:maxLines="1" />
android:imeOptions="actionDone" />
</net.osmand.plus.widgets.OsmandTextFieldBoxes>
</com.google.android.material.textfield.TextInputLayout>
<net.osmand.plus.widgets.OsmandTextFieldBoxes
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/password_text_box"
android:layout_width="match_parent"
android:layout_height="wrap_content"
osmand:labelText="@string/user_password">
android:hint="@string/user_password">
<studio.carbonylgroup.textfieldboxes.ExtendedEditText
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/password_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="actionDone"
android:inputType="textPassword"
android:maxLines="1" />
android:inputType="textPassword" />
</net.osmand.plus.widgets.OsmandTextFieldBoxes>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>

View file

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/list_background_color"
android:gravity="center_vertical">
<LinearLayout
android:id="@+id/selectable_list_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/setting_list_item_large_height"
tools:background="?android:attr/selectableItemBackground">
<androidx.appcompat.widget.AppCompatImageView
android:id="@android:id/icon"
android:layout_width="@dimen/standard_icon_size"
android:layout_height="@dimen/standard_icon_size"
android:layout_gravity="center"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/bottom_sheet_icon_margin"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:layout_marginBottom="@dimen/bottom_sheet_icon_margin"
tools:src="@drawable/ic_action_user_account" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:orientation="vertical"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding">
<net.osmand.plus.widgets.TextViewEx
android:id="@android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:letterSpacing="@dimen/text_button_letter_spacing"
android:singleLine="true"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_regular" />
<net.osmand.plus.widgets.TextViewEx
android:id="@android:id/summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:letterSpacing="@dimen/description_letter_spacing"
android:maxLines="4"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular" />
</LinearLayout>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/icon_logout"
android:layout_width="wrap_content"
android:layout_height="@dimen/standard_icon_size"
android:layout_gravity="center"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/bottom_sheet_icon_margin"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:layout_marginBottom="@dimen/bottom_sheet_icon_margin"
android:tint="@color/active_buttons_and_links_text_disabled_light"
osmand:srcCompat="@drawable/ic_action_logout" />
</LinearLayout>
</LinearLayout>

View file

@ -3,12 +3,12 @@
<string name="poi_shop">متجر</string>
<string name="poi_personal_transport">نقل شخصي</string>
<string name="poi_public_transport">نقل عام</string>
<string name="poi_healthcare">مركز صحّيّ</string>
<string name="poi_healthcare">الرعاية الصحية</string>
<string name="poi_office">مكتب</string>
<string name="poi_club">نادي</string>
<string name="poi_cafe_and_restaurant">مطعم و مقهى</string>
<string name="poi_finance">ماليّة</string>
<string name="poi_osmwiki">ويكيبيديا</string>
<string name="poi_osmwiki">ويكيبديا</string>
<string name="poi_chocolate">متجر شوكلاته</string>
<string name="poi_coffee">متجر قهوة</string>
<string name="poi_mall">مجمّع</string>
@ -18,32 +18,32 @@
<string name="poi_mobile_phone">متجر هواتف نقّالة</string>
<string name="poi_motorcycle">متجر درّاجات ناريّة</string>
<string name="poi_emergency">طوارئ</string>
<string name="poi_transportation">النقل</string>
<string name="poi_filling_station">محطة بنزين</string>
<string name="poi_transportation">وسائل النقل</string>
<string name="poi_filling_station">محطة وقود</string>
<string name="poi_air_transport">نقل جوي</string>
<string name="poi_water_transport">نقل بحري</string>
<string name="poi_man_made">من صنع الإنسان</string>
<string name="poi_water_supply">الإمداد بالمياه</string>
<string name="poi_water_supply">إمدادات المياه</string>
<string name="poi_power">الطاقة</string>
<string name="poi_communication">الاتصالات</string>
<string name="poi_landuse">استخدام الأراضي</string>
<string name="poi_education">التعليم</string>
<string name="poi_administrative">الإدارية</string>
<string name="poi_sport">الرياضة</string>
<string name="poi_landuse">الأراضي المستخدمة</string>
<string name="poi_education">تعليم</string>
<string name="poi_administrative">إداري</string>
<string name="poi_sport">رياضة</string>
<string name="poi_tourism">السياحة</string>
<string name="poi_sightseeing">معالم سياحية</string>
<string name="poi_internet_access">الوصول إلى شبكة الإنترنت</string>
<string name="poi_internet_access">الوصول إلى الإنترنت</string>
<string name="poi_sustenance">المواد الغذائية</string>
<string name="poi_service">الخدمات</string>
<string name="poi_craft">الحرف اليدوية</string>
<string name="poi_natural">الطبيعية</string>
<string name="poi_military">العسكرية</string>
<string name="poi_user_defined_other">المحددة من قبل المستخدم</string>
<string name="poi_natural">طبيعة</string>
<string name="poi_military">عسكري</string>
<string name="poi_user_defined_other">محددة من قبل المستخدم</string>
<string name="poi_palaeontological_site">موقع الكتابات القديمة</string>
<string name="poi_bakery">مخبزة</string>
<string name="poi_bakery">مخبز</string>
<string name="poi_alcohol">محل الخمور</string>
<string name="poi_cheese">متجر الجبن</string>
<string name="poi_convenience">متجر</string>
<string name="poi_convenience">بقالة - متجر صغير</string>
<string name="poi_supermarket">سوبر ماركت</string>
<string name="poi_pasta">متجر المعكرونة</string>
<string name="poi_antiques">متجر تحف</string>
@ -58,25 +58,25 @@
<string name="poi_min_age">الحد الأدنى للسن</string>
<string name="poi_aquaculture">تربية الأحياء المائية</string>
<string name="poi_pumping_station">محطة الضخ</string>
<string name="poi_road_obstacle">عائق طريق</string>
<string name="poi_shop_food">متجر وسوبرماركت</string>
<string name="poi_bicycle_transport">دراجات نقل</string>
<string name="poi_farm">مخزن المزرعة</string>
<string name="poi_road_obstacle">عوائق الطريق</string>
<string name="poi_shop_food">متجر صغير وسووبر ماركت</string>
<string name="poi_bicycle_transport">نقل الدراجات</string>
<string name="poi_farm">متجر المزرعة</string>
<string name="poi_accomodation">أماكن الإقامة</string>
<string name="poi_entertainment">أوقات الفراغ</string>
<string name="poi_aquaculture_mussels">تربية الأحياء المائية: بلح البحر</string>
<string name="poi_aquaculture_fish">تربية الأحياء المائية: الأسماك</string>
<string name="poi_aquaculture_shrimp">تربية الأحياء المائية: الجمبري</string>
<string name="poi_hiking_routes">مسارات المشي</string>
<string name="poi_hiking_routes">مسارات المشي الخلوي</string>
<string name="poi_tea">متجر شاي</string>
<string name="poi_pastry">متجر الحلويات</string>
<string name="poi_vending_machine">آلة بيع</string>
<string name="poi_bag">متجر حقائب</string>
<string name="poi_bed">متجر أفرشة</string>
<string name="poi_bed">متجر مفارش</string>
<string name="poi_carpet">متجر سجاد</string>
<string name="poi_chemist">صيدلية</string>
<string name="poi_clothes_children">ملابس أطفال</string>
<string name="poi_shoes">متجر الأحذية</string>
<string name="poi_shoes">متجر أحذية</string>
<string name="poi_candles">متجر شموع</string>
<string name="poi_computer">متجر كمبيوتر</string>
<string name="poi_fabric">متجر الأقمشة</string>
@ -91,26 +91,26 @@
<string name="poi_gift">دكان الهدايا</string>
<string name="poi_shop_yes">متجر عام</string>
<string name="poi_garden_furniture">متجر اغراض الحدائق</string>
<string name="poi_gas">متجر الغاز المسال</string>
<string name="poi_gas">متجر الغاز السائل</string>
<string name="poi_jewelry">متجر مجوهرات</string>
<string name="poi_herbalist">متجر ألأعشاب</string>
<string name="poi_herbalist">محل عطارة</string>
<string name="poi_hunting">معدات الصيد</string>
<string name="poi_interior_decoration">متجر الديكور الداخلي</string>
<string name="poi_music">متجر الموسيقى</string>
<string name="poi_musical_instrument">معدات الموسيقى</string>
<string name="poi_organic">أغدية عضوية</string>
<string name="poi_pet">متجر أغراض الكلاب</string>
<string name="poi_paint">متجر الدهان</string>
<string name="poi_toys">متجر ألألعاب</string>
<string name="poi_pet">متجر الحيوانات الأليفة</string>
<string name="poi_paint">متجر الدهانات</string>
<string name="poi_toys">متجر ألعاب</string>
<string name="poi_parking">موقف سيارات</string>
<string name="poi_motorcycle_parking">موقف دراجات نارية</string>
<string name="poi_parking_entrance">مدخل موقف سيارات</string>
<string name="poi_bicycle_parking">موقف دراجات هوائية</string>
<string name="poi_vending_parking_tickets">تذاكر موقف السيارات</string>
<string name="poi_vending_parking_tickets_public_transport_tickets">تذاكر موقف سيارات و تذاكر للنقل العام</string>
<string name="poi_beverages">محل للمشروبات</string>
<string name="poi_beverages">متجر مرطبات</string>
<string name="poi_pharmacy">صيدلية</string>
<string name="poi_driving_school">مدرسة تعليم السياقة</string>
<string name="poi_driving_school">مدرسة تعليم القيادة</string>
<string name="poi_school">مدرسة</string>
<string name="poi_building_type_mosque">نوع المبنى : مسجد</string>
<string name="poi_hospital">مستشفى</string>
@ -118,10 +118,10 @@
<string name="poi_artwork_type_fountain">نوع العمل الفني : نافورة</string>
<string name="poi_craft_carpenter">نجار</string>
<string name="poi_craft_plumber">سباك</string>
<string name="poi_car">تاجر سيارات</string>
<string name="poi_car_repair">تصليح السيارات</string>
<string name="poi_car">معرض سيارات</string>
<string name="poi_car_repair">ورشة تصليح السيارات</string>
<string name="poi_recycling_printer_cartridges">خراطيش الطابعة</string>
<string name="poi_recycling_car_batteries">بطاريات السيارات</string>
<string name="poi_recycling_car_batteries">بطاريات سيارات</string>
<string name="poi_recycling_cars">سيارات</string>
<string name="poi_caravan_site">موقع خاص للقوافل</string>
<string name="poi_int_name">الإسم الدولي</string>
@ -132,9 +132,9 @@
<string name="poi_alt_name">الإسم البديل</string>
<string name="poi_official_name">الإسم الرسمي</string>
<string name="poi_village">قرية</string>
<string name="poi_town">مدينة</string>
<string name="poi_town">مدينة صغيرة</string>
<string name="poi_website">موقع إنترنت</string>
<string name="poi_emergency_phone">هاتف النجدة</string>
<string name="poi_emergency_phone">هاتف الطوارئ</string>
<string name="poi_recycling_mobile_phones">هواتف نقالة</string>
<string name="poi_phone">الهاتف</string>
<string name="poi_vending_telephone_vouchers">قسائم تعبئة الهاتف</string>
@ -142,23 +142,23 @@
<string name="poi_fire_extinguisher">طفاية حريق</string>
<string name="poi_fire_hose">خرطوم إطفاء الحريق</string>
<string name="poi_fireworks">متجر الألعاب النارية</string>
<string name="poi_traffic_calming_hump">مطب</string>
<string name="poi_traffic_calming_hump">مطب خفيف</string>
<string name="poi_cafe">مقهى</string>
<string name="poi_internet_cafe">مقهى إنترنت</string>
<string name="poi_hotel">فندق</string>
<string name="poi_university">جامعة</string>
<string name="poi_route_train_ref">قطار</string>
<string name="poi_aerialway_transport">النقل الجوي</string>
<string name="poi_node_networks">نقاط شبكة التنزه/ركوب الدراجات</string>
<string name="poi_traffic_enforcement">قوانين المرور جارية المفعول</string>
<string name="poi_aerialway_transport">النقل المعلق بالكيابل</string>
<string name="poi_node_networks">مجموعة نقاط المشي الخلوي \"الهايكنق\"/ركوب الدراجات</string>
<string name="poi_traffic_enforcement">كمائن و مراصد المرور</string>
<string name="poi_transport_construction">بنية المواصلات</string>
<string name="poi_trash_disposal">صرف القمامة</string>
<string name="poi_trash_disposal">مكب النفايات</string>
<string name="poi_seamark">بحري</string>
<string name="poi_deli">أطعمة لذيذة</string>
<string name="poi_greengrocer">بقالة خضراء</string>
<string name="poi_deli">محل أطعمة مستوردة</string>
<string name="poi_greengrocer">متجر خضروات</string>
<string name="poi_seafood">متجر مأكولات بحرية</string>
<string name="poi_confectionery">متجر الحلويات</string>
<string name="poi_ice_cream">ردهة مثلجات</string>
<string name="poi_confectionery">متجر حلويات</string>
<string name="poi_ice_cream">ركن المثلجات</string>
<string name="poi_dairy">متجر ألبان</string>
<string name="poi_wine">متجر نبيذ</string>
<string name="poi_books">متجر كتب</string>
@ -166,7 +166,7 @@
<string name="poi_art">متجرفنون</string>
<string name="poi_baby_goods">سلع أطفال</string>
<string name="poi_boutique">متجر أزياء</string>
<string name="poi_charity">متجر جمعيات خيرية</string>
<string name="poi_charity">متجر خيري</string>
<string name="poi_clothes">متجر ملابس</string>
<string name="poi_copyshop">محل نسخ</string>
<string name="poi_curtain">متجر ستائر</string>
@ -175,11 +175,11 @@
<string name="poi_free_flying">متجر لوازم الطيران الحر</string>
<string name="poi_garden_centre">مركز الحديقة</string>
<string name="poi_glaziery">محل زجاج</string>
<string name="poi_hardware">متجر لواحق الحاسوب</string>
<string name="poi_hardware">متجر ملحقات الحاسوب</string>
<string name="poi_railway_station">محطة القطارات</string>
<string name="poi_kitchen">أثاث مطبخ</string>
<string name="poi_kitchen">أثاث المطبخ</string>
<string name="poi_leather">متجر جلود</string>
<string name="poi_medical_supply">إمدادات طبية</string>
<string name="poi_medical_supply">مستلزمات طبية</string>
<string name="poi_newsagent">بائع جرائد</string>
<string name="poi_optician">طبيب العيون</string>
<string name="poi_photo">متجر صور</string>
@ -187,22 +187,22 @@
<string name="poi_scuba_diving_shop">متجر بضائع الغوص</string>
<string name="poi_sports">سلع رياضية</string>
<string name="poi_hifi">متجر هاي فاي</string>
<string name="poi_outdoor">متجر في الهواء الطلق</string>
<string name="poi_outdoor">متجر أدوات التنزه والرحلات</string>
<string name="poi_length">طول</string>
<string name="poi_water_tank">خزان ماء</string>
<string name="poi_diplomatic_honorary_consulate">قنصلية شرفية</string>
<string name="poi_radiotechnics">متجر تقنيات الراديو</string>
<string name="poi_tableware">متجر موائد</string>
<string name="poi_tableware">متجر أدوات المائدة</string>
<string name="poi_ticket">بيع التذاكر</string>
<string name="poi_tobacco">متجر تبغ</string>
<string name="poi_trade">محطة تجارية</string>
<string name="poi_tyres">مخزن إطارات</string>
<string name="poi_trade">مبسط تجاري</string>
<string name="poi_tyres">متجر الاطارات</string>
<string name="poi_vacuum_cleaner">متجر مكانس كهربائية</string>
<string name="poi_variety_store">متجر متنوع</string>
<string name="poi_video">متجر فيديوتاك</string>
<string name="poi_department_store">متجر متعدد الأقسام</string>
<string name="poi_electronics">متجر إلكترونيات</string>
<string name="poi_energy">متجر طاقة</string>
<string name="poi_energy">متجر أدوات طاقة</string>
<string name="poi_car_parts">قطع غيار السيارات</string>
<string name="poi_games">ألعاب</string>
<string name="poi_model">نماذج مقياس</string>
@ -214,13 +214,13 @@
<string name="poi_fire_hydrant">صنبور مياه الإطفاء</string>
<string name="poi_grit_bin">سلة حصى</string>
<string name="poi_ambulance_station">محطة إسعاف</string>
<string name="poi_emergency_access_point">منفذ طوارئ</string>
<string name="poi_ford">فورد</string>
<string name="poi_emergency_access_point">نقطة وصول الطوارئ</string>
<string name="poi_ford">مجرى الماء على الطريق</string>
<string name="poi_vehicle_inspection">فحص المركبات</string>
<string name="poi_car_wash">غسيل السيارات</string>
<string name="poi_fuel">محطة بنزين: بترول، ديزل، غاز</string>
<string name="poi_fuel_diesel">ديزل</string>
<string name="poi_fuel_gtl_diesel">ديزل جي تي أل</string>
<string name="poi_fuel_gtl_diesel">ديزل GTL</string>
<string name="poi_fuel_biodiesel">ديزل حيوي</string>
<string name="poi_fuel_octane_80">أوكتان 80</string>
<string name="poi_fuel_octane_91">أوكتان 91</string>
@ -241,11 +241,11 @@
<string name="poi_electricity_combined_charging">محطة شحن</string>
<string name="poi_compressed_air">هواء مضغوط</string>
<string name="poi_garages">كراجات</string>
<string name="poi_public_transport_platform">موقف النقل العمومي</string>
<string name="poi_public_transport_platform">موقف النقل العام</string>
<string name="poi_public_transport_platform_bus">موقف حافلات</string>
<string name="poi_bus_stop">موقف حافلات</string>
<string name="poi_public_transport_stop_position">مكان توقف وسائل النقل العمومي</string>
<string name="poi_public_transport_station">محطة النقل العمومي</string>
<string name="poi_public_transport_stop_position">مكان توقف وسائل النقل العام</string>
<string name="poi_public_transport_station">محطة النقل العام</string>
<string name="poi_bus_station">محطة حافلات</string>
<string name="poi_railway_platform">منصة سكك حديدية</string>
<string name="poi_halt">محطة سكك حديدية</string>
@ -260,7 +260,7 @@
<string name="poi_lighthouse">المنارة</string>
<string name="poi_bicycle_rental">تأجير دراجات</string>
<string name="poi_city_wall">جدار مدينة</string>
<string name="poi_city">مدينة</string>
<string name="poi_city">مدينة كبيرة</string>
<string name="poi_city_gate">باب مدينة</string>
<string name="poi_courthouse">محكمة</string>
<string name="poi_restaurant">مطعم</string>
@ -269,10 +269,10 @@
<string name="poi_building">مبنى</string>
<string name="poi_hairdresser">حلاق</string>
<string name="poi_toilets">مرحاض; حمام</string>
<string name="poi_traffic_calming_bump">مطب</string>
<string name="poi_traffic_calming_bump">مطب قوي</string>
<string name="poi_highway_crossing">ممر الراجلين</string>
<string name="poi_post_office">مكتب بريد</string>
<string name="poi_water_tower">خزان مياه عمودي</string>
<string name="poi_water_tower">برج مياه</string>
<string name="poi_bridge">جسر</string>
<string name="poi_swimming_pool">حوض سباحة</string>
<string name="poi_power_generator">مولد طاقة</string>
@ -316,8 +316,8 @@
<string name="poi_tunnel_railway">نفق سكك حديدية</string>
<string name="poi_river">وادي</string>
<string name="poi_craft_tailor">خياط</string>
<string name="poi_motorway_junction">مُحَوِّل الطريق السيار</string>
<string name="poi_tram_stop">موقف ترامواي</string>
<string name="poi_motorway_junction">تقاطع الطريق السريع</string>
<string name="poi_tram_stop">توقف الترام</string>
<string name="poi_recycling_books">كتب</string>
<string name="poi_recycling_shoes">أحذية</string>
<string name="poi_recycling_aluminium">ألومنيوم</string>
@ -327,7 +327,7 @@
<string name="poi_recycling_low_energy_bulbs">مصابيح منخفضة الطاقة</string>
<string name="poi_recycling_fluorescent_tubes">أنابيب ضوء النيون</string>
<string name="poi_recycling_metal">معدن</string>
<string name="poi_recycling_electrical_items">عناصر كهربائية</string>
<string name="poi_recycling_electrical_items">أغراض الكترونية</string>
<string name="poi_recycling_white_goods">سلع بيضاء</string>
<string name="poi_recycling_cooking_oil">زيت الطهي</string>
<string name="poi_recycling_engine_oil">زيت المحرك</string>
@ -342,14 +342,14 @@
<string name="poi_recycling_waste_oil">زيت مستعمل</string>
<string name="poi_recycling_bottles">زجاجات</string>
<string name="poi_recycling_sheet_metal">صفائح معدنية</string>
<string name="poi_recycling_foil">رقاقة معدنية</string>
<string name="poi_recycling_foil">ورق قصدير</string>
<string name="poi_employment_agency">مكتب التوظيف</string>
<string name="poi_research">مكتب البحوث</string>
<string name="poi_it">مكتب تكنولوجيا المعلومات</string>
<string name="poi_newspaper">مكتب جرائد</string>
<string name="poi_architect">مكتب مهندس معماري</string>
<string name="poi_advertising_agency">وكالة إعلانات</string>
<string name="poi_educational_institution">مؤسسة تربوية</string>
<string name="poi_educational_institution">مؤسسة تعليمية</string>
<string name="poi_studio">ستوديو</string>
<string name="poi_office_religion">مكتب شؤون دينية</string>
<string name="poi_association">مكتب منظمة</string>
@ -368,7 +368,7 @@
<string name="poi_animal_boarding_dog_cat">نوع المصعد لـ: كلب، قط</string>
<string name="poi_animal_boarding_horse">نوع المصعد لـ: حصان</string>
<string name="poi_historic_aircraft">طائرات تاريخية</string>
<string name="poi_honey">متجرعسل</string>
<string name="poi_honey">متجر عسل</string>
<string name="poi_elevator_yes">بالمصعد</string>
<string name="poi_elevator_no">بدون مصعد</string>
<string name="poi_office_camping">مكتب التخييم</string>
@ -426,107 +426,107 @@
<string name="poi_fire_hydrant_water_source">مصدر المياه</string>
<string name="poi_payment_toll_type">طريقة الدفع</string>
<string name="poi_traffic_signals_sound">الصوت</string>
<string name="poi_highway_crossing_type">نوع</string>
<string name="poi_highway_crossing_type">النوع</string>
<string name="poi_service_general">خدمة</string>
<string name="poi_self_service">خدمة ذاتية</string>
<string name="poi_parking_type">نوع</string>
<string name="poi_subway_station_filter">محطة مترو الإنفاق</string>
<string name="poi_bicycle_parking_type">نوع</string>
<string name="poi_parking_type">النوع</string>
<string name="poi_subway_station_filter">محطة مترو</string>
<string name="poi_bicycle_parking_type">النوع</string>
<string name="poi_aerialway_heating">تدفئة</string>
<string name="poi_pump">مضخة</string>
<string name="poi_telescope_type">نوع</string>
<string name="poi_animal_training_type">نوع</string>
<string name="poi_embassy_type">نوع</string>
<string name="poi_telescope_type">النوع</string>
<string name="poi_animal_training_type">النوع</string>
<string name="poi_embassy_type">النوع</string>
<string name="poi_healthcare_alternative_types">التخصص</string>
<string name="poi_archaeological_site_type">نوع</string>
<string name="poi_religion_type">الديانة</string>
<string name="poi_denomination">الطائفة</string>
<string name="poi_information_type">نوع</string>
<string name="poi_scout_camp">مخيم الكشافة</string>
<string name="poi_resort_type">نوع</string>
<string name="poi_archaeological_site_type">النوع</string>
<string name="poi_religion_type">الدين</string>
<string name="poi_denomination">المذهب</string>
<string name="poi_information_type">النوع</string>
<string name="poi_scout_camp">مخيم كشافة</string>
<string name="poi_resort_type">النوع</string>
<string name="poi_piste_difficulty">صعوبة الطريق</string>
<string name="poi_fee">رسوم</string>
<string name="poi_fee">الرسوم</string>
<string name="poi_smoking">التدخين</string>
<string name="poi_takeaway">الوجبات الجاهزة</string>
<string name="poi_takeaway">الطلب الخارجي</string>
<string name="poi_cocktails">كوكتيلات</string>
<string name="poi_recycling_type">نوع</string>
<string name="poi_recycling_type">النوع</string>
<string name="poi_recycling_accepted_waste">النفايات المقبولة</string>
<string name="poi_shelter_type">نوع</string>
<string name="poi_shelter_type">النوع</string>
<string name="poi_seasonal">موسمي</string>
<string name="poi_water_characteristic">خصائص المياه</string>
<string name="poi_health_specialty">التخصص الصحي</string>
<string name="poi_massage_type">نوع التدليك</string>
<string name="poi_tents">الخيام</string>
<string name="poi_tents">خيام</string>
<string name="poi_washing_machine">غسالة</string>
<string name="poi_caravans">البيوت المتنقلة</string>
<string name="poi_power_supply">الإمداد بالطاقة</string>
<string name="poi_caravans">كارفان (مقطورة متنقلة)</string>
<string name="poi_power_supply">مصدر الطاقة</string>
<string name="poi_medical_system">النظام الطبي</string>
<string name="poi_fuel_avia_type">نوع الوقود (افيا)</string>
<string name="poi_additional_type">إضافي</string>
<string name="poi_vending_type">نوع البيع</string>
<string name="poi_clothes_type">نوع</string>
<string name="poi_clothes_type">النوع</string>
<string name="poi_shoes_type">نوع</string>
<string name="poi_fire_hydrant_position">موقع</string>
<string name="poi_tactile_paving">رصيف ذوي الاحتياجات</string>
<string name="poi_brushless">بدون فرش</string>
<string name="poi_fire_hydrant_position">الموقع</string>
<string name="poi_tactile_paving">مسار الرصيف البارز (للمكفوفين)</string>
<string name="poi_brushless">فرش</string>
<string name="poi_automated">آلي</string>
<string name="poi_covered">مغطى</string>
<string name="poi_ferry_terminal_cargo">نقل البضائع</string>
<string name="poi_aerialway_bicycle">دراجات النقل</string>
<string name="poi_observatory_designation">تعيين</string>
<string name="poi_aerialway_bicycle">دراجات التنقل</string>
<string name="poi_observatory_designation">الصفة</string>
<string name="poi_city_capital">العاصمة</string>
<string name="poi_pharmacy_dispensing">استغناء</string>
<string name="poi_pharmacy_dispensing">استلام</string>
<string name="poi_free_flying_characteristics">خاصية</string>
<string name="poi_star_rating">تصنيف النجوم</string>
<string name="poi_information_contents">المحتويات</string>
<string name="poi_clock_option">إضافي</string>
<string name="poi_clock_option">اضافية</string>
<string name="poi_backcountry">الريف</string>
<string name="poi_theatre_genre">نوع</string>
<string name="poi_outdoor_seating">جلوس في الهواء الطلق</string>
<string name="poi_delivery">التسليم</string>
<string name="poi_outdoor_seating">جلوس في الخارج</string>
<string name="poi_delivery">التوصيل</string>
<string name="poi_microbrewery">مصنع الجعة مصغر</string>
<string name="poi_beauty_salon_service">خدمة</string>
<string name="poi_fireplace">موقد</string>
<string name="poi_beach_surface_type">سطح</string>
<string name="poi_nudism">العري</string>
<string name="poi_diet">النظام الغذائي</string>
<string name="poi_diet">حمية</string>
<string name="poi_dish">صحن</string>
<string name="poi_payment_transport_type">نوع الدفع (نقل)</string>
<string name="poi_social_facility_type">نوع</string>
<string name="poi_social_facility_type">النوع</string>
<string name="poi_fuel_type">نوع الوقود</string>
<string name="poi_drive_in">قيادة</string>
<string name="poi_drive_through">سق عبر</string>
<string name="poi_drive_through">مسار طلبات السيارة</string>
<string name="poi_social_facility_for">الفئة المستهدفة</string>
<string name="poi_compressed_air_filter">هواء مضغوط</string>
<string name="poi_vacuum_cleaner_filter">مكنسة كهربائية</string>
<string name="poi_free_flying_characteristic">مميزة</string>
<string name="poi_stationery">محل وراقة</string>
<string name="poi_stationery">قرطاسية وأدوات مكتبية</string>
<string name="poi_cosmetics">مستحضرات التجميل</string>
<string name="poi_watches">متجر الساعات</string>
<string name="poi_spices">متجر التوابل</string>
<string name="poi_mountain_pass">ممر جبلي</string>
<string name="poi_border_control">مراقبة الحدود</string>
<string name="poi_traffic_calming_cushion">وسادة سرعة</string>
<string name="poi_traffic_calming_cushion">مطبات مركبات صغيرة</string>
<string name="poi_fuel_lpg">غاز البترول المسال</string>
<string name="poi_aeroway_fuel">محطة وقود الطائرات</string>
<string name="poi_waterway_fuel">محطة بنزين للقوارب</string>
<string name="poi_public_transport_platform_tram">موقف ترامواي</string>
<string name="poi_speed_camera">رادار</string>
<string name="poi_public_transport_platform_tram">موقف الترام</string>
<string name="poi_speed_camera">رادار سرعة</string>
<string name="poi_junction">تقاطع</string>
<string name="poi_rest_area">مساحة للإستراحة</string>
<string name="poi_water_works">أشغال المياه</string>
<string name="poi_rest_area">منطقة استراحة</string>
<string name="poi_water_works">أعمال المياه</string>
<string name="poi_boatyard">حوض سفن</string>
<string name="poi_wastewater_plant">محطة مياه الصرف الصحي</string>
<string name="poi_wastewater_plant">محطة الصرف الصحي</string>
<string name="poi_dam">سد</string>
<string name="poi_watermill">طاحونة مائية</string>
<string name="poi_power_substation">محطة فرعية</string>
<string name="poi_power_transformer">محول</string>
<string name="poi_power_plant">محطة للطاقة</string>
<string name="poi_power_plant">محطة توليد الطاقة</string>
<string name="poi_post_box">صندوق البريد</string>
<string name="poi_telephone">هاتف</string>
<string name="poi_cooling_tower">برج التبريد</string>
<string name="poi_recycling">إعادة التدوير</string>
<string name="poi_recycling_centre">مركز لإعادة التدوير</string>
<string name="poi_recycling">إعادة تدوير</string>
<string name="poi_recycling_centre">مركز إعادة التدوير</string>
<string name="poi_recycling_container">حاوية</string>
<string name="poi_recycling_glass">زجاج</string>
<string name="poi_recycling_paper">ورق</string>
@ -542,30 +542,30 @@
<string name="poi_recycling_plastic_packaging">التعبئة والتغليف البلاستيكي</string>
<string name="poi_recycling_newspaper">جرائد</string>
<string name="poi_recycling_cartons">كرتون</string>
<string name="poi_recycling_cardboard">الورق المقوى</string>
<string name="poi_recycling_magazines">المجلات</string>
<string name="poi_recycling_cardboard">ورق مقوى</string>
<string name="poi_recycling_magazines">مجلات</string>
<string name="poi_recycling_paper_packaging">تغليف ورقي</string>
<string name="poi_recycling_small_appliances">أجهزة صغيرة</string>
<string name="poi_recycling_wood">الخشب</string>
<string name="poi_recycling_wood">خشب</string>
<string name="poi_recycling_tetrapak">تتراباك</string>
<string name="poi_recycling_paint">الطلاء</string>
<string name="poi_recycling_drugs">الأدوية</string>
<string name="poi_recycling_compost">السماد العضوي</string>
<string name="poi_recycling_paint">طلاء</string>
<string name="poi_recycling_drugs">أدوية</string>
<string name="poi_recycling_compost">سماد عضوي</string>
<string name="poi_recycling_christmas_trees">أشجار عيد الميلاد</string>
<string name="poi_recycling_light_bulbs">المصابيح الكهربائية</string>
<string name="poi_recycling_chipboard">ألواح رقائقيه</string>
<string name="poi_recycling_animal_waste">النفايات الحيوانية</string>
<string name="poi_recycling_light_bulbs">مصابيح كهربائية</string>
<string name="poi_recycling_chipboard">ألواح خشبية - بلاكاش</string>
<string name="poi_recycling_animal_waste">نفايات حيوانية</string>
<string name="poi_recycling_diapers">حفاضات الأطفال</string>
<string name="poi_recycling_bicycles">دراجات هوائية</string>
<string name="poi_landfill">مطمرة نفايات</string>
<string name="poi_landfill_waste_nuclear">النفايات النووية</string>
<string name="poi_landfill">مكب نفايات</string>
<string name="poi_landfill_waste_nuclear">نفايات نووية</string>
<string name="poi_waste_basket">سلة المهملات</string>
<string name="poi_commercial">مساحة تجارية</string>
<string name="poi_vineyard">كروم</string>
<string name="poi_vineyard">حقل عنب</string>
<string name="poi_farmyard">مزرعة</string>
<string name="poi_meadow">المرج</string>
<string name="poi_meadow">مرعى أو مرج</string>
<string name="poi_canal">قناة</string>
<string name="poi_surveillance">المراقبة</string>
<string name="poi_surveillance">مراقبة</string>
<string name="poi_observatory">مرصد</string>
<string name="poi_astronomical_observatory">فلكي</string>
<string name="poi_mast">صاري</string>
@ -586,21 +586,21 @@
<string name="poi_customs">الجمارك</string>
<string name="poi_country">البلد</string>
<string name="poi_capital">نعم</string>
<string name="poi_hamlet">قرية صغيرة</string>
<string name="poi_hamlet">قرية صغيرة - هجرة</string>
<string name="poi_isolated_dwelling">بيت معزول</string>
<string name="poi_suburb">ضاحية</string>
<string name="poi_neighbourhood">حي</string>
<string name="poi_place_farm">مزرعة</string>
<string name="poi_first_aid">الإسعافات الأولية</string>
<string name="poi_veterinary">الطب البيطري</string>
<string name="poi_veterinary">بيطري</string>
<string name="poi_sanatorium">مصحة</string>
<string name="poi_healthcare_alternative">الطب البديل</string>
<string name="poi_healthcare_alternative">طب بديل</string>
<string name="poi_blood_bank">بنك دم</string>
<string name="poi_healthcare_centre">مركز طبي</string>
<string name="poi_midwife">قابلة</string>
<string name="poi_physiotherapist">أخصائي العلاج الطبيعي</string>
<string name="poi_physiotherapist">أخصائي علاج طبيعي</string>
<string name="poi_podiatrist">طبيب الأرجل</string>
<string name="poi_psychotherapist">الطبيب النفساني</string>
<string name="poi_psychotherapist">معالج نفسي</string>
<string name="poi_healthcare_rehabilitation">إعادة التأهيل</string>
<string name="poi_healthcare_yes">مرفق طبي</string>
<string name="poi_paediatrics">طب الأطفال</string>
@ -659,34 +659,34 @@
<string name="poi_historic_ship">سفينة تاريخية</string>
<string name="poi_monument">نصب تذكاري</string>
<string name="poi_zoo">حديقة الحيوانات</string>
<string name="poi_home_visit">زيارة منزلية</string>
<string name="poi_home_visit">الزيارة المنزلية</string>
<string name="poi_hearing_aids">أدوات مساعدة للسمع</string>
<string name="poi_ship_chandler">لوازم السفن والقوارب</string>
<string name="poi_window_blind">متجر ستائر</string>
<string name="poi_atv">متجر الدرجات الرباعية</string>
<string name="poi_marketplace">سوق</string>
<string name="poi_marketplace">سوق مباسط</string>
<string name="poi_swimming_pool_shop">متجر لوازم المسبح</string>
<string name="poi_shop_craft">متجر لوازم الفنون والحرف</string>
<string name="poi_religion">لوازم دينية</string>
<string name="poi_fire_flapper">رفش اطفاء النار</string>
<string name="poi_fire_flapper">أداة/مكنسة اطفاء النار</string>
<string name="poi_ford_stepping_stones">معبر حجري</string>
<string name="poi_gate">بوابة</string>
<string name="poi_lift_gate">بوابة برافعة</string>
<string name="poi_toll_booth">كشك طريق مدفوع</string>
<string name="poi_traffic_calming_rumble_strip">مطب طريق تحذيري</string>
<string name="poi_traffic_calming_table">جدول السرعة</string>
<string name="poi_traffic_calming_rumble_strip">مطب تحذيري</string>
<string name="poi_traffic_calming_table">مطب مرتفع وطويل</string>
<string name="poi_traffic_signals">اشارة توقف ضوئية</string>
<string name="poi_service_tyres">إطارات</string>
<string name="poi_fuel_hgv_diesel">نقل وقود الديزل</string>
<string name="poi_fuel_hgv_diesel">ديزل HGV</string>
<string name="poi_photo_studio">استوديو صور</string>
<string name="poi_locomotive">قاطرة</string>
<string name="poi_e_cigarette">متجر السجائر الإلكترونية</string>
<string name="poi_sewing">متجر البضائع الجافة</string>
<string name="poi_traffic_calming_choker">سلسلة كبح السرعة</string>
<string name="poi_traffic_calming_island">مكان وقوف المارة</string>
<string name="poi_sewing">متجر الأغذية المجففة</string>
<string name="poi_traffic_calming_choker">مهدئ السرعة</string>
<string name="poi_traffic_calming_island">جزيرة مرورية</string>
<string name="poi_fuel_cng">غاز طبيعي مضغوط</string>
<string name="poi_fuel_svo">زيت نباتي</string>
<string name="poi_vehicle_ramp">منحدر مركبة</string>
<string name="poi_vehicle_ramp">جسر صيانة سيارات</string>
<string name="poi_public_transport_platform_trolleybus">موقف حافلات</string>
<string name="poi_railway_buffer_stop">حاجز سكة حديدية</string>
<string name="poi_aerialway_cable_car">مركبة كهربائية</string>
@ -807,10 +807,10 @@
<string name="poi_xmas_market">سوق عيد الميلاد</string>
<string name="poi_xmas_shop">متجر عيد الميلاد</string>
<string name="poi_xmas_tree">شجرة عيد الميلاد</string>
<string name="poi_emergency_infrastructure">هياكل الإستعجالات</string>
<string name="poi_emergency_infrastructure">البنية التحتية للطوارئ</string>
<string name="poi_houseware">متجر الأدوات المنزلية</string>
<string name="poi_fire_water_pond">احتياطي مياه الحرائق</string>
<string name="poi_traffic_calming_chicane">ممهل</string>
<string name="poi_fire_water_pond">احتياطي مياه إطفاء الحرائق</string>
<string name="poi_traffic_calming_chicane">منعطف صناعي</string>
<string name="poi_aeroway_terminal">محطة المطار</string>
<string name="poi_aeroway_gate">بوابة الصعود</string>
<string name="poi_club_art">نادي الفنون</string>
@ -823,7 +823,7 @@
<string name="poi_club_chess">نادي الشطرنج</string>
<string name="poi_club_veterans">نادي قدامى المحاربين</string>
<string name="poi_club_hunting">نادي الصيد</string>
<string name="poi_speech_therapist">أخصائي في معالجة الكلام</string>
<string name="poi_speech_therapist">معالج النطق</string>
<string name="poi_craft_sculptor">نحات</string>
<string name="poi_craft_shoemaker">إسكافي</string>
<string name="poi_craft_tiler">مبلط</string>
@ -1393,11 +1393,11 @@
<string name="poi_fair_trade_no">التجارة العادلة : لا يوجد</string>
<string name="poi_fair_trade_only">منتجات التجارة العادلة فقط</string>
<string name="poi_protected_area">منطقة محمية</string>
<string name="poi_cafeteria">مقهى</string>
<string name="poi_cafeteria">كافتيريا</string>
<string name="poi_motorcycle_services">الخدمات</string>
<string name="poi_motorcycle_type">نوع الدراجة النارية</string>
<string name="poi_motorcycle_type_standard">موحد</string>
<string name="poi_zoo_type">نوع</string>
<string name="poi_zoo_type">النوع</string>
<string name="poi_aerialway_station">محطة Aerialway</string>
<string name="poi_aerialway_chair_lift">رافعة بالكرسي</string>
<string name="poi_aerialway_t_bar">رافعة T</string>
@ -1407,48 +1407,48 @@
<string name="poi_aerialway_mixed_lift">رافعة مختلطة</string>
<string name="poi_aerialway_drag_lift">رافعة سحب</string>
<string name="poi_aerialway_rope_tow">رافعة سحب</string>
<string name="poi_water_well">بئر</string>
<string name="poi_water_well">بئر ماء</string>
<string name="poi_standpipe">صنبور</string>
<string name="poi_lock_gate">قفل البوابة</string>
<string name="poi_lock_gate">حوض نقل القوارب</string>
<string name="poi_weir">سدّ غاطس</string>
<string name="poi_breakwater">حائل الأمواج</string>
<string name="poi_breakwater">كاسر الأمواج</string>
<string name="poi_groyne">مِرطَم مَوج</string>
<string name="poi_power_cable_distribution_cabinet">كبينة توزيع الأسلاك</string>
<string name="poi_power_pole">عمود كهربائي</string>
<string name="poi_bell_tower">برج جرس</string>
<string name="poi_telephone_exchange">مبدلة الخدمات الهاتفية</string>
<string name="poi_telephone_exchange">مقسم الهاتف</string>
<string name="poi_recycling_cork">فلين</string>
<string name="poi_recycling_styrofoam">الستايروفوم</string>
<string name="poi_recycling_polyester">بوليستر</string>
<string name="poi_recycling_plasterboard">لوح جصي</string>
<string name="poi_recycling_fridge_and_freezer">ثلاجة ومجمد</string>
<string name="poi_recycling_fridge_and_freezer">ثلاجة وفريزر</string>
<string name="poi_recycling_furniture">أثاث</string>
<string name="poi_waste_disposal">صرف القمامة</string>
<string name="poi_waste_disposal">مكب النفايات</string>
<string name="poi_landuse_railway">منطقة سكك حديدية</string>
<string name="poi_retail">بيع أراضي بالتجزئة</string>
<string name="poi_retail">منطقة محلات بيع بالتجزئة</string>
<string name="poi_quarry">مقلع</string>
<string name="poi_orchard">بستان</string>
<string name="poi_basin">حوض</string>
<string name="poi_basin">أرض حوضية</string>
<string name="poi_pier">رصيف بحري</string>
<string name="poi_crane">رافعة</string>
<string name="poi_construction">بناء</string>
<string name="poi_direction_all">الاتجاه: الكل</string>
<string name="poi_direction_exit">الاتجاه: مخرج</string>
<string name="poi_piste_grooming">مسار زحلقة</string>
<string name="poi_animal_shelter_type">الحيوانات مسموح بها</string>
<string name="poi_piste_grooming">مسار الزحلقة</string>
<string name="poi_animal_shelter_type">الحيوانات المسموح بها</string>
<string name="poi_animal_shelter_purpose">الغرض</string>
<string name="poi_direction_entrance">الوجهة: مدخل</string>
<string name="poi_boat_rental_type">قوارب مستأجرة</string>
<string name="poi_boat_rental_type">قوارب مأجرة</string>
<string name="poi_petroleum_well">بئر نفط</string>
<string name="poi_cricket_nets">شبكات الكريكيت</string>
<string name="poi_college">كلية</string>
<string name="poi_social_facility">مرفق اجتماعي</string>
<string name="poi_quarter">ربع</string>
<string name="poi_quarter">ربع (مجموع مربعات سكنية)</string>
<string name="poi_locality">موضع</string>
<string name="poi_nursing_home">دار تمريض</string>
<string name="poi_audiologist">اختصاصي السمع</string>
<string name="poi_occupational_therapist">أخصائي العلاج الوظيفي</string>
<string name="poi_optometrist">طبيب العيون</string>
<string name="poi_audiologist">أخصائي سمع</string>
<string name="poi_occupational_therapist">أخصائي علاج مهني</string>
<string name="poi_optometrist">طبيب عيون</string>
<string name="poi_bookmaker">ناشر</string>
<string name="poi_golf_course">ملعب غولف</string>
<string name="poi_ice_rink">حلبة تزلج</string>
@ -1456,7 +1456,7 @@
<string name="poi_raceway">مضمار سباق</string>
<string name="poi_archery">الرماية</string>
<string name="poi_turning_circle">دائرة دوران</string>
<string name="poi_waterway_turning_point">نقطة دوران في مجرى مائي</string>
<string name="poi_waterway_turning_point">نقطة دوران في المياة</string>
<string name="poi_forest">محمية</string>
<string name="poi_brownfield">أرض صناعية سابقة</string>
<string name="poi_greenfield">حقل أخضر</string>
@ -1482,7 +1482,7 @@
<string name="poi_battlefield">ميدان معركة</string>
<string name="poi_water_supply_type">نوع إمدادات المياه</string>
<string name="poi_water_purification">تنقية المياه</string>
<string name="poi_survey_point">نقطة دراسة استقصائية</string>
<string name="poi_survey_point">نقطة الاستطلاع</string>
<string name="poi_parking_fee">رسوم الموقف</string>
<string name="poi_map_type_street">نوع الخريطة: شارع</string>
<string name="poi_charging_station">محطة شحن</string>
@ -1491,20 +1491,20 @@
<string name="poi_post_flats">شقة</string>
<string name="poi_payment_centre">مركز الدفع</string>
<string name="poi_money_transfer">تحويل أموال</string>
<string name="poi_operational_status">حالة التشغيل</string>
<string name="poi_operational_status">الحالة التشغيلية</string>
<string name="poi_water_place_access">الوصول إلى مكان المياه</string>
<string name="poi_climbing_style">أسلوب التسلق</string>
<string name="poi_socket">موصل</string>
<string name="poi_socket">مقبس كهرباء</string>
<string name="poi_socket_chademo_output_filter">مخرج CHAdeMO</string>
<string name="poi_socket_type2_output_filter">مخرج نوع 2</string>
<string name="poi_service_car">خدمة سيارات</string>
<string name="poi_service_car">خدمة السيارات</string>
<string name="poi_glacier_type">النوع الجليدي</string>
<string name="poi_checkpoint_type">نوع نقطة التفتيش</string>
<string name="poi_bulk_purchase">الشراء بالجملة</string>
<string name="poi_substation_type">النوع</string>
<string name="poi_books_type">كتب</string>
<string name="poi_denotation">له دلالة</string>
<string name="poi_allotments">المخصصات</string>
<string name="poi_denotation">إشارة</string>
<string name="poi_allotments">أراضي مخصصات</string>
<string name="poi_denomination_shaktism">شاكتيزم</string>
<string name="poi_bird_hide">مكان لمراقبة الطيور</string>
<string name="poi_passing_place">طريق تجاوز</string>
@ -1624,15 +1624,15 @@
<string name="poi_generator_source_biomass">مصدر الطاقة: الكتلة الحيوية</string>
<string name="reddit">موقع Reddit</string>
<string name="poi_park_ride">اصطف واركب</string>
<string name="poi_rtsa_scale_filter">فئة الصعوبة</string>
<string name="poi_rtsa_scale_filter">تصنيف الصعوبة</string>
<string name="poi_climbing_crag_filter">تسلق الصخور</string>
<string name="poi_climbing_crag">نعم</string>
<string name="poi_access_bus">منفذ للحافلة</string>
<string name="poi_access_motorcycle">مدخل دراجات نارية</string>
<string name="poi_access_disabled">مدخل معاقين</string>
<string name="poi_cash_withdrawal_bank_card">سحب نقدي</string>
<string name="poi_access_motorhome">عربة منزل متنقل</string>
<string name="poi_access_caravan">مدخل منازل متنقلة</string>
<string name="poi_access_disabled">مدخل المعاقين</string>
<string name="poi_cash_withdrawal_bank_card">السحب النقدي</string>
<string name="poi_access_motorhome">مدخل المنزل المتنقل</string>
<string name="poi_access_caravan">مدخل الكارفان</string>
<string name="poi_snowmobile_filter">مدخل دراجة جليد</string>
<string name="poi_socket_schuko_output_filter">مخرج Schuko</string>
<string name="poi_socket_cee_blue_output_filter">مخرج CEE أزرق</string>
@ -1644,10 +1644,10 @@
<string name="poi_orienteering">التوجيه</string>
<string name="poi_ice_stock">مخزون الثلج</string>
<string name="poi_bowls">كرة</string>
<string name="poi_place_allotments">المخصصات</string>
<string name="poi_place_allotments">أراضي مخصصات</string>
<string name="poi_register_office">مكتب السجل المدني</string>
<string name="poi_bunker_silo">مستودع بنكر</string>
<string name="poi_recycling_hardcore">متشدد</string>
<string name="poi_bunker_silo">غرفة تحميل</string>
<string name="poi_recycling_hardcore">صلب</string>
<string name="poi_aerialway_pylon">برج الرفع الجوي</string>
<string name="poi_fuel_coal">الوقود: الفحم</string>
<string name="poi_fuel_charcoal">الوقود: فحم</string>
@ -1655,16 +1655,25 @@
<string name="poi_fuel_adblue">سائل عادم الديزل</string>
<string name="poi_fuel_jeta1">وقود الطائرات النفاثة A-1</string>
<string name="poi_fuel_autogas">أوتوجاز</string>
<string name="poi_fuel_100ll">100 لتر وقود</string>
<string name="poi_fuel_100ll">وقود 100LL</string>
<string name="poi_fuel_91ul">وقود 91UL</string>
<string name="poi_traffic_signals_arrow">سهم</string>
<string name="poi_traffic_signals_arrow">السهم</string>
<string name="poi_traffic_signals_vibration">الاهتزاز</string>
<string name="poi_fire_hydrant_pressure_filter">الضغط</string>
<string name="poi_video_telephone">فيديو</string>
<string name="poi_sms">رسالة قصيرة</string>
<string name="poi_sms">رسالة SMS</string>
<string name="poi_volcano_status">الحالة</string>
<string name="poi_volcano_type">النوع</string>
<string name="poi_bath_open_air">الهواء الطلق</string>
<string name="poi_bath_type">النوع</string>
<string name="poi_access_goods">دخول مركبات البضائع الخفيفة</string>
<string name="poi_access_goods">مدخل مركبات البضائع الخفيفة</string>
<string name="poi_recycling_small_electrical_appliances">الأجهزة الكهربائية الصغيرة</string>
<string name="poi_escape_lane">طريق إخلاء</string>
<string name="poi_departures_board">لوحة المغادرة</string>
<string name="poi_drinking_water_refill">إعادة تعبئة مياه الشرب</string>
<string name="poi_access_hgv">مدخل HGV</string>
<string name="poi_access_mofa">مدخل الدراجة النارية</string>
<string name="poi_access_moped">مدخل الدراجة</string>
<string name="poi_access_trailer">مدخل المقطورة</string>
<string name="poi_socket_type2_combo_output_filter">نوع 2 مخرج combo</string>
</resources>

View file

@ -3117,7 +3117,7 @@
<string name="utm_format_descr">يستخدم أوسماند تنسيق UTM وهو مشابه ولكن غير مطابق لتنسيق UTM الناتو.</string>
<string name="shared_string_example">مثال</string>
<string name="navigate_point_format_utm">معيار الإحداثيات</string>
<string name="navigate_point_format_olc">فتح رمز الموقع</string>
<string name="navigate_point_format_olc">رمز الموقع المفتوح (OLC)</string>
<string name="coordinates_format_info">سيتم تطبيق التنسيق المحدد في كل أنحاء التطبيق.</string>
<string name="pref_selected_by_default_for_profiles">يتم تحديد هذا الاعداد بشكل افتراضي للأوضاع: %s</string>
<string name="change_default_settings">تغيير الإعدادات</string>
@ -3658,15 +3658,15 @@
<string name="osmand_purchases_item">مشتريات أوسماند</string>
<string name="legend_item_description">دليل رموز الخريطة.</string>
<string name="navigation_profiles_item">أوضاع الملاحة</string>
<string name="release_3_7">• خرائط جديدة للمنحدرات غير المتصلة بالإنترنت
<string name="release_3_7">• خرائط جديدة للتضاريس توضح المنحدرات من دون الحاجة للاتصال بالإنترنت
\n
\n • التخصيص الكامل للمفضلات ونقاط الطرق GPX - الألوان المخصصة والأيقونات والأشكال
\n
\n • تخصيص ترتيب العناصر في قائمة السياق ، تكوين الخريطة ، درج
\n
\n • ويكيبيديا كطبقة منفصلة في تكوين الخريطة ، حدد اللغات المطلوبة فقط
\n  عرض ويكيبيديا كطبقة منفصلة في تكوين الخريطة ، حدد اللغات المطلوبة فقط
\n
\n • إنشاء مرشح / خرائط POI الخاصة بك مع مرونة تامة
\n • إنشاء مرشح / خرائط للمعالم الخاصة بك مع مرونة تامة
\n
\n • تمت إضافة خيارات لاستعادة إعدادات الأوضاع المخصصة
\n
@ -3674,7 +3674,7 @@
\n
\n • إصلاح أحجام واجهة المستخدم على الأجهزة اللوحية
\n
\n • إصلاح الخلل مع RTL
\n • إصلاح الخلل مع اللغات التي تكتب من اليمين
\n
\n</string>
<string name="shared_string_resume">إستئناف</string>
@ -3683,7 +3683,7 @@
<string name="quick_action_transport_show">إظهار وسائل النقل العام</string>
<string name="quick_action_show_hide_transport">إظهار/إخفاء وسائل النقل العام</string>
<string name="quick_action_transport_descr">زر لإظهار أو إخفاء وسائل النقل العام على الخريطة.</string>
<string name="create_edit_poi">إنشاء /تحرير POI</string>
<string name="create_edit_poi">إنشاء /تحرير موضع مكان</string>
<string name="parking_positions">مكان الموقف</string>
<string name="add_edit_favorite">إضافة / تحرير المفضلة</string>
<string name="reset_deafult_order">استعادة ترتيب العناصر الافتراضية</string>
@ -3934,4 +3934,10 @@
<string name="navigate_point_mgrs">النظام المرجعي للشبكة العسكرية</string>
<string name="navigate_point_format_mgrs">النظام المرجعي للشبكة العسكرية</string>
<string name="mgrs_format_descr">OsmAnd يستخدم MGRS، وهو مشابه لتنسيق UTM NATO .</string>
<string name="message_you_need_add_two_points_to_show_graphs">يجب عليك إضافة نقطتين على الأقل.</string>
<string name="manage_subscription">إدارة الاشتراك</string>
<string name="subscription_payment_issue_title">هناك مشكلة في اشتراكك. انقر الزر للانتقال إلى إعدادات اشتراك Google Play لإصلاح طريقة الدفع الخاصة بك.</string>
<string name="subscription_expired_title">انتهت صلاحية اشتراك OsmAnd Live</string>
<string name="subscription_paused_title">تم إيقاف اشتراك OsmAnd Live مؤقتًا</string>
<string name="subscription_on_hold_title">اشتراك OsmAnd Live معلق</string>
</resources>

View file

@ -99,7 +99,7 @@
<string name="intermediate_points_change_order">Смяна на реда</string>
<string name="srtm_paid_version_msg">Можете да закупите добавката Contour lines чрез Market и да подпомогнете нейното бъдещо развитие.</string>
<string name="srtm_paid_version_title">Добавка за контури (Contour lines)</string>
<string name="av_def_action_choose">Избери при заявка</string>
<string name="av_def_action_choose">При поискване\?</string>
<string name="av_def_action_video">Запиши видео</string>
<string name="av_def_action_audio">Запиши аудио</string>
<string name="av_widget_action_descr">Изберете действие по подразбиране</string>
@ -142,7 +142,8 @@
<string name="index_srtm_parts">части</string>
<string name="index_srtm_ele">Контури</string>
<string name="srtm_plugin_description">"Тази добавка осигурява показване на релефни контури върху офлайн картите на OsmAnd. Тази функционалност е много оценявана от спортисти, туристи, всички които се интересуват от ландшафта.
\n\nГлобалните данни (между 70 градуса северна ширина и 70 градуса южна ширина) се основават на измервания от SRTM и ASTER - радари намиращи се на борда на Terra - сателит на НАСА за наблюдение на НАСА. ASTER е съвместен проект между НАСА и Япония. "</string>
\n
\nГлобалните данни (между 70 градуса северна ширина и 70 градуса южна ширина) се основават на измервания от SRTM и ASTER - радари намиращи се на борда на Terra - сателит на НАСА за наблюдение на НАСА. ASTER е съвместен проект между НАСА и Япония."</string>
<string name="srtm_plugin_name">Контурни линии</string>
<string name="download_select_map_types">Други карти</string>
<string name="download_roads_only_item">Само пътища</string>
@ -552,12 +553,12 @@
<string name="trace_rendering">Информация за производителността</string>
<string name="trace_rendering_descr">Показване на производителността при изчертаване на картата</string>
<string name="installing_new_resources">Отваряне на нови данни…</string>
<string name="internet_connection_required_for_online_route">Избрана е онлайн навигация, но няма връзка с интернет.</string>
<string name="internet_connection_required_for_online_route">Навигацията онлайн не работи без връзка с интернет.</string>
<string name="tts_language_not_supported_title">Езикът не се поддържа</string>
<string name="tts_language_not_supported">Избраният език не се поддържа от инсталираният Android TTS (синтез на глас). Искате ли да изтеглите друг TTS генератор на глас от Market? В противен случай ще бъде използван TTS по подразбиране.</string>
<string name="tts_language_not_supported">Избраният език не се поддържа от инсталираният Android TTS (синтез на глас) и ще бъде използван TTS по подразбиране. Искате ли да изтеглите друг генератор на глас от Google Play\?</string>
<string name="tts_missing_language_data_title">Липсващи данни</string>
<string name="tts_missing_language_data">Няма нищо инсталирано за съответния език. Искате ли да отидете в \'Market\' за да инсталирате?</string>
<string name="gpx_option_reverse_route">Обръщане посоката на GPX</string>
<string name="tts_missing_language_data">Искате ли да отидете в Google Play за да свалите избрания език\?</string>
<string name="gpx_option_reverse_route">Обръщане посоката на трека</string>
<string name="gpx_option_destination_point">Ползвай текущата крайна цел</string>
<string name="gpx_option_from_start_point">Преминахте по целия маршрут</string>
<string name="switch_to_vector_map_to_see">За този район има карта в офлайн режим.\n\t\n\tАктивирайте я от \'Меню\' → \'Настройки карта\' → \'Карта източник…\' → \'Офлайн векторни карти\'.</string>
@ -1196,12 +1197,17 @@
<string name="save_global_track_interval">Интервал за запис</string>
<string name="search_for">Търси</string>
<string name="shared_string_show_all">Покажи всички</string>
<string name="plugin_touringview_descr">"Този изглед превключва OsmAnd към \'Touring view\'. Той е предназначен специално за пътуващи и професионални шофьори.
\n\nИзгледът предоставя при всякакво увеличение максимално количество подробности по картата (пътища, пътеки, ориентири).
\n\nВсички видове пътища са изобразени с отделен цвят, което е особено полезно при управление на големи превозни средства.
\n\nAnd it provides special touring options like showing bicycle routes or Alpine mountain routes.
\n\nНе се изисква специална карта, изгледът се създава от стандартните карти на приложението.
\n\nThis view can be reverted by either de-activating it again here, or by changing the \'Map style\' under \"Настройка на картата\" as desired. "</string>
<string name="plugin_touringview_descr">Активирането на този изглед превключва OsmAnd към \'Туристическа карта\' - предназначен специално за пътешественици и професионални шофьори.
\n
\nИзгледът предоставя при всякакво увеличение максимално количество подробности по картата (пътища, пътеки, ориентири).
\n
\nВсички видове пътища са изобразени с отделен цвят, което е особено полезно при управление на големи превозни средства.
\n
\nИзобразява вело-маршрути и маршрути за планинско катерене.
\n
\nНе се изисква специална карта, изгледът се създава от стандартните карти на приложението.
\n
\nМожете да деактивирате този изглед или тук или от \"Настройки на картата\" -&gt; \"Стил на картата\"</string>
<string name="show_railway_warnings">ЖП прелези</string>
<string name="show_pedestrian_warnings">Пешеходни пътеки</string>
<string name="rendering_attr_streetLighting_name">Улично осветление</string>
@ -1295,10 +1301,12 @@
<string name="proxy_pref_descr">Настройка на прокси сървър.</string>
<string name="settings_privacy">Поверителност</string>
<string name="shared_string_gpx_points">Точки</string>
<string name="record_plugin_description">"Тази добавка позволява записване на изминатия път в GPX файл. Записът може да се активира чрез докосване на бутон на главния екран или автоматично при стартиране на навигацията.\n\nЗаписаните следи могат да бъдат споделяни или да се изпращат към OSM. Спортистите могат да използват записаните следи за да проследят своя напредък. Основните данни на следата можете да видите директно в OsmAnd, като междинни времена, средната скорост и т.н. По-късно можете да анализирате следите в специални приложения за целта. "</string>
<string name="record_plugin_description">Тази добавка позволява записване на изминатия път в GPX файл. Записът може да се активира чрез докосване на бутон на главния екран или автоматично при стартиране на навигацията.
\n
\nЗаписаните следи могат да бъдат споделяни или да се изпращат към OSM. Спортистите могат да използват записаните следи за да проследят своя напредък. Основните данни на следата можете да видите директно в OsmAnd, като междинни времена, средната скорост и т.н. По-късно можете да анализирате следите в специални приложения за целта.</string>
<string name="navigation_over_track">Стартиране на навигацията по маршрута?</string>
<string name="save_track_to_gpx_globally_headline">Запис на следа при поискване</string>
<string name="gpx_info_subtracks">"Части: %1$s "</string>
<string name="gpx_info_subtracks">Сегменти: %1$s</string>
<string name="gpx_selection_track">%1$s
\nСледа %2$s</string>
<string name="gpx_file_is_empty">Празен GPX файл</string>
@ -1348,12 +1356,12 @@
<string name="rendering_value_pink_name">розов</string>
<string name="speed_limit_exceed">Толеранс за скоростта</string>
<string name="delay_navigation_start">Автоматично стартиране на напътствията</string>
<string name="gpx_info_waypoints">"Точки: %1$s "</string>
<string name="gpx_info_distance">"Разстояние: %1$s (%2$s точки) "</string>
<string name="gpx_info_start_time">"Начало: %1$tF, %1$tT "</string>
<string name="gpx_info_end_time">"Край: %1$tF, %1$tT "</string>
<string name="gpx_info_average_speed">"Средна скорост: %1$s "</string>
<string name="gpx_info_maximum_speed">"Макс.скорост: %1$s "</string>
<string name="gpx_info_waypoints">Точки: %1$s</string>
<string name="gpx_info_distance">Разстояние: %1$s (%2$s точки)</string>
<string name="gpx_info_start_time">Начало: %1$tF, %1$tT</string>
<string name="gpx_info_end_time">Край: %1$tF, %1$tT</string>
<string name="gpx_info_average_speed">Средна скорост: %1$s</string>
<string name="gpx_info_maximum_speed">Макс. скорост: %1$s</string>
<string name="gpx_info_avg_altitude">Средна височина: %1$s</string>
<string name="gpx_info_diff_altitude">Разлика във височините: %1$s</string>
<string name="gpx_info_asc_altitude">Изкачване/слизане: %1$s</string>
@ -1425,7 +1433,11 @@
<string name="lang_ceb">Себуански</string>
<string name="lang_ms">Малайски</string>
<string name="lang_ht">Хаитянски</string>
<string name="plugin_nautical_descr">"Добавката обогатява приложението OsmAnd карти и навигация като създава карти за гребане, ветроходство и други водни спортове.\n\nСпециалната добавка за карти на OsmAnd добавя морски навигационни символи и диаграми за вътрешна и крайбрежна навигация. Описанието на всеки навигационен символ показва подробностите, необходими за разпознаването и значението му (категория, фигура, цвят, последователност, препратка и др.).\n\nЗа да се върнете към някой от обикновените режими на картите на OsmAnd, просто изключете добавката или сменете \"Стил на картата\" в менюто \"Настройка на картата\". "</string>
<string name="plugin_nautical_descr">Добавката обогатява приложението OsmAnd карти и навигация като създава карти за гребане, ветроходство и други водни спортове.
\n
\nСпециалната добавка за карти на OsmAnd добавя морски навигационни символи и диаграми за вътрешна и крайбрежна навигация. Описанието на всеки навигационен символ показва подробностите, необходими за разпознаването и значението му (категория, фигура, цвят, последователност, препратка и др.).
\n
\nЗа да се върнете към някой от обикновените режими на картите на OsmAnd, просто изключете добавката или сменете в менюто \"Настройки на картата\" -&gt; \"Стил на картата\".</string>
<string name="plugin_settings">Добавки</string>
<string name="rendering_attr_currentTrackColor_name">цвят на GPX</string>
<string name="rendering_attr_currentTrackWidth_name">GPX ширина</string>
@ -2224,4 +2236,11 @@
<string name="shared_string_file_name">Име на файл</string>
<string name="number_of_gpx_files_selected_pattern">Избрани файлове за проследяване: %s</string>
<string name="monitoring_control_start">REC</string>
<string name="nearest_point">Най-близката точка</string>
<string name="attach_to_the_roads">Прикрепяне към пътищата</string>
<string name="delete_address">Изтриване на адрес</string>
<string name="add_address">Добавете адрес</string>
<string name="access_hint_enter_address">Въведете адрес</string>
<string name="plan_route_trim_before">Подрязване преди</string>
<string name="plan_route_trim_after">Подрязване след</string>
</resources>

View file

@ -3654,4 +3654,78 @@ Zobrazená oblast: %1$s x %2$s</string>
<string name="keep_screen_on">Nechat obrazovku zapnutou</string>
<string name="keep_screen_off">Nechat obrazovku vypnutou</string>
<string name="route_between_points_warning_desc">Dále, pro použití této možnosti připojte vaši stopu k nejbližší povolené cestě s některým z vašich navigačních profilů.</string>
<string name="use_system_screen_timeout">Použít systémový časový limit obrazovky</string>
<string name="reset_to_default_category_button_promo">\"Obnovit do základního nastavení\" nastaví výchozí pořadí.</string>
<string name="copy_coordinates">Kopírovat souřadnice</string>
<string name="release_3_6">• Profily: nyní můžete změnit pořadí, nastavit ikonu pro mapu, změnit všechna nastavení základních profilů a resetovat je zpět do výchozího stavu
\n
\n • V navigaci přibylo číslo výjezdu
\n
\n • Přepracovaná nastavení modulů
\n
\n • Přepracovaná obrazovka nastavení pro rychlý přístup ke všem profilům
\n
\n • Přidaná možnost kopírovat nastavení z jiného profilu
\n
\n • Přidaná možnost skrýt nebo změnit pořadí kategorií bodů zájmu při hledání
\n
\n • Zpřesněné umístění ikon bodů zájmu na mapě
\n
\n • Přidané údaje o východu a západu slunce v nastavení mapy
\n
\n • Přidané ikony Domov a Práce na mapě
\n
\n • Přidaná podpora pro víceřádkové popisy v nastavení
\n
\n • Přidaná správná transliterace v mapě Japonska
\n
\n • Přidaná mapa Antarktidy
\n
\n</string>
<string name="clear_recorded_data">Vymazat zaznamenaná data</string>
<string name="routing_profile_direct_to">Přímo k bodu</string>
<string name="ui_customization_description">Nastavte počet položek v \"Úvodním panelu\", \"Nastavení mapy\" a \"Kontextovém menu\".
\n
\nVypněte nepoužívané moduly, abyste skryli jejich ovládací prvky. %1$s.</string>
<string name="ui_customization_short_descr">Položky v úvodním panelu a kontextovém menu</string>
<string name="ui_customization">Nastavení uživatelského rozhraní</string>
<string name="shared_string_drawer">Úvodní panel</string>
<string name="quick_action_transport_hide">Skrýt veřejnou dopravu</string>
<string name="quick_action_transport_show">Zobrazit veřejnou dopravu</string>
<string name="quick_action_show_hide_transport">Zobrazit/skrýt veřejnou dopravu</string>
<string name="quick_action_transport_descr">Tlačítko pro zobrazení nebo skrytí veřejné dopravy na mapě.</string>
<string name="create_edit_poi">Vytvořit / upravit bod zájmu</string>
<string name="parking_positions">Parkovací místa</string>
<string name="add_edit_favorite">Přidat / upravit oblíbený bod</string>
<string name="reset_deafult_order">Obnovit výchozí pořadí položek</string>
<string name="back_to_editing">Zpět k úpravám</string>
<string name="quick_action_switch_profile_descr">Tlačítko akce přepne mezi zvolenými profily.</string>
<string name="shared_string_add_profile">Přidat profil</string>
<string name="change_application_profile">Změnit profil aplikace</string>
<string name="profiles_for_action_not_found">Nebyly nalezeny žádné vhodné profily.</string>
<string name="index_item_world_basemap_detailed">Přehledová mapa světa (detailní)</string>
<string name="unsupported_type_error">Nepodporovaný typ</string>
<string name="width_limit_description">Zadejte šířku svého vozidla, na trase mohou být omezení pro široká vozidla.</string>
<string name="height_limit_description">Zadejte výšku svého vozidla, na trase mohou být omezení pro vysoká vozidla.</string>
<string name="weight_limit_description">Zadejte hmotnost svého vozidla, na trase mohou být omezení pro těžká vozidla.</string>
<string name="lenght_limit_description">Zadejte délku svého vozidla, na trase mohou být omezení pro dlouhá vozidla.</string>
<string name="gpx_parse_error">GPX nemá správný tvar pro OsmAnd, kontaktujte prosím podporu pro další přezkoumání.</string>
<string name="shared_string_always">Vždy</string>
<string name="screen_control">Ovládání obrazovky</string>
<string name="system_screen_timeout_descr">Vypne obrazovku po uplynutí systémového časového limitu.</string>
<string name="system_screen_timeout">Použít systémový časový limit obrazovky</string>
<string name="turn_screen_on_descr">Zvolte možnosti probuzení obrazovky (při zamykání zařízení se ujistěte, že je OsmAnd na popředí):</string>
<string name="turn_screen_on_navigation_instructions_descr">Každý navigační pokyn zapne obrazovku.</string>
<string name="turn_screen_on_navigation_instructions">Navigační pokyny</string>
<string name="turn_screen_on_power_button_disabled">Vypnuto. Vyžaduje \"Nechat obrazovku zapnutou\" pod \"Časový limit obrazovky po probuzení\".</string>
<string name="turn_screen_on_power_button_descr">Stisknutím tlačítka napájení zapnete obrazovku s aplikací OsmAnd na zamčené obrazovce.</string>
<string name="turn_screen_on_power_button">Tlačítko napájení</string>
<string name="turn_screen_on_proximity_sensor">Senzor přiblížení</string>
<string name="turn_screen_on_wake_time_descr">Zvolte časový limit vypnutí obrazovky po probuzení (\"%1$s\" znamená bez časového limitu.)</string>
<string name="message_you_need_add_two_points_to_show_graphs">Musíte přidat aspoň dva body.</string>
<string name="manage_subscription">Spravovat předplatné</string>
<string name="subscription_payment_issue_title">S vaším předplatným je problém. Klikněte na tlačítko pro přechod do nastavení předplatného v Google Play a opravte způsob platby.</string>
<string name="subscription_expired_title">Předplatné OsmAnd Live skončilo</string>
<string name="subscription_paused_title">Předplatné OsmAnd Live je pozastaveno</string>
<string name="subscription_on_hold_title">Předplatné OsmAnd Live je zablokované</string>
</resources>

View file

@ -1252,6 +1252,7 @@
<string name="lang_cy">Walisisch</string>
<string name="lang_da">Dänisch</string>
<string name="lang_de">Deutsch</string>
<string name="lang_de_casual">Deutsch (informell)</string>
<string name="lang_el">Griechisch</string>
<string name="lang_en">Englisch</string>
<string name="lang_es">Spanisch</string>
@ -3950,4 +3951,10 @@
<string name="icon_group_symbols">Symbole</string>
<string name="shared_string_local_maps">Lokale Karten</string>
<string name="icon_group_special">Spezial</string>
<string name="message_you_need_add_two_points_to_show_graphs">Sie müssen mindestens zwei Punkte hinzufügen.</string>
<string name="manage_subscription">Abonnement verwalten</string>
<string name="subscription_payment_issue_title">Es gibt ein Problem mit Ihrem Abonnement. Klicken Sie auf die Schaltfläche, um zu den Einstellungen des Google Play Abonnements zu gelangen und Ihre Zahlungsmethode zu überprüfen.</string>
<string name="subscription_expired_title">OsmAnd Live Abonnement ist abgelaufen</string>
<string name="subscription_paused_title">OsmAnd Live Abonnement wurde ausgesetzt</string>
<string name="subscription_on_hold_title">OsmAnd Live Abonnement liegt auf Eis</string>
</resources>

View file

@ -3946,4 +3946,10 @@
<string name="navigate_point_mgrs">MGRS</string>
<string name="navigate_point_format_mgrs">MGRS</string>
<string name="mgrs_format_descr">OsmAnd uzas MGRS, kiu estas simila al la formo UTM NATO.</string>
<string name="message_you_need_add_two_points_to_show_graphs">Aldonu almenaŭ du punktojn.</string>
<string name="manage_subscription">Administri abonon</string>
<string name="subscription_payment_issue_title">Okazis problemo pri via abono. Premu la butonon por iri al agordoj pri abonoj ĉe Google Play por korekti vian pagmanieron.</string>
<string name="subscription_expired_title">Abono OsmAnd Live senvalidiĝis</string>
<string name="subscription_paused_title">Abono OsmAnd Live estas paŭziigita</string>
<string name="subscription_on_hold_title">Abono OsmAnd Live estas ĉesigita</string>
</resources>

View file

@ -3951,4 +3951,10 @@
<string name="navigate_point_mgrs">MGRS</string>
<string name="navigate_point_format_mgrs">MGRS</string>
<string name="mgrs_format_descr">OsmAnd usa MGRS, similar al formato UTM de la OTAN.</string>
<string name="message_you_need_add_two_points_to_show_graphs">Debes añadir al menos dos puntos.</string>
<string name="manage_subscription">Gestionar suscripción</string>
<string name="subscription_payment_issue_title">Hay un problema con la suscripción. Pulsa el botón para ir a los ajustes de la suscripción de Google Play y corregir el método de pago.</string>
<string name="subscription_expired_title">La suscripción a OsmAnd Live ha caducado</string>
<string name="subscription_paused_title">La suscripción a OsmAnd Live se ha pausado</string>
<string name="subscription_on_hold_title">La suscripción a OsmAnd Live está en espera</string>
</resources>

View file

@ -3798,4 +3798,10 @@
<string name="mgrs_format_descr">OsmAnd kasutab MGRS-vormingut, mis on sarnane NATO UTM-vormingule.</string>
<string name="navigate_point_format_mgrs">MGRS</string>
<string name="navigate_point_mgrs">MGRS</string>
<string name="message_you_need_add_two_points_to_show_graphs">Graafiku joonistamiseks pead lisama vähemalt kaks punkti.</string>
<string name="subscription_on_hold_title">OsmAnd Live tellimus on ootel</string>
<string name="subscription_paused_title">OsmAnd Live tellimus on peatatud</string>
<string name="subscription_expired_title">OsmAnd Live tellimus on aegunud</string>
<string name="subscription_payment_issue_title">Sinu tellimusega on üks pisikene segadus. Selleks et Google Play seadistuses makseviisi parandada, palun klõpsi seda nuppu.</string>
<string name="manage_subscription">Halda tellimusi</string>
</resources>

View file

@ -3926,4 +3926,5 @@
<string name="mgrs_format_descr">OsmAnd utilise le système de référence MDRS de l\'OTAN dérivé des formats UTM et UPS.</string>
<string name="navigate_point_format_mgrs">MGRS</string>
<string name="navigate_point_mgrs">MGRS</string>
<string name="message_you_need_add_two_points_to_show_graphs">Vous devez ajouter, au moins, deux points.</string>
</resources>

View file

@ -3842,4 +3842,5 @@
<string name="poi_parking_sheds">Pendellos</string>
<string name="poi_parking_rooftop">Terrazo</string>
<string name="poi_gpx_point">Punto GPX</string>
<string name="poi_radar_tower">Torre de radar</string>
</resources>

View file

@ -3971,4 +3971,10 @@ Lon %2$s</string>
<string name="icon_group_sport">Deporte</string>
<string name="icon_group_emergency">Emerxencia</string>
<string name="icon_group_travel">Viaxe</string>
<string name="message_you_need_add_two_points_to_show_graphs">Tes que engadir polo menos dous puntos.</string>
<string name="manage_subscription">Xestionar subscrición</string>
<string name="subscription_payment_issue_title">Hai un problema coa túa subscrición. Preme no botón para ir ós axustes de subscrición da Google Play e corrixir o teu método de pagamento.</string>
<string name="subscription_expired_title">A subscrición do OsmAnd Live expirou</string>
<string name="subscription_paused_title">A subscrición do OsmAnd Live foi detida</string>
<string name="subscription_on_hold_title">A subscrición do OsmAnd Live está en espera</string>
</resources>

View file

@ -239,7 +239,7 @@
<string name="map_overlay_descr">Rátéttérkép kiválasztása</string>
<string name="tile_source_already_installed">A térkép már telepítve van, a beállítások frissülnek.</string>
<string name="select_tile_source_to_install">(Csempés) térkép kiválasztása telepítéshez vagy frissítéshez.</string>
<string name="internet_not_available">Nem lehet végrehajtani a műveletet internetkapcsolat nélkül.</string>
<string name="internet_not_available">A műveletet nem lehetséges internetkapcsolat nélkül végrehajtani.</string>
<string name="install_more">További telepítése…</string>
<string name="level_to_switch_vector_raster_descr">Raszteres térképek használata ezen nagyítási szint alatt.</string>
<string name="level_to_switch_vector_raster">Legkisebb vektoros nagyítási szint</string>
@ -1228,7 +1228,7 @@
<string name="import_file_favourites">Mented az adatokat GPX fájlként, vagy importálod az útpontokat a „Kedvencek”-be?</string>
<string name="shared_string_share">Megosztás</string>
<string name="share_fav_subject">OsmAndból megosztott kedvencek</string>
<string name="no_index_file_to_download">Nem találhatók letöltések, ellenőrizd az internetkapcsolatot.</string>
<string name="no_index_file_to_download">Nem találhatók letöltések, ellenőrizze az internetkapcsolatot.</string>
<string name="none_selected_gpx">Először egy hosszú koppintással adjon meg egy GPX-fájlt.</string>
<string name="local_index_select_gpx_file">Nyomvonal kijelölése</string>
<string name="sort_by_distance">Rendezés távolság szerint</string>
@ -1370,7 +1370,7 @@
<string name="download_tab_updates">Frissítések</string>
<string name="download_tab_downloads">Letöltés</string>
<string name="download_tab_local">Helyi</string>
<string name="no_internet_connection">A letöltés nem lehetséges, ellenőrizd az internet-kapcsolatot.</string>
<string name="no_internet_connection">A letöltés nem lehetséges, ellenőrizze az internetkapcsolatot.</string>
<string name="shared_string_dismiss">Bezárás</string>
<string name="everything_up_to_date">Minden fájl naprakész</string>
<string name="use_opengl_render">OpenGL megjelenítő használata</string>
@ -2493,9 +2493,9 @@
<string name="context_menu_points_of_group">A csoport összes pontja</string>
<string name="open_from">Nyitva ekkortól:</string>
<string name="open_till">Nyitva eddig:</string>
<string name="will_close_at">Bezár ekkor:</string>
<string name="will_open_at">Kinyit ekkor:</string>
<string name="will_open_on">Kinyit ekkor:</string>
<string name="will_close_at">Ekkor zár:</string>
<string name="will_open_at">Ekkor nyit:</string>
<string name="will_open_on">Ekkor nyit:</string>
<string name="additional_actions">További műveletek</string>
<string name="av_locations_selected_desc">GPX fájl a kijelölt jegyzetek koordinátáival és adataival.</string>
<string name="av_locations_all_desc">GPX fájl az összes jegyzet koordinátáival és adataival.</string>
@ -3938,4 +3938,6 @@
<string name="navigate_point_mgrs">MGRS</string>
<string name="navigate_point_format_mgrs">MGRS</string>
<string name="mgrs_format_descr">Az OsmAnd a NATO által is használt MGRS (Military Grid Reference System) koordinátákat alkamazza, amely hasonlít az UTM-formátumhoz.</string>
<string name="message_you_need_add_two_points_to_show_graphs">Legalább két pontot kell hozzáadnia.</string>
<string name="manage_subscription">Előfizetés kezelése</string>
</resources>

View file

@ -3945,4 +3945,5 @@
<string name="icon_group_sport">Sport</string>
<string name="icon_group_emergency">Emergenza</string>
<string name="icon_group_travel">Viaggio</string>
<string name="message_you_need_add_two_points_to_show_graphs">Devi aggiungere almeno due punti.</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -3874,4 +3874,17 @@
<string name="shared_string_graph">Graf</string>
<string name="message_need_calculate_route_before_show_graph">%1$s-data er tilgjengelig kun på veiene, du må beregne en rute med “Rut mellom punkter”.</string>
<string name="shared_string_gpx_route">Spor rute</string>
<string name="icon_group_special">Spesiell</string>
<string name="mgrs_format_descr">OsmAnd bruker MGRS, som ligner UTM NATO-format</string>
<string name="navigate_point_format_mgrs">MGRS</string>
<string name="navigate_point_mgrs">MGRS</string>
<string name="snowmobile_render_descr">For snøscooterkjøring med egne veier og løyper.</string>
<string name="shared_string_local_maps">Lokale kart</string>
<string name="icon_group_transport">Transport</string>
<string name="icon_group_service">Tjeneste</string>
<string name="icon_group_symbols">Symboler</string>
<string name="icon_group_sport">Sport</string>
<string name="icon_group_emergency">Nødsfall</string>
<string name="icon_group_travel">Reise</string>
<string name="message_you_need_add_two_points_to_show_graphs">Du må legge til minst to punkter.</string>
</resources>

View file

@ -3562,10 +3562,10 @@
<string name="poi_hazard">Zagrożenie</string>
<string name="poi_health_specialty_radiotherapy_yes">Radioterapia</string>
<string name="poi_change_delete">Usunięty obiekt</string>
<string name="poi_rtsa_scale_nc">н/к</string>
<string name="poi_rtsa_scale_nc_asterisk">н/к*</string>
<string name="poi_rtsa_scale_nc">n/c</string>
<string name="poi_rtsa_scale_nc_asterisk">n/c*</string>
<string name="poi_rtsa_scale_1a">1A</string>
<string name="poi_rtsa_scale_1a_asterisk">1А*</string>
<string name="poi_rtsa_scale_1a_asterisk">1A*</string>
<string name="poi_rtsa_scale_1b">1B</string>
<string name="poi_rtsa_scale_1b_asterisk">1B*</string>
<string name="poi_rtsa_scale_2a">2A</string>
@ -3817,7 +3817,7 @@
<string name="poi_seamark_water_level_below_mwl">Poziom wody: poniżej średniego poziomu wody</string>
<string name="poi_seamark_water_level_awash">Poziom wody: obmywający falami</string>
<string name="poi_seamark_water_level_covers">Poziom wody: pokrywający</string>
<string name="poi_internet_access_fee_customers">Dostęp do Internetu dla klientów</string>
<string name="poi_internet_access_fee_customers">Dostęp do Internetu: klienci</string>
<string name="poi_osmand_fire_hydrant_pressure_suction">Ssanie</string>
<string name="poi_osmand_fire_hydrant_pressure_pressurized">Pod ciśnieniem</string>
<string name="poi_fire_hydrant_style_water_source_groundwater">Woda podziemna</string>
@ -3830,7 +3830,7 @@
<string name="poi_traffic_signals_vibration_no">Wibracja: nie</string>
<string name="poi_city_block">Blok miejski</string>
<string name="poi_borough">Gmina</string>
<string name="poi_give_box">Daj pudełko</string>
<string name="poi_give_box">Give box (wystawka)</string>
<string name="poi_pump_status_missing_beam">Stan pompy: brak wiązki</string>
<string name="poi_traffic_signals_arrow_no">Strzałka: nie</string>
<string name="poi_elevator">Winda</string>
@ -3844,4 +3844,9 @@
<string name="poi_departures_board_delay">Opóźnienie</string>
<string name="poi_departures_board_yes">Tak</string>
<string name="poi_departures_board_no">Tablica odlotów: nie</string>
<string name="poi_parking_rooftop">Parking na dachu</string>
<string name="poi_radar_tower">Wieża radarowa</string>
<string name="poi_parking_sheds">Wiaty parkingowe</string>
<string name="poi_gpx_point">Punkt GPX</string>
<string name="poi_beehive">Ul</string>
</resources>

View file

@ -3837,9 +3837,7 @@
<string name="route_between_points_whole_track_button_desc">Cała trasa zostanie ponownie wyznaczona przy użyciu wybranego profilu.</string>
<string name="route_between_points_next_segment_button_desc">Tylko następny segment zostanie przeliczony przy użyciu wybranego profilu.</string>
<string name="route_between_points_desc">Wybierz sposób łączenia punktów, za pomocą linii prostej, lub oblicz trasę między nimi w sposób określony poniżej.</string>
<string name="route_between_points_warning_desc">Aby skorzystać z tej opcji, OsmAnd musi przyciągnąć ślad do dróg mapy.
\n
\nW następnym kroku należy wybrać profil nawigacji w celu wykrycia dozwolonych dróg i odległości progowej w celu przybliżenia śledzenia drogi.</string>
<string name="route_between_points_warning_desc">Następnie przyciągnij trasę do najbliższej dozwolonej drogi za pomocą jednego z profili nawigacji, aby skorzystać z tej opcji.</string>
<string name="street_level_imagery">Zdjęcia z poziomu ulicy</string>
<string name="plan_route_exit_dialog_descr">Czy na pewno chcesz odrzucić wszystkie zmiany w zaplanowanej trasie, zamykając ją\?</string>
<string name="in_case_of_reverse_direction">W przypadku odwrotnego kierunku</string>
@ -3945,11 +3943,19 @@
<string name="shared_string_local_maps">Mapy lokalne</string>
<string name="app_mode_gap">Luka</string>
<string name="icon_group_amenity">Udogodnienie</string>
<string name="icon_group_special">Specjalne</string>
<string name="icon_group_special">Specjalny</string>
<string name="icon_group_transport">Transport</string>
<string name="icon_group_service">Usługi</string>
<string name="icon_group_symbols">Symbole</string>
<string name="icon_group_sport">Sport</string>
<string name="icon_group_emergency">Służby ratunkowe</string>
<string name="icon_group_travel">Podróże</string>
<string name="mgrs_format_descr">OsmAnd używa formatu MGRS, który jest podobny do UTM NATO.</string>
<string name="manage_subscription">Zarządzaj subskrypcją</string>
<string name="subscription_expired_title">Subskrypcja OsmAnd Live wygasła</string>
<string name="subscription_paused_title">Subskrypcja OsmAnd Live została wstrzymana</string>
<string name="snowmobile_render_descr">Do jazdy skuterem śnieżnym z wyznaczonymi drogami i torami.</string>
<string name="message_you_need_add_two_points_to_show_graphs">Należy dodać co najmniej dwa punkty.</string>
<string name="subscription_payment_issue_title">Wystąpił problem z Twoją subskrypcją. Kliknij przycisk, aby przejść do ustawień subskrypcji Google Play i naprawić metodę płatności.</string>
<string name="subscription_on_hold_title">Subskrypcja OsmAnd Live jest wstrzymana</string>
</resources>

View file

@ -3941,4 +3941,10 @@
<string name="navigate_point_mgrs">MGRS</string>
<string name="navigate_point_format_mgrs">MGRS</string>
<string name="mgrs_format_descr">OsmAnd usa MGRS, que é semelhante ao formato UTM NATO.</string>
<string name="message_you_need_add_two_points_to_show_graphs">Você deve adicionar pelo menos dois pontos.</string>
<string name="manage_subscription">Gerenciar assinatura</string>
<string name="subscription_payment_issue_title">Há um problema com sua assinatura. Clique no botão para ir para as configurações de assinatura do Google Play para corrigir sua forma de pagamento.</string>
<string name="subscription_expired_title">A assinatura do OsmAnd Live expirou</string>
<string name="subscription_paused_title">A assinatura do OsmAnd Live foi pausada</string>
<string name="subscription_on_hold_title">A assinatura do OsmAnd Live está em espera</string>
</resources>

View file

@ -3949,4 +3949,10 @@
<string name="icon_group_sport">Desporto</string>
<string name="icon_group_emergency">Emergência</string>
<string name="icon_group_travel">Viagem</string>
<string name="message_you_need_add_two_points_to_show_graphs">Deve adicionar pelo menos dois pontos.</string>
<string name="manage_subscription">Gerir a assinatura</string>
<string name="subscription_payment_issue_title">Há um problema com a sua assinatura. Clique no botão para ir às definições de assinatura do Google Play para corrigir o seu método de pagamento.</string>
<string name="subscription_expired_title">A assinatura do OsmAnd Live expirou</string>
<string name="subscription_paused_title">A assinatura do OsmAnd Live foi pausada</string>
<string name="subscription_on_hold_title">A assinatura do OsmAnd Live está em espera</string>
</resources>

View file

@ -3704,7 +3704,7 @@
<string name="shared_string_resume">Продолжить</string>
<string name="index_item_world_basemap_detailed">Мировая обзорная карта (подробная)</string>
<string name="unsupported_type_error">Неподдерживаемый тип</string>
<string name="gpx_parse_error">OsmAnd сформировал GPX не совсем правильно, пожалуйста, свяжитесь со службой поддержки для дальнейшего расследования.</string>
<string name="gpx_parse_error">OsmAnd сформировал GPX не совсем правильно, пожалуйста, свяжитесь со службой поддержки для выяснения причин.</string>
<string name="turn_screen_on_navigation_instructions_descr">Каждая навигационная инструкция включает экран.</string>
<string name="turn_screen_on_navigation_instructions">Инструкции по навигации</string>
<string name="screen_timeout_descr">Если функция «%1$s» включена, время работы будет зависеть от неё.</string>
@ -3941,4 +3941,5 @@
<string name="navigate_point_format_mgrs">MGRS</string>
<string name="mgrs_format_descr">OsmAnd использует MGRS, который похож на формат UTM NATO.</string>
<string name="use_native_pt">Развитие местного общественного транспорта</string>
<string name="message_you_need_add_two_points_to_show_graphs">Нужно добавить не менее двух точек.</string>
</resources>

View file

@ -3845,4 +3845,5 @@
<string name="poi_parking_sheds">Cabannas</string>
<string name="poi_parking_rooftop">Cobertura</string>
<string name="poi_gpx_point">Puntu GPX</string>
<string name="poi_radar_tower">Torre ràdar</string>
</resources>

View file

@ -3947,4 +3947,10 @@
<string name="navigate_point_mgrs">MGRS</string>
<string name="navigate_point_format_mgrs">MGRS</string>
<string name="mgrs_format_descr">OsmAnd používa MGSR, ktorý je podobný ako formát UTM NATO.</string>
<string name="message_you_need_add_two_points_to_show_graphs">Musíte pridať aspoň dva body.</string>
<string name="manage_subscription">Spravovať predplatné</string>
<string name="subscription_payment_issue_title">S vaším predplatným je problém. Stlačte tlačidlo pre prechod do nastavení predplatného v Google Play a opravte váš spôsob platby.</string>
<string name="subscription_expired_title">Predplatné OsmAnd Live skončilo</string>
<string name="subscription_paused_title">Predplatné OsmAnd Live je pozastavené</string>
<string name="subscription_on_hold_title">Predplatné OsmAnd Live je zablokované</string>
</resources>

View file

@ -3902,4 +3902,5 @@
<string name="icon_group_sport">Spor</string>
<string name="icon_group_emergency">Acil</string>
<string name="icon_group_travel">Seyahat</string>
<string name="message_you_need_add_two_points_to_show_graphs">En az iki nokta eklemelisiniz.</string>
</resources>

View file

@ -2038,7 +2038,7 @@
<string name="osm_live_subscription_desc">Передплата включає щогодинні, щоденні та щотижневі оновлення, а також, необмежену кількість доступних завантажень для всіх мап з усього світу.</string>
<string name="get_it">Отримати</string>
<string name="get_for">Отримати на %1$s</string>
<string name="osm_live_banner_desc">Отримайте необмежені завантаження для мап, а також оновлення мап частіше ніж один раз на місяць: щотижня, щодня або щогодини.</string>
<string name="osm_live_banner_desc">Отримайте для мап необмежені завантаження та оновлення частіше ніж раз на місяць: щотижня, щодня або щогодини.</string>
<string name="osmand_plus_banner_desc">Втулок для необмеженого доступу до мап, їх оновлень та отримання відомостей з Wikipedia.</string>
<string name="si_mi_meters">Милі/метри</string>
<string name="skip_map_downloading">Пропустити завантаження мап</string>
@ -2741,8 +2741,8 @@
\nРозкажіть нам про це.</string>
<string name="send_search_query">Надіслати пошуковий запит?</string>
<string name="shared_string_world">Світ</string>
<string name="monthly_map_updates">Оновлення мап: щомісячне</string>
<string name="daily_map_updates">Оновлення мап: щогодинне</string>
<string name="monthly_map_updates">Оновлення мап: щомісячно</string>
<string name="daily_map_updates">Оновлення мап: щогодинно</string>
<string name="in_app_purchase">Купівля в застосунку</string>
<string name="in_app_purchase_desc">Одноразовий платіж</string>
<string name="in_app_purchase_desc_ex">Після покупки він буде завжди доступний для вас.</string>
@ -3661,7 +3661,7 @@
<string name="subscription_osmandlive_item">Передплата - OsmAnd Live</string>
<string name="osmand_purchases_item">OsmAnd покупки</string>
<string name="legend_item_description">Довідник умовних позначень мапи.</string>
<string name="osm_live_payment_subscription_management">Оплату буде здійснено з рахунку, прив\'язаного до вашого облікового запису Google Play, під час підтвердженні придбання.
<string name="osm_live_payment_subscription_management">Оплату буде здійснено під час підтвердження придбання з пов\'язаного з вашим обліковим записом Google Play рахунку.
\n
\nПередплата продовжується автоматично, якщо ви не скасуєте її до дати продовження. З вашого рахунку буде стягуватися плата за період продовження (щомісяця/щотримісяці/щорік) разово в день продовження.
\n
@ -3943,4 +3943,10 @@
<string name="navigate_point_mgrs">MGRS</string>
<string name="navigate_point_format_mgrs">MGRS</string>
<string name="mgrs_format_descr">OsmAnd використовує MGRS, який подібний формату UTM NATO.</string>
<string name="message_you_need_add_two_points_to_show_graphs">Додайте принаймні дві точки.</string>
<string name="manage_subscription">Керувати передплатою</string>
<string name="subscription_payment_issue_title">Виникла проблема з передплатою. Натисніть кнопку, щоб перейти до налаштувань передплати у Google Play, щоб виправити спосіб оплати.</string>
<string name="subscription_expired_title">Термін дії передплати OsmAnd Live закінчився</string>
<string name="subscription_paused_title">Передплату OsmAnd Live зупинено</string>
<string name="subscription_on_hold_title">Передплата OsmAnd Live на утриманні</string>
</resources>

View file

@ -3942,4 +3942,10 @@
<string name="navigate_point_mgrs">MGRS</string>
<string name="navigate_point_format_mgrs">MGRS</string>
<string name="mgrs_format_descr">OsmAnd 使用 MGRS其類似於 UTM NATO 格式。</string>
<string name="message_you_need_add_two_points_to_show_graphs">您必須新增至少兩個點。</string>
<string name="manage_subscription">管理訂閱</string>
<string name="subscription_payment_issue_title">您的訂閱似乎有點問題。點擊按鈕以跳到 Google Play 訂閱設定以修復您的付款方式。</string>
<string name="subscription_expired_title">OsmAnd Live 訂閱已過期</string>
<string name="subscription_paused_title">OsmAnd Live 訂閱已暫停</string>
<string name="subscription_on_hold_title">OsmAnd Live 訂閱已暫停</string>
</resources>

View file

@ -16,6 +16,16 @@
<string name="subscription_expired_title">OsmAnd Live subscription has been expired</string>
<string name="subscription_payment_issue_title">There is a problem with your subscription. Click the button to go to the Google Play subscription settings to fix your payment method.</string>
<string name="manage_subscription">Manage subscription</string>
<string name="user_login">Login</string>
<string name="user_password">Password</string>
<string name="login_account">Account</string>
<string name="use_login_password">Use login and password</string>
<string name="open_street_map_login_mode">You need to login to upload new or modified changes. \n\nYou can log in using the safe OAuth method or use your login and password.</string>
<string name="osm_edits_view_descr">You can view all your unloaded edits or OSM bugs in %1$s. Uploaded points dont show in OsmAnd.</string>
<string name="sing_in_with_open_street_map">Sing in with OpenStreetMap</string>
<string name="login_open_street_map_org">Login to OpenStreetMap.org</string>
<string name="login_open_street_map">Login to OpenStreetMap</string>
<string name="plugin_global_prefs_info">These plugin setting are global, and apply to all profiles</string>
<string name="message_you_need_add_two_points_to_show_graphs">You must add at least two points.</string>
<string name="icon_group_travel">Travel</string>
<string name="icon_group_emergency">Emergency</string>
@ -487,9 +497,7 @@
<string name="route_recalculation">Route recalculation</string>
<string name="accessibility_announce">Announce</string>
<string name="login_and_pass">Username and password</string>
<string name="plugin_global_prefs_info">These settings apply to all profiles.</string>
<string name="osm_editing">OSM editing</string>
<string name="osm_edits_view_descr">View your edits or OSM bugs not yet uploaded in %1$s. Uploaded points will not show any more.</string>
<string name="app_mode_osm">OSM</string>
<string name="select_nav_icon_descr">Icon shown while navigating or moving.</string>
<string name="select_map_icon_descr">Icon shown at rest.</string>
@ -3201,7 +3209,6 @@
<string name="global_app_settings">Global app settings</string>
<string name="user_name">Your OSM username</string>
<string name="open_street_map_login_descr">Needed for openstreetmap.org submissions.</string>
<string name="user_password">Your OSM password</string>
<string name="osmand_service">Background mode</string>
<string name="osmand_service_descr">OsmAnd runs in the background with the screen off.</string>
<string name="download_files_not_enough_space">There is not enough free space to download %1$s MB (free: %2$s).</string>

View file

@ -16,9 +16,13 @@
android:key="osm_login_data"
android:layout="@layout/preference_with_descr"
android:persistent="false"
android:title="@string/login_and_pass"
tools:icon="@drawable/ic_action_openstreetmap_logo"
tools:summary="@string/open_street_map_login_descr" />
android:title="@string/login_open_street_map" />
<Preference
android:key="osm_logout"
android:layout="@layout/preference_login"
android:persistent="false"
android:title="@string/login_account" />
<net.osmand.plus.settings.preferences.SwitchPreferenceEx
android:key="offline_osm_editing"

View file

@ -541,10 +541,10 @@ public abstract class OsmandPlugin {
protected void addMyPlacesTab(FavoritesActivity favoritesActivity, List<TabItem> mTabs, Intent intent) {
}
protected void contextMenuFragment(Activity activity, Fragment fragment, Object info, ContextMenuAdapter adapter) {
protected void contextMenuFragment(FragmentActivity activity, Fragment fragment, Object info, ContextMenuAdapter adapter) {
}
protected void optionsMenuFragment(Activity activity, Fragment fragment, ContextMenuAdapter optionsMenuAdapter) {
protected void optionsMenuFragment(FragmentActivity activity, Fragment fragment, ContextMenuAdapter optionsMenuAdapter) {
}
protected boolean searchFinished(QuickSearchDialogFragment searchFragment, SearchPhrase phrase, boolean isResultEmpty) {
@ -815,14 +815,13 @@ public abstract class OsmandPlugin {
}
}
public static void onContextMenuActivity(Activity activity, Fragment fragment, Object info, ContextMenuAdapter adapter) {
public static void onContextMenuActivity(FragmentActivity activity, Fragment fragment, Object info, ContextMenuAdapter adapter) {
for (OsmandPlugin plugin : getEnabledPlugins()) {
plugin.contextMenuFragment(activity, fragment, info, adapter);
}
}
public static void onOptionsMenuActivity(Activity activity, Fragment fragment, ContextMenuAdapter optionsMenuAdapter) {
public static void onOptionsMenuActivity(FragmentActivity activity, Fragment fragment, ContextMenuAdapter optionsMenuAdapter) {
for (OsmandPlugin plugin : getEnabledPlugins()) {
plugin.optionsMenuFragment(activity, fragment, optionsMenuAdapter);
}

View file

@ -134,11 +134,11 @@ public class Version {
}
public static boolean isDeveloperVersion(OsmandApplication ctx){
return false;//getAppName(ctx).contains("~") || ctx.getPackageName().equals(FREE_DEV_VERSION_NAME);
return getAppName(ctx).contains("~") || ctx.getPackageName().equals(FREE_DEV_VERSION_NAME);
}
public static boolean isDeveloperBuild(OsmandApplication ctx){
return false;//getAppName(ctx).contains("~");
return getAppName(ctx).contains("~");
}
public static String getVersionForTracker(OsmandApplication ctx) {

View file

@ -115,10 +115,10 @@ import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu;
import net.osmand.plus.mapmarkers.PlanRouteFragment;
import net.osmand.plus.measurementtool.GpxApproximationFragment;
import net.osmand.plus.measurementtool.GpxData;
import net.osmand.plus.measurementtool.LoginBottomSheetFragment;
import net.osmand.plus.measurementtool.MeasurementEditingContext;
import net.osmand.plus.measurementtool.MeasurementToolFragment;
import net.osmand.plus.measurementtool.SnapTrackWarningFragment;
import net.osmand.plus.osmedit.OsmEditingFragment;
import net.osmand.plus.render.RendererRegistry;
import net.osmand.plus.resources.ResourceManager;
import net.osmand.plus.routepreparationmenu.ChooseRouteFragment;
@ -2215,8 +2215,8 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
return getFragment(GpxApproximationFragment.TAG);
}
public OsmEditingFragment getOsmEditingFragment() {
return getFragment(SettingsScreenType.OPEN_STREET_MAP_EDITING.fragmentName);
public LoginBottomSheetFragment getLoginBottomSheetFragment() {
return getFragment(LoginBottomSheetFragment.TAG);
}
public SnapTrackWarningFragment getSnapTrackWarningBottomSheet() {

View file

@ -13,6 +13,7 @@ import net.osmand.data.PointDescription;
import net.osmand.data.QuadRect;
import net.osmand.data.QuadTree;
import net.osmand.data.RotatedTileBox;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.audionotes.AudioVideoNotesPlugin.Recording;
@ -69,8 +70,9 @@ public class AudioNotesLayer extends OsmandMapLayer implements
@Override
public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
if (tileBox.getZoom() >= startZoom) {
float textScale = activity.getMyApplication().getSettings().TEXT_SCALE.get();
float iconSize = getIconSize(activity) * 3 / 2.5f * textScale;
OsmandApplication app = activity.getMyApplication();
float textScale = app.getSettings().TEXT_SCALE.get();
float iconSize = getIconSize(app);
QuadTree<QuadRect> boundIntersections = initBoundIntersections(tileBox);
DataTileManager<Recording> recs = plugin.getRecordings();

View file

@ -377,7 +377,7 @@ public abstract class MenuBottomSheetDialogFragment extends BottomSheetDialogFra
return getResources().getDimensionPixelSize(R.dimen.content_padding);
}
private void setupThirdButton() {
protected void setupThirdButton() {
thirdButton = buttonsContainer.findViewById(R.id.third_button);
int buttonTextId = getThirdBottomButtonTextId();
if (buttonTextId != DEFAULT_VALUE) {

View file

@ -164,7 +164,7 @@ public class TestVoiceActivity extends OsmandActionBarActivity {
addButton(ll, "\u25BA (1.2) New route calculated, 1350m, 3680sec (01:01:20)", builder(p).newRouteCalculated(1350, 3680));
addButton(ll, "\u25BA (1.3) New route calculated 3700m, 7320sec (02:02)", builder(p).newRouteCalculated(3700, 7320));
addButton(ll, "\u25BA (1.4) New route calculated 9100m, 10980sec (03:03)", builder(p).newRouteCalculated(9100, 10980));
addButton(ll, "\u25BA (1.5) New route calculated, 1500m, 4280sec (01:20:20)", builder(p).newRouteCalculated(1500, 4820));
addButton(ll, "\u25BA (1.5) New route calculated, 1500m, 4820sec (01:20:20)", builder(p).newRouteCalculated(1500, 4820));
addButton(ll, "\u25BA (2.1) Route recalculated 11500m, 18600sec (05:10)", builder(p).routeRecalculated(11500, 18600));
addButton(ll, "\u25BA (2.2) Route recalculated 19633m, 26700sec (07:25)", builder(p).routeRecalculated(19633, 26700) );
addButton(ll, "\u25BA (2.3) Route recalculated 89750m, 55800sec (15:30)", builder(p).routeRecalculated(89750, 55800) );

View file

@ -79,13 +79,6 @@ public class RasterMapMenu {
new OnMapSelectedCallback() {
@Override
public void onMapSelected(boolean canceled) {
if (type == RasterMapType.UNDERLAY && !canceled && !selected) {
hidePolygonsPref.set(true);
refreshMapComplete(mapActivity);
} else if (type == RasterMapType.UNDERLAY && !canceled && mapTypePreference.get() == null) {
hidePolygonsPref.set(false);
refreshMapComplete(mapActivity);
}
mapActivity.getDashboard().refreshContent(true);
}
};

View file

@ -19,7 +19,7 @@ import net.osmand.plus.activities.PluginsFragment;
import net.osmand.plus.dashboard.DashboardOnMap.DashboardType;
import net.osmand.plus.mapmarkers.MapMarkersDialogFragment;
import net.osmand.plus.mapsource.EditMapSourceDialogFragment;
import net.osmand.plus.osmedit.OsmEditingFragment;
import net.osmand.plus.measurementtool.LoginBottomSheetFragment;
import net.osmand.plus.search.QuickSearchDialogFragment;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
@ -293,7 +293,7 @@ public class IntentHelper {
if (intent != null && intent.getData() != null) {
Uri uri = intent.getData();
if (uri.toString().startsWith("osmand-oauth")) {
OsmEditingFragment fragment = mapActivity.getOsmEditingFragment();
LoginBottomSheetFragment fragment = mapActivity.getLoginBottomSheetFragment();
if (fragment != null) {
String oauthVerifier = uri.getQueryParameter("oauth_verifier");
fragment.authorize(oauthVerifier);

View file

@ -0,0 +1,142 @@
package net.osmand.plus.measurementtool;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import net.osmand.AndroidUtils;
import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities.DialogButtonType;
import net.osmand.plus.base.MenuBottomSheetDialogFragment;
import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem;
import net.osmand.plus.osmedit.oauth.OsmOAuthAuthorizationAdapter;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.bottomsheets.OsmLoginDataBottomSheet;
import org.apache.commons.logging.Log;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
public class LoginBottomSheetFragment extends MenuBottomSheetDialogFragment {
public static final String TAG = LoginBottomSheetFragment.class.getSimpleName();
private static final Log log = PlatformUtil.getLog(LoginBottomSheetFragment.class);
private static final String OSM_LOGIN_DATA = "osm_login_data";
private OsmOAuthAuthorizationAdapter authorizationAdapter;
@Override
public void createMenuItems(Bundle savedInstanceState) {
OsmandApplication app = requiredMyApplication();
authorizationAdapter = new OsmOAuthAuthorizationAdapter(app);
items.add(new SimpleBottomSheetItem.Builder().setLayoutId(R.layout.bottom_sheet_login).create());
}
@Override
protected int getDismissButtonTextId() {
return R.string.shared_string_cancel;
}
@Override
protected int getRightBottomButtonTextId() {
return R.string.use_login_password;
}
@Override
protected void setupThirdButton() {
super.setupThirdButton();
OsmandApplication app = getMyApplication();
if (app != null) {
Drawable icon = app.getUIUtilities().getIcon(R.drawable.ic_action_openstreetmap_logo, R.color.popup_text_color);
TextView buttonText = thirdButton.findViewById(R.id.button_text);
AndroidUtils.setCompoundDrawablesWithIntrinsicBounds(buttonText, icon, null, null, null);
}
}
@Override
protected int getThirdBottomButtonTextId() {
return R.string.sing_in_with_open_street_map;
}
@Override
public int getFirstDividerHeight() {
return getResources().getDimensionPixelSize(R.dimen.card_content_padding_large);
}
@Override
protected void onRightBottomButtonClick() {
FragmentManager fragmentManager = getFragmentManager();
if (fragmentManager != null) {
OsmLoginDataBottomSheet.showInstance(fragmentManager, OSM_LOGIN_DATA, getTargetFragment(), usedOnMap, null);
}
dismiss();
}
@Override
protected void onThirdBottomButtonClick() {
View view = getView();
if (view != null) {
authorizationAdapter.startOAuth((ViewGroup) view);
}
}
@Override
protected DialogButtonType getRightBottomButtonType() {
return (DialogButtonType.SECONDARY);
}
public static void showInstance(@NonNull FragmentManager fragmentManager, @Nullable Fragment targetFragment) {
if (!fragmentManager.isStateSaved()) {
LoginBottomSheetFragment fragment = new LoginBottomSheetFragment();
fragment.setTargetFragment(targetFragment, 0);
fragment.show(fragmentManager, TAG);
}
}
public void authorize(String oauthVerifier) {
if (authorizationAdapter != null) {
authorizationAdapter.authorize(oauthVerifier);
updateUserName();
}
Fragment target = getTargetFragment();
if (target instanceof OsmAuthorizationListener) {
((OsmAuthorizationListener) target).authorizationCompleted();
}
dismiss();
}
private void updateUserName() {
OsmandApplication app = getMyApplication();
if (app != null) {
String userName = "";
try {
userName = authorizationAdapter.getUserName();
} catch (InterruptedException e) {
log.error(e);
} catch (ExecutionException e) {
log.error(e);
} catch (IOException e) {
log.error(e);
} catch (XmlPullParserException e) {
log.error(e);
}
app.getSettings().USER_DISPLAY_NAME.set(userName);
}
}
public interface OsmAuthorizationListener {
void authorizationCompleted();
}
}

View file

@ -92,7 +92,7 @@ public class MeasurementEditingContext {
private final WptPt end;
private final List<WptPt> points;
private final List<RouteSegmentResult> segments;
private double distance;
private final double distance;
public RoadSegmentData(@NonNull ApplicationMode appMode, @NonNull WptPt start, @NonNull WptPt end,
@Nullable List<WptPt> points, @Nullable List<RouteSegmentResult> segments) {
@ -101,20 +101,18 @@ public class MeasurementEditingContext {
this.end = end;
this.points = points;
this.segments = segments;
if (segments != null) {
double distance = 0;
for (RouteSegmentResult segment : segments) {
distance += segment.getDistance();
}
this.distance = distance;
} else if (points != null && points.size() > 1) {
double distance = 0;
double distance = 0;
if (points != null && points.size() > 1) {
for (int i = 1; i < points.size(); i++) {
distance += MapUtils.getDistance(points.get(i - 1).lat, points.get(i - 1).lon,
points.get(i).lat, points.get(i).lon);
}
this.distance = distance;
} else if (segments != null) {
for (RouteSegmentResult segment : segments) {
distance += segment.getDistance();
}
}
this.distance = distance;
}
public ApplicationMode getAppMode() {
@ -259,14 +257,8 @@ public class MeasurementEditingContext {
RoadSegmentData data = this.roadSegmentData.get(pair);
if (data == null) {
if (appMode != MeasurementEditingContext.DEFAULT_APP_MODE || !pair.first.lastPoint || !pair.second.firstPoint) {
double localDist = MapUtils.getDistance(pair.first.getLatitude(), pair.first.getLongitude(),
distance += MapUtils.getDistance(pair.first.getLatitude(), pair.first.getLongitude(),
pair.second.getLatitude(), pair.second.getLongitude());
if (!Double.isNaN(pair.first.ele) && !Double.isNaN(pair.second.ele) &&
pair.first.ele != 0 && pair.second.ele != 0) {
double h = Math.abs(pair.first.ele - pair.second.ele);
localDist = Math.sqrt(localDist * localDist + h * h);
}
distance += localDist;
}
} else {
distance += data.getDistance();
@ -1069,7 +1061,7 @@ public class MeasurementEditingContext {
return new RouteExporter("", route, locations, null).generateRouteSegment();
} else if (endPointIndex - startPointIndex >= 0) {
TrkSegment segment = new TrkSegment();
segment.points = before.points.subList(startPointIndex, endPointIndex + 1);
segment.points = new ArrayList<>(before.points.subList(startPointIndex, endPointIndex + 1));
return segment;
}
return null;

View file

@ -2,18 +2,23 @@ package net.osmand.plus.osmedit;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import net.osmand.data.PointDescription;
import net.osmand.osm.PoiType;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapcontextmenu.MenuController;
import net.osmand.plus.measurementtool.LoginBottomSheetFragment;
import net.osmand.plus.osmedit.OsmPoint.Action;
import net.osmand.plus.osmedit.dialogs.SendPoiDialogFragment;
import net.osmand.plus.osmedit.dialogs.SendPoiDialogFragment.SimpleProgressDialogPoiUploader;
import net.osmand.plus.osmedit.oauth.OsmOAuthAuthorizationAdapter;
import net.osmand.plus.render.RenderingIcons;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.util.Algorithms;
import java.util.Map;
@ -40,15 +45,16 @@ public class EditPOIMenuController extends MenuController {
public void buttonPressed() {
MapActivity activity = getMapActivity();
if (plugin != null && activity != null) {
OsmOAuthAuthorizationAdapter client = new OsmOAuthAuthorizationAdapter(activity.getMyApplication());
if (client.isValidToken()){
new SendPoiDialogFragment.SimpleProgressDialogPoiUploader(activity).
showProgressDialog(new OsmPoint[] { getOsmPoint() }, false, false);
}
else {
SendPoiDialogFragment sendPoiDialogFragment =
SendPoiDialogFragment.createInstance(new OsmPoint[]{getOsmPoint()}, SendPoiDialogFragment.PoiUploaderType.SIMPLE);
sendPoiDialogFragment.show(activity.getSupportFragmentManager(), SendPoiDialogFragment.TAG);
OsmandApplication app = activity.getMyApplication();
OsmandSettings settings = app.getSettings();
OsmOAuthAuthorizationAdapter client = new OsmOAuthAuthorizationAdapter(app);
if (client.isValidToken()
|| !Algorithms.isEmpty(settings.USER_NAME.get())
&& !Algorithms.isEmpty(settings.USER_PASSWORD.get())) {
SimpleProgressDialogPoiUploader poiDialogUploader = new SimpleProgressDialogPoiUploader(activity);
poiDialogUploader.showProgressDialog(new OsmPoint[] {getOsmPoint()}, false, false);
} else {
LoginBottomSheetFragment.showInstance(activity.getSupportFragmentManager(), null);
}
}
}
@ -205,7 +211,7 @@ public class EditPOIMenuController extends MenuController {
return null;
}
}
@Override
public int getAdditionalInfoIconRes() {
if (osmPoint.getAction() == Action.DELETE) {

View file

@ -104,20 +104,21 @@ public class OsmBugsLayer extends OsmandMapLayer implements IContextMenuProvider
@Override
public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
startZoom = activity.getMyApplication().getSettings().SHOW_OSM_BUGS_MIN_ZOOM.get();
OsmandApplication app = activity.getMyApplication();
startZoom = app.getSettings().SHOW_OSM_BUGS_MIN_ZOOM.get();
if (tileBox.getZoom() >= startZoom) {
// request to load
data.queryNewData(tileBox);
List<OpenStreetNote> objects = data.getResults();
if (objects != null) {
float textScale = activity.getMyApplication().getSettings().TEXT_SCALE.get();
float iconSize = getIconSize(activity) * 3 / 2.5f * textScale;
float textScale = app.getSettings().TEXT_SCALE.get();
float iconSize = getIconSize(app);
QuadTree<QuadRect> boundIntersections = initBoundIntersections(tileBox);
List<OpenStreetNote> fullObjects = new ArrayList<>();
List<LatLon> fullObjectsLatLon = new ArrayList<>();
List<LatLon> smallObjectsLatLon = new ArrayList<>();
boolean showClosed = activity.getMyApplication().getSettings().SHOW_CLOSED_OSM_BUGS.get();
boolean showClosed = app.getSettings().SHOW_CLOSED_OSM_BUGS.get();
for (OpenStreetNote o : objects) {
if (!o.isOpened() && !showClosed) {
continue;

View file

@ -1,6 +1,5 @@
package net.osmand.plus.osmedit;
import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
@ -8,12 +7,10 @@ import android.os.Bundle;
import android.text.SpannableString;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.PreferenceViewHolder;
import net.osmand.PlatformUtil;
@ -21,36 +18,37 @@ import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.helpers.FontCache;
import net.osmand.plus.measurementtool.LoginBottomSheetFragment;
import net.osmand.plus.measurementtool.LoginBottomSheetFragment.OsmAuthorizationListener;
import net.osmand.plus.osmedit.ValidateOsmLoginDetailsTask.ValidateOsmLoginListener;
import net.osmand.plus.osmedit.oauth.OsmOAuthAuthorizationAdapter;
import net.osmand.plus.settings.backend.OsmAndAppCustomization;
import net.osmand.plus.settings.bottomsheets.OsmLoginDataBottomSheet;
import net.osmand.plus.settings.fragments.BaseSettingsFragment;
import net.osmand.plus.settings.fragments.OnPreferenceChanged;
import net.osmand.plus.settings.preferences.SwitchPreferenceEx;
import net.osmand.plus.widgets.style.CustomTypefaceSpan;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
import static net.osmand.plus.myplaces.FavoritesActivity.TAB_ID;
import static net.osmand.plus.osmedit.OsmEditingPlugin.OSM_EDIT_TAB;
public class OsmEditingFragment extends BaseSettingsFragment implements OnPreferenceChanged {
public class OsmEditingFragment extends BaseSettingsFragment implements OnPreferenceChanged, ValidateOsmLoginListener, OsmAuthorizationListener {
private static final Log log = PlatformUtil.getLog(OsmEditingFragment.class);
private static final String OSM_EDITING_INFO = "osm_editing_info";
private static final String OSM_LOGOUT = "osm_logout";
private static final String OPEN_OSM_EDITS = "open_osm_edits";
private static final String OSM_LOGIN_DATA = "osm_login_data";
private static final String OSM_OAUTH_SUCCESS = "osm_oauth_success";
private static final String OSM_OAUTH_CLEAR = "osm_oauth_clear";
private static final String OSM_OAUTH_LOGIN = "osm_oauth_login";
private static final String OSM_EDITING_INFO = "osm_editing_info";
private OsmOAuthAuthorizationAdapter client;
private OsmOAuthAuthorizationAdapter authorizationAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
client = new OsmOAuthAuthorizationAdapter(app);
authorizationAdapter = new OsmOAuthAuthorizationAdapter(app);
}
@Override
@ -58,11 +56,12 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer
Preference osmEditingInfo = findPreference(OSM_EDITING_INFO);
osmEditingInfo.setIcon(getContentIcon(R.drawable.ic_action_info_dark));
setupNameAndPasswordPref();
setupLoginPref();
setupLogoutPref();
setupOfflineEditingPref();
setupOsmEditsDescrPref();
setupOsmEditsPref();
setupOAuthPrefs();
}
@Override
@ -83,10 +82,40 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer
}
}
private void setupNameAndPasswordPref() {
@Override
public void loginValidationFinished(String warning) {
updateAllSettings();
}
private void setupLoginPref() {
Preference nameAndPasswordPref = findPreference(OSM_LOGIN_DATA);
nameAndPasswordPref.setSummary(settings.USER_NAME.get());
nameAndPasswordPref.setIcon(getContentIcon(R.drawable.ic_action_openstreetmap_logo));
if (!isValidToken() && !isLoginExists()) {
nameAndPasswordPref.setIcon(getContentIcon(R.drawable.ic_action_user_account));
nameAndPasswordPref.setVisible(true);
} else {
nameAndPasswordPref.setVisible(false);
}
}
private void setupLogoutPref() {
boolean validToken = isValidToken();
Preference nameAndPasswordPref = findPreference(OSM_LOGOUT);
if (validToken || isLoginExists()) {
String userName = validToken ? settings.USER_DISPLAY_NAME.get() : settings.USER_NAME.get();
nameAndPasswordPref.setVisible(true);
nameAndPasswordPref.setSummary(userName);
nameAndPasswordPref.setIcon(getContentIcon(R.drawable.ic_action_user_account));
} else {
nameAndPasswordPref.setVisible(false);
}
}
private boolean isValidToken() {
return authorizationAdapter.isValidToken();
}
private boolean isLoginExists() {
return !Algorithms.isEmpty(settings.USER_NAME.get()) && !Algorithms.isEmpty(settings.USER_PASSWORD.get());
}
private void setupOfflineEditingPref() {
@ -122,33 +151,6 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer
createProfile.setIcon(getActiveIcon(R.drawable.ic_action_folder));
}
private void setupOAuthPrefs() {
Context ctx = getContext();
if (ctx != null) {
PreferenceScreen screen = getPreferenceScreen();
if (client.isValidToken()) {
Preference prefOAuth = new Preference(ctx);
prefOAuth.setTitle(R.string.osm_authorization_success);
prefOAuth.setSummary(R.string.osm_authorization_success);
prefOAuth.setKey(OSM_OAUTH_SUCCESS);
Preference prefClearToken = new Preference(ctx);
prefClearToken.setTitle(R.string.shared_string_logoff);
prefClearToken.setSummary(R.string.clear_osm_token);
prefClearToken.setKey(OSM_OAUTH_CLEAR);
screen.addPreference(prefOAuth);
screen.addPreference(prefClearToken);
} else {
Preference prefOAuth = new Preference(ctx);
prefOAuth.setTitle(R.string.perform_oauth_authorization);
prefOAuth.setSummary(R.string.perform_oauth_authorization_description);
prefOAuth.setKey(OSM_OAUTH_LOGIN);
screen.addPreference(prefOAuth);
}
}
}
@Override
public boolean onPreferenceClick(Preference preference) {
String prefId = preference.getKey();
@ -165,42 +167,35 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer
} else if (OSM_LOGIN_DATA.equals(prefId)) {
FragmentManager fragmentManager = getFragmentManager();
if (fragmentManager != null) {
OsmLoginDataBottomSheet.showInstance(fragmentManager, OSM_LOGIN_DATA, this, false, getSelectedAppMode());
LoginBottomSheetFragment.showInstance(fragmentManager, this);
return true;
}
} else if (OSM_OAUTH_CLEAR.equals(prefId)) {
settings.USER_ACCESS_TOKEN.set("");
settings.USER_ACCESS_TOKEN_SECRET.set("");
client.resetToken();
client = new OsmOAuthAuthorizationAdapter(app);
} else if (OSM_LOGOUT.equals(prefId)) {
if (isValidToken()) {
settings.USER_ACCESS_TOKEN.resetToDefault();
settings.USER_ACCESS_TOKEN_SECRET.resetToDefault();
authorizationAdapter.resetToken();
authorizationAdapter = new OsmOAuthAuthorizationAdapter(app);
} else {
settings.USER_NAME.resetToDefault();
settings.USER_PASSWORD.resetToDefault();
}
app.showShortToastMessage(R.string.osm_edit_logout_success);
updateAllSettings();
return true;
} else if (OSM_OAUTH_LOGIN.equals(prefId)) {
View view = getView();
if (view != null) {
ViewGroup appBarLayout = view.findViewById(R.id.appbar);
client.startOAuth(appBarLayout);
}
return true;
}
return super.onPreferenceClick(preference);
}
@Override
public void onPreferenceChanged(String prefId) {
if (OSM_LOGIN_DATA.equals(prefId)) {
Preference nameAndPasswordPref = findPreference(OSM_LOGIN_DATA);
nameAndPasswordPref.setSummary(settings.USER_NAME.get());
}
updateAllSettings();
}
public void authorize(String oauthVerifier) {
if (client != null) {
client.authorize(oauthVerifier);
}
@Override
public void authorizationCompleted() {
authorizationAdapter = new OsmOAuthAuthorizationAdapter(app);
updateAllSettings();
}
}

View file

@ -1,6 +1,5 @@
package net.osmand.plus.osmedit;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
@ -16,11 +15,11 @@ import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import net.osmand.AndroidUtils;
import net.osmand.PlatformUtil;
@ -41,6 +40,7 @@ import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.TabActivity;
import net.osmand.plus.dashboard.DashboardOnMap.DashboardType;
import net.osmand.plus.dashboard.tools.DashFragmentData;
import net.osmand.plus.measurementtool.LoginBottomSheetFragment;
import net.osmand.plus.myplaces.AvailableGPXFragment;
import net.osmand.plus.myplaces.AvailableGPXFragment.GpxInfo;
import net.osmand.plus.myplaces.FavoritesActivity;
@ -395,15 +395,15 @@ public class OsmEditingPlugin extends OsmandPlugin {
}
@Override
public void contextMenuFragment(final Activity la, final Fragment fragment, final Object info, ContextMenuAdapter adapter) {
public void contextMenuFragment(final FragmentActivity activity, final Fragment fragment, final Object info, ContextMenuAdapter adapter) {
if (fragment instanceof AvailableGPXFragment) {
adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.local_index_mi_upload_gpx, la)
adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.local_index_mi_upload_gpx, activity)
.setIcon(R.drawable.ic_action_export)
.setListener(new ContextMenuAdapter.ItemClickListener() {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int pos, boolean isChecked, int[] viewCoordinates) {
sendGPXFiles(la, (AvailableGPXFragment) fragment, (GpxInfo) info);
sendGPXFiles(activity, (AvailableGPXFragment) fragment, (GpxInfo) info);
return true;
}
}).createItem());
@ -411,7 +411,7 @@ public class OsmEditingPlugin extends OsmandPlugin {
}
@Override
public void optionsMenuFragment(final Activity activity, final Fragment fragment, ContextMenuAdapter optionsMenuAdapter) {
public void optionsMenuFragment(final FragmentActivity activity, final Fragment fragment, ContextMenuAdapter optionsMenuAdapter) {
if (fragment instanceof AvailableGPXFragment) {
final AvailableGPXFragment f = ((AvailableGPXFragment) fragment);
optionsMenuAdapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.local_index_mi_upload_gpx, activity)
@ -437,7 +437,6 @@ public class OsmEditingPlugin extends OsmandPlugin {
}
}
public enum UploadVisibility implements IEnumWithResource {
Public(R.string.gpxup_public),
Identifiable(R.string.gpxup_identifiable),
@ -459,16 +458,16 @@ public class OsmEditingPlugin extends OsmandPlugin {
}
}
public boolean sendGPXFiles(final Activity la, AvailableGPXFragment f, final GpxInfo... info) {
public boolean sendGPXFiles(final FragmentActivity activity, AvailableGPXFragment fragment, final GpxInfo... info) {
String name = settings.USER_NAME.get();
String pwd = settings.USER_PASSWORD.get();
String authToken = settings.USER_ACCESS_TOKEN.get();
if ((Algorithms.isEmpty(name) || Algorithms.isEmpty(pwd)) && Algorithms.isEmpty(authToken)) {
Toast.makeText(la, R.string.validate_gpx_upload_name_pwd, Toast.LENGTH_LONG).show();
LoginBottomSheetFragment.showInstance(activity.getSupportFragmentManager(), fragment.getTargetFragment());
return false;
}
AlertDialog.Builder bldr = new AlertDialog.Builder(la);
LayoutInflater inflater = (LayoutInflater) la.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View view = inflater.inflate(R.layout.send_gpx_osm, null);
final EditText descr = (EditText) view.findViewById(R.id.memory_size);
if (info.length > 0 && info[0].getFileName() != null) {
@ -477,23 +476,23 @@ public class OsmEditingPlugin extends OsmandPlugin {
}
final EditText tags = (EditText) view.findViewById(R.id.TagsText);
final Spinner visibility = ((Spinner) view.findViewById(R.id.Visibility));
EnumAdapter<UploadVisibility> adapter = new EnumAdapter<>(la, android.R.layout.simple_spinner_item, UploadVisibility.values());
EnumAdapter<UploadVisibility> adapter = new EnumAdapter<>(activity, android.R.layout.simple_spinner_item, UploadVisibility.values());
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
visibility.setAdapter(adapter);
visibility.setSelection(0);
bldr.setView(view);
bldr.setNegativeButton(R.string.shared_string_no, null);
bldr.setPositiveButton(R.string.shared_string_yes, new DialogInterface.OnClickListener() {
builder.setView(view);
builder.setNegativeButton(R.string.shared_string_no, null);
builder.setPositiveButton(R.string.shared_string_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
new UploadGPXFilesTask(la, descr.getText().toString(), tags.getText().toString(),
new UploadGPXFilesTask(activity, descr.getText().toString(), tags.getText().toString(),
(UploadVisibility) visibility.getItemAtPosition(visibility.getSelectedItemPosition())
).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, info);
}
});
bldr.show();
builder.show();
return true;
}

View file

@ -29,6 +29,7 @@ import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.view.ActionMode;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import net.osmand.AndroidUtils;
@ -41,6 +42,8 @@ import net.osmand.osm.edit.Entity;
import net.osmand.osm.edit.Node;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.measurementtool.LoginBottomSheetFragment;
import net.osmand.plus.osmedit.oauth.OsmOAuthAuthorizationAdapter;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.Version;
@ -624,10 +627,20 @@ public class OsmEditsFragment extends OsmAndListFragment implements SendPoiDialo
}
private void uploadItems(final OsmPoint[] items) {
SendPoiDialogFragment.createInstance(items, PoiUploaderType.FRAGMENT)
.show(getChildFragmentManager(), SendPoiDialogFragment.TAG);
// UploadOsmEditsConfirmDialogFragment.createInstancee(items).show(getChildFragmentManager(),
// UploadOsmEditsConfirmDialogFragment.TAG);
FragmentActivity activity = getActivity();
if (activity != null) {
OsmandApplication app = getMyApplication();
OsmandSettings settings = app.getSettings();
OsmOAuthAuthorizationAdapter authorizationAdapter = new OsmOAuthAuthorizationAdapter(app);
if (authorizationAdapter.isValidToken()
|| !Algorithms.isEmpty(settings.USER_NAME.get())
&& !Algorithms.isEmpty(settings.USER_PASSWORD.get())) {
SendPoiDialogFragment.createInstance(items, PoiUploaderType.FRAGMENT)
.show(getChildFragmentManager(), SendPoiDialogFragment.TAG);
} else {
LoginBottomSheetFragment.showInstance(activity.getSupportFragmentManager(), this);
}
}
}
public void showProgressDialog(OsmPoint[] points, boolean closeChangeSet, boolean anonymously) {

View file

@ -2,6 +2,8 @@ package net.osmand.plus.osmedit;
import android.os.AsyncTask;
import androidx.annotation.NonNull;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
@ -10,9 +12,11 @@ import net.osmand.plus.osmedit.OsmBugsUtil.OsmBugResult;
public class ValidateOsmLoginDetailsTask extends AsyncTask<Void, Void, OsmBugResult> {
private OsmandApplication app;
private ValidateOsmLoginListener validateListener;
public ValidateOsmLoginDetailsTask(OsmandApplication app) {
public ValidateOsmLoginDetailsTask(@NonNull OsmandApplication app, ValidateOsmLoginListener validateListener) {
this.app = app;
this.validateListener = validateListener;
}
@Override
@ -26,9 +30,20 @@ public class ValidateOsmLoginDetailsTask extends AsyncTask<Void, Void, OsmBugRes
@Override
protected void onPostExecute(OsmBugResult osmBugResult) {
if (osmBugResult.warning != null) {
app.getSettings().USER_NAME.resetToDefault();
app.getSettings().USER_PASSWORD.resetToDefault();
app.showToastMessage(osmBugResult.warning);
} else {
app.showToastMessage(R.string.osm_authorization_success);
}
if (validateListener != null) {
validateListener.loginValidationFinished(osmBugResult.warning);
}
}
public interface ValidateOsmLoginListener {
void loginValidationFinished(String warning);
}
}

View file

@ -4,26 +4,38 @@ import android.net.TrafficStats;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import com.github.scribejava.core.model.OAuth1AccessToken;
import com.github.scribejava.core.model.OAuth1RequestToken;
import com.github.scribejava.core.model.OAuthAsyncRequestCallback;
import com.github.scribejava.core.model.Response;
import com.github.scribejava.core.model.Verb;
import net.osmand.PlatformUtil;
import net.osmand.osm.oauth.OsmOAuthAuthorizationClient;
import net.osmand.plus.BuildConfig;
import net.osmand.plus.OsmandApplication;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
public class OsmOAuthAuthorizationAdapter {
private OsmandApplication application;
private static final int THREAD_ID = 10101;
private static final String OSM_USER = "user";
private static final String DISPLAY_NAME = "display_name";
private static final String OSM_USER_DETAILS_URL = "https://api.openstreetmap.org/api/0.6/user/details";
private OsmandApplication app;
private OsmOAuthAuthorizationClient client =
new OsmOAuthAuthorizationClient(BuildConfig.OSM_OAUTH_CONSUMER_KEY, BuildConfig.OSM_OAUTH_CONSUMER_SECRET);
private static final int THREAD_ID = 10101;
public OsmOAuthAuthorizationAdapter(OsmandApplication application) {
public OsmOAuthAuthorizationAdapter(OsmandApplication app) {
TrafficStats.setThreadStatsTag(THREAD_ID);
this.application = application;
this.app = app;
restoreToken();
}
@ -40,8 +52,8 @@ public class OsmOAuthAuthorizationAdapter {
}
public void restoreToken() {
String token = application.getSettings().USER_ACCESS_TOKEN.get();
String tokenSecret = application.getSettings().USER_ACCESS_TOKEN_SECRET.get();
String token = app.getSettings().USER_ACCESS_TOKEN.get();
String tokenSecret = app.getSettings().USER_ACCESS_TOKEN_SECRET.get();
if (!(token.isEmpty() || tokenSecret.isEmpty())) {
client.setAccessToken(new OAuth1AccessToken(token, tokenSecret));
} else {
@ -56,8 +68,8 @@ public class OsmOAuthAuthorizationAdapter {
private void saveToken() {
OAuth1AccessToken accessToken = client.getAccessToken();
application.getSettings().USER_ACCESS_TOKEN.set(accessToken.getToken());
application.getSettings().USER_ACCESS_TOKEN_SECRET.set(accessToken.getTokenSecret());
app.getSettings().USER_ACCESS_TOKEN.set(accessToken.getToken());
app.getSettings().USER_ACCESS_TOKEN_SECRET.set(accessToken.getTokenSecret());
}
private void loadWebView(ViewGroup root, String url) {
@ -85,4 +97,26 @@ public class OsmOAuthAuthorizationAdapter {
client.authorize(oauthVerifier);
saveToken();
}
public String getUserName() throws InterruptedException, ExecutionException, IOException, XmlPullParserException {
Response response = getOsmUserDetails();
return parseUserName(response);
}
public Response getOsmUserDetails() throws InterruptedException, ExecutionException, IOException {
return performRequest(OSM_USER_DETAILS_URL, Verb.GET.name(), null);
}
public String parseUserName(Response response) throws XmlPullParserException, IOException {
String userName = null;
XmlPullParser parser = PlatformUtil.newXMLPullParser();
parser.setInput(response.getStream(), "UTF-8");
int tok;
while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) {
if (tok == XmlPullParser.START_TAG && OSM_USER.equals(parser.getName())) {
userName = parser.getAttributeValue("", DISPLAY_NAME);
}
}
return userName;
}
}

View file

@ -339,9 +339,6 @@ public class OsmandRasterMapsPlugin extends OsmandPlugin {
adapter.notifyDataSetChanged();
final CommonPreference<Boolean> hidePolygonsPref =
mapActivity.getMyApplication().getSettings().getCustomRenderBooleanProperty("noPolygons");
hidePolygonsPref.set(hasUnderlayDescription);
RasterMapMenu.refreshMapComplete(mapActivity);
}
}

View file

@ -1088,6 +1088,7 @@ public class OsmandSettings {
// this value string is synchronized with settings_pref.xml preference name
public final OsmandPreference<String> USER_NAME = new StringPreference(this, "user_name", "").makeGlobal().makeShared();
public final OsmandPreference<String> USER_DISPLAY_NAME = new StringPreference(this, "user_display_name", "").makeGlobal().makeShared();
public static final String BILLING_USER_DONATION_WORLD_PARAMETER = "";
public static final String BILLING_USER_DONATION_NONE_PARAMETER = "none";

View file

@ -10,16 +10,17 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
import net.osmand.plus.osmedit.ValidateOsmLoginDetailsTask;
import net.osmand.plus.settings.backend.ApplicationMode;
import com.google.android.material.textfield.TextInputLayout;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem;
import net.osmand.plus.settings.fragments.OnPreferenceChanged;
import net.osmand.plus.osmedit.ValidateOsmLoginDetailsTask;
import net.osmand.plus.osmedit.ValidateOsmLoginDetailsTask.ValidateOsmLoginListener;
import net.osmand.plus.settings.backend.ApplicationMode;
public class OsmLoginDataBottomSheet extends BasePreferenceBottomSheet {
@ -55,6 +56,14 @@ public class OsmLoginDataBottomSheet extends BasePreferenceBottomSheet {
userNameEditText.setText(name);
passwordEditText.setText(password);
TextInputLayout loginBox = view.findViewById(R.id.name_text_box);
TextInputLayout passwordBox = view.findViewById(R.id.password_text_box);
passwordBox.setStartIconDrawable(R.drawable.ic_action_lock);
loginBox.setStartIconDrawable(R.drawable.ic_action_user_account);
loginBox.setEndIconMode(TextInputLayout.END_ICON_CLEAR_TEXT);
passwordBox.setEndIconMode(TextInputLayout.END_ICON_PASSWORD_TOGGLE);
BaseBottomSheetItem titleItem = new SimpleBottomSheetItem.Builder()
.setCustomView(view)
.create();
@ -75,7 +84,7 @@ public class OsmLoginDataBottomSheet extends BasePreferenceBottomSheet {
@Override
protected int getRightBottomButtonTextId() {
return R.string.shared_string_apply;
return R.string.user_login;
}
@Override
@ -84,12 +93,11 @@ public class OsmLoginDataBottomSheet extends BasePreferenceBottomSheet {
app.getSettings().USER_NAME.set(userNameEditText.getText().toString());
app.getSettings().USER_PASSWORD.set(passwordEditText.getText().toString());
new ValidateOsmLoginDetailsTask(app).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
Fragment target = getTargetFragment();
Preference preference = getPreference();
if (target instanceof OnPreferenceChanged && preference != null) {
((OnPreferenceChanged) target).onPreferenceChanged(preference.getKey());
Fragment targetFragment = getTargetFragment();
if (targetFragment instanceof ValidateOsmLoginListener) {
ValidateOsmLoginDetailsTask validateTask = new ValidateOsmLoginDetailsTask(app, (ValidateOsmLoginListener) targetFragment);
validateTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
dismiss();

View file

@ -84,7 +84,7 @@ public class ImportCompleteFragment extends BaseOsmAndFragment {
View root = inflater.inflate(R.layout.fragment_import_complete, container, false);
TextView description = root.findViewById(R.id.description);
TextView btnClose = root.findViewById(R.id.button_close);
final LinearLayout buttonContainer = root.findViewById(R.id.button_container);
final ViewGroup buttonContainer = root.findViewById(R.id.button_container);
recyclerView = root.findViewById(R.id.list);
description.setText(UiUtilities.createSpannableString(
String.format(getString(R.string.import_complete_description), fileName),

View file

@ -225,6 +225,13 @@ public class AnimateDraggingMapThread {
if (!stopped) {
animatingMoveInThread(mMoveX, mMoveY, animationTime, notifyListener, finishAnimationCallback);
} else if (finishAnimationCallback != null) {
tileView.getApplication().runInUIThread(new Runnable() {
@Override
public void run() {
finishAnimationCallback.run();
}
});
}
if (!stopped) {
tileView.setLatLonAnimate(finalLat, finalLon, notifyListener);

View file

@ -1,6 +1,5 @@
package net.osmand.plus.views;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
@ -44,6 +43,7 @@ import java.util.Map;
public abstract class OsmandMapLayer {
public static final float ICON_VISIBLE_PART_RATIO = 0.45f;
protected List<LatLon> fullObjectsLatLon;
protected List<LatLon> smallObjectsLatLon;
@ -235,8 +235,8 @@ public abstract class OsmandMapLayer {
return (int) (r * tb.getDensity());
}
protected int getIconSize(Context ctx) {
return ctx.getResources().getDimensionPixelSize(R.dimen.favorites_icon_outline_size);
protected float getIconSize(OsmandApplication app) {
return app.getResources().getDimensionPixelSize(R.dimen.favorites_icon_outline_size) * ICON_VISIBLE_PART_RATIO * app.getSettings().TEXT_SCALE.get();
}
public Rect getIconDestinationRect(float x, float y, int width, int height, float scale) {

View file

@ -95,7 +95,7 @@ public class FavouritesLayer extends OsmandMapLayer implements ContextMenuLayer.
if (this.settings.SHOW_FAVORITES.get() && favorites.isFavoritesLoaded()) {
if (tileBox.getZoom() >= startZoom) {
float textScale = this.settings.TEXT_SCALE.get();
float iconSize = getIconSize(view.getContext()) * 3 / 2.5f * textScale;
float iconSize = getIconSize(view.getApplication());
QuadTree<QuadRect> boundIntersections = initBoundIntersections(tileBox);
// request to load

View file

@ -494,7 +494,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
private void drawSelectedFilesPoints(Canvas canvas, RotatedTileBox tileBox, List<SelectedGpxFile> selectedGPXFiles) {
if (tileBox.getZoom() >= START_ZOOM) {
float textScale = view.getSettings().TEXT_SCALE.get();
float iconSize = getIconSize(view.getContext()) * 3 / 2.5f * textScale;
float iconSize = getIconSize(view.getApplication());
QuadTree<QuadRect> boundIntersections = initBoundIntersections(tileBox);
List<LatLon> fullObjectsLatLon = new ArrayList<>();

View file

@ -200,7 +200,7 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon
objects = data.getResults();
if (objects != null) {
float textScale = app.getSettings().TEXT_SCALE.get();
float iconSize = getIconSize(app) * 1.5f * textScale;
float iconSize = getIconSize(app);
QuadTree<QuadRect> boundIntersections = initBoundIntersections(tileBox);
WaypointHelper wph = app.getWaypointHelper();
PointImageDrawable pointImageDrawable = PointImageDrawable.getOrCreate(view.getContext(),
@ -394,7 +394,8 @@ public class POIMapLayer extends OsmandMapLayer implements ContextMenuLayer.ICon
public int getTextShift(Amenity amenity, RotatedTileBox rb) {
int radiusPoi = getRadiusPoi(rb);
if (isPresentInFullObjects(amenity.getLocation())) {
radiusPoi += (getIconSize(app) - app.getResources().getDimensionPixelSize(R.dimen.favorites_icon_size_small)) / 2;
radiusPoi += (app.getResources().getDimensionPixelSize(R.dimen.favorites_icon_outline_size)
- app.getResources().getDimensionPixelSize(R.dimen.favorites_icon_size_small)) / 2;
}
return radiusPoi;
}

View file

@ -20,6 +20,7 @@ import net.osmand.data.RotatedTileBox;
import net.osmand.data.TransportStop;
import net.osmand.osm.edit.Node;
import net.osmand.osm.edit.Way;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.base.PointImageDrawable;
import net.osmand.plus.settings.backend.CommonPreference;
import net.osmand.plus.settings.backend.OsmandSettings;
@ -181,10 +182,11 @@ public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLa
public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tb, DrawSettings settings) {
List<TransportStop> objects = null;
boolean nightMode = settings.isNightMode();
OsmandApplication app = mapActivity.getMyApplication();
if (tb.getZoom() >= startZoomRoute) {
if (stopRoute != null) {
objects = stopRoute.route.getForwardStops();
int color = stopRoute.getColor(mapActivity.getMyApplication(), nightMode);
int color = stopRoute.getColor(app, nightMode);
attrs.paint.setColor(color);
attrs.updatePaints(view.getApplication(), settings, tb);
try {
@ -217,8 +219,8 @@ public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLa
}
if (objects != null) {
float textScale = mapActivity.getMyApplication().getSettings().TEXT_SCALE.get();
float iconSize = getIconSize(mapActivity) * 3 / 2.5f * textScale;
float textScale = app.getSettings().TEXT_SCALE.get();
float iconSize = getIconSize(app);
QuadTree<QuadRect> boundIntersections = initBoundIntersections(tb);
List<TransportStop> fullObjects = new ArrayList<>();
for (TransportStop o : objects) {
@ -228,7 +230,7 @@ public class TransportStopsLayer extends OsmandMapLayer implements ContextMenuLa
if (intersects(boundIntersections, x, y, iconSize, iconSize)) {
PointImageDrawable pointImageDrawable = PointImageDrawable.getOrCreate(mapActivity,
ContextCompat.getColor(mapActivity, R.color.transport_stop_icon_background),
true,false ,0, BackgroundType.SQUARE);
true, false, 0, BackgroundType.SQUARE);
pointImageDrawable.setAlpha(0.9f);
pointImageDrawable.drawSmallPoint(canvas, x, y, textScale);
} else {

View file

@ -191,12 +191,26 @@ public class TTSCommandPlayerImpl extends AbstractPrologCommandPlayer {
final float speechRate = cSpeechRate;
final String[] lsplit = (language + "____.").split("[\\_\\-]");
// constructor supports lang_country_variant
Locale newLocale0 = new Locale(lsplit[0], lsplit[1], lsplit[2]);
// #3344: Try Locale builder instead of constructor (only available from API 21). Also supports script (for now supported as trailing x_x_x_Scrp)
// As per BCP 47: well formed scripts: [a-zA-Z]{4}, variants: [0-9][0-9a-zA-Z]{3} | [0-9a-zA-Z]{5,8}, countries/regions: [a-zA-Z]{2} | [0-9]{3}
String lregion = "";
String lvariant = "";
String lscript = "";
for (int i=3; i>0; i--) {
if (lsplit[i].length() == 4 && !(lsplit[i] + "A").substring(0, 1).matches("[0-9]")) {
lscript = lsplit[i];
} else if (lsplit[i].length() >= 4) {
lvariant = lsplit[i];
} else {
lregion = lsplit[i];
}
}
// Locale constructor supports 'language, region, variant'
//Locale newLocale0 = new Locale(lsplit[0], lregion, lvariant); (Setting variant here seems to cause errors on some systems)
Locale newLocale0 = new Locale(lsplit[0], lregion);
// #3344: Try Locale builder instead (only available from API 21), also supports script (we support as 4 letters)
if (android.os.Build.VERSION.SDK_INT >= 21) {
try {
newLocale0 = new Locale.Builder().setLanguage(lsplit[0]).setScript(lsplit[3]).setRegion(lsplit[1]).setVariant(lsplit[2]).build();
newLocale0 = new Locale.Builder().setLanguage(lsplit[0]).setScript(lscript).setRegion(lregion).setVariant(lvariant).build();
} catch (RuntimeException e) {
// Falls back to constructor
}